Skip to content

Commit b44a838

Browse files
authored
Fix 4 parser tests with EXPLAIN AST improvements (#48)
1 parent 64d3d75 commit b44a838

File tree

10 files changed

+71
-8
lines changed

10 files changed

+71
-8
lines changed

internal/explain/explain.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ func Node(sb *strings.Builder, node interface{}, depth int) {
131131
explainUseQuery(sb, n, indent)
132132
case *ast.DescribeQuery:
133133
explainDescribeQuery(sb, n, indent)
134+
case *ast.ExistsQuery:
135+
explainExistsTableQuery(sb, n, indent)
134136

135137
// Types
136138
case *ast.DataType:

internal/explain/functions.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,12 +800,38 @@ func explainExistsExpr(sb *strings.Builder, n *ast.ExistsExpr, indent string, de
800800

801801
func explainExtractExpr(sb *strings.Builder, n *ast.ExtractExpr, indent string, depth int) {
802802
// EXTRACT is represented as Function toYear, toMonth, etc.
803-
fnName := "to" + strings.Title(strings.ToLower(n.Field))
803+
// ClickHouse uses specific function names for date/time extraction
804+
fnName := extractFieldToFunction(n.Field)
804805
fmt.Fprintf(sb, "%sFunction %s (children %d)\n", indent, fnName, 1)
805806
fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, 1)
806807
Node(sb, n.From, depth+2)
807808
}
808809

810+
// extractFieldToFunction maps EXTRACT field names to ClickHouse function names
811+
func extractFieldToFunction(field string) string {
812+
switch strings.ToUpper(field) {
813+
case "DAY":
814+
return "toDayOfMonth"
815+
case "MONTH":
816+
return "toMonth"
817+
case "YEAR":
818+
return "toYear"
819+
case "SECOND":
820+
return "toSecond"
821+
case "MINUTE":
822+
return "toMinute"
823+
case "HOUR":
824+
return "toHour"
825+
case "QUARTER":
826+
return "toQuarter"
827+
case "WEEK":
828+
return "toWeek"
829+
default:
830+
// Fallback to generic "to" + TitleCase(field)
831+
return "to" + strings.Title(strings.ToLower(field))
832+
}
833+
}
834+
809835
func explainWindowSpec(sb *strings.Builder, n *ast.WindowSpec, indent string, depth int) {
810836
// Window spec is represented as WindowDefinition
811837
// For simple cases like OVER (), just output WindowDefinition without children

internal/explain/select.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ func explainOrderByElement(sb *strings.Builder, n *ast.OrderByElement, indent st
175175
if n.FillStep != nil {
176176
children++
177177
}
178+
if n.Collate != "" {
179+
children++
180+
}
178181
fmt.Fprintf(sb, "%sOrderByElement (children %d)\n", indent, children)
179182
Node(sb, n.Expression, depth+1)
180183
if n.FillFrom != nil {
@@ -186,6 +189,10 @@ func explainOrderByElement(sb *strings.Builder, n *ast.OrderByElement, indent st
186189
if n.FillStep != nil {
187190
Node(sb, n.FillStep, depth+1)
188191
}
192+
if n.Collate != "" {
193+
// COLLATE is output as a string literal
194+
fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, n.Collate)
195+
}
189196
}
190197
}
191198

internal/explain/statements.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,13 @@ func explainShowQuery(sb *strings.Builder, n *ast.ShowQuery, indent string) {
363363
showType = "Tables"
364364
}
365365

366+
// SHOW CREATE DATABASE has special output format
367+
if n.ShowType == ast.ShowCreateDB && n.From != "" {
368+
fmt.Fprintf(sb, "%sShowCreateDatabaseQuery %s (children 1)\n", indent, n.From)
369+
fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.From)
370+
return
371+
}
372+
366373
// SHOW CREATE TABLE has special output format with database and table identifiers
367374
if n.ShowType == ast.ShowCreate && (n.Database != "" || n.From != "") {
368375
// Format: ShowCreateTableQuery database table (children 2)
@@ -383,11 +390,19 @@ func explainShowQuery(sb *strings.Builder, n *ast.ShowQuery, indent string) {
383390
return
384391
}
385392

393+
// SHOW TABLES FROM database - include database as child
394+
if n.ShowType == ast.ShowTables && n.From != "" {
395+
fmt.Fprintf(sb, "%sShowTables (children 1)\n", indent)
396+
fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.From)
397+
return
398+
}
399+
386400
fmt.Fprintf(sb, "%sShow%s\n", indent, showType)
387401
}
388402

389403
func explainUseQuery(sb *strings.Builder, n *ast.UseQuery, indent string) {
390-
fmt.Fprintf(sb, "%sUse %s\n", indent, n.Database)
404+
fmt.Fprintf(sb, "%sUseQuery %s (children %d)\n", indent, n.Database, 1)
405+
fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Database)
391406
}
392407

393408
func explainDescribeQuery(sb *strings.Builder, n *ast.DescribeQuery, indent string) {
@@ -422,6 +437,19 @@ func explainDescribeQuery(sb *strings.Builder, n *ast.DescribeQuery, indent stri
422437
}
423438
}
424439

440+
func explainExistsTableQuery(sb *strings.Builder, n *ast.ExistsQuery, indent string) {
441+
// EXISTS TABLE/DATABASE/DICTIONARY query
442+
name := n.Table
443+
if n.Database != "" {
444+
name = n.Database + " " + n.Table
445+
}
446+
fmt.Fprintf(sb, "%sExistsTableQuery %s (children %d)\n", indent, name, 2)
447+
if n.Database != "" {
448+
fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Database)
449+
}
450+
fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Table)
451+
}
452+
425453
func explainDataType(sb *strings.Builder, n *ast.DataType, indent string, depth int) {
426454
// If type has parameters, expand them as children
427455
if len(n.Parameters) > 0 {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)