@@ -27,11 +27,7 @@ func (rc ReferredCols) ToList() []string {
27
27
return cols
28
28
}
29
29
30
- func (w * AstWalker ) Walk (sql string , ctx interface {}) (ok bool , err error ) {
31
- stmts , err := parser .Parse (sql )
32
- if err != nil {
33
- return false , err
34
- }
30
+ func (w * AstWalker ) Walk (stmts parser.Statements , ctx interface {}) (ok bool , err error ) {
35
31
36
32
w .unknownNodes = make ([]interface {}, 0 )
37
33
asts := make ([]tree.NodeFormatter , len (stmts ))
@@ -67,6 +63,8 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
67
63
walk (node .Expr )
68
64
case * tree.Array :
69
65
walk (node .Exprs )
66
+ case tree.AsOfClause :
67
+ walk (node .Expr )
70
68
case * tree.BinaryExpr :
71
69
walk (node .Left , node .Right )
72
70
case * tree.CaseExpr :
@@ -127,7 +125,6 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
127
125
if node .With != nil {
128
126
walk (node .With )
129
127
}
130
- walk (node .Select )
131
128
if node .OrderBy != nil {
132
129
for _ , order := range node .OrderBy {
133
130
walk (order )
@@ -136,6 +133,7 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
136
133
if node .Limit != nil {
137
134
walk (node .Limit )
138
135
}
136
+ walk (node .Select )
139
137
case * tree.Order :
140
138
walk (node .Expr , node .Table )
141
139
case * tree.Limit :
@@ -148,9 +146,6 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
148
146
if node .Having != nil {
149
147
walk (node .Having )
150
148
}
151
- for _ , table := range node .From .Tables {
152
- walk (table )
153
- }
154
149
if node .DistinctOn != nil {
155
150
for _ , distinct := range node .DistinctOn {
156
151
walk (distinct )
@@ -161,6 +156,10 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
161
156
walk (group )
162
157
}
163
158
}
159
+ walk (node .From .AsOf )
160
+ for _ , table := range node .From .Tables {
161
+ walk (table )
162
+ }
164
163
case tree.SelectExpr :
165
164
walk (node .Expr )
166
165
case tree.SelectExprs :
@@ -192,6 +191,10 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
192
191
}
193
192
case * tree.Where :
194
193
walk (node .Expr )
194
+ case tree.Window :
195
+ for _ , windowDef := range node {
196
+ walk (windowDef )
197
+ }
195
198
case * tree.WindowDef :
196
199
walk (node .Partitions )
197
200
if node .Frame != nil {
@@ -206,13 +209,14 @@ func (w *AstWalker) Walk(sql string, ctx interface{}) (ok bool, err error) {
206
209
}
207
210
case * tree.WindowFrameBound :
208
211
walk (node .OffsetExpr )
209
- case * tree.Window :
210
212
case * tree.With :
211
213
for _ , expr := range node .CTEList {
212
214
walk (expr )
213
215
}
214
216
default :
215
- w .unknownNodes = append (w .unknownNodes , node )
217
+ if w .unknownNodes != nil {
218
+ w .unknownNodes = append (w .unknownNodes , node )
219
+ }
216
220
}
217
221
}
218
222
}
@@ -257,7 +261,15 @@ func ColNamesInSelect(sql string) (referredCols ReferredCols, err error) {
257
261
return false
258
262
},
259
263
}
260
- _ , err = w .Walk (sql , referredCols )
264
+ stmts , err := parser .Parse (sql )
265
+ if err != nil {
266
+ return
267
+ }
268
+
269
+ _ , err = w .Walk (stmts , referredCols )
270
+ if err != nil {
271
+ return
272
+ }
261
273
for _ , col := range w .unknownNodes {
262
274
log .Printf ("unhandled column type %T" , col )
263
275
}
0 commit comments