Skip to content

Commit f7f7bcd

Browse files
Implements Oracle RENAME oldTable TO newTable Statement (#1286)
* Implements Oracle RENAME oldTable TO newTable Statement Fixes #1253 * Implement MariaDB specific syntax * Remove redundant License Headers * Use LinkedHashMap to preserve the order of the Entries * Increase Test Coverage Co-authored-by: Tobias <t.warneke@gmx.net>
1 parent f86bc2e commit f7f7bcd

File tree

8 files changed

+329
-6
lines changed

8 files changed

+329
-6
lines changed

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.sf.jsqlparser.statement.alter.Alter;
1313
import net.sf.jsqlparser.statement.alter.AlterSession;
14+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
1415
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
1516
import net.sf.jsqlparser.statement.comment.Comment;
1617
import net.sf.jsqlparser.statement.create.index.CreateIndex;
@@ -112,5 +113,7 @@ public interface StatementVisitor {
112113

113114
void visit(AlterSession alterSession);
114115

116+
void visit(RenameTableStatement renameTableStatement);
117+
115118
void visit(PurgeStatement purgeStatement);
116119
}

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.sf.jsqlparser.statement.alter.Alter;
1313
import net.sf.jsqlparser.statement.alter.AlterSession;
14+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
1415
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
1516
import net.sf.jsqlparser.statement.comment.Comment;
1617
import net.sf.jsqlparser.statement.create.index.CreateIndex;
@@ -212,7 +213,9 @@ public void visit(AlterSession alterSession) {
212213
}
213214

214215
@Override
216+
public void visit(RenameTableStatement renameTableStatement) {
217+
}
218+
215219
public void visit(PurgeStatement purgeStatement) {
216-
//@todo: do something usefull here
217220
}
218221
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2021 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
11+
package net.sf.jsqlparser.statement.alter;
12+
13+
import java.util.LinkedHashMap;
14+
import java.util.Map;
15+
import java.util.Map.Entry;
16+
import java.util.Objects;
17+
import java.util.Set;
18+
import net.sf.jsqlparser.schema.Table;
19+
import net.sf.jsqlparser.statement.Statement;
20+
import net.sf.jsqlparser.statement.StatementVisitor;
21+
22+
/**
23+
*
24+
* @author are
25+
* @see <a href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9019.htm">Rename</a>
26+
*/
27+
public class RenameTableStatement implements Statement {
28+
private final LinkedHashMap<Table, Table> tableNames = new LinkedHashMap<>();
29+
30+
private boolean usingTableKeyword = false;
31+
private boolean usingIfExistsKeyword = false;
32+
33+
private String waitDirective = "";
34+
35+
public RenameTableStatement(Table oldName, Table newName) {
36+
tableNames.put(
37+
Objects.requireNonNull(oldName, "The OLD NAME of the Rename Statement must not be null.")
38+
, Objects.requireNonNull(newName, "The NEW NAME of the Rename Statement must not be null.")
39+
);
40+
}
41+
42+
public RenameTableStatement(Table oldName, Table newName, boolean usingTableKeyword, boolean usingIfExistsKeyword, String waitDirective) {
43+
tableNames.put(
44+
Objects.requireNonNull(oldName, "The OLD NAME of the Rename Statement must not be null.")
45+
, Objects.requireNonNull(newName, "The NEW NAME of the Rename Statement must not be null.")
46+
);
47+
48+
this.usingTableKeyword = usingTableKeyword;
49+
this.usingIfExistsKeyword = usingIfExistsKeyword;
50+
this.waitDirective = waitDirective;
51+
}
52+
53+
public void addTableNames(Table oldName, Table newName) {
54+
tableNames.put(
55+
Objects.requireNonNull(oldName, "The OLD NAME of the Rename Statement must not be null.")
56+
, Objects.requireNonNull(newName, "The NEW NAME of the Rename Statement must not be null.")
57+
);
58+
}
59+
60+
61+
public boolean isUsingTableKeyword() {
62+
return usingTableKeyword;
63+
}
64+
65+
public void setUsingTableKeyword(boolean usingTableKeyword) {
66+
this.usingTableKeyword = usingTableKeyword;
67+
}
68+
69+
public RenameTableStatement withUsingTableKeyword(boolean usingTableKeyword) {
70+
this.usingTableKeyword = usingTableKeyword;
71+
return this;
72+
}
73+
74+
public boolean isUsingIfExistsKeyword() {
75+
return usingIfExistsKeyword;
76+
}
77+
78+
public void setUsingIfExistsKeyword(boolean usingIfExistsKeyword) {
79+
this.usingIfExistsKeyword = usingIfExistsKeyword;
80+
}
81+
82+
public RenameTableStatement withUsingIfExistsKeyword(boolean usingIfExistsKeyword) {
83+
this.usingIfExistsKeyword = usingIfExistsKeyword;
84+
return this;
85+
}
86+
87+
public String getWaitDirective() {
88+
return waitDirective;
89+
}
90+
91+
public void setWaitDirective(String waitDirective) {
92+
this.waitDirective = waitDirective;
93+
}
94+
95+
public RenameTableStatement withWaitDirective(String waitDirective) {
96+
this.waitDirective = waitDirective;
97+
return this;
98+
}
99+
100+
public int getTableNamesSize() {
101+
return tableNames.size();
102+
}
103+
104+
public boolean isTableNamesEmpty() {
105+
return tableNames.isEmpty();
106+
}
107+
108+
public Set<Map.Entry<Table, Table>> getTableNames() {
109+
return tableNames.entrySet();
110+
}
111+
112+
@Override
113+
public void accept(StatementVisitor statementVisitor) {
114+
statementVisitor.visit(this);
115+
}
116+
117+
public StringBuilder appendTo(StringBuilder builder) {
118+
int i=0;
119+
for (Entry<Table, Table> e : tableNames.entrySet()) {
120+
if (i==0) {
121+
builder
122+
.append("RENAME")
123+
.append(usingTableKeyword ? " TABLE " : " ")
124+
.append(usingIfExistsKeyword ? " IF EXISTS " : " ")
125+
.append(e.getKey())
126+
.append(waitDirective!=null && waitDirective.length()>0 ? " " + waitDirective : "")
127+
.append(" TO ")
128+
.append(e.getValue());
129+
} else {
130+
builder
131+
.append(", ")
132+
.append(e.getKey())
133+
.append(" TO ")
134+
.append(e.getValue());
135+
}
136+
137+
i++;
138+
}
139+
return builder;
140+
}
141+
142+
@Override
143+
public String toString() {
144+
return appendTo(new StringBuilder()).toString();
145+
}
146+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.util.ArrayList;
1313
import java.util.List;
14+
import java.util.Map;
1415

1516
import net.sf.jsqlparser.expression.AnalyticExpression;
1617
import net.sf.jsqlparser.expression.AnyComparisonExpression;
@@ -68,6 +69,7 @@
6869
import net.sf.jsqlparser.statement.*;
6970
import net.sf.jsqlparser.statement.alter.Alter;
7071
import net.sf.jsqlparser.statement.alter.AlterSession;
72+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
7173
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
7274
import net.sf.jsqlparser.statement.comment.Comment;
7375
import net.sf.jsqlparser.statement.create.index.CreateIndex;
@@ -1025,6 +1027,14 @@ public void visit(JsonFunction expression) {
10251027
}
10261028
}
10271029

1030+
@Override
1031+
public void visit(RenameTableStatement renameTableStatement) {
1032+
for (Map.Entry<Table, Table> e : renameTableStatement.getTableNames()) {
1033+
e.getKey().accept(this);
1034+
e.getValue().accept(this);
1035+
}
1036+
}
1037+
10281038
@Override
10291039
public void visit(PurgeStatement purgeStatement) {
10301040
if (purgeStatement.getPurgeObjectType()== PurgeObjectType.TABLE) {

src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import net.sf.jsqlparser.statement.UseStatement;
3232
import net.sf.jsqlparser.statement.alter.Alter;
3333
import net.sf.jsqlparser.statement.alter.AlterSession;
34+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
3435
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
3536
import net.sf.jsqlparser.statement.comment.Comment;
3637
import net.sf.jsqlparser.statement.create.index.CreateIndex;
@@ -351,6 +352,11 @@ public void visit(AlterSession alterSession) {
351352
new AlterSessionDeParser(buffer).deParse(alterSession);
352353
}
353354

355+
@Override
356+
public void visit(RenameTableStatement renameTableStatement) {
357+
renameTableStatement.appendTo(buffer);
358+
}
359+
354360
@Override
355361
public void visit(PurgeStatement purgeStatement) {
356362
purgeStatement.appendTo(buffer);

src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import net.sf.jsqlparser.statement.UseStatement;
3030
import net.sf.jsqlparser.statement.alter.Alter;
3131
import net.sf.jsqlparser.statement.alter.AlterSession;
32+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
3233
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
3334
import net.sf.jsqlparser.statement.comment.Comment;
3435
import net.sf.jsqlparser.statement.create.function.CreateFunction;
@@ -266,21 +267,21 @@ public void visit(CreateSynonym createSynonym) {
266267

267268
@Override
268269
public void visit(SavepointStatement savepointStatement) {
269-
//@todo: write something usefull here
270270
}
271271

272272
@Override
273273
public void visit(RollbackStatement rollbackStatement) {
274-
//@todo: write something usefull here
275274
}
276275

276+
@Override
277277
public void visit(AlterSession alterSession) {
278-
//@todo: write something usefull here
279278
}
280279

281280
@Override
282-
public void visit(PurgeStatement purgeStatement) {
283-
//@todo: write something usefull here
281+
public void visit(RenameTableStatement renameTableStatement) {
284282
}
285283

284+
@Override
285+
public void visit(PurgeStatement purgeStatement) {
286+
}
286287
}

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,8 @@ Statement SingleStatement() :
555555
|
556556
stm = Set()
557557
|
558+
stm = RenameTableStatement()
559+
|
558560
stm = Reset()
559561
|
560562
LOOKAHEAD(ShowColumns())
@@ -755,6 +757,47 @@ ResetStatement Reset(): {
755757
{ return reset; }
756758
}
757759

760+
RenameTableStatement RenameTableStatement(): {
761+
RenameTableStatement renameTableStatement;
762+
Table oldName;
763+
Table newName;
764+
boolean usingTableKeyword=false;
765+
boolean usesIfExistsKeyword=false;
766+
String waitDirective = "";
767+
Token token;
768+
}
769+
{
770+
<K_RENAME>
771+
[ LOOKAHEAD(2) <K_TABLE> { usingTableKeyword = true; } ]
772+
[ LOOKAHEAD(2) <K_IF> <K_EXISTS> { usesIfExistsKeyword = true; } ]
773+
oldName = Table()
774+
[ (
775+
<K_WAIT> token=<S_LONG> { waitDirective = "WAIT " + token.image; }
776+
|
777+
<K_NOWAIT> { waitDirective = "NOWAIT"; }
778+
) ]
779+
<K_TO>
780+
newName = Table()
781+
782+
{
783+
renameTableStatement = new RenameTableStatement(oldName, newName, usingTableKeyword, usesIfExistsKeyword, waitDirective);
784+
}
785+
786+
(
787+
","
788+
oldName = Table()
789+
<K_TO>
790+
newName = Table()
791+
{
792+
renameTableStatement.addTableNames(oldName, newName);
793+
}
794+
)*
795+
796+
{
797+
return renameTableStatement;
798+
}
799+
}
800+
758801
PurgeStatement PurgeStatement(): {
759802
PurgeStatement purgeStatement = null;
760803
Table table;

0 commit comments

Comments
 (0)