Skip to content

Commit

Permalink
patched binary walk
Browse files Browse the repository at this point in the history
  • Loading branch information
adranwit committed Aug 22, 2024
1 parent 1049190 commit 613fe12
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
16 changes: 14 additions & 2 deletions expr/binary.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func (b *Binary) Walk(fn func(ident node.Node, values *Values, operator, parentO

func (b *Binary) walk(fn func(ident node.Node, values *Values, operator, parentOperator string) error, operator string) error {
switch b.Op[0] {
case 'A', 'O':
case 'A', 'O', 'a', 'o':
if x, ok := b.X.(*Binary); ok {
if err := x.walk(fn, b.Op); err != nil {
return err
Expand All @@ -61,12 +61,24 @@ func (b *Binary) walk(fn func(ident node.Node, values *Values, operator, parentO
}
return nil
}

sel, values, err := b.Predicate()
if err != nil {
return err
}
return fn(sel, values, b.Op, operator)
err = fn(sel, values, b.Op, operator)
if err != nil {
return err
}
if binY, ok := b.Y.(*Binary); ok {
if nested, ok := binY.Y.(*Binary); ok {
if err = nested.walk(fn, b.Op); err != nil {
return err
}
}

}
return nil
}

// Predicate binary predicate or nil
Expand Down
23 changes: 23 additions & 0 deletions query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,28 @@ import (
"fmt"
"github.com/stretchr/testify/assert"
"github.com/viant/parsly"
"github.com/viant/sqlparser/expr"
"github.com/viant/sqlparser/node"
"github.com/viant/sqlparser/query"
"strings"
"testing"
)

func TestBinaryWalk(t *testing.T) {
query, _ := ParseQuery("SELECT * FROM t WHERE a = 1 AND b = 2 AND c IN(1,2)")
binary, ok := query.Qualify.X.(*expr.Binary)
if !assert.True(t, ok) {
return
}
var actualColumns = make([]string, 0)
binary.Walk(func(ident node.Node, values *expr.Values, operator, parentOperator string) error {
actualColumns = append(actualColumns, Stringify(ident))
return nil
})
assert.EqualValues(t, []string{"a", "b", "c"}, actualColumns)

}

func TestParseSelect(t *testing.T) {

{
Expand Down Expand Up @@ -313,6 +330,12 @@ func TestParseSelect(t *testing.T) {
SQL: `SELECT ID,NAME FROM AAA ORDER BY 2 DESC, 1 ASC`,
expect: `SELECT ID, NAME FROM AAA ORDER BY 2 DESC, 1 ASC`,
},

{
description: "",
SQL: `SELECT col1, col2 FROM table1/tt t JOIN xx/e v ON v.ID=t.ID`,
expect: `SELECT col1, col2 FROM table1/tt t JOIN xx/e v ON v.ID = t.ID`,
},
}

for _, testCase := range testCases {
Expand Down

0 comments on commit 613fe12

Please sign in to comment.