Skip to content

Commit bf74993

Browse files
authored
Add ALTER TABLE MODIFY/RESET SETTING syntax support (#185)
1 parent d818580 commit bf74993

15 files changed

+341
-24
lines changed

parser/ast.go

Lines changed: 88 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,88 @@ func (a *AlterTableModifyColumn) Accept(visitor ASTVisitor) error {
13211321
return visitor.VisitAlterTableModifyColumn(a)
13221322
}
13231323

1324+
type AlterTableModifySetting struct {
1325+
ModifyPos Pos
1326+
StatementEnd Pos
1327+
Settings []*SettingExpr
1328+
}
1329+
1330+
func (a *AlterTableModifySetting) Pos() Pos {
1331+
return a.ModifyPos
1332+
}
1333+
1334+
func (a *AlterTableModifySetting) End() Pos {
1335+
return a.StatementEnd
1336+
}
1337+
1338+
func (a *AlterTableModifySetting) AlterType() string {
1339+
return "MODIFY_SETTING"
1340+
}
1341+
1342+
func (a *AlterTableModifySetting) String() string {
1343+
var builder strings.Builder
1344+
builder.WriteString("MODIFY SETTING ")
1345+
for i, setting := range a.Settings {
1346+
if i > 0 {
1347+
builder.WriteString(", ")
1348+
}
1349+
builder.WriteString(setting.String())
1350+
}
1351+
return builder.String()
1352+
}
1353+
1354+
func (a *AlterTableModifySetting) Accept(visitor ASTVisitor) error {
1355+
visitor.Enter(a)
1356+
defer visitor.Leave(a)
1357+
for _, setting := range a.Settings {
1358+
if err := setting.Accept(visitor); err != nil {
1359+
return err
1360+
}
1361+
}
1362+
return visitor.VisitAlterTableModifySetting(a)
1363+
}
1364+
1365+
type AlterTableResetSetting struct {
1366+
ResetPos Pos
1367+
StatementEnd Pos
1368+
Settings []*Ident
1369+
}
1370+
1371+
func (a *AlterTableResetSetting) Pos() Pos {
1372+
return a.ResetPos
1373+
}
1374+
1375+
func (a *AlterTableResetSetting) End() Pos {
1376+
return a.StatementEnd
1377+
}
1378+
1379+
func (a *AlterTableResetSetting) AlterType() string {
1380+
return "RESET_SETTING"
1381+
}
1382+
1383+
func (a *AlterTableResetSetting) String() string {
1384+
var builder strings.Builder
1385+
builder.WriteString("RESET SETTING ")
1386+
for i, setting := range a.Settings {
1387+
if i > 0 {
1388+
builder.WriteString(", ")
1389+
}
1390+
builder.WriteString(setting.String())
1391+
}
1392+
return builder.String()
1393+
}
1394+
1395+
func (a *AlterTableResetSetting) Accept(visitor ASTVisitor) error {
1396+
visitor.Enter(a)
1397+
defer visitor.Leave(a)
1398+
for _, setting := range a.Settings {
1399+
if err := setting.Accept(visitor); err != nil {
1400+
return err
1401+
}
1402+
}
1403+
return visitor.VisitAlterTableResetSetting(a)
1404+
}
1405+
13241406
type AlterTableReplacePartition struct {
13251407
ReplacePos Pos
13261408
Partition *PartitionClause
@@ -3519,29 +3601,29 @@ func (o *OrderByClause) Accept(visitor ASTVisitor) error {
35193601
return visitor.VisitOrderByListExpr(o)
35203602
}
35213603

3522-
type SettingExprList struct {
3604+
type SettingExpr struct {
35233605
SettingsPos Pos
35243606
Name *Ident
35253607
Expr Expr
35263608
}
35273609

3528-
func (s *SettingExprList) Pos() Pos {
3610+
func (s *SettingExpr) Pos() Pos {
35293611
return s.SettingsPos
35303612
}
35313613

3532-
func (s *SettingExprList) End() Pos {
3614+
func (s *SettingExpr) End() Pos {
35333615
return s.Expr.End()
35343616
}
35353617

3536-
func (s *SettingExprList) String() string {
3618+
func (s *SettingExpr) String() string {
35373619
var builder strings.Builder
35383620
builder.WriteString(s.Name.String())
35393621
builder.WriteByte('=')
35403622
builder.WriteString(s.Expr.String())
35413623
return builder.String()
35423624
}
35433625

3544-
func (s *SettingExprList) Accept(visitor ASTVisitor) error {
3626+
func (s *SettingExpr) Accept(visitor ASTVisitor) error {
35453627
visitor.Enter(s)
35463628
defer visitor.Leave(s)
35473629
if err := s.Name.Accept(visitor); err != nil {
@@ -3556,7 +3638,7 @@ func (s *SettingExprList) Accept(visitor ASTVisitor) error {
35563638
type SettingsClause struct {
35573639
SettingsPos Pos
35583640
ListEnd Pos
3559-
Items []*SettingExprList
3641+
Items []*SettingExpr
35603642
}
35613643

35623644
func (s *SettingsClause) Pos() Pos {

parser/ast_visitor.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ type ASTVisitor interface {
2929
VisitAlterTableModifyTTL(expr *AlterTableModifyTTL) error
3030
VisitAlterTableModifyQuery(expr *AlterTableModifyQuery) error
3131
VisitAlterTableModifyColumn(expr *AlterTableModifyColumn) error
32+
VisitAlterTableModifySetting(expr *AlterTableModifySetting) error
33+
VisitAlterTableResetSetting(expr *AlterTableResetSetting) error
3234
VisitAlterTableReplacePartition(expr *AlterTableReplacePartition) error
3335
VisitRemovePropertyType(expr *RemovePropertyType) error
3436
VisitTableIndex(expr *TableIndex) error
@@ -73,7 +75,7 @@ type ASTVisitor interface {
7375
VisitRefreshExpr(expr *RefreshExpr) error
7476
VisitOrderByExpr(expr *OrderExpr) error
7577
VisitOrderByListExpr(expr *OrderByClause) error
76-
VisitSettingsExpr(expr *SettingExprList) error
78+
VisitSettingsExpr(expr *SettingExpr) error
7779
VisitSettingsExprList(expr *SettingsClause) error
7880
VisitParamExprList(expr *ParamExprList) error
7981
VisitMapLiteral(expr *MapLiteral) error
@@ -396,6 +398,20 @@ func (v *DefaultASTVisitor) VisitAlterTableModifyColumn(expr *AlterTableModifyCo
396398
return nil
397399
}
398400

401+
func (v *DefaultASTVisitor) VisitAlterTableModifySetting(expr *AlterTableModifySetting) error {
402+
if v.Visit != nil {
403+
return v.Visit(expr)
404+
}
405+
return nil
406+
}
407+
408+
func (v *DefaultASTVisitor) VisitAlterTableResetSetting(expr *AlterTableResetSetting) error {
409+
if v.Visit != nil {
410+
return v.Visit(expr)
411+
}
412+
return nil
413+
}
414+
399415
func (v *DefaultASTVisitor) VisitAlterTableReplacePartition(expr *AlterTableReplacePartition) error {
400416
if v.Visit != nil {
401417
return v.Visit(expr)
@@ -704,7 +720,7 @@ func (v *DefaultASTVisitor) VisitOrderByListExpr(expr *OrderByClause) error {
704720
return nil
705721
}
706722

707-
func (v *DefaultASTVisitor) VisitSettingsExpr(expr *SettingExprList) error {
723+
func (v *DefaultASTVisitor) VisitSettingsExpr(expr *SettingExpr) error {
708724
if v.Visit != nil {
709725
return v.Visit(expr)
710726
}

parser/keyword.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ const (
180180
KeywordRemove = "REMOVE"
181181
KeywordRename = "RENAME"
182182
KeywordReplace = "REPLACE"
183+
KeywordReset = "RESET"
183184
KeywordReplica = "REPLICA"
184185
KeywordReplicated = "REPLICATED"
185186
KeywordReplication = "REPLICATION"
@@ -197,6 +198,7 @@ const (
197198
KeywordServer = "SERVER"
198199
KeywordSet = "SET"
199200
KeywordSets = "SETS"
201+
KeywordSetting = "SETTING"
200202
KeywordSettings = "SETTINGS"
201203
KeywordShow = "SHOW"
202204
KeywordShutdown = "SHUTDOWN"
@@ -428,6 +430,7 @@ var keywords = NewSet(
428430
KeywordRemove,
429431
KeywordRename,
430432
KeywordReplace,
433+
KeywordReset,
431434
KeywordReplica,
432435
KeywordReplicated,
433436
KeywordReplication,
@@ -445,6 +448,7 @@ var keywords = NewSet(
445448
KeywordServer,
446449
KeywordSet,
447450
KeywordSets,
451+
KeywordSetting,
448452
KeywordSettings,
449453
KeywordShow,
450454
KeywordShutdown,

parser/parser_alter.go

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ func (p *Parser) parseAlterTable(pos Pos) (*AlterTable, error) {
5151
alter, err = p.parseAlterTableReplacePartition(p.Pos())
5252
case p.matchKeyword(KeywordMaterialize):
5353
alter, err = p.parseAlterTableMaterialize(p.Pos())
54+
case p.matchKeyword(KeywordReset):
55+
alter, err = p.parseAlterTableReset(p.Pos())
5456
default:
55-
return nil, errors.New("expected token: ADD|DROP|ATTACH|DETACH|FREEZE|REMOVE|CLEAR")
57+
return nil, errors.New("expected token: ADD|DROP|ATTACH|DETACH|FREEZE|REMOVE|CLEAR|MODIFY|REPLACE|MATERIALIZE|RESET")
5658
}
5759
if err != nil {
5860
return nil, err
@@ -648,8 +650,21 @@ func (p *Parser) parseAlterTableModify(pos Pos) (AlterTableClause, error) {
648650
StatementEnd: selectQuery.End(),
649651
SelectExpr: selectQuery,
650652
}, nil
653+
case p.matchKeyword(KeywordSetting):
654+
_ = p.lexer.consumeToken() // consume "SETTING"
655+
settings, err := p.parseSettingsList(p.Pos())
656+
if err != nil {
657+
return nil, err
658+
}
659+
// settings must not be empty
660+
statementEnd := settings[len(settings)-1].End()
661+
return &AlterTableModifySetting{
662+
ModifyPos: pos,
663+
StatementEnd: statementEnd,
664+
Settings: settings,
665+
}, nil
651666
default:
652-
return nil, fmt.Errorf("expected keyword: COLUMN|TTL|QUERY, but got %q",
667+
return nil, fmt.Errorf("expected keyword: COLUMN|TTL|QUERY|SETTING, but got %q",
653668
p.last().String)
654669
}
655670

@@ -784,3 +799,37 @@ func (p *Parser) parseAlterTableMaterialize(pos Pos) (AlterTableClause, error) {
784799
Partition: partition,
785800
}, nil
786801
}
802+
803+
func (p *Parser) parseAlterTableReset(pos Pos) (AlterTableClause, error) {
804+
if err := p.expectKeyword(KeywordReset); err != nil {
805+
return nil, err
806+
}
807+
808+
if err := p.expectKeyword(KeywordSetting); err != nil {
809+
return nil, err
810+
}
811+
812+
// Parse comma-separated setting names inline
813+
var settings []*Ident
814+
setting, err := p.parseIdent()
815+
if err != nil {
816+
return nil, err
817+
}
818+
settings = append(settings, setting)
819+
820+
for p.tryConsumeTokenKind(TokenKindComma) != nil {
821+
setting, err = p.parseIdent()
822+
if err != nil {
823+
return nil, err
824+
}
825+
settings = append(settings, setting)
826+
}
827+
828+
statementEnd := settings[len(settings)-1].End()
829+
830+
return &AlterTableResetSetting{
831+
ResetPos: pos,
832+
StatementEnd: statementEnd,
833+
Settings: settings,
834+
}, nil
835+
}

parser/parser_table.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -920,27 +920,37 @@ func (p *Parser) tryParseSettingsClause(pos Pos) (*SettingsClause, error) {
920920

921921
func (p *Parser) parseSettingsClause(pos Pos) (*SettingsClause, error) {
922922
settings := &SettingsClause{SettingsPos: pos, ListEnd: pos}
923-
items := make([]*SettingExprList, 0)
924-
expr, err := p.parseSettingsExprList(p.Pos())
923+
items, err := p.parseSettingsList(p.Pos())
924+
if err != nil {
925+
return nil, err
926+
}
927+
928+
if len(items) == 0 {
929+
return nil, fmt.Errorf("settings list is empty")
930+
}
931+
settings.ListEnd = items[len(items)-1].End()
932+
settings.Items = items
933+
return settings, nil
934+
}
935+
936+
func (p *Parser) parseSettingsList(pos Pos) ([]*SettingExpr, error) {
937+
items := make([]*SettingExpr, 0)
938+
expr, err := p.parseSettingsExpr(pos)
925939
if err != nil {
926940
return nil, err
927941
}
928942
items = append(items, expr)
929943
for p.tryConsumeTokenKind(TokenKindComma) != nil {
930-
expr, err = p.parseSettingsExprList(p.Pos())
944+
expr, err = p.parseSettingsExpr(p.Pos())
931945
if err != nil {
932946
return nil, err
933947
}
934948
items = append(items, expr)
935949
}
936-
if len(items) > 0 {
937-
settings.ListEnd = items[len(items)-1].End()
938-
}
939-
settings.Items = items
940-
return settings, nil
950+
return items, nil
941951
}
942952

943-
func (p *Parser) parseSettingsExprList(pos Pos) (*SettingExprList, error) {
953+
func (p *Parser) parseSettingsExpr(pos Pos) (*SettingExpr, error) {
944954
ident, err := p.parseIdent()
945955
if err != nil {
946956
return nil, err
@@ -974,7 +984,7 @@ func (p *Parser) parseSettingsExprList(pos Pos) (*SettingExprList, error) {
974984
return nil, fmt.Errorf("unexpected token: %q, expected <number> or <string>", p.last().String)
975985
}
976986

977-
return &SettingExprList{
987+
return &SettingExpr{
978988
SettingsPos: pos,
979989
Name: ident,
980990
Expr: expr,
@@ -2140,17 +2150,17 @@ func (p *Parser) parseDictionarySettingsClause(pos Pos) (*SettingsClause, error)
21402150
}
21412151

21422152
settings := &SettingsClause{SettingsPos: pos, ListEnd: pos}
2143-
items := make([]*SettingExprList, 0)
2153+
items := make([]*SettingExpr, 0)
21442154
// Parse first setting
2145-
expr, err := p.parseSettingsExprList(p.Pos())
2155+
expr, err := p.parseSettingsExpr(p.Pos())
21462156
if err != nil {
21472157
return nil, err
21482158
}
21492159
items = append(items, expr)
21502160

21512161
// Parse additional settings
21522162
for p.tryConsumeTokenKind(TokenKindComma) != nil {
2153-
expr, err := p.parseSettingsExprList(p.Pos())
2163+
expr, err := p.parseSettingsExpr(p.Pos())
21542164
if err != nil {
21552165
return nil, err
21562166
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE example_table RESET SETTING max_part_loading_threads, max_parts_in_total, another_setting;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE example_table RESET SETTING max_part_loading_threads;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- Origin SQL:
2+
ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000;
3+
4+
-- Format SQL:
5+
ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- Origin SQL:
2+
ALTER TABLE example_table RESET SETTING max_part_loading_threads, max_parts_in_total, another_setting;
3+
4+
-- Format SQL:
5+
ALTER TABLE example_table RESET SETTING max_part_loading_threads, max_parts_in_total, another_setting;

0 commit comments

Comments
 (0)