diff --git a/parser/ast.go b/parser/ast.go index 40492bb..e98f4f7 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) } diff --git a/parser/format.go b/parser/format.go index 1e2067e..39cf0d0 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,18 +246,14 @@ 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) { - formatter.WriteString("ADD ") + formatter.WriteString("ADD INDEX ") if a.IfNotExists { formatter.WriteString("IF NOT EXISTS ") } - formatter.WriteExpr(a.Index) + a.Index.formatDefinition(formatter) if a.After != nil { formatter.WriteString(" AFTER ") formatter.WriteExpr(a.After) @@ -333,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) { @@ -361,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) { @@ -2656,6 +2648,12 @@ func (t *TableIdentifier) FormatSQL(formatter *Formatter) { func (a *TableIndex) FormatSQL(formatter *Formatter) { formatter.WriteString("INDEX") formatter.WriteByte(whitespace) + a.formatDefinition(formatter) +} + +// formatDefinition writes everything after the INDEX keyword, so ALTER TABLE +// can place IF NOT EXISTS between INDEX and the index name. +func (a *TableIndex) formatDefinition(formatter *Formatter) { formatter.WriteExpr(a.Name) // Add space only if column expression doesn't start with '(' columnExprStr := Format(a.ColumnExpr) diff --git a/parser/parser_alter.go b/parser/parser_alter.go index 9523f01..1b3e196 100644 --- a/parser/parser_alter.go +++ b/parser/parser_alter.go @@ -76,6 +76,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 } @@ -120,21 +129,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 } @@ -342,15 +342,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 } @@ -483,16 +477,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 e24d688..a462572 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_add_index.sql b/parser/testdata/ddl/alter_table_add_index.sql index 65e0ca3..b67216c 100644 --- a/parser/testdata/ddl/alter_table_add_index.sql +++ b/parser/testdata/ddl/alter_table_add_index.sql @@ -3,3 +3,5 @@ ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX api_id_idx ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX arr_idx arr TYPE bloom_filter(0.01) GRANULARITY 3; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX content_idx content TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX output_idx output TYPE ngrambf_v1(3, 10000, 2, 1) GRANULARITY 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX IF NOT EXISTS created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync = 2; diff --git a/parser/testdata/ddl/alter_table_settings.sql b/parser/testdata/ddl/alter_table_settings.sql new file mode 100644 index 0000000..d9eba94 --- /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_add_index.sql b/parser/testdata/ddl/format/alter_table_add_index.sql index e585d38..3806d3c 100644 --- a/parser/testdata/ddl/format/alter_table_add_index.sql +++ b/parser/testdata/ddl/format/alter_table_add_index.sql @@ -4,6 +4,8 @@ ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX api_id_idx ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX arr_idx arr TYPE bloom_filter(0.01) GRANULARITY 3; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX content_idx content TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX output_idx output TYPE ngrambf_v1(3, 10000, 2, 1) GRANULARITY 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX IF NOT EXISTS created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync = 2; -- Format SQL: @@ -12,3 +14,5 @@ ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX api_id_idx ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX arr_idx arr TYPE bloom_filter(0.01) GRANULARITY 3; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX content_idx content TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX output_idx output TYPE ngrambf_v1(3, 10000, 2, 1) GRANULARITY 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync=2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX IF NOT EXISTS created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_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 0000000..b78bfcd --- /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_add_index.sql b/parser/testdata/ddl/format/beautify/alter_table_add_index.sql index 5ec84c6..2f9a0ae 100644 --- a/parser/testdata/ddl/format/beautify/alter_table_add_index.sql +++ b/parser/testdata/ddl/format/beautify/alter_table_add_index.sql @@ -4,6 +4,8 @@ ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX api_id_idx ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX arr_idx arr TYPE bloom_filter(0.01) GRANULARITY 3; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX content_idx content TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX output_idx output TYPE ngrambf_v1(3, 10000, 2, 1) GRANULARITY 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync = 2; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX IF NOT EXISTS created_at_idx created_at TYPE minmax GRANULARITY 1 SETTINGS alter_sync = 2; -- Beautify SQL: @@ -22,3 +24,13 @@ ADD INDEX content_idx content TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1; ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD INDEX output_idx output TYPE ngrambf_v1(3, 10000, 2, 1) GRANULARITY 2; +ALTER TABLE test.events_local +ON CLUSTER 'default_cluster' +ADD INDEX created_at_idx created_at TYPE minmax GRANULARITY 1 +SETTINGS + alter_sync=2; +ALTER TABLE test.events_local +ON CLUSTER 'default_cluster' +ADD INDEX IF NOT EXISTS created_at_idx created_at TYPE minmax GRANULARITY 1 +SETTINGS + alter_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 0000000..4b7e33c --- /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 9ec9838..d7aeda3 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 569f618..3670fa8 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 @@ -81,7 +81,8 @@ "IfNotExists": false, "After": null } - ] + ], + "Settings": null }, { "AlterPos": 112, @@ -160,7 +161,8 @@ "IfNotExists": false, "After": null } - ] + ], + "Settings": null }, { "AlterPos": 228, @@ -239,7 +241,8 @@ "IfNotExists": false, "After": null } - ] + ], + "Settings": null }, { "AlterPos": 348, @@ -330,7 +333,8 @@ "IfNotExists": false, "After": null } - ] + ], + "Settings": null }, { "AlterPos": 481, @@ -427,6 +431,187 @@ "IfNotExists": false, "After": null } - ] + ], + "Settings": null + }, + { + "AlterPos": 615, + "StatementEnd": 759, + "TableIdentifier": { + "Database": { + "Name": "test", + "QuoteType": 1, + "NamePos": 627, + "NameEnd": 631 + }, + "Table": { + "Name": "events_local", + "QuoteType": 1, + "NamePos": 632, + "NameEnd": 644 + } + }, + "OnCluster": { + "OnPos": 645, + "Expr": { + "LiteralPos": 657, + "LiteralEnd": 672, + "Literal": "default_cluster" + } + }, + "AlterExprs": [ + { + "AddPos": 674, + "StatementEnd": 735, + "Index": { + "IndexPos": 678, + "Name": { + "Ident": { + "Name": "created_at_idx", + "QuoteType": 1, + "NamePos": 684, + "NameEnd": 698 + }, + "DotIdent": null + }, + "ColumnExpr": { + "Expr": { + "Name": "created_at", + "QuoteType": 1, + "NamePos": 699, + "NameEnd": 709 + }, + "Alias": null + }, + "ColumnType": { + "Name": { + "Name": "minmax", + "QuoteType": 1, + "NamePos": 715, + "NameEnd": 721 + } + }, + "Granularity": { + "NumPos": 734, + "NumEnd": 735, + "Literal": "1", + "Base": 10 + } + }, + "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 + } + } + ] + } + }, + { + "AlterPos": 761, + "StatementEnd": 919, + "TableIdentifier": { + "Database": { + "Name": "test", + "QuoteType": 1, + "NamePos": 773, + "NameEnd": 777 + }, + "Table": { + "Name": "events_local", + "QuoteType": 1, + "NamePos": 778, + "NameEnd": 790 + } + }, + "OnCluster": { + "OnPos": 791, + "Expr": { + "LiteralPos": 803, + "LiteralEnd": 818, + "Literal": "default_cluster" + } + }, + "AlterExprs": [ + { + "AddPos": 820, + "StatementEnd": 895, + "Index": { + "IndexPos": 824, + "Name": { + "Ident": { + "Name": "created_at_idx", + "QuoteType": 1, + "NamePos": 844, + "NameEnd": 858 + }, + "DotIdent": null + }, + "ColumnExpr": { + "Expr": { + "Name": "created_at", + "QuoteType": 1, + "NamePos": 859, + "NameEnd": 869 + }, + "Alias": null + }, + "ColumnType": { + "Name": { + "Name": "minmax", + "QuoteType": 1, + "NamePos": 875, + "NameEnd": 881 + } + }, + "Granularity": { + "NumPos": 894, + "NumEnd": 895, + "Literal": "1", + "Base": 10 + } + }, + "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 + } + } + ] + } } ] \ 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 915b6ab..70fb1b4 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 ed774ca..76937fe 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 dc0f400..394bf7b 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 f8ec143..acce428 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 2b1a7d5..6387863 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 19d75bb..118ec6b 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 e6270b4..f93500a 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 158db21..efe19e7 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 3b4309e..cfff069 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 eba6933..9491803 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 4876b2c..d9c9df0 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 9baee99..ed8cd50 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 440d917..cada49a 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 9be7d08..0e0268f 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 6e704f0..1e5f52c 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 ccd11e5..c77ff90 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 3db7173..0605d79 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 cb964c5..3fc8fa3 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 8403b00..6c039e5 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 49746b0..22716bf 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 fd987b5..ecc953e 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 6f73ee4..6748dec 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 f18ba76..d0bdeff 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 558e75b..7ba12ba 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 f19fdbe..c415ec3 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 53a901d..5718bf0 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 6bfda5b..105641a 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 0000000..e21f714 --- /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 efdcf49..b2a5fef 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 2871d91..b20b4da 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 dfc20f9..9bce4ad 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 e96d789..0fd0057 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 66bed1e..59f75de 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 08fdebc..50e57cd 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 1af51cd..6a5cd47 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 a79bf41..3ac3ec5 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 5cbcd7c..667d7a5 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