Skip to content

Commit 917864d

Browse files
kyleconroyclaude
andcommitted
Escape single quotes in function aliases for EXPLAIN output
Add escapeFunctionAlias function that only escapes single quotes (not backslashes) for function aliases. This differs from escapeAlias (used for column aliases) which also escapes backslashes. ClickHouse EXPLAIN AST preserves backslashes in function aliases but requires single quotes to be escaped. Fixes test: 02915_analyzer_fuzz_1/stmt2 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 0d9f7c9 commit 917864d

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

internal/explain/functions.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ import (
77
"github.com/sqlc-dev/doubleclick/ast"
88
)
99

10+
// escapeFunctionAlias escapes single quotes in function alias names.
11+
// Unlike escapeAlias (for column aliases), this does NOT escape backslashes
12+
// since ClickHouse EXPLAIN AST preserves backslashes in function aliases.
13+
func escapeFunctionAlias(alias string) string {
14+
return strings.ReplaceAll(alias, "'", "\\'")
15+
}
16+
1017
// normalizeIntervalUnit converts interval units to title-cased singular form
1118
// e.g., "years" -> "Year", "MONTH" -> "Month", "days" -> "Day"
1219
// Also handles SQL standard abbreviations: QQ -> Quarter, YY -> Year, MM -> Month, etc.
@@ -132,7 +139,7 @@ func explainFunctionCallWithAlias(sb *strings.Builder, n *ast.FunctionCall, alia
132139
fnName = fnName + "If"
133140
}
134141
if alias != "" {
135-
fmt.Fprintf(sb, "%sFunction %s (alias %s) (children %d)\n", indent, fnName, alias, children)
142+
fmt.Fprintf(sb, "%sFunction %s (alias %s) (children %d)\n", indent, fnName, escapeFunctionAlias(alias), children)
136143
} else {
137144
fmt.Fprintf(sb, "%sFunction %s (children %d)\n", indent, fnName, children)
138145
}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
1-
{
2-
"explain_todo": {
3-
"stmt2": true
4-
}
5-
}
1+
{}

0 commit comments

Comments
 (0)