Skip to content

Commit 7252e40

Browse files
committed
feat: order OR-predicate trees
1 parent 3511043 commit 7252e40

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

reshape.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
// reshape rewrites a parsed tree so that decorative table aliases are
11-
// stripped and sort AND conditions
11+
// stripped and commutative AND/OR conditions are ordered
1212
func reshape(tree *pg_query.ParseResult) error {
1313
if tree == nil {
1414
return nil
@@ -487,8 +487,8 @@ func reshapeSelect(s *pg_query.SelectStmt) {
487487
}
488488
}
489489

490-
sortAndTree(s.WhereClause)
491-
sortAndTree(s.HavingClause)
490+
sortBoolTree(s.WhereClause)
491+
sortBoolTree(s.HavingClause)
492492
}
493493

494494
func reshapeUpdate(u *pg_query.UpdateStmt) {
@@ -533,7 +533,7 @@ func reshapeUpdate(u *pg_query.UpdateStmt) {
533533
}
534534
}
535535

536-
sortAndTree(u.WhereClause)
536+
sortBoolTree(u.WhereClause)
537537
}
538538

539539
func reshapeDelete(d *pg_query.DeleteStmt) {
@@ -572,7 +572,7 @@ func reshapeDelete(d *pg_query.DeleteStmt) {
572572
}
573573
}
574574

575-
sortAndTree(d.WhereClause)
575+
sortBoolTree(d.WhereClause)
576576
}
577577

578578
func reshapeWithClause(w *pg_query.WithClause) {
@@ -897,23 +897,24 @@ func rewriteInSelect(s *pg_query.SelectStmt, dec map[string][]*pg_query.Node) {
897897
}
898898
}
899899

900-
func sortAndTree(n *pg_query.Node) {
900+
func sortBoolTree(n *pg_query.Node) {
901901
if n == nil {
902902
return
903903
}
904904
switch v := n.Node.(type) {
905905
case *pg_query.Node_BoolExpr:
906906
for _, a := range v.BoolExpr.Args {
907-
sortAndTree(a)
907+
sortBoolTree(a)
908908
}
909-
if v.BoolExpr.Boolop == pg_query.BoolExprType_AND_EXPR {
909+
switch v.BoolExpr.Boolop {
910+
case pg_query.BoolExprType_AND_EXPR, pg_query.BoolExprType_OR_EXPR:
910911
sort.SliceStable(v.BoolExpr.Args, func(i, j int) bool {
911912
return argSortKey(v.BoolExpr.Args[i]) < argSortKey(v.BoolExpr.Args[j])
912913
})
913914
}
914915
case *pg_query.Node_AExpr:
915-
sortAndTree(v.AExpr.Lexpr)
916-
sortAndTree(v.AExpr.Rexpr)
916+
sortBoolTree(v.AExpr.Lexpr)
917+
sortBoolTree(v.AExpr.Rexpr)
917918
}
918919
}
919920

0 commit comments

Comments
 (0)