Skip to content

Commit f9a437c

Browse files
apstndbmakenowjust
andauthored
Support ADD/DROP SYNONYM and RENAME TO in ALTER TABLE (#171)
* Implements ADD/DROP SYNONYM and RENAME TO in ALTER TABLE * Update testdata * Simplify test/template notation * Update ast/ast.go Co-authored-by: Hiroya Fujinami <make.just.on@gmail.com> --------- Co-authored-by: Hiroya Fujinami <make.just.on@gmail.com>
1 parent ff8609d commit f9a437c

16 files changed

+291
-0
lines changed

ast/ast.go

+38
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ type TableAlteration interface {
301301
isTableAlteration()
302302
}
303303

304+
func (AddSynonym) isTableAlteration() {}
305+
func (DropSynonym) isTableAlteration() {}
306+
func (RenameTo) isTableAlteration() {}
304307
func (AddColumn) isTableAlteration() {}
305308
func (AddTableConstraint) isTableAlteration() {}
306309
func (AddRowDeletionPolicy) isTableAlteration() {}
@@ -1913,6 +1916,41 @@ type AlterChangeStream struct {
19131916
ChangeStreamAlteration ChangeStreamAlteration
19141917
}
19151918

1919+
// AddSynonym is ADD SYNONYM node in ALTER TABLE.
1920+
//
1921+
// ADD SYNONYM {{.Name | sql}}
1922+
type AddSynonym struct {
1923+
// pos = Add
1924+
// end = Name.end
1925+
1926+
Add token.Pos // position of "ADD" pseudo keyword
1927+
Name *Ident
1928+
}
1929+
1930+
// DropSynonym is DROP SYNONYM node in ALTER TABLE.
1931+
//
1932+
// DROP SYNONYM {{.Name | sql}}
1933+
type DropSynonym struct {
1934+
// pos = Drop
1935+
// end = Name.end
1936+
1937+
Drop token.Pos // position of "DROP" pseudo keyword
1938+
Name *Ident
1939+
}
1940+
1941+
// RenameTo is RENAME TO node in ALTER TABLE.
1942+
//
1943+
// RENAME TO {{.Name | sql}}{{if .AddSynonym}}, {{.AddSynonym | sql}}{{end}}
1944+
type RenameTo struct {
1945+
// pos = Rename
1946+
// end = (AddSynonym ?? Name).end
1947+
1948+
Rename token.Pos // position of "RENAME" pseudo keyword
1949+
1950+
Name *Ident
1951+
AddSynonym *AddSynonym // optional
1952+
}
1953+
19161954
// AddColumn is ADD COLUMN clause in ALTER TABLE.
19171955
//
19181956
// ADD COLUMN {{if .IfNotExists}}IF NOT EXISTS{{end}} {{.Column | sql}}

ast/pos.go

+9
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,15 @@ func (r *RowDeletionPolicy) End() token.Pos {
674674
func (a *AlterTable) Pos() token.Pos { return a.Alter }
675675
func (a *AlterTable) End() token.Pos { return a.TableAlteration.End() }
676676

677+
func (s *AddSynonym) Pos() token.Pos { return s.Add }
678+
func (s *AddSynonym) End() token.Pos { return s.Name.End() }
679+
680+
func (s *DropSynonym) Pos() token.Pos { return s.Drop }
681+
func (s *DropSynonym) End() token.Pos { return s.Name.End() }
682+
683+
func (t *RenameTo) Pos() token.Pos { return t.Rename }
684+
func (t *RenameTo) End() token.Pos { return firstValidEnd(t.AddSynonym, t.Name) }
685+
677686
func (a *AddColumn) Pos() token.Pos { return a.Add }
678687
func (a *AddColumn) End() token.Pos { return a.Column.End() }
679688

ast/sql.go

+6
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,12 @@ func (a *AlterTable) SQL() string {
895895
return "ALTER TABLE " + a.Name.SQL() + " " + a.TableAlteration.SQL()
896896
}
897897

898+
func (s *AddSynonym) SQL() string { return "ADD SYNONYM " + s.Name.SQL() }
899+
900+
func (s *DropSynonym) SQL() string { return "DROP SYNONYM " + s.Name.SQL() }
901+
902+
func (t *RenameTo) SQL() string { return "RENAME TO " + t.Name.SQL() + sqlOpt(", ", t.AddSynonym, "") }
903+
898904
func (a *AddColumn) SQL() string {
899905
sql := "ADD COLUMN "
900906
if a.IfNotExists {

parser.go

+40
Original file line numberDiff line numberDiff line change
@@ -2849,6 +2849,8 @@ func (p *Parser) parseAlterTable(pos token.Pos) *ast.AlterTable {
28492849
alteration = p.parseAlterTableAdd()
28502850
case p.Token.IsKeywordLike("DROP"):
28512851
alteration = p.parseAlterTableDrop()
2852+
case p.Token.IsKeywordLike("RENAME"):
2853+
alteration = p.parseAlterTableRename()
28522854
case p.Token.IsKeywordLike("REPLACE"):
28532855
alteration = p.parseAlterTableReplace()
28542856
case p.Token.Kind == "SET":
@@ -2870,12 +2872,24 @@ func (p *Parser) parseAlterTable(pos token.Pos) *ast.AlterTable {
28702872
}
28712873
}
28722874

2875+
func (p *Parser) parseAddSynonym(add token.Pos) *ast.AddSynonym {
2876+
p.expectKeywordLike("SYNONYM")
2877+
name := p.parseIdent()
2878+
2879+
return &ast.AddSynonym{
2880+
Add: add,
2881+
Name: name,
2882+
}
2883+
}
2884+
28732885
func (p *Parser) parseAlterTableAdd() ast.TableAlteration {
28742886
pos := p.expectKeywordLike("ADD").Pos
28752887

28762888
var alteration ast.TableAlteration
28772889

28782890
switch {
2891+
case p.Token.IsKeywordLike("SYNONYM"):
2892+
alteration = p.parseAddSynonym(pos)
28792893
case p.Token.IsKeywordLike("COLUMN"):
28802894
p.expectKeywordLike("COLUMN")
28812895
ifNotExists := p.parseIfNotExists()
@@ -2926,6 +2940,13 @@ func (p *Parser) parseAlterTableDrop() ast.TableAlteration {
29262940
var alteration ast.TableAlteration
29272941

29282942
switch {
2943+
case p.Token.IsKeywordLike("SYNONYM"):
2944+
p.expectKeywordLike("SYNONYM")
2945+
name := p.parseIdent()
2946+
alteration = &ast.DropSynonym{
2947+
Drop: pos,
2948+
Name: name,
2949+
}
29292950
case p.Token.IsKeywordLike("COLUMN"):
29302951
p.expectKeywordLike("COLUMN")
29312952
name := p.parseIdent()
@@ -2955,6 +2976,25 @@ func (p *Parser) parseAlterTableDrop() ast.TableAlteration {
29552976
return alteration
29562977
}
29572978

2979+
func (p *Parser) parseAlterTableRename() ast.TableAlteration {
2980+
pos := p.expectKeywordLike("RENAME").Pos
2981+
p.expect("TO")
2982+
name := p.parseIdent()
2983+
2984+
var addSynonym *ast.AddSynonym
2985+
if p.Token.Kind == "," {
2986+
p.nextToken()
2987+
add := p.expectKeywordLike("ADD").Pos
2988+
addSynonym = p.parseAddSynonym(add)
2989+
}
2990+
2991+
return &ast.RenameTo{
2992+
Rename: pos,
2993+
Name: name,
2994+
AddSynonym: addSynonym,
2995+
}
2996+
}
2997+
29582998
func (p *Parser) parseAlterTableReplace() ast.TableAlteration {
29592999
pos := p.expectKeywordLike("REPLACE").Pos
29603000
rdp := p.parseRowDeletionPolicy()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE Singers ADD SYNONYM SingersTest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE Singers DROP SYNONYM SingersTest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE Singers RENAME TO SingersNew
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE Singers RENAME TO SingersNew, ADD SYNONYM Singers
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--- alter_table_add_synonym.sql
2+
ALTER TABLE Singers ADD SYNONYM SingersTest
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.AddSynonym{
12+
Add: 20,
13+
Name: &ast.Ident{
14+
NamePos: 32,
15+
NameEnd: 43,
16+
Name: "SingersTest",
17+
},
18+
},
19+
}
20+
21+
--- SQL
22+
ALTER TABLE Singers ADD SYNONYM SingersTest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--- alter_table_drop_synonym.sql
2+
ALTER TABLE Singers DROP SYNONYM SingersTest
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.DropSynonym{
12+
Drop: 20,
13+
Name: &ast.Ident{
14+
NamePos: 33,
15+
NameEnd: 44,
16+
Name: "SingersTest",
17+
},
18+
},
19+
}
20+
21+
--- SQL
22+
ALTER TABLE Singers DROP SYNONYM SingersTest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--- alter_table_rename_to.sql
2+
ALTER TABLE Singers RENAME TO SingersNew
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.RenameTo{
12+
Rename: 20,
13+
Name: &ast.Ident{
14+
NamePos: 30,
15+
NameEnd: 40,
16+
Name: "SingersNew",
17+
},
18+
AddSynonym: (*ast.AddSynonym)(nil),
19+
},
20+
}
21+
22+
--- SQL
23+
ALTER TABLE Singers RENAME TO SingersNew
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--- alter_table_rename_to_add_synonym.sql
2+
ALTER TABLE Singers RENAME TO SingersNew, ADD SYNONYM Singers
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.RenameTo{
12+
Rename: 20,
13+
Name: &ast.Ident{
14+
NamePos: 30,
15+
NameEnd: 40,
16+
Name: "SingersNew",
17+
},
18+
AddSynonym: &ast.AddSynonym{
19+
Add: 42,
20+
Name: &ast.Ident{
21+
NamePos: 54,
22+
NameEnd: 61,
23+
Name: "Singers",
24+
},
25+
},
26+
},
27+
}
28+
29+
--- SQL
30+
ALTER TABLE Singers RENAME TO SingersNew, ADD SYNONYM Singers
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--- alter_table_add_synonym.sql
2+
ALTER TABLE Singers ADD SYNONYM SingersTest
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.AddSynonym{
12+
Add: 20,
13+
Name: &ast.Ident{
14+
NamePos: 32,
15+
NameEnd: 43,
16+
Name: "SingersTest",
17+
},
18+
},
19+
}
20+
21+
--- SQL
22+
ALTER TABLE Singers ADD SYNONYM SingersTest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--- alter_table_drop_synonym.sql
2+
ALTER TABLE Singers DROP SYNONYM SingersTest
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.DropSynonym{
12+
Drop: 20,
13+
Name: &ast.Ident{
14+
NamePos: 33,
15+
NameEnd: 44,
16+
Name: "SingersTest",
17+
},
18+
},
19+
}
20+
21+
--- SQL
22+
ALTER TABLE Singers DROP SYNONYM SingersTest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--- alter_table_rename_to.sql
2+
ALTER TABLE Singers RENAME TO SingersNew
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.RenameTo{
12+
Rename: 20,
13+
Name: &ast.Ident{
14+
NamePos: 30,
15+
NameEnd: 40,
16+
Name: "SingersNew",
17+
},
18+
AddSynonym: (*ast.AddSynonym)(nil),
19+
},
20+
}
21+
22+
--- SQL
23+
ALTER TABLE Singers RENAME TO SingersNew
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--- alter_table_rename_to_add_synonym.sql
2+
ALTER TABLE Singers RENAME TO SingersNew, ADD SYNONYM Singers
3+
--- AST
4+
&ast.AlterTable{
5+
Alter: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 19,
9+
Name: "Singers",
10+
},
11+
TableAlteration: &ast.RenameTo{
12+
Rename: 20,
13+
Name: &ast.Ident{
14+
NamePos: 30,
15+
NameEnd: 40,
16+
Name: "SingersNew",
17+
},
18+
AddSynonym: &ast.AddSynonym{
19+
Add: 42,
20+
Name: &ast.Ident{
21+
NamePos: 54,
22+
NameEnd: 61,
23+
Name: "Singers",
24+
},
25+
},
26+
},
27+
}
28+
29+
--- SQL
30+
ALTER TABLE Singers RENAME TO SingersNew, ADD SYNONYM Singers

0 commit comments

Comments
 (0)