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  }