diff --git a/internal/format/expressions.go b/internal/format/expressions.go index 81e674dcd6..d8aff9343b 100644 --- a/internal/format/expressions.go +++ b/internal/format/expressions.go @@ -30,6 +30,44 @@ func Expression(sb *strings.Builder, expr ast.Expression) { formatAsterisk(sb, e) case *ast.AliasedExpr: formatAliasedExpr(sb, e) + case *ast.Subquery: + formatSubquery(sb, e) + case *ast.LikeExpr: + formatLikeExpr(sb, e) + case *ast.CaseExpr: + formatCaseExpr(sb, e) + case *ast.CastExpr: + formatCastExpr(sb, e) + case *ast.InExpr: + formatInExpr(sb, e) + case *ast.BetweenExpr: + formatBetweenExpr(sb, e) + case *ast.IsNullExpr: + formatIsNullExpr(sb, e) + case *ast.TernaryExpr: + formatTernaryExpr(sb, e) + case *ast.ArrayAccess: + formatArrayAccess(sb, e) + case *ast.TupleAccess: + formatTupleAccess(sb, e) + case *ast.IntervalExpr: + formatIntervalExpr(sb, e) + case *ast.ExtractExpr: + formatExtractExpr(sb, e) + case *ast.Lambda: + formatLambda(sb, e) + case *ast.ColumnsMatcher: + formatColumnsMatcher(sb, e) + case *ast.WithElement: + formatWithElement(sb, e) + case *ast.ExistsExpr: + formatExistsExpr(sb, e) + case *ast.DataType: + formatDataType(sb, e) + case *ast.NameTypePair: + formatNameTypePair(sb, e) + case *ast.Parameter: + formatParameter(sb, e) default: // Fallback for unhandled expressions sb.WriteString(fmt.Sprintf("%v", expr)) @@ -164,3 +202,216 @@ func formatAliasedExpr(sb *strings.Builder, a *ast.AliasedExpr) { sb.WriteString(" AS ") sb.WriteString(a.Alias) } + +// formatSubquery formats a subquery expression. +func formatSubquery(sb *strings.Builder, s *ast.Subquery) { + sb.WriteString("(") + Statement(sb, s.Query) + sb.WriteString(")") +} + +// formatLikeExpr formats a LIKE expression. +func formatLikeExpr(sb *strings.Builder, l *ast.LikeExpr) { + Expression(sb, l.Expr) + if l.Not { + sb.WriteString(" NOT") + } + if l.CaseInsensitive { + sb.WriteString(" ILIKE ") + } else { + sb.WriteString(" LIKE ") + } + Expression(sb, l.Pattern) +} + +// formatCaseExpr formats a CASE expression. +func formatCaseExpr(sb *strings.Builder, c *ast.CaseExpr) { + sb.WriteString("CASE") + if c.Operand != nil { + sb.WriteString(" ") + Expression(sb, c.Operand) + } + for _, when := range c.Whens { + sb.WriteString(" WHEN ") + Expression(sb, when.Condition) + sb.WriteString(" THEN ") + Expression(sb, when.Result) + } + if c.Else != nil { + sb.WriteString(" ELSE ") + Expression(sb, c.Else) + } + sb.WriteString(" END") +} + +// formatCastExpr formats a CAST expression. +func formatCastExpr(sb *strings.Builder, c *ast.CastExpr) { + if c.OperatorSyntax { + Expression(sb, c.Expr) + sb.WriteString("::") + formatDataType(sb, c.Type) + } else { + sb.WriteString("CAST(") + Expression(sb, c.Expr) + if c.UsedASSyntax { + sb.WriteString(" AS ") + formatDataType(sb, c.Type) + } else if c.TypeExpr != nil { + sb.WriteString(", ") + Expression(sb, c.TypeExpr) + } else if c.Type != nil { + sb.WriteString(", '") + sb.WriteString(c.Type.Name) + sb.WriteString("'") + } + sb.WriteString(")") + } +} + +// formatInExpr formats an IN expression. +func formatInExpr(sb *strings.Builder, i *ast.InExpr) { + Expression(sb, i.Expr) + if i.Global { + sb.WriteString(" GLOBAL") + } + if i.Not { + sb.WriteString(" NOT IN ") + } else { + sb.WriteString(" IN ") + } + if i.Query != nil { + sb.WriteString("(") + Statement(sb, i.Query) + sb.WriteString(")") + } else { + sb.WriteString("(") + for j, e := range i.List { + if j > 0 { + sb.WriteString(", ") + } + Expression(sb, e) + } + sb.WriteString(")") + } +} + +// formatBetweenExpr formats a BETWEEN expression. +func formatBetweenExpr(sb *strings.Builder, b *ast.BetweenExpr) { + Expression(sb, b.Expr) + if b.Not { + sb.WriteString(" NOT BETWEEN ") + } else { + sb.WriteString(" BETWEEN ") + } + Expression(sb, b.Low) + sb.WriteString(" AND ") + Expression(sb, b.High) +} + +// formatIsNullExpr formats an IS NULL expression. +func formatIsNullExpr(sb *strings.Builder, i *ast.IsNullExpr) { + Expression(sb, i.Expr) + if i.Not { + sb.WriteString(" IS NOT NULL") + } else { + sb.WriteString(" IS NULL") + } +} + +// formatTernaryExpr formats a ternary expression. +func formatTernaryExpr(sb *strings.Builder, t *ast.TernaryExpr) { + Expression(sb, t.Condition) + sb.WriteString(" ? ") + Expression(sb, t.Then) + sb.WriteString(" : ") + Expression(sb, t.Else) +} + +// formatArrayAccess formats an array access expression. +func formatArrayAccess(sb *strings.Builder, a *ast.ArrayAccess) { + Expression(sb, a.Array) + sb.WriteString("[") + Expression(sb, a.Index) + sb.WriteString("]") +} + +// formatTupleAccess formats a tuple access expression. +func formatTupleAccess(sb *strings.Builder, t *ast.TupleAccess) { + Expression(sb, t.Tuple) + sb.WriteString(".") + Expression(sb, t.Index) +} + +// formatIntervalExpr formats an INTERVAL expression. +func formatIntervalExpr(sb *strings.Builder, i *ast.IntervalExpr) { + sb.WriteString("INTERVAL ") + Expression(sb, i.Value) + sb.WriteString(" ") + sb.WriteString(i.Unit) +} + +// formatExtractExpr formats an EXTRACT expression. +func formatExtractExpr(sb *strings.Builder, e *ast.ExtractExpr) { + sb.WriteString("EXTRACT(") + sb.WriteString(e.Field) + sb.WriteString(" FROM ") + Expression(sb, e.From) + sb.WriteString(")") +} + +// formatLambda formats a lambda expression. +func formatLambda(sb *strings.Builder, l *ast.Lambda) { + if len(l.Parameters) == 1 { + sb.WriteString(l.Parameters[0]) + } else { + sb.WriteString("(") + for i, p := range l.Parameters { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(p) + } + sb.WriteString(")") + } + sb.WriteString(" -> ") + Expression(sb, l.Body) +} + +// formatColumnsMatcher formats a COLUMNS expression. +func formatColumnsMatcher(sb *strings.Builder, c *ast.ColumnsMatcher) { + sb.WriteString("COLUMNS('") + sb.WriteString(c.Pattern) + sb.WriteString("')") +} + +// formatWithElement formats a WITH element. +func formatWithElement(sb *strings.Builder, w *ast.WithElement) { + Expression(sb, w.Query) + sb.WriteString(" AS ") + sb.WriteString(w.Name) +} + +// formatExistsExpr formats an EXISTS expression. +func formatExistsExpr(sb *strings.Builder, e *ast.ExistsExpr) { + sb.WriteString("EXISTS (") + Statement(sb, e.Query) + sb.WriteString(")") +} + +// formatNameTypePair formats a name-type pair. +func formatNameTypePair(sb *strings.Builder, n *ast.NameTypePair) { + sb.WriteString(n.Name) + sb.WriteString(" ") + formatDataType(sb, n.Type) +} + +// formatParameter formats a parameter. +func formatParameter(sb *strings.Builder, p *ast.Parameter) { + sb.WriteString("{") + sb.WriteString(p.Name) + if p.Type != nil { + sb.WriteString(":") + formatDataType(sb, p.Type) + } + sb.WriteString("}") +} diff --git a/internal/format/format.go b/internal/format/format.go index ad3859eaf3..02d81bb25e 100644 --- a/internal/format/format.go +++ b/internal/format/format.go @@ -31,7 +31,39 @@ func Statement(sb *strings.Builder, stmt ast.Statement) { formatSelectWithUnionQuery(sb, s) case *ast.SelectQuery: formatSelectQuery(sb, s) + case *ast.SelectIntersectExceptQuery: + formatSelectIntersectExceptQuery(sb, s) + case *ast.SetQuery: + formatSetQuery(sb, s) + case *ast.DropQuery: + formatDropQuery(sb, s) + case *ast.CreateQuery: + formatCreateQuery(sb, s) + case *ast.InsertQuery: + formatInsertQuery(sb, s) + case *ast.AlterQuery: + formatAlterQuery(sb, s) + case *ast.TruncateQuery: + formatTruncateQuery(sb, s) + case *ast.UseQuery: + formatUseQuery(sb, s) + case *ast.DescribeQuery: + formatDescribeQuery(sb, s) + case *ast.ShowQuery: + formatShowQuery(sb, s) + case *ast.ExplainQuery: + formatExplainQuery(sb, s) + case *ast.OptimizeQuery: + formatOptimizeQuery(sb, s) + case *ast.SystemQuery: + formatSystemQuery(sb, s) + case *ast.RenameQuery: + formatRenameQuery(sb, s) + case *ast.ExchangeQuery: + formatExchangeQuery(sb, s) + case *ast.ExistsQuery: + formatExistsQueryStmt(sb, s) default: - // For now, only handle SELECT statements + // Fallback for unhandled statements } } diff --git a/internal/format/statements.go b/internal/format/statements.go index 28c3839e18..750a975487 100644 --- a/internal/format/statements.go +++ b/internal/format/statements.go @@ -29,6 +29,19 @@ func formatSelectQuery(sb *strings.Builder, q *ast.SelectQuery) { if q == nil { return } + + // Format WITH clause + if len(q.With) > 0 { + sb.WriteString("WITH ") + for i, w := range q.With { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, w) + } + sb.WriteString(" ") + } + sb.WriteString("SELECT ") if q.Distinct { @@ -49,6 +62,17 @@ func formatSelectQuery(sb *strings.Builder, q *ast.SelectQuery) { formatTablesInSelectQuery(sb, q.From) } + // Format ARRAY JOIN clause + if q.ArrayJoin != nil { + formatArrayJoinClause(sb, q.ArrayJoin) + } + + // Format PREWHERE clause + if q.PreWhere != nil { + sb.WriteString(" PREWHERE ") + Expression(sb, q.PreWhere) + } + // Format WHERE clause if q.Where != nil { sb.WriteString(" WHERE ") @@ -64,6 +88,15 @@ func formatSelectQuery(sb *strings.Builder, q *ast.SelectQuery) { } Expression(sb, expr) } + if q.WithRollup { + sb.WriteString(" WITH ROLLUP") + } + if q.WithCube { + sb.WriteString(" WITH CUBE") + } + if q.WithTotals { + sb.WriteString(" WITH TOTALS") + } } // Format HAVING clause @@ -83,34 +116,141 @@ func formatSelectQuery(sb *strings.Builder, q *ast.SelectQuery) { } } - // Format LIMIT clause + // Format LIMIT clause with OFFSET if q.Limit != nil { sb.WriteString(" LIMIT ") Expression(sb, q.Limit) } + if q.Offset != nil { + sb.WriteString(" OFFSET ") + Expression(sb, q.Offset) + } + + // Format SETTINGS clause + if len(q.Settings) > 0 { + sb.WriteString(" SETTINGS ") + for i, s := range q.Settings { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(s.Name) + sb.WriteString(" = ") + Expression(sb, s.Value) + } + } + + // Format FORMAT clause + if q.Format != nil { + sb.WriteString(" FORMAT ") + sb.WriteString(q.Format.Name()) + } +} + +// formatArrayJoinClause formats an ARRAY JOIN clause. +func formatArrayJoinClause(sb *strings.Builder, a *ast.ArrayJoinClause) { + if a.Left { + sb.WriteString(" LEFT") + } + sb.WriteString(" ARRAY JOIN ") + for i, col := range a.Columns { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, col) + } } // formatTablesInSelectQuery formats the FROM clause tables. func formatTablesInSelectQuery(sb *strings.Builder, t *ast.TablesInSelectQuery) { for i, elem := range t.Tables { if i > 0 { - // TODO: Handle JOINs properly - sb.WriteString(", ") + if elem.Join == nil { + sb.WriteString(", ") + } else if isImplicitCrossJoin(elem.Join) { + // Cross join without ON/USING is represented as comma-separated + sb.WriteString(", ") + if elem.Table != nil { + formatTableExpression(sb, elem.Table) + } + continue + } } formatTablesInSelectQueryElement(sb, elem) } } +// isImplicitCrossJoin checks if a join is an implicit cross join (comma-separated) +func isImplicitCrossJoin(j *ast.TableJoin) bool { + // Empty type or CROSS with no ON/USING is implicit cross join + return (j.Type == "" || j.Type == ast.JoinCross) && j.On == nil && len(j.Using) == 0 && !j.Global && j.Strictness == "" +} + // formatTablesInSelectQueryElement formats a single table element. func formatTablesInSelectQueryElement(sb *strings.Builder, t *ast.TablesInSelectQueryElement) { + if t.Join != nil { + formatTableJoinPrefix(sb, t.Join) + } if t.Table != nil { formatTableExpression(sb, t.Table) } + if t.Join != nil { + formatTableJoinSuffix(sb, t.Join) + } +} + +// formatTableJoinPrefix formats the JOIN keyword and modifiers. +func formatTableJoinPrefix(sb *strings.Builder, j *ast.TableJoin) { + sb.WriteString(" ") + if j.Global { + sb.WriteString("GLOBAL ") + } + if j.Strictness != "" { + sb.WriteString(string(j.Strictness)) + sb.WriteString(" ") + } + if j.Type != "" { + sb.WriteString(string(j.Type)) + sb.WriteString(" ") + } + sb.WriteString("JOIN ") +} + +// formatTableJoinSuffix formats the ON or USING clause. +func formatTableJoinSuffix(sb *strings.Builder, j *ast.TableJoin) { + if j.On != nil { + sb.WriteString(" ON ") + Expression(sb, j.On) + } else if len(j.Using) > 0 { + sb.WriteString(" USING ") + if len(j.Using) == 1 { + Expression(sb, j.Using[0]) + } else { + sb.WriteString("(") + for i, u := range j.Using { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, u) + } + sb.WriteString(")") + } + } } // formatTableExpression formats a table expression. func formatTableExpression(sb *strings.Builder, t *ast.TableExpression) { Expression(sb, t.Table) + if t.Final { + sb.WriteString(" FINAL") + } + if t.Sample != nil { + sb.WriteString(" SAMPLE ") + Expression(sb, t.Sample.Ratio) + if t.Sample.Offset != nil { + sb.WriteString(" OFFSET ") + Expression(sb, t.Sample.Offset) + } + } if t.Alias != "" { sb.WriteString(" AS ") sb.WriteString(t.Alias) @@ -123,4 +263,675 @@ func formatOrderByElement(sb *strings.Builder, o *ast.OrderByElement) { if o.Descending { sb.WriteString(" DESC") } + if o.NullsFirst != nil { + if *o.NullsFirst { + sb.WriteString(" NULLS FIRST") + } else { + sb.WriteString(" NULLS LAST") + } + } + if o.Collate != "" { + sb.WriteString(" COLLATE ") + sb.WriteString(o.Collate) + } + if o.WithFill { + sb.WriteString(" WITH FILL") + if o.FillFrom != nil { + sb.WriteString(" FROM ") + Expression(sb, o.FillFrom) + } + if o.FillTo != nil { + sb.WriteString(" TO ") + Expression(sb, o.FillTo) + } + if o.FillStep != nil { + sb.WriteString(" STEP ") + Expression(sb, o.FillStep) + } + } +} + +// formatSelectIntersectExceptQuery formats a SELECT INTERSECT/EXCEPT query. +func formatSelectIntersectExceptQuery(sb *strings.Builder, q *ast.SelectIntersectExceptQuery) { + for i, sel := range q.Selects { + if i > 0 { + sb.WriteString(" ") + } + Statement(sb, sel) + } +} + +// formatSetQuery formats a SET statement. +func formatSetQuery(sb *strings.Builder, q *ast.SetQuery) { + if q == nil { + return + } + sb.WriteString("SET ") + for i, s := range q.Settings { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(s.Name) + sb.WriteString(" = ") + Expression(sb, s.Value) + } +} + +// formatDropQuery formats a DROP statement. +func formatDropQuery(sb *strings.Builder, q *ast.DropQuery) { + if q == nil { + return + } + sb.WriteString("DROP ") + if q.DropDatabase { + sb.WriteString("DATABASE ") + } else if q.View != "" { + sb.WriteString("VIEW ") + } else if q.Function != "" { + sb.WriteString("FUNCTION ") + } else if q.User != "" { + sb.WriteString("USER ") + } else { + if q.Temporary { + sb.WriteString("TEMPORARY ") + } + sb.WriteString("TABLE ") + } + if q.IfExists { + sb.WriteString("IF EXISTS ") + } + if q.DropDatabase { + sb.WriteString(q.Database) + } else if q.View != "" { + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.View) + } else if q.Function != "" { + sb.WriteString(q.Function) + } else if q.User != "" { + sb.WriteString(q.User) + } else if len(q.Tables) > 0 { + for i, t := range q.Tables { + if i > 0 { + sb.WriteString(", ") + } + if t.Database != "" { + sb.WriteString(t.Database) + sb.WriteString(".") + } + sb.WriteString(t.Table) + } + } else { + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + } + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } + if q.Sync { + sb.WriteString(" SYNC") + } +} + +// formatCreateQuery formats a CREATE statement. +func formatCreateQuery(sb *strings.Builder, q *ast.CreateQuery) { + if q == nil { + return + } + sb.WriteString("CREATE ") + if q.OrReplace { + sb.WriteString("OR REPLACE ") + } + if q.CreateDatabase { + sb.WriteString("DATABASE ") + if q.IfNotExists { + sb.WriteString("IF NOT EXISTS ") + } + sb.WriteString(q.Database) + } else if q.CreateFunction { + sb.WriteString("FUNCTION ") + if q.IfNotExists { + sb.WriteString("IF NOT EXISTS ") + } + sb.WriteString(q.FunctionName) + sb.WriteString(" AS ") + Expression(sb, q.FunctionBody) + } else if q.View != "" { + if q.Materialized { + sb.WriteString("MATERIALIZED VIEW ") + } else { + sb.WriteString("VIEW ") + } + if q.IfNotExists { + sb.WriteString("IF NOT EXISTS ") + } + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.View) + if q.To != "" { + sb.WriteString(" TO ") + sb.WriteString(q.To) + } + if q.AsSelect != nil { + sb.WriteString(" AS ") + Statement(sb, q.AsSelect) + } + } else { + if q.Temporary { + sb.WriteString("TEMPORARY ") + } + sb.WriteString("TABLE ") + if q.IfNotExists { + sb.WriteString("IF NOT EXISTS ") + } + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } + if len(q.Columns) > 0 { + sb.WriteString(" (") + for i, col := range q.Columns { + if i > 0 { + sb.WriteString(", ") + } + formatColumnDeclaration(sb, col) + } + sb.WriteString(")") + } + if q.Engine != nil { + sb.WriteString(" ENGINE = ") + sb.WriteString(q.Engine.Name) + if q.Engine.HasParentheses || len(q.Engine.Parameters) > 0 { + sb.WriteString("(") + for i, p := range q.Engine.Parameters { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, p) + } + sb.WriteString(")") + } + } + if len(q.OrderBy) > 0 { + sb.WriteString(" ORDER BY ") + if len(q.OrderBy) == 1 { + Expression(sb, q.OrderBy[0]) + } else { + sb.WriteString("(") + for i, e := range q.OrderBy { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, e) + } + sb.WriteString(")") + } + } + if q.PartitionBy != nil { + sb.WriteString(" PARTITION BY ") + Expression(sb, q.PartitionBy) + } + if len(q.PrimaryKey) > 0 { + sb.WriteString(" PRIMARY KEY ") + if len(q.PrimaryKey) == 1 { + Expression(sb, q.PrimaryKey[0]) + } else { + sb.WriteString("(") + for i, e := range q.PrimaryKey { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, e) + } + sb.WriteString(")") + } + } + if q.SampleBy != nil { + sb.WriteString(" SAMPLE BY ") + Expression(sb, q.SampleBy) + } + if q.AsSelect != nil { + sb.WriteString(" AS ") + Statement(sb, q.AsSelect) + } + } +} + +// formatColumnDeclaration formats a column declaration. +func formatColumnDeclaration(sb *strings.Builder, c *ast.ColumnDeclaration) { + sb.WriteString(c.Name) + sb.WriteString(" ") + formatDataType(sb, c.Type) + if c.Nullable != nil { + if *c.Nullable { + sb.WriteString(" NULL") + } else { + sb.WriteString(" NOT NULL") + } + } + if c.Default != nil { + if c.DefaultKind != "" { + sb.WriteString(" ") + sb.WriteString(c.DefaultKind) + sb.WriteString(" ") + } else { + sb.WriteString(" DEFAULT ") + } + Expression(sb, c.Default) + } + if c.Codec != nil { + sb.WriteString(" CODEC(") + for i, codec := range c.Codec.Codecs { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(codec.Name) + if len(codec.Arguments) > 0 { + sb.WriteString("(") + for j, arg := range codec.Arguments { + if j > 0 { + sb.WriteString(", ") + } + Expression(sb, arg) + } + sb.WriteString(")") + } + } + sb.WriteString(")") + } + if c.Comment != "" { + sb.WriteString(" COMMENT '") + sb.WriteString(c.Comment) + sb.WriteString("'") + } +} + +// formatDataType formats a data type. +func formatDataType(sb *strings.Builder, d *ast.DataType) { + if d == nil { + return + } + sb.WriteString(d.Name) + if len(d.Parameters) > 0 || d.HasParentheses { + sb.WriteString("(") + for i, p := range d.Parameters { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, p) + } + sb.WriteString(")") + } +} + +// formatInsertQuery formats an INSERT statement. +func formatInsertQuery(sb *strings.Builder, q *ast.InsertQuery) { + if q == nil { + return + } + sb.WriteString("INSERT INTO ") + if q.Function != nil { + sb.WriteString("FUNCTION ") + sb.WriteString(q.Function.Name) + sb.WriteString("(") + for i, arg := range q.Function.Arguments { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, arg) + } + sb.WriteString(")") + } else { + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + } + if len(q.Columns) > 0 { + sb.WriteString(" (") + for i, col := range q.Columns { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(col.Name()) + } + sb.WriteString(")") + } + if q.Select != nil { + sb.WriteString(" ") + Statement(sb, q.Select) + } + if q.Format != nil { + sb.WriteString(" FORMAT ") + sb.WriteString(q.Format.Name()) + } +} + +// formatAlterQuery formats an ALTER statement. +func formatAlterQuery(sb *strings.Builder, q *ast.AlterQuery) { + if q == nil { + return + } + sb.WriteString("ALTER TABLE ") + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } + for i, cmd := range q.Commands { + if i > 0 { + sb.WriteString(",") + } + sb.WriteString(" ") + formatAlterCommand(sb, cmd) + } +} + +// formatAlterCommand formats an ALTER command. +func formatAlterCommand(sb *strings.Builder, c *ast.AlterCommand) { + switch c.Type { + case ast.AlterAddColumn: + sb.WriteString("ADD COLUMN ") + if c.IfNotExists { + sb.WriteString("IF NOT EXISTS ") + } + formatColumnDeclaration(sb, c.Column) + if c.AfterColumn != "" { + sb.WriteString(" AFTER ") + sb.WriteString(c.AfterColumn) + } + case ast.AlterDropColumn: + sb.WriteString("DROP COLUMN ") + if c.IfExists { + sb.WriteString("IF EXISTS ") + } + sb.WriteString(c.ColumnName) + case ast.AlterModifyColumn: + sb.WriteString("MODIFY COLUMN ") + if c.IfExists { + sb.WriteString("IF EXISTS ") + } + formatColumnDeclaration(sb, c.Column) + case ast.AlterRenameColumn: + sb.WriteString("RENAME COLUMN ") + if c.IfExists { + sb.WriteString("IF EXISTS ") + } + sb.WriteString(c.ColumnName) + sb.WriteString(" TO ") + sb.WriteString(c.NewName) + case ast.AlterDeleteWhere: + sb.WriteString("DELETE WHERE ") + Expression(sb, c.Where) + case ast.AlterUpdate: + sb.WriteString("UPDATE ") + for i, a := range c.Assignments { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(a.Column) + sb.WriteString(" = ") + Expression(sb, a.Value) + } + if c.Where != nil { + sb.WriteString(" WHERE ") + Expression(sb, c.Where) + } + case ast.AlterDropPartition: + sb.WriteString("DROP PARTITION ") + Expression(sb, c.Partition) + case ast.AlterDetachPartition: + sb.WriteString("DETACH PARTITION ") + Expression(sb, c.Partition) + case ast.AlterAttachPartition: + sb.WriteString("ATTACH PARTITION ") + Expression(sb, c.Partition) + if c.FromTable != "" { + sb.WriteString(" FROM ") + sb.WriteString(c.FromTable) + } + } +} + +// formatTruncateQuery formats a TRUNCATE statement. +func formatTruncateQuery(sb *strings.Builder, q *ast.TruncateQuery) { + if q == nil { + return + } + sb.WriteString("TRUNCATE ") + if q.IfExists { + sb.WriteString("IF EXISTS ") + } + sb.WriteString("TABLE ") + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } +} + +// formatUseQuery formats a USE statement. +func formatUseQuery(sb *strings.Builder, q *ast.UseQuery) { + if q == nil { + return + } + sb.WriteString("USE ") + sb.WriteString(q.Database) +} + +// formatDescribeQuery formats a DESCRIBE statement. +func formatDescribeQuery(sb *strings.Builder, q *ast.DescribeQuery) { + if q == nil { + return + } + sb.WriteString("DESCRIBE ") + if q.TableFunction != nil { + sb.WriteString(q.TableFunction.Name) + sb.WriteString("(") + for i, arg := range q.TableFunction.Arguments { + if i > 0 { + sb.WriteString(", ") + } + Expression(sb, arg) + } + sb.WriteString(")") + } else { + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + } + if q.Format != "" { + sb.WriteString(" FORMAT ") + sb.WriteString(q.Format) + } +} + +// formatShowQuery formats a SHOW statement. +func formatShowQuery(sb *strings.Builder, q *ast.ShowQuery) { + if q == nil { + return + } + sb.WriteString("SHOW ") + switch q.ShowType { + case ast.ShowTables: + sb.WriteString("TABLES") + case ast.ShowDatabases: + sb.WriteString("DATABASES") + case ast.ShowProcesses: + sb.WriteString("PROCESSLIST") + case ast.ShowCreate: + sb.WriteString("CREATE TABLE ") + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.From) + case ast.ShowCreateDB: + sb.WriteString("CREATE DATABASE ") + sb.WriteString(q.Database) + case ast.ShowColumns: + sb.WriteString("COLUMNS FROM ") + sb.WriteString(q.From) + case ast.ShowDictionaries: + sb.WriteString("DICTIONARIES") + case ast.ShowFunctions: + sb.WriteString("FUNCTIONS") + case ast.ShowSettings: + sb.WriteString("SETTINGS") + } + if q.From != "" && q.ShowType != ast.ShowCreate && q.ShowType != ast.ShowColumns { + sb.WriteString(" FROM ") + sb.WriteString(q.From) + } + if q.Like != "" { + sb.WriteString(" LIKE '") + sb.WriteString(q.Like) + sb.WriteString("'") + } + if q.Where != nil { + sb.WriteString(" WHERE ") + Expression(sb, q.Where) + } + if q.Limit != nil { + sb.WriteString(" LIMIT ") + Expression(sb, q.Limit) + } +} + +// formatExplainQuery formats an EXPLAIN statement. +func formatExplainQuery(sb *strings.Builder, q *ast.ExplainQuery) { + if q == nil { + return + } + sb.WriteString("EXPLAIN ") + sb.WriteString(string(q.ExplainType)) + sb.WriteString(" ") + Statement(sb, q.Statement) +} + +// formatOptimizeQuery formats an OPTIMIZE statement. +func formatOptimizeQuery(sb *strings.Builder, q *ast.OptimizeQuery) { + if q == nil { + return + } + sb.WriteString("OPTIMIZE TABLE ") + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } + if q.Partition != nil { + sb.WriteString(" PARTITION ") + Expression(sb, q.Partition) + } + if q.Final { + sb.WriteString(" FINAL") + } + if q.Dedupe { + sb.WriteString(" DEDUPLICATE") + } +} + +// formatSystemQuery formats a SYSTEM statement. +func formatSystemQuery(sb *strings.Builder, q *ast.SystemQuery) { + if q == nil { + return + } + sb.WriteString("SYSTEM ") + sb.WriteString(q.Command) + if q.Database != "" { + sb.WriteString(" ") + sb.WriteString(q.Database) + if q.Table != "" { + sb.WriteString(".") + sb.WriteString(q.Table) + } + } else if q.Table != "" { + sb.WriteString(" ") + sb.WriteString(q.Table) + } +} + +// formatRenameQuery formats a RENAME statement. +func formatRenameQuery(sb *strings.Builder, q *ast.RenameQuery) { + if q == nil { + return + } + sb.WriteString("RENAME TABLE ") + for i, p := range q.Pairs { + if i > 0 { + sb.WriteString(", ") + } + if p.FromDatabase != "" { + sb.WriteString(p.FromDatabase) + sb.WriteString(".") + } + sb.WriteString(p.FromTable) + sb.WriteString(" TO ") + if p.ToDatabase != "" { + sb.WriteString(p.ToDatabase) + sb.WriteString(".") + } + sb.WriteString(p.ToTable) + } + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } +} + +// formatExchangeQuery formats an EXCHANGE statement. +func formatExchangeQuery(sb *strings.Builder, q *ast.ExchangeQuery) { + if q == nil { + return + } + sb.WriteString("EXCHANGE TABLES ") + sb.WriteString(q.Table1) + sb.WriteString(" AND ") + sb.WriteString(q.Table2) + if q.OnCluster != "" { + sb.WriteString(" ON CLUSTER ") + sb.WriteString(q.OnCluster) + } +} + +// formatExistsQueryStmt formats an EXISTS statement. +func formatExistsQueryStmt(sb *strings.Builder, q *ast.ExistsQuery) { + if q == nil { + return + } + sb.WriteString("EXISTS ") + if q.Database != "" { + sb.WriteString(q.Database) + sb.WriteString(".") + } + sb.WriteString(q.Table) } diff --git a/parser/testdata/00027_distinct_and_order_by/metadata.json b/parser/testdata/00027_distinct_and_order_by/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00027_distinct_and_order_by/metadata.json +++ b/parser/testdata/00027_distinct_and_order_by/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00038_totals_limit/metadata.json b/parser/testdata/00038_totals_limit/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00038_totals_limit/metadata.json +++ b/parser/testdata/00038_totals_limit/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00086_concat_nary_const_with_nonconst_segfault/metadata.json b/parser/testdata/00086_concat_nary_const_with_nonconst_segfault/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00086_concat_nary_const_with_nonconst_segfault/metadata.json +++ b/parser/testdata/00086_concat_nary_const_with_nonconst_segfault/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00131_set_hashed/metadata.json b/parser/testdata/00131_set_hashed/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00131_set_hashed/metadata.json +++ b/parser/testdata/00131_set_hashed/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00140_parse_unix_timestamp_as_datetime/metadata.json b/parser/testdata/00140_parse_unix_timestamp_as_datetime/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00140_parse_unix_timestamp_as_datetime/metadata.json +++ b/parser/testdata/00140_parse_unix_timestamp_as_datetime/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00142_parse_timestamp_as_datetime/metadata.json b/parser/testdata/00142_parse_timestamp_as_datetime/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00142_parse_timestamp_as_datetime/metadata.json +++ b/parser/testdata/00142_parse_timestamp_as_datetime/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00152_totals_in_subquery/metadata.json b/parser/testdata/00152_totals_in_subquery/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00152_totals_in_subquery/metadata.json +++ b/parser/testdata/00152_totals_in_subquery/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00156_array_map_to_constant/metadata.json b/parser/testdata/00156_array_map_to_constant/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00156_array_map_to_constant/metadata.json +++ b/parser/testdata/00156_array_map_to_constant/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00157_aliases_and_lambda_formal_parameters/metadata.json b/parser/testdata/00157_aliases_and_lambda_formal_parameters/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00157_aliases_and_lambda_formal_parameters/metadata.json +++ b/parser/testdata/00157_aliases_and_lambda_formal_parameters/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00174_compare_date_time_with_constant_string_in_in/metadata.json b/parser/testdata/00174_compare_date_time_with_constant_string_in_in/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00174_compare_date_time_with_constant_string_in_in/metadata.json +++ b/parser/testdata/00174_compare_date_time_with_constant_string_in_in/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00188_constants_as_arguments_of_aggregate_functions/metadata.json b/parser/testdata/00188_constants_as_arguments_of_aggregate_functions/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00188_constants_as_arguments_of_aggregate_functions/metadata.json +++ b/parser/testdata/00188_constants_as_arguments_of_aggregate_functions/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00197_if_fixed_string/metadata.json b/parser/testdata/00197_if_fixed_string/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00197_if_fixed_string/metadata.json +++ b/parser/testdata/00197_if_fixed_string/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00238_removal_of_temporary_columns/metadata.json b/parser/testdata/00238_removal_of_temporary_columns/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00238_removal_of_temporary_columns/metadata.json +++ b/parser/testdata/00238_removal_of_temporary_columns/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00320_between/metadata.json b/parser/testdata/00320_between/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00320_between/metadata.json +++ b/parser/testdata/00320_between/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00333_parser_number_bug/metadata.json b/parser/testdata/00333_parser_number_bug/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00333_parser_number_bug/metadata.json +++ b/parser/testdata/00333_parser_number_bug/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00350_count_distinct/metadata.json b/parser/testdata/00350_count_distinct/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00350_count_distinct/metadata.json +++ b/parser/testdata/00350_count_distinct/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00358_from_string_complex_types/metadata.json b/parser/testdata/00358_from_string_complex_types/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00358_from_string_complex_types/metadata.json +++ b/parser/testdata/00358_from_string_complex_types/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00448_to_string_cut_to_zero/metadata.json b/parser/testdata/00448_to_string_cut_to_zero/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00448_to_string_cut_to_zero/metadata.json +++ b/parser/testdata/00448_to_string_cut_to_zero/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00450_higher_order_and_nullable/metadata.json b/parser/testdata/00450_higher_order_and_nullable/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00450_higher_order_and_nullable/metadata.json +++ b/parser/testdata/00450_higher_order_and_nullable/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00464_array_element_out_of_range/metadata.json b/parser/testdata/00464_array_element_out_of_range/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00464_array_element_out_of_range/metadata.json +++ b/parser/testdata/00464_array_element_out_of_range/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00482_subqueries_and_aliases/metadata.json b/parser/testdata/00482_subqueries_and_aliases/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00482_subqueries_and_aliases/metadata.json +++ b/parser/testdata/00482_subqueries_and_aliases/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00483_cast_syntax/metadata.json b/parser/testdata/00483_cast_syntax/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00483_cast_syntax/metadata.json +++ b/parser/testdata/00483_cast_syntax/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00487_if_array_fixed_string/metadata.json b/parser/testdata/00487_if_array_fixed_string/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00487_if_array_fixed_string/metadata.json +++ b/parser/testdata/00487_if_array_fixed_string/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00503_cast_const_nullable/metadata.json b/parser/testdata/00503_cast_const_nullable/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00503_cast_const_nullable/metadata.json +++ b/parser/testdata/00503_cast_const_nullable/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00511_get_size_of_enum/metadata.json b/parser/testdata/00511_get_size_of_enum/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00511_get_size_of_enum/metadata.json +++ b/parser/testdata/00511_get_size_of_enum/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00519_create_as_select_from_temporary_table/metadata.json b/parser/testdata/00519_create_as_select_from_temporary_table/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00519_create_as_select_from_temporary_table/metadata.json +++ b/parser/testdata/00519_create_as_select_from_temporary_table/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00547_named_tuples/metadata.json b/parser/testdata/00547_named_tuples/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00547_named_tuples/metadata.json +++ b/parser/testdata/00547_named_tuples/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00548_slice_of_nested/metadata.json b/parser/testdata/00548_slice_of_nested/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00548_slice_of_nested/metadata.json +++ b/parser/testdata/00548_slice_of_nested/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00553_invalid_nested_name/metadata.json b/parser/testdata/00553_invalid_nested_name/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00553_invalid_nested_name/metadata.json +++ b/parser/testdata/00553_invalid_nested_name/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00566_enum_min_max/metadata.json b/parser/testdata/00566_enum_min_max/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00566_enum_min_max/metadata.json +++ b/parser/testdata/00566_enum_min_max/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00580_cast_nullable_to_non_nullable/metadata.json b/parser/testdata/00580_cast_nullable_to_non_nullable/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00580_cast_nullable_to_non_nullable/metadata.json +++ b/parser/testdata/00580_cast_nullable_to_non_nullable/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00582_not_aliasing_functions/metadata.json b/parser/testdata/00582_not_aliasing_functions/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00582_not_aliasing_functions/metadata.json +++ b/parser/testdata/00582_not_aliasing_functions/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00647_select_numbers_with_offset/metadata.json b/parser/testdata/00647_select_numbers_with_offset/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00647_select_numbers_with_offset/metadata.json +++ b/parser/testdata/00647_select_numbers_with_offset/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00674_has_array_enum/metadata.json b/parser/testdata/00674_has_array_enum/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00674_has_array_enum/metadata.json +++ b/parser/testdata/00674_has_array_enum/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00689_join_table_function/metadata.json b/parser/testdata/00689_join_table_function/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00689_join_table_function/metadata.json +++ b/parser/testdata/00689_join_table_function/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00753_with_with_single_alias/metadata.json b/parser/testdata/00753_with_with_single_alias/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00753_with_with_single_alias/metadata.json +++ b/parser/testdata/00753_with_with_single_alias/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00817_with_simple/metadata.json b/parser/testdata/00817_with_simple/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00817_with_simple/metadata.json +++ b/parser/testdata/00817_with_simple/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00822_array_insert_default/metadata.json b/parser/testdata/00822_array_insert_default/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00822_array_insert_default/metadata.json +++ b/parser/testdata/00822_array_insert_default/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00904_array_with_constant_2/metadata.json b/parser/testdata/00904_array_with_constant_2/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00904_array_with_constant_2/metadata.json +++ b/parser/testdata/00904_array_with_constant_2/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00919_sum_aggregate_states_constants/metadata.json b/parser/testdata/00919_sum_aggregate_states_constants/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00919_sum_aggregate_states_constants/metadata.json +++ b/parser/testdata/00919_sum_aggregate_states_constants/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00920_multiply_aggregate_states_constants/metadata.json b/parser/testdata/00920_multiply_aggregate_states_constants/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00920_multiply_aggregate_states_constants/metadata.json +++ b/parser/testdata/00920_multiply_aggregate_states_constants/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00960_eval_ml_method_const/metadata.json b/parser/testdata/00960_eval_ml_method_const/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00960_eval_ml_method_const/metadata.json +++ b/parser/testdata/00960_eval_ml_method_const/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/00999_settings_no_extra_quotes/metadata.json b/parser/testdata/00999_settings_no_extra_quotes/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/00999_settings_no_extra_quotes/metadata.json +++ b/parser/testdata/00999_settings_no_extra_quotes/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01039_test_setting_parse/metadata.json b/parser/testdata/01039_test_setting_parse/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01039_test_setting_parse/metadata.json +++ b/parser/testdata/01039_test_setting_parse/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01081_demangle/metadata.json b/parser/testdata/01081_demangle/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01081_demangle/metadata.json +++ b/parser/testdata/01081_demangle/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01121_remote_scalar_subquery/metadata.json b/parser/testdata/01121_remote_scalar_subquery/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01121_remote_scalar_subquery/metadata.json +++ b/parser/testdata/01121_remote_scalar_subquery/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01254_array_of_unnamed_tuples/metadata.json b/parser/testdata/01254_array_of_unnamed_tuples/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01254_array_of_unnamed_tuples/metadata.json +++ b/parser/testdata/01254_array_of_unnamed_tuples/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01260_ubsan_decimal_parse/metadata.json b/parser/testdata/01260_ubsan_decimal_parse/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01260_ubsan_decimal_parse/metadata.json +++ b/parser/testdata/01260_ubsan_decimal_parse/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01422_array_nullable_element_nullable_index/metadata.json b/parser/testdata/01422_array_nullable_element_nullable_index/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01422_array_nullable_element_nullable_index/metadata.json +++ b/parser/testdata/01422_array_nullable_element_nullable_index/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01473_system_events_zeroes/metadata.json b/parser/testdata/01473_system_events_zeroes/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01473_system_events_zeroes/metadata.json +++ b/parser/testdata/01473_system_events_zeroes/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01554_interpreter_integer_float/metadata.json b/parser/testdata/01554_interpreter_integer_float/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01554_interpreter_integer_float/metadata.json +++ b/parser/testdata/01554_interpreter_integer_float/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01666_date_lut_buffer_overflow/metadata.json b/parser/testdata/01666_date_lut_buffer_overflow/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01666_date_lut_buffer_overflow/metadata.json +++ b/parser/testdata/01666_date_lut_buffer_overflow/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01666_great_circle_distance_ubsan/metadata.json b/parser/testdata/01666_great_circle_distance_ubsan/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01666_great_circle_distance_ubsan/metadata.json +++ b/parser/testdata/01666_great_circle_distance_ubsan/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01670_log_comment/metadata.json b/parser/testdata/01670_log_comment/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01670_log_comment/metadata.json +++ b/parser/testdata/01670_log_comment/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01702_toDateTime_from_string_clamping/metadata.json b/parser/testdata/01702_toDateTime_from_string_clamping/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01702_toDateTime_from_string_clamping/metadata.json +++ b/parser/testdata/01702_toDateTime_from_string_clamping/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01716_decimal_comparison_ubsan/metadata.json b/parser/testdata/01716_decimal_comparison_ubsan/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01716_decimal_comparison_ubsan/metadata.json +++ b/parser/testdata/01716_decimal_comparison_ubsan/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01761_round_year_bounds/metadata.json b/parser/testdata/01761_round_year_bounds/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01761_round_year_bounds/metadata.json +++ b/parser/testdata/01761_round_year_bounds/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01774_tuple_null_in/metadata.json b/parser/testdata/01774_tuple_null_in/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01774_tuple_null_in/metadata.json +++ b/parser/testdata/01774_tuple_null_in/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01787_arena_assert_column_nothing/metadata.json b/parser/testdata/01787_arena_assert_column_nothing/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01787_arena_assert_column_nothing/metadata.json +++ b/parser/testdata/01787_arena_assert_column_nothing/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/01837_cast_to_array_from_empty_array/metadata.json b/parser/testdata/01837_cast_to_array_from_empty_array/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/01837_cast_to_array_from_empty_array/metadata.json +++ b/parser/testdata/01837_cast_to_array_from_empty_array/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02015_order_by_with_fill_misoptimization/metadata.json b/parser/testdata/02015_order_by_with_fill_misoptimization/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02015_order_by_with_fill_misoptimization/metadata.json +++ b/parser/testdata/02015_order_by_with_fill_misoptimization/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02017_order_by_with_fill_redundant_functions/metadata.json b/parser/testdata/02017_order_by_with_fill_redundant_functions/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02017_order_by_with_fill_redundant_functions/metadata.json +++ b/parser/testdata/02017_order_by_with_fill_redundant_functions/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02148_cast_type_parsing/metadata.json b/parser/testdata/02148_cast_type_parsing/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02148_cast_type_parsing/metadata.json +++ b/parser/testdata/02148_cast_type_parsing/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02242_if_then_else_null_bug/metadata.json b/parser/testdata/02242_if_then_else_null_bug/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02242_if_then_else_null_bug/metadata.json +++ b/parser/testdata/02242_if_then_else_null_bug/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02313_dump_column_structure_low_cardinality/metadata.json b/parser/testdata/02313_dump_column_structure_low_cardinality/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02313_dump_column_structure_low_cardinality/metadata.json +++ b/parser/testdata/02313_dump_column_structure_low_cardinality/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02315_replace_multiif_to_if/metadata.json b/parser/testdata/02315_replace_multiif_to_if/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02315_replace_multiif_to_if/metadata.json +++ b/parser/testdata/02315_replace_multiif_to_if/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02393_every_metric_must_have_documentation/metadata.json b/parser/testdata/02393_every_metric_must_have_documentation/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02393_every_metric_must_have_documentation/metadata.json +++ b/parser/testdata/02393_every_metric_must_have_documentation/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02394_every_profile_event_must_have_documentation/metadata.json b/parser/testdata/02394_every_profile_event_must_have_documentation/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02394_every_profile_event_must_have_documentation/metadata.json +++ b/parser/testdata/02394_every_profile_event_must_have_documentation/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02494_query_cache_empty_tuple/metadata.json b/parser/testdata/02494_query_cache_empty_tuple/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02494_query_cache_empty_tuple/metadata.json +++ b/parser/testdata/02494_query_cache_empty_tuple/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02537_system_formats/metadata.json b/parser/testdata/02537_system_formats/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02537_system_formats/metadata.json +++ b/parser/testdata/02537_system_formats/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02580_like_substring_search_bug/metadata.json b/parser/testdata/02580_like_substring_search_bug/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02580_like_substring_search_bug/metadata.json +++ b/parser/testdata/02580_like_substring_search_bug/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02737_sql_auto_is_null/metadata.json b/parser/testdata/02737_sql_auto_is_null/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02737_sql_auto_is_null/metadata.json +++ b/parser/testdata/02737_sql_auto_is_null/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02752_is_null_priority/metadata.json b/parser/testdata/02752_is_null_priority/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02752_is_null_priority/metadata.json +++ b/parser/testdata/02752_is_null_priority/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02799_transform_empty_arrays/metadata.json b/parser/testdata/02799_transform_empty_arrays/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02799_transform_empty_arrays/metadata.json +++ b/parser/testdata/02799_transform_empty_arrays/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02889_system_drop_format_schema/metadata.json b/parser/testdata/02889_system_drop_format_schema/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02889_system_drop_format_schema/metadata.json +++ b/parser/testdata/02889_system_drop_format_schema/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02893_bad_sample_view/metadata.json b/parser/testdata/02893_bad_sample_view/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02893_bad_sample_view/metadata.json +++ b/parser/testdata/02893_bad_sample_view/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02895_cast_operator_bug/metadata.json b/parser/testdata/02895_cast_operator_bug/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02895_cast_operator_bug/metadata.json +++ b/parser/testdata/02895_cast_operator_bug/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02902_show_databases_limit/metadata.json b/parser/testdata/02902_show_databases_limit/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02902_show_databases_limit/metadata.json +++ b/parser/testdata/02902_show_databases_limit/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02913_sum_map_state/metadata.json b/parser/testdata/02913_sum_map_state/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02913_sum_map_state/metadata.json +++ b/parser/testdata/02913_sum_map_state/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02932_non_ready_set_stuck/metadata.json b/parser/testdata/02932_non_ready_set_stuck/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02932_non_ready_set_stuck/metadata.json +++ b/parser/testdata/02932_non_ready_set_stuck/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/02959_system_database_engines/metadata.json b/parser/testdata/02959_system_database_engines/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/02959_system_database_engines/metadata.json +++ b/parser/testdata/02959_system_database_engines/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03003_enum_and_string_compatible/metadata.json b/parser/testdata/03003_enum_and_string_compatible/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03003_enum_and_string_compatible/metadata.json +++ b/parser/testdata/03003_enum_and_string_compatible/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03013_position_const_start_pos/metadata.json b/parser/testdata/03013_position_const_start_pos/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03013_position_const_start_pos/metadata.json +++ b/parser/testdata/03013_position_const_start_pos/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03033_virtual_column_override/metadata.json b/parser/testdata/03033_virtual_column_override/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03033_virtual_column_override/metadata.json +++ b/parser/testdata/03033_virtual_column_override/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03204_storage_join_optimize/metadata.json b/parser/testdata/03204_storage_join_optimize/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03204_storage_join_optimize/metadata.json +++ b/parser/testdata/03204_storage_join_optimize/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03208_numbers_total_rows_approx/metadata.json b/parser/testdata/03208_numbers_total_rows_approx/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03208_numbers_total_rows_approx/metadata.json +++ b/parser/testdata/03208_numbers_total_rows_approx/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03213_array_element_msan/metadata.json b/parser/testdata/03213_array_element_msan/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03213_array_element_msan/metadata.json +++ b/parser/testdata/03213_array_element_msan/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03221_incomplete_utf8_sequence/metadata.json b/parser/testdata/03221_incomplete_utf8_sequence/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03221_incomplete_utf8_sequence/metadata.json +++ b/parser/testdata/03221_incomplete_utf8_sequence/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03298_vertical_columns/metadata.json b/parser/testdata/03298_vertical_columns/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03298_vertical_columns/metadata.json +++ b/parser/testdata/03298_vertical_columns/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03315_quantile_bfloat16_ubsan/metadata.json b/parser/testdata/03315_quantile_bfloat16_ubsan/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03315_quantile_bfloat16_ubsan/metadata.json +++ b/parser/testdata/03315_quantile_bfloat16_ubsan/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03365_time_time64_best_effort_parsing/metadata.json b/parser/testdata/03365_time_time64_best_effort_parsing/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03365_time_time64_best_effort_parsing/metadata.json +++ b/parser/testdata/03365_time_time64_best_effort_parsing/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03404_dynamic_in_interval_bug/metadata.json b/parser/testdata/03404_dynamic_in_interval_bug/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03404_dynamic_in_interval_bug/metadata.json +++ b/parser/testdata/03404_dynamic_in_interval_bug/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03415_dont_highlight_probable_hashes/metadata.json b/parser/testdata/03415_dont_highlight_probable_hashes/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03415_dont_highlight_probable_hashes/metadata.json +++ b/parser/testdata/03415_dont_highlight_probable_hashes/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03538_higher_order_functions_null_filter/metadata.json b/parser/testdata/03538_higher_order_functions_null_filter/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03538_higher_order_functions_null_filter/metadata.json +++ b/parser/testdata/03538_higher_order_functions_null_filter/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03551_cast_decimal_to_float/metadata.json b/parser/testdata/03551_cast_decimal_to_float/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03551_cast_decimal_to_float/metadata.json +++ b/parser/testdata/03551_cast_decimal_to_float/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03571_nullable_format_digit_groups/metadata.json b/parser/testdata/03571_nullable_format_digit_groups/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03571_nullable_format_digit_groups/metadata.json +++ b/parser/testdata/03571_nullable_format_digit_groups/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03582_initcap_fixedstring/metadata.json b/parser/testdata/03582_initcap_fixedstring/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03582_initcap_fixedstring/metadata.json +++ b/parser/testdata/03582_initcap_fixedstring/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03704_default_empty_order_by/metadata.json b/parser/testdata/03704_default_empty_order_by/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03704_default_empty_order_by/metadata.json +++ b/parser/testdata/03704_default_empty_order_by/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{} diff --git a/parser/testdata/03733_base58_decode_bug/metadata.json b/parser/testdata/03733_base58_decode_bug/metadata.json index 55f5cc6775..0967ef424b 100644 --- a/parser/testdata/03733_base58_decode_bug/metadata.json +++ b/parser/testdata/03733_base58_decode_bug/metadata.json @@ -1 +1 @@ -{"todo_format":true} +{}