Skip to content

Commit 5770de8

Browse files
authored
Support RENAME TABLE statement (#170)
* Implements RENAME TABLE statement * Update testdata * Add newline * Rename RenameTableSrcDest to RenameTableTo, SrcDest to ToList. * Use Tos, Old, New in RenameTable and RenameTableTo * Update testdata * Fix to reflect review
1 parent 3f8a4d8 commit 5770de8

10 files changed

+180
-1
lines changed

ast/ast.go

+25
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func (AlterDatabase) isStatement() {}
6161
func (CreateTable) isStatement() {}
6262
func (AlterTable) isStatement() {}
6363
func (DropTable) isStatement() {}
64+
func (RenameTable) isStatement() {}
6465
func (CreateIndex) isStatement() {}
6566
func (AlterIndex) isStatement() {}
6667
func (DropIndex) isStatement() {}
@@ -270,6 +271,7 @@ func (AlterDatabase) isDDL() {}
270271
func (CreateTable) isDDL() {}
271272
func (AlterTable) isDDL() {}
272273
func (DropTable) isDDL() {}
274+
func (RenameTable) isDDL() {}
273275
func (CreateIndex) isDDL() {}
274276
func (AlterIndex) isDDL() {}
275277
func (DropIndex) isDDL() {}
@@ -2136,6 +2138,29 @@ type DropTable struct {
21362138
Name *Ident
21372139
}
21382140

2141+
// RenameTable is RENAME TABLE statement node.
2142+
//
2143+
// RENAME TABLE {{.Tos | sqlJoin ", "}}
2144+
type RenameTable struct {
2145+
// pos = Rename
2146+
// end = Tos[$].end
2147+
2148+
Rename token.Pos // position of "RENAME" pseudo keyword
2149+
2150+
Tos []*RenameTableTo // len(Tos) > 0
2151+
}
2152+
2153+
// RenameTableTo is old TO new node in RENAME TABLE statement.
2154+
//
2155+
// {{.Old | sql}} TO {{.New | sql}}
2156+
type RenameTableTo struct {
2157+
// pos = Old.pos
2158+
// end = New.end
2159+
2160+
Old *Ident
2161+
New *Ident
2162+
}
2163+
21392164
// CreateIndex is CREATE INDEX statement node.
21402165
//
21412166
// CREATE

ast/pos.go

+6
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,12 @@ func (a *AlterColumnDropDefault) End() token.Pos { return a.Default + 7 }
743743
func (d *DropTable) Pos() token.Pos { return d.Drop }
744744
func (d *DropTable) End() token.Pos { return d.Name.End() }
745745

746+
func (r *RenameTable) Pos() token.Pos { return r.Rename }
747+
func (r *RenameTable) End() token.Pos { return lastEnd(r.Tos) }
748+
749+
func (r *RenameTableTo) Pos() token.Pos { return r.Old.Pos() }
750+
func (r *RenameTableTo) End() token.Pos { return r.New.End() }
751+
746752
func (c *CreateIndex) Pos() token.Pos {
747753
return c.Create
748754
}

ast/sql.go

+4
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,10 @@ func (d *DropTable) SQL() string {
965965
return sql + d.Name.SQL()
966966
}
967967

968+
func (r *RenameTable) SQL() string { return "RENAME TABLE " + sqlJoin(r.Tos, ", ") }
969+
970+
func (r *RenameTableTo) SQL() string { return r.Old.SQL() + " TO " + r.New.SQL() }
971+
968972
func (c *CreateIndex) SQL() string {
969973
sql := "CREATE "
970974
if c.Unique {

parser.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ func (p *Parser) parseStatement() ast.Statement {
212212
switch {
213213
case p.Token.Kind == "SELECT" || p.Token.Kind == "@" || p.Token.Kind == "WITH" || p.Token.Kind == "(":
214214
return p.parseQueryStatement()
215-
case p.Token.Kind == "CREATE" || p.Token.IsKeywordLike("ALTER") || p.Token.IsKeywordLike("DROP") || p.Token.IsKeywordLike("GRANT") || p.Token.IsKeywordLike("REVOKE"):
215+
case p.Token.Kind == "CREATE" || p.Token.IsKeywordLike("ALTER") || p.Token.IsKeywordLike("DROP") ||
216+
p.Token.IsKeywordLike("RENAME") || p.Token.IsKeywordLike("GRANT") || p.Token.IsKeywordLike("REVOKE"):
216217
return p.parseDDL()
217218
case p.Token.IsKeywordLike("INSERT") || p.Token.IsKeywordLike("DELETE") || p.Token.IsKeywordLike("UPDATE"):
218219
return p.parseDML()
@@ -2200,6 +2201,9 @@ func (p *Parser) parseDDL() ast.DDL {
22002201
return p.parseDropChangeStream(pos)
22012202
}
22022203
p.panicfAtToken(&p.Token, "expected pseudo keyword: TABLE, INDEX, ROLE, CHANGE, but: %s", p.Token.AsString)
2204+
case p.Token.IsKeywordLike("RENAME"):
2205+
p.nextToken()
2206+
return p.parseRenameTable(pos)
22032207
case p.Token.IsKeywordLike("GRANT"):
22042208
p.nextToken()
22052209
return p.parseGrant(pos)
@@ -3886,3 +3890,25 @@ func (p *Parser) errorfAtToken(tok *token.Token, msg string, params ...interface
38863890
func (p *Parser) panicfAtToken(tok *token.Token, msg string, params ...interface{}) {
38873891
panic(p.errorfAtToken(tok, msg, params...))
38883892
}
3893+
3894+
func (p *Parser) parseRenameTableTo() *ast.RenameTableTo {
3895+
old := p.parseIdent()
3896+
p.expect("TO")
3897+
new := p.parseIdent()
3898+
3899+
return &ast.RenameTableTo{
3900+
Old: old,
3901+
New: new,
3902+
}
3903+
}
3904+
3905+
func (p *Parser) parseRenameTable(pos token.Pos) *ast.RenameTable {
3906+
p.expectKeywordLike("TABLE")
3907+
tos := parseCommaSeparatedList(p, p.parseRenameTableTo)
3908+
3909+
return &ast.RenameTable{
3910+
Rename: pos,
3911+
Tos: tos,
3912+
}
3913+
3914+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
RENAME TABLE Singers TO Artists, Albums TO Recordings
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
RENAME TABLE Singers TO Artists
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--- rename_table_multiple.sql
2+
RENAME TABLE Singers TO Artists, Albums TO Recordings
3+
--- AST
4+
&ast.RenameTable{
5+
Rename: 0,
6+
Tos: []*ast.RenameTableTo{
7+
&ast.RenameTableTo{
8+
Old: &ast.Ident{
9+
NamePos: 13,
10+
NameEnd: 20,
11+
Name: "Singers",
12+
},
13+
New: &ast.Ident{
14+
NamePos: 24,
15+
NameEnd: 31,
16+
Name: "Artists",
17+
},
18+
},
19+
&ast.RenameTableTo{
20+
Old: &ast.Ident{
21+
NamePos: 33,
22+
NameEnd: 39,
23+
Name: "Albums",
24+
},
25+
New: &ast.Ident{
26+
NamePos: 43,
27+
NameEnd: 53,
28+
Name: "Recordings",
29+
},
30+
},
31+
},
32+
}
33+
34+
--- SQL
35+
RENAME TABLE Singers TO Artists, Albums TO Recordings
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--- rename_table_single.sql
2+
RENAME TABLE Singers TO Artists
3+
--- AST
4+
&ast.RenameTable{
5+
Rename: 0,
6+
Tos: []*ast.RenameTableTo{
7+
&ast.RenameTableTo{
8+
Old: &ast.Ident{
9+
NamePos: 13,
10+
NameEnd: 20,
11+
Name: "Singers",
12+
},
13+
New: &ast.Ident{
14+
NamePos: 24,
15+
NameEnd: 31,
16+
Name: "Artists",
17+
},
18+
},
19+
},
20+
}
21+
22+
--- SQL
23+
RENAME TABLE Singers TO Artists
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--- rename_table_multiple.sql
2+
RENAME TABLE Singers TO Artists, Albums TO Recordings
3+
--- AST
4+
&ast.RenameTable{
5+
Rename: 0,
6+
Tos: []*ast.RenameTableTo{
7+
&ast.RenameTableTo{
8+
Old: &ast.Ident{
9+
NamePos: 13,
10+
NameEnd: 20,
11+
Name: "Singers",
12+
},
13+
New: &ast.Ident{
14+
NamePos: 24,
15+
NameEnd: 31,
16+
Name: "Artists",
17+
},
18+
},
19+
&ast.RenameTableTo{
20+
Old: &ast.Ident{
21+
NamePos: 33,
22+
NameEnd: 39,
23+
Name: "Albums",
24+
},
25+
New: &ast.Ident{
26+
NamePos: 43,
27+
NameEnd: 53,
28+
Name: "Recordings",
29+
},
30+
},
31+
},
32+
}
33+
34+
--- SQL
35+
RENAME TABLE Singers TO Artists, Albums TO Recordings
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--- rename_table_single.sql
2+
RENAME TABLE Singers TO Artists
3+
--- AST
4+
&ast.RenameTable{
5+
Rename: 0,
6+
Tos: []*ast.RenameTableTo{
7+
&ast.RenameTableTo{
8+
Old: &ast.Ident{
9+
NamePos: 13,
10+
NameEnd: 20,
11+
Name: "Singers",
12+
},
13+
New: &ast.Ident{
14+
NamePos: 24,
15+
NameEnd: 31,
16+
Name: "Artists",
17+
},
18+
},
19+
},
20+
}
21+
22+
--- SQL
23+
RENAME TABLE Singers TO Artists

0 commit comments

Comments
 (0)