Skip to content

Commit b13080f

Browse files
Lance726claude
andauthored
Add support for SETTINGS clause in ALTER TABLE ADD COLUMN (#232)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 2154d0b commit b13080f

File tree

7 files changed

+56
-8
lines changed

7 files changed

+56
-8
lines changed

parser/ast.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,13 +605,17 @@ type AlterTableAddColumn struct {
605605
Column *ColumnDef
606606
IfNotExists bool
607607
After *NestedIdentifier
608+
Settings *SettingsClause
608609
}
609610

610611
func (a *AlterTableAddColumn) Pos() Pos {
611612
return a.AddPos
612613
}
613614

614615
func (a *AlterTableAddColumn) End() Pos {
616+
if a.Settings != nil {
617+
return a.Settings.End()
618+
}
615619
return a.StatementEnd
616620
}
617621

@@ -622,14 +626,18 @@ func (a *AlterTableAddColumn) AlterType() string {
622626
func (a *AlterTableAddColumn) String() string {
623627
var builder strings.Builder
624628
builder.WriteString("ADD COLUMN ")
625-
builder.WriteString(a.Column.String())
626629
if a.IfNotExists {
627630
builder.WriteString("IF NOT EXISTS ")
628631
}
632+
builder.WriteString(a.Column.String())
629633
if a.After != nil {
630634
builder.WriteString(" AFTER ")
631635
builder.WriteString(a.After.String())
632636
}
637+
if a.Settings != nil {
638+
builder.WriteByte(' ')
639+
builder.WriteString(a.Settings.String())
640+
}
633641
return builder.String()
634642
}
635643

@@ -644,6 +652,11 @@ func (a *AlterTableAddColumn) Accept(visitor ASTVisitor) error {
644652
return err
645653
}
646654
}
655+
if a.Settings != nil {
656+
if err := a.Settings.Accept(visitor); err != nil {
657+
return err
658+
}
659+
}
647660
return visitor.VisitAlterTableAddColumn(a)
648661
}
649662

parser/parser_alter.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,21 @@ func (p *Parser) parseAlterTableAddColumn(pos Pos) (*AlterTableAddColumn, error)
117117
statementEnd = after.End()
118118
}
119119

120+
settings, err := p.tryParseSettingsClause(p.Pos())
121+
if err != nil {
122+
return nil, err
123+
}
124+
if settings != nil {
125+
statementEnd = settings.End()
126+
}
127+
120128
return &AlterTableAddColumn{
121129
AddPos: pos,
122130
StatementEnd: statementEnd,
123131
Column: column,
124132
IfNotExists: ifNotExists,
125133
After: after,
134+
Settings: settings,
126135
}, nil
127136
}
128137

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0;
1+
ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0 SETTINGS alter_sync = 2;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
-- Origin SQL:
2-
ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0;
2+
ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0 SETTINGS alter_sync = 2;
33

44

55
-- Format SQL:
6-
ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0;
6+
ALTER TABLE test.events_local ON CLUSTER 'default_cluster' ADD COLUMN f1 String AFTER f0 SETTINGS alter_sync=2;

parser/testdata/ddl/output/alter_table_add_column.sql.golden.json

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"AlterPos": 0,
4-
"StatementEnd": 88,
4+
"StatementEnd": 112,
55
"TableIdentifier": {
66
"Database": {
77
"Name": "test",
@@ -27,7 +27,7 @@
2727
"AlterExprs": [
2828
{
2929
"AddPos": 59,
30-
"StatementEnd": 88,
30+
"StatementEnd": 112,
3131
"Column": {
3232
"NamePos": 70,
3333
"ColumnEnd": 79,
@@ -67,6 +67,27 @@
6767
"NameEnd": 88
6868
},
6969
"DotIdent": null
70+
},
71+
"Settings": {
72+
"SettingsPos": 89,
73+
"ListEnd": 112,
74+
"Items": [
75+
{
76+
"SettingsPos": 98,
77+
"Name": {
78+
"Name": "alter_sync",
79+
"QuoteType": 1,
80+
"NamePos": 98,
81+
"NameEnd": 108
82+
},
83+
"Expr": {
84+
"NumPos": 111,
85+
"NumEnd": 112,
86+
"Literal": "2",
87+
"Base": 10
88+
}
89+
}
90+
]
7091
}
7192
}
7293
]

parser/testdata/dml/output/alter_table_with_comment.sql.golden.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@
7272
"CompressionCodec": null
7373
},
7474
"IfNotExists": false,
75-
"After": null
75+
"After": null,
76+
"Settings": null
7677
}
7778
]
7879
},
@@ -140,7 +141,8 @@
140141
"CompressionCodec": null
141142
},
142143
"IfNotExists": false,
143-
"After": null
144+
"After": null,
145+
"Settings": null
144146
}
145147
]
146148
}

parser/walk.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,9 @@ func Walk(node Expr, fn WalkFunc) bool {
831831
if !Walk(n.After, fn) {
832832
return false
833833
}
834+
if !Walk(n.Settings, fn) {
835+
return false
836+
}
834837
case *AlterTableAddIndex:
835838
if !Walk(n.Index, fn) {
836839
return false

0 commit comments

Comments
 (0)