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 }