From fc1188346cdf4341e9c063f6d7573899485f4944 Mon Sep 17 00:00:00 2001 From: Lance726 <158132389@qq.com> Date: Fri, 4 Sep 2026 11:06:29 +0800 Subject: [PATCH] Move ALTER TABLE SETTINGS to the statement level SETTINGS on ALTER TABLE is a query-level clause: ClickHouse accepts it once, after the last alter clause, and rejects it mid-statement. -- rejected by ClickHouse ALTER TABLE t ADD COLUMN c Int SETTINGS alter_sync = 2, DROP COLUMN b -- accepted by ClickHouse ALTER TABLE t ADD COLUMN c Int, DROP COLUMN b SETTINGS alter_sync = 2 It was instead parsed per clause, by ADD COLUMN, ADD INDEX, DETACH PARTITION and DROP PARTITION only, so every other form failed to parse even though ClickHouse accepts it: ALTER TABLE t MODIFY COLUMN a Int64 SETTINGS alter_sync = 2 ALTER TABLE t DROP COLUMN b SETTINGS alter_sync = 2 ALTER TABLE t ADD COLUMN c Int, DROP COLUMN b SETTINGS alter_sync = 2 ALTER TABLE t MATERIALIZE INDEX IF EXISTS idx SETTINGS mutations_sync = 2 Parse it once in parseAlterTable instead, after the clause list, and reject it mid-statement as ClickHouse does. Formatted SQL is unchanged for the clauses that already accepted SETTINGS: only the AST placement moves, so their format/ goldens do not change. Breaking AST change: AlterTableAddColumn.Settings, AlterTableAddIndex.Settings, AlterTableDetachPartition.Settings and AlterTableDropPartition.Settings are removed in favour of AlterTable.Settings. Every form above was verified against clickhouse-local 26.8.2.7, in both directions: the SQL parses here, and this parser's formatted output is accepted by ClickHouse. Co-Authored-By: Claude Opus 5 --- parser/ast.go | 41 +-- parser/format.go | 20 +- parser/parser_alter.go | 38 +-- parser/position_test.go | 11 +- parser/testdata/ddl/alter_table_settings.sql | 3 + .../ddl/format/alter_table_settings.sql | 10 + .../format/beautify/alter_table_settings.sql | 21 ++ .../alter_table_add_column.sql.golden.json | 46 ++-- .../alter_table_add_index.sql.golden.json | 126 +++++----- ...alter_table_add_projection.sql.golden.json | 3 +- ...d_projection_group_by_only.sql.golden.json | 3 +- ...ter_table_attach_partition.sql.golden.json | 9 +- .../alter_table_clear_column.sql.golden.json | 3 +- .../alter_table_clear_index.sql.golden.json | 3 +- ...ter_table_clear_projection.sql.golden.json | 3 +- .../output/alter_table_delete.sql.golden.json | 3 +- ..._table_delete_with_cluster.sql.golden.json | 3 +- ...ter_table_detach_partition.sql.golden.json | 6 +- .../alter_table_drop_column.sql.golden.json | 3 +- ...able_drop_detach_partition.sql.golden.json | 44 ++-- .../alter_table_drop_index.sql.golden.json | 3 +- ...alter_table_drop_partition.sql.golden.json | 6 +- ...lter_table_drop_projection.sql.golden.json | 3 +- ...reeze_no_specify_partition.sql.golden.json | 3 +- ...ter_table_freeze_partition.sql.golden.json | 3 +- ...er_table_materialize_index.sql.golden.json | 3 +- ...ble_materialize_projection.sql.golden.json | 3 +- .../alter_table_modify_column.sql.golden.json | 3 +- ...table_modify_column_remove.sql.golden.json | 3 +- ...lter_table_modify_order_by.sql.golden.json | 15 +- ...alter_table_modify_setting.sql.golden.json | 3 +- .../alter_table_remove_ttl.sql.golden.json | 3 +- .../alter_table_rename_column.sql.golden.json | 3 +- ...er_table_replace_partition.sql.golden.json | 3 +- ...le_reset_multiple_settings.sql.golden.json | 3 +- .../alter_table_reset_setting.sql.golden.json | 3 +- .../alter_table_settings.sql.golden.json | 235 ++++++++++++++++++ .../output/alter_table_update.sql.golden.json | 3 +- ..._table_update_in_partition.sql.golden.json | 3 +- ..._table_update_with_cluster.sql.golden.json | 3 +- .../alter_table_modify_query.sql.golden.json | 3 +- ..._table_modify_ttl_multiple.sql.golden.json | 3 +- .../alter_table_with_comment.sql.golden.json | 12 +- ...ble_with_modify_remove_ttl.sql.golden.json | 3 +- ...lter_table_with_modify_ttl.sql.golden.json | 3 +- parser/walk.go | 15 +- 46 files changed, 491 insertions(+), 254 deletions(-) create mode 100644 parser/testdata/ddl/alter_table_settings.sql create mode 100644 parser/testdata/ddl/format/alter_table_settings.sql create mode 100644 parser/testdata/ddl/format/beautify/alter_table_settings.sql create mode 100644 parser/testdata/ddl/output/alter_table_settings.sql.golden.json diff --git a/parser/ast.go b/parser/ast.go index 774bde8b..2fe578cf 100644 --- a/parser/ast.go +++ b/parser/ast.go @@ -202,6 +202,9 @@ type AlterTable struct { TableIdentifier *TableIdentifier OnCluster *ClusterClause AlterExprs []AlterTableClause + // Settings holds the query-level SETTINGS clause. ClickHouse only + // accepts it once, after the last alter clause. + Settings *SettingsClause } func (a *AlterTable) Pos() Pos { @@ -233,6 +236,11 @@ func (a *AlterTable) Accept(visitor ASTVisitor) error { return err } } + if a.Settings != nil { + if err := a.Settings.Accept(visitor); err != nil { + return err + } + } return visitor.VisitAlterTable(a) } @@ -275,7 +283,6 @@ func (a *AlterTableAttachPartition) Accept(visitor ASTVisitor) error { type AlterTableDetachPartition struct { DetachPos Pos Partition *PartitionClause - Settings *SettingsClause } func (a *AlterTableDetachPartition) Pos() Pos { @@ -296,11 +303,6 @@ func (a *AlterTableDetachPartition) Accept(visitor ASTVisitor) error { if err := a.Partition.Accept(visitor); err != nil { return err } - if a.Settings != nil { - if err := a.Settings.Accept(visitor); err != nil { - return err - } - } return visitor.VisitAlterTableDetachPartition(a) } @@ -308,7 +310,6 @@ type AlterTableDropPartition struct { DropPos Pos HasDetached bool Partition *PartitionClause - Settings *SettingsClause } func (a *AlterTableDropPartition) Pos() Pos { @@ -316,9 +317,6 @@ func (a *AlterTableDropPartition) Pos() Pos { } func (a *AlterTableDropPartition) End() Pos { - if a.Settings != nil { - return a.Settings.End() - } return a.Partition.End() } @@ -332,11 +330,6 @@ func (a *AlterTableDropPartition) Accept(visitor ASTVisitor) error { if err := a.Partition.Accept(visitor); err != nil { return err } - if a.Settings != nil { - if err := a.Settings.Accept(visitor); err != nil { - return err - } - } return visitor.VisitAlterTableDropPartition(a) } @@ -444,7 +437,6 @@ type AlterTableAddColumn struct { Column *ColumnDef IfNotExists bool After *NestedIdentifier - Settings *SettingsClause } func (a *AlterTableAddColumn) Pos() Pos { @@ -452,9 +444,6 @@ func (a *AlterTableAddColumn) Pos() Pos { } func (a *AlterTableAddColumn) End() Pos { - if a.Settings != nil { - return a.Settings.End() - } return a.StatementEnd } @@ -473,11 +462,6 @@ func (a *AlterTableAddColumn) Accept(visitor ASTVisitor) error { return err } } - if a.Settings != nil { - if err := a.Settings.Accept(visitor); err != nil { - return err - } - } return visitor.VisitAlterTableAddColumn(a) } @@ -488,7 +472,6 @@ type AlterTableAddIndex struct { Index *TableIndex IfNotExists bool After *NestedIdentifier - Settings *SettingsClause } func (a *AlterTableAddIndex) Pos() Pos { @@ -496,9 +479,6 @@ func (a *AlterTableAddIndex) Pos() Pos { } func (a *AlterTableAddIndex) End() Pos { - if a.Settings != nil { - return a.Settings.End() - } return a.StatementEnd } @@ -517,11 +497,6 @@ func (a *AlterTableAddIndex) Accept(visitor ASTVisitor) error { return err } } - if a.Settings != nil { - if err := a.Settings.Accept(visitor); err != nil { - return err - } - } return visitor.VisitAlterTableAddIndex(a) } diff --git a/parser/format.go b/parser/format.go index 2eb46cfb..bd15a06e 100644 --- a/parser/format.go +++ b/parser/format.go @@ -230,6 +230,10 @@ func (a *AlterTable) FormatSQL(formatter *Formatter) { formatter.WriteString(",") } } + if a.Settings != nil { + formatter.Break() + formatter.WriteExpr(a.Settings) + } } func (a *AlterTableAddColumn) FormatSQL(formatter *Formatter) { @@ -242,10 +246,6 @@ func (a *AlterTableAddColumn) FormatSQL(formatter *Formatter) { formatter.WriteString(" AFTER ") formatter.WriteExpr(a.After) } - if a.Settings != nil { - formatter.Break() - formatter.WriteExpr(a.Settings) - } } func (a *AlterTableAddIndex) FormatSQL(formatter *Formatter) { @@ -258,10 +258,6 @@ func (a *AlterTableAddIndex) FormatSQL(formatter *Formatter) { formatter.WriteString(" AFTER ") formatter.WriteExpr(a.After) } - if a.Settings != nil { - formatter.Break() - formatter.WriteExpr(a.Settings) - } } func (a *AlterTableAddProjection) FormatSQL(formatter *Formatter) { @@ -337,10 +333,6 @@ func (a *AlterTableDelete) FormatSQL(formatter *Formatter) { func (a *AlterTableDetachPartition) FormatSQL(formatter *Formatter) { formatter.WriteString("DETACH ") formatter.WriteExpr(a.Partition) - if a.Settings != nil { - formatter.Break() - formatter.WriteExpr(a.Settings) - } } func (a *AlterTableDropColumn) FormatSQL(formatter *Formatter) { @@ -365,10 +357,6 @@ func (a *AlterTableDropPartition) FormatSQL(formatter *Formatter) { formatter.WriteString("DETACHED ") } formatter.WriteExpr(a.Partition) - if a.Settings != nil { - formatter.Break() - formatter.WriteExpr(a.Settings) - } } func (a *AlterTableDropProjection) FormatSQL(formatter *Formatter) { diff --git a/parser/parser_alter.go b/parser/parser_alter.go index 7c84c93a..a2b807f6 100644 --- a/parser/parser_alter.go +++ b/parser/parser_alter.go @@ -78,6 +78,15 @@ func (p *Parser) parseAlterTable(pos Pos) (*AlterTable, error) { } alterTable.StatementEnd = alterTable.AlterExprs[len(alterTable.AlterExprs)-1].End() + settings, err := p.tryParseSettingsClause(p.Pos()) + if err != nil { + return nil, err + } + if settings != nil { + alterTable.Settings = settings + alterTable.StatementEnd = settings.End() + } + return alterTable, nil } @@ -122,21 +131,12 @@ func (p *Parser) parseAlterTableAddColumn(pos Pos) (*AlterTableAddColumn, error) statementEnd = after.End() } - settings, err := p.tryParseSettingsClause(p.Pos()) - if err != nil { - return nil, err - } - if settings != nil { - statementEnd = settings.End() - } - return &AlterTableAddColumn{ AddPos: pos, StatementEnd: statementEnd, Column: column, IfNotExists: ifNotExists, After: after, - Settings: settings, }, nil } @@ -162,20 +162,12 @@ func (p *Parser) parseAlterTableAddIndex(pos Pos) (*AlterTableAddIndex, error) { if after != nil { statementEnd = after.End() } - settings, err := p.tryParseSettingsClause(p.Pos()) - if err != nil { - return nil, err - } - if settings != nil { - statementEnd = settings.End() - } return &AlterTableAddIndex{ AddPos: pos, StatementEnd: statementEnd, IfNotExists: ifNotExists, Index: index, After: after, - Settings: settings, }, nil } @@ -352,15 +344,9 @@ func (p *Parser) parseAlterTableDetachPartition(pos Pos) (AlterTableClause, erro } partition.Expr = expr - settings, err := p.tryParseSettingsClause(p.Pos()) - if err != nil { - return nil, err - } - return &AlterTableDetachPartition{ DetachPos: pos, Partition: partition, - Settings: settings, }, nil } @@ -493,16 +479,10 @@ func (p *Parser) parseAlterTableDropPartition(pos Pos) (AlterTableClause, error) } partition.Expr = expr - settings, err := p.tryParseSettingsClause(p.Pos()) - if err != nil { - return nil, err - } - return &AlterTableDropPartition{ DropPos: pos, Partition: partition, HasDetached: hasDetached, - Settings: settings, }, nil } diff --git a/parser/position_test.go b/parser/position_test.go index e24d688f..a4625727 100644 --- a/parser/position_test.go +++ b/parser/position_test.go @@ -70,14 +70,13 @@ func TestAlterDetachPartitionPos(t *testing.T) { require.Equal(t, Pos(14), detach.Pos()) } -func TestAlterDropPartitionEndIncludesSettings(t *testing.T) { +func TestAlterTableEndIncludesSettings(t *testing.T) { sql := "ALTER TABLE t DROP PARTITION p SETTINGS mutations_sync=1" stmt := parseOneStmt(t, sql).(*AlterTable) - drop := stmt.AlterExprs[0].(*AlterTableDropPartition) - require.NotNil(t, drop.Settings) - // End() used to discard the Settings end and stop at the partition - require.Equal(t, drop.Settings.End(), drop.End()) - require.Greater(t, drop.End(), drop.Partition.End()) + require.NotNil(t, stmt.Settings) + // End() used to discard the Settings end and stop at the last alter clause + require.Equal(t, stmt.Settings.End(), stmt.End()) + require.Greater(t, stmt.End(), stmt.AlterExprs[0].End()) } func TestDictionaryAttributeEnd(t *testing.T) { diff --git a/parser/testdata/ddl/alter_table_settings.sql b/parser/testdata/ddl/alter_table_settings.sql new file mode 100644 index 00000000..d9eba94e --- /dev/null +++ b/parser/testdata/ddl/alter_table_settings.sql @@ -0,0 +1,3 @@ +ALTER TABLE test.events_local MODIFY COLUMN f0 Int64 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ADD COLUMN f1 String, DROP COLUMN f2 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' MATERIALIZE INDEX IF EXISTS created_at_idx SETTINGS mutations_sync = 2; diff --git a/parser/testdata/ddl/format/alter_table_settings.sql b/parser/testdata/ddl/format/alter_table_settings.sql new file mode 100644 index 00000000..b78bfcde --- /dev/null +++ b/parser/testdata/ddl/format/alter_table_settings.sql @@ -0,0 +1,10 @@ +-- Origin SQL: +ALTER TABLE test.events_local MODIFY COLUMN f0 Int64 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ADD COLUMN f1 String, DROP COLUMN f2 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' MATERIALIZE INDEX IF EXISTS created_at_idx SETTINGS mutations_sync = 2; + + +-- Format SQL: +ALTER TABLE test.events_local MODIFY COLUMN f0 Int64 SETTINGS alter_sync=2; +ALTER TABLE test.events_local ADD COLUMN f1 String, DROP COLUMN f2 SETTINGS alter_sync=2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' MATERIALIZE INDEX IF EXISTS created_at_idx SETTINGS mutations_sync=2; diff --git a/parser/testdata/ddl/format/beautify/alter_table_settings.sql b/parser/testdata/ddl/format/beautify/alter_table_settings.sql new file mode 100644 index 00000000..4b7e33c8 --- /dev/null +++ b/parser/testdata/ddl/format/beautify/alter_table_settings.sql @@ -0,0 +1,21 @@ +-- Origin SQL: +ALTER TABLE test.events_local MODIFY COLUMN f0 Int64 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ADD COLUMN f1 String, DROP COLUMN f2 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' MATERIALIZE INDEX IF EXISTS created_at_idx SETTINGS mutations_sync = 2; + + +-- Beautify SQL: +ALTER TABLE test.events_local +MODIFY COLUMN f0 Int64 +SETTINGS + alter_sync=2; +ALTER TABLE test.events_local +ADD COLUMN f1 String, +DROP COLUMN f2 +SETTINGS + alter_sync=2; +ALTER TABLE test.events_local +ON CLUSTER 'default_cluster' +MATERIALIZE INDEX IF EXISTS created_at_idx +SETTINGS + mutations_sync=2; diff --git a/parser/testdata/ddl/output/alter_table_add_column.sql.golden.json b/parser/testdata/ddl/output/alter_table_add_column.sql.golden.json index 9ec9838e..d7aeda33 100644 --- a/parser/testdata/ddl/output/alter_table_add_column.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_add_column.sql.golden.json @@ -27,7 +27,7 @@ "AlterExprs": [ { "AddPos": 59, - "StatementEnd": 112, + "StatementEnd": 88, "Column": { "NamePos": 70, "ColumnEnd": 79, @@ -67,29 +67,29 @@ "NameEnd": 88 }, "DotIdent": null - }, - "Settings": { - "SettingsPos": 89, - "ListEnd": 112, - "Items": [ - { - "SettingsPos": 98, - "Name": { - "Name": "alter_sync", - "QuoteType": 1, - "NamePos": 98, - "NameEnd": 108 - }, - "Expr": { - "NumPos": 111, - "NumEnd": 112, - "Literal": "2", - "Base": 10 - } - } - ] } } - ] + ], + "Settings": { + "SettingsPos": 89, + "ListEnd": 112, + "Items": [ + { + "SettingsPos": 98, + "Name": { + "Name": "alter_sync", + "QuoteType": 1, + "NamePos": 98, + "NameEnd": 108 + }, + "Expr": { + "NumPos": 111, + "NumEnd": 112, + "Literal": "2", + "Base": 10 + } + } + ] + } } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_add_index.sql.golden.json b/parser/testdata/ddl/output/alter_table_add_index.sql.golden.json index e761a082..3670fa8c 100644 --- a/parser/testdata/ddl/output/alter_table_add_index.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_add_index.sql.golden.json @@ -79,10 +79,10 @@ } }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null }, { "AlterPos": 112, @@ -159,10 +159,10 @@ } }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null }, { "AlterPos": 228, @@ -239,10 +239,10 @@ } }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null }, { "AlterPos": 348, @@ -331,10 +331,10 @@ } }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null }, { "AlterPos": 481, @@ -429,10 +429,10 @@ } }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null }, { "AlterPos": 615, @@ -462,7 +462,7 @@ "AlterExprs": [ { "AddPos": 674, - "StatementEnd": 759, + "StatementEnd": 735, "Index": { "IndexPos": 678, "Name": { @@ -499,30 +499,30 @@ } }, "IfNotExists": false, - "After": null, - "Settings": { - "SettingsPos": 736, - "ListEnd": 759, - "Items": [ - { - "SettingsPos": 745, - "Name": { - "Name": "alter_sync", - "QuoteType": 1, - "NamePos": 745, - "NameEnd": 755 - }, - "Expr": { - "NumPos": 758, - "NumEnd": 759, - "Literal": "2", - "Base": 10 - } - } - ] - } + "After": null } - ] + ], + "Settings": { + "SettingsPos": 736, + "ListEnd": 759, + "Items": [ + { + "SettingsPos": 745, + "Name": { + "Name": "alter_sync", + "QuoteType": 1, + "NamePos": 745, + "NameEnd": 755 + }, + "Expr": { + "NumPos": 758, + "NumEnd": 759, + "Literal": "2", + "Base": 10 + } + } + ] + } }, { "AlterPos": 761, @@ -552,7 +552,7 @@ "AlterExprs": [ { "AddPos": 820, - "StatementEnd": 919, + "StatementEnd": 895, "Index": { "IndexPos": 824, "Name": { @@ -589,29 +589,29 @@ } }, "IfNotExists": true, - "After": null, - "Settings": { - "SettingsPos": 896, - "ListEnd": 919, - "Items": [ - { - "SettingsPos": 905, - "Name": { - "Name": "alter_sync", - "QuoteType": 1, - "NamePos": 905, - "NameEnd": 915 - }, - "Expr": { - "NumPos": 918, - "NumEnd": 919, - "Literal": "2", - "Base": 10 - } - } - ] - } + "After": null } - ] + ], + "Settings": { + "SettingsPos": 896, + "ListEnd": 919, + "Items": [ + { + "SettingsPos": 905, + "Name": { + "Name": "alter_sync", + "QuoteType": 1, + "NamePos": 905, + "NameEnd": 915 + }, + "Expr": { + "NumPos": 918, + "NumEnd": 919, + "Literal": "2", + "Base": 10 + } + } + ] + } } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_add_projection.sql.golden.json b/parser/testdata/ddl/output/alter_table_add_projection.sql.golden.json index 915b6ab8..70fb1b4c 100644 --- a/parser/testdata/ddl/output/alter_table_add_projection.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_add_projection.sql.golden.json @@ -109,6 +109,7 @@ } } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_add_projection_group_by_only.sql.golden.json b/parser/testdata/ddl/output/alter_table_add_projection_group_by_only.sql.golden.json index ed774cac..76937fe8 100644 --- a/parser/testdata/ddl/output/alter_table_add_projection_group_by_only.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_add_projection_group_by_only.sql.golden.json @@ -188,6 +188,7 @@ }, "After": null } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_attach_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_attach_partition.sql.golden.json index dc0f400e..394bf7b8 100644 --- a/parser/testdata/ddl/output/alter_table_attach_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_attach_partition.sql.golden.json @@ -27,7 +27,8 @@ }, "From": null } - ] + ], + "Settings": null }, { "AlterPos": 46, @@ -65,7 +66,8 @@ } } } - ] + ], + "Settings": null }, { "AlterPos": 103, @@ -95,6 +97,7 @@ }, "From": null } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_clear_column.sql.golden.json b/parser/testdata/ddl/output/alter_table_clear_column.sql.golden.json index f8ec143a..acce428a 100644 --- a/parser/testdata/ddl/output/alter_table_clear_column.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_clear_column.sql.golden.json @@ -38,6 +38,7 @@ "All": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_clear_index.sql.golden.json b/parser/testdata/ddl/output/alter_table_clear_index.sql.golden.json index 2b1a7d53..6387863e 100644 --- a/parser/testdata/ddl/output/alter_table_clear_index.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_clear_index.sql.golden.json @@ -38,6 +38,7 @@ "All": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_clear_projection.sql.golden.json b/parser/testdata/ddl/output/alter_table_clear_projection.sql.golden.json index 19d75bb3..118ec6b6 100644 --- a/parser/testdata/ddl/output/alter_table_clear_projection.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_clear_projection.sql.golden.json @@ -38,6 +38,7 @@ "All": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_delete.sql.golden.json b/parser/testdata/ddl/output/alter_table_delete.sql.golden.json index e6270b4d..f93500a2 100644 --- a/parser/testdata/ddl/output/alter_table_delete.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_delete.sql.golden.json @@ -38,6 +38,7 @@ "HasNot": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_delete_with_cluster.sql.golden.json b/parser/testdata/ddl/output/alter_table_delete_with_cluster.sql.golden.json index 158db218..efe19e7a 100644 --- a/parser/testdata/ddl/output/alter_table_delete_with_cluster.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_delete_with_cluster.sql.golden.json @@ -67,6 +67,7 @@ "HasNot": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_detach_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_detach_partition.sql.golden.json index 3b4309ec..cfff0699 100644 --- a/parser/testdata/ddl/output/alter_table_detach_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_detach_partition.sql.golden.json @@ -29,9 +29,9 @@ }, "ID": null, "All": false - }, - "Settings": null + } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_drop_column.sql.golden.json b/parser/testdata/ddl/output/alter_table_drop_column.sql.golden.json index eba69333..94918036 100644 --- a/parser/testdata/ddl/output/alter_table_drop_column.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_drop_column.sql.golden.json @@ -38,6 +38,7 @@ }, "IfExists": true } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_drop_detach_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_drop_detach_partition.sql.golden.json index 4876b2c7..d9c9df08 100644 --- a/parser/testdata/ddl/output/alter_table_drop_detach_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_drop_detach_partition.sql.golden.json @@ -30,29 +30,29 @@ }, "ID": null, "All": false - }, - "Settings": { - "SettingsPos": 122, - "ListEnd": 154, - "Items": [ - { - "SettingsPos": 131, - "Name": { - "Name": "allow_drop_detached", - "QuoteType": 1, - "NamePos": 131, - "NameEnd": 150 - }, - "Expr": { - "NumPos": 153, - "NumEnd": 154, - "Literal": "1", - "Base": 10 - } - } - ] } } - ] + ], + "Settings": { + "SettingsPos": 122, + "ListEnd": 154, + "Items": [ + { + "SettingsPos": 131, + "Name": { + "Name": "allow_drop_detached", + "QuoteType": 1, + "NamePos": 131, + "NameEnd": 150 + }, + "Expr": { + "NumPos": 153, + "NumEnd": 154, + "Literal": "1", + "Base": 10 + } + } + ] + } } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_drop_index.sql.golden.json b/parser/testdata/ddl/output/alter_table_drop_index.sql.golden.json index 9baee99d..ed8cd50a 100644 --- a/parser/testdata/ddl/output/alter_table_drop_index.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_drop_index.sql.golden.json @@ -38,6 +38,7 @@ }, "IfExists": false } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_drop_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_drop_partition.sql.golden.json index 440d9173..cada49a0 100644 --- a/parser/testdata/ddl/output/alter_table_drop_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_drop_partition.sql.golden.json @@ -37,9 +37,9 @@ }, "ID": null, "All": false - }, - "Settings": null + } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_drop_projection.sql.golden.json b/parser/testdata/ddl/output/alter_table_drop_projection.sql.golden.json index 9be7d086..0e0268f7 100644 --- a/parser/testdata/ddl/output/alter_table_drop_projection.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_drop_projection.sql.golden.json @@ -38,6 +38,7 @@ }, "IfExists": false } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_freeze_no_specify_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_freeze_no_specify_partition.sql.golden.json index 6e704f09..1e5f52c3 100644 --- a/parser/testdata/ddl/output/alter_table_freeze_no_specify_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_freeze_no_specify_partition.sql.golden.json @@ -30,6 +30,7 @@ "StatementEnd": 59, "Partition": null } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_freeze_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_freeze_partition.sql.golden.json index ccd11e55..c77ff90d 100644 --- a/parser/testdata/ddl/output/alter_table_freeze_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_freeze_partition.sql.golden.json @@ -39,6 +39,7 @@ "All": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_materialize_index.sql.golden.json b/parser/testdata/ddl/output/alter_table_materialize_index.sql.golden.json index 3db7173a..0605d79c 100644 --- a/parser/testdata/ddl/output/alter_table_materialize_index.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_materialize_index.sql.golden.json @@ -37,6 +37,7 @@ "All": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_materialize_projection.sql.golden.json b/parser/testdata/ddl/output/alter_table_materialize_projection.sql.golden.json index cb964c5b..3fc8fa36 100644 --- a/parser/testdata/ddl/output/alter_table_materialize_projection.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_materialize_projection.sql.golden.json @@ -37,6 +37,7 @@ "All": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_modify_column.sql.golden.json b/parser/testdata/ddl/output/alter_table_modify_column.sql.golden.json index 8403b00d..6c039e51 100644 --- a/parser/testdata/ddl/output/alter_table_modify_column.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_modify_column.sql.golden.json @@ -53,6 +53,7 @@ }, "RemovePropertyType": null } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_modify_column_remove.sql.golden.json b/parser/testdata/ddl/output/alter_table_modify_column_remove.sql.golden.json index 49746b0f..22716bfa 100644 --- a/parser/testdata/ddl/output/alter_table_modify_column_remove.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_modify_column_remove.sql.golden.json @@ -52,6 +52,7 @@ } } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_modify_order_by.sql.golden.json b/parser/testdata/ddl/output/alter_table_modify_order_by.sql.golden.json index fd987b5f..ecc953ee 100644 --- a/parser/testdata/ddl/output/alter_table_modify_order_by.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_modify_order_by.sql.golden.json @@ -47,7 +47,8 @@ "ColumnArgList": null } } - ] + ], + "Settings": null }, { "AlterPos": 67, @@ -73,7 +74,8 @@ "NameEnd": 113 } } - ] + ], + "Settings": null }, { "AlterPos": 115, @@ -159,7 +161,8 @@ "ColumnArgList": null } } - ] + ], + "Settings": null }, { "AlterPos": 210, @@ -209,8 +212,7 @@ "CompressionCodec": null }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null }, { "ModifyPos": 263, @@ -246,6 +248,7 @@ "ColumnArgList": null } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_modify_setting.sql.golden.json b/parser/testdata/ddl/output/alter_table_modify_setting.sql.golden.json index 6f73ee48..6748dec1 100644 --- a/parser/testdata/ddl/output/alter_table_modify_setting.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_modify_setting.sql.golden.json @@ -49,6 +49,7 @@ } ] } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_remove_ttl.sql.golden.json b/parser/testdata/ddl/output/alter_table_remove_ttl.sql.golden.json index f18ba766..d0bdeff3 100644 --- a/parser/testdata/ddl/output/alter_table_remove_ttl.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_remove_ttl.sql.golden.json @@ -29,6 +29,7 @@ "RemovePos": 53, "StatementEnd": 63 } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_rename_column.sql.golden.json b/parser/testdata/ddl/output/alter_table_rename_column.sql.golden.json index 558e75b2..7ba12ba1 100644 --- a/parser/testdata/ddl/output/alter_table_rename_column.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_rename_column.sql.golden.json @@ -35,6 +35,7 @@ "DotIdent": null } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_replace_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_replace_partition.sql.golden.json index f19fdbe5..c415ec37 100644 --- a/parser/testdata/ddl/output/alter_table_replace_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_replace_partition.sql.golden.json @@ -35,6 +35,7 @@ } } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_reset_multiple_settings.sql.golden.json b/parser/testdata/ddl/output/alter_table_reset_multiple_settings.sql.golden.json index 53a901da..5718bf0e 100644 --- a/parser/testdata/ddl/output/alter_table_reset_multiple_settings.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_reset_multiple_settings.sql.golden.json @@ -37,6 +37,7 @@ } ] } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_reset_setting.sql.golden.json b/parser/testdata/ddl/output/alter_table_reset_setting.sql.golden.json index 6bfda5b2..105641ab 100644 --- a/parser/testdata/ddl/output/alter_table_reset_setting.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_reset_setting.sql.golden.json @@ -25,6 +25,7 @@ } ] } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_settings.sql.golden.json b/parser/testdata/ddl/output/alter_table_settings.sql.golden.json new file mode 100644 index 00000000..e21f7147 --- /dev/null +++ b/parser/testdata/ddl/output/alter_table_settings.sql.golden.json @@ -0,0 +1,235 @@ +[ + { + "AlterPos": 0, + "StatementEnd": 76, + "TableIdentifier": { + "Database": { + "Name": "test", + "QuoteType": 1, + "NamePos": 12, + "NameEnd": 16 + }, + "Table": { + "Name": "events_local", + "QuoteType": 1, + "NamePos": 17, + "NameEnd": 29 + } + }, + "OnCluster": null, + "AlterExprs": [ + { + "ModifyPos": 30, + "StatementEnd": 52, + "IfExists": false, + "Column": { + "NamePos": 44, + "ColumnEnd": 52, + "Name": { + "Ident": { + "Name": "f0", + "QuoteType": 1, + "NamePos": 44, + "NameEnd": 46 + }, + "DotIdent": null + }, + "Type": { + "Name": { + "Name": "Int64", + "QuoteType": 1, + "NamePos": 47, + "NameEnd": 52 + } + }, + "NotNull": null, + "Nullable": null, + "DefaultExpr": null, + "MaterializedExpr": null, + "AliasExpr": null, + "Codec": null, + "TTL": null, + "Comment": null, + "CompressionCodec": null + }, + "RemovePropertyType": null + } + ], + "Settings": { + "SettingsPos": 53, + "ListEnd": 76, + "Items": [ + { + "SettingsPos": 62, + "Name": { + "Name": "alter_sync", + "QuoteType": 1, + "NamePos": 62, + "NameEnd": 72 + }, + "Expr": { + "NumPos": 75, + "NumEnd": 76, + "Literal": "2", + "Base": 10 + } + } + ] + } + }, + { + "AlterPos": 78, + "StatementEnd": 168, + "TableIdentifier": { + "Database": { + "Name": "test", + "QuoteType": 1, + "NamePos": 90, + "NameEnd": 94 + }, + "Table": { + "Name": "events_local", + "QuoteType": 1, + "NamePos": 95, + "NameEnd": 107 + } + }, + "OnCluster": null, + "AlterExprs": [ + { + "AddPos": 108, + "StatementEnd": 128, + "Column": { + "NamePos": 119, + "ColumnEnd": 128, + "Name": { + "Ident": { + "Name": "f1", + "QuoteType": 1, + "NamePos": 119, + "NameEnd": 121 + }, + "DotIdent": null + }, + "Type": { + "Name": { + "Name": "String", + "QuoteType": 1, + "NamePos": 122, + "NameEnd": 128 + } + }, + "NotNull": null, + "Nullable": null, + "DefaultExpr": null, + "MaterializedExpr": null, + "AliasExpr": null, + "Codec": null, + "TTL": null, + "Comment": null, + "CompressionCodec": null + }, + "IfNotExists": false, + "After": null + }, + { + "DropPos": 130, + "ColumnName": { + "Ident": { + "Name": "f2", + "QuoteType": 1, + "NamePos": 142, + "NameEnd": 144 + }, + "DotIdent": null + }, + "IfExists": false + } + ], + "Settings": { + "SettingsPos": 145, + "ListEnd": 168, + "Items": [ + { + "SettingsPos": 154, + "Name": { + "Name": "alter_sync", + "QuoteType": 1, + "NamePos": 154, + "NameEnd": 164 + }, + "Expr": { + "NumPos": 167, + "NumEnd": 168, + "Literal": "2", + "Base": 10 + } + } + ] + } + }, + { + "AlterPos": 170, + "StatementEnd": 299, + "TableIdentifier": { + "Database": { + "Name": "test", + "QuoteType": 1, + "NamePos": 182, + "NameEnd": 186 + }, + "Table": { + "Name": "events_local", + "QuoteType": 1, + "NamePos": 187, + "NameEnd": 199 + } + }, + "OnCluster": { + "OnPos": 200, + "Expr": { + "LiteralPos": 212, + "LiteralEnd": 227, + "Literal": "default_cluster" + } + }, + "AlterExprs": [ + { + "MaterializedPos": 229, + "StatementEnd": 271, + "IfExists": true, + "IndexName": { + "Ident": { + "Name": "created_at_idx", + "QuoteType": 1, + "NamePos": 257, + "NameEnd": 271 + }, + "DotIdent": null + }, + "Partition": null + } + ], + "Settings": { + "SettingsPos": 272, + "ListEnd": 299, + "Items": [ + { + "SettingsPos": 281, + "Name": { + "Name": "mutations_sync", + "QuoteType": 1, + "NamePos": 281, + "NameEnd": 295 + }, + "Expr": { + "NumPos": 298, + "NumEnd": 299, + "Literal": "2", + "Base": 10 + } + } + ] + } + } +] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_update.sql.golden.json b/parser/testdata/ddl/output/alter_table_update.sql.golden.json index efdcf499..b2a5fefa 100644 --- a/parser/testdata/ddl/output/alter_table_update.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_update.sql.golden.json @@ -89,6 +89,7 @@ "HasNot": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_update_in_partition.sql.golden.json b/parser/testdata/ddl/output/alter_table_update_in_partition.sql.golden.json index 2871d91c..b20b4da5 100644 --- a/parser/testdata/ddl/output/alter_table_update_in_partition.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_update_in_partition.sql.golden.json @@ -67,6 +67,7 @@ "HasNot": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/ddl/output/alter_table_update_with_cluster.sql.golden.json b/parser/testdata/ddl/output/alter_table_update_with_cluster.sql.golden.json index dfc20f9a..9bce4ada 100644 --- a/parser/testdata/ddl/output/alter_table_update_with_cluster.sql.golden.json +++ b/parser/testdata/ddl/output/alter_table_update_with_cluster.sql.golden.json @@ -79,6 +79,7 @@ "HasNot": false } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/dml/output/alter_table_modify_query.sql.golden.json b/parser/testdata/dml/output/alter_table_modify_query.sql.golden.json index e96d7893..0fd00576 100644 --- a/parser/testdata/dml/output/alter_table_modify_query.sql.golden.json +++ b/parser/testdata/dml/output/alter_table_modify_query.sql.golden.json @@ -122,6 +122,7 @@ "Intersect": null } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/dml/output/alter_table_modify_ttl_multiple.sql.golden.json b/parser/testdata/dml/output/alter_table_modify_ttl_multiple.sql.golden.json index 66bed1e9..59f75de5 100644 --- a/parser/testdata/dml/output/alter_table_modify_ttl_multiple.sql.golden.json +++ b/parser/testdata/dml/output/alter_table_modify_ttl_multiple.sql.golden.json @@ -178,6 +178,7 @@ ] } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/dml/output/alter_table_with_comment.sql.golden.json b/parser/testdata/dml/output/alter_table_with_comment.sql.golden.json index 08fdebcc..50e57cde 100644 --- a/parser/testdata/dml/output/alter_table_with_comment.sql.golden.json +++ b/parser/testdata/dml/output/alter_table_with_comment.sql.golden.json @@ -72,10 +72,10 @@ "CompressionCodec": null }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null }, { "AlterPos": 110, @@ -141,9 +141,9 @@ "CompressionCodec": null }, "IfNotExists": false, - "After": null, - "Settings": null + "After": null } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/dml/output/alter_table_with_modify_remove_ttl.sql.golden.json b/parser/testdata/dml/output/alter_table_with_modify_remove_ttl.sql.golden.json index 1af51cd2..6a5cd47e 100644 --- a/parser/testdata/dml/output/alter_table_with_modify_remove_ttl.sql.golden.json +++ b/parser/testdata/dml/output/alter_table_with_modify_remove_ttl.sql.golden.json @@ -30,6 +30,7 @@ "RemovePos": 73, "StatementEnd": 83 } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/testdata/dml/output/alter_table_with_modify_ttl.sql.golden.json b/parser/testdata/dml/output/alter_table_with_modify_ttl.sql.golden.json index a79bf41c..3ac3ec5e 100644 --- a/parser/testdata/dml/output/alter_table_with_modify_ttl.sql.golden.json +++ b/parser/testdata/dml/output/alter_table_with_modify_ttl.sql.golden.json @@ -66,6 +66,7 @@ ] } } - ] + ], + "Settings": null } ] \ No newline at end of file diff --git a/parser/walk.go b/parser/walk.go index e4b07859..8f0e5999 100644 --- a/parser/walk.go +++ b/parser/walk.go @@ -842,6 +842,9 @@ func Walk(node Expr, fn WalkFunc) bool { return false } } + if !Walk(n.Settings, fn) { + return false + } case *AlterTableAttachPartition: if !Walk(n.Partition, fn) { return false @@ -853,16 +856,10 @@ func Walk(node Expr, fn WalkFunc) bool { if !Walk(n.Partition, fn) { return false } - if !Walk(n.Settings, fn) { - return false - } case *AlterTableDropPartition: if !Walk(n.Partition, fn) { return false } - if !Walk(n.Settings, fn) { - return false - } case *AlterTableMaterializeProjection: if !Walk(n.ProjectionName, fn) { return false @@ -888,9 +885,6 @@ func Walk(node Expr, fn WalkFunc) bool { if !Walk(n.After, fn) { return false } - if !Walk(n.Settings, fn) { - return false - } case *AlterTableAddIndex: if !Walk(n.Index, fn) { return false @@ -898,9 +892,6 @@ func Walk(node Expr, fn WalkFunc) bool { if !Walk(n.After, fn) { return false } - if !Walk(n.Settings, fn) { - return false - } case *AlterTableAddProjection: if !Walk(n.TableProjection, fn) { return false