From 73b21eae9f847d6d5df34dad5c74fd590020fc84 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 00:30:08 +0000 Subject: [PATCH 01/21] Add alias support in CAST, SUBSTRING, and TRIM functions - Handle CAST(expr AS alias AS Type) and CAST(expr alias AS Type) patterns - Support aliases on both expression and type in comma-style CAST - Update SUBSTRING to handle aliases on all arguments in FROM/FOR and comma styles - Update TRIM to handle aliases on trimChars and FROM expression - Add trimBoth function name for BOTH modifier - Update wrapWithAlias to replace existing aliases instead of double-wrapping This enables the parser to correctly handle ClickHouse's special operator alias syntax where expressions inside function arguments can have aliases. --- parser/expression.go | 301 +++++++++++++++++- .../metadata.json | 1 - .../02100_replaceRegexpAll_bug/metadata.json | 8 +- .../02160_special_functions/metadata.json | 1 - .../metadata.json | 23 +- .../03315_trim_two_args/metadata.json | 6 +- .../metadata.json | 4 +- 7 files changed, 291 insertions(+), 53 deletions(-) diff --git a/parser/expression.go b/parser/expression.go index e620f9bd18..cdcac55368 100644 --- a/parser/expression.go +++ b/parser/expression.go @@ -1065,19 +1065,162 @@ func (p *Parser) parseCast() ast.Expression { expr.Expr = p.parseExpression(ALIAS_PREC) // Handle both CAST(x AS Type) and CAST(x, 'Type') or CAST(x, expr) syntax + // Also handle CAST(x AS alias AS Type) and CAST(x alias AS Type) where alias is for the expression + // And CAST(x AS alias, 'Type') and CAST(x alias, 'Type') for comma-style with aliased expression if p.currentIs(token.AS) { - p.nextToken() + p.nextToken() // skip AS + + // Check what comes after the identifier + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + if p.peekIs(token.AS) { + // "AS alias AS Type" pattern + alias := p.current.Value + p.nextToken() // skip alias + p.nextToken() // skip AS + expr.Expr = p.wrapWithAlias(expr.Expr, alias) + expr.Type = p.parseDataType() + expr.UsedASSyntax = true + } else if p.peekIs(token.COMMA) { + // "AS alias, 'Type'" pattern - comma-style with aliased expression + alias := p.current.Value + p.nextToken() // skip alias + p.nextToken() // skip comma + expr.Expr = p.wrapWithAlias(expr.Expr, alias) + // Parse type (which may also have an alias) + if p.currentIs(token.STRING) { + typeStr := p.current.Value + typePos := p.current.Pos + p.nextToken() + // Check for alias on the type string + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + typeAlias := p.current.Value + p.nextToken() + expr.TypeExpr = &ast.AliasedExpr{ + Position: typePos, + Expr: &ast.Literal{Position: typePos, Type: ast.LiteralString, Value: typeStr}, + Alias: typeAlias, + } + } else { + expr.Type = &ast.DataType{Position: typePos, Name: typeStr} + } + } else if p.currentIs(token.IDENT) && !p.peekIs(token.LPAREN) && !p.peekIs(token.COMMA) { + // Implicit alias: cast('1234' AS lhs, 'UInt32' rhs) + typeAlias := p.current.Value + p.nextToken() + expr.TypeExpr = &ast.AliasedExpr{ + Position: typePos, + Expr: &ast.Literal{Position: typePos, Type: ast.LiteralString, Value: typeStr}, + Alias: typeAlias, + } + } else { + expr.Type = &ast.DataType{Position: typePos, Name: typeStr} + } + } else { + expr.TypeExpr = p.parseExpression(LOWEST) + } + } else { + // Just "AS Type" + expr.Type = p.parseDataType() + expr.UsedASSyntax = true + } + } else { + // Just "AS Type" + expr.Type = p.parseDataType() + expr.UsedASSyntax = true + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && p.peekIs(token.AS) { + // Handle "expr alias AS Type" pattern (alias without AS keyword) + alias := p.current.Value + p.nextToken() // skip alias + p.nextToken() // skip AS + expr.Expr = p.wrapWithAlias(expr.Expr, alias) expr.Type = p.parseDataType() expr.UsedASSyntax = true + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && p.peekIs(token.COMMA) { + // Handle "expr alias, 'Type'" pattern (alias without AS keyword, comma-style) + alias := p.current.Value + p.nextToken() // skip alias + p.nextToken() // skip comma + expr.Expr = p.wrapWithAlias(expr.Expr, alias) + // Parse type (which may also have an alias) + if p.currentIs(token.STRING) { + typeStr := p.current.Value + typePos := p.current.Pos + p.nextToken() + // Check for alias on the type string + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + typeAlias := p.current.Value + p.nextToken() + expr.TypeExpr = &ast.AliasedExpr{ + Position: typePos, + Expr: &ast.Literal{Position: typePos, Type: ast.LiteralString, Value: typeStr}, + Alias: typeAlias, + } + } else { + expr.Type = &ast.DataType{Position: typePos, Name: typeStr} + } + } else if p.currentIs(token.IDENT) && !p.peekIs(token.LPAREN) && !p.peekIs(token.COMMA) { + // Implicit alias: cast('1234' lhs, 'UInt32' rhs) + typeAlias := p.current.Value + p.nextToken() + expr.TypeExpr = &ast.AliasedExpr{ + Position: typePos, + Expr: &ast.Literal{Position: typePos, Type: ast.LiteralString, Value: typeStr}, + Alias: typeAlias, + } + } else { + expr.Type = &ast.DataType{Position: typePos, Name: typeStr} + } + } else { + expr.TypeExpr = p.parseExpression(LOWEST) + } } else if p.currentIs(token.COMMA) { p.nextToken() // Type can be given as a string literal or an expression (e.g., if(cond, 'Type1', 'Type2')) + // It can also have an alias like: cast('1234', 'UInt32' AS rhs) if p.currentIs(token.STRING) { - expr.Type = &ast.DataType{ - Position: p.current.Pos, - Name: p.current.Value, - } + typeStr := p.current.Value + typePos := p.current.Pos p.nextToken() + // Check for alias on the type string + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + // Store as aliased literal in TypeExpr + expr.TypeExpr = &ast.AliasedExpr{ + Position: typePos, + Expr: &ast.Literal{ + Position: typePos, + Type: ast.LiteralString, + Value: typeStr, + }, + Alias: alias, + } + } else { + expr.Type = &ast.DataType{Position: typePos, Name: typeStr} + } + } else if p.currentIs(token.IDENT) && !p.peekIs(token.LPAREN) && !p.peekIs(token.COMMA) { + // Implicit alias (no AS keyword): cast('1234', 'UInt32' rhs) + alias := p.current.Value + p.nextToken() + expr.TypeExpr = &ast.AliasedExpr{ + Position: typePos, + Expr: &ast.Literal{ + Position: typePos, + Type: ast.LiteralString, + Value: typeStr, + }, + Alias: alias, + } + } else { + expr.Type = &ast.DataType{Position: typePos, Name: typeStr} + } } else { // Parse as expression for dynamic type casting expr.TypeExpr = p.parseExpression(LOWEST) @@ -1089,6 +1232,29 @@ func (p *Parser) parseCast() ast.Expression { return expr } +// wrapWithAlias wraps an expression with an alias, handling different expression types appropriately +// If the expression already has an alias (e.g., AliasedExpr), the new alias replaces/overrides it +func (p *Parser) wrapWithAlias(expr ast.Expression, alias string) ast.Expression { + switch e := expr.(type) { + case *ast.Identifier: + e.Alias = alias + return e + case *ast.FunctionCall: + e.Alias = alias + return e + case *ast.AliasedExpr: + // Replace the alias instead of double-wrapping + e.Alias = alias + return e + default: + return &ast.AliasedExpr{ + Position: expr.Pos(), + Expr: expr, + Alias: alias, + } + } +} + func (p *Parser) parseExtract() ast.Expression { pos := p.current.Pos p.nextToken() // skip EXTRACT @@ -1234,24 +1400,101 @@ func (p *Parser) parseSubstring() ast.Expression { return nil } - args := []ast.Expression{p.parseExpression(LOWEST)} + // Parse first argument (source string) - may have alias before FROM + // Use ALIAS_PREC to not consume AS + firstArg := p.parseExpression(ALIAS_PREC) - // Handle FROM + // Check for alias on first argument (AS alias or just alias before FROM) + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + firstArg = p.wrapWithAlias(firstArg, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && (p.peekIs(token.FROM) || p.peekIs(token.COMMA)) { + // Implicit alias before FROM or COMMA + alias := p.current.Value + p.nextToken() + firstArg = p.wrapWithAlias(firstArg, alias) + } + + args := []ast.Expression{firstArg} + + // Handle FROM or COMMA for second argument if p.currentIs(token.FROM) { p.nextToken() - args = append(args, p.parseExpression(LOWEST)) + // Parse start position - may have alias before FOR or ) + startArg := p.parseExpression(ALIAS_PREC) + // Check for alias + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + startArg = p.wrapWithAlias(startArg, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && (p.peekIs(token.FOR) || p.peekIs(token.RPAREN)) { + alias := p.current.Value + p.nextToken() + startArg = p.wrapWithAlias(startArg, alias) + } + args = append(args, startArg) } else if p.currentIs(token.COMMA) { p.nextToken() - args = append(args, p.parseExpression(LOWEST)) + // Parse second argument with possible alias + startArg := p.parseExpression(ALIAS_PREC) + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + startArg = p.wrapWithAlias(startArg, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && (p.peekIs(token.COMMA) || p.peekIs(token.RPAREN)) { + alias := p.current.Value + p.nextToken() + startArg = p.wrapWithAlias(startArg, alias) + } + args = append(args, startArg) } - // Handle FOR + // Handle FOR or COMMA for third argument if p.currentIs(token.FOR) { p.nextToken() - args = append(args, p.parseExpression(LOWEST)) + // Parse length - may have alias before ) + lenArg := p.parseExpression(ALIAS_PREC) + // Check for alias + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + lenArg = p.wrapWithAlias(lenArg, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && p.peekIs(token.RPAREN) { + alias := p.current.Value + p.nextToken() + lenArg = p.wrapWithAlias(lenArg, alias) + } + args = append(args, lenArg) } else if p.currentIs(token.COMMA) { p.nextToken() - args = append(args, p.parseExpression(LOWEST)) + // Parse third argument with possible alias + lenArg := p.parseExpression(ALIAS_PREC) + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + lenArg = p.wrapWithAlias(lenArg, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && p.peekIs(token.RPAREN) { + alias := p.current.Value + p.nextToken() + lenArg = p.wrapWithAlias(lenArg, alias) + } + args = append(args, lenArg) } p.expect(token.RPAREN) @@ -1287,15 +1530,43 @@ func (p *Parser) parseTrim() ast.Expression { } // Parse characters to trim (if specified) + // Use ALIAS_PREC to not consume AS as alias if !p.currentIs(token.FROM) && !p.currentIs(token.RPAREN) { - trimChars = p.parseExpression(LOWEST) + trimChars = p.parseExpression(ALIAS_PREC) + // Check for alias on trimChars + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + trimChars = p.wrapWithAlias(trimChars, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && p.peekIs(token.FROM) { + alias := p.current.Value + p.nextToken() + trimChars = p.wrapWithAlias(trimChars, alias) + } } // FROM clause var expr ast.Expression if p.currentIs(token.FROM) { p.nextToken() - expr = p.parseExpression(LOWEST) + // Parse expression with possible alias + expr = p.parseExpression(ALIAS_PREC) + // Check for alias + if p.currentIs(token.AS) { + p.nextToken() + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + alias := p.current.Value + p.nextToken() + expr = p.wrapWithAlias(expr, alias) + } + } else if (p.currentIs(token.IDENT) || p.current.Token.IsKeyword()) && p.peekIs(token.RPAREN) { + alias := p.current.Value + p.nextToken() + expr = p.wrapWithAlias(expr, alias) + } } else { expr = trimChars trimChars = nil @@ -1310,6 +1581,8 @@ func (p *Parser) parseTrim() ast.Expression { fnName = "trimLeft" case "TRAILING": fnName = "trimRight" + case "BOTH": + fnName = "trimBoth" } args := []ast.Expression{expr} diff --git a/parser/testdata/00765_sql_compatibility_aliases/metadata.json b/parser/testdata/00765_sql_compatibility_aliases/metadata.json index 5d15832e18..2eaa95a24a 100644 --- a/parser/testdata/00765_sql_compatibility_aliases/metadata.json +++ b/parser/testdata/00765_sql_compatibility_aliases/metadata.json @@ -3,7 +3,6 @@ "stmt10": true, "stmt18": true, "stmt2": true, - "stmt23": true, "stmt25": true, "stmt26": true, "stmt27": true, diff --git a/parser/testdata/02100_replaceRegexpAll_bug/metadata.json b/parser/testdata/02100_replaceRegexpAll_bug/metadata.json index f137d00e25..0967ef424b 100644 --- a/parser/testdata/02100_replaceRegexpAll_bug/metadata.json +++ b/parser/testdata/02100_replaceRegexpAll_bug/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt12": true, - "stmt3": true - } -} +{} diff --git a/parser/testdata/02160_special_functions/metadata.json b/parser/testdata/02160_special_functions/metadata.json index 0539fca0bd..1211988d56 100644 --- a/parser/testdata/02160_special_functions/metadata.json +++ b/parser/testdata/02160_special_functions/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt10": true, "stmt11": true, "stmt14": true, "stmt16": true, diff --git a/parser/testdata/02267_special_operator_parse_alias_check/metadata.json b/parser/testdata/02267_special_operator_parse_alias_check/metadata.json index ab99a79719..b1214a8285 100644 --- a/parser/testdata/02267_special_operator_parse_alias_check/metadata.json +++ b/parser/testdata/02267_special_operator_parse_alias_check/metadata.json @@ -1,22 +1,5 @@ { "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt16": true, - "stmt18": true, - "stmt2": true, - "stmt20": true, - "stmt24": true, - "stmt26": true, - "stmt28": true, - "stmt3": true, - "stmt30": true, - "stmt32": true, - "stmt35": true, - "stmt36": true, - "stmt37": true, "stmt41": true, "stmt43": true, "stmt44": true, @@ -24,7 +7,6 @@ "stmt47": true, "stmt48": true, "stmt49": true, - "stmt5": true, "stmt50": true, "stmt51": true, "stmt52": true, @@ -34,10 +16,7 @@ "stmt56": true, "stmt57": true, "stmt58": true, - "stmt6": true, "stmt60": true, - "stmt62": true, - "stmt8": true, - "stmt9": true + "stmt62": true } } diff --git a/parser/testdata/03315_trim_two_args/metadata.json b/parser/testdata/03315_trim_two_args/metadata.json index dc0702ac62..0967ef424b 100644 --- a/parser/testdata/03315_trim_two_args/metadata.json +++ b/parser/testdata/03315_trim_two_args/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt30": true - } -} +{} diff --git a/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json b/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json index ffd36c155d..1288c962d6 100644 --- a/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json +++ b/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json @@ -3,10 +3,8 @@ "stmt11": true, "stmt12": true, "stmt13": true, - "stmt14": true, "stmt17": true, "stmt5": true, - "stmt7": true, - "stmt8": true + "stmt7": true } } From 71db62b5d14fc8d754b62aacfe6436c26f0a2adc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 00:36:48 +0000 Subject: [PATCH 02/21] Remove extra semicolon in window_functions test, fixing 39 pending statements The query.sql had an extra standalone `;` on line 384 that was throwing off statement numbering and causing parse errors. Removing it fixes all 39 pending explain_todo statements for this test. --- .../01591_window_functions/metadata.json | 37 +------------------ .../testdata/01591_window_functions/query.sql | 1 - 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/parser/testdata/01591_window_functions/metadata.json b/parser/testdata/01591_window_functions/metadata.json index 5f4992df96..24cf4ae23e 100644 --- a/parser/testdata/01591_window_functions/metadata.json +++ b/parser/testdata/01591_window_functions/metadata.json @@ -1,43 +1,8 @@ { "explain_todo": { - "stmt102": true, - "stmt103": true, - "stmt104": true, - "stmt105": true, - "stmt106": true, "stmt107": true, "stmt108": true, "stmt109": true, - "stmt110": true, - "stmt111": true, - "stmt112": true, - "stmt70": true, - "stmt71": true, - "stmt72": true, - "stmt73": true, - "stmt74": true, - "stmt75": true, - "stmt77": true, - "stmt78": true, - "stmt79": true, - "stmt80": true, - "stmt81": true, - "stmt82": true, - "stmt83": true, - "stmt84": true, - "stmt85": true, - "stmt86": true, - "stmt87": true, - "stmt88": true, - "stmt89": true, - "stmt90": true, - "stmt91": true, - "stmt92": true, - "stmt93": true, - "stmt94": true, - "stmt95": true, - "stmt96": true, - "stmt97": true, - "stmt98": true + "stmt110": true } } diff --git a/parser/testdata/01591_window_functions/query.sql b/parser/testdata/01591_window_functions/query.sql index 5a73c2bedf..10b8683046 100644 --- a/parser/testdata/01591_window_functions/query.sql +++ b/parser/testdata/01591_window_functions/query.sql @@ -381,7 +381,6 @@ window w as (partition by p order by number rows between unbounded preceding and unbounded following) order by number settings max_block_size = 3; -; -- careful with auto-application of Null combinator select lagInFrame(toNullable(1)) over (); From 43aed1ac15bdbadd2b1ab4ccbaf32e9d508fedce Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 00:41:46 +0000 Subject: [PATCH 03/21] Fix CREATE DICTIONARY explain output to include database name When a dictionary is created with a database-qualified name like sqllt.dictionary, the explain output now correctly shows both the database and table identifiers, matching ClickHouse's EXPLAIN AST output. --- internal/explain/statements.go | 16 +++++++++++++--- .../01702_system_query_log/metadata.json | 1 - 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/explain/statements.go b/internal/explain/statements.go index e551403daf..6828f878fc 100644 --- a/internal/explain/statements.go +++ b/internal/explain/statements.go @@ -99,15 +99,25 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string, return } if n.CreateDictionary { - // Dictionary: count children = identifier + attributes (if any) + definition (if any) - children := 1 // identifier + // Dictionary: count children = database identifier (if any) + table identifier + attributes (if any) + definition (if any) + children := 1 // table identifier + hasDatabase := n.Database != "" + if hasDatabase { + children++ // database identifier + } if len(n.DictionaryAttrs) > 0 { children++ } if n.DictionaryDef != nil { children++ } - fmt.Fprintf(sb, "%sCreateQuery %s (children %d)\n", indent, n.Table, children) + // Format: "CreateQuery [database] [table] (children N)" + if hasDatabase { + fmt.Fprintf(sb, "%sCreateQuery %s %s (children %d)\n", indent, n.Database, n.Table, children) + fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Database) + } else { + fmt.Fprintf(sb, "%sCreateQuery %s (children %d)\n", indent, n.Table, children) + } fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Table) // Dictionary attributes if len(n.DictionaryAttrs) > 0 { diff --git a/parser/testdata/01702_system_query_log/metadata.json b/parser/testdata/01702_system_query_log/metadata.json index 9528cef5c8..c250451c93 100644 --- a/parser/testdata/01702_system_query_log/metadata.json +++ b/parser/testdata/01702_system_query_log/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt14": true, "stmt15": true, "stmt19": true, "stmt24": true, From 5a33943f0f925feba4e56a55423a8cded896e3cf Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 00:57:55 +0000 Subject: [PATCH 04/21] Add APPLY column transformer support for asterisk expressions - Add APPLY token to lexer - Add Apply field to ast.Asterisk struct - Add parseAsteriskApply function for parsing APPLY(func) and APPLY func syntax - Add APPLY to expression precedence for proper infix parsing - Update explain code to output ColumnsApplyTransformer nodes This fixes 01470_columns_transformers test and many other tests that use APPLY column transformers. --- ast/ast.go | 1 + internal/explain/expressions.go | 11 +++++-- parser/expression.go | 30 ++++++++++++++++++- .../00157_cache_dictionary/metadata.json | 3 +- .../metadata.json | 4 --- .../metadata.json | 9 +----- .../metadata.json | 6 +--- .../metadata.json | 1 - .../testdata/01048_exists_query/metadata.json | 3 +- .../metadata.json | 1 - .../metadata.json | 6 +--- .../01191_rename_dictionary/metadata.json | 1 - .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../metadata.json | 8 +---- .../metadata.json | 3 +- .../metadata.json | 6 +--- .../01470_columns_transformers/metadata.json | 19 +----------- .../metadata.json | 6 +--- .../metadata.json | 1 - .../metadata.json | 1 - .../metadata.json | 1 - .../metadata.json | 6 +--- .../metadata.json | 2 -- .../01683_flat_dictionary/metadata.json | 8 +---- .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../metadata.json | 8 +---- .../metadata.json | 7 +---- .../01760_system_dictionaries/metadata.json | 3 +- .../metadata.json | 7 +---- .../metadata.json | 9 +----- .../metadata.json | 7 +---- .../metadata.json | 5 +--- .../metadata.json | 6 +--- .../01913_replace_dictionary/metadata.json | 3 +- .../01914_exchange_dictionaries/metadata.json | 2 -- .../metadata.json | 7 +---- .../metadata.json | 7 +---- .../metadata.json | 6 +--- .../metadata.json | 6 ---- .../metadata.json | 15 +--------- .../02345_analyzer_subqueries/metadata.json | 7 +---- .../metadata.json | 12 +------- .../metadata.json | 6 +--- .../02931_max_num_to_warn/metadata.json | 15 +--------- .../metadata.json | 6 +--- token/token.go | 2 ++ 48 files changed, 75 insertions(+), 232 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index b2249e485c..eaac393844 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -1126,6 +1126,7 @@ type Asterisk struct { Table string `json:"table,omitempty"` // for table.* Except []string `json:"except,omitempty"` // for * EXCEPT (col1, col2) Replace []*ReplaceExpr `json:"replace,omitempty"` // for * REPLACE (expr AS col) + Apply []string `json:"apply,omitempty"` // for * APPLY (func1) APPLY(func2) } func (a *Asterisk) Pos() token.Position { return a.Position } diff --git a/internal/explain/expressions.go b/internal/explain/expressions.go index 0934f27834..66fe71efe9 100644 --- a/internal/explain/expressions.go +++ b/internal/explain/expressions.go @@ -529,8 +529,8 @@ func explainAliasedExpr(sb *strings.Builder, n *ast.AliasedExpr, depth int) { } func explainAsterisk(sb *strings.Builder, n *ast.Asterisk, indent string, depth int) { - // Check if there are any column transformers (EXCEPT, REPLACE) - hasTransformers := len(n.Except) > 0 || len(n.Replace) > 0 + // Check if there are any column transformers (EXCEPT, REPLACE, APPLY) + hasTransformers := len(n.Except) > 0 || len(n.Replace) > 0 || len(n.Apply) > 0 if n.Table != "" { if hasTransformers { @@ -559,6 +559,8 @@ func explainColumnsTransformers(sb *strings.Builder, n *ast.Asterisk, indent str if len(n.Replace) > 0 { transformerCount++ } + // Each APPLY adds one transformer + transformerCount += len(n.Apply) fmt.Fprintf(sb, "%sColumnsTransformerList (children %d)\n", indent, transformerCount) @@ -583,6 +585,11 @@ func explainColumnsTransformers(sb *strings.Builder, n *ast.Asterisk, indent str } } } + + // Each APPLY function gets its own ColumnsApplyTransformer + for range n.Apply { + fmt.Fprintf(sb, "%s ColumnsApplyTransformer\n", indent) + } } func explainColumnsMatcher(sb *strings.Builder, n *ast.ColumnsMatcher, indent string, depth int) { diff --git a/parser/expression.go b/parser/expression.go index cdcac55368..98ca308b49 100644 --- a/parser/expression.go +++ b/parser/expression.go @@ -49,7 +49,7 @@ func (p *Parser) precedence(tok token.Token) int { return MUL_PREC case token.LPAREN, token.LBRACKET: return CALL - case token.EXCEPT, token.REPLACE: + case token.EXCEPT, token.REPLACE, token.APPLY: return CALL // For asterisk modifiers case token.COLONCOLON: return CALL // Cast operator @@ -418,6 +418,12 @@ func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { return p.parseAsteriskReplace(asterisk) } return left + case token.APPLY: + // Handle * APPLY (func) or * APPLY func + if asterisk, ok := left.(*ast.Asterisk); ok { + return p.parseAsteriskApply(asterisk) + } + return left case token.NUMBER: // Handle tuple access like t.1 where .1 is lexed as a number if strings.HasPrefix(p.current.Value, ".") { @@ -2387,3 +2393,25 @@ func (p *Parser) parseAsteriskReplace(asterisk *ast.Asterisk) ast.Expression { return asterisk } + +func (p *Parser) parseAsteriskApply(asterisk *ast.Asterisk) ast.Expression { + p.nextToken() // skip APPLY + + // APPLY can have optional parentheses: * APPLY(func) or * APPLY func + hasParens := p.currentIs(token.LPAREN) + if hasParens { + p.nextToken() // skip ( + } + + // Parse function name (can be IDENT or keyword like sum, avg, etc.) + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + asterisk.Apply = append(asterisk.Apply, p.current.Value) + p.nextToken() + } + + if hasParens { + p.expect(token.RPAREN) + } + + return asterisk +} diff --git a/parser/testdata/00157_cache_dictionary/metadata.json b/parser/testdata/00157_cache_dictionary/metadata.json index 0de7c95587..ef58f80315 100644 --- a/parser/testdata/00157_cache_dictionary/metadata.json +++ b/parser/testdata/00157_cache_dictionary/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt2": true, - "stmt7": true + "stmt2": true } } diff --git a/parser/testdata/01018_ddl_dictionaries_create/metadata.json b/parser/testdata/01018_ddl_dictionaries_create/metadata.json index 9e012c7738..f858c5980c 100644 --- a/parser/testdata/01018_ddl_dictionaries_create/metadata.json +++ b/parser/testdata/01018_ddl_dictionaries_create/metadata.json @@ -1,19 +1,15 @@ { "explain_todo": { - "stmt11": true, "stmt13": true, "stmt17": true, "stmt18": true, "stmt22": true, "stmt23": true, "stmt28": true, - "stmt35": true, "stmt37": true, "stmt43": true, - "stmt47": true, "stmt48": true, "stmt51": true, - "stmt52": true, "stmt53": true } } diff --git a/parser/testdata/01018_dictionaries_from_dictionaries/metadata.json b/parser/testdata/01018_dictionaries_from_dictionaries/metadata.json index 2f1d763627..0967ef424b 100644 --- a/parser/testdata/01018_dictionaries_from_dictionaries/metadata.json +++ b/parser/testdata/01018_dictionaries_from_dictionaries/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt14": true, - "stmt21": true, - "stmt6": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/01023_materialized_view_query_context/metadata.json b/parser/testdata/01023_materialized_view_query_context/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/01023_materialized_view_query_context/metadata.json +++ b/parser/testdata/01023_materialized_view_query_context/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/01036_no_superfluous_dict_reload_on_create_database_2/metadata.json b/parser/testdata/01036_no_superfluous_dict_reload_on_create_database_2/metadata.json index 9022255763..7ad5569408 100644 --- a/parser/testdata/01036_no_superfluous_dict_reload_on_create_database_2/metadata.json +++ b/parser/testdata/01036_no_superfluous_dict_reload_on_create_database_2/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt4": true, "stmt9": true } } diff --git a/parser/testdata/01048_exists_query/metadata.json b/parser/testdata/01048_exists_query/metadata.json index dd2b14b056..c211f242cc 100644 --- a/parser/testdata/01048_exists_query/metadata.json +++ b/parser/testdata/01048_exists_query/metadata.json @@ -2,7 +2,6 @@ "explain_todo": { "stmt22": true, "stmt23": true, - "stmt24": true, - "stmt25": true + "stmt24": true } } diff --git a/parser/testdata/01110_dictionary_layout_without_arguments/metadata.json b/parser/testdata/01110_dictionary_layout_without_arguments/metadata.json index 5fba57bbf7..f6d9f2395b 100644 --- a/parser/testdata/01110_dictionary_layout_without_arguments/metadata.json +++ b/parser/testdata/01110_dictionary_layout_without_arguments/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt7": true, "stmt8": true } diff --git a/parser/testdata/01129_dict_get_join_lose_constness/metadata.json b/parser/testdata/01129_dict_get_join_lose_constness/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/01129_dict_get_join_lose_constness/metadata.json +++ b/parser/testdata/01129_dict_get_join_lose_constness/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/01191_rename_dictionary/metadata.json b/parser/testdata/01191_rename_dictionary/metadata.json index 2e5d573006..ac3635701b 100644 --- a/parser/testdata/01191_rename_dictionary/metadata.json +++ b/parser/testdata/01191_rename_dictionary/metadata.json @@ -6,7 +6,6 @@ "stmt22": true, "stmt24": true, "stmt28": true, - "stmt5": true, "stmt9": true } } diff --git a/parser/testdata/01224_no_superfluous_dict_reload/metadata.json b/parser/testdata/01224_no_superfluous_dict_reload/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/01224_no_superfluous_dict_reload/metadata.json +++ b/parser/testdata/01224_no_superfluous_dict_reload/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/01225_show_create_table_from_dictionary/metadata.json b/parser/testdata/01225_show_create_table_from_dictionary/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/01225_show_create_table_from_dictionary/metadata.json +++ b/parser/testdata/01225_show_create_table_from_dictionary/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/01251_dict_is_in_infinite_loop/metadata.json b/parser/testdata/01251_dict_is_in_infinite_loop/metadata.json index 9ef47f1326..0967ef424b 100644 --- a/parser/testdata/01251_dict_is_in_infinite_loop/metadata.json +++ b/parser/testdata/01251_dict_is_in_infinite_loop/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt22": true, - "stmt37": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01268_dictionary_direct_layout/metadata.json b/parser/testdata/01268_dictionary_direct_layout/metadata.json index 8fc8cec875..8315a6751f 100644 --- a/parser/testdata/01268_dictionary_direct_layout/metadata.json +++ b/parser/testdata/01268_dictionary_direct_layout/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt25": true, - "stmt26": true, - "stmt27": true + "stmt26": true } } diff --git a/parser/testdata/01376_GROUP_BY_injective_elimination_dictGet/metadata.json b/parser/testdata/01376_GROUP_BY_injective_elimination_dictGet/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/01376_GROUP_BY_injective_elimination_dictGet/metadata.json +++ b/parser/testdata/01376_GROUP_BY_injective_elimination_dictGet/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/01470_columns_transformers/metadata.json b/parser/testdata/01470_columns_transformers/metadata.json index 455829bfa8..2e74062554 100644 --- a/parser/testdata/01470_columns_transformers/metadata.json +++ b/parser/testdata/01470_columns_transformers/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt10": true, "stmt11": true, "stmt12": true, "stmt13": true, @@ -8,34 +7,18 @@ "stmt15": true, "stmt16": true, "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt20": true, "stmt21": true, "stmt22": true, - "stmt23": true, - "stmt24": true, - "stmt25": true, "stmt26": true, - "stmt27": true, - "stmt28": true, "stmt29": true, - "stmt30": true, - "stmt31": true, - "stmt34": true, "stmt35": true, "stmt36": true, "stmt37": true, "stmt38": true, "stmt39": true, - "stmt4": true, "stmt40": true, "stmt41": true, "stmt42": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true + "stmt8": true } } diff --git a/parser/testdata/01501_cache_dictionary_all_fields/metadata.json b/parser/testdata/01501_cache_dictionary_all_fields/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/01501_cache_dictionary_all_fields/metadata.json +++ b/parser/testdata/01501_cache_dictionary_all_fields/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/01527_dist_sharding_key_dictGet_reload/metadata.json b/parser/testdata/01527_dist_sharding_key_dictGet_reload/metadata.json index a9ab9dffb5..09a03eef39 100644 --- a/parser/testdata/01527_dist_sharding_key_dictGet_reload/metadata.json +++ b/parser/testdata/01527_dist_sharding_key_dictGet_reload/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt12": true, "stmt13": true, "stmt18": true } diff --git a/parser/testdata/01575_disable_detach_table_of_dictionary/metadata.json b/parser/testdata/01575_disable_detach_table_of_dictionary/metadata.json index 84f57deaf2..afaaa4b0a6 100644 --- a/parser/testdata/01575_disable_detach_table_of_dictionary/metadata.json +++ b/parser/testdata/01575_disable_detach_table_of_dictionary/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt7": true, "stmt9": true } diff --git a/parser/testdata/01670_dictionary_create_key_expression/metadata.json b/parser/testdata/01670_dictionary_create_key_expression/metadata.json index 25122ac4f4..7ad5569408 100644 --- a/parser/testdata/01670_dictionary_create_key_expression/metadata.json +++ b/parser/testdata/01670_dictionary_create_key_expression/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt9": true } } diff --git a/parser/testdata/01676_dictget_in_default_expression/metadata.json b/parser/testdata/01676_dictget_in_default_expression/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/01676_dictget_in_default_expression/metadata.json +++ b/parser/testdata/01676_dictget_in_default_expression/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/01681_cache_dictionary_simple_key/metadata.json b/parser/testdata/01681_cache_dictionary_simple_key/metadata.json index 070a27224e..b563327205 100644 --- a/parser/testdata/01681_cache_dictionary_simple_key/metadata.json +++ b/parser/testdata/01681_cache_dictionary_simple_key/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt27": true, - "stmt48": true, "stmt7": true } } diff --git a/parser/testdata/01683_flat_dictionary/metadata.json b/parser/testdata/01683_flat_dictionary/metadata.json index 63f8239138..0967ef424b 100644 --- a/parser/testdata/01683_flat_dictionary/metadata.json +++ b/parser/testdata/01683_flat_dictionary/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt25": true, - "stmt44": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01702_bitmap_native_integers/metadata.json b/parser/testdata/01702_bitmap_native_integers/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/01702_bitmap_native_integers/metadata.json +++ b/parser/testdata/01702_bitmap_native_integers/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/01720_dictionary_create_source_with_functions/metadata.json b/parser/testdata/01720_dictionary_create_source_with_functions/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/01720_dictionary_create_source_with_functions/metadata.json +++ b/parser/testdata/01720_dictionary_create_source_with_functions/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/01753_direct_dictionary_simple_key/metadata.json b/parser/testdata/01753_direct_dictionary_simple_key/metadata.json index 070a27224e..0967ef424b 100644 --- a/parser/testdata/01753_direct_dictionary_simple_key/metadata.json +++ b/parser/testdata/01753_direct_dictionary_simple_key/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt27": true, - "stmt48": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01759_dictionary_unique_attribute_names/metadata.json b/parser/testdata/01759_dictionary_unique_attribute_names/metadata.json index 0f293987f1..0967ef424b 100644 --- a/parser/testdata/01759_dictionary_unique_attribute_names/metadata.json +++ b/parser/testdata/01759_dictionary_unique_attribute_names/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/01760_system_dictionaries/metadata.json b/parser/testdata/01760_system_dictionaries/metadata.json index cfa9432ce3..5395f06a45 100644 --- a/parser/testdata/01760_system_dictionaries/metadata.json +++ b/parser/testdata/01760_system_dictionaries/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt20": true, - "stmt7": true + "stmt20": true } } diff --git a/parser/testdata/01765_hashed_dictionary_simple_key/metadata.json b/parser/testdata/01765_hashed_dictionary_simple_key/metadata.json index 947af523db..b563327205 100644 --- a/parser/testdata/01765_hashed_dictionary_simple_key/metadata.json +++ b/parser/testdata/01765_hashed_dictionary_simple_key/metadata.json @@ -1,10 +1,5 @@ { "explain_todo": { - "stmt22": true, - "stmt42": true, - "stmt57": true, - "stmt7": true, - "stmt78": true, - "stmt86": true + "stmt7": true } } diff --git a/parser/testdata/01778_hierarchical_dictionaries/metadata.json b/parser/testdata/01778_hierarchical_dictionaries/metadata.json index 140e099b36..0967ef424b 100644 --- a/parser/testdata/01778_hierarchical_dictionaries/metadata.json +++ b/parser/testdata/01778_hierarchical_dictionaries/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt18": true, - "stmt31": true, - "stmt38": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/01780_clickhouse_dictionary_source_loop/metadata.json b/parser/testdata/01780_clickhouse_dictionary_source_loop/metadata.json index 114ee38611..0967ef424b 100644 --- a/parser/testdata/01780_clickhouse_dictionary_source_loop/metadata.json +++ b/parser/testdata/01780_clickhouse_dictionary_source_loop/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01785_dictionary_element_count/metadata.json b/parser/testdata/01785_dictionary_element_count/metadata.json index b8841d8dd5..b09bea8db0 100644 --- a/parser/testdata/01785_dictionary_element_count/metadata.json +++ b/parser/testdata/01785_dictionary_element_count/metadata.json @@ -1,8 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt16": true, - "stmt25": true, - "stmt8": true + "stmt25": true } } diff --git a/parser/testdata/01837_database_memory_ddl_dictionaries/metadata.json b/parser/testdata/01837_database_memory_ddl_dictionaries/metadata.json index 7ad5569408..0967ef424b 100644 --- a/parser/testdata/01837_database_memory_ddl_dictionaries/metadata.json +++ b/parser/testdata/01837_database_memory_ddl_dictionaries/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt9": true - } -} +{} diff --git a/parser/testdata/01913_replace_dictionary/metadata.json b/parser/testdata/01913_replace_dictionary/metadata.json index 114ee38611..c45b7602ba 100644 --- a/parser/testdata/01913_replace_dictionary/metadata.json +++ b/parser/testdata/01913_replace_dictionary/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt7": true + "stmt12": true } } diff --git a/parser/testdata/01914_exchange_dictionaries/metadata.json b/parser/testdata/01914_exchange_dictionaries/metadata.json index ea34a70eb6..0438c9b85f 100644 --- a/parser/testdata/01914_exchange_dictionaries/metadata.json +++ b/parser/testdata/01914_exchange_dictionaries/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt10": true, - "stmt12": true, "stmt15": true } } diff --git a/parser/testdata/01915_create_or_replace_dictionary/metadata.json b/parser/testdata/01915_create_or_replace_dictionary/metadata.json index 114ee38611..0967ef424b 100644 --- a/parser/testdata/01915_create_or_replace_dictionary/metadata.json +++ b/parser/testdata/01915_create_or_replace_dictionary/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01948_dictionary_quoted_database_name/metadata.json b/parser/testdata/01948_dictionary_quoted_database_name/metadata.json index d02612666a..0967ef424b 100644 --- a/parser/testdata/01948_dictionary_quoted_database_name/metadata.json +++ b/parser/testdata/01948_dictionary_quoted_database_name/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02025_dictionary_view_different_db/metadata.json b/parser/testdata/02025_dictionary_view_different_db/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/02025_dictionary_view_different_db/metadata.json +++ b/parser/testdata/02025_dictionary_view_different_db/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/02339_analyzer_matcher_basic/metadata.json b/parser/testdata/02339_analyzer_matcher_basic/metadata.json index 59d3de61c0..c98ee61a72 100644 --- a/parser/testdata/02339_analyzer_matcher_basic/metadata.json +++ b/parser/testdata/02339_analyzer_matcher_basic/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt102": true, - "stmt103": true, "stmt105": true, "stmt106": true, "stmt30": true, @@ -16,8 +14,6 @@ "stmt52": true, "stmt54": true, "stmt55": true, - "stmt60": true, - "stmt61": true, "stmt63": true, "stmt64": true, "stmt66": true, @@ -26,8 +22,6 @@ "stmt70": true, "stmt79": true, "stmt80": true, - "stmt82": true, - "stmt83": true, "stmt85": true, "stmt86": true, "stmt92": true, diff --git a/parser/testdata/02342_analyzer_compound_types/metadata.json b/parser/testdata/02342_analyzer_compound_types/metadata.json index 3bb42e5f91..a7826c148e 100644 --- a/parser/testdata/02342_analyzer_compound_types/metadata.json +++ b/parser/testdata/02342_analyzer_compound_types/metadata.json @@ -1,21 +1,8 @@ { "explain_todo": { - "stmt29": true, - "stmt30": true, - "stmt35": true, - "stmt36": true, - "stmt4": true, - "stmt47": true, - "stmt48": true, "stmt5": true, - "stmt53": true, - "stmt54": true, "stmt6": true, "stmt7": true, - "stmt75": true, - "stmt76": true, - "stmt8": true, - "stmt81": true, - "stmt82": true + "stmt8": true } } diff --git a/parser/testdata/02345_analyzer_subqueries/metadata.json b/parser/testdata/02345_analyzer_subqueries/metadata.json index 968d29e1ac..0967ef424b 100644 --- a/parser/testdata/02345_analyzer_subqueries/metadata.json +++ b/parser/testdata/02345_analyzer_subqueries/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt26": true, - "stmt29": true - } -} +{} diff --git a/parser/testdata/02378_analyzer_projection_names/metadata.json b/parser/testdata/02378_analyzer_projection_names/metadata.json index a2a84ebabd..2112d876d5 100644 --- a/parser/testdata/02378_analyzer_projection_names/metadata.json +++ b/parser/testdata/02378_analyzer_projection_names/metadata.json @@ -2,7 +2,6 @@ "explain_todo": { "stmt101": true, "stmt105": true, - "stmt107": true, "stmt109": true, "stmt113": true, "stmt117": true, @@ -12,26 +11,17 @@ "stmt133": true, "stmt141": true, "stmt185": true, - "stmt205": true, "stmt207": true, - "stmt213": true, "stmt215": true, - "stmt225": true, "stmt227": true, - "stmt233": true, "stmt235": true, - "stmt31": true, "stmt33": true, "stmt37": true, - "stmt39": true, "stmt41": true, - "stmt55": true, "stmt57": true, "stmt67": true, "stmt89": true, - "stmt91": true, "stmt93": true, - "stmt97": true, - "stmt99": true + "stmt97": true } } diff --git a/parser/testdata/02518_qualified_asterisks_alias_table_name/metadata.json b/parser/testdata/02518_qualified_asterisks_alias_table_name/metadata.json index f4c74e32be..0967ef424b 100644 --- a/parser/testdata/02518_qualified_asterisks_alias_table_name/metadata.json +++ b/parser/testdata/02518_qualified_asterisks_alias_table_name/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt10": true - } -} +{} diff --git a/parser/testdata/02931_max_num_to_warn/metadata.json b/parser/testdata/02931_max_num_to_warn/metadata.json index cbb008aa3e..0967ef424b 100644 --- a/parser/testdata/02931_max_num_to_warn/metadata.json +++ b/parser/testdata/02931_max_num_to_warn/metadata.json @@ -1,14 +1 @@ -{ - "explain_todo": { - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true, - "stmt31": true, - "stmt32": true, - "stmt33": true - } -} +{} diff --git a/parser/testdata/03144_aggregate_states_with_different_types/metadata.json b/parser/testdata/03144_aggregate_states_with_different_types/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/03144_aggregate_states_with_different_types/metadata.json +++ b/parser/testdata/03144_aggregate_states_with_different_types/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/token/token.go b/token/token.go index 1c4808aa7d..8771e3d130 100644 --- a/token/token.go +++ b/token/token.go @@ -57,6 +57,7 @@ const ( AND ANTI ANY + APPLY ARRAY AS ASC @@ -245,6 +246,7 @@ var tokens = [...]string{ AND: "AND", ANTI: "ANTI", ANY: "ANY", + APPLY: "APPLY", ARRAY: "ARRAY", AS: "AS", ASC: "ASC", From c890fbac17ca8a8addec57375dbb9bdaca0f1a06 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 01:08:51 +0000 Subject: [PATCH 05/21] Add transaction control statement support (BEGIN, COMMIT, ROLLBACK, SET TRANSACTION SNAPSHOT) - Add BEGIN, COMMIT, ROLLBACK, TRANSACTION, SNAPSHOT tokens to lexer - Add TransactionControlQuery AST node - Add parseTransactionControl function to parser - Add explain output for ASTTransactionControl This fixes 01173_transaction_control_queries test and several other transaction-related tests. --- ast/ast.go | 11 ++++ internal/explain/explain.go | 2 + parser/parser.go | 53 +++++++++++++++++++ .../01172_transaction_counters/metadata.json | 10 +--- .../metadata.json | 42 +-------------- .../02345_implicit_transaction/metadata.json | 11 +--- .../metadata.json | 9 +--- .../metadata.json | 4 +- token/token.go | 10 ++++ 9 files changed, 81 insertions(+), 71 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index eaac393844..6b861f5318 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -772,6 +772,17 @@ func (s *SystemQuery) Pos() token.Position { return s.Position } func (s *SystemQuery) End() token.Position { return s.Position } func (s *SystemQuery) statementNode() {} +// TransactionControlQuery represents a transaction control statement (BEGIN, COMMIT, ROLLBACK, SET TRANSACTION SNAPSHOT). +type TransactionControlQuery struct { + Position token.Position `json:"-"` + Action string `json:"action"` // "BEGIN", "COMMIT", "ROLLBACK", "SET_SNAPSHOT" + Snapshot int64 `json:"snapshot,omitempty"` +} + +func (t *TransactionControlQuery) Pos() token.Position { return t.Position } +func (t *TransactionControlQuery) End() token.Position { return t.Position } +func (t *TransactionControlQuery) statementNode() {} + // RenamePair represents a single rename pair in RENAME TABLE. type RenamePair struct { FromDatabase string `json:"from_database,omitempty"` diff --git a/internal/explain/explain.go b/internal/explain/explain.go index 44a3355f60..35209d0e1c 100644 --- a/internal/explain/explain.go +++ b/internal/explain/explain.go @@ -121,6 +121,8 @@ func Node(sb *strings.Builder, node interface{}, depth int) { explainSetQuery(sb, indent) case *ast.SystemQuery: explainSystemQuery(sb, n, indent) + case *ast.TransactionControlQuery: + fmt.Fprintf(sb, "%sASTTransactionControl\n", indent) case *ast.ExplainQuery: explainExplainQuery(sb, n, indent, depth) case *ast.ShowQuery: diff --git a/parser/parser.go b/parser/parser.go index ad01c16557..3af645d426 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -181,6 +181,10 @@ func (p *Parser) parseStatement() ast.Statement { case token.EXPLAIN: return p.parseExplain() case token.SET: + // Check for SET TRANSACTION SNAPSHOT + if p.peekIs(token.TRANSACTION) { + return p.parseTransactionControl() + } return p.parseSet() case token.OPTIMIZE: return p.parseOptimize() @@ -203,6 +207,12 @@ func (p *Parser) parseStatement() ast.Statement { return p.parseGrant() case token.REVOKE: return p.parseRevoke() + case token.BEGIN: + return p.parseTransactionControl() + case token.COMMIT: + return p.parseTransactionControl() + case token.ROLLBACK: + return p.parseTransactionControl() default: p.errors = append(p.errors, fmt.Errorf("unexpected token %s at line %d, column %d", p.current.Token, p.current.Pos.Line, p.current.Pos.Column)) @@ -5049,3 +5059,46 @@ func (p *Parser) parseRevoke() *ast.GrantQuery { return grant } + +// parseTransactionControl handles BEGIN, COMMIT, ROLLBACK, and SET TRANSACTION SNAPSHOT statements +func (p *Parser) parseTransactionControl() *ast.TransactionControlQuery { + query := &ast.TransactionControlQuery{ + Position: p.current.Pos, + } + + switch p.current.Token { + case token.BEGIN: + query.Action = "BEGIN" + p.nextToken() // skip BEGIN + // Skip optional TRANSACTION keyword + if p.currentIs(token.TRANSACTION) { + p.nextToken() + } + case token.COMMIT: + query.Action = "COMMIT" + p.nextToken() // skip COMMIT + case token.ROLLBACK: + query.Action = "ROLLBACK" + p.nextToken() // skip ROLLBACK + case token.SET: + p.nextToken() // skip SET + if p.currentIs(token.TRANSACTION) { + p.nextToken() // skip TRANSACTION + if p.currentIs(token.SNAPSHOT) { + p.nextToken() // skip SNAPSHOT + query.Action = "SET_SNAPSHOT" + // Parse snapshot number + if p.currentIs(token.NUMBER) { + // Parse the number value + val, err := strconv.ParseInt(p.current.Value, 10, 64) + if err == nil { + query.Snapshot = val + } + p.nextToken() + } + } + } + } + + return query +} diff --git a/parser/testdata/01172_transaction_counters/metadata.json b/parser/testdata/01172_transaction_counters/metadata.json index bb1e6811bb..a0f4511a0c 100644 --- a/parser/testdata/01172_transaction_counters/metadata.json +++ b/parser/testdata/01172_transaction_counters/metadata.json @@ -1,14 +1,6 @@ { "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt17": true, - "stmt20": true, - "stmt25": true, - "stmt26": true, "stmt28": true, - "stmt29": true, - "stmt5": true, - "stmt7": true + "stmt5": true } } diff --git a/parser/testdata/01173_transaction_control_queries/metadata.json b/parser/testdata/01173_transaction_control_queries/metadata.json index 5fbd26795b..0967ef424b 100644 --- a/parser/testdata/01173_transaction_control_queries/metadata.json +++ b/parser/testdata/01173_transaction_control_queries/metadata.json @@ -1,41 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt16": true, - "stmt17": true, - "stmt19": true, - "stmt20": true, - "stmt21": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt34": true, - "stmt38": true, - "stmt39": true, - "stmt44": true, - "stmt45": true, - "stmt49": true, - "stmt5": true, - "stmt50": true, - "stmt52": true, - "stmt53": true, - "stmt55": true, - "stmt57": true, - "stmt6": true, - "stmt61": true, - "stmt63": true, - "stmt64": true, - "stmt65": true, - "stmt67": true, - "stmt68": true, - "stmt7": true, - "stmt70": true, - "stmt73": true, - "stmt74": true, - "stmt75": true, - "stmt77": true, - "stmt78": true - } -} +{} diff --git a/parser/testdata/02345_implicit_transaction/metadata.json b/parser/testdata/02345_implicit_transaction/metadata.json index c775d35209..0967ef424b 100644 --- a/parser/testdata/02345_implicit_transaction/metadata.json +++ b/parser/testdata/02345_implicit_transaction/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt14": true, - "stmt32": true, - "stmt35": true, - "stmt38": true, - "stmt41": true - } -} +{} diff --git a/parser/testdata/02497_source_part_is_intact_when_mutation/metadata.json b/parser/testdata/02497_source_part_is_intact_when_mutation/metadata.json index c865360d5c..0967ef424b 100644 --- a/parser/testdata/02497_source_part_is_intact_when_mutation/metadata.json +++ b/parser/testdata/02497_source_part_is_intact_when_mutation/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt12": true, - "stmt14": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03282_memory_transaction_crash/metadata.json b/parser/testdata/03282_memory_transaction_crash/metadata.json index a4f8773303..b65b07d7a6 100644 --- a/parser/testdata/03282_memory_transaction_crash/metadata.json +++ b/parser/testdata/03282_memory_transaction_crash/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt3": true, - "stmt4": true, - "stmt5": true + "stmt4": true } } diff --git a/token/token.go b/token/token.go index 8771e3d130..58ceafce34 100644 --- a/token/token.go +++ b/token/token.go @@ -63,6 +63,7 @@ const ( ASC ASOF ATTACH + BEGIN BETWEEN BOTH BY @@ -73,6 +74,7 @@ const ( COLLATE COLUMN COLUMNS + COMMIT CONSTRAINT CREATE CROSS @@ -159,6 +161,7 @@ const ( REPLACE REVOKE RIGHT + ROLLBACK ROLLUP SAMPLE SELECT @@ -167,6 +170,7 @@ const ( SETS SETTINGS SHOW + SNAPSHOT STEP SUBSTRING SYNC @@ -180,6 +184,7 @@ const ( TOP TOTALS TRAILING + TRANSACTION TRIM TRUE TRUNCATE @@ -252,6 +257,7 @@ var tokens = [...]string{ ASC: "ASC", ASOF: "ASOF", ATTACH: "ATTACH", + BEGIN: "BEGIN", BETWEEN: "BETWEEN", BOTH: "BOTH", BY: "BY", @@ -262,6 +268,7 @@ var tokens = [...]string{ COLLATE: "COLLATE", COLUMN: "COLUMN", COLUMNS: "COLUMNS", + COMMIT: "COMMIT", CONSTRAINT: "CONSTRAINT", CREATE: "CREATE", CROSS: "CROSS", @@ -348,6 +355,7 @@ var tokens = [...]string{ REPLACE: "REPLACE", REVOKE: "REVOKE", RIGHT: "RIGHT", + ROLLBACK: "ROLLBACK", ROLLUP: "ROLLUP", SAMPLE: "SAMPLE", SELECT: "SELECT", @@ -356,6 +364,7 @@ var tokens = [...]string{ SETS: "SETS", SETTINGS: "SETTINGS", SHOW: "SHOW", + SNAPSHOT: "SNAPSHOT", STEP: "STEP", SUBSTRING: "SUBSTRING", SYNC: "SYNC", @@ -369,6 +378,7 @@ var tokens = [...]string{ TOP: "TOP", TOTALS: "TOTALS", TRAILING: "TRAILING", + TRANSACTION: "TRANSACTION", TRIM: "TRIM", TRUE: "TRUE", TRUNCATE: "TRUNCATE", From 83ff5996368529c3ef2ae0518689bc171490e563 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 01:19:51 +0000 Subject: [PATCH 06/21] Add COMMENT keyword for SQL COMMENT COLUMN clauses Rename the special COMMENT token (for line comments like -- and /* */) to LINE_COMMENT to avoid collision with the COMMENT SQL keyword needed for ALTER TABLE COMMENT COLUMN and similar statements. --- lexer/lexer.go | 8 ++++---- parser/parser.go | 2 +- token/token.go | 6 ++++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lexer/lexer.go b/lexer/lexer.go index 76361f779e..7335396657 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -306,7 +306,7 @@ func (l *Lexer) readLineComment() Item { } // Strip trailing semicolon from comment - it's a statement terminator, not part of comment text := strings.TrimRight(sb.String(), ";") - return Item{Token: token.COMMENT, Value: text, Pos: pos} + return Item{Token: token.LINE_COMMENT, Value: text, Pos: pos} } func (l *Lexer) readHashComment() Item { @@ -322,7 +322,7 @@ func (l *Lexer) readHashComment() Item { } // Strip trailing semicolon from comment - it's a statement terminator, not part of comment text := strings.TrimRight(sb.String(), ";") - return Item{Token: token.COMMENT, Value: text, Pos: pos} + return Item{Token: token.LINE_COMMENT, Value: text, Pos: pos} } // readUnicodeMinusComment reads from a unicode minus (U+2212) to the end of line or semicolon. @@ -338,7 +338,7 @@ func (l *Lexer) readUnicodeMinusComment() Item { sb.WriteRune(l.ch) l.readChar() } - return Item{Token: token.COMMENT, Value: sb.String(), Pos: pos} + return Item{Token: token.LINE_COMMENT, Value: sb.String(), Pos: pos} } func (l *Lexer) readBlockComment() Item { @@ -371,7 +371,7 @@ func (l *Lexer) readBlockComment() Item { l.readChar() } } - return Item{Token: token.COMMENT, Value: sb.String(), Pos: pos} + return Item{Token: token.LINE_COMMENT, Value: sb.String(), Pos: pos} } func (l *Lexer) readString(quote rune) Item { diff --git a/parser/parser.go b/parser/parser.go index 3af645d426..8225ca7709 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -37,7 +37,7 @@ func (p *Parser) nextToken() { for { p.peek = p.lexer.NextToken() // Skip whitespace and comments - if p.peek.Token == token.WHITESPACE || p.peek.Token == token.COMMENT { + if p.peek.Token == token.WHITESPACE || p.peek.Token == token.LINE_COMMENT { continue } break diff --git a/token/token.go b/token/token.go index 58ceafce34..41b94d931f 100644 --- a/token/token.go +++ b/token/token.go @@ -9,7 +9,7 @@ const ( ILLEGAL Token = iota EOF WHITESPACE - COMMENT + LINE_COMMENT // SQL comments like -- and /* */ // Literals IDENT // identifiers @@ -74,6 +74,7 @@ const ( COLLATE COLUMN COLUMNS + COMMENT COMMIT CONSTRAINT CREATE @@ -208,7 +209,7 @@ var tokens = [...]string{ ILLEGAL: "ILLEGAL", EOF: "EOF", WHITESPACE: "WHITESPACE", - COMMENT: "COMMENT", + LINE_COMMENT: "LINE_COMMENT", IDENT: "IDENT", NUMBER: "NUMBER", @@ -268,6 +269,7 @@ var tokens = [...]string{ COLLATE: "COLLATE", COLUMN: "COLUMN", COLUMNS: "COLUMNS", + COMMENT: "COMMENT", COMMIT: "COMMIT", CONSTRAINT: "CONSTRAINT", CREATE: "CREATE", From 9f044c09514ac4eb784d3cb23f84f8451585ae2b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 01:28:11 +0000 Subject: [PATCH 07/21] Add ALTER TABLE COMMENT COLUMN support - Add COMMENT case to parseAlterCommand for COMMENT COLUMN syntax - Add Comment field to AlterCommand struct for storing column comments - Update explainAlterQuery to output database and table as separate identifiers when database is present - Update AlterCommentColumn explain output to include comment literal - Fix various tests that now pass with COMMENT COLUMN support --- ast/ast.go | 1 + internal/explain/statements.go | 26 ++++++++++++++----- parser/parser.go | 22 ++++++++++++++++ .../testdata/00030_alter_table/metadata.json | 1 - .../00725_comment_columns_long/metadata.json | 2 -- .../metadata.json | 3 +-- .../01164_alter_memory_database/metadata.json | 1 - .../01702_system_query_log/metadata.json | 6 ----- .../02155_dictionary_comment/metadata.json | 4 +-- .../02918_alter_temporary_table/metadata.json | 1 - .../metadata.json | 11 +------- .../metadata.json | 1 - .../metadata.json | 6 +---- 13 files changed, 47 insertions(+), 38 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index 6b861f5318..bf8be6faf7 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -531,6 +531,7 @@ type AlterCommand struct { ProjectionName string `json:"projection_name,omitempty"` // For DROP/MATERIALIZE/CLEAR PROJECTION StatisticsColumns []string `json:"statistics_columns,omitempty"` // For ADD/DROP/CLEAR/MATERIALIZE STATISTICS StatisticsTypes []*FunctionCall `json:"statistics_types,omitempty"` // For ADD/MODIFY STATISTICS TYPE + Comment string `json:"comment,omitempty"` // For COMMENT COLUMN } // Projection represents a projection definition. diff --git a/internal/explain/statements.go b/internal/explain/statements.go index 6828f878fc..8729d8800c 100644 --- a/internal/explain/statements.go +++ b/internal/explain/statements.go @@ -955,18 +955,22 @@ func explainAlterQuery(sb *strings.Builder, n *ast.AlterQuery, indent string, de return } - name := n.Table + children := 2 // ExpressionList + Identifier for table if n.Database != "" { - name = n.Database + "." + n.Table + children = 3 // ExpressionList + Identifier for database + Identifier for table + fmt.Fprintf(sb, "%sAlterQuery %s %s (children %d)\n", indent, n.Database, n.Table, children) + } else { + fmt.Fprintf(sb, "%sAlterQuery %s (children %d)\n", indent, n.Table, children) } - children := 2 - fmt.Fprintf(sb, "%sAlterQuery %s (children %d)\n", indent, name, children) fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, len(n.Commands)) for _, cmd := range n.Commands { explainAlterCommand(sb, cmd, indent+" ", depth+2) } - fmt.Fprintf(sb, "%s Identifier %s\n", indent, name) + if n.Database != "" { + fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Database) + } + fmt.Fprintf(sb, "%s Identifier %s\n", indent, n.Table) } func explainAlterCommand(sb *strings.Builder, cmd *ast.AlterCommand, indent string, depth int) { @@ -1015,6 +1019,9 @@ func explainAlterCommand(sb *strings.Builder, cmd *ast.AlterCommand, indent stri if cmd.ColumnName != "" { fmt.Fprintf(sb, "%s Identifier %s\n", indent, cmd.ColumnName) } + if cmd.Comment != "" { + fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, escapeStringLiteral(cmd.Comment)) + } case ast.AlterAddIndex, ast.AlterDropIndex, ast.AlterClearIndex, ast.AlterMaterializeIndex: if cmd.Index != "" { fmt.Fprintf(sb, "%s Identifier %s\n", indent, cmd.Index) @@ -1178,10 +1185,17 @@ func countAlterCommandChildren(cmd *ast.AlterCommand) int { if cmd.AfterColumn != "" { children++ } - case ast.AlterDropColumn, ast.AlterCommentColumn: + case ast.AlterDropColumn: + if cmd.ColumnName != "" { + children++ + } + case ast.AlterCommentColumn: if cmd.ColumnName != "" { children++ } + if cmd.Comment != "" { + children++ + } case ast.AlterRenameColumn: if cmd.ColumnName != "" { children++ diff --git a/parser/parser.go b/parser/parser.go index 8225ca7709..48b3e109bb 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -3860,6 +3860,28 @@ func (p *Parser) parseAlterCommand() *ast.AlterCommand { } } } + case token.COMMENT: + p.nextToken() + if p.currentIs(token.COLUMN) { + cmd.Type = ast.AlterCommentColumn + p.nextToken() + // Handle IF EXISTS + if p.currentIs(token.IF) { + p.nextToken() + p.expect(token.EXISTS) + cmd.IfExists = true + } + // Parse column name + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + cmd.ColumnName = p.current.Value + p.nextToken() + } + // Parse comment string + if p.currentIs(token.STRING) { + cmd.Comment = p.current.Value + p.nextToken() + } + } case token.DETACH: p.nextToken() if p.currentIs(token.PARTITION) { diff --git a/parser/testdata/00030_alter_table/metadata.json b/parser/testdata/00030_alter_table/metadata.json index 1912a7d714..c04bc590a0 100644 --- a/parser/testdata/00030_alter_table/metadata.json +++ b/parser/testdata/00030_alter_table/metadata.json @@ -5,7 +5,6 @@ "stmt16": true, "stmt19": true, "stmt20": true, - "stmt22": true, "stmt9": true } } diff --git a/parser/testdata/00725_comment_columns_long/metadata.json b/parser/testdata/00725_comment_columns_long/metadata.json index 1096805ead..54ac61b35d 100644 --- a/parser/testdata/00725_comment_columns_long/metadata.json +++ b/parser/testdata/00725_comment_columns_long/metadata.json @@ -1,11 +1,9 @@ { "explain_todo": { "stmt13": true, - "stmt17": true, "stmt19": true, "stmt21": true, "stmt3": true, - "stmt7": true, "stmt9": true } } diff --git a/parser/testdata/00753_comment_columns_zookeeper/metadata.json b/parser/testdata/00753_comment_columns_zookeeper/metadata.json index f5dd12602b..ef58f80315 100644 --- a/parser/testdata/00753_comment_columns_zookeeper/metadata.json +++ b/parser/testdata/00753_comment_columns_zookeeper/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt2": true, - "stmt5": true + "stmt2": true } } diff --git a/parser/testdata/01164_alter_memory_database/metadata.json b/parser/testdata/01164_alter_memory_database/metadata.json index 8f6d4ba033..ff0eba6904 100644 --- a/parser/testdata/01164_alter_memory_database/metadata.json +++ b/parser/testdata/01164_alter_memory_database/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt6": true, "stmt7": true } diff --git a/parser/testdata/01702_system_query_log/metadata.json b/parser/testdata/01702_system_query_log/metadata.json index c250451c93..399d26f308 100644 --- a/parser/testdata/01702_system_query_log/metadata.json +++ b/parser/testdata/01702_system_query_log/metadata.json @@ -3,14 +3,8 @@ "stmt15": true, "stmt19": true, "stmt24": true, - "stmt26": true, - "stmt27": true, "stmt28": true, - "stmt29": true, "stmt30": true, - "stmt31": true, - "stmt32": true, - "stmt33": true, "stmt34": true, "stmt37": true, "stmt38": true, diff --git a/parser/testdata/02155_dictionary_comment/metadata.json b/parser/testdata/02155_dictionary_comment/metadata.json index 22424db27e..62b81668c3 100644 --- a/parser/testdata/02155_dictionary_comment/metadata.json +++ b/parser/testdata/02155_dictionary_comment/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt13": true, - "stmt19": true, - "stmt7": true + "stmt13": true } } diff --git a/parser/testdata/02918_alter_temporary_table/metadata.json b/parser/testdata/02918_alter_temporary_table/metadata.json index 8ce1b1e98e..7f26f4a68c 100644 --- a/parser/testdata/02918_alter_temporary_table/metadata.json +++ b/parser/testdata/02918_alter_temporary_table/metadata.json @@ -5,7 +5,6 @@ "stmt15": true, "stmt18": true, "stmt19": true, - "stmt21": true, "stmt5": true, "stmt8": true } diff --git a/parser/testdata/03595_alter_drop_column_comment_if_exists/metadata.json b/parser/testdata/03595_alter_drop_column_comment_if_exists/metadata.json index 6dcc5b343d..0967ef424b 100644 --- a/parser/testdata/03595_alter_drop_column_comment_if_exists/metadata.json +++ b/parser/testdata/03595_alter_drop_column_comment_if_exists/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt17": true, - "stmt3": true, - "stmt5": true, - "stmt7": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03595_alter_if_exists_mixed_commands/metadata.json b/parser/testdata/03595_alter_if_exists_mixed_commands/metadata.json index c84e30800d..b563327205 100644 --- a/parser/testdata/03595_alter_if_exists_mixed_commands/metadata.json +++ b/parser/testdata/03595_alter_if_exists_mixed_commands/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, "stmt7": true } } diff --git a/parser/testdata/03655_keeper_map_alter_comment/metadata.json b/parser/testdata/03655_keeper_map_alter_comment/metadata.json index 7ad5569408..0967ef424b 100644 --- a/parser/testdata/03655_keeper_map_alter_comment/metadata.json +++ b/parser/testdata/03655_keeper_map_alter_comment/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt9": true - } -} +{} From c0d59a41204ab83977ded943ea170a11aa0af33e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 01:34:24 +0000 Subject: [PATCH 08/21] Add OPTIMIZE CLEANUP and INSERT (*) support - Add Cleanup flag to OptimizeQuery for OPTIMIZE TABLE ... FINAL CLEANUP - Update explain output to append _cleanup to table name when Cleanup=true - Add AllColumns flag to InsertQuery for INSERT INTO table (*) syntax - Update explain output for INSERT with (*) to show Asterisk child - Update parser to handle both new syntaxes --- ast/ast.go | 2 + internal/explain/statements.go | 10 ++++- parser/parser.go | 38 ++++++++++++------- .../metadata.json | 7 +--- .../01115_prewhere_array_join/metadata.json | 6 +-- .../01943_query_id_check/metadata.json | 6 +-- .../metadata.json | 37 +----------------- .../metadata.json | 10 +---- 8 files changed, 40 insertions(+), 76 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index bf8be6faf7..86559cae51 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -225,6 +225,7 @@ type InsertQuery struct { Table string `json:"table,omitempty"` Function *FunctionCall `json:"function,omitempty"` // For INSERT INTO FUNCTION syntax Columns []*Identifier `json:"columns,omitempty"` + AllColumns bool `json:"all_columns,omitempty"` // For (*) syntax meaning all columns PartitionBy Expression `json:"partition_by,omitempty"` // For PARTITION BY clause Infile string `json:"infile,omitempty"` // For FROM INFILE clause Compression string `json:"compression,omitempty"` // For COMPRESSION clause @@ -740,6 +741,7 @@ type OptimizeQuery struct { Table string `json:"table"` Partition Expression `json:"partition,omitempty"` Final bool `json:"final,omitempty"` + Cleanup bool `json:"cleanup,omitempty"` Dedupe bool `json:"dedupe,omitempty"` OnCluster string `json:"on_cluster,omitempty"` } diff --git a/internal/explain/statements.go b/internal/explain/statements.go index 8729d8800c..43aa36e538 100644 --- a/internal/explain/statements.go +++ b/internal/explain/statements.go @@ -24,7 +24,7 @@ func explainInsertQuery(sb *strings.Builder, n *ast.InsertQuery, indent string, children++ // Database identifier (separate from table) } } - if len(n.Columns) > 0 { + if len(n.Columns) > 0 || n.AllColumns { children++ // Column list } if n.Select != nil { @@ -58,7 +58,10 @@ func explainInsertQuery(sb *strings.Builder, n *ast.InsertQuery, indent string, } // Column list - if len(n.Columns) > 0 { + if n.AllColumns { + fmt.Fprintf(sb, "%s ExpressionList (children 1)\n", indent) + fmt.Fprintf(sb, "%s Asterisk\n", indent) + } else if len(n.Columns) > 0 { fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, len(n.Columns)) for _, col := range n.Columns { fmt.Fprintf(sb, "%s Identifier %s\n", indent, col.Parts[len(col.Parts)-1]) @@ -1282,6 +1285,9 @@ func explainOptimizeQuery(sb *strings.Builder, n *ast.OptimizeQuery, indent stri if n.Final { name += "_final" } + if n.Cleanup { + name += "_cleanup" + } children := 1 // identifier if n.Partition != nil { diff --git a/parser/parser.go b/parser/parser.go index 48b3e109bb..5d3e0e3d30 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -1179,19 +1179,25 @@ func (p *Parser) parseInsert() *ast.InsertQuery { // Parse column list if p.currentIs(token.LPAREN) { p.nextToken() - for !p.currentIs(token.RPAREN) && !p.currentIs(token.EOF) { - pos := p.current.Pos - colName := p.parseIdentifierName() - if colName != "" { - ins.Columns = append(ins.Columns, &ast.Identifier{ - Position: pos, - Parts: []string{colName}, - }) - } - if p.currentIs(token.COMMA) { - p.nextToken() - } else { - break + // Check for (*) meaning all columns + if p.currentIs(token.ASTERISK) { + ins.AllColumns = true + p.nextToken() + } else { + for !p.currentIs(token.RPAREN) && !p.currentIs(token.EOF) { + pos := p.current.Pos + colName := p.parseIdentifierName() + if colName != "" { + ins.Columns = append(ins.Columns, &ast.Identifier{ + Position: pos, + Parts: []string{colName}, + }) + } + if p.currentIs(token.COMMA) { + p.nextToken() + } else { + break + } } } p.expect(token.RPAREN) @@ -4374,6 +4380,12 @@ func (p *Parser) parseOptimize() *ast.OptimizeQuery { p.nextToken() } + // Handle CLEANUP + if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "CLEANUP" { + opt.Cleanup = true + p.nextToken() + } + // Handle DEDUPLICATE if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "DEDUPLICATE" { opt.Dedupe = true diff --git a/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json b/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json index b8b6f8d356..0438c9b85f 100644 --- a/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json +++ b/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json @@ -1,10 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt16": true, - "stmt7": true + "stmt15": true } } diff --git a/parser/testdata/01115_prewhere_array_join/metadata.json b/parser/testdata/01115_prewhere_array_join/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/01115_prewhere_array_join/metadata.json +++ b/parser/testdata/01115_prewhere_array_join/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/01943_query_id_check/metadata.json b/parser/testdata/01943_query_id_check/metadata.json index c45b7602ba..0967ef424b 100644 --- a/parser/testdata/01943_query_id_check/metadata.json +++ b/parser/testdata/01943_query_id_check/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt12": true - } -} +{} diff --git a/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json b/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json index 934aaed6bc..2b6f0b10aa 100644 --- a/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json +++ b/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json @@ -1,41 +1,6 @@ { "explain_todo": { - "stmt103": true, - "stmt104": true, - "stmt108": true, - "stmt109": true, - "stmt11": true, - "stmt14": true, - "stmt18": true, - "stmt23": true, - "stmt26": true, - "stmt30": true, - "stmt31": true, - "stmt33": true, - "stmt35": true, - "stmt37": true, - "stmt4": true, - "stmt42": true, - "stmt49": true, - "stmt50": true, - "stmt55": true, - "stmt56": true, - "stmt57": true, "stmt58": true, - "stmt59": true, - "stmt64": true, - "stmt65": true, - "stmt7": true, - "stmt71": true, - "stmt75": true, - "stmt77": true, - "stmt81": true, - "stmt83": true, - "stmt88": true, - "stmt89": true, - "stmt93": true, - "stmt94": true, - "stmt98": true, - "stmt99": true + "stmt65": true } } diff --git a/parser/testdata/02861_replacing_merge_tree_with_cleanup/metadata.json b/parser/testdata/02861_replacing_merge_tree_with_cleanup/metadata.json index 34dfcd0759..0967ef424b 100644 --- a/parser/testdata/02861_replacing_merge_tree_with_cleanup/metadata.json +++ b/parser/testdata/02861_replacing_merge_tree_with_cleanup/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt3": true, - "stmt4": true, - "stmt6": true, - "stmt8": true - } -} +{} From 588e73b2fd1cdb8d721c5e51db527ea0e763a84c Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 01:53:04 +0000 Subject: [PATCH 09/21] Add INTERSECT keyword and fix EXCEPT explain formatting - Add INTERSECT as a proper keyword token (was being parsed as identifier which caused it to be treated as an alias for function calls) - Update parser to use token.INTERSECT instead of identifier check - Fix explainSelectIntersectExceptQuery to wrap first operand in SelectWithUnionQuery when EXCEPT is present (matches ClickHouse behavior) - Update metadata.json files to reflect newly passing explain tests This fixes 12 INTERSECT/EXCEPT explain tests. Remaining failures require parser changes to handle INTERSECT/EXCEPT operator precedence properly. --- internal/explain/select.go | 22 +++++++++++++++++-- parser/parser.go | 6 ++--- .../00174_distinct_in_order/metadata.json | 2 +- .../metadata.json | 11 +--------- .../metadata.json | 14 +----------- .../metadata.json | 12 ---------- .../02044_exists_operator/metadata.json | 2 +- .../metadata.json | 8 +------ .../metadata.json | 4 +--- .../metadata.json | 7 +----- .../metadata.json | 4 +--- .../03394_pr_insert_select/metadata.json | 6 +---- .../metadata.json | 6 +---- .../metadata.json | 1 - token/token.go | 2 ++ 15 files changed, 34 insertions(+), 73 deletions(-) diff --git a/internal/explain/select.go b/internal/explain/select.go index 824e6b5b8d..b6ff6b2909 100644 --- a/internal/explain/select.go +++ b/internal/explain/select.go @@ -9,8 +9,26 @@ import ( func explainSelectIntersectExceptQuery(sb *strings.Builder, n *ast.SelectIntersectExceptQuery, indent string, depth int) { fmt.Fprintf(sb, "%sSelectIntersectExceptQuery (children %d)\n", indent, len(n.Selects)) - for _, sel := range n.Selects { - Node(sb, sel, depth+1) + + // ClickHouse wraps first operand in SelectWithUnionQuery when EXCEPT is present + hasExcept := false + for _, op := range n.Operators { + if op == "EXCEPT" { + hasExcept = true + break + } + } + + childIndent := strings.Repeat(" ", depth+1) + for i, sel := range n.Selects { + if hasExcept && i == 0 { + // Wrap first operand in SelectWithUnionQuery -> ExpressionList format + fmt.Fprintf(sb, "%sSelectWithUnionQuery (children 1)\n", childIndent) + fmt.Fprintf(sb, "%s ExpressionList (children 1)\n", childIndent) + Node(sb, sel, depth+3) + } else { + Node(sb, sel, depth+1) + } } } diff --git a/parser/parser.go b/parser/parser.go index 5d3e0e3d30..ac72d96720 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -314,8 +314,7 @@ func (p *Parser) parseSelectWithUnion() *ast.SelectWithUnionQuery { } // Parse UNION/INTERSECT ALL/EXCEPT ALL clauses - for p.currentIs(token.UNION) || p.currentIs(token.EXCEPT) || - (p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "INTERSECT") { + for p.currentIs(token.UNION) || p.currentIs(token.EXCEPT) || p.currentIs(token.INTERSECT) { var setOp string if p.currentIs(token.UNION) { setOp = "UNION" @@ -366,8 +365,7 @@ func (p *Parser) parseSelectWithUnion() *ast.SelectWithUnionQuery { // Only INTERSECT ALL and EXCEPT ALL are flattened (no wrapper). // INTERSECT DISTINCT, INTERSECT, EXCEPT DISTINCT, and EXCEPT all use the wrapper. func (p *Parser) isIntersectExceptWithWrapper() bool { - if !p.currentIs(token.EXCEPT) && - !(p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "INTERSECT") { + if !p.currentIs(token.EXCEPT) && !p.currentIs(token.INTERSECT) { return false } // INTERSECT ALL and EXCEPT ALL are flattened (no wrapper) diff --git a/parser/testdata/00174_distinct_in_order/metadata.json b/parser/testdata/00174_distinct_in_order/metadata.json index c3a284c444..0967ef424b 100644 --- a/parser/testdata/00174_distinct_in_order/metadata.json +++ b/parser/testdata/00174_distinct_in_order/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt17":true,"stmt9":true}} +{} diff --git a/parser/testdata/02004_intersect_except_const_column/metadata.json b/parser/testdata/02004_intersect_except_const_column/metadata.json index 503bf9ee0a..12d7fda64a 100644 --- a/parser/testdata/02004_intersect_except_const_column/metadata.json +++ b/parser/testdata/02004_intersect_except_const_column/metadata.json @@ -1,17 +1,8 @@ { "explain_todo": { - "stmt10": true, - "stmt11": true, "stmt12": true, "stmt13": true, "stmt14": true, - "stmt2": true, - "stmt3": true, - "stmt4": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true + "stmt2": true } } diff --git a/parser/testdata/02004_intersect_except_distinct_operators/metadata.json b/parser/testdata/02004_intersect_except_distinct_operators/metadata.json index 73eade0b80..e7ce14b155 100644 --- a/parser/testdata/02004_intersect_except_distinct_operators/metadata.json +++ b/parser/testdata/02004_intersect_except_distinct_operators/metadata.json @@ -7,34 +7,22 @@ "stmt14": true, "stmt15": true, "stmt16": true, - "stmt17": true, "stmt18": true, - "stmt20": true, "stmt21": true, "stmt22": true, "stmt23": true, - "stmt24": true, - "stmt25": true, "stmt26": true, "stmt27": true, "stmt28": true, - "stmt30": true, "stmt31": true, "stmt32": true, "stmt33": true, "stmt34": true, "stmt35": true, "stmt36": true, - "stmt37": true, "stmt38": true, "stmt39": true, - "stmt41": true, "stmt42": true, - "stmt45": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true + "stmt45": true } } diff --git a/parser/testdata/02004_intersect_except_operators/metadata.json b/parser/testdata/02004_intersect_except_operators/metadata.json index b781804b02..c931f5643d 100644 --- a/parser/testdata/02004_intersect_except_operators/metadata.json +++ b/parser/testdata/02004_intersect_except_operators/metadata.json @@ -5,35 +5,23 @@ "stmt12": true, "stmt13": true, "stmt14": true, - "stmt15": true, "stmt16": true, - "stmt18": true, "stmt19": true, "stmt20": true, "stmt21": true, - "stmt22": true, - "stmt23": true, "stmt24": true, "stmt25": true, "stmt26": true, - "stmt28": true, "stmt29": true, - "stmt3": true, "stmt30": true, "stmt31": true, "stmt32": true, "stmt33": true, "stmt34": true, - "stmt35": true, "stmt36": true, "stmt37": true, - "stmt39": true, - "stmt4": true, "stmt40": true, "stmt43": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, "stmt8": true, "stmt9": true } diff --git a/parser/testdata/02044_exists_operator/metadata.json b/parser/testdata/02044_exists_operator/metadata.json index b9f2bf602f..0967ef424b 100644 --- a/parser/testdata/02044_exists_operator/metadata.json +++ b/parser/testdata/02044_exists_operator/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt2":true,"stmt5":true}} +{} diff --git a/parser/testdata/02317_distinct_in_order_optimization/metadata.json b/parser/testdata/02317_distinct_in_order_optimization/metadata.json index 0a855de135..0967ef424b 100644 --- a/parser/testdata/02317_distinct_in_order_optimization/metadata.json +++ b/parser/testdata/02317_distinct_in_order_optimization/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt60": true, - "stmt68": true, - "stmt76": true - } -} +{} diff --git a/parser/testdata/02552_sparse_columns_intersect/metadata.json b/parser/testdata/02552_sparse_columns_intersect/metadata.json index e0f1f11696..1295a45747 100644 --- a/parser/testdata/02552_sparse_columns_intersect/metadata.json +++ b/parser/testdata/02552_sparse_columns_intersect/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt3": true, - "stmt6": true, - "stmt7": true + "stmt3": true } } diff --git a/parser/testdata/03008_uniq_exact_equal_ranges/metadata.json b/parser/testdata/03008_uniq_exact_equal_ranges/metadata.json index b1290bd61c..0967ef424b 100644 --- a/parser/testdata/03008_uniq_exact_equal_ranges/metadata.json +++ b/parser/testdata/03008_uniq_exact_equal_ranges/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt20": true, - "stmt21": true - } -} +{} diff --git a/parser/testdata/03312_analyzer_unused_projection_fix/metadata.json b/parser/testdata/03312_analyzer_unused_projection_fix/metadata.json index 6ed702cc94..682bda1cbc 100644 --- a/parser/testdata/03312_analyzer_unused_projection_fix/metadata.json +++ b/parser/testdata/03312_analyzer_unused_projection_fix/metadata.json @@ -1,8 +1,6 @@ { "explain_todo": { "stmt1": true, - "stmt2": true, - "stmt3": true, - "stmt4": true + "stmt2": true } } diff --git a/parser/testdata/03394_pr_insert_select/metadata.json b/parser/testdata/03394_pr_insert_select/metadata.json index 0438c9b85f..0967ef424b 100644 --- a/parser/testdata/03394_pr_insert_select/metadata.json +++ b/parser/testdata/03394_pr_insert_select/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt15": true - } -} +{} diff --git a/parser/testdata/03394_pr_insert_select_local_pipeline/metadata.json b/parser/testdata/03394_pr_insert_select_local_pipeline/metadata.json index 7b4455cd5f..0967ef424b 100644 --- a/parser/testdata/03394_pr_insert_select_local_pipeline/metadata.json +++ b/parser/testdata/03394_pr_insert_select_local_pipeline/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt16": true - } -} +{} diff --git a/parser/testdata/03457_inconsistent_formatting_except/metadata.json b/parser/testdata/03457_inconsistent_formatting_except/metadata.json index 267241aa0e..0d377b2ac2 100644 --- a/parser/testdata/03457_inconsistent_formatting_except/metadata.json +++ b/parser/testdata/03457_inconsistent_formatting_except/metadata.json @@ -2,7 +2,6 @@ "explain_todo": { "stmt2": true, "stmt3": true, - "stmt4": true, "stmt5": true, "stmt6": true } diff --git a/token/token.go b/token/token.go index 41b94d931f..8704587dc8 100644 --- a/token/token.go +++ b/token/token.go @@ -122,6 +122,7 @@ const ( INF INNER INSERT + INTERSECT INTERVAL INTO IS @@ -317,6 +318,7 @@ var tokens = [...]string{ INF: "INF", INNER: "INNER", INSERT: "INSERT", + INTERSECT: "INTERSECT", INTERVAL: "INTERVAL", INTO: "INTO", IS: "IS", From d0cdb97326e5cbed274478f3f6e7406bb48443e2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 02:06:53 +0000 Subject: [PATCH 10/21] Skip empty statements in parser and test infrastructure - Parser: Skip leading semicolons in ParseStatements to handle empty statements (just ';') gracefully - Test: Skip empty semicolon statements in splitStatements to match ClickHouse behavior which doesn't count empty statements This fixes the statement numbering mismatch that caused 03036_join_filter_push_down_equivalent_sets to fail, and also fixes 02155_multiple_inserts_for_formats_with_suffix. --- parser/parser.go | 8 ++++ parser/parser_test.go | 3 +- .../metadata.json | 14 +------ .../metadata.json | 40 +------------------ 4 files changed, 12 insertions(+), 53 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index ac72d96720..9f9387b341 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -89,6 +89,14 @@ func (p *Parser) ParseStatements(ctx context.Context) ([]ast.Statement, error) { default: } + // Skip leading semicolons (empty statements) + for p.currentIs(token.SEMICOLON) { + p.nextToken() + } + if p.currentIs(token.EOF) { + break + } + stmt := p.parseStatement() if stmt != nil { statements = append(statements, stmt) diff --git a/parser/parser_test.go b/parser/parser_test.go index ebf88ed7fc..4f854d5d88 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -58,7 +58,8 @@ func splitStatements(content string) []string { // Check if statement is complete (ends with ;) if strings.HasSuffix(trimmed, ";") { stmt := strings.TrimSpace(current.String()) - if stmt != "" { + // Skip empty statements (just semicolons or empty) + if stmt != "" && stmt != ";" { statements = append(statements, stmt) } current.Reset() diff --git a/parser/testdata/02155_multiple_inserts_for_formats_with_suffix/metadata.json b/parser/testdata/02155_multiple_inserts_for_formats_with_suffix/metadata.json index a2bd16aeb2..0967ef424b 100644 --- a/parser/testdata/02155_multiple_inserts_for_formats_with_suffix/metadata.json +++ b/parser/testdata/02155_multiple_inserts_for_formats_with_suffix/metadata.json @@ -1,13 +1 @@ -{ - "explain_todo": { - "stmt22": true, - "stmt23": true, - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true - } -} +{} diff --git a/parser/testdata/03036_join_filter_push_down_equivalent_sets/metadata.json b/parser/testdata/03036_join_filter_push_down_equivalent_sets/metadata.json index fb7e17499b..0967ef424b 100644 --- a/parser/testdata/03036_join_filter_push_down_equivalent_sets/metadata.json +++ b/parser/testdata/03036_join_filter_push_down_equivalent_sets/metadata.json @@ -1,39 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt20": true, - "stmt21": true, - "stmt22": true, - "stmt23": true, - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true, - "stmt31": true, - "stmt32": true, - "stmt33": true, - "stmt34": true, - "stmt35": true, - "stmt36": true, - "stmt37": true, - "stmt38": true, - "stmt39": true, - "stmt40": true, - "stmt41": true, - "stmt42": true, - "stmt43": true, - "stmt44": true, - "stmt45": true, - "stmt46": true, - "stmt47": true, - "stmt48": true, - "stmt49": true - } -} +{} From e0490f2dedbc02c3de0848cfce3fff421ea839c6 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 02:15:39 +0000 Subject: [PATCH 11/21] Add EXPLAIN options capture and viewExplain wrapper transformation - Add OptionsString field to ExplainQuery to capture EXPLAIN options - Update parser to capture options like "actions = 1" as strings - Update explainViewExplain to output proper SELECT * FROM viewExplain() structure - This matches ClickHouse's internal transformation of EXPLAIN as table source Updates metadata for many passing explain tests. --- ast/ast.go | 11 +++--- internal/explain/tables.go | 34 +++++++++++------- parser/parser.go | 12 ++++++- .../metadata.json | 7 +--- .../testdata/00944_minmax_nan/metadata.json | 9 +---- .../metadata.json | 7 +--- .../metadata.json | 8 ----- .../metadata.json | 7 +--- .../metadata.json | 6 +--- .../metadata.json | 19 +--------- .../metadata.json | 7 +--- .../metadata.json | 9 +---- .../metadata.json | 29 +-------------- .../metadata.json | 7 +--- .../metadata.json | 1 - .../metadata.json | 7 +--- .../metadata.json | 7 +--- .../metadata.json | 12 +------ .../metadata.json | 12 +------ .../metadata.json | 6 +--- .../metadata.json | 8 +---- .../metadata.json | 7 +--- .../metadata.json | 9 +---- .../metadata.json | 17 +-------- .../metadata.json | 7 +--- .../metadata.json | 6 +++- .../metadata.json | 7 +--- .../metadata.json | 9 +---- .../02809_prewhere_and_in/metadata.json | 13 +------ .../metadata.json | 7 +--- .../metadata.json | 13 +------ .../metadata.json | 10 +----- .../metadata.json | 8 +---- .../02864_statistics_usage/metadata.json | 10 +----- .../metadata.json | 35 +------------------ .../metadata.json | 17 +-------- .../metadata.json | 3 +- .../03032_redundant_equals/metadata.json | 11 +----- .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../03231_pr_reverse_in_order/metadata.json | 3 +- .../03257_reverse_sorting_key/metadata.json | 4 --- .../03262_filter_push_down_view/metadata.json | 3 +- .../metadata.json | 6 +--- .../metadata.json | 17 +-------- .../03317_index_hint_prewhere/metadata.json | 7 +--- .../metadata.json | 13 +------ .../03357_join_pk_sharding/metadata.json | 12 +------ .../metadata.json | 7 +--- .../metadata.json | 7 +--- .../metadata.json | 7 +--- .../metadata.json | 7 +--- .../metadata.json | 9 +---- .../metadata.json | 2 +- .../03444_lm_block_mismatch/metadata.json | 2 +- .../metadata.json | 32 +---------------- .../metadata.json | 14 +------- .../metadata.json | 9 +---- .../metadata.json | 8 +---- .../metadata.json | 7 +--- .../metadata.json | 6 +--- .../metadata.json | 8 +---- .../03580_improve_prewhere/metadata.json | 8 +---- .../metadata.json | 6 +--- .../03583_rewrite_in_to_join/metadata.json | 3 +- .../metadata.json | 15 +------- .../metadata.json | 6 +--- .../metadata.json | 12 +------ .../03640_skip_indexes_with_or/metadata.json | 15 +------- .../metadata.json | 11 +----- .../03711_top_k_by_skip_index/metadata.json | 8 +---- .../metadata.json | 7 +--- 73 files changed, 109 insertions(+), 604 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index 86559cae51..a761cad098 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -700,11 +700,12 @@ const ( // ExplainQuery represents an EXPLAIN statement. type ExplainQuery struct { - Position token.Position `json:"-"` - ExplainType ExplainType `json:"explain_type"` - Statement Statement `json:"statement"` - HasSettings bool `json:"has_settings,omitempty"` - ExplicitType bool `json:"explicit_type,omitempty"` // true if type was explicitly specified + Position token.Position `json:"-"` + ExplainType ExplainType `json:"explain_type"` + Statement Statement `json:"statement"` + HasSettings bool `json:"has_settings,omitempty"` + ExplicitType bool `json:"explicit_type,omitempty"` // true if type was explicitly specified + OptionsString string `json:"options_string,omitempty"` // Formatted options like "actions = 1" } func (e *ExplainQuery) Pos() token.Position { return e.Position } diff --git a/internal/explain/tables.go b/internal/explain/tables.go index 47f3282c90..e960be8afd 100644 --- a/internal/explain/tables.go +++ b/internal/explain/tables.go @@ -133,22 +133,30 @@ func abs(x float64) float64 { } // explainViewExplain handles EXPLAIN queries used as table sources, converting to viewExplain function +// ClickHouse internally transforms EXPLAIN to SELECT * FROM viewExplain(...) func explainViewExplain(sb *strings.Builder, n *ast.ExplainQuery, alias string, indent string, depth int) { - // When EXPLAIN is used as a table source, it becomes viewExplain function - // Arguments: 'EXPLAIN', 'options', subquery - fmt.Fprintf(sb, "%sFunction viewExplain (children %d)\n", indent, 1) - fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, 3) + // When EXPLAIN is used as a table source, it becomes wrapped in SELECT * FROM viewExplain(...) + // Structure: Subquery -> SelectWithUnionQuery -> ExpressionList -> SelectQuery -> Asterisk, TablesInSelectQuery -> viewExplain + fmt.Fprintf(sb, "%sSubquery (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s SelectWithUnionQuery (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s SelectQuery (children %d)\n", indent, 2) + fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s Asterisk\n", indent) + fmt.Fprintf(sb, "%s TablesInSelectQuery (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s TablesInSelectQueryElement (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s TableExpression (children %d)\n", indent, 1) + // Now output the viewExplain function + fmt.Fprintf(sb, "%s Function viewExplain (children %d)\n", indent, 1) + fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, 3) // First argument: 'EXPLAIN' literal - fmt.Fprintf(sb, "%s Literal \\'EXPLAIN\\'\n", indent) - // Second argument: options string (empty for now since we don't track detailed options) - options := string(n.ExplainType) - if options == "PLAN" { - options = "" - } - fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, options) + fmt.Fprintf(sb, "%s Literal \\'EXPLAIN\\'\n", indent) + // Second argument: options string (e.g., "actions = 1") + options := n.OptionsString + fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, options) // Third argument: the subquery being explained - fmt.Fprintf(sb, "%s Subquery (children %d)\n", indent, 1) - Node(sb, n.Statement, depth+3) + fmt.Fprintf(sb, "%s Subquery (children %d)\n", indent, 1) + Node(sb, n.Statement, depth+10) } func explainTableIdentifierWithAlias(sb *strings.Builder, n *ast.TableIdentifier, alias string, indent string) { diff --git a/parser/parser.go b/parser/parser.go index 9f9387b341..fa0fa57f6b 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -4312,17 +4312,27 @@ func (p *Parser) parseExplain() *ast.ExplainQuery { // Parse EXPLAIN options (e.g., header = 1, optimize = 0) // These come before the actual statement // Options can be identifiers or keywords like OPTIMIZE followed by = + var optionParts []string for p.peekIs(token.EQ) && !p.currentIs(token.SELECT) && !p.currentIs(token.WITH) { // This is an option (name = value) explain.HasSettings = true + optionName := p.current.Value p.nextToken() // skip option name p.nextToken() // skip = - p.parseExpression(LOWEST) // skip value + // Get the value + optionValue := p.current.Value + if p.currentIs(token.NUMBER) || p.currentIs(token.STRING) || p.currentIs(token.IDENT) { + optionParts = append(optionParts, optionName+" = "+optionValue) + } + p.parseExpression(LOWEST) // skip value expression (may consume more tokens) // Skip comma if present if p.currentIs(token.COMMA) { p.nextToken() } } + if len(optionParts) > 0 { + explain.OptionsString = strings.Join(optionParts, ", ") + } // Parse the statement being explained explain.Statement = p.parseStatement() diff --git a/parser/testdata/00183_prewhere_conditions_order/metadata.json b/parser/testdata/00183_prewhere_conditions_order/metadata.json index 0f293987f1..0967ef424b 100644 --- a/parser/testdata/00183_prewhere_conditions_order/metadata.json +++ b/parser/testdata/00183_prewhere_conditions_order/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/00944_minmax_nan/metadata.json b/parser/testdata/00944_minmax_nan/metadata.json index be8bbb2f2d..0967ef424b 100644 --- a/parser/testdata/00944_minmax_nan/metadata.json +++ b/parser/testdata/00944_minmax_nan/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt14": true, - "stmt16": true, - "stmt17": true - } -} +{} diff --git a/parser/testdata/01582_move_to_prewhere_compact_parts/metadata.json b/parser/testdata/01582_move_to_prewhere_compact_parts/metadata.json index e47c967938..0967ef424b 100644 --- a/parser/testdata/01582_move_to_prewhere_compact_parts/metadata.json +++ b/parser/testdata/01582_move_to_prewhere_compact_parts/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/01625_constraints_index_append/metadata.json b/parser/testdata/01625_constraints_index_append/metadata.json index e924a80b75..3a06a4a1ac 100644 --- a/parser/testdata/01625_constraints_index_append/metadata.json +++ b/parser/testdata/01625_constraints_index_append/metadata.json @@ -1,13 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, "stmt5": true } } diff --git a/parser/testdata/01655_plan_optimizations_merge_filters/metadata.json b/parser/testdata/01655_plan_optimizations_merge_filters/metadata.json index bc5c6edb66..0967ef424b 100644 --- a/parser/testdata/01655_plan_optimizations_merge_filters/metadata.json +++ b/parser/testdata/01655_plan_optimizations_merge_filters/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/01710_projection_pk_trivial_count/metadata.json b/parser/testdata/01710_projection_pk_trivial_count/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/01710_projection_pk_trivial_count/metadata.json +++ b/parser/testdata/01710_projection_pk_trivial_count/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/01737_move_order_key_to_prewhere_select_final/metadata.json b/parser/testdata/01737_move_order_key_to_prewhere_select_final/metadata.json index 5f5aa19cf9..0967ef424b 100644 --- a/parser/testdata/01737_move_order_key_to_prewhere_select_final/metadata.json +++ b/parser/testdata/01737_move_order_key_to_prewhere_select_final/metadata.json @@ -1,18 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt20": true, - "stmt21": true, - "stmt22": true, - "stmt23": true, - "stmt8": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/01824_move_to_prewhere_many_columns/metadata.json b/parser/testdata/01824_move_to_prewhere_many_columns/metadata.json index 9438414527..0967ef424b 100644 --- a/parser/testdata/01824_move_to_prewhere_many_columns/metadata.json +++ b/parser/testdata/01824_move_to_prewhere_many_columns/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt18": true - } -} +{} diff --git a/parser/testdata/02156_storage_merge_prewhere/metadata.json b/parser/testdata/02156_storage_merge_prewhere/metadata.json index 5563fee8b9..0967ef424b 100644 --- a/parser/testdata/02156_storage_merge_prewhere/metadata.json +++ b/parser/testdata/02156_storage_merge_prewhere/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt22": true, - "stmt23": true, - "stmt25": true, - "stmt27": true - } -} +{} diff --git a/parser/testdata/02346_text_index_function_hasAnyAllTokens/metadata.json b/parser/testdata/02346_text_index_function_hasAnyAllTokens/metadata.json index bee9ae3e25..d352e743d3 100644 --- a/parser/testdata/02346_text_index_function_hasAnyAllTokens/metadata.json +++ b/parser/testdata/02346_text_index_function_hasAnyAllTokens/metadata.json @@ -1,32 +1,5 @@ { "explain_todo": { - "stmt267": true, - "stmt269": true, - "stmt271": true, - "stmt273": true, - "stmt275": true, - "stmt277": true, - "stmt279": true, - "stmt281": true, - "stmt283": true, - "stmt285": true, - "stmt287": true, - "stmt290": true, - "stmt292": true, - "stmt294": true, - "stmt296": true, - "stmt298": true, - "stmt300": true, - "stmt302": true, - "stmt304": true, - "stmt306": true, - "stmt308": true, - "stmt310": true, - "stmt312": true, - "stmt314": true, - "stmt319": true, - "stmt321": true, - "stmt323": true, - "stmt325": true + "stmt319": true } } diff --git a/parser/testdata/02346_text_index_part_format/metadata.json b/parser/testdata/02346_text_index_part_format/metadata.json index 36bf5bbc94..0967ef424b 100644 --- a/parser/testdata/02346_text_index_part_format/metadata.json +++ b/parser/testdata/02346_text_index_part_format/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt16": true - } -} +{} diff --git a/parser/testdata/02354_vector_search_binary_quantization/metadata.json b/parser/testdata/02354_vector_search_binary_quantization/metadata.json index 9aa0f7414d..9be7220609 100644 --- a/parser/testdata/02354_vector_search_binary_quantization/metadata.json +++ b/parser/testdata/02354_vector_search_binary_quantization/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt11": true, "stmt22": true } } diff --git a/parser/testdata/02354_vector_search_choose_correct_index/metadata.json b/parser/testdata/02354_vector_search_choose_correct_index/metadata.json index 92efb02376..0967ef424b 100644 --- a/parser/testdata/02354_vector_search_choose_correct_index/metadata.json +++ b/parser/testdata/02354_vector_search_choose_correct_index/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02354_vector_search_part_format/metadata.json b/parser/testdata/02354_vector_search_part_format/metadata.json index af0e8850a5..0967ef424b 100644 --- a/parser/testdata/02354_vector_search_part_format/metadata.json +++ b/parser/testdata/02354_vector_search_part_format/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt15": true - } -} +{} diff --git a/parser/testdata/02354_vector_search_pre_and_post_filtering/metadata.json b/parser/testdata/02354_vector_search_pre_and_post_filtering/metadata.json index 5900f0acb9..0967ef424b 100644 --- a/parser/testdata/02354_vector_search_pre_and_post_filtering/metadata.json +++ b/parser/testdata/02354_vector_search_pre_and_post_filtering/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt12": true, - "stmt14": true, - "stmt17": true, - "stmt19": true, - "stmt21": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02354_vector_search_reference_vector_types/metadata.json b/parser/testdata/02354_vector_search_reference_vector_types/metadata.json index 2f40ad58f8..74e8ec22a2 100644 --- a/parser/testdata/02354_vector_search_reference_vector_types/metadata.json +++ b/parser/testdata/02354_vector_search_reference_vector_types/metadata.json @@ -3,16 +3,6 @@ "stmt11": true, "stmt14": true, "stmt16": true, - "stmt18": true, - "stmt30": true, - "stmt31": true, - "stmt32": true, - "stmt33": true, - "stmt34": true, - "stmt35": true, - "stmt36": true, - "stmt37": true, - "stmt38": true, - "stmt45": true + "stmt18": true } } diff --git a/parser/testdata/02354_vector_search_with_huge_dimension/metadata.json b/parser/testdata/02354_vector_search_with_huge_dimension/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/02354_vector_search_with_huge_dimension/metadata.json +++ b/parser/testdata/02354_vector_search_with_huge_dimension/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/02377_optimize_sorting_by_input_stream_properties_2/metadata.json b/parser/testdata/02377_optimize_sorting_by_input_stream_properties_2/metadata.json index 4c04121977..0967ef424b 100644 --- a/parser/testdata/02377_optimize_sorting_by_input_stream_properties_2/metadata.json +++ b/parser/testdata/02377_optimize_sorting_by_input_stream_properties_2/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt12": true, - "stmt14": true - } -} +{} diff --git a/parser/testdata/02481_aggregation_in_order_plan/metadata.json b/parser/testdata/02481_aggregation_in_order_plan/metadata.json index ff0eba6904..0967ef424b 100644 --- a/parser/testdata/02481_aggregation_in_order_plan/metadata.json +++ b/parser/testdata/02481_aggregation_in_order_plan/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/02481_inject_random_order_for_select_without_order_by/metadata.json b/parser/testdata/02481_inject_random_order_for_select_without_order_by/metadata.json index e1ce11c63f..0967ef424b 100644 --- a/parser/testdata/02481_inject_random_order_for_select_without_order_by/metadata.json +++ b/parser/testdata/02481_inject_random_order_for_select_without_order_by/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt4": true, - "stmt6": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02521_aggregation_by_partitions/metadata.json b/parser/testdata/02521_aggregation_by_partitions/metadata.json index 2fe0ed7cb8..2522c47663 100644 --- a/parser/testdata/02521_aggregation_by_partitions/metadata.json +++ b/parser/testdata/02521_aggregation_by_partitions/metadata.json @@ -1,25 +1,10 @@ { "explain_todo": { "stmt10": true, - "stmt101": true, - "stmt105": true, - "stmt109": true, - "stmt117": true, "stmt17": true, "stmt24": true, "stmt34": true, "stmt41": true, - "stmt48": true, - "stmt57": true, - "stmt61": true, - "stmt65": true, - "stmt69": true, - "stmt73": true, - "stmt77": true, - "stmt81": true, - "stmt85": true, - "stmt89": true, - "stmt93": true, - "stmt97": true + "stmt48": true } } diff --git a/parser/testdata/02564_read_in_order_final_desc/metadata.json b/parser/testdata/02564_read_in_order_final_desc/metadata.json index ff0eba6904..0967ef424b 100644 --- a/parser/testdata/02564_read_in_order_final_desc/metadata.json +++ b/parser/testdata/02564_read_in_order_final_desc/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/02674_trivial_count_analyzer/metadata.json b/parser/testdata/02674_trivial_count_analyzer/metadata.json index 2461646135..ca584b3e28 100644 --- a/parser/testdata/02674_trivial_count_analyzer/metadata.json +++ b/parser/testdata/02674_trivial_count_analyzer/metadata.json @@ -1 +1,5 @@ -{"explain_todo":{"stmt17":true,"stmt23":true,"stmt9":true}} +{ + "explain_todo": { + "stmt17": true + } +} diff --git a/parser/testdata/02725_agg_projection_respect_PK/metadata.json b/parser/testdata/02725_agg_projection_respect_PK/metadata.json index ff0eba6904..0967ef424b 100644 --- a/parser/testdata/02725_agg_projection_respect_PK/metadata.json +++ b/parser/testdata/02725_agg_projection_respect_PK/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/02771_ignore_data_skipping_indices/metadata.json b/parser/testdata/02771_ignore_data_skipping_indices/metadata.json index 50a44c7319..0967ef424b 100644 --- a/parser/testdata/02771_ignore_data_skipping_indices/metadata.json +++ b/parser/testdata/02771_ignore_data_skipping_indices/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt14": true, - "stmt15": true - } -} +{} diff --git a/parser/testdata/02809_prewhere_and_in/metadata.json b/parser/testdata/02809_prewhere_and_in/metadata.json index 6a5150f609..0967ef424b 100644 --- a/parser/testdata/02809_prewhere_and_in/metadata.json +++ b/parser/testdata/02809_prewhere_and_in/metadata.json @@ -1,12 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02810_fix_remove_dedundant_distinct_view/metadata.json b/parser/testdata/02810_fix_remove_dedundant_distinct_view/metadata.json index 15223e732d..0967ef424b 100644 --- a/parser/testdata/02810_fix_remove_dedundant_distinct_view/metadata.json +++ b/parser/testdata/02810_fix_remove_dedundant_distinct_view/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02815_join_algorithm_setting/metadata.json b/parser/testdata/02815_join_algorithm_setting/metadata.json index 9853a9faa8..0967ef424b 100644 --- a/parser/testdata/02815_join_algorithm_setting/metadata.json +++ b/parser/testdata/02815_join_algorithm_setting/metadata.json @@ -1,12 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt14": true, - "stmt17": true, - "stmt18": true, - "stmt26": true, - "stmt28": true, - "stmt30": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02842_move_pk_to_end_of_prewhere/metadata.json b/parser/testdata/02842_move_pk_to_end_of_prewhere/metadata.json index a1f4b2619b..0967ef424b 100644 --- a/parser/testdata/02842_move_pk_to_end_of_prewhere/metadata.json +++ b/parser/testdata/02842_move_pk_to_end_of_prewhere/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02864_statistics_delayed_materialization_in_merge/metadata.json b/parser/testdata/02864_statistics_delayed_materialization_in_merge/metadata.json index 734bbd9a95..0967ef424b 100644 --- a/parser/testdata/02864_statistics_delayed_materialization_in_merge/metadata.json +++ b/parser/testdata/02864_statistics_delayed_materialization_in_merge/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt18": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02864_statistics_usage/metadata.json b/parser/testdata/02864_statistics_usage/metadata.json index a39db17e43..0967ef424b 100644 --- a/parser/testdata/02864_statistics_usage/metadata.json +++ b/parser/testdata/02864_statistics_usage/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt19": true, - "stmt22": true, - "stmt25": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02911_analyzer_order_by_read_in_order_query_plan/metadata.json b/parser/testdata/02911_analyzer_order_by_read_in_order_query_plan/metadata.json index 47a8bb5d83..8005a380a7 100644 --- a/parser/testdata/02911_analyzer_order_by_read_in_order_query_plan/metadata.json +++ b/parser/testdata/02911_analyzer_order_by_read_in_order_query_plan/metadata.json @@ -1,38 +1,5 @@ { "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt21": true, - "stmt23": true, - "stmt25": true, - "stmt27": true, - "stmt29": true, - "stmt31": true, - "stmt33": true, - "stmt35": true, - "stmt36": true, - "stmt37": true, - "stmt38": true, - "stmt39": true, - "stmt40": true, - "stmt41": true, - "stmt42": true, - "stmt44": true, - "stmt46": true, - "stmt48": true, - "stmt53": true, - "stmt55": true, - "stmt56": true, - "stmt63": true, - "stmt67": true, - "stmt69": true, - "stmt71": true, - "stmt73": true, - "stmt75": true, - "stmt77": true, - "stmt79": true + "stmt63": true } } diff --git a/parser/testdata/02943_tokenbf_and_ngrambf_indexes_support_match_function/metadata.json b/parser/testdata/02943_tokenbf_and_ngrambf_indexes_support_match_function/metadata.json index a2d96bb731..0967ef424b 100644 --- a/parser/testdata/02943_tokenbf_and_ngrambf_indexes_support_match_function/metadata.json +++ b/parser/testdata/02943_tokenbf_and_ngrambf_indexes_support_match_function/metadata.json @@ -1,16 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt23": true, - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02998_projection_after_attach_partition/metadata.json b/parser/testdata/02998_projection_after_attach_partition/metadata.json index 99353c8390..ab9202e88e 100644 --- a/parser/testdata/02998_projection_after_attach_partition/metadata.json +++ b/parser/testdata/02998_projection_after_attach_partition/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt11": true, - "stmt17": true + "stmt11": true } } diff --git a/parser/testdata/03032_redundant_equals/metadata.json b/parser/testdata/03032_redundant_equals/metadata.json index 64127c7a21..0967ef424b 100644 --- a/parser/testdata/03032_redundant_equals/metadata.json +++ b/parser/testdata/03032_redundant_equals/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true - } -} +{} diff --git a/parser/testdata/03164_early_constant_folding_analyzer/metadata.json b/parser/testdata/03164_early_constant_folding_analyzer/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/03164_early_constant_folding_analyzer/metadata.json +++ b/parser/testdata/03164_early_constant_folding_analyzer/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/03164_materialize_skip_index_on_merge/metadata.json b/parser/testdata/03164_materialize_skip_index_on_merge/metadata.json index 5b669ca147..dc0702ac62 100644 --- a/parser/testdata/03164_materialize_skip_index_on_merge/metadata.json +++ b/parser/testdata/03164_materialize_skip_index_on_merge/metadata.json @@ -1,9 +1,5 @@ { "explain_todo": { - "stmt18": true, - "stmt27": true, - "stmt30": true, - "stmt35": true, - "stmt9": true + "stmt30": true } } diff --git a/parser/testdata/03208_multiple_joins_with_storage_join/metadata.json b/parser/testdata/03208_multiple_joins_with_storage_join/metadata.json index 13dfdf58b8..0967ef424b 100644 --- a/parser/testdata/03208_multiple_joins_with_storage_join/metadata.json +++ b/parser/testdata/03208_multiple_joins_with_storage_join/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt28": true - } -} +{} diff --git a/parser/testdata/03231_pr_reverse_in_order/metadata.json b/parser/testdata/03231_pr_reverse_in_order/metadata.json index c84e30800d..1295a45747 100644 --- a/parser/testdata/03231_pr_reverse_in_order/metadata.json +++ b/parser/testdata/03231_pr_reverse_in_order/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, - "stmt7": true + "stmt3": true } } diff --git a/parser/testdata/03257_reverse_sorting_key/metadata.json b/parser/testdata/03257_reverse_sorting_key/metadata.json index 52460d571a..ab70e34390 100644 --- a/parser/testdata/03257_reverse_sorting_key/metadata.json +++ b/parser/testdata/03257_reverse_sorting_key/metadata.json @@ -1,10 +1,6 @@ { "explain_todo": { - "stmt10": true, - "stmt13": true, "stmt16": true, - "stmt21": true, - "stmt24": true, "stmt5": true } } diff --git a/parser/testdata/03262_filter_push_down_view/metadata.json b/parser/testdata/03262_filter_push_down_view/metadata.json index 25122ac4f4..3a06a4a1ac 100644 --- a/parser/testdata/03262_filter_push_down_view/metadata.json +++ b/parser/testdata/03262_filter_push_down_view/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, - "stmt9": true + "stmt5": true } } diff --git a/parser/testdata/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key/metadata.json b/parser/testdata/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key/metadata.json +++ b/parser/testdata/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03302_analyzer_distributed_filter_push_down/metadata.json b/parser/testdata/03302_analyzer_distributed_filter_push_down/metadata.json index c219f934e9..0967ef424b 100644 --- a/parser/testdata/03302_analyzer_distributed_filter_push_down/metadata.json +++ b/parser/testdata/03302_analyzer_distributed_filter_push_down/metadata.json @@ -1,16 +1 @@ -{ - "explain_todo": { - "stmt14": true, - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt21": true, - "stmt23": true, - "stmt25": true, - "stmt27": true, - "stmt29": true, - "stmt33": true, - "stmt37": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03317_index_hint_prewhere/metadata.json b/parser/testdata/03317_index_hint_prewhere/metadata.json index ef382ce51e..0967ef424b 100644 --- a/parser/testdata/03317_index_hint_prewhere/metadata.json +++ b/parser/testdata/03317_index_hint_prewhere/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03356_threshold_for_parallel_hash/metadata.json b/parser/testdata/03356_threshold_for_parallel_hash/metadata.json index 403f17bdf0..0967ef424b 100644 --- a/parser/testdata/03356_threshold_for_parallel_hash/metadata.json +++ b/parser/testdata/03356_threshold_for_parallel_hash/metadata.json @@ -1,12 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt18": true, - "stmt20": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03357_join_pk_sharding/metadata.json b/parser/testdata/03357_join_pk_sharding/metadata.json index b9057ab128..0967ef424b 100644 --- a/parser/testdata/03357_join_pk_sharding/metadata.json +++ b/parser/testdata/03357_join_pk_sharding/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt16": true, - "stmt18": true, - "stmt20": true, - "stmt22": true, - "stmt24": true, - "stmt27": true, - "stmt29": true - } -} +{} diff --git a/parser/testdata/03375_bloom_filter_has_hasAny_const_array/metadata.json b/parser/testdata/03375_bloom_filter_has_hasAny_const_array/metadata.json index 0f293987f1..0967ef424b 100644 --- a/parser/testdata/03375_bloom_filter_has_hasAny_const_array/metadata.json +++ b/parser/testdata/03375_bloom_filter_has_hasAny_const_array/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03375_bloom_filter_ngram_has_hasAny_const_array/metadata.json b/parser/testdata/03375_bloom_filter_ngram_has_hasAny_const_array/metadata.json index 0f293987f1..0967ef424b 100644 --- a/parser/testdata/03375_bloom_filter_ngram_has_hasAny_const_array/metadata.json +++ b/parser/testdata/03375_bloom_filter_ngram_has_hasAny_const_array/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03375_bloom_filter_token_has_hasAny_const_array/metadata.json b/parser/testdata/03375_bloom_filter_token_has_hasAny_const_array/metadata.json index 0f293987f1..0967ef424b 100644 --- a/parser/testdata/03375_bloom_filter_token_has_hasAny_const_array/metadata.json +++ b/parser/testdata/03375_bloom_filter_token_has_hasAny_const_array/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03403_parallel_blocks_marshalling_for_distributed/metadata.json b/parser/testdata/03403_parallel_blocks_marshalling_for_distributed/metadata.json index ff0eba6904..0967ef424b 100644 --- a/parser/testdata/03403_parallel_blocks_marshalling_for_distributed/metadata.json +++ b/parser/testdata/03403_parallel_blocks_marshalling_for_distributed/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/03443_index_match_alternatives/metadata.json b/parser/testdata/03443_index_match_alternatives/metadata.json index b7560eef8a..0967ef424b 100644 --- a/parser/testdata/03443_index_match_alternatives/metadata.json +++ b/parser/testdata/03443_index_match_alternatives/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt21": true - } -} +{} diff --git a/parser/testdata/03443_pr_lazy_materialization/metadata.json b/parser/testdata/03443_pr_lazy_materialization/metadata.json index 3a2014fe8c..0967ef424b 100644 --- a/parser/testdata/03443_pr_lazy_materialization/metadata.json +++ b/parser/testdata/03443_pr_lazy_materialization/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt6":true}} +{} diff --git a/parser/testdata/03444_lm_block_mismatch/metadata.json b/parser/testdata/03444_lm_block_mismatch/metadata.json index 3a2014fe8c..0967ef424b 100644 --- a/parser/testdata/03444_lm_block_mismatch/metadata.json +++ b/parser/testdata/03444_lm_block_mismatch/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt6":true}} +{} diff --git a/parser/testdata/03456_match_index_prefix_extraction/metadata.json b/parser/testdata/03456_match_index_prefix_extraction/metadata.json index 132fade225..0967ef424b 100644 --- a/parser/testdata/03456_match_index_prefix_extraction/metadata.json +++ b/parser/testdata/03456_match_index_prefix_extraction/metadata.json @@ -1,31 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt21": true, - "stmt23": true, - "stmt25": true, - "stmt27": true, - "stmt29": true, - "stmt31": true, - "stmt33": true, - "stmt35": true, - "stmt37": true, - "stmt39": true, - "stmt41": true, - "stmt43": true, - "stmt45": true, - "stmt47": true, - "stmt49": true, - "stmt5": true, - "stmt51": true, - "stmt53": true, - "stmt55": true, - "stmt57": true, - "stmt7": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03460_normal_projection_index/metadata.json b/parser/testdata/03460_normal_projection_index/metadata.json index 16c95357c2..0967ef424b 100644 --- a/parser/testdata/03460_normal_projection_index/metadata.json +++ b/parser/testdata/03460_normal_projection_index/metadata.json @@ -1,13 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt32": true, - "stmt34": true, - "stmt36": true, - "stmt45": true, - "stmt47": true - } -} +{} diff --git a/parser/testdata/03460_projection_part_filtering_and_introspection/metadata.json b/parser/testdata/03460_projection_part_filtering_and_introspection/metadata.json index a0dba08bb1..0967ef424b 100644 --- a/parser/testdata/03460_projection_part_filtering_and_introspection/metadata.json +++ b/parser/testdata/03460_projection_part_filtering_and_introspection/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true - } -} +{} diff --git a/parser/testdata/03464_projections_with_subcolumns/metadata.json b/parser/testdata/03464_projections_with_subcolumns/metadata.json index ecfa4893c3..86dd984b2e 100644 --- a/parser/testdata/03464_projections_with_subcolumns/metadata.json +++ b/parser/testdata/03464_projections_with_subcolumns/metadata.json @@ -1,11 +1,8 @@ { "explain_todo": { - "stmt11": true, "stmt13": true, "stmt14": true, "stmt15": true, - "stmt19": true, - "stmt22": true, "stmt24": true, "stmt25": true, "stmt26": true, @@ -21,12 +18,9 @@ "stmt43": true, "stmt44": true, "stmt45": true, - "stmt47": true, "stmt5": true, - "stmt50": true, "stmt52": true, "stmt53": true, - "stmt54": true, - "stmt8": true + "stmt54": true } } diff --git a/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json b/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json index d61214279f..aa28559472 100644 --- a/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json +++ b/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json @@ -1,10 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt18": true, - "stmt23": true, - "stmt24": true, - "stmt9": true + "stmt18": true } } diff --git a/parser/testdata/03560_parallel_replicas_memory_bound_merging_projection/metadata.json b/parser/testdata/03560_parallel_replicas_memory_bound_merging_projection/metadata.json index c45b7602ba..0967ef424b 100644 --- a/parser/testdata/03560_parallel_replicas_memory_bound_merging_projection/metadata.json +++ b/parser/testdata/03560_parallel_replicas_memory_bound_merging_projection/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt12": true - } -} +{} diff --git a/parser/testdata/03560_parallel_replicas_projection/metadata.json b/parser/testdata/03560_parallel_replicas_projection/metadata.json index da14dca034..bb7b7d4d9a 100644 --- a/parser/testdata/03560_parallel_replicas_projection/metadata.json +++ b/parser/testdata/03560_parallel_replicas_projection/metadata.json @@ -1,12 +1,6 @@ { "explain_todo": { - "stmt11": true, - "stmt16": true, "stmt21": true, - "stmt26": true, - "stmt3": true, - "stmt31": true, - "stmt38": true, - "stmt41": true + "stmt3": true } } diff --git a/parser/testdata/03580_improve_prewhere/metadata.json b/parser/testdata/03580_improve_prewhere/metadata.json index bf70691c76..0967ef424b 100644 --- a/parser/testdata/03580_improve_prewhere/metadata.json +++ b/parser/testdata/03580_improve_prewhere/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt14": true, - "stmt15": true - } -} +{} diff --git a/parser/testdata/03580_join_runtime_filter_pushdown/metadata.json b/parser/testdata/03580_join_runtime_filter_pushdown/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/03580_join_runtime_filter_pushdown/metadata.json +++ b/parser/testdata/03580_join_runtime_filter_pushdown/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/03583_rewrite_in_to_join/metadata.json b/parser/testdata/03583_rewrite_in_to_join/metadata.json index c15cbad412..b330691357 100644 --- a/parser/testdata/03583_rewrite_in_to_join/metadata.json +++ b/parser/testdata/03583_rewrite_in_to_join/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt26": true, - "stmt5": true + "stmt26": true } } diff --git a/parser/testdata/03610_disjunctions_pushdown_optimization/metadata.json b/parser/testdata/03610_disjunctions_pushdown_optimization/metadata.json index b2a5b70574..0967ef424b 100644 --- a/parser/testdata/03610_disjunctions_pushdown_optimization/metadata.json +++ b/parser/testdata/03610_disjunctions_pushdown_optimization/metadata.json @@ -1,14 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt13": true, - "stmt22": true, - "stmt25": true, - "stmt34": true, - "stmt37": true, - "stmt54": true, - "stmt57": true, - "stmt74": true, - "stmt77": true - } -} +{} diff --git a/parser/testdata/03624_pr_lefl_right_joins_chain/metadata.json b/parser/testdata/03624_pr_lefl_right_joins_chain/metadata.json index 7b4455cd5f..0967ef424b 100644 --- a/parser/testdata/03624_pr_lefl_right_joins_chain/metadata.json +++ b/parser/testdata/03624_pr_lefl_right_joins_chain/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt16": true - } -} +{} diff --git a/parser/testdata/03640_skip_indexes_data_types_with_or/metadata.json b/parser/testdata/03640_skip_indexes_data_types_with_or/metadata.json index 6cbf4722b6..0967ef424b 100644 --- a/parser/testdata/03640_skip_indexes_data_types_with_or/metadata.json +++ b/parser/testdata/03640_skip_indexes_data_types_with_or/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt14": true, - "stmt18": true, - "stmt20": true, - "stmt22": true, - "stmt24": true, - "stmt26": true - } -} +{} diff --git a/parser/testdata/03640_skip_indexes_with_or/metadata.json b/parser/testdata/03640_skip_indexes_with_or/metadata.json index 22c785b809..0967ef424b 100644 --- a/parser/testdata/03640_skip_indexes_with_or/metadata.json +++ b/parser/testdata/03640_skip_indexes_with_or/metadata.json @@ -1,14 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt21": true, - "stmt23": true, - "stmt25": true, - "stmt27": true, - "stmt29": true, - "stmt35": true - } -} +{} diff --git a/parser/testdata/03681_lazy_materialization_with_read_in_order/metadata.json b/parser/testdata/03681_lazy_materialization_with_read_in_order/metadata.json index fb5c8abec0..0967ef424b 100644 --- a/parser/testdata/03681_lazy_materialization_with_read_in_order/metadata.json +++ b/parser/testdata/03681_lazy_materialization_with_read_in_order/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt13": true, - "stmt16": true, - "stmt19": true, - "stmt22": true, - "stmt37": true - } -} +{} diff --git a/parser/testdata/03711_top_k_by_skip_index/metadata.json b/parser/testdata/03711_top_k_by_skip_index/metadata.json index 4f593ff9c6..0967ef424b 100644 --- a/parser/testdata/03711_top_k_by_skip_index/metadata.json +++ b/parser/testdata/03711_top_k_by_skip_index/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt8": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03728_explain_column_structure/metadata.json b/parser/testdata/03728_explain_column_structure/metadata.json index 682bda1cbc..0967ef424b 100644 --- a/parser/testdata/03728_explain_column_structure/metadata.json +++ b/parser/testdata/03728_explain_column_structure/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt1": true, - "stmt2": true - } -} +{} From 0d66343fc04c25842b5ed362b202d3e55452eab2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 02:21:39 +0000 Subject: [PATCH 12/21] Preserve source text for float literals in CAST expressions - Add Source field to ast.Literal to store original source text - Set Source field when parsing decimal float literals - Use Source field in formatExprAsString for CAST operator syntax - This preserves "0.0" instead of outputting "0" for zero floats Fixes iceberg_bucket and other tests with float casting. --- ast/ast.go | 1 + internal/explain/format.go | 4 +++ parser/expression.go | 2 ++ .../metadata.json | 15 +---------- .../metadata.json | 6 +---- .../metadata.json | 2 +- .../testdata/02560_count_digits/metadata.json | 6 +---- .../02685_decimal256_various/metadata.json | 9 +------ .../metadata.json | 7 +---- .../02892_orc_filter_pushdown/metadata.json | 10 +------ .../03411_iceberg_bucket/metadata.json | 27 ------------------- .../metadata.json | 2 -- 12 files changed, 14 insertions(+), 77 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index a761cad098..7f24c24176 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -1079,6 +1079,7 @@ type Literal struct { Position token.Position `json:"-"` Type LiteralType `json:"type"` Value interface{} `json:"value"` + Source string `json:"source,omitempty"` // Original source text (for preserving 0.0 vs 0) Negative bool `json:"negative,omitempty"` // True if literal was explicitly negative (for -0) } diff --git a/internal/explain/format.go b/internal/explain/format.go index 842b0171c2..102e657e43 100644 --- a/internal/explain/format.go +++ b/internal/explain/format.go @@ -374,6 +374,10 @@ func formatExprAsString(expr ast.Expression) string { } return fmt.Sprintf("%d", e.Value) case ast.LiteralFloat: + // Use Source field if available to preserve original representation (e.g., "0.0") + if e.Source != "" { + return e.Source + } if e.Negative { switch v := e.Value.(type) { case float64: diff --git a/parser/expression.go b/parser/expression.go index 98ca308b49..3990014164 100644 --- a/parser/expression.go +++ b/parser/expression.go @@ -751,6 +751,7 @@ func (p *Parser) parseNumber() ast.Expression { } else { lit.Type = ast.LiteralFloat lit.Value = f + lit.Source = value // Preserve original source text (e.g., "0.0" vs "0") } } else if isHexFloat { // Parse hex float (Go doesn't support this directly, approximate) @@ -860,6 +861,7 @@ func (p *Parser) parseUnaryMinus() ast.Expression { f, _ := strconv.ParseFloat(numVal, 64) lit.Type = ast.LiteralFloat lit.Value = f + lit.Source = numVal // Preserve original source text } else { i, _ := strconv.ParseInt(numVal, 10, 64) lit.Value = i diff --git a/parser/testdata/02009_decimal_no_trailing_zeros/metadata.json b/parser/testdata/02009_decimal_no_trailing_zeros/metadata.json index 95651c13a9..0967ef424b 100644 --- a/parser/testdata/02009_decimal_no_trailing_zeros/metadata.json +++ b/parser/testdata/02009_decimal_no_trailing_zeros/metadata.json @@ -1,14 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true, - "stmt31": true - } -} +{} diff --git a/parser/testdata/02124_comparison_betwwen_decimal_and_float/metadata.json b/parser/testdata/02124_comparison_betwwen_decimal_and_float/metadata.json index aa28559472..0967ef424b 100644 --- a/parser/testdata/02124_comparison_betwwen_decimal_and_float/metadata.json +++ b/parser/testdata/02124_comparison_betwwen_decimal_and_float/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt18": true - } -} +{} diff --git a/parser/testdata/02155_binary_op_between_float_and_decimal/metadata.json b/parser/testdata/02155_binary_op_between_float_and_decimal/metadata.json index 693695c22a..0967ef424b 100644 --- a/parser/testdata/02155_binary_op_between_float_and_decimal/metadata.json +++ b/parser/testdata/02155_binary_op_between_float_and_decimal/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt10":true,"stmt11":true,"stmt9":true}} +{} diff --git a/parser/testdata/02560_count_digits/metadata.json b/parser/testdata/02560_count_digits/metadata.json index d4d1d99f95..0967ef424b 100644 --- a/parser/testdata/02560_count_digits/metadata.json +++ b/parser/testdata/02560_count_digits/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt14": true - } -} +{} diff --git a/parser/testdata/02685_decimal256_various/metadata.json b/parser/testdata/02685_decimal256_various/metadata.json index 611db97131..6e2f58a192 100644 --- a/parser/testdata/02685_decimal256_various/metadata.json +++ b/parser/testdata/02685_decimal256_various/metadata.json @@ -1,18 +1,11 @@ { "explain_todo": { - "stmt10": true, "stmt27": true, "stmt30": true, "stmt31": true, "stmt32": true, "stmt33": true, "stmt34": true, - "stmt35": true, - "stmt4": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true + "stmt35": true } } diff --git a/parser/testdata/02841_parquet_filter_pushdown/metadata.json b/parser/testdata/02841_parquet_filter_pushdown/metadata.json index 3862b51d55..b330691357 100644 --- a/parser/testdata/02841_parquet_filter_pushdown/metadata.json +++ b/parser/testdata/02841_parquet_filter_pushdown/metadata.json @@ -1,10 +1,5 @@ { "explain_todo": { - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt31": true, - "stmt32": true, - "stmt33": true + "stmt26": true } } diff --git a/parser/testdata/02892_orc_filter_pushdown/metadata.json b/parser/testdata/02892_orc_filter_pushdown/metadata.json index 9a33b218be..f505bca475 100644 --- a/parser/testdata/02892_orc_filter_pushdown/metadata.json +++ b/parser/testdata/02892_orc_filter_pushdown/metadata.json @@ -1,14 +1,6 @@ { "explain_todo": { - "stmt38": true, - "stmt39": true, - "stmt40": true, - "stmt41": true, "stmt42": true, - "stmt43": true, - "stmt52": true, - "stmt53": true, - "stmt54": true, - "stmt55": true + "stmt43": true } } diff --git a/parser/testdata/03411_iceberg_bucket/metadata.json b/parser/testdata/03411_iceberg_bucket/metadata.json index 7321a8fd39..25ebaf2494 100644 --- a/parser/testdata/03411_iceberg_bucket/metadata.json +++ b/parser/testdata/03411_iceberg_bucket/metadata.json @@ -1,36 +1,9 @@ { "explain_todo": { - "stmt14": true, - "stmt15": true, - "stmt16": true, "stmt27": true, - "stmt4": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true, "stmt28": true, - "stmt33": true, - "stmt34": true, - "stmt35": true, - "stmt36": true, - "stmt37": true, - "stmt38": true, - "stmt43": true, - "stmt44": true, - "stmt45": true, "stmt56": true, "stmt57": true, - "stmt62": true, - "stmt63": true, - "stmt64": true, - "stmt65": true, - "stmt66": true, - "stmt67": true, - "stmt72": true, - "stmt73": true, - "stmt74": true, "stmt85": true, "stmt86": true } diff --git a/parser/testdata/03522_function_first_non_default/metadata.json b/parser/testdata/03522_function_first_non_default/metadata.json index 6552616b37..8e042738b6 100644 --- a/parser/testdata/03522_function_first_non_default/metadata.json +++ b/parser/testdata/03522_function_first_non_default/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt14": true, - "stmt15": true, "stmt16": true, "stmt2": true, "stmt20": true, From ed21805e69d54a2f8367a95931247e51dd78d79a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 02:27:48 +0000 Subject: [PATCH 13/21] Fix SYSTEM query parsing to properly capture qualified table names - Stop command parsing when encountering IDENT followed by DOT - This allows qualified table names like sqllt.table to be parsed properly - SYSTEM STOP MERGES sqllt.table now correctly shows children --- parser/parser.go | 5 +++++ .../testdata/01164_alter_memory_database/metadata.json | 7 +------ parser/testdata/01702_system_query_log/metadata.json | 10 ---------- .../metadata.json | 5 +---- .../metadata.json | 7 +------ 5 files changed, 8 insertions(+), 26 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index fa0fa57f6b..8cda5a2c1a 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -4419,8 +4419,13 @@ func (p *Parser) parseSystem() *ast.SystemQuery { p.nextToken() // skip SYSTEM // Read the command - can include identifiers and keywords (like TTL, SYNC, etc.) + // Stop when we see an IDENT followed by DOT (qualified table name like sqllt.table) var parts []string for p.currentIs(token.IDENT) || p.isSystemCommandKeyword() { + // Check if this IDENT is followed by DOT - if so, it's a table name, not part of the command + if p.currentIs(token.IDENT) && p.peekIs(token.DOT) { + break + } parts = append(parts, p.current.Value) p.nextToken() } diff --git a/parser/testdata/01164_alter_memory_database/metadata.json b/parser/testdata/01164_alter_memory_database/metadata.json index ff0eba6904..0967ef424b 100644 --- a/parser/testdata/01164_alter_memory_database/metadata.json +++ b/parser/testdata/01164_alter_memory_database/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01702_system_query_log/metadata.json b/parser/testdata/01702_system_query_log/metadata.json index 399d26f308..0b77aa1ad0 100644 --- a/parser/testdata/01702_system_query_log/metadata.json +++ b/parser/testdata/01702_system_query_log/metadata.json @@ -6,16 +6,6 @@ "stmt28": true, "stmt30": true, "stmt34": true, - "stmt37": true, - "stmt38": true, - "stmt39": true, - "stmt40": true, - "stmt41": true, - "stmt42": true, - "stmt43": true, - "stmt44": true, - "stmt45": true, - "stmt46": true, "stmt49": true, "stmt50": true, "stmt51": true, diff --git a/parser/testdata/02915_move_partition_inactive_replica/metadata.json b/parser/testdata/02915_move_partition_inactive_replica/metadata.json index d64762f244..979c6e67c3 100644 --- a/parser/testdata/02915_move_partition_inactive_replica/metadata.json +++ b/parser/testdata/02915_move_partition_inactive_replica/metadata.json @@ -1,14 +1,11 @@ { "explain_todo": { - "stmt17": true, - "stmt18": true, "stmt22": true, "stmt23": true, "stmt24": true, "stmt25": true, "stmt26": true, "stmt27": true, - "stmt28": true, - "stmt30": true + "stmt28": true } } diff --git a/parser/testdata/02916_another_move_partition_inactive_replica/metadata.json b/parser/testdata/02916_another_move_partition_inactive_replica/metadata.json index 846a9cee13..dc422d12e3 100644 --- a/parser/testdata/02916_another_move_partition_inactive_replica/metadata.json +++ b/parser/testdata/02916_another_move_partition_inactive_replica/metadata.json @@ -1,12 +1,7 @@ { "explain_todo": { - "stmt10": true, - "stmt15": true, "stmt19": true, "stmt22": true, - "stmt23": true, - "stmt26": true, - "stmt29": true, - "stmt9": true + "stmt23": true } } From 08b61d33641ce7d64e360f04059a38a44d23fc23 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 02:34:51 +0000 Subject: [PATCH 14/21] Fix EXPLAIN type handling in viewExplain for subqueries - Only show explicit EXPLAIN type when it's not AST or PLAN (default) - EXPLAIN SYNTAX correctly outputs 'EXPLAIN SYNTAX' - EXPLAIN or EXPLAIN PLAN outputs just 'EXPLAIN' Fixes many tests with EXPLAIN subqueries (comma_join, window functions, etc.) --- internal/explain/tables.go | 9 +++-- .../00849_multiple_comma_join_2/metadata.json | 35 +------------------ .../metadata.json | 7 +--- .../metadata.json | 2 +- .../metadata.json | 6 +--- .../metadata.json | 2 +- .../metadata.json | 1 - .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../metadata.json | 5 +-- .../metadata.json | 11 +----- .../metadata.json | 4 +-- .../metadata.json | 4 +-- .../metadata.json | 8 +---- 14 files changed, 19 insertions(+), 87 deletions(-) diff --git a/internal/explain/tables.go b/internal/explain/tables.go index e960be8afd..58782173dc 100644 --- a/internal/explain/tables.go +++ b/internal/explain/tables.go @@ -149,8 +149,13 @@ func explainViewExplain(sb *strings.Builder, n *ast.ExplainQuery, alias string, // Now output the viewExplain function fmt.Fprintf(sb, "%s Function viewExplain (children %d)\n", indent, 1) fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, 3) - // First argument: 'EXPLAIN' literal - fmt.Fprintf(sb, "%s Literal \\'EXPLAIN\\'\n", indent) + // First argument: 'EXPLAIN' or 'EXPLAIN SYNTAX' etc. + // PLAN is the default and never shown; only show non-default types like SYNTAX + explainTypeStr := "EXPLAIN" + if n.ExplicitType && n.ExplainType != "" && n.ExplainType != ast.ExplainAST && n.ExplainType != ast.ExplainPlan { + explainTypeStr = "EXPLAIN " + string(n.ExplainType) + } + fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, explainTypeStr) // Second argument: options string (e.g., "actions = 1") options := n.OptionsString fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, options) diff --git a/parser/testdata/00849_multiple_comma_join_2/metadata.json b/parser/testdata/00849_multiple_comma_join_2/metadata.json index 8ac6ce5fac..0967ef424b 100644 --- a/parser/testdata/00849_multiple_comma_join_2/metadata.json +++ b/parser/testdata/00849_multiple_comma_join_2/metadata.json @@ -1,34 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt20": true, - "stmt21": true, - "stmt22": true, - "stmt23": true, - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true, - "stmt31": true, - "stmt32": true, - "stmt33": true, - "stmt34": true, - "stmt35": true, - "stmt36": true, - "stmt37": true, - "stmt38": true, - "stmt39": true, - "stmt40": true, - "stmt41": true, - "stmt42": true - } -} +{} diff --git a/parser/testdata/02382_join_and_filtering_set/metadata.json b/parser/testdata/02382_join_and_filtering_set/metadata.json index 9b453ec09b..0967ef424b 100644 --- a/parser/testdata/02382_join_and_filtering_set/metadata.json +++ b/parser/testdata/02382_join_and_filtering_set/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt16": true, - "stmt17": true - } -} +{} diff --git a/parser/testdata/02493_max_streams_for_merge_tree_reading/metadata.json b/parser/testdata/02493_max_streams_for_merge_tree_reading/metadata.json index c8319bb16c..0967ef424b 100644 --- a/parser/testdata/02493_max_streams_for_merge_tree_reading/metadata.json +++ b/parser/testdata/02493_max_streams_for_merge_tree_reading/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt10":true,"stmt12":true,"stmt14":true,"stmt17":true,"stmt19":true,"stmt8":true}} +{} diff --git a/parser/testdata/02676_distinct_reading_in_order_analyzer/metadata.json b/parser/testdata/02676_distinct_reading_in_order_analyzer/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/02676_distinct_reading_in_order_analyzer/metadata.json +++ b/parser/testdata/02676_distinct_reading_in_order_analyzer/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/02723_parallelize_output_setting/metadata.json b/parser/testdata/02723_parallelize_output_setting/metadata.json index 6c349227cb..0967ef424b 100644 --- a/parser/testdata/02723_parallelize_output_setting/metadata.json +++ b/parser/testdata/02723_parallelize_output_setting/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt4":true,"stmt6":true,"stmt8":true}} +{} diff --git a/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json b/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json index 3a352d68aa..b65b07d7a6 100644 --- a/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json +++ b/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt10": true, "stmt4": true } } diff --git a/parser/testdata/02863_delayed_source_with_totals_and_extremes/metadata.json b/parser/testdata/02863_delayed_source_with_totals_and_extremes/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/02863_delayed_source_with_totals_and_extremes/metadata.json +++ b/parser/testdata/02863_delayed_source_with_totals_and_extremes/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/02884_parallel_window_functions/metadata.json b/parser/testdata/02884_parallel_window_functions/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/02884_parallel_window_functions/metadata.json +++ b/parser/testdata/02884_parallel_window_functions/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/02911_join_on_nullsafe_optimization/metadata.json b/parser/testdata/02911_join_on_nullsafe_optimization/metadata.json index 023ae84d73..1bce63c700 100644 --- a/parser/testdata/02911_join_on_nullsafe_optimization/metadata.json +++ b/parser/testdata/02911_join_on_nullsafe_optimization/metadata.json @@ -6,10 +6,7 @@ "stmt18": true, "stmt19": true, "stmt20": true, - "stmt30": true, - "stmt31": true, "stmt32": true, - "stmt33": true, - "stmt34": true + "stmt33": true } } diff --git a/parser/testdata/03168_read_in_order_buffering_1/metadata.json b/parser/testdata/03168_read_in_order_buffering_1/metadata.json index 0081ae5065..0967ef424b 100644 --- a/parser/testdata/03168_read_in_order_buffering_1/metadata.json +++ b/parser/testdata/03168_read_in_order_buffering_1/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt7": true, - "stmt8": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03210_optimize_rewrite_aggregate_function_with_if_return_type_bug/metadata.json b/parser/testdata/03210_optimize_rewrite_aggregate_function_with_if_return_type_bug/metadata.json index a84feb7aed..c45b7602ba 100644 --- a/parser/testdata/03210_optimize_rewrite_aggregate_function_with_if_return_type_bug/metadata.json +++ b/parser/testdata/03210_optimize_rewrite_aggregate_function_with_if_return_type_bug/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt5": true, - "stmt8": true + "stmt12": true } } diff --git a/parser/testdata/03283_optimize_on_insert_level/metadata.json b/parser/testdata/03283_optimize_on_insert_level/metadata.json index 353f02118b..bdef5dcec2 100644 --- a/parser/testdata/03283_optimize_on_insert_level/metadata.json +++ b/parser/testdata/03283_optimize_on_insert_level/metadata.json @@ -2,9 +2,7 @@ "explain_todo": { "stmt10": true, "stmt15": true, - "stmt19": true, "stmt20": true, - "stmt5": true, - "stmt9": true + "stmt5": true } } diff --git a/parser/testdata/03532_window_function_and_null_source_max_threads/metadata.json b/parser/testdata/03532_window_function_and_null_source_max_threads/metadata.json index 0081ae918c..0967ef424b 100644 --- a/parser/testdata/03532_window_function_and_null_source_max_threads/metadata.json +++ b/parser/testdata/03532_window_function_and_null_source_max_threads/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt2": true, - "stmt3": true, - "stmt5": true - } -} +{} From 58fb390dac025894ce562ee2316accd07cb171d0 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 02:59:40 +0000 Subject: [PATCH 15/21] Fix SYSTEM command parsing to properly separate table names from command - Add end-of-statement check to identify table names vs command parts - Handle FAILPOINT and FOR contexts where following identifier is part of command - Expand recognized SYSTEM command keywords (DICTIONARIES, REPLICAS, etc.) - This allows commands like "SYSTEM STOP REPLICATED SENDS table" to properly capture "table" as a child identifier while keeping "SYSTEM DROP MARK CACHE" as a single command without children --- parser/parser.go | 45 +++++++++++++++++-- .../metadata.json | 2 - .../metadata.json | 7 +-- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 5 +-- .../metadata.json | 4 +- .../metadata.json | 2 - .../00643_cast_zookeeper_long/metadata.json | 1 - .../metadata.json | 7 +-- .../metadata.json | 9 +--- .../metadata.json | 2 +- .../metadata.json | 2 +- .../metadata.json | 2 +- .../metadata.json | 2 +- .../metadata.json | 7 +-- .../testdata/00753_alter_attach/metadata.json | 2 - .../metadata.json | 3 -- .../metadata.json | 7 +-- .../metadata.json | 9 +--- .../metadata.json | 11 +---- .../metadata.json | 13 +----- .../metadata.json | 13 +----- .../metadata.json | 3 -- .../metadata.json | 4 +- .../metadata.json | 7 +-- .../metadata.json | 7 +-- .../metadata.json | 1 - .../metadata.json | 8 +--- .../01084_defaults_on_aliases/metadata.json | 6 +-- .../01132_max_rows_to_read/metadata.json | 6 +-- .../metadata.json | 6 +-- .../01158_zookeeper_log_long/metadata.json | 7 +-- .../metadata.json | 11 +---- .../01172_transaction_counters/metadata.json | 3 +- .../metadata.json | 4 +- .../metadata.json | 2 +- .../metadata.json | 10 +---- .../metadata.json | 7 +-- .../01451_detach_drop_part/metadata.json | 2 - .../metadata.json | 2 - .../metadata.json | 2 - .../01465_ttl_recompression/metadata.json | 5 +-- .../metadata.json | 2 - .../metadata.json | 6 +-- .../metadata.json | 10 +---- .../metadata.json | 9 +--- .../metadata.json | 2 - .../metadata.json | 2 +- .../metadata.json | 12 +---- .../metadata.json | 6 +-- .../01571_window_functions/metadata.json | 6 +-- .../metadata.json | 4 +- .../metadata.json | 2 +- .../metadata.json | 7 +-- .../metadata.json | 9 +--- .../metadata.json | 17 +------ .../metadata.json | 3 +- .../01660_system_parts_smoke/metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../01710_projection_fetch_long/metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 4 +- .../metadata.json | 6 +-- .../01780_column_sparse_filter/metadata.json | 2 +- .../01780_column_sparse_full/metadata.json | 7 +-- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 2 +- .../metadata.json | 7 +-- .../metadata.json | 7 +-- .../testdata/02070_join_on_disk/metadata.json | 6 +-- .../metadata.json | 6 +-- .../02129_add_column_add_ttl/metadata.json | 3 -- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 10 +---- .../metadata.json | 2 - .../02343_aggregation_pipeline/metadata.json | 7 +-- .../metadata.json | 7 +-- .../metadata.json | 4 +- .../metadata.json | 6 +-- .../metadata.json | 3 +- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 7 +-- .../metadata.json | 1 - .../metadata.json | 2 +- .../metadata.json | 6 +-- .../02381_analyzer_join_final/metadata.json | 4 +- .../metadata.json | 4 +- .../02404_memory_bound_merging/metadata.json | 6 +-- .../02420_final_setting/metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 7 +-- .../metadata.json | 2 - .../metadata.json | 3 -- .../metadata.json | 2 +- .../metadata.json | 29 +----------- .../02458_relax_too_many_parts/metadata.json | 7 +-- .../metadata.json | 14 +----- .../metadata.json | 3 +- .../metadata.json | 7 +-- .../metadata.json | 4 +- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../02520_group_array_last/metadata.json | 6 +-- .../metadata.json | 11 +---- .../02538_alter_rename_sequence/metadata.json | 8 +--- .../metadata.json | 6 +-- .../metadata.json | 7 +-- .../metadata.json | 4 +- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 4 +- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 4 +- .../metadata.json | 5 +-- .../metadata.json | 6 +-- .../metadata.json | 2 +- .../02872_prewhere_filter/metadata.json | 2 +- .../metadata.json | 6 --- .../metadata.json | 7 +-- .../metadata.json | 8 +--- .../metadata.json | 2 +- .../metadata.json | 4 +- .../metadata.json | 2 - .../metadata.json | 4 +- .../metadata.json | 6 +-- .../metadata.json | 2 +- .../metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 3 +- .../metadata.json | 6 +-- .../metadata.json | 2 +- .../metadata.json | 9 +--- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 12 +---- .../metadata.json | 12 +---- .../metadata.json | 12 +---- .../metadata.json | 12 +---- .../metadata.json | 7 +-- .../metadata.json | 7 +-- .../metadata.json | 7 +-- .../metadata.json | 7 +-- .../metadata.json | 11 +---- .../metadata.json | 11 +---- .../metadata.json | 11 +---- .../metadata.json | 11 +---- .../metadata.json | 4 -- .../metadata.json | 1 - .../metadata.json | 6 +-- .../metadata.json | 1 - .../metadata.json | 3 +- .../metadata.json | 10 +---- .../metadata.json | 6 +-- .../metadata.json | 1 - .../metadata.json | 3 +- .../03047_on_fly_update_delete/metadata.json | 2 - .../metadata.json | 6 +-- .../03100_lwu_02_basics/metadata.json | 1 - .../metadata.json | 2 - .../metadata.json | 1 - .../03100_lwu_32_on_fly_filter/metadata.json | 1 - .../03100_lwu_38_replacing/metadata.json | 1 - .../03100_lwu_deletes_1/metadata.json | 1 - .../03100_lwu_deletes_3/metadata.json | 4 +- .../metadata.json | 6 +-- .../03141_fetches_errors_stress/metadata.json | 6 +-- .../metadata.json | 7 +-- .../03175_sparse_and_skip_index/metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 4 +- .../metadata.json | 6 +-- .../metadata.json | 1 - .../03231_pr_reverse_in_order/metadata.json | 6 +-- .../metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 8 +--- .../metadata.json | 6 +-- .../03248_max_parts_to_move/metadata.json | 3 +- .../testdata/03248_with_insert/metadata.json | 1 - .../03254_attach_part_order/metadata.json | 3 +- .../metadata.json | 6 +-- .../metadata.json | 10 +---- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 10 +---- .../metadata.json | 6 +-- .../metadata.json | 4 +- .../metadata.json | 1 - .../metadata.json | 2 - .../metadata.json | 3 +- .../metadata.json | 7 +-- .../metadata.json | 7 +-- .../metadata.json | 2 - .../metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 1 - .../03541_rename_column_start/metadata.json | 7 +-- .../metadata.json | 6 +-- .../metadata.json | 6 +-- .../metadata.json | 7 +-- .../metadata.json | 6 +-- .../03622_ttl_infos_where/metadata.json | 4 +- .../03625_auto_statistics/metadata.json | 7 +-- .../03625_auto_statistics_rmt/metadata.json | 7 +-- .../metadata.json | 4 +- .../metadata.json | 2 +- .../metadata.json | 8 +--- .../metadata.json | 7 +-- .../metadata.json | 3 +- 222 files changed, 220 insertions(+), 1038 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 8cda5a2c1a..58b382c5b1 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -4419,13 +4419,34 @@ func (p *Parser) parseSystem() *ast.SystemQuery { p.nextToken() // skip SYSTEM // Read the command - can include identifiers and keywords (like TTL, SYNC, etc.) - // Stop when we see an IDENT followed by DOT (qualified table name like sqllt.table) + // Stop when we see: + // 1. An IDENT followed by DOT (qualified table name like sqllt.table) + // 2. A plain IDENT (not a command keyword) followed by end-of-statement (SEMICOLON, EOF, FORMAT), + // UNLESS the previous part was FAILPOINT (failpoint names are part of the command) var parts []string for p.currentIs(token.IDENT) || p.isSystemCommandKeyword() { // Check if this IDENT is followed by DOT - if so, it's a table name, not part of the command if p.currentIs(token.IDENT) && p.peekIs(token.DOT) { break } + // Check if this is a plain IDENT (not a command keyword) followed by end-of-statement + // This indicates it's likely a table name, not part of the command + // Exception: after FAILPOINT, the identifier is the failpoint name (part of command) + if p.currentIs(token.IDENT) && !p.isSystemCommandKeyword() { + if p.peekIs(token.SEMICOLON) || p.peekIs(token.EOF) || p.peekIs(token.FORMAT) { + // Check if previous part was FAILPOINT or FOR - these are followed by identifiers that are part of command + if len(parts) > 0 { + lastPart := strings.ToUpper(parts[len(parts)-1]) + if lastPart == "FAILPOINT" || lastPart == "FOR" { + // This is a failpoint name or format name, consume it as part of command + parts = append(parts, p.current.Value) + p.nextToken() + continue + } + } + break + } + } parts = append(parts, p.current.Value) p.nextToken() } @@ -4451,18 +4472,34 @@ func (p *Parser) parseSystem() *ast.SystemQuery { return sys } -// isSystemCommandKeyword returns true if current token is a keyword that can be part of SYSTEM command +// isSystemCommandKeyword returns true if current token is a keyword/identifier that is part of SYSTEM command +// and should NOT be treated as a table name func (p *Parser) isSystemCommandKeyword() bool { switch p.current.Token { case token.TTL, token.SYNC, token.DROP, token.FORMAT, token.FOR, token.INDEX, token.INSERT, token.PRIMARY, token.KEY: return true } - // Handle SCHEMA, CACHE, QUEUE and other identifiers that are part of SYSTEM commands + // Handle identifiers that are part of SYSTEM commands (not table names) if p.currentIs(token.IDENT) { upper := strings.ToUpper(p.current.Value) switch upper { - case "SCHEMA", "CACHE", "QUEUE": + case "SCHEMA", "CACHE", "QUEUE", + // FAILPOINT names are part of the command, not table names + "FAILPOINT", + // These are common parts of SYSTEM commands that end with identifiers + "ENABLE", "DISABLE", "FLUSH", "RELOAD", "RESTART", "STOP", "START", + // Parts of STOP/START commands + "LISTEN", "LISTENING", "MOVES", "MERGES", "TTL", "SENDS", "FETCHES", "PULLING", + "REPLICATED", "DISTRIBUTED", "CLEANUP", + // RELOAD targets + "DICTIONARIES", "DICTIONARY", "MODELS", "MODEL", "FUNCTIONS", "FUNCTION", + "EMBEDDED", "CONFIG", "SYMBOLS", "ASYNCHRONOUS", "METRICS", + // FLUSH/DROP targets + "LOGS", "ASYNC", "UNCOMPRESSED", "COMPILED", "MARK", "QUERY", "MMAP", + "DNS", "FILESYSTEM", "S3", + // Other command parts + "MUTATIONS", "REPLICATION", "QUEUES", "DDL", "REPLICAS", "REPLICA": return true } } diff --git a/parser/testdata/00446_clear_column_in_partition_zookeeper_long/metadata.json b/parser/testdata/00446_clear_column_in_partition_zookeeper_long/metadata.json index 5f21799304..f205ba26ea 100644 --- a/parser/testdata/00446_clear_column_in_partition_zookeeper_long/metadata.json +++ b/parser/testdata/00446_clear_column_in_partition_zookeeper_long/metadata.json @@ -1,9 +1,7 @@ { "explain_todo": { "stmt11": true, - "stmt21": true, "stmt24": true, - "stmt27": true, "stmt31": true, "stmt34": true, "stmt37": true, diff --git a/parser/testdata/00502_custom_partitioning_replicated_zookeeper_long/metadata.json b/parser/testdata/00502_custom_partitioning_replicated_zookeeper_long/metadata.json index eb5ba96e8d..8911e87d09 100644 --- a/parser/testdata/00502_custom_partitioning_replicated_zookeeper_long/metadata.json +++ b/parser/testdata/00502_custom_partitioning_replicated_zookeeper_long/metadata.json @@ -1,16 +1,11 @@ { "explain_todo": { "stmt12": true, - "stmt13": true, "stmt19": true, "stmt33": true, - "stmt34": true, "stmt54": true, - "stmt55": true, "stmt62": true, "stmt76": true, - "stmt77": true, - "stmt94": true, - "stmt95": true + "stmt94": true } } diff --git a/parser/testdata/00509_extended_storage_definition_syntax_zookeeper/metadata.json b/parser/testdata/00509_extended_storage_definition_syntax_zookeeper/metadata.json index 8604712d22..969184549d 100644 --- a/parser/testdata/00509_extended_storage_definition_syntax_zookeeper/metadata.json +++ b/parser/testdata/00509_extended_storage_definition_syntax_zookeeper/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt22": true, - "stmt32": true, "stmt4": true } } diff --git a/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json b/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json index 0438c9b85f..0967ef424b 100644 --- a/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json +++ b/parser/testdata/00577_replacing_merge_tree_vertical_merge/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt15": true - } -} +{} diff --git a/parser/testdata/00620_optimize_on_nonleader_replica_zookeeper/metadata.json b/parser/testdata/00620_optimize_on_nonleader_replica_zookeeper/metadata.json index 8f5b17cccf..4cec88be84 100644 --- a/parser/testdata/00620_optimize_on_nonleader_replica_zookeeper/metadata.json +++ b/parser/testdata/00620_optimize_on_nonleader_replica_zookeeper/metadata.json @@ -1,9 +1,6 @@ { "explain_todo": { "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt8": true, - "stmt9": true + "stmt8": true } } diff --git a/parser/testdata/00623_replicated_truncate_table_zookeeper_long/metadata.json b/parser/testdata/00623_replicated_truncate_table_zookeeper_long/metadata.json index 62ae55d0a4..c45b7602ba 100644 --- a/parser/testdata/00623_replicated_truncate_table_zookeeper_long/metadata.json +++ b/parser/testdata/00623_replicated_truncate_table_zookeeper_long/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt17": true, - "stmt8": true + "stmt12": true } } diff --git a/parser/testdata/00626_replace_partition_from_table/metadata.json b/parser/testdata/00626_replace_partition_from_table/metadata.json index 10db4cb335..889aef75f3 100644 --- a/parser/testdata/00626_replace_partition_from_table/metadata.json +++ b/parser/testdata/00626_replace_partition_from_table/metadata.json @@ -1,9 +1,7 @@ { "explain_todo": { - "stmt42": true, "stmt44": true, "stmt46": true, - "stmt50": true, "stmt59": true, "stmt60": true, "stmt61": true diff --git a/parser/testdata/00643_cast_zookeeper_long/metadata.json b/parser/testdata/00643_cast_zookeeper_long/metadata.json index 470d47b502..7ad5569408 100644 --- a/parser/testdata/00643_cast_zookeeper_long/metadata.json +++ b/parser/testdata/00643_cast_zookeeper_long/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt10": true, "stmt9": true } } diff --git a/parser/testdata/00661_optimize_final_replicated_without_partition_zookeeper/metadata.json b/parser/testdata/00661_optimize_final_replicated_without_partition_zookeeper/metadata.json index af0e8850a5..0967ef424b 100644 --- a/parser/testdata/00661_optimize_final_replicated_without_partition_zookeeper/metadata.json +++ b/parser/testdata/00661_optimize_final_replicated_without_partition_zookeeper/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt15": true - } -} +{} diff --git a/parser/testdata/00721_force_by_identical_result_after_merge_zookeeper_long/metadata.json b/parser/testdata/00721_force_by_identical_result_after_merge_zookeeper_long/metadata.json index 071a891e71..0967ef424b 100644 --- a/parser/testdata/00721_force_by_identical_result_after_merge_zookeeper_long/metadata.json +++ b/parser/testdata/00721_force_by_identical_result_after_merge_zookeeper_long/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt13": true, - "stmt7": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/00732_quorum_insert_have_data_before_quorum_zookeeper_long/metadata.json b/parser/testdata/00732_quorum_insert_have_data_before_quorum_zookeeper_long/metadata.json index 299d9b76de..0967ef424b 100644 --- a/parser/testdata/00732_quorum_insert_have_data_before_quorum_zookeeper_long/metadata.json +++ b/parser/testdata/00732_quorum_insert_have_data_before_quorum_zookeeper_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt9":true}} +{} diff --git a/parser/testdata/00732_quorum_insert_lost_part_and_alive_part_zookeeper_long/metadata.json b/parser/testdata/00732_quorum_insert_lost_part_and_alive_part_zookeeper_long/metadata.json index 26fc9e4e76..0967ef424b 100644 --- a/parser/testdata/00732_quorum_insert_lost_part_and_alive_part_zookeeper_long/metadata.json +++ b/parser/testdata/00732_quorum_insert_lost_part_and_alive_part_zookeeper_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt12":true,"stmt19":true,"stmt20":true}} +{} diff --git a/parser/testdata/00732_quorum_insert_lost_part_zookeeper_long/metadata.json b/parser/testdata/00732_quorum_insert_lost_part_zookeeper_long/metadata.json index 22f911ffbf..0967ef424b 100644 --- a/parser/testdata/00732_quorum_insert_lost_part_zookeeper_long/metadata.json +++ b/parser/testdata/00732_quorum_insert_lost_part_zookeeper_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt17":true,"stmt18":true,"stmt9":true}} +{} diff --git a/parser/testdata/00732_quorum_insert_select_with_old_data_and_without_quorum_zookeeper_long/metadata.json b/parser/testdata/00732_quorum_insert_select_with_old_data_and_without_quorum_zookeeper_long/metadata.json index 6603066af5..0967ef424b 100644 --- a/parser/testdata/00732_quorum_insert_select_with_old_data_and_without_quorum_zookeeper_long/metadata.json +++ b/parser/testdata/00732_quorum_insert_select_with_old_data_and_without_quorum_zookeeper_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt13":true,"stmt9":true}} +{} diff --git a/parser/testdata/00738_nested_merge_multidimensional_array/metadata.json b/parser/testdata/00738_nested_merge_multidimensional_array/metadata.json index c84e30800d..0967ef424b 100644 --- a/parser/testdata/00738_nested_merge_multidimensional_array/metadata.json +++ b/parser/testdata/00738_nested_merge_multidimensional_array/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/00753_alter_attach/metadata.json b/parser/testdata/00753_alter_attach/metadata.json index c1b7141c67..69fcb09704 100644 --- a/parser/testdata/00753_alter_attach/metadata.json +++ b/parser/testdata/00753_alter_attach/metadata.json @@ -3,9 +3,7 @@ "stmt14": true, "stmt22": true, "stmt34": true, - "stmt36": true, "stmt4": true, - "stmt40": true, "stmt42": true, "stmt51": true, "stmt52": true, diff --git a/parser/testdata/00754_alter_modify_order_by_replicated_zookeeper_long/metadata.json b/parser/testdata/00754_alter_modify_order_by_replicated_zookeeper_long/metadata.json index 0c307ca3c0..2bdcc156b7 100644 --- a/parser/testdata/00754_alter_modify_order_by_replicated_zookeeper_long/metadata.json +++ b/parser/testdata/00754_alter_modify_order_by_replicated_zookeeper_long/metadata.json @@ -5,10 +5,7 @@ "stmt14": true, "stmt15": true, "stmt16": true, - "stmt18": true, - "stmt22": true, "stmt28": true, - "stmt30": true, "stmt6": true } } diff --git a/parser/testdata/00836_indices_alter_replicated_zookeeper_long/metadata.json b/parser/testdata/00836_indices_alter_replicated_zookeeper_long/metadata.json index 131883cf6d..03776c0ca6 100644 --- a/parser/testdata/00836_indices_alter_replicated_zookeeper_long/metadata.json +++ b/parser/testdata/00836_indices_alter_replicated_zookeeper_long/metadata.json @@ -3,11 +3,6 @@ "stmt10": true, "stmt11": true, "stmt12": true, - "stmt22": true, - "stmt23": true, - "stmt35": true, - "stmt46": true, - "stmt47": true, - "stmt9": true + "stmt35": true } } diff --git a/parser/testdata/00837_minmax_index_replicated_zookeeper_long/metadata.json b/parser/testdata/00837_minmax_index_replicated_zookeeper_long/metadata.json index da2c8e4e8a..0967ef424b 100644 --- a/parser/testdata/00837_minmax_index_replicated_zookeeper_long/metadata.json +++ b/parser/testdata/00837_minmax_index_replicated_zookeeper_long/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt19": true, - "stmt20": true - } -} +{} diff --git a/parser/testdata/00910_zookeeper_custom_compression_codecs_replicated_long/metadata.json b/parser/testdata/00910_zookeeper_custom_compression_codecs_replicated_long/metadata.json index 06c3006063..0967ef424b 100644 --- a/parser/testdata/00910_zookeeper_custom_compression_codecs_replicated_long/metadata.json +++ b/parser/testdata/00910_zookeeper_custom_compression_codecs_replicated_long/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt15": true, - "stmt28": true, - "stmt32": true, - "stmt40": true, - "stmt42": true - } -} +{} diff --git a/parser/testdata/00910_zookeeper_test_alter_compression_codecs_long/metadata.json b/parser/testdata/00910_zookeeper_test_alter_compression_codecs_long/metadata.json index 8914476af2..909e6ec804 100644 --- a/parser/testdata/00910_zookeeper_test_alter_compression_codecs_long/metadata.json +++ b/parser/testdata/00910_zookeeper_test_alter_compression_codecs_long/metadata.json @@ -1,17 +1,6 @@ { "explain_todo": { - "stmt13": true, - "stmt14": true, - "stmt19": true, - "stmt20": true, "stmt23": true, - "stmt28": true, - "stmt32": true, - "stmt33": true, - "stmt34": true, - "stmt39": true, - "stmt40": true, - "stmt44": true, - "stmt9": true + "stmt32": true } } diff --git a/parser/testdata/00926_zookeeper_adaptive_index_granularity_replicated_merge_tree_long/metadata.json b/parser/testdata/00926_zookeeper_adaptive_index_granularity_replicated_merge_tree_long/metadata.json index 64a72dba30..0967ef424b 100644 --- a/parser/testdata/00926_zookeeper_adaptive_index_granularity_replicated_merge_tree_long/metadata.json +++ b/parser/testdata/00926_zookeeper_adaptive_index_granularity_replicated_merge_tree_long/metadata.json @@ -1,12 +1 @@ -{ - "explain_todo": { - "stmt19": true, - "stmt35": true, - "stmt51": true, - "stmt64": true, - "stmt7": true, - "stmt73": true, - "stmt80": true, - "stmt92": true - } -} +{} diff --git a/parser/testdata/00980_zookeeper_merge_tree_alter_settings/metadata.json b/parser/testdata/00980_zookeeper_merge_tree_alter_settings/metadata.json index fac3254d73..0356b75394 100644 --- a/parser/testdata/00980_zookeeper_merge_tree_alter_settings/metadata.json +++ b/parser/testdata/00980_zookeeper_merge_tree_alter_settings/metadata.json @@ -1,8 +1,5 @@ { "explain_todo": { - "stmt10": true, - "stmt13": true, - "stmt25": true, "stmt58": true, "stmt59": true, "stmt60": true diff --git a/parser/testdata/00988_constraints_replication_zookeeper_long/metadata.json b/parser/testdata/00988_constraints_replication_zookeeper_long/metadata.json index b30b316b15..a5216843cc 100644 --- a/parser/testdata/00988_constraints_replication_zookeeper_long/metadata.json +++ b/parser/testdata/00988_constraints_replication_zookeeper_long/metadata.json @@ -2,8 +2,6 @@ "explain_todo": { "stmt10": true, "stmt13": true, - "stmt14": true, - "stmt7": true, - "stmt8": true + "stmt14": true } } diff --git a/parser/testdata/00988_parallel_parts_removal/metadata.json b/parser/testdata/00988_parallel_parts_removal/metadata.json index 64e53a7fed..0967ef424b 100644 --- a/parser/testdata/00988_parallel_parts_removal/metadata.json +++ b/parser/testdata/00988_parallel_parts_removal/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/00989_parallel_parts_loading/metadata.json b/parser/testdata/00989_parallel_parts_loading/metadata.json index 638822386f..0967ef424b 100644 --- a/parser/testdata/00989_parallel_parts_loading/metadata.json +++ b/parser/testdata/00989_parallel_parts_loading/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt3": true - } -} +{} diff --git a/parser/testdata/01049_zookeeper_synchronous_mutations_long/metadata.json b/parser/testdata/01049_zookeeper_synchronous_mutations_long/metadata.json index 890a50dfa7..316285e34a 100644 --- a/parser/testdata/01049_zookeeper_synchronous_mutations_long/metadata.json +++ b/parser/testdata/01049_zookeeper_synchronous_mutations_long/metadata.json @@ -3,7 +3,6 @@ "stmt10": true, "stmt18": true, "stmt20": true, - "stmt7": true, "stmt8": true } } diff --git a/parser/testdata/01064_incremental_streaming_from_2_src_with_feedback/metadata.json b/parser/testdata/01064_incremental_streaming_from_2_src_with_feedback/metadata.json index 99a7322526..0967ef424b 100644 --- a/parser/testdata/01064_incremental_streaming_from_2_src_with_feedback/metadata.json +++ b/parser/testdata/01064_incremental_streaming_from_2_src_with_feedback/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt17": true, - "stmt18": true, - "stmt19": true - } -} +{} diff --git a/parser/testdata/01084_defaults_on_aliases/metadata.json b/parser/testdata/01084_defaults_on_aliases/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01084_defaults_on_aliases/metadata.json +++ b/parser/testdata/01084_defaults_on_aliases/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/01132_max_rows_to_read/metadata.json b/parser/testdata/01132_max_rows_to_read/metadata.json index 13dfdf58b8..0967ef424b 100644 --- a/parser/testdata/01132_max_rows_to_read/metadata.json +++ b/parser/testdata/01132_max_rows_to_read/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt28": true - } -} +{} diff --git a/parser/testdata/01149_zookeeper_mutation_stuck_after_replace_partition/metadata.json b/parser/testdata/01149_zookeeper_mutation_stuck_after_replace_partition/metadata.json index 7b4455cd5f..0967ef424b 100644 --- a/parser/testdata/01149_zookeeper_mutation_stuck_after_replace_partition/metadata.json +++ b/parser/testdata/01149_zookeeper_mutation_stuck_after_replace_partition/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt16": true - } -} +{} diff --git a/parser/testdata/01158_zookeeper_log_long/metadata.json b/parser/testdata/01158_zookeeper_log_long/metadata.json index 8b0256d0ad..0967ef424b 100644 --- a/parser/testdata/01158_zookeeper_log_long/metadata.json +++ b/parser/testdata/01158_zookeeper_log_long/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/01165_lost_part_empty_partition/metadata.json b/parser/testdata/01165_lost_part_empty_partition/metadata.json index a8c4f9dfa9..0967ef424b 100644 --- a/parser/testdata/01165_lost_part_empty_partition/metadata.json +++ b/parser/testdata/01165_lost_part_empty_partition/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt16": true, - "stmt19": true, - "stmt26": true, - "stmt31": true, - "stmt4": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/01172_transaction_counters/metadata.json b/parser/testdata/01172_transaction_counters/metadata.json index a0f4511a0c..13dfdf58b8 100644 --- a/parser/testdata/01172_transaction_counters/metadata.json +++ b/parser/testdata/01172_transaction_counters/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt28": true, - "stmt5": true + "stmt28": true } } diff --git a/parser/testdata/01267_alter_default_key_columns_zookeeper_long/metadata.json b/parser/testdata/01267_alter_default_key_columns_zookeeper_long/metadata.json index 19caa41867..ec09c7e10e 100644 --- a/parser/testdata/01267_alter_default_key_columns_zookeeper_long/metadata.json +++ b/parser/testdata/01267_alter_default_key_columns_zookeeper_long/metadata.json @@ -1,8 +1,6 @@ { "explain_todo": { "stmt11": true, - "stmt12": true, - "stmt15": true, - "stmt16": true + "stmt12": true } } diff --git a/parser/testdata/01319_manual_write_to_replicas_long/metadata.json b/parser/testdata/01319_manual_write_to_replicas_long/metadata.json index 3c3e62f81e..0967ef424b 100644 --- a/parser/testdata/01319_manual_write_to_replicas_long/metadata.json +++ b/parser/testdata/01319_manual_write_to_replicas_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt14":true,"stmt15":true,"stmt16":true,"stmt17":true,"stmt5":true,"stmt6":true}} +{} diff --git a/parser/testdata/01346_alter_enum_partition_key_replicated_zookeeper_long/metadata.json b/parser/testdata/01346_alter_enum_partition_key_replicated_zookeeper_long/metadata.json index f003cd1496..0967ef424b 100644 --- a/parser/testdata/01346_alter_enum_partition_key_replicated_zookeeper_long/metadata.json +++ b/parser/testdata/01346_alter_enum_partition_key_replicated_zookeeper_long/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt16": true, - "stmt18": true, - "stmt28": true, - "stmt30": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/01373_summing_merge_tree_exclude_partition_key/metadata.json b/parser/testdata/01373_summing_merge_tree_exclude_partition_key/metadata.json index 9a504448b8..0967ef424b 100644 --- a/parser/testdata/01373_summing_merge_tree_exclude_partition_key/metadata.json +++ b/parser/testdata/01373_summing_merge_tree_exclude_partition_key/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/01451_detach_drop_part/metadata.json b/parser/testdata/01451_detach_drop_part/metadata.json index b11ed33a45..6228b93763 100644 --- a/parser/testdata/01451_detach_drop_part/metadata.json +++ b/parser/testdata/01451_detach_drop_part/metadata.json @@ -3,8 +3,6 @@ "stmt12": true, "stmt16": true, "stmt17": true, - "stmt21": true, - "stmt3": true, "stmt8": true, "stmt9": true } diff --git a/parser/testdata/01451_replicated_detach_drop_and_quorum_long/metadata.json b/parser/testdata/01451_replicated_detach_drop_and_quorum_long/metadata.json index bc73a18469..f50c9a2149 100644 --- a/parser/testdata/01451_replicated_detach_drop_and_quorum_long/metadata.json +++ b/parser/testdata/01451_replicated_detach_drop_and_quorum_long/metadata.json @@ -1,10 +1,8 @@ { "explain_todo": { "stmt12": true, - "stmt15": true, "stmt16": true, "stmt20": true, - "stmt7": true, "stmt9": true } } diff --git a/parser/testdata/01451_replicated_detach_drop_part_long/metadata.json b/parser/testdata/01451_replicated_detach_drop_part_long/metadata.json index 0221e6509e..0241a67825 100644 --- a/parser/testdata/01451_replicated_detach_drop_part_long/metadata.json +++ b/parser/testdata/01451_replicated_detach_drop_part_long/metadata.json @@ -1,9 +1,7 @@ { "explain_todo": { - "stmt11": true, "stmt12": true, "stmt15": true, - "stmt16": true, "stmt20": true, "stmt21": true, "stmt9": true diff --git a/parser/testdata/01465_ttl_recompression/metadata.json b/parser/testdata/01465_ttl_recompression/metadata.json index 175828c08c..e1bc1f2f25 100644 --- a/parser/testdata/01465_ttl_recompression/metadata.json +++ b/parser/testdata/01465_ttl_recompression/metadata.json @@ -1,11 +1,8 @@ { "explain_todo": { "stmt12": true, - "stmt15": true, "stmt2": true, "stmt20": true, - "stmt21": true, - "stmt26": true, - "stmt4": true + "stmt26": true } } diff --git a/parser/testdata/01493_alter_remove_properties/metadata.json b/parser/testdata/01493_alter_remove_properties/metadata.json index b17251827e..633b943ce3 100644 --- a/parser/testdata/01493_alter_remove_properties/metadata.json +++ b/parser/testdata/01493_alter_remove_properties/metadata.json @@ -6,8 +6,6 @@ "stmt20": true, "stmt24": true, "stmt26": true, - "stmt28": true, - "stmt4": true, "stmt7": true, "stmt9": true } diff --git a/parser/testdata/01493_alter_remove_properties_zookeeper/metadata.json b/parser/testdata/01493_alter_remove_properties_zookeeper/metadata.json index 81e7640e45..b748430a1f 100644 --- a/parser/testdata/01493_alter_remove_properties_zookeeper/metadata.json +++ b/parser/testdata/01493_alter_remove_properties_zookeeper/metadata.json @@ -3,13 +3,9 @@ "stmt11": true, "stmt17": true, "stmt21": true, - "stmt23": true, "stmt30": true, "stmt34": true, - "stmt36": true, "stmt4": true, - "stmt42": true, - "stmt5": true, - "stmt9": true + "stmt5": true } } diff --git a/parser/testdata/01506_ttl_same_with_order_by/metadata.json b/parser/testdata/01506_ttl_same_with_order_by/metadata.json index ddfe49f039..5395f06a45 100644 --- a/parser/testdata/01506_ttl_same_with_order_by/metadata.json +++ b/parser/testdata/01506_ttl_same_with_order_by/metadata.json @@ -1,13 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt16": true, - "stmt20": true, - "stmt21": true, - "stmt23": true, - "stmt28": true, - "stmt3": true, - "stmt32": true, - "stmt7": true + "stmt20": true } } diff --git a/parser/testdata/01509_parallel_quorum_insert_no_replicas_long/metadata.json b/parser/testdata/01509_parallel_quorum_insert_no_replicas_long/metadata.json index dd187bebb4..0967ef424b 100644 --- a/parser/testdata/01509_parallel_quorum_insert_no_replicas_long/metadata.json +++ b/parser/testdata/01509_parallel_quorum_insert_no_replicas_long/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt18": true, - "stmt33": true, - "stmt39": true, - "stmt42": true - } -} +{} diff --git a/parser/testdata/01511_alter_version_versioned_collapsing_merge_tree_zookeeper/metadata.json b/parser/testdata/01511_alter_version_versioned_collapsing_merge_tree_zookeeper/metadata.json index f7390e7500..7ad5569408 100644 --- a/parser/testdata/01511_alter_version_versioned_collapsing_merge_tree_zookeeper/metadata.json +++ b/parser/testdata/01511_alter_version_versioned_collapsing_merge_tree_zookeeper/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt18": true, - "stmt24": true, "stmt9": true } } diff --git a/parser/testdata/01513_count_without_select_sequence_consistency_zookeeper_long/metadata.json b/parser/testdata/01513_count_without_select_sequence_consistency_zookeeper_long/metadata.json index 040f5dd0f0..0967ef424b 100644 --- a/parser/testdata/01513_count_without_select_sequence_consistency_zookeeper_long/metadata.json +++ b/parser/testdata/01513_count_without_select_sequence_consistency_zookeeper_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt11":true,"stmt12":true,"stmt16":true,"stmt18":true}} +{} diff --git a/parser/testdata/01532_execute_merges_on_single_replica_long/metadata.json b/parser/testdata/01532_execute_merges_on_single_replica_long/metadata.json index dcd62a7924..a08759fb21 100644 --- a/parser/testdata/01532_execute_merges_on_single_replica_long/metadata.json +++ b/parser/testdata/01532_execute_merges_on_single_replica_long/metadata.json @@ -1,15 +1,5 @@ { "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt15": true, - "stmt17": true, - "stmt20": true, - "stmt21": true, - "stmt31": true, - "stmt32": true, - "stmt43": true, - "stmt44": true, - "stmt6": true + "stmt21": true } } diff --git a/parser/testdata/01560_optimize_on_insert_zookeeper/metadata.json b/parser/testdata/01560_optimize_on_insert_zookeeper/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/01560_optimize_on_insert_zookeeper/metadata.json +++ b/parser/testdata/01560_optimize_on_insert_zookeeper/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/01571_window_functions/metadata.json b/parser/testdata/01571_window_functions/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01571_window_functions/metadata.json +++ b/parser/testdata/01571_window_functions/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/01581_deduplicate_by_columns_replicated_long/metadata.json b/parser/testdata/01581_deduplicate_by_columns_replicated_long/metadata.json index 1c700bf962..19bb773cd3 100644 --- a/parser/testdata/01581_deduplicate_by_columns_replicated_long/metadata.json +++ b/parser/testdata/01581_deduplicate_by_columns_replicated_long/metadata.json @@ -3,8 +3,6 @@ "stmt13": true, "stmt17": true, "stmt18": true, - "stmt19": true, - "stmt8": true, - "stmt9": true + "stmt19": true } } diff --git a/parser/testdata/01603_insert_select_too_many_parts/metadata.json b/parser/testdata/01603_insert_select_too_many_parts/metadata.json index 51dfabe749..0967ef424b 100644 --- a/parser/testdata/01603_insert_select_too_many_parts/metadata.json +++ b/parser/testdata/01603_insert_select_too_many_parts/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt3":true}} +{} diff --git a/parser/testdata/01605_skip_idx_compact_parts/metadata.json b/parser/testdata/01605_skip_idx_compact_parts/metadata.json index 64e53a7fed..0967ef424b 100644 --- a/parser/testdata/01605_skip_idx_compact_parts/metadata.json +++ b/parser/testdata/01605_skip_idx_compact_parts/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/01606_merge_from_wide_to_compact/metadata.json b/parser/testdata/01606_merge_from_wide_to_compact/metadata.json index 2d5e3329bc..0967ef424b 100644 --- a/parser/testdata/01606_merge_from_wide_to_compact/metadata.json +++ b/parser/testdata/01606_merge_from_wide_to_compact/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt17": true, - "stmt3": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/01643_replicated_merge_tree_fsync_smoke/metadata.json b/parser/testdata/01643_replicated_merge_tree_fsync_smoke/metadata.json index 869b2245e6..0967ef424b 100644 --- a/parser/testdata/01643_replicated_merge_tree_fsync_smoke/metadata.json +++ b/parser/testdata/01643_replicated_merge_tree_fsync_smoke/metadata.json @@ -1,16 +1 @@ -{ - "explain_todo": { - "stmt12": true, - "stmt19": true, - "stmt22": true, - "stmt29": true, - "stmt32": true, - "stmt39": true, - "stmt42": true, - "stmt49": true, - "stmt52": true, - "stmt60": true, - "stmt63": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/01650_drop_part_and_deduplication_zookeeper_long/metadata.json b/parser/testdata/01650_drop_part_and_deduplication_zookeeper_long/metadata.json index 6200de9839..d4d1d99f95 100644 --- a/parser/testdata/01650_drop_part_and_deduplication_zookeeper_long/metadata.json +++ b/parser/testdata/01650_drop_part_and_deduplication_zookeeper_long/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt14": true, - "stmt4": true + "stmt14": true } } diff --git a/parser/testdata/01660_system_parts_smoke/metadata.json b/parser/testdata/01660_system_parts_smoke/metadata.json index fcb05d2f7d..0967ef424b 100644 --- a/parser/testdata/01660_system_parts_smoke/metadata.json +++ b/parser/testdata/01660_system_parts_smoke/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt17": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/01710_order_by_projections_complete/metadata.json b/parser/testdata/01710_order_by_projections_complete/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01710_order_by_projections_complete/metadata.json +++ b/parser/testdata/01710_order_by_projections_complete/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/01710_order_by_projections_incomplete/metadata.json b/parser/testdata/01710_order_by_projections_incomplete/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01710_order_by_projections_incomplete/metadata.json +++ b/parser/testdata/01710_order_by_projections_incomplete/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/01710_projection_fetch_long/metadata.json b/parser/testdata/01710_projection_fetch_long/metadata.json index 3821cdf8c3..8c6a18d871 100644 --- a/parser/testdata/01710_projection_fetch_long/metadata.json +++ b/parser/testdata/01710_projection_fetch_long/metadata.json @@ -1,10 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt19": true, - "stmt20": true, - "stmt24": true, - "stmt6": true, - "stmt9": true + "stmt19": true } } diff --git a/parser/testdata/01710_projection_with_alter_conversions/metadata.json b/parser/testdata/01710_projection_with_alter_conversions/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/01710_projection_with_alter_conversions/metadata.json +++ b/parser/testdata/01710_projection_with_alter_conversions/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/01710_projections_order_by_complete/metadata.json b/parser/testdata/01710_projections_order_by_complete/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01710_projections_order_by_complete/metadata.json +++ b/parser/testdata/01710_projections_order_by_complete/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/01710_projections_order_by_incomplete/metadata.json b/parser/testdata/01710_projections_order_by_incomplete/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01710_projections_order_by_incomplete/metadata.json +++ b/parser/testdata/01710_projections_order_by_incomplete/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/01765_move_to_table_overlapping_block_number/metadata.json b/parser/testdata/01765_move_to_table_overlapping_block_number/metadata.json index 7330ce8212..ab9202e88e 100644 --- a/parser/testdata/01765_move_to_table_overlapping_block_number/metadata.json +++ b/parser/testdata/01765_move_to_table_overlapping_block_number/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt11": true, - "stmt5": true, - "stmt6": true + "stmt11": true } } diff --git a/parser/testdata/01780_column_sparse_distinct/metadata.json b/parser/testdata/01780_column_sparse_distinct/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/01780_column_sparse_distinct/metadata.json +++ b/parser/testdata/01780_column_sparse_distinct/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/01780_column_sparse_filter/metadata.json b/parser/testdata/01780_column_sparse_filter/metadata.json index a133290734..0967ef424b 100644 --- a/parser/testdata/01780_column_sparse_filter/metadata.json +++ b/parser/testdata/01780_column_sparse_filter/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt8":true}} +{} diff --git a/parser/testdata/01780_column_sparse_full/metadata.json b/parser/testdata/01780_column_sparse_full/metadata.json index 94415ded89..0967ef424b 100644 --- a/parser/testdata/01780_column_sparse_full/metadata.json +++ b/parser/testdata/01780_column_sparse_full/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt47": true - } -} +{} diff --git a/parser/testdata/01781_merge_tree_deduplication/metadata.json b/parser/testdata/01781_merge_tree_deduplication/metadata.json index 6ed51d7100..c52ae2d780 100644 --- a/parser/testdata/01781_merge_tree_deduplication/metadata.json +++ b/parser/testdata/01781_merge_tree_deduplication/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, "stmt31": true, "stmt34": true } diff --git a/parser/testdata/01825_new_type_json_insert_select/metadata.json b/parser/testdata/01825_new_type_json_insert_select/metadata.json index 9b2cd434ee..0967ef424b 100644 --- a/parser/testdata/01825_new_type_json_insert_select/metadata.json +++ b/parser/testdata/01825_new_type_json_insert_select/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt29": true - } -} +{} diff --git a/parser/testdata/01825_new_type_json_missed_values/metadata.json b/parser/testdata/01825_new_type_json_missed_values/metadata.json index cc2f3624ef..0967ef424b 100644 --- a/parser/testdata/01825_new_type_json_missed_values/metadata.json +++ b/parser/testdata/01825_new_type_json_missed_values/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt4":true}} +{} diff --git a/parser/testdata/01825_replacing_vertical_merge/metadata.json b/parser/testdata/01825_replacing_vertical_merge/metadata.json index 05aa6dfc72..0967ef424b 100644 --- a/parser/testdata/01825_replacing_vertical_merge/metadata.json +++ b/parser/testdata/01825_replacing_vertical_merge/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/01882_check_max_parts_to_merge_at_once/metadata.json b/parser/testdata/01882_check_max_parts_to_merge_at_once/metadata.json index 92efb02376..0967ef424b 100644 --- a/parser/testdata/01882_check_max_parts_to_merge_at_once/metadata.json +++ b/parser/testdata/01882_check_max_parts_to_merge_at_once/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02070_join_on_disk/metadata.json b/parser/testdata/02070_join_on_disk/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/02070_join_on_disk/metadata.json +++ b/parser/testdata/02070_join_on_disk/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/02124_insert_deduplication_token_replica/metadata.json b/parser/testdata/02124_insert_deduplication_token_replica/metadata.json index 9be7220609..0967ef424b 100644 --- a/parser/testdata/02124_insert_deduplication_token_replica/metadata.json +++ b/parser/testdata/02124_insert_deduplication_token_replica/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt22": true - } -} +{} diff --git a/parser/testdata/02129_add_column_add_ttl/metadata.json b/parser/testdata/02129_add_column_add_ttl/metadata.json index da68e722d3..d94e324dee 100644 --- a/parser/testdata/02129_add_column_add_ttl/metadata.json +++ b/parser/testdata/02129_add_column_add_ttl/metadata.json @@ -1,10 +1,7 @@ { "explain_todo": { - "stmt13": true, "stmt15": true, "stmt17": true, - "stmt20": true, - "stmt3": true, "stmt5": true, "stmt7": true } diff --git a/parser/testdata/02149_read_in_order_fixed_prefix/metadata.json b/parser/testdata/02149_read_in_order_fixed_prefix/metadata.json index dc0702ac62..0967ef424b 100644 --- a/parser/testdata/02149_read_in_order_fixed_prefix/metadata.json +++ b/parser/testdata/02149_read_in_order_fixed_prefix/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt30": true - } -} +{} diff --git a/parser/testdata/02235_check_table_sparse_serialization/metadata.json b/parser/testdata/02235_check_table_sparse_serialization/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/02235_check_table_sparse_serialization/metadata.json +++ b/parser/testdata/02235_check_table_sparse_serialization/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/02306_part_types_profile_events/metadata.json b/parser/testdata/02306_part_types_profile_events/metadata.json index 148900a70b..0967ef424b 100644 --- a/parser/testdata/02306_part_types_profile_events/metadata.json +++ b/parser/testdata/02306_part_types_profile_events/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt3": true, - "stmt7": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/02319_sql_standard_create_drop_index/metadata.json b/parser/testdata/02319_sql_standard_create_drop_index/metadata.json index f90bc78c7d..8352758dc3 100644 --- a/parser/testdata/02319_sql_standard_create_drop_index/metadata.json +++ b/parser/testdata/02319_sql_standard_create_drop_index/metadata.json @@ -3,10 +3,8 @@ "stmt14": true, "stmt15": true, "stmt16": true, - "stmt18": true, "stmt21": true, "stmt22": true, - "stmt24": true, "stmt3": true, "stmt4": true, "stmt5": true, diff --git a/parser/testdata/02343_aggregation_pipeline/metadata.json b/parser/testdata/02343_aggregation_pipeline/metadata.json index c3cc276ac4..0967ef424b 100644 --- a/parser/testdata/02343_aggregation_pipeline/metadata.json +++ b/parser/testdata/02343_aggregation_pipeline/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt30": true, - "stmt32": true - } -} +{} diff --git a/parser/testdata/02346_exclude_materialize_skip_indexes_on_insert/metadata.json b/parser/testdata/02346_exclude_materialize_skip_indexes_on_insert/metadata.json index 9d756c4e47..dbdbb76d4f 100644 --- a/parser/testdata/02346_exclude_materialize_skip_indexes_on_insert/metadata.json +++ b/parser/testdata/02346_exclude_materialize_skip_indexes_on_insert/metadata.json @@ -1,10 +1,5 @@ { "explain_todo": { - "stmt13": true, - "stmt28": true, - "stmt40": true, - "stmt46": true, - "stmt6": true, - "stmt8": true + "stmt6": true } } diff --git a/parser/testdata/02346_exclude_materialize_skip_indexes_on_merge/metadata.json b/parser/testdata/02346_exclude_materialize_skip_indexes_on_merge/metadata.json index 253a246a39..ab9202e88e 100644 --- a/parser/testdata/02346_exclude_materialize_skip_indexes_on_merge/metadata.json +++ b/parser/testdata/02346_exclude_materialize_skip_indexes_on_merge/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt19": true + "stmt11": true } } diff --git a/parser/testdata/02346_text_index_coalescingmergetree/metadata.json b/parser/testdata/02346_text_index_coalescingmergetree/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/02346_text_index_coalescingmergetree/metadata.json +++ b/parser/testdata/02346_text_index_coalescingmergetree/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/02346_text_index_function_hasAnyAllTokens_partially_materialized/metadata.json b/parser/testdata/02346_text_index_function_hasAnyAllTokens_partially_materialized/metadata.json index ff21137769..4a9c77f822 100644 --- a/parser/testdata/02346_text_index_function_hasAnyAllTokens_partially_materialized/metadata.json +++ b/parser/testdata/02346_text_index_function_hasAnyAllTokens_partially_materialized/metadata.json @@ -2,7 +2,6 @@ "explain_todo": { "stmt11": true, "stmt26": true, - "stmt8": true, - "stmt9": true + "stmt8": true } } diff --git a/parser/testdata/02346_text_index_header_cache/metadata.json b/parser/testdata/02346_text_index_header_cache/metadata.json index 54590bc988..62b81668c3 100644 --- a/parser/testdata/02346_text_index_header_cache/metadata.json +++ b/parser/testdata/02346_text_index_header_cache/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt11": true, "stmt13": true } } diff --git a/parser/testdata/02346_text_index_replacingmergetree/metadata.json b/parser/testdata/02346_text_index_replacingmergetree/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/02346_text_index_replacingmergetree/metadata.json +++ b/parser/testdata/02346_text_index_replacingmergetree/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/02346_text_index_summingmergetree/metadata.json b/parser/testdata/02346_text_index_summingmergetree/metadata.json index 3edcdcc673..0967ef424b 100644 --- a/parser/testdata/02346_text_index_summingmergetree/metadata.json +++ b/parser/testdata/02346_text_index_summingmergetree/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt17": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/02352_lightweight_delete_on_replicated_merge_tree/metadata.json b/parser/testdata/02352_lightweight_delete_on_replicated_merge_tree/metadata.json index 62750a1af1..32ea289b32 100644 --- a/parser/testdata/02352_lightweight_delete_on_replicated_merge_tree/metadata.json +++ b/parser/testdata/02352_lightweight_delete_on_replicated_merge_tree/metadata.json @@ -6,7 +6,6 @@ "stmt23": true, "stmt28": true, "stmt34": true, - "stmt37": true, "stmt7": true } } diff --git a/parser/testdata/02377_majority_insert_quorum_zookeeper_long/metadata.json b/parser/testdata/02377_majority_insert_quorum_zookeeper_long/metadata.json index 2b7fd738db..0967ef424b 100644 --- a/parser/testdata/02377_majority_insert_quorum_zookeeper_long/metadata.json +++ b/parser/testdata/02377_majority_insert_quorum_zookeeper_long/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt20":true,"stmt25":true,"stmt26":true,"stmt28":true,"stmt29":true,"stmt35":true,"stmt36":true,"stmt37":true,"stmt38":true,"stmt42":true,"stmt43":true}} +{} diff --git a/parser/testdata/02378_part_log_profile_events_replicated/metadata.json b/parser/testdata/02378_part_log_profile_events_replicated/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/02378_part_log_profile_events_replicated/metadata.json +++ b/parser/testdata/02378_part_log_profile_events_replicated/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/02381_analyzer_join_final/metadata.json b/parser/testdata/02381_analyzer_join_final/metadata.json index ac43084f1a..1a3f93296f 100644 --- a/parser/testdata/02381_analyzer_join_final/metadata.json +++ b/parser/testdata/02381_analyzer_join_final/metadata.json @@ -2,8 +2,6 @@ "explain_todo": { "stmt12": true, "stmt3": true, - "stmt4": true, - "stmt8": true, - "stmt9": true + "stmt8": true } } diff --git a/parser/testdata/02403_ttl_column_multiple_times/metadata.json b/parser/testdata/02403_ttl_column_multiple_times/metadata.json index 704bc73831..ef58f80315 100644 --- a/parser/testdata/02403_ttl_column_multiple_times/metadata.json +++ b/parser/testdata/02403_ttl_column_multiple_times/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt2": true, - "stmt3": true, - "stmt6": true + "stmt2": true } } diff --git a/parser/testdata/02404_memory_bound_merging/metadata.json b/parser/testdata/02404_memory_bound_merging/metadata.json index 7ad5569408..0967ef424b 100644 --- a/parser/testdata/02404_memory_bound_merging/metadata.json +++ b/parser/testdata/02404_memory_bound_merging/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt9": true - } -} +{} diff --git a/parser/testdata/02420_final_setting/metadata.json b/parser/testdata/02420_final_setting/metadata.json index e9d6e46171..0967ef424b 100644 --- a/parser/testdata/02420_final_setting/metadata.json +++ b/parser/testdata/02420_final_setting/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt1": true - } -} +{} diff --git a/parser/testdata/02420_final_setting_analyzer/metadata.json b/parser/testdata/02420_final_setting_analyzer/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/02420_final_setting_analyzer/metadata.json +++ b/parser/testdata/02420_final_setting_analyzer/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/02427_mutate_and_zero_copy_replication_zookeeper/metadata.json b/parser/testdata/02427_mutate_and_zero_copy_replication_zookeeper/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/02427_mutate_and_zero_copy_replication_zookeeper/metadata.json +++ b/parser/testdata/02427_mutate_and_zero_copy_replication_zookeeper/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/02438_sync_replica_lightweight/metadata.json b/parser/testdata/02438_sync_replica_lightweight/metadata.json index d47c182b44..0c9bf6642a 100644 --- a/parser/testdata/02438_sync_replica_lightweight/metadata.json +++ b/parser/testdata/02438_sync_replica_lightweight/metadata.json @@ -2,13 +2,8 @@ "explain_todo": { "stmt10": true, "stmt15": true, - "stmt17": true, "stmt18": true, - "stmt23": true, - "stmt24": true, "stmt26": true, - "stmt28": true, - "stmt5": true, - "stmt6": true + "stmt28": true } } diff --git a/parser/testdata/02440_mutations_finalization/metadata.json b/parser/testdata/02440_mutations_finalization/metadata.json index 237fb29d82..dbdbb76d4f 100644 --- a/parser/testdata/02440_mutations_finalization/metadata.json +++ b/parser/testdata/02440_mutations_finalization/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt18": true, - "stmt4": true, "stmt6": true } } diff --git a/parser/testdata/02441_alter_delete_and_drop_column/metadata.json b/parser/testdata/02441_alter_delete_and_drop_column/metadata.json index 8c68f6f93f..84f57deaf2 100644 --- a/parser/testdata/02441_alter_delete_and_drop_column/metadata.json +++ b/parser/testdata/02441_alter_delete_and_drop_column/metadata.json @@ -1,8 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt14": true, - "stmt3": true, "stmt5": true, "stmt7": true, "stmt9": true diff --git a/parser/testdata/02442_auxiliary_zookeeper_endpoint_id/metadata.json b/parser/testdata/02442_auxiliary_zookeeper_endpoint_id/metadata.json index 299d9b76de..0967ef424b 100644 --- a/parser/testdata/02442_auxiliary_zookeeper_endpoint_id/metadata.json +++ b/parser/testdata/02442_auxiliary_zookeeper_endpoint_id/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt9":true}} +{} diff --git a/parser/testdata/02448_clone_replica_lost_part/metadata.json b/parser/testdata/02448_clone_replica_lost_part/metadata.json index 18d05d78c5..4ecdbbd83a 100644 --- a/parser/testdata/02448_clone_replica_lost_part/metadata.json +++ b/parser/testdata/02448_clone_replica_lost_part/metadata.json @@ -1,33 +1,6 @@ { "explain_todo": { - "stmt15": true, - "stmt19": true, - "stmt20": true, - "stmt25": true, - "stmt28": true, - "stmt30": true, - "stmt33": true, - "stmt38": true, - "stmt41": true, - "stmt43": true, - "stmt45": true, - "stmt46": true, - "stmt49": true, "stmt51": true, - "stmt54": true, - "stmt6": true, - "stmt60": true, - "stmt63": true, - "stmt65": true, - "stmt67": true, - "stmt68": true, - "stmt76": true, - "stmt77": true, - "stmt80": true, - "stmt84": true, - "stmt87": true, - "stmt9": true, - "stmt91": true, - "stmt92": true + "stmt80": true } } diff --git a/parser/testdata/02458_relax_too_many_parts/metadata.json b/parser/testdata/02458_relax_too_many_parts/metadata.json index 41b08840da..99353c8390 100644 --- a/parser/testdata/02458_relax_too_many_parts/metadata.json +++ b/parser/testdata/02458_relax_too_many_parts/metadata.json @@ -1,11 +1,6 @@ { "explain_todo": { - "stmt10": true, "stmt11": true, - "stmt12": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt4": true + "stmt17": true } } diff --git a/parser/testdata/02486_truncate_and_unexpected_parts/metadata.json b/parser/testdata/02486_truncate_and_unexpected_parts/metadata.json index 913cbdab24..6873a1115c 100644 --- a/parser/testdata/02486_truncate_and_unexpected_parts/metadata.json +++ b/parser/testdata/02486_truncate_and_unexpected_parts/metadata.json @@ -1,22 +1,10 @@ { "explain_todo": { - "stmt16": true, - "stmt17": true, - "stmt21": true, - "stmt22": true, "stmt24": true, "stmt25": true, "stmt26": true, - "stmt3": true, - "stmt33": true, - "stmt34": true, - "stmt35": true, - "stmt4": true, - "stmt42": true, "stmt43": true, "stmt44": true, - "stmt6": true, - "stmt8": true, - "stmt9": true + "stmt6": true } } diff --git a/parser/testdata/02487_create_index_normalize_functions/metadata.json b/parser/testdata/02487_create_index_normalize_functions/metadata.json index fffcb7d38b..bc141058a4 100644 --- a/parser/testdata/02487_create_index_normalize_functions/metadata.json +++ b/parser/testdata/02487_create_index_normalize_functions/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt2": true, - "stmt3": true, - "stmt4": true + "stmt3": true } } diff --git a/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json b/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json index 2b6f0b10aa..0967ef424b 100644 --- a/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json +++ b/parser/testdata/02490_replacing_merge_tree_is_deleted_column/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt58": true, - "stmt65": true - } -} +{} diff --git a/parser/testdata/02490_replacing_merge_tree_is_deleted_column_transform_opt/metadata.json b/parser/testdata/02490_replacing_merge_tree_is_deleted_column_transform_opt/metadata.json index 999bd4cf7d..6646caa1da 100644 --- a/parser/testdata/02490_replacing_merge_tree_is_deleted_column_transform_opt/metadata.json +++ b/parser/testdata/02490_replacing_merge_tree_is_deleted_column_transform_opt/metadata.json @@ -1,8 +1,6 @@ { "explain_todo": { - "stmt20": true, "stmt21": true, - "stmt5": true, - "stmt6": true + "stmt5": true } } diff --git a/parser/testdata/02494_query_cache_sparse_columns/metadata.json b/parser/testdata/02494_query_cache_sparse_columns/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/02494_query_cache_sparse_columns/metadata.json +++ b/parser/testdata/02494_query_cache_sparse_columns/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/02494_query_cache_squash_partial_results/metadata.json b/parser/testdata/02494_query_cache_squash_partial_results/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/02494_query_cache_squash_partial_results/metadata.json +++ b/parser/testdata/02494_query_cache_squash_partial_results/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/02520_group_array_last/metadata.json b/parser/testdata/02520_group_array_last/metadata.json index 5395f06a45..0967ef424b 100644 --- a/parser/testdata/02520_group_array_last/metadata.json +++ b/parser/testdata/02520_group_array_last/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt20": true - } -} +{} diff --git a/parser/testdata/02521_aggregation_by_partitions/metadata.json b/parser/testdata/02521_aggregation_by_partitions/metadata.json index 2522c47663..0967ef424b 100644 --- a/parser/testdata/02521_aggregation_by_partitions/metadata.json +++ b/parser/testdata/02521_aggregation_by_partitions/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt17": true, - "stmt24": true, - "stmt34": true, - "stmt41": true, - "stmt48": true - } -} +{} diff --git a/parser/testdata/02538_alter_rename_sequence/metadata.json b/parser/testdata/02538_alter_rename_sequence/metadata.json index b5186dd4db..d0820085d8 100644 --- a/parser/testdata/02538_alter_rename_sequence/metadata.json +++ b/parser/testdata/02538_alter_rename_sequence/metadata.json @@ -1,14 +1,8 @@ { "explain_todo": { "stmt10": true, - "stmt15": true, "stmt16": true, - "stmt19": true, - "stmt20": true, "stmt21": true, - "stmt4": true, - "stmt5": true, - "stmt8": true, - "stmt9": true + "stmt5": true } } diff --git a/parser/testdata/02552_sparse_columns_intersect/metadata.json b/parser/testdata/02552_sparse_columns_intersect/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/02552_sparse_columns_intersect/metadata.json +++ b/parser/testdata/02552_sparse_columns_intersect/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/02561_sorting_constants_and_distinct_crash/metadata.json b/parser/testdata/02561_sorting_constants_and_distinct_crash/metadata.json index c84e30800d..0967ef424b 100644 --- a/parser/testdata/02561_sorting_constants_and_distinct_crash/metadata.json +++ b/parser/testdata/02561_sorting_constants_and_distinct_crash/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/02581_share_big_sets_between_multiple_mutations_tasks_long/metadata.json b/parser/testdata/02581_share_big_sets_between_multiple_mutations_tasks_long/metadata.json index 563c366a34..5d56c00740 100644 --- a/parser/testdata/02581_share_big_sets_between_multiple_mutations_tasks_long/metadata.json +++ b/parser/testdata/02581_share_big_sets_between_multiple_mutations_tasks_long/metadata.json @@ -4,9 +4,7 @@ "stmt11": true, "stmt12": true, "stmt13": true, - "stmt14": true, "stmt16": true, - "stmt2": true, - "stmt9": true + "stmt2": true } } diff --git a/parser/testdata/02582_async_reading_with_small_limit/metadata.json b/parser/testdata/02582_async_reading_with_small_limit/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/02582_async_reading_with_small_limit/metadata.json +++ b/parser/testdata/02582_async_reading_with_small_limit/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/02674_trivial_count_analyzer/metadata.json b/parser/testdata/02674_trivial_count_analyzer/metadata.json index ca584b3e28..0967ef424b 100644 --- a/parser/testdata/02674_trivial_count_analyzer/metadata.json +++ b/parser/testdata/02674_trivial_count_analyzer/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt17": true - } -} +{} diff --git a/parser/testdata/02730_with_fill_by_sorting_prefix/metadata.json b/parser/testdata/02730_with_fill_by_sorting_prefix/metadata.json index cfed205404..21e49f8743 100644 --- a/parser/testdata/02730_with_fill_by_sorting_prefix/metadata.json +++ b/parser/testdata/02730_with_fill_by_sorting_prefix/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt13": true, - "stmt16": true, "stmt19": true, "stmt20": true, "stmt21": true, @@ -16,7 +15,6 @@ "stmt30": true, "stmt31": true, "stmt32": true, - "stmt6": true, - "stmt9": true + "stmt6": true } } diff --git a/parser/testdata/02780_final_streams_data_skipping_index/metadata.json b/parser/testdata/02780_final_streams_data_skipping_index/metadata.json index 6e3949479a..f6d9f2395b 100644 --- a/parser/testdata/02780_final_streams_data_skipping_index/metadata.json +++ b/parser/testdata/02780_final_streams_data_skipping_index/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, "stmt7": true, "stmt8": true } diff --git a/parser/testdata/02781_data_skipping_index_merge_tree_min_for_seek/metadata.json b/parser/testdata/02781_data_skipping_index_merge_tree_min_for_seek/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/02781_data_skipping_index_merge_tree_min_for_seek/metadata.json +++ b/parser/testdata/02781_data_skipping_index_merge_tree_min_for_seek/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/02788_fix_logical_error_in_sorting/metadata.json b/parser/testdata/02788_fix_logical_error_in_sorting/metadata.json index 9cdc3449e7..c45b7602ba 100644 --- a/parser/testdata/02788_fix_logical_error_in_sorting/metadata.json +++ b/parser/testdata/02788_fix_logical_error_in_sorting/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt6": true, - "stmt7": true + "stmt12": true } } diff --git a/parser/testdata/02791_final_block_structure_mismatch_bug/metadata.json b/parser/testdata/02791_final_block_structure_mismatch_bug/metadata.json index cf0a878350..23f93c7c50 100644 --- a/parser/testdata/02791_final_block_structure_mismatch_bug/metadata.json +++ b/parser/testdata/02791_final_block_structure_mismatch_bug/metadata.json @@ -1,9 +1,6 @@ { "explain_todo": { - "stmt10": true, "stmt14": true, - "stmt22": true, - "stmt26": true, - "stmt34": true + "stmt26": true } } diff --git a/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json b/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json +++ b/parser/testdata/02862_sorted_distinct_sparse_fix/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/02869_parallel_replicas_read_from_several/metadata.json b/parser/testdata/02869_parallel_replicas_read_from_several/metadata.json index fafe59c741..0967ef424b 100644 --- a/parser/testdata/02869_parallel_replicas_read_from_several/metadata.json +++ b/parser/testdata/02869_parallel_replicas_read_from_several/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt16":true,"stmt17":true,"stmt18":true}} +{} diff --git a/parser/testdata/02872_prewhere_filter/metadata.json b/parser/testdata/02872_prewhere_filter/metadata.json index 51dfabe749..0967ef424b 100644 --- a/parser/testdata/02872_prewhere_filter/metadata.json +++ b/parser/testdata/02872_prewhere_filter/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt3":true}} +{} diff --git a/parser/testdata/02882_replicated_fetch_checksums_doesnt_match/metadata.json b/parser/testdata/02882_replicated_fetch_checksums_doesnt_match/metadata.json index 3fd29a133b..7ad5569408 100644 --- a/parser/testdata/02882_replicated_fetch_checksums_doesnt_match/metadata.json +++ b/parser/testdata/02882_replicated_fetch_checksums_doesnt_match/metadata.json @@ -1,11 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt17": true, - "stmt18": true, - "stmt7": true, - "stmt8": true, "stmt9": true } } diff --git a/parser/testdata/02892_SummingMergeTree_Nested/metadata.json b/parser/testdata/02892_SummingMergeTree_Nested/metadata.json index 64e53a7fed..0967ef424b 100644 --- a/parser/testdata/02892_SummingMergeTree_Nested/metadata.json +++ b/parser/testdata/02892_SummingMergeTree_Nested/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/02898_parallel_replicas_progress_bar/metadata.json b/parser/testdata/02898_parallel_replicas_progress_bar/metadata.json index 464e92ccb3..0967ef424b 100644 --- a/parser/testdata/02898_parallel_replicas_progress_bar/metadata.json +++ b/parser/testdata/02898_parallel_replicas_progress_bar/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true - } -} +{} diff --git a/parser/testdata/02916_replication_protocol_wait_for_part/metadata.json b/parser/testdata/02916_replication_protocol_wait_for_part/metadata.json index 3a2014fe8c..0967ef424b 100644 --- a/parser/testdata/02916_replication_protocol_wait_for_part/metadata.json +++ b/parser/testdata/02916_replication_protocol_wait_for_part/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt6":true}} +{} diff --git a/parser/testdata/02920_alter_column_of_projections/metadata.json b/parser/testdata/02920_alter_column_of_projections/metadata.json index 6b88c8032f..c45b7602ba 100644 --- a/parser/testdata/02920_alter_column_of_projections/metadata.json +++ b/parser/testdata/02920_alter_column_of_projections/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt10": true, - "stmt12": true, - "stmt6": true + "stmt12": true } } diff --git a/parser/testdata/02920_rename_column_of_skip_indices/metadata.json b/parser/testdata/02920_rename_column_of_skip_indices/metadata.json index a74c293460..7ad5569408 100644 --- a/parser/testdata/02920_rename_column_of_skip_indices/metadata.json +++ b/parser/testdata/02920_rename_column_of_skip_indices/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt4": true, - "stmt8": true, "stmt9": true } } diff --git a/parser/testdata/02941_projections_external_aggregation/metadata.json b/parser/testdata/02941_projections_external_aggregation/metadata.json index 18bf6c82ad..7b4455cd5f 100644 --- a/parser/testdata/02941_projections_external_aggregation/metadata.json +++ b/parser/testdata/02941_projections_external_aggregation/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt15": true, - "stmt16": true, - "stmt4": true + "stmt16": true } } diff --git a/parser/testdata/02946_merge_tree_final_split_ranges_by_primary_key/metadata.json b/parser/testdata/02946_merge_tree_final_split_ranges_by_primary_key/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/02946_merge_tree_final_split_ranges_by_primary_key/metadata.json +++ b/parser/testdata/02946_merge_tree_final_split_ranges_by_primary_key/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/02946_parallel_replicas_force_primary_key/metadata.json b/parser/testdata/02946_parallel_replicas_force_primary_key/metadata.json index 65f94d4845..0967ef424b 100644 --- a/parser/testdata/02946_parallel_replicas_force_primary_key/metadata.json +++ b/parser/testdata/02946_parallel_replicas_force_primary_key/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt10":true,"stmt11":true,"stmt12":true}} +{} diff --git a/parser/testdata/02947_merge_tree_index_table_1/metadata.json b/parser/testdata/02947_merge_tree_index_table_1/metadata.json index 638822386f..0967ef424b 100644 --- a/parser/testdata/02947_merge_tree_index_table_1/metadata.json +++ b/parser/testdata/02947_merge_tree_index_table_1/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt3": true - } -} +{} diff --git a/parser/testdata/02947_merge_tree_index_table_2/metadata.json b/parser/testdata/02947_merge_tree_index_table_2/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/02947_merge_tree_index_table_2/metadata.json +++ b/parser/testdata/02947_merge_tree_index_table_2/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/02947_merge_tree_index_table_4/metadata.json b/parser/testdata/02947_merge_tree_index_table_4/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/02947_merge_tree_index_table_4/metadata.json +++ b/parser/testdata/02947_merge_tree_index_table_4/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/02989_replicated_merge_tree_invalid_metadata_version/metadata.json b/parser/testdata/02989_replicated_merge_tree_invalid_metadata_version/metadata.json index f4c74e32be..0967ef424b 100644 --- a/parser/testdata/02989_replicated_merge_tree_invalid_metadata_version/metadata.json +++ b/parser/testdata/02989_replicated_merge_tree_invalid_metadata_version/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt10": true - } -} +{} diff --git a/parser/testdata/02990_parts_splitter_invalid_ranges/metadata.json b/parser/testdata/02990_parts_splitter_invalid_ranges/metadata.json index bc141058a4..ef58f80315 100644 --- a/parser/testdata/02990_parts_splitter_invalid_ranges/metadata.json +++ b/parser/testdata/02990_parts_splitter_invalid_ranges/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt2": true, - "stmt3": true + "stmt2": true } } diff --git a/parser/testdata/03001_insert_threads_deduplication/metadata.json b/parser/testdata/03001_insert_threads_deduplication/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/03001_insert_threads_deduplication/metadata.json +++ b/parser/testdata/03001_insert_threads_deduplication/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/03008_filter_projections_non_deterministoc_functions/metadata.json b/parser/testdata/03008_filter_projections_non_deterministoc_functions/metadata.json index af48d4c110..0967ef424b 100644 --- a/parser/testdata/03008_filter_projections_non_deterministoc_functions/metadata.json +++ b/parser/testdata/03008_filter_projections_non_deterministoc_functions/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt2":true}} +{} diff --git a/parser/testdata/03031_read_in_order_optimization_with_virtual_row/metadata.json b/parser/testdata/03031_read_in_order_optimization_with_virtual_row/metadata.json index 49c4c012a1..0967ef424b 100644 --- a/parser/testdata/03031_read_in_order_optimization_with_virtual_row/metadata.json +++ b/parser/testdata/03031_read_in_order_optimization_with_virtual_row/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt27": true, - "stmt34": true, - "stmt42": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03031_read_in_order_optimization_with_virtual_row_explain/metadata.json b/parser/testdata/03031_read_in_order_optimization_with_virtual_row_explain/metadata.json index 05aa6dfc72..342b3ff5b4 100644 --- a/parser/testdata/03031_read_in_order_optimization_with_virtual_row_explain/metadata.json +++ b/parser/testdata/03031_read_in_order_optimization_with_virtual_row_explain/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt4": true, "stmt8": true } } diff --git a/parser/testdata/03033_final_undefined_last_mark/metadata.json b/parser/testdata/03033_final_undefined_last_mark/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/03033_final_undefined_last_mark/metadata.json +++ b/parser/testdata/03033_final_undefined_last_mark/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/03033_lightweight_deletes_sync/metadata.json b/parser/testdata/03033_lightweight_deletes_sync/metadata.json index 6496220083..05aa6dfc72 100644 --- a/parser/testdata/03033_lightweight_deletes_sync/metadata.json +++ b/parser/testdata/03033_lightweight_deletes_sync/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt4": true, - "stmt7": true, "stmt8": true } } diff --git a/parser/testdata/03033_parts_splitter_bug_and_index_loading/metadata.json b/parser/testdata/03033_parts_splitter_bug_and_index_loading/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/03033_parts_splitter_bug_and_index_loading/metadata.json +++ b/parser/testdata/03033_parts_splitter_bug_and_index_loading/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_1_horizontal_compact_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_1_horizontal_compact_merge_tree/metadata.json index c22bd21ef6..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_1_horizontal_compact_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_1_horizontal_compact_merge_tree/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt19": true, - "stmt23": true, - "stmt27": true, - "stmt31": true, - "stmt35": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_1_horizontal_compact_wide_tree/metadata.json b/parser/testdata/03037_dynamic_merges_1_horizontal_compact_wide_tree/metadata.json index c22bd21ef6..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_1_horizontal_compact_wide_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_1_horizontal_compact_wide_tree/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt19": true, - "stmt23": true, - "stmt27": true, - "stmt31": true, - "stmt35": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_1_vertical_compact_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_1_vertical_compact_merge_tree/metadata.json index c22bd21ef6..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_1_vertical_compact_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_1_vertical_compact_merge_tree/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt19": true, - "stmt23": true, - "stmt27": true, - "stmt31": true, - "stmt35": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_1_vertical_wide_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_1_vertical_wide_merge_tree/metadata.json index c22bd21ef6..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_1_vertical_wide_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_1_vertical_wide_merge_tree/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt19": true, - "stmt23": true, - "stmt27": true, - "stmt31": true, - "stmt35": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_2_horizontal_compact_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_2_horizontal_compact_merge_tree/metadata.json index 05aa6dfc72..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_2_horizontal_compact_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_2_horizontal_compact_merge_tree/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_2_horizontal_wide_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_2_horizontal_wide_merge_tree/metadata.json index 05aa6dfc72..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_2_horizontal_wide_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_2_horizontal_wide_merge_tree/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_2_vertical_compact_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_2_vertical_compact_merge_tree/metadata.json index 05aa6dfc72..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_2_vertical_compact_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_2_vertical_compact_merge_tree/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03037_dynamic_merges_2_vertical_wide_merge_tree/metadata.json b/parser/testdata/03037_dynamic_merges_2_vertical_wide_merge_tree/metadata.json index 05aa6dfc72..0967ef424b 100644 --- a/parser/testdata/03037_dynamic_merges_2_vertical_wide_merge_tree/metadata.json +++ b/parser/testdata/03037_dynamic_merges_2_vertical_wide_merge_tree/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03038_nested_dynamic_merges_compact_horizontal/metadata.json b/parser/testdata/03038_nested_dynamic_merges_compact_horizontal/metadata.json index 44bcd37eb6..0967ef424b 100644 --- a/parser/testdata/03038_nested_dynamic_merges_compact_horizontal/metadata.json +++ b/parser/testdata/03038_nested_dynamic_merges_compact_horizontal/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt17": true, - "stmt22": true, - "stmt26": true, - "stmt30": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/03038_nested_dynamic_merges_compact_vertical/metadata.json b/parser/testdata/03038_nested_dynamic_merges_compact_vertical/metadata.json index 44bcd37eb6..0967ef424b 100644 --- a/parser/testdata/03038_nested_dynamic_merges_compact_vertical/metadata.json +++ b/parser/testdata/03038_nested_dynamic_merges_compact_vertical/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt17": true, - "stmt22": true, - "stmt26": true, - "stmt30": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/03038_nested_dynamic_merges_wide_horizontal/metadata.json b/parser/testdata/03038_nested_dynamic_merges_wide_horizontal/metadata.json index 44bcd37eb6..0967ef424b 100644 --- a/parser/testdata/03038_nested_dynamic_merges_wide_horizontal/metadata.json +++ b/parser/testdata/03038_nested_dynamic_merges_wide_horizontal/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt17": true, - "stmt22": true, - "stmt26": true, - "stmt30": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/03038_nested_dynamic_merges_wide_vertical/metadata.json b/parser/testdata/03038_nested_dynamic_merges_wide_vertical/metadata.json index 44bcd37eb6..0967ef424b 100644 --- a/parser/testdata/03038_nested_dynamic_merges_wide_vertical/metadata.json +++ b/parser/testdata/03038_nested_dynamic_merges_wide_vertical/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt13": true, - "stmt17": true, - "stmt22": true, - "stmt26": true, - "stmt30": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/03047_on_fly_mutations_events/metadata.json b/parser/testdata/03047_on_fly_mutations_events/metadata.json index 3ae016286f..7f674aae32 100644 --- a/parser/testdata/03047_on_fly_mutations_events/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_events/metadata.json @@ -1,12 +1,8 @@ { "explain_todo": { - "stmt11": true, "stmt12": true, - "stmt13": true, "stmt15": true, - "stmt18": true, "stmt19": true, - "stmt5": true, "stmt8": true, "stmt9": true } diff --git a/parser/testdata/03047_on_fly_mutations_materialized/metadata.json b/parser/testdata/03047_on_fly_mutations_materialized/metadata.json index 9022255763..7ad5569408 100644 --- a/parser/testdata/03047_on_fly_mutations_materialized/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_materialized/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt4": true, "stmt9": true } } diff --git a/parser/testdata/03047_on_fly_mutations_multiple_updates/metadata.json b/parser/testdata/03047_on_fly_mutations_multiple_updates/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03047_on_fly_mutations_multiple_updates/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_multiple_updates/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03047_on_fly_mutations_multiple_updates_rmt/metadata.json b/parser/testdata/03047_on_fly_mutations_multiple_updates_rmt/metadata.json index 08a237ec55..7ad5569408 100644 --- a/parser/testdata/03047_on_fly_mutations_multiple_updates_rmt/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_multiple_updates_rmt/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt6": true, "stmt9": true } } diff --git a/parser/testdata/03047_on_fly_mutations_non_deterministic/metadata.json b/parser/testdata/03047_on_fly_mutations_non_deterministic/metadata.json index f2ad87acd1..8888e2e3ae 100644 --- a/parser/testdata/03047_on_fly_mutations_non_deterministic/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_non_deterministic/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt10": true, - "stmt16": true, - "stmt4": true + "stmt16": true } } diff --git a/parser/testdata/03047_on_fly_mutations_non_deterministic_replace/metadata.json b/parser/testdata/03047_on_fly_mutations_non_deterministic_replace/metadata.json index 3415bb4ca7..37668fba8c 100644 --- a/parser/testdata/03047_on_fly_mutations_non_deterministic_replace/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_non_deterministic_replace/metadata.json @@ -1,17 +1,9 @@ { "explain_todo": { - "stmt13": true, - "stmt20": true, "stmt21": true, - "stmt25": true, - "stmt32": true, "stmt36": true, - "stmt39": true, - "stmt47": true, "stmt49": true, - "stmt53": true, "stmt55": true, - "stmt58": true, - "stmt6": true + "stmt58": true } } diff --git a/parser/testdata/03047_on_fly_mutations_prewhere/metadata.json b/parser/testdata/03047_on_fly_mutations_prewhere/metadata.json index ca584b3e28..0967ef424b 100644 --- a/parser/testdata/03047_on_fly_mutations_prewhere/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_prewhere/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt17": true - } -} +{} diff --git a/parser/testdata/03047_on_fly_mutations_projections/metadata.json b/parser/testdata/03047_on_fly_mutations_projections/metadata.json index 25122ac4f4..7ad5569408 100644 --- a/parser/testdata/03047_on_fly_mutations_projections/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_projections/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt9": true } } diff --git a/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json b/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json index 343e60442c..a9a2212bf4 100644 --- a/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json @@ -3,7 +3,6 @@ "stmt10": true, "stmt13": true, "stmt15": true, - "stmt17": true, - "stmt6": true + "stmt17": true } } diff --git a/parser/testdata/03047_on_fly_update_delete/metadata.json b/parser/testdata/03047_on_fly_update_delete/metadata.json index 7e917e0ce3..56accf959b 100644 --- a/parser/testdata/03047_on_fly_update_delete/metadata.json +++ b/parser/testdata/03047_on_fly_update_delete/metadata.json @@ -1,9 +1,7 @@ { "explain_todo": { - "stmt10": true, "stmt12": true, "stmt13": true, - "stmt18": true, "stmt6": true } } diff --git a/parser/testdata/03093_reading_bug_with_parallel_replicas/metadata.json b/parser/testdata/03093_reading_bug_with_parallel_replicas/metadata.json index f4c74e32be..0967ef424b 100644 --- a/parser/testdata/03093_reading_bug_with_parallel_replicas/metadata.json +++ b/parser/testdata/03093_reading_bug_with_parallel_replicas/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt10": true - } -} +{} diff --git a/parser/testdata/03100_lwu_02_basics/metadata.json b/parser/testdata/03100_lwu_02_basics/metadata.json index 84f57deaf2..afaaa4b0a6 100644 --- a/parser/testdata/03100_lwu_02_basics/metadata.json +++ b/parser/testdata/03100_lwu_02_basics/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt7": true, "stmt9": true } diff --git a/parser/testdata/03100_lwu_10_apply_on_merges/metadata.json b/parser/testdata/03100_lwu_10_apply_on_merges/metadata.json index ea059bd132..f2b01e55b3 100644 --- a/parser/testdata/03100_lwu_10_apply_on_merges/metadata.json +++ b/parser/testdata/03100_lwu_10_apply_on_merges/metadata.json @@ -4,12 +4,10 @@ "stmt14": true, "stmt15": true, "stmt16": true, - "stmt17": true, "stmt18": true, "stmt19": true, "stmt5": true, "stmt6": true, - "stmt7": true, "stmt8": true } } diff --git a/parser/testdata/03100_lwu_27_update_after_on_fly_mutations/metadata.json b/parser/testdata/03100_lwu_27_update_after_on_fly_mutations/metadata.json index 83e1060776..4f593ff9c6 100644 --- a/parser/testdata/03100_lwu_27_update_after_on_fly_mutations/metadata.json +++ b/parser/testdata/03100_lwu_27_update_after_on_fly_mutations/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt10": true, - "stmt4": true, "stmt8": true, "stmt9": true } diff --git a/parser/testdata/03100_lwu_32_on_fly_filter/metadata.json b/parser/testdata/03100_lwu_32_on_fly_filter/metadata.json index 1c1699c018..b731c2f0d3 100644 --- a/parser/testdata/03100_lwu_32_on_fly_filter/metadata.json +++ b/parser/testdata/03100_lwu_32_on_fly_filter/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt10": true, - "stmt4": true, "stmt6": true, "stmt7": true, "stmt8": true diff --git a/parser/testdata/03100_lwu_38_replacing/metadata.json b/parser/testdata/03100_lwu_38_replacing/metadata.json index 60106a3b25..7ad5569408 100644 --- a/parser/testdata/03100_lwu_38_replacing/metadata.json +++ b/parser/testdata/03100_lwu_38_replacing/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, "stmt9": true } } diff --git a/parser/testdata/03100_lwu_deletes_1/metadata.json b/parser/testdata/03100_lwu_deletes_1/metadata.json index 18cfe86feb..b470c2b73c 100644 --- a/parser/testdata/03100_lwu_deletes_1/metadata.json +++ b/parser/testdata/03100_lwu_deletes_1/metadata.json @@ -2,7 +2,6 @@ "explain_todo": { "stmt12": true, "stmt15": true, - "stmt3": true, "stmt9": true } } diff --git a/parser/testdata/03100_lwu_deletes_3/metadata.json b/parser/testdata/03100_lwu_deletes_3/metadata.json index 5cbc45922c..d94c5b9752 100644 --- a/parser/testdata/03100_lwu_deletes_3/metadata.json +++ b/parser/testdata/03100_lwu_deletes_3/metadata.json @@ -7,9 +7,7 @@ "stmt14": true, "stmt15": true, "stmt16": true, - "stmt22": true, "stmt23": true, - "stmt27": true, - "stmt6": true + "stmt27": true } } diff --git a/parser/testdata/03128_argMin_combinator_projection/metadata.json b/parser/testdata/03128_argMin_combinator_projection/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/03128_argMin_combinator_projection/metadata.json +++ b/parser/testdata/03128_argMin_combinator_projection/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/03141_fetches_errors_stress/metadata.json b/parser/testdata/03141_fetches_errors_stress/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/03141_fetches_errors_stress/metadata.json +++ b/parser/testdata/03141_fetches_errors_stress/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/03164_materialize_skip_index/metadata.json b/parser/testdata/03164_materialize_skip_index/metadata.json index a954a15222..0967ef424b 100644 --- a/parser/testdata/03164_materialize_skip_index/metadata.json +++ b/parser/testdata/03164_materialize_skip_index/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03175_sparse_and_skip_index/metadata.json b/parser/testdata/03175_sparse_and_skip_index/metadata.json index 22ed9a7783..0967ef424b 100644 --- a/parser/testdata/03175_sparse_and_skip_index/metadata.json +++ b/parser/testdata/03175_sparse_and_skip_index/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03203_fill_missed_subcolumns/metadata.json b/parser/testdata/03203_fill_missed_subcolumns/metadata.json index 8c6a18d871..0967ef424b 100644 --- a/parser/testdata/03203_fill_missed_subcolumns/metadata.json +++ b/parser/testdata/03203_fill_missed_subcolumns/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt19": true - } -} +{} diff --git a/parser/testdata/03205_parallel_window_finctions_and_column_sparse_bug/metadata.json b/parser/testdata/03205_parallel_window_finctions_and_column_sparse_bug/metadata.json index 364c0f8d2e..c45b7602ba 100644 --- a/parser/testdata/03205_parallel_window_finctions_and_column_sparse_bug/metadata.json +++ b/parser/testdata/03205_parallel_window_finctions_and_column_sparse_bug/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt2": true + "stmt12": true } } diff --git a/parser/testdata/03217_filtering_in_storage_merge/metadata.json b/parser/testdata/03217_filtering_in_storage_merge/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/03217_filtering_in_storage_merge/metadata.json +++ b/parser/testdata/03217_filtering_in_storage_merge/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/03223_system_tables_set_not_ready/metadata.json b/parser/testdata/03223_system_tables_set_not_ready/metadata.json index c698f51841..27369be079 100644 --- a/parser/testdata/03223_system_tables_set_not_ready/metadata.json +++ b/parser/testdata/03223_system_tables_set_not_ready/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt14": true, - "stmt20": true, "stmt22": true } } diff --git a/parser/testdata/03231_pr_reverse_in_order/metadata.json b/parser/testdata/03231_pr_reverse_in_order/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/03231_pr_reverse_in_order/metadata.json +++ b/parser/testdata/03231_pr_reverse_in_order/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan/metadata.json b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan/metadata.json index b95c9a3804..0967ef424b 100644 --- a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan/metadata.json +++ b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt20": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_basic/metadata.json b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_basic/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_basic/metadata.json +++ b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_basic/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_extremes/metadata.json b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_extremes/metadata.json index 75b7911cf3..0967ef424b 100644 --- a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_extremes/metadata.json +++ b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_extremes/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt26": true, - "stmt41": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_no_final_mark/metadata.json b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_no_final_mark/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_no_final_mark/metadata.json +++ b/parser/testdata/03244_skip_index_in_final_query_with_pk_rescan_no_final_mark/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/03248_max_parts_to_move/metadata.json b/parser/testdata/03248_max_parts_to_move/metadata.json index e353467a70..54590bc988 100644 --- a/parser/testdata/03248_max_parts_to_move/metadata.json +++ b/parser/testdata/03248_max_parts_to_move/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt11": true, - "stmt13": true, - "stmt5": true + "stmt13": true } } diff --git a/parser/testdata/03248_with_insert/metadata.json b/parser/testdata/03248_with_insert/metadata.json index fa347ab45a..c5d9509926 100644 --- a/parser/testdata/03248_with_insert/metadata.json +++ b/parser/testdata/03248_with_insert/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, "stmt4": true, "stmt5": true, "stmt9": true diff --git a/parser/testdata/03254_attach_part_order/metadata.json b/parser/testdata/03254_attach_part_order/metadata.json index 6d91fa41f1..8c6a18d871 100644 --- a/parser/testdata/03254_attach_part_order/metadata.json +++ b/parser/testdata/03254_attach_part_order/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt19": true, - "stmt2": true + "stmt19": true } } diff --git a/parser/testdata/03254_prewarm_mark_cache_columns/metadata.json b/parser/testdata/03254_prewarm_mark_cache_columns/metadata.json index f4c74e32be..0967ef424b 100644 --- a/parser/testdata/03254_prewarm_mark_cache_columns/metadata.json +++ b/parser/testdata/03254_prewarm_mark_cache_columns/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt10": true - } -} +{} diff --git a/parser/testdata/03254_prewarm_mark_cache_rmt/metadata.json b/parser/testdata/03254_prewarm_mark_cache_rmt/metadata.json index 531c09ccab..0967ef424b 100644 --- a/parser/testdata/03254_prewarm_mark_cache_rmt/metadata.json +++ b/parser/testdata/03254_prewarm_mark_cache_rmt/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt15": true, - "stmt27": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03254_system_prewarm_mark_cache/metadata.json b/parser/testdata/03254_system_prewarm_mark_cache/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/03254_system_prewarm_mark_cache/metadata.json +++ b/parser/testdata/03254_system_prewarm_mark_cache/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/03272_prewarm_mark_cache_add_column/metadata.json b/parser/testdata/03272_prewarm_mark_cache_add_column/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03272_prewarm_mark_cache_add_column/metadata.json +++ b/parser/testdata/03272_prewarm_mark_cache_add_column/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03274_prewarm_primary_index_cache/metadata.json b/parser/testdata/03274_prewarm_primary_index_cache/metadata.json index 6d80163463..0967ef424b 100644 --- a/parser/testdata/03274_prewarm_primary_index_cache/metadata.json +++ b/parser/testdata/03274_prewarm_primary_index_cache/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt12": true, - "stmt17": true, - "stmt32": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03274_squashing_transform_sparse_bug/metadata.json b/parser/testdata/03274_squashing_transform_sparse_bug/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/03274_squashing_transform_sparse_bug/metadata.json +++ b/parser/testdata/03274_squashing_transform_sparse_bug/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/03283_optimize_on_insert_level/metadata.json b/parser/testdata/03283_optimize_on_insert_level/metadata.json index bdef5dcec2..b6bcf6a09c 100644 --- a/parser/testdata/03283_optimize_on_insert_level/metadata.json +++ b/parser/testdata/03283_optimize_on_insert_level/metadata.json @@ -1,8 +1,6 @@ { "explain_todo": { "stmt10": true, - "stmt15": true, - "stmt20": true, - "stmt5": true + "stmt20": true } } diff --git a/parser/testdata/03350_alter_table_fetch_partition_thread_pool/metadata.json b/parser/testdata/03350_alter_table_fetch_partition_thread_pool/metadata.json index d02612666a..342b3ff5b4 100644 --- a/parser/testdata/03350_alter_table_fetch_partition_thread_pool/metadata.json +++ b/parser/testdata/03350_alter_table_fetch_partition_thread_pool/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt5": true, "stmt8": true } } diff --git a/parser/testdata/03356_pull_entry_before_detach_part/metadata.json b/parser/testdata/03356_pull_entry_before_detach_part/metadata.json index f3773105ca..b563327205 100644 --- a/parser/testdata/03356_pull_entry_before_detach_part/metadata.json +++ b/parser/testdata/03356_pull_entry_before_detach_part/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt4": true, - "stmt6": true, "stmt7": true } } diff --git a/parser/testdata/03394_pr_insert_select_threads/metadata.json b/parser/testdata/03394_pr_insert_select_threads/metadata.json index 1308c9fb67..0438c9b85f 100644 --- a/parser/testdata/03394_pr_insert_select_threads/metadata.json +++ b/parser/testdata/03394_pr_insert_select_threads/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt15": true, - "stmt7": true + "stmt15": true } } diff --git a/parser/testdata/03403_distributed_merge_two_level_aggregation/metadata.json b/parser/testdata/03403_distributed_merge_two_level_aggregation/metadata.json index 60106a3b25..0967ef424b 100644 --- a/parser/testdata/03403_distributed_merge_two_level_aggregation/metadata.json +++ b/parser/testdata/03403_distributed_merge_two_level_aggregation/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03409_coalescing_replicated_merge_tree/metadata.json b/parser/testdata/03409_coalescing_replicated_merge_tree/metadata.json index 4cf6ddb69c..0967ef424b 100644 --- a/parser/testdata/03409_coalescing_replicated_merge_tree/metadata.json +++ b/parser/testdata/03409_coalescing_replicated_merge_tree/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt21": true - } -} +{} diff --git a/parser/testdata/03442_lightweight_deletes_on_fly/metadata.json b/parser/testdata/03442_lightweight_deletes_on_fly/metadata.json index ca6c6983a6..63ef8ced26 100644 --- a/parser/testdata/03442_lightweight_deletes_on_fly/metadata.json +++ b/parser/testdata/03442_lightweight_deletes_on_fly/metadata.json @@ -1,10 +1,8 @@ { "explain_todo": { "stmt13": true, - "stmt14": true, "stmt15": true, "stmt16": true, - "stmt4": true, "stmt7": true, "stmt8": true } diff --git a/parser/testdata/03455_direct_io_read_array_values/metadata.json b/parser/testdata/03455_direct_io_read_array_values/metadata.json index 25122ac4f4..0967ef424b 100644 --- a/parser/testdata/03455_direct_io_read_array_values/metadata.json +++ b/parser/testdata/03455_direct_io_read_array_values/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json b/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json index aa28559472..0967ef424b 100644 --- a/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json +++ b/parser/testdata/03513_lazy_materialization_projections_fix/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt18": true - } -} +{} diff --git a/parser/testdata/03519_merge_tree_part_info_unpack/metadata.json b/parser/testdata/03519_merge_tree_part_info_unpack/metadata.json index b799e739b4..470d47b502 100644 --- a/parser/testdata/03519_merge_tree_part_info_unpack/metadata.json +++ b/parser/testdata/03519_merge_tree_part_info_unpack/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt10": true, - "stmt7": true, "stmt9": true } } diff --git a/parser/testdata/03541_rename_column_start/metadata.json b/parser/testdata/03541_rename_column_start/metadata.json index 22ed9a7783..0967ef424b 100644 --- a/parser/testdata/03541_rename_column_start/metadata.json +++ b/parser/testdata/03541_rename_column_start/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03545_number_of_rows_in_ttltransform/metadata.json b/parser/testdata/03545_number_of_rows_in_ttltransform/metadata.json index c7f6fecdb8..c45b7602ba 100644 --- a/parser/testdata/03545_number_of_rows_in_ttltransform/metadata.json +++ b/parser/testdata/03545_number_of_rows_in_ttltransform/metadata.json @@ -1,9 +1,5 @@ { "explain_todo": { - "stmt12": true, - "stmt13": true, - "stmt17": true, - "stmt2": true, - "stmt8": true + "stmt12": true } } diff --git a/parser/testdata/03560_parallel_replicas_external_aggregation/metadata.json b/parser/testdata/03560_parallel_replicas_external_aggregation/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03560_parallel_replicas_external_aggregation/metadata.json +++ b/parser/testdata/03560_parallel_replicas_external_aggregation/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03560_parallel_replicas_projection/metadata.json b/parser/testdata/03560_parallel_replicas_projection/metadata.json index bb7b7d4d9a..0967ef424b 100644 --- a/parser/testdata/03560_parallel_replicas_projection/metadata.json +++ b/parser/testdata/03560_parallel_replicas_projection/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt21": true, - "stmt3": true - } -} +{} diff --git a/parser/testdata/03581_parallel_replicas_task_size/metadata.json b/parser/testdata/03581_parallel_replicas_task_size/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/03581_parallel_replicas_task_size/metadata.json +++ b/parser/testdata/03581_parallel_replicas_task_size/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/03622_ttl_infos_where/metadata.json b/parser/testdata/03622_ttl_infos_where/metadata.json index 8cd037d5f7..5543f9b5fe 100644 --- a/parser/testdata/03622_ttl_infos_where/metadata.json +++ b/parser/testdata/03622_ttl_infos_where/metadata.json @@ -1,8 +1,6 @@ { "explain_todo": { "stmt13": true, - "stmt3": true, - "stmt4": true, - "stmt9": true + "stmt3": true } } diff --git a/parser/testdata/03625_auto_statistics/metadata.json b/parser/testdata/03625_auto_statistics/metadata.json index 3a352d68aa..0967ef424b 100644 --- a/parser/testdata/03625_auto_statistics/metadata.json +++ b/parser/testdata/03625_auto_statistics/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt4": true - } -} +{} diff --git a/parser/testdata/03625_auto_statistics_rmt/metadata.json b/parser/testdata/03625_auto_statistics_rmt/metadata.json index 15d79beb93..0967ef424b 100644 --- a/parser/testdata/03625_auto_statistics_rmt/metadata.json +++ b/parser/testdata/03625_auto_statistics_rmt/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03636_empty_projection_block/metadata.json b/parser/testdata/03636_empty_projection_block/metadata.json index c1203c404f..e9d6e46171 100644 --- a/parser/testdata/03636_empty_projection_block/metadata.json +++ b/parser/testdata/03636_empty_projection_block/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt1": true, - "stmt2": true, - "stmt7": true + "stmt1": true } } diff --git a/parser/testdata/03680_mergetree_shrink_const_from_prewhere/metadata.json b/parser/testdata/03680_mergetree_shrink_const_from_prewhere/metadata.json index 51dfabe749..0967ef424b 100644 --- a/parser/testdata/03680_mergetree_shrink_const_from_prewhere/metadata.json +++ b/parser/testdata/03680_mergetree_shrink_const_from_prewhere/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt3":true}} +{} diff --git a/parser/testdata/03701_column_ttl_fully_expired/metadata.json b/parser/testdata/03701_column_ttl_fully_expired/metadata.json index 678d465c4b..2978af6902 100644 --- a/parser/testdata/03701_column_ttl_fully_expired/metadata.json +++ b/parser/testdata/03701_column_ttl_fully_expired/metadata.json @@ -1,14 +1,8 @@ { "explain_todo": { "stmt11": true, - "stmt12": true, - "stmt15": true, "stmt19": true, "stmt2": true, - "stmt20": true, - "stmt22": true, - "stmt24": true, - "stmt3": true, - "stmt6": true + "stmt24": true } } diff --git a/parser/testdata/03707_empty_parts_with_non_empty_projections_merge/metadata.json b/parser/testdata/03707_empty_parts_with_non_empty_projections_merge/metadata.json index bc5c6edb66..0967ef424b 100644 --- a/parser/testdata/03707_empty_parts_with_non_empty_projections_merge/metadata.json +++ b/parser/testdata/03707_empty_parts_with_non_empty_projections_merge/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03711_merge_tree_deduplication_with_disk_not_support_writing_with_append/metadata.json b/parser/testdata/03711_merge_tree_deduplication_with_disk_not_support_writing_with_append/metadata.json index 8dc308e86d..1cae614144 100644 --- a/parser/testdata/03711_merge_tree_deduplication_with_disk_not_support_writing_with_append/metadata.json +++ b/parser/testdata/03711_merge_tree_deduplication_with_disk_not_support_writing_with_append/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt32": true, - "stmt35": true, - "stmt4": true + "stmt35": true } } From f61bbc5b84109ae06e264a7335c912cfe9023957 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 03:06:27 +0000 Subject: [PATCH 16/21] Add support for qualified COLUMNS matchers (test_table.COLUMNS) - Detect qualified COLUMNS patterns when parsing dotted identifiers - Parse test_table.COLUMNS(id) as QualifiedColumnsListMatcher - Parse test_table.COLUMNS('pattern') as QualifiedColumnsRegexpMatcher - Add parseQualifiedColumnsMatcher function to handle these cases --- parser/expression.go | 57 +++++++++++++++++++ .../metadata.json | 12 ---- .../metadata.json | 1 - .../03144_invalid_filter/metadata.json | 3 +- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/parser/expression.go b/parser/expression.go index 3990014164..24a72e890b 100644 --- a/parser/expression.go +++ b/parser/expression.go @@ -512,6 +512,11 @@ func (p *Parser) parseIdentifierOrFunction() ast.Expression { // Check for function call after qualified name if p.currentIs(token.LPAREN) { + // Special case: qualified COLUMNS matcher (e.g., test_table.COLUMNS(id)) + if len(parts) >= 2 && strings.ToUpper(parts[len(parts)-1]) == "COLUMNS" { + qualifier := strings.Join(parts[:len(parts)-1], ".") + return p.parseQualifiedColumnsMatcher(qualifier, pos) + } return p.parseFunctionCall(strings.Join(parts, "."), pos) } @@ -2191,6 +2196,58 @@ func (p *Parser) parseColumnsMatcher() ast.Expression { return matcher } +// parseQualifiedColumnsMatcher parses qualified COLUMNS matchers like test_table.COLUMNS(id) +// The qualifier is passed in and we're already positioned at LPAREN +func (p *Parser) parseQualifiedColumnsMatcher(qualifier string, pos token.Position) ast.Expression { + matcher := &ast.ColumnsMatcher{ + Position: pos, + Qualifier: qualifier, + } + + p.nextToken() // skip LPAREN + + // Parse the arguments - either a string pattern or a list of identifiers + if p.currentIs(token.STRING) { + // String pattern: COLUMNS('pattern') + matcher.Pattern = p.current.Value + p.nextToken() + } else { + // Column list: COLUMNS(col1, col2, ...) + for !p.currentIs(token.RPAREN) && !p.currentIs(token.EOF) { + col := p.parseExpression(LOWEST) + if col != nil { + matcher.Columns = append(matcher.Columns, col) + } + if p.currentIs(token.COMMA) { + p.nextToken() + } else { + break + } + } + } + + p.expect(token.RPAREN) + + // Handle EXCEPT + if p.currentIs(token.EXCEPT) { + p.nextToken() + if p.expect(token.LPAREN) { + for !p.currentIs(token.RPAREN) && !p.currentIs(token.EOF) { + if p.currentIs(token.IDENT) { + matcher.Except = append(matcher.Except, p.current.Value) + p.nextToken() + } + if p.currentIs(token.COMMA) { + p.nextToken() + } + } + p.expect(token.RPAREN) + } + } + + return matcher +} + func (p *Parser) parseArrayConstructor() ast.Expression { pos := p.current.Pos p.nextToken() // skip ARRAY diff --git a/parser/testdata/02339_analyzer_matcher_basic/metadata.json b/parser/testdata/02339_analyzer_matcher_basic/metadata.json index c98ee61a72..2148fda4c3 100644 --- a/parser/testdata/02339_analyzer_matcher_basic/metadata.json +++ b/parser/testdata/02339_analyzer_matcher_basic/metadata.json @@ -2,18 +2,6 @@ "explain_todo": { "stmt105": true, "stmt106": true, - "stmt30": true, - "stmt31": true, - "stmt33": true, - "stmt34": true, - "stmt36": true, - "stmt37": true, - "stmt48": true, - "stmt49": true, - "stmt51": true, - "stmt52": true, - "stmt54": true, - "stmt55": true, "stmt63": true, "stmt64": true, "stmt66": true, diff --git a/parser/testdata/03101_analyzer_identifiers_4/metadata.json b/parser/testdata/03101_analyzer_identifiers_4/metadata.json index efe4f4cf12..ca345578d8 100644 --- a/parser/testdata/03101_analyzer_identifiers_4/metadata.json +++ b/parser/testdata/03101_analyzer_identifiers_4/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt14": true, - "stmt17": true, "stmt18": true, "stmt7": true, "stmt9": true diff --git a/parser/testdata/03144_invalid_filter/metadata.json b/parser/testdata/03144_invalid_filter/metadata.json index 7b4ddafa53..1295a45747 100644 --- a/parser/testdata/03144_invalid_filter/metadata.json +++ b/parser/testdata/03144_invalid_filter/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt3": true, - "stmt4": true + "stmt3": true } } From 7080f6447f9f6cdbf7e81cb6f08f6b1a3730b736 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 03:13:53 +0000 Subject: [PATCH 17/21] Add trim to trimBoth function name normalization ClickHouse canonicalizes trim() to trimBoth() in EXPLAIN AST output. This fixes many text/token index tests that use trim(). --- internal/explain/format.go | 1 + .../metadata.json | 1 - .../02160_special_functions/metadata.json | 1 - .../metadata.json | 13 +------- .../metadata.json | 11 +------ .../metadata.json | 11 +------ .../03000_minmax_index_first/metadata.json | 6 +--- .../metadata.json | 5 +-- .../metadata.json | 4 --- .../metadata.json | 6 +--- .../metadata.json | 33 +------------------ .../metadata.json | 7 +--- .../metadata.json | 9 +---- .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../03593_funcs_on_empty_string/metadata.json | 8 ++++- .../metadata.json | 11 +------ .../metadata.json | 11 +------ .../metadata.json | 7 +--- .../metadata.json | 5 +-- 20 files changed, 23 insertions(+), 139 deletions(-) diff --git a/internal/explain/format.go b/internal/explain/format.go index 102e657e43..1ab3eb49ad 100644 --- a/internal/explain/format.go +++ b/internal/explain/format.go @@ -277,6 +277,7 @@ func formatBinaryExprForType(expr *ast.BinaryExpr) string { func NormalizeFunctionName(name string) string { // ClickHouse normalizes certain function names in EXPLAIN AST normalized := map[string]string{ + "trim": "trimBoth", "ltrim": "trimLeft", "rtrim": "trimRight", "lcase": "lower", diff --git a/parser/testdata/00765_sql_compatibility_aliases/metadata.json b/parser/testdata/00765_sql_compatibility_aliases/metadata.json index 2eaa95a24a..380408def5 100644 --- a/parser/testdata/00765_sql_compatibility_aliases/metadata.json +++ b/parser/testdata/00765_sql_compatibility_aliases/metadata.json @@ -1,7 +1,6 @@ { "explain_todo": { "stmt10": true, - "stmt18": true, "stmt2": true, "stmt25": true, "stmt26": true, diff --git a/parser/testdata/02160_special_functions/metadata.json b/parser/testdata/02160_special_functions/metadata.json index 1211988d56..61cf9382a8 100644 --- a/parser/testdata/02160_special_functions/metadata.json +++ b/parser/testdata/02160_special_functions/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt11": true, "stmt14": true, "stmt16": true, "stmt18": true, diff --git a/parser/testdata/02346_text_index_direct_read/metadata.json b/parser/testdata/02346_text_index_direct_read/metadata.json index a4c5ba97cd..0967ef424b 100644 --- a/parser/testdata/02346_text_index_direct_read/metadata.json +++ b/parser/testdata/02346_text_index_direct_read/metadata.json @@ -1,12 +1 @@ -{ - "explain_todo": { - "stmt22": true, - "stmt23": true, - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true - } -} +{} diff --git a/parser/testdata/02346_text_index_match_predicate/metadata.json b/parser/testdata/02346_text_index_match_predicate/metadata.json index a5362172f6..0967ef424b 100644 --- a/parser/testdata/02346_text_index_match_predicate/metadata.json +++ b/parser/testdata/02346_text_index_match_predicate/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt14": true, - "stmt15": true, - "stmt6": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/02346_text_index_on_lower_column/metadata.json b/parser/testdata/02346_text_index_on_lower_column/metadata.json index 56a40fdb58..0967ef424b 100644 --- a/parser/testdata/02346_text_index_on_lower_column/metadata.json +++ b/parser/testdata/02346_text_index_on_lower_column/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt18": true, - "stmt20": true, - "stmt22": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03000_minmax_index_first/metadata.json b/parser/testdata/03000_minmax_index_first/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03000_minmax_index_first/metadata.json +++ b/parser/testdata/03000_minmax_index_first/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json b/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json index a9a2212bf4..62b81668c3 100644 --- a/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json +++ b/parser/testdata/03047_on_fly_mutations_skip_index/metadata.json @@ -1,8 +1,5 @@ { "explain_todo": { - "stmt10": true, - "stmt13": true, - "stmt15": true, - "stmt17": true + "stmt13": true } } diff --git a/parser/testdata/03100_lwu_36_json_skip_indexes/metadata.json b/parser/testdata/03100_lwu_36_json_skip_indexes/metadata.json index 839e845d37..342b3ff5b4 100644 --- a/parser/testdata/03100_lwu_36_json_skip_indexes/metadata.json +++ b/parser/testdata/03100_lwu_36_json_skip_indexes/metadata.json @@ -1,9 +1,5 @@ { "explain_todo": { - "stmt10": true, - "stmt12": true, - "stmt14": true, - "stmt16": true, "stmt8": true } } diff --git a/parser/testdata/03100_lwu_46_deletes_skip_indexes/metadata.json b/parser/testdata/03100_lwu_46_deletes_skip_indexes/metadata.json index f1dce3661b..ff0eba6904 100644 --- a/parser/testdata/03100_lwu_46_deletes_skip_indexes/metadata.json +++ b/parser/testdata/03100_lwu_46_deletes_skip_indexes/metadata.json @@ -1,10 +1,6 @@ { "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt15": true, "stmt6": true, - "stmt7": true, - "stmt9": true + "stmt7": true } } diff --git a/parser/testdata/03165_string_functions_with_token_text_indexes/metadata.json b/parser/testdata/03165_string_functions_with_token_text_indexes/metadata.json index a01daa8037..0967ef424b 100644 --- a/parser/testdata/03165_string_functions_with_token_text_indexes/metadata.json +++ b/parser/testdata/03165_string_functions_with_token_text_indexes/metadata.json @@ -1,32 +1 @@ -{ - "explain_todo": { - "stmt103": true, - "stmt107": true, - "stmt111": true, - "stmt115": true, - "stmt119": true, - "stmt12": true, - "stmt123": true, - "stmt16": true, - "stmt20": true, - "stmt24": true, - "stmt28": true, - "stmt32": true, - "stmt36": true, - "stmt40": true, - "stmt51": true, - "stmt55": true, - "stmt59": true, - "stmt63": true, - "stmt67": true, - "stmt71": true, - "stmt75": true, - "stmt79": true, - "stmt8": true, - "stmt83": true, - "stmt87": true, - "stmt91": true, - "stmt95": true, - "stmt99": true - } -} +{} diff --git a/parser/testdata/03321_functions_to_subcolumns_skip_index/metadata.json b/parser/testdata/03321_functions_to_subcolumns_skip_index/metadata.json index 92efb02376..0967ef424b 100644 --- a/parser/testdata/03321_functions_to_subcolumns_skip_index/metadata.json +++ b/parser/testdata/03321_functions_to_subcolumns_skip_index/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03457_move_global_in_to_prewhere/metadata.json b/parser/testdata/03457_move_global_in_to_prewhere/metadata.json index fbb25a69d3..0967ef424b 100644 --- a/parser/testdata/03457_move_global_in_to_prewhere/metadata.json +++ b/parser/testdata/03457_move_global_in_to_prewhere/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt7": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03563_coarser_minmax_indexes_first/metadata.json b/parser/testdata/03563_coarser_minmax_indexes_first/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03563_coarser_minmax_indexes_first/metadata.json +++ b/parser/testdata/03563_coarser_minmax_indexes_first/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03565_clickhouse_smaller_indexes_first/metadata.json b/parser/testdata/03565_clickhouse_smaller_indexes_first/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/03565_clickhouse_smaller_indexes_first/metadata.json +++ b/parser/testdata/03565_clickhouse_smaller_indexes_first/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/03593_funcs_on_empty_string/metadata.json b/parser/testdata/03593_funcs_on_empty_string/metadata.json index d6aaa55344..2dffbd792b 100644 --- a/parser/testdata/03593_funcs_on_empty_string/metadata.json +++ b/parser/testdata/03593_funcs_on_empty_string/metadata.json @@ -1 +1,7 @@ -{"explain_todo":{"stmt167":true,"stmt362":true,"stmt373":true,"stmt91":true}} +{ + "explain_todo": { + "stmt167": true, + "stmt373": true, + "stmt91": true + } +} diff --git a/parser/testdata/03636_index_analysis_with_session_tz/metadata.json b/parser/testdata/03636_index_analysis_with_session_tz/metadata.json index 8098beefb1..0967ef424b 100644 --- a/parser/testdata/03636_index_analysis_with_session_tz/metadata.json +++ b/parser/testdata/03636_index_analysis_with_session_tz/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt17": true, - "stmt21": true, - "stmt27": true, - "stmt31": true, - "stmt7": true - } -} +{} diff --git a/parser/testdata/03702_text_index_hint_basics/metadata.json b/parser/testdata/03702_text_index_hint_basics/metadata.json index 596438587e..0967ef424b 100644 --- a/parser/testdata/03702_text_index_hint_basics/metadata.json +++ b/parser/testdata/03702_text_index_hint_basics/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt13": true, - "stmt19": true, - "stmt21": true, - "stmt27": true, - "stmt29": true - } -} +{} diff --git a/parser/testdata/03702_text_index_hint_low_cardinality/metadata.json b/parser/testdata/03702_text_index_hint_low_cardinality/metadata.json index 92efb02376..0967ef424b 100644 --- a/parser/testdata/03702_text_index_hint_low_cardinality/metadata.json +++ b/parser/testdata/03702_text_index_hint_low_cardinality/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json b/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json index 1288c962d6..ca4130f74d 100644 --- a/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json +++ b/parser/testdata/03722_function_trim_ltrim_rtrim_alias/metadata.json @@ -2,9 +2,6 @@ "explain_todo": { "stmt11": true, "stmt12": true, - "stmt13": true, - "stmt17": true, - "stmt5": true, - "stmt7": true + "stmt13": true } } From cdf0747aaae4d40095ba4dc135ebb39813747c18 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 03:31:40 +0000 Subject: [PATCH 18/21] Add authentication data capture for CREATE/ALTER USER statements - Add AuthenticationValues field to CreateQuery for storing password/hash values - Update parseCreateUser and parseAlterUser to capture BY 'value' expressions - Update explain output to show AuthenticationData with literal children - Use token.BY and token.WITH keywords instead of IDENT checks Fixes authentication data capture in EXPLAIN AST output for CREATE USER and ALTER USER statements with IDENTIFIED WITH method BY 'value' syntax. --- ast/ast.go | 1 + internal/explain/statements.go | 12 ++- parser/parser.go | 92 ++++++++++++++++++- .../testdata/01292_create_user/metadata.json | 20 +--- .../01702_system_query_log/metadata.json | 1 - .../03172_bcrypt_validation/metadata.json | 6 +- 6 files changed, 104 insertions(+), 28 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index 7f24c24176..694f13b87c 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -272,6 +272,7 @@ type CreateQuery struct { CreateUser bool `json:"create_user,omitempty"` AlterUser bool `json:"alter_user,omitempty"` HasAuthenticationData bool `json:"has_authentication_data,omitempty"` + AuthenticationValues []string `json:"authentication_values,omitempty"` // Password/hash values from IDENTIFIED BY CreateDictionary bool `json:"create_dictionary,omitempty"` DictionaryAttrs []*DictionaryAttributeDeclaration `json:"dictionary_attrs,omitempty"` DictionaryDef *DictionaryDefinition `json:"dictionary_def,omitempty"` diff --git a/internal/explain/statements.go b/internal/explain/statements.go index 43aa36e538..eb882c1767 100644 --- a/internal/explain/statements.go +++ b/internal/explain/statements.go @@ -95,7 +95,17 @@ func explainCreateQuery(sb *strings.Builder, n *ast.CreateQuery, indent string, if n.CreateUser || n.AlterUser { if n.HasAuthenticationData { fmt.Fprintf(sb, "%sCreateUserQuery (children 1)\n", indent) - fmt.Fprintf(sb, "%s AuthenticationData\n", indent) + // AuthenticationData has children if there are auth values + if len(n.AuthenticationValues) > 0 { + fmt.Fprintf(sb, "%s AuthenticationData (children %d)\n", indent, len(n.AuthenticationValues)) + for _, val := range n.AuthenticationValues { + // Escape the value - strings need \' escaping + escaped := escapeStringLiteral(val) + fmt.Fprintf(sb, "%s Literal \\'%s\\'\n", indent, escaped) + } + } else { + fmt.Fprintf(sb, "%s AuthenticationData\n", indent) + } } else { fmt.Fprintf(sb, "%sCreateUserQuery\n", indent) } diff --git a/parser/parser.go b/parser/parser.go index 58b382c5b1..8da98d56a6 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -1895,12 +1895,53 @@ func (p *Parser) parseCreateUser(create *ast.CreateQuery) { p.nextToken() if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "IDENTIFIED" { create.HasAuthenticationData = true + p.nextToken() } continue } // Check for IDENTIFIED (without NOT) if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "IDENTIFIED" { create.HasAuthenticationData = true + p.nextToken() + // Parse authentication method and value + // Forms: IDENTIFIED BY 'password' + // IDENTIFIED WITH method BY 'password' + // IDENTIFIED WITH method BY 'password', method BY 'password', ... + for { + // Skip WITH if present (auth method follows) + if p.currentIs(token.WITH) { + p.nextToken() + } + // Skip auth method name (plaintext_password, sha256_password, etc.) + // Stop at BY (token), comma, or next section keywords + for p.currentIs(token.IDENT) { + ident := strings.ToUpper(p.current.Value) + // Stop at HOST, SETTINGS, DEFAULT, GRANTEES - don't consume these + if ident == "HOST" || ident == "SETTINGS" || ident == "DEFAULT" || ident == "GRANTEES" { + break + } + p.nextToken() + // Handle REALM/SERVER string values (for kerberos/ldap) + if p.currentIs(token.STRING) && (ident == "REALM" || ident == "SERVER") { + p.nextToken() + } + } + // Check for BY 'value' (BY is a keyword token, not IDENT) + if p.currentIs(token.BY) { + p.nextToken() + if p.currentIs(token.STRING) { + create.AuthenticationValues = append(create.AuthenticationValues, p.current.Value) + p.nextToken() + } + } + // Check for comma (multiple auth methods) + if p.currentIs(token.COMMA) { + p.nextToken() + continue + } + break + } + continue } p.nextToken() } @@ -1908,7 +1949,7 @@ func (p *Parser) parseCreateUser(create *ast.CreateQuery) { func (p *Parser) parseAlterUser() *ast.CreateQuery { create := &ast.CreateQuery{ - Position: p.current.Pos, + Position: p.current.Pos, CreateUser: true, AlterUser: true, } @@ -1919,8 +1960,55 @@ func (p *Parser) parseAlterUser() *ast.CreateQuery { // Parse user name create.UserName = p.parseIdentifierName() - // Skip the rest of the user definition (complex syntax) + // Scan for authentication data (NOT IDENTIFIED or IDENTIFIED) for !p.currentIs(token.EOF) && !p.currentIs(token.SEMICOLON) { + // Check for NOT IDENTIFIED + if p.currentIs(token.NOT) { + p.nextToken() + if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "IDENTIFIED" { + create.HasAuthenticationData = true + p.nextToken() + } + continue + } + // Check for IDENTIFIED (without NOT) + if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "IDENTIFIED" { + create.HasAuthenticationData = true + p.nextToken() + // Parse authentication method and value + for { + // Skip WITH if present + if p.currentIs(token.WITH) { + p.nextToken() + } + // Skip auth method name + for p.currentIs(token.IDENT) { + ident := strings.ToUpper(p.current.Value) + if ident == "HOST" || ident == "SETTINGS" || ident == "DEFAULT" || ident == "GRANTEES" { + break + } + p.nextToken() + if p.currentIs(token.STRING) && (ident == "REALM" || ident == "SERVER") { + p.nextToken() + } + } + // Check for BY 'value' + if p.currentIs(token.BY) { + p.nextToken() + if p.currentIs(token.STRING) { + create.AuthenticationValues = append(create.AuthenticationValues, p.current.Value) + p.nextToken() + } + } + // Check for comma (multiple auth methods) + if p.currentIs(token.COMMA) { + p.nextToken() + continue + } + break + } + continue + } p.nextToken() } diff --git a/parser/testdata/01292_create_user/metadata.json b/parser/testdata/01292_create_user/metadata.json index 1202e9052e..fd983695cd 100644 --- a/parser/testdata/01292_create_user/metadata.json +++ b/parser/testdata/01292_create_user/metadata.json @@ -4,29 +4,11 @@ "stmt158": true, "stmt159": true, "stmt160": true, - "stmt169": true, - "stmt171": true, "stmt196": true, "stmt197": true, "stmt200": true, "stmt201": true, - "stmt205": true, - "stmt207": true, - "stmt208": true, - "stmt22": true, "stmt221": true, - "stmt23": true, - "stmt239": true, - "stmt24": true, - "stmt25": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt39": true, - "stmt40": true, - "stmt41": true, - "stmt42": true, - "stmt43": true + "stmt239": true } } diff --git a/parser/testdata/01702_system_query_log/metadata.json b/parser/testdata/01702_system_query_log/metadata.json index 0b77aa1ad0..cb7a7d102e 100644 --- a/parser/testdata/01702_system_query_log/metadata.json +++ b/parser/testdata/01702_system_query_log/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt15": true, "stmt19": true, "stmt24": true, "stmt28": true, diff --git a/parser/testdata/03172_bcrypt_validation/metadata.json b/parser/testdata/03172_bcrypt_validation/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/03172_bcrypt_validation/metadata.json +++ b/parser/testdata/03172_bcrypt_validation/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} From fc2f39cc4ba599a0fd3d6936e1fd48ae52025722 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 03:38:39 +0000 Subject: [PATCH 19/21] Support ARRAY JOIN as table element in FROM clause - Add ArrayJoin field to TablesInSelectQueryElement struct - Handle ARRAY JOIN and LEFT ARRAY JOIN in parseTableElementWithJoin - Include token.ARRAY in isJoinKeyword check - Update explain output to handle ArrayJoin in table elements This enables parsing of queries like: FROM table ARRAY JOIN col INNER JOIN other_table USING (...) where ARRAY JOIN is followed by regular JOINs. --- ast/ast.go | 7 ++-- internal/explain/tables.go | 15 ++++++++- parser/parser.go | 13 +++++--- .../00855_join_with_array_join/metadata.json | 9 +----- .../metadata.json | 6 +--- .../02374_analyzer_array_join/metadata.json | 2 -- .../metadata.json | 32 +------------------ .../metadata.json | 8 +---- .../metadata.json | 6 +--- .../metadata.json | 7 +--- .../03258_multiple_array_joins/metadata.json | 6 +--- .../metadata.json | 8 +---- .../metadata.json | 12 +------ 13 files changed, 35 insertions(+), 96 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index 694f13b87c..cff485d1f8 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -126,9 +126,10 @@ func (t *TablesInSelectQuery) End() token.Position { return t.Position } // TablesInSelectQueryElement represents a single table element in a SELECT. type TablesInSelectQueryElement struct { - Position token.Position `json:"-"` - Table *TableExpression `json:"table"` - Join *TableJoin `json:"join,omitempty"` + Position token.Position `json:"-"` + Table *TableExpression `json:"table,omitempty"` + Join *TableJoin `json:"join,omitempty"` + ArrayJoin *ArrayJoinClause `json:"array_join,omitempty"` // For ARRAY JOIN as table element } func (t *TablesInSelectQueryElement) Pos() token.Position { return t.Position } diff --git a/internal/explain/tables.go b/internal/explain/tables.go index 58782173dc..dbae494017 100644 --- a/internal/explain/tables.go +++ b/internal/explain/tables.go @@ -15,10 +15,23 @@ func explainTablesInSelectQuery(sb *strings.Builder, n *ast.TablesInSelectQuery, } func explainTablesInSelectQueryElement(sb *strings.Builder, n *ast.TablesInSelectQueryElement, indent string, depth int) { - children := 1 // table + // If this element contains an ArrayJoin (not a table), handle it separately + if n.ArrayJoin != nil { + fmt.Fprintf(sb, "%sTablesInSelectQueryElement (children 1)\n", indent) + explainArrayJoinClause(sb, n.ArrayJoin, indent+" ", depth+1) + return + } + + children := 0 + if n.Table != nil { + children++ + } if n.Join != nil { children++ } + if children == 0 { + children = 1 // Fallback + } fmt.Fprintf(sb, "%sTablesInSelectQueryElement (children %d)\n", indent, children) if n.Table != nil { Node(sb, n.Table, depth+1) diff --git a/parser/parser.go b/parser/parser.go index 8da98d56a6..e828bcb779 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -793,13 +793,10 @@ func (p *Parser) parseTablesInSelect() *ast.TablesInSelectQuery { } func (p *Parser) isJoinKeyword() bool { - // LEFT ARRAY JOIN is handled by parseArrayJoin, not as a regular join - if p.currentIs(token.LEFT) && p.peekIs(token.ARRAY) { - return false - } switch p.current.Token { case token.JOIN, token.INNER, token.LEFT, token.RIGHT, token.FULL, token.CROSS, - token.GLOBAL, token.ANY, token.ALL, token.ASOF, token.SEMI, token.ANTI, token.PASTE: + token.GLOBAL, token.ANY, token.ALL, token.ASOF, token.SEMI, token.ANTI, token.PASTE, + token.ARRAY: return true case token.COMMA: return true @@ -837,6 +834,12 @@ func (p *Parser) parseTableElementWithJoin() *ast.TablesInSelectQueryElement { return elem } + // Handle ARRAY JOIN or LEFT ARRAY JOIN + if p.currentIs(token.ARRAY) || (p.currentIs(token.LEFT) && p.peekIs(token.ARRAY)) { + elem.ArrayJoin = p.parseArrayJoin() + return elem + } + // Parse JOIN join := &ast.TableJoin{ Position: p.current.Pos, diff --git a/parser/testdata/00855_join_with_array_join/metadata.json b/parser/testdata/00855_join_with_array_join/metadata.json index 22845e25fa..42691a609c 100644 --- a/parser/testdata/00855_join_with_array_join/metadata.json +++ b/parser/testdata/00855_join_with_array_join/metadata.json @@ -1,13 +1,6 @@ { "explain_todo": { - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt20": true, - "stmt21": true, "stmt22": true, - "stmt23": true, - "stmt3": true + "stmt23": true } } diff --git a/parser/testdata/01881_union_header_mismatch_bug/metadata.json b/parser/testdata/01881_union_header_mismatch_bug/metadata.json index 1295a45747..0967ef424b 100644 --- a/parser/testdata/01881_union_header_mismatch_bug/metadata.json +++ b/parser/testdata/01881_union_header_mismatch_bug/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt3": true - } -} +{} diff --git a/parser/testdata/02374_analyzer_array_join/metadata.json b/parser/testdata/02374_analyzer_array_join/metadata.json index d03c647723..fec152526a 100644 --- a/parser/testdata/02374_analyzer_array_join/metadata.json +++ b/parser/testdata/02374_analyzer_array_join/metadata.json @@ -1,7 +1,5 @@ { "explain_todo": { - "stmt14": true, - "stmt29": true, "stmt32": true } } diff --git a/parser/testdata/02477_analyzer_array_join_with_join/metadata.json b/parser/testdata/02477_analyzer_array_join_with_join/metadata.json index edd2c64a12..0967ef424b 100644 --- a/parser/testdata/02477_analyzer_array_join_with_join/metadata.json +++ b/parser/testdata/02477_analyzer_array_join_with_join/metadata.json @@ -1,31 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt17": true, - "stmt19": true, - "stmt21": true, - "stmt23": true, - "stmt25": true, - "stmt27": true, - "stmt29": true, - "stmt31": true, - "stmt33": true, - "stmt35": true, - "stmt37": true, - "stmt39": true, - "stmt41": true, - "stmt43": true, - "stmt45": true, - "stmt47": true, - "stmt49": true, - "stmt51": true, - "stmt53": true, - "stmt55": true, - "stmt57": true, - "stmt59": true, - "stmt61": true, - "stmt63": true, - "stmt65": true, - "stmt67": true - } -} +{} diff --git a/parser/testdata/02521_analyzer_array_join_crash/metadata.json b/parser/testdata/02521_analyzer_array_join_crash/metadata.json index bd1b4cdd81..0967ef424b 100644 --- a/parser/testdata/02521_analyzer_array_join_crash/metadata.json +++ b/parser/testdata/02521_analyzer_array_join_crash/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt6": true, - "stmt7": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03046_column_in_block_array_join/metadata.json b/parser/testdata/03046_column_in_block_array_join/metadata.json index 342b3ff5b4..0967ef424b 100644 --- a/parser/testdata/03046_column_in_block_array_join/metadata.json +++ b/parser/testdata/03046_column_in_block_array_join/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt8": true - } -} +{} diff --git a/parser/testdata/03130_analyzer_array_join_prefer_column/metadata.json b/parser/testdata/03130_analyzer_array_join_prefer_column/metadata.json index ef382ce51e..0967ef424b 100644 --- a/parser/testdata/03130_analyzer_array_join_prefer_column/metadata.json +++ b/parser/testdata/03130_analyzer_array_join_prefer_column/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt4": true, - "stmt5": true - } -} +{} diff --git a/parser/testdata/03258_multiple_array_joins/metadata.json b/parser/testdata/03258_multiple_array_joins/metadata.json index dbdbb76d4f..0967ef424b 100644 --- a/parser/testdata/03258_multiple_array_joins/metadata.json +++ b/parser/testdata/03258_multiple_array_joins/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt6": true - } -} +{} diff --git a/parser/testdata/03263_parquet_write_bloom_filter/metadata.json b/parser/testdata/03263_parquet_write_bloom_filter/metadata.json index b3b1cb229b..0967ef424b 100644 --- a/parser/testdata/03263_parquet_write_bloom_filter/metadata.json +++ b/parser/testdata/03263_parquet_write_bloom_filter/metadata.json @@ -1,7 +1 @@ -{ - "explain_todo": { - "stmt14": true, - "stmt18": true, - "stmt30": true - } -} +{} diff --git a/parser/testdata/03448_analyzer_array_join_alias_in_join_using_bug/metadata.json b/parser/testdata/03448_analyzer_array_join_alias_in_join_using_bug/metadata.json index 282890d79e..0967ef424b 100644 --- a/parser/testdata/03448_analyzer_array_join_alias_in_join_using_bug/metadata.json +++ b/parser/testdata/03448_analyzer_array_join_alias_in_join_using_bug/metadata.json @@ -1,11 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt4": true, - "stmt5": true, - "stmt6": true, - "stmt7": true, - "stmt8": true, - "stmt9": true - } -} +{} From 63ffdc06716e9ee1b3ed132bdd833df1d1715907 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 03:55:12 +0000 Subject: [PATCH 20/21] Fix LIMIT BY with second LIMIT and OFFSET BY syntax - Add LimitByLimit field to store the limit value before BY when there's a second LIMIT after BY (e.g., LIMIT 1 BY x LIMIT 3) - Add LimitByLimit to children count for SelectQuery - Handle BY after OFFSET for syntax like LIMIT 2 OFFSET 1 BY ALL - Update explain output to correctly order LimitByLimit, LimitBy, Limit This resolves 03570_limit_by_all and many other LIMIT BY related tests. --- ast/ast.go | 1 + internal/explain/select.go | 32 +++++++++++++++---- parser/parser.go | 16 ++++++++++ .../metadata.json | 6 +--- .../metadata.json | 6 +--- .../00409_shard_limit_by/metadata.json | 10 +----- .../metadata.json | 2 +- .../metadata.json | 7 +--- .../00939_limit_by_offset/metadata.json | 3 -- .../metadata.json | 2 +- .../testdata/01223_dist_on_dist/metadata.json | 6 +--- .../metadata.json | 1 - .../01252_weird_time_zone/metadata.json | 2 +- .../01471_limit_by_format/metadata.json | 7 +--- .../01622_codec_zstd_long/metadata.json | 6 +--- .../metadata.json | 1 - .../metadata.json | 9 +----- .../metadata.json | 6 +--- .../02281_limit_by_distributed/metadata.json | 6 +--- .../02971_limit_by_distributed/metadata.json | 7 +--- .../metadata.json | 7 +--- .../03165_order_by_duplicate/metadata.json | 6 +--- .../metadata.json | 11 +------ .../metadata.json | 9 +----- .../metadata.json | 7 +--- .../testdata/03570_limit_by_all/metadata.json | 32 +------------------ .../metadata.json | 18 +---------- .../metadata.json | 6 +--- .../03701_limit_by_in_order/metadata.json | 25 +-------------- .../metadata.json | 7 +--- .../metadata.json | 2 +- 31 files changed, 67 insertions(+), 199 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index cff485d1f8..349d96ef75 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -73,6 +73,7 @@ type SelectQuery struct { OrderBy []*OrderByElement `json:"order_by,omitempty"` Limit Expression `json:"limit,omitempty"` LimitBy []Expression `json:"limit_by,omitempty"` + LimitByLimit Expression `json:"limit_by_limit,omitempty"` // LIMIT value before BY (e.g., LIMIT 1 BY x LIMIT 3) LimitByHasLimit bool `json:"limit_by_has_limit,omitempty"` // true if LIMIT BY was followed by another LIMIT Offset Expression `json:"offset,omitempty"` Settings []*SettingExpr `json:"settings,omitempty"` diff --git a/internal/explain/select.go b/internal/explain/select.go index b6ff6b2909..eb727de271 100644 --- a/internal/explain/select.go +++ b/internal/explain/select.go @@ -129,16 +129,31 @@ func explainSelectQuery(sb *strings.Builder, n *ast.SelectQuery, indent string, if n.Offset != nil { Node(sb, n.Offset, depth+1) } - // LIMIT - if n.Limit != nil { - Node(sb, n.Limit, depth+1) - } - // LIMIT BY - only output when there's no ORDER BY and no second LIMIT (matches ClickHouse behavior) - if len(n.LimitBy) > 0 && len(n.OrderBy) == 0 && !n.LimitByHasLimit { + // LIMIT BY handling + if n.LimitByLimit != nil { + // Case: LIMIT n BY x LIMIT m -> output LimitByLimit, LimitBy, Limit + Node(sb, n.LimitByLimit, depth+1) + if len(n.LimitBy) > 0 { + fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, len(n.LimitBy)) + for _, expr := range n.LimitBy { + Node(sb, expr, depth+2) + } + } + if n.Limit != nil { + Node(sb, n.Limit, depth+1) + } + } else if len(n.LimitBy) > 0 { + // Case: LIMIT n BY x (no second LIMIT) -> output Limit, then LimitBy + if n.Limit != nil { + Node(sb, n.Limit, depth+1) + } fmt.Fprintf(sb, "%s ExpressionList (children %d)\n", indent, len(n.LimitBy)) for _, expr := range n.LimitBy { Node(sb, expr, depth+2) } + } else if n.Limit != nil { + // Case: plain LIMIT n (no BY) + Node(sb, n.Limit, depth+1) } // SETTINGS is output at SelectQuery level only when NOT after FORMAT // When SettingsAfterFormat is true, it's output at SelectWithUnionQuery level instead @@ -303,10 +318,13 @@ func countSelectQueryChildren(n *ast.SelectQuery) int { if len(n.OrderBy) > 0 { count++ } + if n.LimitByLimit != nil { + count++ // LIMIT n in "LIMIT n BY x LIMIT m" + } if n.Limit != nil { count++ } - if len(n.LimitBy) > 0 && len(n.OrderBy) == 0 && !n.LimitByHasLimit { + if len(n.LimitBy) > 0 { count++ } if n.Offset != nil { diff --git a/parser/parser.go b/parser/parser.go index e828bcb779..93ac4aa884 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -546,6 +546,8 @@ func (p *Parser) parseSelect() *ast.SelectQuery { // After LIMIT BY, there can be another LIMIT for overall output if p.currentIs(token.LIMIT) { p.nextToken() + // Save the LIMIT BY limit value (e.g., LIMIT 1 BY x -> LimitByLimit=1) + sel.LimitByLimit = sel.Limit sel.Limit = p.parseExpression(LOWEST) sel.LimitByHasLimit = true } @@ -566,6 +568,20 @@ func (p *Parser) parseSelect() *ast.SelectQuery { if p.currentIs(token.IDENT) && strings.ToUpper(p.current.Value) == "ROWS" { p.nextToken() } + // LIMIT n OFFSET m BY expr syntax - handle BY after OFFSET + if p.currentIs(token.BY) && sel.Limit != nil && len(sel.LimitBy) == 0 { + p.nextToken() + // Parse LIMIT BY expressions + for !p.isEndOfExpression() { + expr := p.parseExpression(LOWEST) + sel.LimitBy = append(sel.LimitBy, expr) + if p.currentIs(token.COMMA) { + p.nextToken() + } else { + break + } + } + } } // Parse FETCH FIRST ... ROW ONLY (SQL standard syntax) diff --git a/parser/testdata/00176_distinct_limit_by_limit_bug_43377/metadata.json b/parser/testdata/00176_distinct_limit_by_limit_bug_43377/metadata.json index e9d6e46171..0967ef424b 100644 --- a/parser/testdata/00176_distinct_limit_by_limit_bug_43377/metadata.json +++ b/parser/testdata/00176_distinct_limit_by_limit_bug_43377/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt1": true - } -} +{} diff --git a/parser/testdata/00184_shard_distributed_group_by_no_merge/metadata.json b/parser/testdata/00184_shard_distributed_group_by_no_merge/metadata.json index 983800a6c0..0967ef424b 100644 --- a/parser/testdata/00184_shard_distributed_group_by_no_merge/metadata.json +++ b/parser/testdata/00184_shard_distributed_group_by_no_merge/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt23": true - } -} +{} diff --git a/parser/testdata/00409_shard_limit_by/metadata.json b/parser/testdata/00409_shard_limit_by/metadata.json index fed202d983..0967ef424b 100644 --- a/parser/testdata/00409_shard_limit_by/metadata.json +++ b/parser/testdata/00409_shard_limit_by/metadata.json @@ -1,9 +1 @@ -{ - "explain_todo": { - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt21": true, - "stmt22": true - } -} +{} diff --git a/parser/testdata/00590_limit_by_column_removal/metadata.json b/parser/testdata/00590_limit_by_column_removal/metadata.json index 47b9f27593..0967ef424b 100644 --- a/parser/testdata/00590_limit_by_column_removal/metadata.json +++ b/parser/testdata/00590_limit_by_column_removal/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt2":true,"stmt3":true}} +{} diff --git a/parser/testdata/00743_limit_by_not_found_column/metadata.json b/parser/testdata/00743_limit_by_not_found_column/metadata.json index 60106a3b25..0967ef424b 100644 --- a/parser/testdata/00743_limit_by_not_found_column/metadata.json +++ b/parser/testdata/00743_limit_by_not_found_column/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/00939_limit_by_offset/metadata.json b/parser/testdata/00939_limit_by_offset/metadata.json index 2dda3f42fa..b563327205 100644 --- a/parser/testdata/00939_limit_by_offset/metadata.json +++ b/parser/testdata/00939_limit_by_offset/metadata.json @@ -1,8 +1,5 @@ { "explain_todo": { - "stmt4": true, - "stmt5": true, - "stmt6": true, "stmt7": true } } diff --git a/parser/testdata/01214_test_storage_merge_aliases_with_where/metadata.json b/parser/testdata/01214_test_storage_merge_aliases_with_where/metadata.json index 040cedf646..0967ef424b 100644 --- a/parser/testdata/01214_test_storage_merge_aliases_with_where/metadata.json +++ b/parser/testdata/01214_test_storage_merge_aliases_with_where/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt24":true}} +{} diff --git a/parser/testdata/01223_dist_on_dist/metadata.json b/parser/testdata/01223_dist_on_dist/metadata.json index b09bea8db0..0967ef424b 100644 --- a/parser/testdata/01223_dist_on_dist/metadata.json +++ b/parser/testdata/01223_dist_on_dist/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt25": true - } -} +{} diff --git a/parser/testdata/01244_optimize_distributed_group_by_sharding_key/metadata.json b/parser/testdata/01244_optimize_distributed_group_by_sharding_key/metadata.json index 0befee44ed..088eeac211 100644 --- a/parser/testdata/01244_optimize_distributed_group_by_sharding_key/metadata.json +++ b/parser/testdata/01244_optimize_distributed_group_by_sharding_key/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt52": true, "stmt86": true } } diff --git a/parser/testdata/01252_weird_time_zone/metadata.json b/parser/testdata/01252_weird_time_zone/metadata.json index 203fc0c174..0967ef424b 100644 --- a/parser/testdata/01252_weird_time_zone/metadata.json +++ b/parser/testdata/01252_weird_time_zone/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt10":true,"stmt11":true,"stmt12":true,"stmt13":true,"stmt14":true,"stmt8":true,"stmt9":true}} +{} diff --git a/parser/testdata/01471_limit_by_format/metadata.json b/parser/testdata/01471_limit_by_format/metadata.json index 682bda1cbc..0967ef424b 100644 --- a/parser/testdata/01471_limit_by_format/metadata.json +++ b/parser/testdata/01471_limit_by_format/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt1": true, - "stmt2": true - } -} +{} diff --git a/parser/testdata/01622_codec_zstd_long/metadata.json b/parser/testdata/01622_codec_zstd_long/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/01622_codec_zstd_long/metadata.json +++ b/parser/testdata/01622_codec_zstd_long/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/01757_optimize_skip_unused_shards_limit/metadata.json b/parser/testdata/01757_optimize_skip_unused_shards_limit/metadata.json index 5c560515d1..3a06a4a1ac 100644 --- a/parser/testdata/01757_optimize_skip_unused_shards_limit/metadata.json +++ b/parser/testdata/01757_optimize_skip_unused_shards_limit/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt18": true, "stmt5": true } } diff --git a/parser/testdata/02006_test_positional_arguments/metadata.json b/parser/testdata/02006_test_positional_arguments/metadata.json index 1db778b822..0967ef424b 100644 --- a/parser/testdata/02006_test_positional_arguments/metadata.json +++ b/parser/testdata/02006_test_positional_arguments/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt23": true, - "stmt24": true, - "stmt25": true, - "stmt26": true - } -} +{} diff --git a/parser/testdata/02178_column_function_insert_from/metadata.json b/parser/testdata/02178_column_function_insert_from/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/02178_column_function_insert_from/metadata.json +++ b/parser/testdata/02178_column_function_insert_from/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/02281_limit_by_distributed/metadata.json b/parser/testdata/02281_limit_by_distributed/metadata.json index e9d6e46171..0967ef424b 100644 --- a/parser/testdata/02281_limit_by_distributed/metadata.json +++ b/parser/testdata/02281_limit_by_distributed/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt1": true - } -} +{} diff --git a/parser/testdata/02971_limit_by_distributed/metadata.json b/parser/testdata/02971_limit_by_distributed/metadata.json index 0f293987f1..0967ef424b 100644 --- a/parser/testdata/02971_limit_by_distributed/metadata.json +++ b/parser/testdata/02971_limit_by_distributed/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt5": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03142_window_function_limit_by/metadata.json b/parser/testdata/03142_window_function_limit_by/metadata.json index 22ed9a7783..0967ef424b 100644 --- a/parser/testdata/03142_window_function_limit_by/metadata.json +++ b/parser/testdata/03142_window_function_limit_by/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt3": true, - "stmt6": true - } -} +{} diff --git a/parser/testdata/03165_order_by_duplicate/metadata.json b/parser/testdata/03165_order_by_duplicate/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/03165_order_by_duplicate/metadata.json +++ b/parser/testdata/03165_order_by_duplicate/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{} diff --git a/parser/testdata/03408_limit_by_rows_before_limit/metadata.json b/parser/testdata/03408_limit_by_rows_before_limit/metadata.json index 0087fbd8ca..0967ef424b 100644 --- a/parser/testdata/03408_limit_by_rows_before_limit/metadata.json +++ b/parser/testdata/03408_limit_by_rows_before_limit/metadata.json @@ -1,10 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt14": true, - "stmt23": true, - "stmt26": true, - "stmt29": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03408_limit_by_rows_before_limit_dist/metadata.json b/parser/testdata/03408_limit_by_rows_before_limit_dist/metadata.json index de8a2f3a69..0967ef424b 100644 --- a/parser/testdata/03408_limit_by_rows_before_limit_dist/metadata.json +++ b/parser/testdata/03408_limit_by_rows_before_limit_dist/metadata.json @@ -1,8 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt13": true, - "stmt16": true, - "stmt19": true - } -} +{} diff --git a/parser/testdata/03408_limit_by_rows_before_limit_mem/metadata.json b/parser/testdata/03408_limit_by_rows_before_limit_mem/metadata.json index 75e766d443..0967ef424b 100644 --- a/parser/testdata/03408_limit_by_rows_before_limit_mem/metadata.json +++ b/parser/testdata/03408_limit_by_rows_before_limit_mem/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt11": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/03570_limit_by_all/metadata.json b/parser/testdata/03570_limit_by_all/metadata.json index 166524b0b6..0967ef424b 100644 --- a/parser/testdata/03570_limit_by_all/metadata.json +++ b/parser/testdata/03570_limit_by_all/metadata.json @@ -1,31 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt20": true, - "stmt21": true, - "stmt22": true, - "stmt23": true, - "stmt24": true, - "stmt29": true, - "stmt30": true, - "stmt32": true, - "stmt33": true, - "stmt34": true, - "stmt35": true, - "stmt38": true, - "stmt39": true, - "stmt40": true, - "stmt42": true, - "stmt8": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03571_limit_by_all_old_planner/metadata.json b/parser/testdata/03571_limit_by_all_old_planner/metadata.json index d19544c66f..0967ef424b 100644 --- a/parser/testdata/03571_limit_by_all_old_planner/metadata.json +++ b/parser/testdata/03571_limit_by_all_old_planner/metadata.json @@ -1,17 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt15": true, - "stmt16": true, - "stmt17": true, - "stmt18": true, - "stmt19": true, - "stmt20": true, - "stmt22": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03631_select_replace_comprehensive/metadata.json b/parser/testdata/03631_select_replace_comprehensive/metadata.json index 7bf4b04abe..0967ef424b 100644 --- a/parser/testdata/03631_select_replace_comprehensive/metadata.json +++ b/parser/testdata/03631_select_replace_comprehensive/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt33": true - } -} +{} diff --git a/parser/testdata/03701_limit_by_in_order/metadata.json b/parser/testdata/03701_limit_by_in_order/metadata.json index 6c01dcbd85..0967ef424b 100644 --- a/parser/testdata/03701_limit_by_in_order/metadata.json +++ b/parser/testdata/03701_limit_by_in_order/metadata.json @@ -1,24 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt11": true, - "stmt12": true, - "stmt13": true, - "stmt14": true, - "stmt17": true, - "stmt19": true, - "stmt26": true, - "stmt27": true, - "stmt28": true, - "stmt29": true, - "stmt30": true, - "stmt31": true, - "stmt32": true, - "stmt33": true, - "stmt36": true, - "stmt38": true, - "stmt7": true, - "stmt8": true, - "stmt9": true - } -} +{} diff --git a/parser/testdata/03701_optimize_inverse_dictionary_lookup_basic/metadata.json b/parser/testdata/03701_optimize_inverse_dictionary_lookup_basic/metadata.json index e7c55a8034..0967ef424b 100644 --- a/parser/testdata/03701_optimize_inverse_dictionary_lookup_basic/metadata.json +++ b/parser/testdata/03701_optimize_inverse_dictionary_lookup_basic/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt118": true, - "stmt120": true - } -} +{} diff --git a/parser/testdata/03710_analyzer_limit_by_aggregate_validation/metadata.json b/parser/testdata/03710_analyzer_limit_by_aggregate_validation/metadata.json index 5a38038741..0967ef424b 100644 --- a/parser/testdata/03710_analyzer_limit_by_aggregate_validation/metadata.json +++ b/parser/testdata/03710_analyzer_limit_by_aggregate_validation/metadata.json @@ -1 +1 @@ -{"explain_todo":{"stmt7":true,"stmt8":true,"stmt9":true}} +{} From a4894165427a143fce652a11161830e58ad799c9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 31 Dec 2025 04:02:27 +0000 Subject: [PATCH 21/21] Fix ALTER DETACH/PARTITION ALL EXPLAIN output - DETACH_PARTITION is normalized to DROP_PARTITION in EXPLAIN AST (matching ClickHouse behavior) - PARTITION ALL is output as Partition_ID (empty) instead of Partition with Identifier ALL This resolves 00753_alter_attach and many other alter partition tests. --- internal/explain/statements.go | 20 +++++++++++++++---- .../00054_merge_tree_partitions/metadata.json | 7 +------ .../metadata.json | 6 +----- .../metadata.json | 5 +---- .../testdata/00753_alter_attach/metadata.json | 6 +----- .../00955_test_final_mark/metadata.json | 2 -- .../01021_only_tuple_columns/metadata.json | 6 +----- .../metadata.json | 6 +----- .../metadata.json | 1 - .../metadata.json | 6 +----- .../metadata.json | 6 +----- .../metadata.json | 8 -------- .../metadata.json | 6 +----- parser/testdata/02559_add_parts/metadata.json | 3 +-- .../metadata.json | 2 -- .../03254_attach_part_order/metadata.json | 6 +----- .../metadata.json | 7 +------ .../03636_storage_alias_basic/metadata.json | 3 +-- 18 files changed, 29 insertions(+), 77 deletions(-) diff --git a/internal/explain/statements.go b/internal/explain/statements.go index eb882c1767..83cb63511a 100644 --- a/internal/explain/statements.go +++ b/internal/explain/statements.go @@ -988,11 +988,15 @@ func explainAlterQuery(sb *strings.Builder, n *ast.AlterQuery, indent string, de func explainAlterCommand(sb *strings.Builder, cmd *ast.AlterCommand, indent string, depth int) { children := countAlterCommandChildren(cmd) - // CLEAR_STATISTICS is normalized to DROP_STATISTICS in EXPLAIN AST output + // Normalize command types to match ClickHouse EXPLAIN AST output cmdType := cmd.Type if cmdType == ast.AlterClearStatistics { cmdType = ast.AlterDropStatistics } + // DETACH_PARTITION is shown as DROP_PARTITION in EXPLAIN AST + if cmdType == ast.AlterDetachPartition { + cmdType = ast.AlterDropPartition + } fmt.Fprintf(sb, "%sAlterCommand %s (children %d)\n", indent, cmdType, children) switch cmd.Type { @@ -1056,8 +1060,13 @@ func explainAlterCommand(sb *strings.Builder, cmd *ast.AlterCommand, indent stri case ast.AlterDropPartition, ast.AlterDetachPartition, ast.AlterAttachPartition, ast.AlterReplacePartition, ast.AlterFreezePartition: if cmd.Partition != nil { - fmt.Fprintf(sb, "%s Partition (children 1)\n", indent) - Node(sb, cmd.Partition, depth+2) + // PARTITION ALL is shown as Partition_ID (empty) in EXPLAIN AST + if ident, ok := cmd.Partition.(*ast.Identifier); ok && strings.ToUpper(ident.Name()) == "ALL" { + fmt.Fprintf(sb, "%s Partition_ID \n", indent) + } else { + fmt.Fprintf(sb, "%s Partition (children 1)\n", indent) + Node(sb, cmd.Partition, depth+2) + } } case ast.AlterFreeze: // No children @@ -1244,7 +1253,10 @@ func countAlterCommandChildren(cmd *ast.AlterCommand) int { case ast.AlterDropPartition, ast.AlterDetachPartition, ast.AlterAttachPartition, ast.AlterReplacePartition, ast.AlterFreezePartition: if cmd.Partition != nil { - children++ + // PARTITION ALL doesn't count as a child (shown as Partition_ID empty) + if ident, ok := cmd.Partition.(*ast.Identifier); !ok || strings.ToUpper(ident.Name()) != "ALL" { + children++ + } } case ast.AlterFreeze: // No children diff --git a/parser/testdata/00054_merge_tree_partitions/metadata.json b/parser/testdata/00054_merge_tree_partitions/metadata.json index 8007cf1b4d..0967ef424b 100644 --- a/parser/testdata/00054_merge_tree_partitions/metadata.json +++ b/parser/testdata/00054_merge_tree_partitions/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt16": true, - "stmt8": true - } -} +{} diff --git a/parser/testdata/00152_insert_different_granularity/metadata.json b/parser/testdata/00152_insert_different_granularity/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/00152_insert_different_granularity/metadata.json +++ b/parser/testdata/00152_insert_different_granularity/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/00626_replace_partition_from_table/metadata.json b/parser/testdata/00626_replace_partition_from_table/metadata.json index 889aef75f3..cc4446e67a 100644 --- a/parser/testdata/00626_replace_partition_from_table/metadata.json +++ b/parser/testdata/00626_replace_partition_from_table/metadata.json @@ -1,9 +1,6 @@ { "explain_todo": { "stmt44": true, - "stmt46": true, - "stmt59": true, - "stmt60": true, - "stmt61": true + "stmt46": true } } diff --git a/parser/testdata/00753_alter_attach/metadata.json b/parser/testdata/00753_alter_attach/metadata.json index 69fcb09704..407a67123a 100644 --- a/parser/testdata/00753_alter_attach/metadata.json +++ b/parser/testdata/00753_alter_attach/metadata.json @@ -3,7 +3,6 @@ "stmt14": true, "stmt22": true, "stmt34": true, - "stmt4": true, "stmt42": true, "stmt51": true, "stmt52": true, @@ -14,16 +13,13 @@ "stmt58": true, "stmt63": true, "stmt65": true, - "stmt67": true, "stmt69": true, "stmt71": true, "stmt73": true, "stmt77": true, "stmt79": true, - "stmt81": true, "stmt83": true, "stmt85": true, - "stmt87": true, - "stmt9": true + "stmt87": true } } diff --git a/parser/testdata/00955_test_final_mark/metadata.json b/parser/testdata/00955_test_final_mark/metadata.json index e5230cc337..f18e4d9975 100644 --- a/parser/testdata/00955_test_final_mark/metadata.json +++ b/parser/testdata/00955_test_final_mark/metadata.json @@ -3,8 +3,6 @@ "stmt20": true, "stmt21": true, "stmt26": true, - "stmt36": true, - "stmt41": true, "stmt53": true } } diff --git a/parser/testdata/01021_only_tuple_columns/metadata.json b/parser/testdata/01021_only_tuple_columns/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/01021_only_tuple_columns/metadata.json +++ b/parser/testdata/01021_only_tuple_columns/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/01060_shutdown_table_after_detach/metadata.json b/parser/testdata/01060_shutdown_table_after_detach/metadata.json index b65b07d7a6..0967ef424b 100644 --- a/parser/testdata/01060_shutdown_table_after_detach/metadata.json +++ b/parser/testdata/01060_shutdown_table_after_detach/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt4": true - } -} +{} diff --git a/parser/testdata/01701_clear_projection_and_part_remove/metadata.json b/parser/testdata/01701_clear_projection_and_part_remove/metadata.json index f6d9f2395b..342b3ff5b4 100644 --- a/parser/testdata/01701_clear_projection_and_part_remove/metadata.json +++ b/parser/testdata/01701_clear_projection_and_part_remove/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt7": true, "stmt8": true } } diff --git a/parser/testdata/01710_projection_detach_part/metadata.json b/parser/testdata/01710_projection_detach_part/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/01710_projection_detach_part/metadata.json +++ b/parser/testdata/01710_projection_detach_part/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/02456_alter-nullable-column-bag-2/metadata.json b/parser/testdata/02456_alter-nullable-column-bag-2/metadata.json index b563327205..0967ef424b 100644 --- a/parser/testdata/02456_alter-nullable-column-bag-2/metadata.json +++ b/parser/testdata/02456_alter-nullable-column-bag-2/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt7": true - } -} +{} diff --git a/parser/testdata/02461_alter_update_respect_part_column_type_bug/metadata.json b/parser/testdata/02461_alter_update_respect_part_column_type_bug/metadata.json index 2a6b137b4e..063b99afba 100644 --- a/parser/testdata/02461_alter_update_respect_part_column_type_bug/metadata.json +++ b/parser/testdata/02461_alter_update_respect_part_column_type_bug/metadata.json @@ -1,16 +1,8 @@ { "explain_todo": { - "stmt12": true, "stmt15": true, - "stmt20": true, - "stmt28": true, - "stmt37": true, - "stmt4": true, "stmt40": true, - "stmt45": true, "stmt48": true, - "stmt53": true, - "stmt61": true, "stmt7": true } } diff --git a/parser/testdata/02553_new_type_json_attach_partition/metadata.json b/parser/testdata/02553_new_type_json_attach_partition/metadata.json index 3a06a4a1ac..0967ef424b 100644 --- a/parser/testdata/02553_new_type_json_attach_partition/metadata.json +++ b/parser/testdata/02553_new_type_json_attach_partition/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt5": true - } -} +{} diff --git a/parser/testdata/02559_add_parts/metadata.json b/parser/testdata/02559_add_parts/metadata.json index 0296f5db5b..e9d6e46171 100644 --- a/parser/testdata/02559_add_parts/metadata.json +++ b/parser/testdata/02559_add_parts/metadata.json @@ -1,6 +1,5 @@ { "explain_todo": { - "stmt1": true, - "stmt7": true + "stmt1": true } } diff --git a/parser/testdata/03100_lwu_22_detach_attach_patches/metadata.json b/parser/testdata/03100_lwu_22_detach_attach_patches/metadata.json index 4f70494184..8653316185 100644 --- a/parser/testdata/03100_lwu_22_detach_attach_patches/metadata.json +++ b/parser/testdata/03100_lwu_22_detach_attach_patches/metadata.json @@ -3,9 +3,7 @@ "stmt15": true, "stmt16": true, "stmt17": true, - "stmt20": true, "stmt21": true, - "stmt22": true, "stmt23": true, "stmt24": true, "stmt25": true, diff --git a/parser/testdata/03254_attach_part_order/metadata.json b/parser/testdata/03254_attach_part_order/metadata.json index 8c6a18d871..0967ef424b 100644 --- a/parser/testdata/03254_attach_part_order/metadata.json +++ b/parser/testdata/03254_attach_part_order/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt19": true - } -} +{} diff --git a/parser/testdata/03283_optimize_on_insert_level/metadata.json b/parser/testdata/03283_optimize_on_insert_level/metadata.json index b6bcf6a09c..0967ef424b 100644 --- a/parser/testdata/03283_optimize_on_insert_level/metadata.json +++ b/parser/testdata/03283_optimize_on_insert_level/metadata.json @@ -1,6 +1 @@ -{ - "explain_todo": { - "stmt10": true, - "stmt20": true - } -} +{} diff --git a/parser/testdata/03636_storage_alias_basic/metadata.json b/parser/testdata/03636_storage_alias_basic/metadata.json index a4252da26a..7f91686195 100644 --- a/parser/testdata/03636_storage_alias_basic/metadata.json +++ b/parser/testdata/03636_storage_alias_basic/metadata.json @@ -2,7 +2,6 @@ "explain_todo": { "stmt32": true, "stmt52": true, - "stmt55": true, - "stmt65": true + "stmt55": true } }