Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 18 additions & 16 deletions parser/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -3562,29 +3562,31 @@ func (n *UnaryExpr) String(level int) string {
return "-" + n.Expr.String(level+1)
}

type RenameTable struct {
RenamePos Pos
StatementEnd Pos
TablePairList []*TablePair
OnCluster *OnClusterExpr
type RenameStmt struct {
RenamePos Pos
StatementEnd Pos

RenameTarget string
TargetPairList []*TargetPair
OnCluster *OnClusterExpr
}

func (r *RenameTable) Pos() Pos {
func (r *RenameStmt) Pos() Pos {
return r.RenamePos
}

func (r *RenameTable) End() Pos {
func (r *RenameStmt) End() Pos {
return r.StatementEnd
}

func (r *RenameTable) Type() string {
return "RENAME TABLE"
func (r *RenameStmt) Type() string {
return "RENAME " + r.RenameTarget
}

func (r *RenameTable) String(level int) string {
func (r *RenameStmt) String(level int) string {
var builder strings.Builder
builder.WriteString("RENAME TABLE ")
for i, pair := range r.TablePairList {
builder.WriteString("RENAME " + r.RenameTarget + " ")
for i, pair := range r.TargetPairList {
if i > 0 {
builder.WriteString(", ")
}
Expand All @@ -3599,20 +3601,20 @@ func (r *RenameTable) String(level int) string {
return builder.String()
}

type TablePair struct {
type TargetPair struct {
Old *TableIdentifier
New *TableIdentifier
}

func (t *TablePair) Pos() Pos {
func (t *TargetPair) Pos() Pos {
return t.Old.Pos()
}

func (t *TablePair) End() Pos {
func (t *TargetPair) End() Pos {
return t.New.End()
}

func (t *TablePair) String() string {
func (t *TargetPair) String() string {
return t.Old.String(0) + " TO " + t.New.String(0)
}

Expand Down
43 changes: 27 additions & 16 deletions parser/parser_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func (p *Parser) parseDDL(pos Pos) (DDL, error) {
case p.matchKeyword(KeywordTruncate):
return p.parseTruncateTable(pos)
case p.matchKeyword(KeywordRename):
return p.parseRenameTable(pos)
return p.parseRenameStmt(pos)
}
return nil, nil // nolint
}
Expand Down Expand Up @@ -1183,46 +1183,57 @@ func (p *Parser) parseInsertExpr(pos Pos) (*InsertExpr, error) {
return insertExpr, nil
}

func (p *Parser) parseRenameTable(pos Pos) (*RenameTable, error) {
func (p *Parser) parseRenameStmt(pos Pos) (*RenameStmt, error) {
if err := p.consumeKeyword(KeywordRename); err != nil {
return nil, err
}
if err := p.consumeKeyword(KeywordTable); err != nil {
return nil, err

renameTarget := KeywordTable
switch {
case p.tryConsumeKeyword(KeywordDictionary) != nil:
renameTarget = KeywordDictionary
case p.tryConsumeKeyword(KeywordDatabase) != nil:
renameTarget = KeywordDatabase
default:
if err := p.consumeKeyword(KeywordTable); err != nil {
return nil, err
}
}

tablePair, err := p.parseTablePair(p.Pos())
targetPair, err := p.parseTargetPair(p.Pos())
if err != nil {
return nil, err
}
tablePairList := []*TablePair{tablePair}
tablePairList := []*TargetPair{targetPair}
for p.tryConsumeTokenKind(",") != nil {
tablePair, err := p.parseTablePair(p.Pos())
tablePair, err := p.parseTargetPair(p.Pos())
if err != nil {
return nil, err
}
tablePairList = append(tablePairList, tablePair)
}

renameTable := &RenameTable{
RenamePos: pos,
StatementEnd: tablePairList[len(tablePairList)-1].End(),
TablePairList: tablePairList,
renameStmt := &RenameStmt{
RenamePos: pos,
StatementEnd: tablePairList[len(tablePairList)-1].End(),

RenameTarget: renameTarget,
TargetPairList: tablePairList,
}

onClusterExpr, err := p.tryParseOnCluster(p.Pos())
if err != nil {
return nil, err
}
if onClusterExpr != nil {
renameTable.OnCluster = onClusterExpr
renameTable.StatementEnd = onClusterExpr.End()
renameStmt.OnCluster = onClusterExpr
renameStmt.StatementEnd = onClusterExpr.End()
}

return renameTable, nil
return renameStmt, nil
}

func (p *Parser) parseTablePair(_ Pos) (*TablePair, error) {
func (p *Parser) parseTargetPair(_ Pos) (*TargetPair, error) {
oldTable, err := p.parseTableIdentifier(p.Pos())
if err != nil {
return nil, err
Expand All @@ -1235,7 +1246,7 @@ func (p *Parser) parseTablePair(_ Pos) (*TablePair, error) {
return nil, err
}

return &TablePair{
return &TargetPair{
Old: oldTable,
New: newTable,
}, nil
Expand Down
37 changes: 37 additions & 0 deletions parser/testdata/ddl/format/rename.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
-- Origin SQL:
-- rename table
RENAME TABLE t1 TO t11;
RENAME TABLE t1 TO t11 ON CLUSTER 'default_cluster';
RENAME TABLE t1 TO t11, t2 TO t22;
RENAME TABLE t1 TO t11, t2 TO t22 ON CLUSTER 'default_cluster';
-- rename dictionary
RENAME DICTIONARY t1 TO t11;
RENAME DICTIONARY t1 TO t11 ON CLUSTER 'default_cluster';
RENAME DICTIONARY t1 TO t11, t2 TO t22;
RENAME DICTIONARY t1 TO t11, t2 TO t22 ON CLUSTER 'default_cluster';
-- rename database
RENAME DATABASE t1 TO t11;
RENAME DATABASE t1 TO t11 ON CLUSTER 'default_cluster';
RENAME DATABASE t1 TO t11, t2 TO t22;
RENAME DATABASE t1 TO t11, t2 TO t22 ON CLUSTER 'default_cluster';


-- Format SQL:
RENAME TABLE t1 TO t11;
RENAME TABLE t1 TO t11
ON CLUSTER 'default_cluster';
RENAME TABLE t1 TO t11, t2 TO t22;
RENAME TABLE t1 TO t11, t2 TO t22
ON CLUSTER 'default_cluster';
RENAME DICTIONARY t1 TO t11;
RENAME DICTIONARY t1 TO t11
ON CLUSTER 'default_cluster';
RENAME DICTIONARY t1 TO t11, t2 TO t22;
RENAME DICTIONARY t1 TO t11, t2 TO t22
ON CLUSTER 'default_cluster';
RENAME DATABASE t1 TO t11;
RENAME DATABASE t1 TO t11
ON CLUSTER 'default_cluster';
RENAME DATABASE t1 TO t11, t2 TO t22;
RENAME DATABASE t1 TO t11, t2 TO t22
ON CLUSTER 'default_cluster';
14 changes: 0 additions & 14 deletions parser/testdata/ddl/format/rename_table.sql

This file was deleted.

Loading