diff --git a/parser/ast.go b/parser/ast.go index 7b76337..5475754 100644 --- a/parser/ast.go +++ b/parser/ast.go @@ -605,6 +605,7 @@ type AlterTableAddColumn struct { Column *ColumnDef IfNotExists bool After *NestedIdentifier + Settings *SettingsClause } func (a *AlterTableAddColumn) Pos() Pos { @@ -612,6 +613,9 @@ func (a *AlterTableAddColumn) Pos() Pos { } func (a *AlterTableAddColumn) End() Pos { + if a.Settings != nil { + return a.Settings.End() + } return a.StatementEnd } @@ -622,14 +626,18 @@ func (a *AlterTableAddColumn) AlterType() string { func (a *AlterTableAddColumn) String() string { var builder strings.Builder builder.WriteString("ADD COLUMN ") - builder.WriteString(a.Column.String()) if a.IfNotExists { builder.WriteString("IF NOT EXISTS ") } + builder.WriteString(a.Column.String()) if a.After != nil { builder.WriteString(" AFTER ") builder.WriteString(a.After.String()) } + if a.Settings != nil { + builder.WriteByte(' ') + builder.WriteString(a.Settings.String()) + } return builder.String() } @@ -644,6 +652,11 @@ 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/parser_alter.go b/parser/parser_alter.go index 0edfe0d..b9f7659 100644 --- a/parser/parser_alter.go +++ b/parser/parser_alter.go @@ -117,12 +117,21 @@ 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 } diff --git a/parser/testdata/ddl/alter_table_add_column.sql b/parser/testdata/ddl/alter_table_add_column.sql index 8c3726b..5c13f68 100644 --- a/parser/testdata/ddl/alter_table_add_column.sql +++ b/parser/testdata/ddl/alter_table_add_column.sql @@ -1 +1 @@ -ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0 SETTINGS alter_sync = 2; diff --git a/parser/testdata/ddl/format/alter_table_add_column.sql b/parser/testdata/ddl/format/alter_table_add_column.sql index abb50ca..59a507a 100644 --- a/parser/testdata/ddl/format/alter_table_add_column.sql +++ b/parser/testdata/ddl/format/alter_table_add_column.sql @@ -1,6 +1,6 @@ -- Origin SQL: -ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0 SETTINGS alter_sync = 2; -- Format SQL: -ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0; +ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0 SETTINGS alter_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 5f1bd2b..9ec9838 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 @@ -1,7 +1,7 @@ [ { "AlterPos": 0, - "StatementEnd": 88, + "StatementEnd": 112, "TableIdentifier": { "Database": { "Name": "test", @@ -27,7 +27,7 @@ "AlterExprs": [ { "AddPos": 59, - "StatementEnd": 88, + "StatementEnd": 112, "Column": { "NamePos": 70, "ColumnEnd": 79, @@ -67,6 +67,27 @@ "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 + } + } + ] } } ] 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 b92a2e3..08fdebc 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,7 +72,8 @@ "CompressionCodec": null }, "IfNotExists": false, - "After": null + "After": null, + "Settings": null } ] }, @@ -140,7 +141,8 @@ "CompressionCodec": null }, "IfNotExists": false, - "After": null + "After": null, + "Settings": null } ] } diff --git a/parser/walk.go b/parser/walk.go index 5554346..a942fb9 100644 --- a/parser/walk.go +++ b/parser/walk.go @@ -831,6 +831,9 @@ 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