diff --git a/expr/binary.go b/expr/binary.go index ab832e8..2d3f87d 100644 --- a/expr/binary.go +++ b/expr/binary.go @@ -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 @@ -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 diff --git a/query_test.go b/query_test.go index 86aa707..fb56d2e 100644 --- a/query_test.go +++ b/query_test.go @@ -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) { { @@ -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 {