Skip to content

Commit ce1bc60

Browse files
authored
Improve the rename statement parser (#13)
1 parent fce2893 commit ce1bc60

File tree

8 files changed

+597
-214
lines changed

8 files changed

+597
-214
lines changed

parser/ast.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3562,29 +3562,31 @@ func (n *UnaryExpr) String(level int) string {
35623562
return "-" + n.Expr.String(level+1)
35633563
}
35643564

3565-
type RenameTable struct {
3566-
RenamePos Pos
3567-
StatementEnd Pos
3568-
TablePairList []*TablePair
3569-
OnCluster *OnClusterExpr
3565+
type RenameStmt struct {
3566+
RenamePos Pos
3567+
StatementEnd Pos
3568+
3569+
RenameTarget string
3570+
TargetPairList []*TargetPair
3571+
OnCluster *OnClusterExpr
35703572
}
35713573

3572-
func (r *RenameTable) Pos() Pos {
3574+
func (r *RenameStmt) Pos() Pos {
35733575
return r.RenamePos
35743576
}
35753577

3576-
func (r *RenameTable) End() Pos {
3578+
func (r *RenameStmt) End() Pos {
35773579
return r.StatementEnd
35783580
}
35793581

3580-
func (r *RenameTable) Type() string {
3581-
return "RENAME TABLE"
3582+
func (r *RenameStmt) Type() string {
3583+
return "RENAME " + r.RenameTarget
35823584
}
35833585

3584-
func (r *RenameTable) String(level int) string {
3586+
func (r *RenameStmt) String(level int) string {
35853587
var builder strings.Builder
3586-
builder.WriteString("RENAME TABLE ")
3587-
for i, pair := range r.TablePairList {
3588+
builder.WriteString("RENAME " + r.RenameTarget + " ")
3589+
for i, pair := range r.TargetPairList {
35883590
if i > 0 {
35893591
builder.WriteString(", ")
35903592
}
@@ -3599,20 +3601,20 @@ func (r *RenameTable) String(level int) string {
35993601
return builder.String()
36003602
}
36013603

3602-
type TablePair struct {
3604+
type TargetPair struct {
36033605
Old *TableIdentifier
36043606
New *TableIdentifier
36053607
}
36063608

3607-
func (t *TablePair) Pos() Pos {
3609+
func (t *TargetPair) Pos() Pos {
36083610
return t.Old.Pos()
36093611
}
36103612

3611-
func (t *TablePair) End() Pos {
3613+
func (t *TargetPair) End() Pos {
36123614
return t.New.End()
36133615
}
36143616

3615-
func (t *TablePair) String() string {
3617+
func (t *TargetPair) String() string {
36163618
return t.Old.String(0) + " TO " + t.New.String(0)
36173619
}
36183620

parser/parser_table.go

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (p *Parser) parseDDL(pos Pos) (DDL, error) {
4848
case p.matchKeyword(KeywordTruncate):
4949
return p.parseTruncateTable(pos)
5050
case p.matchKeyword(KeywordRename):
51-
return p.parseRenameTable(pos)
51+
return p.parseRenameStmt(pos)
5252
}
5353
return nil, nil // nolint
5454
}
@@ -1183,46 +1183,57 @@ func (p *Parser) parseInsertExpr(pos Pos) (*InsertExpr, error) {
11831183
return insertExpr, nil
11841184
}
11851185

1186-
func (p *Parser) parseRenameTable(pos Pos) (*RenameTable, error) {
1186+
func (p *Parser) parseRenameStmt(pos Pos) (*RenameStmt, error) {
11871187
if err := p.consumeKeyword(KeywordRename); err != nil {
11881188
return nil, err
11891189
}
1190-
if err := p.consumeKeyword(KeywordTable); err != nil {
1191-
return nil, err
1190+
1191+
renameTarget := KeywordTable
1192+
switch {
1193+
case p.tryConsumeKeyword(KeywordDictionary) != nil:
1194+
renameTarget = KeywordDictionary
1195+
case p.tryConsumeKeyword(KeywordDatabase) != nil:
1196+
renameTarget = KeywordDatabase
1197+
default:
1198+
if err := p.consumeKeyword(KeywordTable); err != nil {
1199+
return nil, err
1200+
}
11921201
}
11931202

1194-
tablePair, err := p.parseTablePair(p.Pos())
1203+
targetPair, err := p.parseTargetPair(p.Pos())
11951204
if err != nil {
11961205
return nil, err
11971206
}
1198-
tablePairList := []*TablePair{tablePair}
1207+
tablePairList := []*TargetPair{targetPair}
11991208
for p.tryConsumeTokenKind(",") != nil {
1200-
tablePair, err := p.parseTablePair(p.Pos())
1209+
tablePair, err := p.parseTargetPair(p.Pos())
12011210
if err != nil {
12021211
return nil, err
12031212
}
12041213
tablePairList = append(tablePairList, tablePair)
12051214
}
12061215

1207-
renameTable := &RenameTable{
1208-
RenamePos: pos,
1209-
StatementEnd: tablePairList[len(tablePairList)-1].End(),
1210-
TablePairList: tablePairList,
1216+
renameStmt := &RenameStmt{
1217+
RenamePos: pos,
1218+
StatementEnd: tablePairList[len(tablePairList)-1].End(),
1219+
1220+
RenameTarget: renameTarget,
1221+
TargetPairList: tablePairList,
12111222
}
12121223

12131224
onClusterExpr, err := p.tryParseOnCluster(p.Pos())
12141225
if err != nil {
12151226
return nil, err
12161227
}
12171228
if onClusterExpr != nil {
1218-
renameTable.OnCluster = onClusterExpr
1219-
renameTable.StatementEnd = onClusterExpr.End()
1229+
renameStmt.OnCluster = onClusterExpr
1230+
renameStmt.StatementEnd = onClusterExpr.End()
12201231
}
12211232

1222-
return renameTable, nil
1233+
return renameStmt, nil
12231234
}
12241235

1225-
func (p *Parser) parseTablePair(_ Pos) (*TablePair, error) {
1236+
func (p *Parser) parseTargetPair(_ Pos) (*TargetPair, error) {
12261237
oldTable, err := p.parseTableIdentifier(p.Pos())
12271238
if err != nil {
12281239
return nil, err
@@ -1235,7 +1246,7 @@ func (p *Parser) parseTablePair(_ Pos) (*TablePair, error) {
12351246
return nil, err
12361247
}
12371248

1238-
return &TablePair{
1249+
return &TargetPair{
12391250
Old: oldTable,
12401251
New: newTable,
12411252
}, nil

parser/testdata/ddl/format/rename.sql

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
-- Origin SQL:
2+
-- rename table
3+
RENAME TABLE t1 TO t11;
4+
RENAME TABLE t1 TO t11 ON CLUSTER 'default_cluster';
5+
RENAME TABLE t1 TO t11, t2 TO t22;
6+
RENAME TABLE t1 TO t11, t2 TO t22 ON CLUSTER 'default_cluster';
7+
-- rename dictionary
8+
RENAME DICTIONARY t1 TO t11;
9+
RENAME DICTIONARY t1 TO t11 ON CLUSTER 'default_cluster';
10+
RENAME DICTIONARY t1 TO t11, t2 TO t22;
11+
RENAME DICTIONARY t1 TO t11, t2 TO t22 ON CLUSTER 'default_cluster';
12+
-- rename database
13+
RENAME DATABASE t1 TO t11;
14+
RENAME DATABASE t1 TO t11 ON CLUSTER 'default_cluster';
15+
RENAME DATABASE t1 TO t11, t2 TO t22;
16+
RENAME DATABASE t1 TO t11, t2 TO t22 ON CLUSTER 'default_cluster';
17+
18+
19+
-- Format SQL:
20+
RENAME TABLE t1 TO t11;
21+
RENAME TABLE t1 TO t11
22+
ON CLUSTER 'default_cluster';
23+
RENAME TABLE t1 TO t11, t2 TO t22;
24+
RENAME TABLE t1 TO t11, t2 TO t22
25+
ON CLUSTER 'default_cluster';
26+
RENAME DICTIONARY t1 TO t11;
27+
RENAME DICTIONARY t1 TO t11
28+
ON CLUSTER 'default_cluster';
29+
RENAME DICTIONARY t1 TO t11, t2 TO t22;
30+
RENAME DICTIONARY t1 TO t11, t2 TO t22
31+
ON CLUSTER 'default_cluster';
32+
RENAME DATABASE t1 TO t11;
33+
RENAME DATABASE t1 TO t11
34+
ON CLUSTER 'default_cluster';
35+
RENAME DATABASE t1 TO t11, t2 TO t22;
36+
RENAME DATABASE t1 TO t11, t2 TO t22
37+
ON CLUSTER 'default_cluster';

parser/testdata/ddl/format/rename_table.sql

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)