github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/ast/dml.go (about)

     1  // Copyright 2015 PingCAP, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package ast
    15  
    16  import (
    17  	"github.com/insionng/yougam/libraries/pingcap/tidb/model"
    18  )
    19  
    20  var (
    21  	_ DMLNode = &DeleteStmt{}
    22  	_ DMLNode = &InsertStmt{}
    23  	_ DMLNode = &UnionStmt{}
    24  	_ DMLNode = &UpdateStmt{}
    25  	_ DMLNode = &SelectStmt{}
    26  	_ DMLNode = &ShowStmt{}
    27  
    28  	_ Node = &Assignment{}
    29  	_ Node = &ByItem{}
    30  	_ Node = &FieldList{}
    31  	_ Node = &GroupByClause{}
    32  	_ Node = &HavingClause{}
    33  	_ Node = &Join{}
    34  	_ Node = &Limit{}
    35  	_ Node = &OnCondition{}
    36  	_ Node = &OrderByClause{}
    37  	_ Node = &SelectField{}
    38  	_ Node = &TableName{}
    39  	_ Node = &TableRefsClause{}
    40  	_ Node = &TableSource{}
    41  	_ Node = &UnionSelectList{}
    42  	_ Node = &WildCardField{}
    43  )
    44  
    45  // JoinType is join type, including cross/left/right/full.
    46  type JoinType int
    47  
    48  const (
    49  	// CrossJoin is cross join type.
    50  	CrossJoin JoinType = iota + 1
    51  	// LeftJoin is left Join type.
    52  	LeftJoin
    53  	// RightJoin is right Join type.
    54  	RightJoin
    55  )
    56  
    57  // Join represents table join.
    58  type Join struct {
    59  	node
    60  	resultSetNode
    61  
    62  	// Left table can be TableSource or JoinNode.
    63  	Left ResultSetNode
    64  	// Right table can be TableSource or JoinNode or nil.
    65  	Right ResultSetNode
    66  	// Tp represents join type.
    67  	Tp JoinType
    68  	// On represents join on condition.
    69  	On *OnCondition
    70  }
    71  
    72  // Accept implements Node Accept interface.
    73  func (n *Join) Accept(v Visitor) (Node, bool) {
    74  	newNode, skipChildren := v.Enter(n)
    75  	if skipChildren {
    76  		return v.Leave(newNode)
    77  	}
    78  	n = newNode.(*Join)
    79  	node, ok := n.Left.Accept(v)
    80  	if !ok {
    81  		return n, false
    82  	}
    83  	n.Left = node.(ResultSetNode)
    84  	if n.Right != nil {
    85  		node, ok = n.Right.Accept(v)
    86  		if !ok {
    87  			return n, false
    88  		}
    89  		n.Right = node.(ResultSetNode)
    90  	}
    91  	if n.On != nil {
    92  		node, ok = n.On.Accept(v)
    93  		if !ok {
    94  			return n, false
    95  		}
    96  		n.On = node.(*OnCondition)
    97  	}
    98  	return v.Leave(n)
    99  }
   100  
   101  // TableName represents a table name.
   102  type TableName struct {
   103  	node
   104  	resultSetNode
   105  
   106  	Schema model.CIStr
   107  	Name   model.CIStr
   108  
   109  	DBInfo    *model.DBInfo
   110  	TableInfo *model.TableInfo
   111  
   112  	IndexHints []*IndexHint
   113  }
   114  
   115  // IndexHintType is the type for index hint use, ignore or force.
   116  type IndexHintType int
   117  
   118  // IndexHintUseType values.
   119  const (
   120  	HintUse    IndexHintType = 1
   121  	HintIgnore IndexHintType = 2
   122  	HintForce  IndexHintType = 3
   123  )
   124  
   125  // IndexHintScope is the type for index hint for join, order by or group by.
   126  type IndexHintScope int
   127  
   128  // Index hint scopes.
   129  const (
   130  	HintForScan    IndexHintScope = 1
   131  	HintForJoin    IndexHintScope = 2
   132  	HintForOrderBy IndexHintScope = 3
   133  	HintForGroupBy IndexHintScope = 4
   134  )
   135  
   136  // IndexHint represents a hint for optimizer to use/ignore/force for join/order by/group by.
   137  type IndexHint struct {
   138  	IndexNames []model.CIStr
   139  	HintType   IndexHintType
   140  	HintScope  IndexHintScope
   141  }
   142  
   143  // Accept implements Node Accept interface.
   144  func (n *TableName) Accept(v Visitor) (Node, bool) {
   145  	newNode, skipChildren := v.Enter(n)
   146  	if skipChildren {
   147  		return v.Leave(newNode)
   148  	}
   149  	n = newNode.(*TableName)
   150  	return v.Leave(n)
   151  }
   152  
   153  // DeleteTableList is the tablelist used in delete statement multi-table mode.
   154  type DeleteTableList struct {
   155  	node
   156  	Tables []*TableName
   157  }
   158  
   159  // Accept implements Node Accept interface.
   160  func (n *DeleteTableList) Accept(v Visitor) (Node, bool) {
   161  	newNode, skipChildren := v.Enter(n)
   162  	if skipChildren {
   163  		return v.Leave(newNode)
   164  	}
   165  	n = newNode.(*DeleteTableList)
   166  	if n != nil {
   167  		for i, t := range n.Tables {
   168  			node, ok := t.Accept(v)
   169  			if !ok {
   170  				return n, false
   171  			}
   172  			n.Tables[i] = node.(*TableName)
   173  		}
   174  	}
   175  	return v.Leave(n)
   176  }
   177  
   178  // OnCondition represetns JOIN on condition.
   179  type OnCondition struct {
   180  	node
   181  
   182  	Expr ExprNode
   183  }
   184  
   185  // Accept implements Node Accept interface.
   186  func (n *OnCondition) Accept(v Visitor) (Node, bool) {
   187  	newNode, skipChildren := v.Enter(n)
   188  	if skipChildren {
   189  		return v.Leave(newNode)
   190  	}
   191  	n = newNode.(*OnCondition)
   192  	node, ok := n.Expr.Accept(v)
   193  	if !ok {
   194  		return n, false
   195  	}
   196  	n.Expr = node.(ExprNode)
   197  	return v.Leave(n)
   198  }
   199  
   200  // TableSource represents table source with a name.
   201  type TableSource struct {
   202  	node
   203  
   204  	// Source is the source of the data, can be a TableName,
   205  	// a SelectStmt, a UnionStmt, or a JoinNode.
   206  	Source ResultSetNode
   207  
   208  	// AsName is the alias name of the table source.
   209  	AsName model.CIStr
   210  }
   211  
   212  // Accept implements Node Accept interface.
   213  func (n *TableSource) Accept(v Visitor) (Node, bool) {
   214  	newNode, skipChildren := v.Enter(n)
   215  	if skipChildren {
   216  		return v.Leave(newNode)
   217  	}
   218  	n = newNode.(*TableSource)
   219  	node, ok := n.Source.Accept(v)
   220  	if !ok {
   221  		return n, false
   222  	}
   223  	n.Source = node.(ResultSetNode)
   224  	return v.Leave(n)
   225  }
   226  
   227  // SetResultFields implements ResultSetNode interface.
   228  func (n *TableSource) SetResultFields(rfs []*ResultField) {
   229  	n.Source.SetResultFields(rfs)
   230  }
   231  
   232  // GetResultFields implements ResultSetNode interface.
   233  func (n *TableSource) GetResultFields() []*ResultField {
   234  	return n.Source.GetResultFields()
   235  }
   236  
   237  // SelectLockType is the lock type for SelectStmt.
   238  type SelectLockType int
   239  
   240  // Select lock types.
   241  const (
   242  	SelectLockNone SelectLockType = iota
   243  	SelectLockForUpdate
   244  	SelectLockInShareMode
   245  )
   246  
   247  // WildCardField is a special type of select field content.
   248  type WildCardField struct {
   249  	node
   250  
   251  	Table  model.CIStr
   252  	Schema model.CIStr
   253  }
   254  
   255  // Accept implements Node Accept interface.
   256  func (n *WildCardField) Accept(v Visitor) (Node, bool) {
   257  	newNode, skipChildren := v.Enter(n)
   258  	if skipChildren {
   259  		return v.Leave(newNode)
   260  	}
   261  	n = newNode.(*WildCardField)
   262  	return v.Leave(n)
   263  }
   264  
   265  // SelectField represents fields in select statement.
   266  // There are two type of select field: wildcard
   267  // and expression with optional alias name.
   268  type SelectField struct {
   269  	node
   270  
   271  	// Offset is used to get original text.
   272  	Offset int
   273  	// If WildCard is not nil, Expr will be nil.
   274  	WildCard *WildCardField
   275  	// If Expr is not nil, WildCard will be nil.
   276  	Expr ExprNode
   277  	// Alias name for Expr.
   278  	AsName model.CIStr
   279  }
   280  
   281  // Accept implements Node Accept interface.
   282  func (n *SelectField) Accept(v Visitor) (Node, bool) {
   283  	newNode, skipChildren := v.Enter(n)
   284  	if skipChildren {
   285  		return v.Leave(newNode)
   286  	}
   287  	n = newNode.(*SelectField)
   288  	if n.Expr != nil {
   289  		node, ok := n.Expr.Accept(v)
   290  		if !ok {
   291  			return n, false
   292  		}
   293  		n.Expr = node.(ExprNode)
   294  	}
   295  	return v.Leave(n)
   296  }
   297  
   298  // FieldList represents field list in select statement.
   299  type FieldList struct {
   300  	node
   301  
   302  	Fields []*SelectField
   303  }
   304  
   305  // Accept implements Node Accept interface.
   306  func (n *FieldList) Accept(v Visitor) (Node, bool) {
   307  	newNode, skipChildren := v.Enter(n)
   308  	if skipChildren {
   309  		return v.Leave(newNode)
   310  	}
   311  	n = newNode.(*FieldList)
   312  	for i, val := range n.Fields {
   313  		node, ok := val.Accept(v)
   314  		if !ok {
   315  			return n, false
   316  		}
   317  		n.Fields[i] = node.(*SelectField)
   318  	}
   319  	return v.Leave(n)
   320  }
   321  
   322  // TableRefsClause represents table references clause in dml statement.
   323  type TableRefsClause struct {
   324  	node
   325  
   326  	TableRefs *Join
   327  }
   328  
   329  // Accept implements Node Accept interface.
   330  func (n *TableRefsClause) Accept(v Visitor) (Node, bool) {
   331  	newNode, skipChildren := v.Enter(n)
   332  	if skipChildren {
   333  		return v.Leave(newNode)
   334  	}
   335  	n = newNode.(*TableRefsClause)
   336  	node, ok := n.TableRefs.Accept(v)
   337  	if !ok {
   338  		return n, false
   339  	}
   340  	n.TableRefs = node.(*Join)
   341  	return v.Leave(n)
   342  }
   343  
   344  // ByItem represents an item in order by or group by.
   345  type ByItem struct {
   346  	node
   347  
   348  	Expr ExprNode
   349  	Desc bool
   350  }
   351  
   352  // Accept implements Node Accept interface.
   353  func (n *ByItem) Accept(v Visitor) (Node, bool) {
   354  	newNode, skipChildren := v.Enter(n)
   355  	if skipChildren {
   356  		return v.Leave(newNode)
   357  	}
   358  	n = newNode.(*ByItem)
   359  	node, ok := n.Expr.Accept(v)
   360  	if !ok {
   361  		return n, false
   362  	}
   363  	n.Expr = node.(ExprNode)
   364  	return v.Leave(n)
   365  }
   366  
   367  // GroupByClause represents group by clause.
   368  type GroupByClause struct {
   369  	node
   370  	Items []*ByItem
   371  }
   372  
   373  // Accept implements Node Accept interface.
   374  func (n *GroupByClause) Accept(v Visitor) (Node, bool) {
   375  	newNode, skipChildren := v.Enter(n)
   376  	if skipChildren {
   377  		return v.Leave(newNode)
   378  	}
   379  	n = newNode.(*GroupByClause)
   380  	for i, val := range n.Items {
   381  		node, ok := val.Accept(v)
   382  		if !ok {
   383  			return n, false
   384  		}
   385  		n.Items[i] = node.(*ByItem)
   386  	}
   387  	return v.Leave(n)
   388  }
   389  
   390  // HavingClause represents having clause.
   391  type HavingClause struct {
   392  	node
   393  	Expr ExprNode
   394  }
   395  
   396  // Accept implements Node Accept interface.
   397  func (n *HavingClause) Accept(v Visitor) (Node, bool) {
   398  	newNode, skipChildren := v.Enter(n)
   399  	if skipChildren {
   400  		return v.Leave(newNode)
   401  	}
   402  	n = newNode.(*HavingClause)
   403  	node, ok := n.Expr.Accept(v)
   404  	if !ok {
   405  		return n, false
   406  	}
   407  	n.Expr = node.(ExprNode)
   408  	return v.Leave(n)
   409  }
   410  
   411  // OrderByClause represents order by clause.
   412  type OrderByClause struct {
   413  	node
   414  	Items    []*ByItem
   415  	ForUnion bool
   416  }
   417  
   418  // Accept implements Node Accept interface.
   419  func (n *OrderByClause) Accept(v Visitor) (Node, bool) {
   420  	newNode, skipChildren := v.Enter(n)
   421  	if skipChildren {
   422  		return v.Leave(newNode)
   423  	}
   424  	n = newNode.(*OrderByClause)
   425  	for i, val := range n.Items {
   426  		node, ok := val.Accept(v)
   427  		if !ok {
   428  			return n, false
   429  		}
   430  		n.Items[i] = node.(*ByItem)
   431  	}
   432  	return v.Leave(n)
   433  }
   434  
   435  // SelectStmt represents the select query node.
   436  // See: https://dev.mysql.com/doc/refman/5.7/en/select.html
   437  type SelectStmt struct {
   438  	dmlNode
   439  	resultSetNode
   440  
   441  	// Distinct represents if the select has distinct option.
   442  	Distinct bool
   443  	// From is the from clause of the query.
   444  	From *TableRefsClause
   445  	// Where is the where clause in select statement.
   446  	Where ExprNode
   447  	// Fields is the select expression list.
   448  	Fields *FieldList
   449  	// GroupBy is the group by expression list.
   450  	GroupBy *GroupByClause
   451  	// Having is the having condition.
   452  	Having *HavingClause
   453  	// OrderBy is the ordering expression list.
   454  	OrderBy *OrderByClause
   455  	// Limit is the limit clause.
   456  	Limit *Limit
   457  	// Lock is the lock type
   458  	LockTp SelectLockType
   459  }
   460  
   461  // Accept implements Node Accept interface.
   462  func (n *SelectStmt) Accept(v Visitor) (Node, bool) {
   463  	newNode, skipChildren := v.Enter(n)
   464  	if skipChildren {
   465  		return v.Leave(newNode)
   466  	}
   467  
   468  	n = newNode.(*SelectStmt)
   469  	if n.From != nil {
   470  		node, ok := n.From.Accept(v)
   471  		if !ok {
   472  			return n, false
   473  		}
   474  		n.From = node.(*TableRefsClause)
   475  	}
   476  
   477  	if n.Where != nil {
   478  		node, ok := n.Where.Accept(v)
   479  		if !ok {
   480  			return n, false
   481  		}
   482  		n.Where = node.(ExprNode)
   483  	}
   484  
   485  	if n.Fields != nil {
   486  		node, ok := n.Fields.Accept(v)
   487  		if !ok {
   488  			return n, false
   489  		}
   490  		n.Fields = node.(*FieldList)
   491  	}
   492  
   493  	if n.GroupBy != nil {
   494  		node, ok := n.GroupBy.Accept(v)
   495  		if !ok {
   496  			return n, false
   497  		}
   498  		n.GroupBy = node.(*GroupByClause)
   499  	}
   500  
   501  	if n.Having != nil {
   502  		node, ok := n.Having.Accept(v)
   503  		if !ok {
   504  			return n, false
   505  		}
   506  		n.Having = node.(*HavingClause)
   507  	}
   508  
   509  	if n.OrderBy != nil {
   510  		node, ok := n.OrderBy.Accept(v)
   511  		if !ok {
   512  			return n, false
   513  		}
   514  		n.OrderBy = node.(*OrderByClause)
   515  	}
   516  
   517  	if n.Limit != nil {
   518  		node, ok := n.Limit.Accept(v)
   519  		if !ok {
   520  			return n, false
   521  		}
   522  		n.Limit = node.(*Limit)
   523  	}
   524  
   525  	return v.Leave(n)
   526  }
   527  
   528  // UnionSelectList represents the select list in a union statement.
   529  type UnionSelectList struct {
   530  	node
   531  
   532  	Selects []*SelectStmt
   533  }
   534  
   535  // Accept implements Node Accept interface.
   536  func (n *UnionSelectList) Accept(v Visitor) (Node, bool) {
   537  	newNode, skipChildren := v.Enter(n)
   538  	if skipChildren {
   539  		return v.Leave(newNode)
   540  	}
   541  	n = newNode.(*UnionSelectList)
   542  	for i, sel := range n.Selects {
   543  		node, ok := sel.Accept(v)
   544  		if !ok {
   545  			return n, false
   546  		}
   547  		n.Selects[i] = node.(*SelectStmt)
   548  	}
   549  	return v.Leave(n)
   550  }
   551  
   552  // UnionStmt represents "union statement"
   553  // See: https://dev.mysql.com/doc/refman/5.7/en/union.html
   554  type UnionStmt struct {
   555  	dmlNode
   556  	resultSetNode
   557  
   558  	Distinct   bool
   559  	SelectList *UnionSelectList
   560  	OrderBy    *OrderByClause
   561  	Limit      *Limit
   562  }
   563  
   564  // Accept implements Node Accept interface.
   565  func (n *UnionStmt) Accept(v Visitor) (Node, bool) {
   566  	newNode, skipChildren := v.Enter(n)
   567  	if skipChildren {
   568  		return v.Leave(newNode)
   569  	}
   570  	n = newNode.(*UnionStmt)
   571  	if n.SelectList != nil {
   572  		node, ok := n.SelectList.Accept(v)
   573  		if !ok {
   574  			return n, false
   575  		}
   576  		n.SelectList = node.(*UnionSelectList)
   577  	}
   578  	if n.OrderBy != nil {
   579  		node, ok := n.OrderBy.Accept(v)
   580  		if !ok {
   581  			return n, false
   582  		}
   583  		n.OrderBy = node.(*OrderByClause)
   584  	}
   585  	if n.Limit != nil {
   586  		node, ok := n.Limit.Accept(v)
   587  		if !ok {
   588  			return n, false
   589  		}
   590  		n.Limit = node.(*Limit)
   591  	}
   592  	return v.Leave(n)
   593  }
   594  
   595  // Assignment is the expression for assignment, like a = 1.
   596  type Assignment struct {
   597  	node
   598  	// Column is the column name to be assigned.
   599  	Column *ColumnName
   600  	// Expr is the expression assigning to ColName.
   601  	Expr ExprNode
   602  }
   603  
   604  // Accept implements Node Accept interface.
   605  func (n *Assignment) Accept(v Visitor) (Node, bool) {
   606  	newNode, skipChildren := v.Enter(n)
   607  	if skipChildren {
   608  		return v.Leave(newNode)
   609  	}
   610  	n = newNode.(*Assignment)
   611  	node, ok := n.Column.Accept(v)
   612  	if !ok {
   613  		return n, false
   614  	}
   615  	n.Column = node.(*ColumnName)
   616  	node, ok = n.Expr.Accept(v)
   617  	if !ok {
   618  		return n, false
   619  	}
   620  	n.Expr = node.(ExprNode)
   621  	return v.Leave(n)
   622  }
   623  
   624  // Priority const values.
   625  // See: https://dev.mysql.com/doc/refman/5.7/en/insert.html
   626  const (
   627  	NoPriority = iota
   628  	LowPriority
   629  	HighPriority
   630  	DelayedPriority
   631  )
   632  
   633  // InsertStmt is a statement to insert new rows into an existing table.
   634  // See: https://dev.mysql.com/doc/refman/5.7/en/insert.html
   635  type InsertStmt struct {
   636  	dmlNode
   637  
   638  	IsReplace   bool
   639  	Table       *TableRefsClause
   640  	Columns     []*ColumnName
   641  	Lists       [][]ExprNode
   642  	Setlist     []*Assignment
   643  	Priority    int
   644  	OnDuplicate []*Assignment
   645  	Select      ResultSetNode
   646  }
   647  
   648  // Accept implements Node Accept interface.
   649  func (n *InsertStmt) Accept(v Visitor) (Node, bool) {
   650  	newNode, skipChildren := v.Enter(n)
   651  	if skipChildren {
   652  		return v.Leave(newNode)
   653  	}
   654  
   655  	n = newNode.(*InsertStmt)
   656  	if n.Select != nil {
   657  		node, ok := n.Select.Accept(v)
   658  		if !ok {
   659  			return n, false
   660  		}
   661  		n.Select = node.(ResultSetNode)
   662  	}
   663  
   664  	node, ok := n.Table.Accept(v)
   665  	if !ok {
   666  		return n, false
   667  	}
   668  	n.Table = node.(*TableRefsClause)
   669  
   670  	for i, val := range n.Columns {
   671  		node, ok := val.Accept(v)
   672  		if !ok {
   673  			return n, false
   674  		}
   675  		n.Columns[i] = node.(*ColumnName)
   676  	}
   677  	for i, list := range n.Lists {
   678  		for j, val := range list {
   679  			node, ok := val.Accept(v)
   680  			if !ok {
   681  				return n, false
   682  			}
   683  			n.Lists[i][j] = node.(ExprNode)
   684  		}
   685  	}
   686  	for i, val := range n.Setlist {
   687  		node, ok := val.Accept(v)
   688  		if !ok {
   689  			return n, false
   690  		}
   691  		n.Setlist[i] = node.(*Assignment)
   692  	}
   693  	for i, val := range n.OnDuplicate {
   694  		node, ok := val.Accept(v)
   695  		if !ok {
   696  			return n, false
   697  		}
   698  		n.OnDuplicate[i] = node.(*Assignment)
   699  	}
   700  	return v.Leave(n)
   701  }
   702  
   703  // DeleteStmt is a statement to delete rows from table.
   704  // See: https://dev.mysql.com/doc/refman/5.7/en/delete.html
   705  type DeleteStmt struct {
   706  	dmlNode
   707  
   708  	// Used in both single table and multiple table delete statement.
   709  	TableRefs *TableRefsClause
   710  	// Only used in multiple table delete statement.
   711  	Tables       *DeleteTableList
   712  	Where        ExprNode
   713  	Order        *OrderByClause
   714  	Limit        *Limit
   715  	LowPriority  bool
   716  	Ignore       bool
   717  	Quick        bool
   718  	IsMultiTable bool
   719  	BeforeFrom   bool
   720  }
   721  
   722  // Accept implements Node Accept interface.
   723  func (n *DeleteStmt) Accept(v Visitor) (Node, bool) {
   724  	newNode, skipChildren := v.Enter(n)
   725  	if skipChildren {
   726  		return v.Leave(newNode)
   727  	}
   728  
   729  	n = newNode.(*DeleteStmt)
   730  	node, ok := n.TableRefs.Accept(v)
   731  	if !ok {
   732  		return n, false
   733  	}
   734  	n.TableRefs = node.(*TableRefsClause)
   735  
   736  	node, ok = n.Tables.Accept(v)
   737  	if !ok {
   738  		return n, false
   739  	}
   740  	n.Tables = node.(*DeleteTableList)
   741  
   742  	if n.Where != nil {
   743  		node, ok = n.Where.Accept(v)
   744  		if !ok {
   745  			return n, false
   746  		}
   747  		n.Where = node.(ExprNode)
   748  	}
   749  	if n.Order != nil {
   750  		node, ok = n.Order.Accept(v)
   751  		if !ok {
   752  			return n, false
   753  		}
   754  		n.Order = node.(*OrderByClause)
   755  	}
   756  	if n.Limit != nil {
   757  		node, ok = n.Limit.Accept(v)
   758  		if !ok {
   759  			return n, false
   760  		}
   761  		n.Limit = node.(*Limit)
   762  	}
   763  	return v.Leave(n)
   764  }
   765  
   766  // UpdateStmt is a statement to update columns of existing rows in tables with new values.
   767  // See: https://dev.mysql.com/doc/refman/5.7/en/update.html
   768  type UpdateStmt struct {
   769  	dmlNode
   770  
   771  	TableRefs     *TableRefsClause
   772  	List          []*Assignment
   773  	Where         ExprNode
   774  	Order         *OrderByClause
   775  	Limit         *Limit
   776  	LowPriority   bool
   777  	Ignore        bool
   778  	MultipleTable bool
   779  }
   780  
   781  // Accept implements Node Accept interface.
   782  func (n *UpdateStmt) Accept(v Visitor) (Node, bool) {
   783  	newNode, skipChildren := v.Enter(n)
   784  	if skipChildren {
   785  		return v.Leave(newNode)
   786  	}
   787  	n = newNode.(*UpdateStmt)
   788  	node, ok := n.TableRefs.Accept(v)
   789  	if !ok {
   790  		return n, false
   791  	}
   792  	n.TableRefs = node.(*TableRefsClause)
   793  	for i, val := range n.List {
   794  		node, ok = val.Accept(v)
   795  		if !ok {
   796  			return n, false
   797  		}
   798  		n.List[i] = node.(*Assignment)
   799  	}
   800  	if n.Where != nil {
   801  		node, ok = n.Where.Accept(v)
   802  		if !ok {
   803  			return n, false
   804  		}
   805  		n.Where = node.(ExprNode)
   806  	}
   807  	if n.Order != nil {
   808  		node, ok = n.Order.Accept(v)
   809  		if !ok {
   810  			return n, false
   811  		}
   812  		n.Order = node.(*OrderByClause)
   813  	}
   814  	if n.Limit != nil {
   815  		node, ok = n.Limit.Accept(v)
   816  		if !ok {
   817  			return n, false
   818  		}
   819  		n.Limit = node.(*Limit)
   820  	}
   821  	return v.Leave(n)
   822  }
   823  
   824  // Limit is the limit clause.
   825  type Limit struct {
   826  	node
   827  
   828  	Offset uint64
   829  	Count  uint64
   830  }
   831  
   832  // Accept implements Node Accept interface.
   833  func (n *Limit) Accept(v Visitor) (Node, bool) {
   834  	newNode, skipChildren := v.Enter(n)
   835  	if skipChildren {
   836  		return v.Leave(newNode)
   837  	}
   838  	n = newNode.(*Limit)
   839  	return v.Leave(n)
   840  }
   841  
   842  // ShowStmtType is the type for SHOW statement.
   843  type ShowStmtType int
   844  
   845  // Show statement types.
   846  const (
   847  	ShowNone = iota
   848  	ShowEngines
   849  	ShowDatabases
   850  	ShowTables
   851  	ShowTableStatus
   852  	ShowColumns
   853  	ShowWarnings
   854  	ShowCharset
   855  	ShowVariables
   856  	ShowStatus
   857  	ShowCollation
   858  	ShowCreateTable
   859  	ShowGrants
   860  	ShowTriggers
   861  	ShowProcedureStatus
   862  	ShowIndex
   863  )
   864  
   865  // ShowStmt is a statement to provide information about databases, tables, columns and so on.
   866  // See: https://dev.mysql.com/doc/refman/5.7/en/show.html
   867  type ShowStmt struct {
   868  	dmlNode
   869  	resultSetNode
   870  
   871  	Tp     ShowStmtType // Databases/Tables/Columns/....
   872  	DBName string
   873  	Table  *TableName  // Used for showing columns.
   874  	Column *ColumnName // Used for `desc table column`.
   875  	Flag   int         // Some flag parsed from sql, such as FULL.
   876  	Full   bool
   877  	User   string // Used for show grants.
   878  
   879  	// Used by show variables
   880  	GlobalScope bool
   881  	Pattern     *PatternLikeExpr
   882  	Where       ExprNode
   883  }
   884  
   885  // Accept implements Node Accept interface.
   886  func (n *ShowStmt) Accept(v Visitor) (Node, bool) {
   887  	newNode, skipChildren := v.Enter(n)
   888  	if skipChildren {
   889  		return v.Leave(newNode)
   890  	}
   891  	n = newNode.(*ShowStmt)
   892  	if n.Table != nil {
   893  		node, ok := n.Table.Accept(v)
   894  		if !ok {
   895  			return n, false
   896  		}
   897  		n.Table = node.(*TableName)
   898  	}
   899  	if n.Column != nil {
   900  		node, ok := n.Column.Accept(v)
   901  		if !ok {
   902  			return n, false
   903  		}
   904  		n.Column = node.(*ColumnName)
   905  	}
   906  	if n.Pattern != nil {
   907  		node, ok := n.Pattern.Accept(v)
   908  		if !ok {
   909  			return n, false
   910  		}
   911  		n.Pattern = node.(*PatternLikeExpr)
   912  	}
   913  	if n.Where != nil {
   914  		node, ok := n.Where.Accept(v)
   915  		if !ok {
   916  			return n, false
   917  		}
   918  		n.Where = node.(ExprNode)
   919  	}
   920  	return v.Leave(n)
   921  }