github.com/wfusion/gofusion@v1.1.14/common/utils/sqlparser/walk.go (about) 1 package sqlparser 2 3 // A Visitor's Visit method is invoked for each node encountered by Walk. 4 // If the result visitor w is not nil, Walk visits each of the children 5 // of node with the visitor w, followed by a call of w.Visit(nil). 6 type Visitor interface { 7 Visit(node Node) (w Visitor, err error) 8 VisitEnd(node Node) error 9 } 10 11 // Walk traverses an AST in depth-first order: It starts by calling 12 // v.Visit(node); node must not be nil. If the visitor w returned by 13 // v.Visit(node) is not nil, Walk is invoked recursively with visitor 14 // w for each of the non-nil children of node, followed by a call of 15 // w.Visit(nil). 16 func Walk(v Visitor, node Node) error { 17 return walk(v, node) 18 } 19 20 func walk(v Visitor, node Node) (err error) { 21 // Visit the node itself 22 if v, err = v.Visit(node); err != nil { 23 return err 24 } else if v == nil { 25 return nil 26 } 27 28 // Visit node's children. 29 switch n := node.(type) { 30 case *Assignment: 31 if err := walkIdentList(v, n.Columns); err != nil { 32 return err 33 } 34 if err := walkExpr(v, n.Expr); err != nil { 35 return err 36 } 37 38 case *SelectStatement: 39 if err := walk(v, n.Columns); err != nil { 40 return err 41 } 42 if n.FromItems != nil { 43 if err := walk(v, n.FromItems); err != nil { 44 return err 45 } 46 } 47 if err := walkExpr(v, n.Condition); err != nil { 48 return err 49 } 50 if err := walkExprs(v, n.GroupingElements); err != nil { 51 return err 52 } 53 if err := walkExpr(v, n.HavingCondition); err != nil { 54 return err 55 } 56 if n.Compound != nil { 57 if err := walk(v, n.Compound); err != nil { 58 return err 59 } 60 } 61 for _, x := range n.OrderBy { 62 if err := walk(v, x); err != nil { 63 return err 64 } 65 } 66 if err := walkExpr(v, n.Limit); err != nil { 67 return err 68 } 69 if err := walkExpr(v, n.Offset); err != nil { 70 return err 71 } 72 73 case *InsertStatement: 74 if err := walk(v, n.TableName); err != nil { 75 return err 76 } 77 if err := walkIdentList(v, n.ColumnNames); err != nil { 78 return err 79 } 80 for _, x := range n.Expressions { 81 if err := walk(v, x); err != nil { 82 return err 83 } 84 } 85 if n.Query != nil { 86 if err := walk(v, n.Query); err != nil { 87 return err 88 } 89 } 90 if n.UpsertClause != nil { 91 if err := walk(v, n.UpsertClause); err != nil { 92 return err 93 } 94 } 95 96 case *UpdateStatement: 97 if n.TableName != nil { 98 if err := walk(v, n.TableName); err != nil { 99 return err 100 } 101 } 102 for _, x := range n.Assignments { 103 if err := walk(v, x); err != nil { 104 return err 105 } 106 } 107 if err := walkExpr(v, n.Condition); err != nil { 108 return err 109 } 110 111 case *UpsertClause: 112 if err := walkIndexedColumnList(v, n.Columns); err != nil { 113 return err 114 } 115 if err := walkExpr(v, n.WhereExpr); err != nil { 116 return err 117 } 118 for _, x := range n.Assignments { 119 if err := walk(v, x); err != nil { 120 return err 121 } 122 } 123 if err := walkExpr(v, n.UpdateWhereExpr); err != nil { 124 return err 125 } 126 127 case *DeleteStatement: 128 if n.TableName != nil { 129 if err := walk(v, n.TableName); err != nil { 130 return err 131 } 132 } 133 if err := walkExpr(v, n.Condition); err != nil { 134 return err 135 } 136 137 case *ParenExpr: 138 if err := walkExpr(v, n.X); err != nil { 139 return err 140 } 141 142 case *UnaryExpr: 143 if err := walkExpr(v, n.X); err != nil { 144 return err 145 } 146 147 case *BinaryExpr: 148 if err := walkExpr(v, n.X); err != nil { 149 return err 150 } 151 if err := walkExpr(v, n.Y); err != nil { 152 return err 153 } 154 155 case *CaseBlock: 156 if err := walkExpr(v, n.Condition); err != nil { 157 return err 158 } 159 if err := walkExpr(v, n.Body); err != nil { 160 return err 161 } 162 163 case *CaseExpr: 164 if err := walkExpr(v, n.Operand); err != nil { 165 return err 166 } 167 for _, x := range n.Blocks { 168 if err := walk(v, x); err != nil { 169 return err 170 } 171 } 172 if err := walkExpr(v, n.ElseExpr); err != nil { 173 return err 174 } 175 176 case *Exprs: 177 if err := walkExprs(v, n.Exprs); err != nil { 178 return err 179 } 180 181 case *QualifiedRef: 182 if err := walkIdent(v, n.Table); err != nil { 183 return err 184 } 185 if err := walkIdent(v, n.Column); err != nil { 186 return err 187 } 188 189 case *Call: 190 if err := walkIdent(v, n.Name); err != nil { 191 return err 192 } 193 if err := walkExprs(v, n.Args); err != nil { 194 return err 195 } 196 if n.Filter != nil { 197 if err := walk(v, n.Filter); err != nil { 198 return err 199 } 200 } 201 202 case *FilterClause: 203 if err := walkExpr(v, n.X); err != nil { 204 return err 205 } 206 207 case *OrderingTerm: 208 if err := walkExpr(v, n.X); err != nil { 209 return err 210 } 211 212 case *Range: 213 if err := walkExpr(v, n.X); err != nil { 214 return err 215 } 216 if err := walkExpr(v, n.Y); err != nil { 217 return err 218 } 219 220 case *Exists: 221 if n.Select != nil { 222 if err := walk(v, n.Select); err != nil { 223 return err 224 } 225 } 226 227 case *ParenSource: 228 if n.X != nil { 229 if err := walk(v, n.X); err != nil { 230 return err 231 } 232 } 233 if err := walkIdent(v, n.Alias); err != nil { 234 return err 235 } 236 237 case *TableName: 238 if err := walkIdent(v, n.Name); err != nil { 239 return err 240 } 241 if err := walkIdent(v, n.Alias); err != nil { 242 return err 243 } 244 245 case *JoinClause: 246 if n.X != nil { 247 if err := walk(v, n.X); err != nil { 248 return err 249 } 250 } 251 if n.Operator != nil { 252 if err := walk(v, n.Operator); err != nil { 253 return err 254 } 255 } 256 if n.Y != nil { 257 if err := walk(v, n.Y); err != nil { 258 return err 259 } 260 } 261 if n.Constraint != nil { 262 if err := walk(v, n.Constraint); err != nil { 263 return err 264 } 265 } 266 267 case *OnConstraint: 268 if err := walkExpr(v, n.X); err != nil { 269 return err 270 } 271 272 case *UsingConstraint: 273 if err := walkIdentList(v, n.Columns); err != nil { 274 return err 275 } 276 277 case *ResultColumn: 278 if err := walkExpr(v, n.Expr); err != nil { 279 return err 280 } 281 if err := walkIdent(v, n.Alias); err != nil { 282 return err 283 } 284 285 case *IndexedColumn: 286 if err := walkExpr(v, n.X); err != nil { 287 return err 288 } 289 290 case *Type: 291 if err := walkIdent(v, n.Name); err != nil { 292 return err 293 } 294 if n.Precision != nil { 295 if err := walk(v, n.Precision); err != nil { 296 return err 297 } 298 } 299 if n.Scale != nil { 300 if err := walk(v, n.Scale); err != nil { 301 return err 302 } 303 } 304 } 305 306 // Revisit original node after its children have been processed. 307 return v.VisitEnd(node) 308 } 309 310 // VisitFunc represents a function type that implements Visitor. 311 // Only executes on node entry. 312 type VisitFunc func(Node) error 313 314 // Visit executes fn. Walk visits node children if fn returns true. 315 func (fn VisitFunc) Visit(node Node) (Visitor, error) { 316 if err := fn(node); err != nil { 317 return nil, err 318 } 319 return fn, nil 320 } 321 322 // VisitEnd is a no-op. 323 func (fn VisitFunc) VisitEnd(node Node) error { return nil } 324 325 // VisitEndFunc represents a function type that implements Visitor. 326 // Only executes on node exit. 327 type VisitEndFunc func(Node) error 328 329 // Visit is a no-op. 330 func (fn VisitEndFunc) Visit(node Node) (Visitor, error) { return fn, nil } 331 332 // VisitEnd executes fn. 333 func (fn VisitEndFunc) VisitEnd(node Node) error { return fn(node) } 334 335 func walkIdent(v Visitor, x *Ident) error { 336 if x != nil { 337 if err := walk(v, x); err != nil { 338 return err 339 } 340 } 341 return nil 342 } 343 344 func walkIdentList(v Visitor, a []*Ident) error { 345 for _, x := range a { 346 if err := walk(v, x); err != nil { 347 return err 348 } 349 } 350 return nil 351 } 352 353 func walkExpr(v Visitor, x Expr) error { 354 if x != nil { 355 if err := walk(v, x); err != nil { 356 return err 357 } 358 } 359 return nil 360 } 361 362 func walkExprs(v Visitor, a []Expr) error { 363 for _, x := range a { 364 if err := walk(v, x); err != nil { 365 return err 366 } 367 } 368 return nil 369 } 370 371 func walkIndexedColumnList(v Visitor, a []*IndexedColumn) error { 372 for _, x := range a { 373 if err := walk(v, x); err != nil { 374 return err 375 } 376 } 377 return nil 378 }