Skip to content

Commit da5557a

Browse files
committed
Fix parser/explain issues and enable 11 tests (#21)
Parser changes: - Add Function field to DropQuery for DROP FUNCTION support - Track dropFunction flag in parseDrop() Explain output fixes: - Add explainRenameQuery for RENAME TABLE statements - Add DropFunctionQuery handling in explainDropQuery - Add database-qualified DROP TABLE format (db.table) - Fix ceil function name: change ceiling->ceil mapping - Add ArrayAccess and TupleAccess support in explainAliasedExpr Tests enabled: - 00140_rename - 00157_cache_dictionary - 00161_rounding_functions - 01129_dict_get_join_lose_constness - 02125_recursive_sql_user_defined_functions - 02126_identity_user_defined_function - 02148_sql_user_defined_function_subquery - 02960_partition_by_udf - 03033_index_definition_sql_udf_bug - 03165_round_scale_as_column - 03215_udf_with_union
1 parent 1ee1827 commit da5557a

File tree

18 files changed

+80
-17
lines changed

18 files changed

+80
-17
lines changed

ast/ast.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ type DropQuery struct {
360360
Tables []*TableIdentifier `json:"tables,omitempty"` // For DROP TABLE t1, t2, t3
361361
View string `json:"view,omitempty"`
362362
User string `json:"user,omitempty"`
363+
Function string `json:"function,omitempty"` // For DROP FUNCTION
363364
Temporary bool `json:"temporary,omitempty"`
364365
OnCluster string `json:"on_cluster,omitempty"`
365366
DropDatabase bool `json:"drop_database,omitempty"`

internal/explain/explain.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ func Node(sb *strings.Builder, node interface{}, depth int) {
105105
explainCreateQuery(sb, n, indent, depth)
106106
case *ast.DropQuery:
107107
explainDropQuery(sb, n, indent, depth)
108+
case *ast.RenameQuery:
109+
explainRenameQuery(sb, n, indent, depth)
108110
case *ast.SetQuery:
109111
explainSetQuery(sb, indent)
110112
case *ast.SystemQuery:

internal/explain/expressions.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,15 @@ func explainAliasedExpr(sb *strings.Builder, n *ast.AliasedExpr, depth int) {
269269
Node(sb, e.Condition, depth+2)
270270
Node(sb, e.Then, depth+2)
271271
Node(sb, e.Else, depth+2)
272+
case *ast.CastExpr:
273+
// CAST expressions - ClickHouse doesn't show aliases on CAST in EXPLAIN AST
274+
explainCastExpr(sb, e, indent, depth)
275+
case *ast.ArrayAccess:
276+
// Array access - ClickHouse doesn't show aliases on arrayElement in EXPLAIN AST
277+
explainArrayAccess(sb, e, indent, depth)
278+
case *ast.TupleAccess:
279+
// Tuple access - ClickHouse doesn't show aliases on tupleElement in EXPLAIN AST
280+
explainTupleAccess(sb, e, indent, depth)
272281
default:
273282
// For other types, recursively explain and add alias info
274283
Node(sb, n.Expr, depth)

internal/explain/format.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ func NormalizeFunctionName(name string) string {
179179
"mid": "substring",
180180
"substr": "substring",
181181
"pow": "power",
182-
"ceil": "ceiling",
182+
"ceiling": "ceil",
183183
"ln": "log",
184184
"log10": "log10",
185185
"log2": "log2",

internal/explain/functions.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,13 @@ func explainLambda(sb *strings.Builder, n *ast.Lambda, indent string, depth int)
7979
}
8080

8181
func explainCastExpr(sb *strings.Builder, n *ast.CastExpr, indent string, depth int) {
82+
explainCastExprWithAlias(sb, n, n.Alias, indent, depth)
83+
}
84+
85+
func explainCastExprWithAlias(sb *strings.Builder, n *ast.CastExpr, alias string, indent string, depth int) {
8286
// CAST is represented as Function CAST with expr and type as arguments
83-
if n.Alias != "" {
84-
fmt.Fprintf(sb, "%sFunction CAST (alias %s) (children %d)\n", indent, n.Alias, 1)
87+
if alias != "" {
88+
fmt.Fprintf(sb, "%sFunction CAST (alias %s) (children %d)\n", indent, alias, 1)
8589
} else {
8690
fmt.Fprintf(sb, "%sFunction CAST (children %d)\n", indent, 1)
8791
}

internal/explain/statements.go

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

251289
func explainSetQuery(sb *strings.Builder, indent string) {
@@ -257,6 +295,11 @@ func explainSystemQuery(sb *strings.Builder, indent string) {
257295
}
258296

259297
func explainExplainQuery(sb *strings.Builder, n *ast.ExplainQuery, indent string, depth int) {
298+
// EXPLAIN CURRENT TRANSACTION has no children
299+
if n.ExplainType == ast.ExplainCurrentTransaction {
300+
fmt.Fprintf(sb, "%sExplain %s\n", indent, n.ExplainType)
301+
return
302+
}
260303
fmt.Fprintf(sb, "%sExplain %s (children %d)\n", indent, n.ExplainType, 1)
261304
Node(sb, n.Statement, depth+1)
262305
}

parser/parser.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,6 +1950,7 @@ func (p *Parser) parseDrop() *ast.DropQuery {
19501950

19511951
// What are we dropping?
19521952
dropUser := false
1953+
dropFunction := false
19531954
switch p.current.Token {
19541955
case token.TABLE:
19551956
p.nextToken()
@@ -1962,6 +1963,7 @@ func (p *Parser) parseDrop() *ast.DropQuery {
19621963
dropUser = true
19631964
p.nextToken()
19641965
case token.FUNCTION:
1966+
dropFunction = true
19651967
p.nextToken()
19661968
case token.INDEX:
19671969
p.nextToken()
@@ -2025,6 +2027,8 @@ func (p *Parser) parseDrop() *ast.DropQuery {
20252027
p.nextToken()
20262028
}
20272029
}
2030+
} else if dropFunction {
2031+
drop.Function = tableName
20282032
} else if drop.DropDatabase {
20292033
drop.Database = tableName
20302034
} else {
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)