@@ -462,6 +462,37 @@ func explainRenameQuery(sb *strings.Builder, n *ast.RenameQuery, indent string,
462462 }
463463}
464464
465+ func explainExchangeQuery (sb * strings.Builder , n * ast.ExchangeQuery , indent string ) {
466+ if n == nil {
467+ fmt .Fprintf (sb , "%s*ast.ExchangeQuery\n " , indent )
468+ return
469+ }
470+ // Count identifiers: 2 per table (db + table if qualified, or just table)
471+ // EXCHANGE TABLES outputs as "Rename" in ClickHouse
472+ children := 0
473+ if n .Database1 != "" {
474+ children += 2 // db1 + table1
475+ } else {
476+ children += 1 // just table1
477+ }
478+ if n .Database2 != "" {
479+ children += 2 // db2 + table2
480+ } else {
481+ children += 1 // just table2
482+ }
483+ fmt .Fprintf (sb , "%sRename (children %d)\n " , indent , children )
484+ // First table
485+ if n .Database1 != "" {
486+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database1 )
487+ }
488+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Table1 )
489+ // Second table
490+ if n .Database2 != "" {
491+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database2 )
492+ }
493+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Table2 )
494+ }
495+
465496func explainSetQuery (sb * strings.Builder , indent string ) {
466497 fmt .Fprintf (sb , "%sSet\n " , indent )
467498}
@@ -554,18 +585,39 @@ func explainShowQuery(sb *strings.Builder, n *ast.ShowQuery, indent string) {
554585
555586 // SHOW CREATE TABLE has special output format with database and table identifiers
556587 if n .ShowType == ast .ShowCreate && (n .Database != "" || n .From != "" ) {
557- // Format: ShowCreateTableQuery database table (children 2)
588+ // Format: ShowCreateTableQuery database table (children 2) or with FORMAT
558589 name := n .From
559590 if n .Database != "" && n .From != "" {
560- fmt .Fprintf (sb , "%sShowCreateTableQuery %s %s (children 2)\n " , indent , n .Database , n .From )
591+ children := 2
592+ if n .Format != "" {
593+ children = 3
594+ }
595+ fmt .Fprintf (sb , "%sShowCreateTableQuery %s %s (children %d)\n " , indent , n .Database , n .From , children )
561596 fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database )
562597 fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .From )
598+ if n .Format != "" {
599+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Format )
600+ }
563601 } else if n .From != "" {
564- fmt .Fprintf (sb , "%sShowCreateTableQuery %s (children 1)\n " , indent , name )
602+ children := 1
603+ if n .Format != "" {
604+ children = 2
605+ }
606+ fmt .Fprintf (sb , "%sShowCreateTableQuery %s (children %d)\n " , indent , name , children )
565607 fmt .Fprintf (sb , "%s Identifier %s\n " , indent , name )
608+ if n .Format != "" {
609+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Format )
610+ }
566611 } else if n .Database != "" {
567- fmt .Fprintf (sb , "%sShowCreateTableQuery %s (children 1)\n " , indent , n .Database )
612+ children := 1
613+ if n .Format != "" {
614+ children = 2
615+ }
616+ fmt .Fprintf (sb , "%sShowCreateTableQuery %s (children %d)\n " , indent , n .Database , children )
568617 fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database )
618+ if n .Format != "" {
619+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Format )
620+ }
569621 } else {
570622 fmt .Fprintf (sb , "%sShow%s\n " , indent , showType )
571623 }
@@ -714,17 +766,20 @@ func explainDetachQuery(sb *strings.Builder, n *ast.DetachQuery, indent string)
714766 fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Table )
715767 return
716768 }
717- // Single name (table only or database only for DETACH DATABASE)
718- name := n .Table
719- if name == "" {
720- name = n .Database
769+ // DETACH DATABASE db: Database set, Table empty -> "DetachQuery db (children 1)"
770+ if n .Database != "" && n .Table == "" {
771+ fmt .Fprintf (sb , "%sDetachQuery %s (children 1)\n " , indent , n .Database )
772+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database )
773+ return
721774 }
722- if name != "" {
723- fmt . Fprintf ( sb , "%sDetachQuery %s (children 1) \n " , indent , name )
724- fmt .Fprintf (sb , "%s Identifier %s\n " , indent , name )
725- } else {
726- fmt . Fprintf ( sb , "%sDetachQuery \n " , indent )
775+ // DETACH TABLE table: Database empty, Table set -> "DetachQuery table (children 1)"
776+ if n . Table != "" {
777+ fmt .Fprintf (sb , "%sDetachQuery %s (children 1) \n " , indent , n . Table )
778+ fmt . Fprintf ( sb , "%s Identifier %s \n " , indent , n . Table )
779+ return
727780 }
781+ // No name
782+ fmt .Fprintf (sb , "%sDetachQuery\n " , indent )
728783}
729784
730785func explainAttachQuery (sb * strings.Builder , n * ast.AttachQuery , indent string ) {
@@ -736,17 +791,20 @@ func explainAttachQuery(sb *strings.Builder, n *ast.AttachQuery, indent string)
736791 fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Table )
737792 return
738793 }
739- // Single name (table only or database only for ATTACH DATABASE)
740- name := n .Table
741- if name == "" {
742- name = n .Database
794+ // ATTACH DATABASE db: Database set, Table empty -> "AttachQuery db (children 1)"
795+ if n .Database != "" && n .Table == "" {
796+ fmt .Fprintf (sb , "%sAttachQuery %s (children 1)\n " , indent , n .Database )
797+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database )
798+ return
743799 }
744- if name != "" {
745- fmt . Fprintf ( sb , "%sAttachQuery %s (children 1) \n " , indent , name )
746- fmt .Fprintf (sb , "%s Identifier %s \n " , indent , name )
747- } else {
748- fmt . Fprintf ( sb , "%sAttachQuery \n " , indent )
800+ // ATTACH TABLE table: Database empty, Table set -> "AttachQuery table (children 1)" (single space)
801+ if n . Table != "" {
802+ fmt .Fprintf (sb , "%sAttachQuery %s (children 1) \n " , indent , n . Table )
803+ fmt . Fprintf ( sb , "%s Identifier %s \n " , indent , n . Table )
804+ return
749805 }
806+ // No name
807+ fmt .Fprintf (sb , "%sAttachQuery\n " , indent )
750808}
751809
752810func explainAlterQuery (sb * strings.Builder , n * ast.AlterQuery , indent string , depth int ) {
0 commit comments