@@ -222,6 +222,12 @@ func explainDropQuery(sb *strings.Builder, n *ast.DropQuery, indent string, dept
222222 return
223223 }
224224
225+ // DROP FUNCTION has a special output format
226+ if n .Function != "" {
227+ fmt .Fprintf (sb , "%sDropFunctionQuery\n " , indent )
228+ return
229+ }
230+
225231 // Handle multiple tables: DROP TABLE t1, t2, t3
226232 if len (n .Tables ) > 1 {
227233 fmt .Fprintf (sb , "%sDropQuery (children %d)\n " , indent , 1 )
@@ -239,13 +245,45 @@ func explainDropQuery(sb *strings.Builder, n *ast.DropQuery, indent string, dept
239245 if n .DropDatabase {
240246 name = n .Database
241247 }
242- // DROP DATABASE uses different spacing than DROP TABLE
243- if n .DropDatabase {
248+ // Check if we have a database-qualified name (for DROP TABLE db.table)
249+ hasDatabase := n .Database != "" && ! n .DropDatabase
250+ if hasDatabase {
251+ // Database-qualified: DropQuery db table (children 2)
252+ fmt .Fprintf (sb , "%sDropQuery %s %s (children %d)\n " , indent , n .Database , name , 2 )
253+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , n .Database )
254+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , name )
255+ } else if n .DropDatabase {
256+ // DROP DATABASE uses different spacing
244257 fmt .Fprintf (sb , "%sDropQuery %s (children %d)\n " , indent , name , 1 )
258+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , name )
245259 } else {
246260 fmt .Fprintf (sb , "%sDropQuery %s (children %d)\n " , indent , name , 1 )
261+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , name )
262+ }
263+ }
264+
265+ func explainRenameQuery (sb * strings.Builder , n * ast.RenameQuery , indent string , depth int ) {
266+ // Count identifiers: 4 per pair (from_db, from_table, to_db, to_table)
267+ children := len (n .Pairs ) * 4
268+ fmt .Fprintf (sb , "%sRename (children %d)\n " , indent , children )
269+ for _ , pair := range n .Pairs {
270+ // From database
271+ fromDB := pair .FromDatabase
272+ if fromDB == "" {
273+ fromDB = "default"
274+ }
275+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , fromDB )
276+ // From table
277+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , pair .FromTable )
278+ // To database
279+ toDB := pair .ToDatabase
280+ if toDB == "" {
281+ toDB = "default"
282+ }
283+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , toDB )
284+ // To table
285+ fmt .Fprintf (sb , "%s Identifier %s\n " , indent , pair .ToTable )
247286 }
248- fmt .Fprintf (sb , "%s Identifier %s\n " , indent , name )
249287}
250288
251289func explainSetQuery (sb * strings.Builder , indent string ) {
@@ -257,7 +295,23 @@ func explainSystemQuery(sb *strings.Builder, indent string) {
257295}
258296
259297func explainExplainQuery (sb * strings.Builder , n * ast.ExplainQuery , indent string , depth int ) {
260- fmt .Fprintf (sb , "%sExplain %s (children %d)\n " , indent , n .ExplainType , 1 )
298+ // EXPLAIN CURRENT TRANSACTION has no children
299+ if n .ExplainType == ast .ExplainCurrentTransaction {
300+ // At top level (depth 0), ClickHouse outputs "Explain EXPLAIN <TYPE>"
301+ if depth == 0 {
302+ fmt .Fprintf (sb , "%sExplain EXPLAIN %s\n " , indent , n .ExplainType )
303+ } else {
304+ fmt .Fprintf (sb , "%sExplain %s\n " , indent , n .ExplainType )
305+ }
306+ return
307+ }
308+ // At top level (depth 0), ClickHouse outputs "Explain EXPLAIN <TYPE>"
309+ // Nested in subqueries, it outputs "Explain <TYPE>"
310+ if depth == 0 {
311+ fmt .Fprintf (sb , "%sExplain EXPLAIN %s (children %d)\n " , indent , n .ExplainType , 1 )
312+ } else {
313+ fmt .Fprintf (sb , "%sExplain %s (children %d)\n " , indent , n .ExplainType , 1 )
314+ }
261315 Node (sb , n .Statement , depth + 1 )
262316}
263317
0 commit comments