Skip to content

Commit 5e9045f

Browse files
Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)
* Fix a trivial MERGE error from Commit 4797a8d * Fixes #1333 Postgres compliant ALTER TABLE ... RENAME TO ... * Postgres compliant ALTER TABLE IF EXISTS ... RENAME TO ... * Postgres compliant ALTER TABLE IF EXISTS ... RENAME TO ...
1 parent b8867d7 commit 5e9045f

File tree

6 files changed

+76
-26
lines changed

6 files changed

+76
-26
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ plugins {
1212
}
1313

1414
group = 'com.github.jsqlparser'
15-
version = '4.2-SNAPSHOT'
15+
version = '4.3-SNAPSHOT'
1616
description = 'JSQLParser library'
1717
java.sourceCompatibility = JavaVersion.VERSION_1_8
1818

src/main/java/net/sf/jsqlparser/statement/alter/Alter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public String toString() {
7070
if (useOnly) {
7171
b.append("ONLY ");
7272
}
73+
74+
if (alterExpressions.size()>0 && alterExpressions.get(0).getOperation()==AlterOperation.RENAME_TABLE && alterExpressions.get(0).isUsingIfExists()) {
75+
b.append("IF EXISTS ");
76+
}
77+
7378
b.append(table.getFullyQualifiedName()).append(" ");
7479

7580
Iterator<AlterExpression> altIter = alterExpressions.iterator();

src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class AlterExpression {
3232

3333
private AlterOperation operation;
3434
private String optionalSpecifier;
35+
private String newTableName;
3536
private String columnName;
3637
private String columnOldName;
3738
// private ColDataType dataType;
@@ -44,7 +45,7 @@ public class AlterExpression {
4445
private String ukName;
4546
private Index index = null;
4647
private String constraintName;
47-
private boolean constraintIfExists;
48+
private boolean usingIfExists;
4849

4950
private Set<ReferentialAction> referentialActions = new LinkedHashSet<>(2);
5051

@@ -246,6 +247,14 @@ public void setFkSourceColumns(List<String> fkSourceColumns) {
246247
this.fkSourceColumns = fkSourceColumns;
247248
}
248249

250+
public String getNewTableName() {
251+
return newTableName;
252+
}
253+
254+
public void setNewTableName(String newTableName) {
255+
this.newTableName = newTableName;
256+
}
257+
249258
public String getColumnName() {
250259
return columnName;
251260
}
@@ -280,12 +289,12 @@ public void setConstraintName(final String constraintName) {
280289
this.constraintName = constraintName;
281290
}
282291

283-
public boolean isConstraintIfExists() {
284-
return constraintIfExists;
292+
public boolean isUsingIfExists() {
293+
return usingIfExists;
285294
}
286295

287-
public void setConstraintIfExists(boolean constraintIfExists) {
288-
this.constraintIfExists = constraintIfExists;
296+
public void setUsingIfExists(boolean usingIfExists) {
297+
this.usingIfExists = usingIfExists;
289298
}
290299

291300
public List<String> getPkColumns() {
@@ -367,6 +376,9 @@ public String toString() {
367376

368377
if (operation== AlterOperation.UNSPECIFIC) {
369378
b.append(optionalSpecifier);
379+
} else if (operation== AlterOperation.RENAME_TABLE) {
380+
381+
b.append("RENAME TO ").append(newTableName);
370382
} else {
371383
b.append(operation).append(" ");
372384

@@ -417,7 +429,7 @@ public String toString() {
417429
}
418430
} else if (constraintName != null) {
419431
b.append("CONSTRAINT ");
420-
if (constraintIfExists) {
432+
if (usingIfExists) {
421433
b.append("IF EXISTS ");
422434
}
423435
b.append(constraintName);
@@ -504,8 +516,8 @@ public AlterExpression withConstraintName(String constraintName) {
504516
return this;
505517
}
506518

507-
public AlterExpression constraintIfExists(boolean constraintIfExists) {
508-
this.setConstraintIfExists(constraintIfExists);
519+
public AlterExpression withUsingIfExists(boolean usingIfExists) {
520+
this.setUsingIfExists(usingIfExists);
509521
return this;
510522
}
511523

src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
package net.sf.jsqlparser.statement.alter;
1111

1212
public enum AlterOperation {
13-
ADD, ALTER, DROP, MODIFY, CHANGE, ALGORITHM, RENAME, COMMENT, UNSPECIFIC;
13+
ADD, ALTER, DROP, MODIFY, CHANGE, ALGORITHM, RENAME, RENAME_TABLE, COMMENT, UNSPECIFIC;
1414
}

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

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4973,7 +4973,7 @@ CreateTable CreateTable():
49734973
// see https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm#i2126725
49744974
// table properties , all these are optional
49754975
[ rowMovement = RowMovement() { createTable.setRowMovement(rowMovement); }]
4976-
[ <K_AS> select = SelectWithWithItems() { createTable.setSelect(select, false); } ]
4976+
[ <K_AS> select = SelectWithWithItems( ) { createTable.setSelect(select, false); }]
49774977
[
49784978
<K_LIKE> ( LOOKAHEAD("(" Table() ")") "(" likeTable=Table() { createTable.setLikeTable(likeTable, true); } ")"
49794979
| likeTable=Table() { createTable.setLikeTable(likeTable, false); } )
@@ -5596,7 +5596,7 @@ AlterExpression AlterExpression():
55965596
}
55975597
)
55985598
|
5599-
( <K_CONSTRAINT> [<K_IF> <K_EXISTS> { alterExp.setConstraintIfExists(true); } ]
5599+
( <K_CONSTRAINT> [<K_IF> <K_EXISTS> { alterExp.setUsingIfExists(true); } ]
56005600
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
56015601
{
56025602
alterExp.setConstraintName(tk.image);
@@ -5613,13 +5613,14 @@ AlterExpression AlterExpression():
56135613
sk3 = RelObjectName() {alterExp.addParameters(sk3); }
56145614
)
56155615
|
5616-
(<K_RENAME> {alterExp.setOperation(AlterOperation.RENAME);}
5617-
(
5618-
<K_COLUMN> {alterExp.hasColumn(true);}
5619-
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setColOldName(tk.image);}
5620-
(<K_TO>)
5621-
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk2.image);}
5622-
)
5616+
LOOKAHEAD(2) <K_RENAME> <K_COLUMN> { alterExp.setOperation(AlterOperation.RENAME); alterExp.hasColumn(true);}
5617+
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> ) { alterExp.setColOldName(tk.image); }
5618+
<K_TO>
5619+
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk2.image); }
5620+
|
5621+
(
5622+
<K_RENAME> <K_TO> {alterExp.setOperation(AlterOperation.RENAME_TABLE);}
5623+
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setNewTableName(tk2.image);}
56235624
)
56245625
|
56255626
(<K_COMMENT> {alterExp.setOperation(AlterOperation.COMMENT);}
@@ -5654,13 +5655,21 @@ Alter AlterTable():
56545655
Alter alter = new Alter();
56555656
Table table;
56565657
AlterExpression alterExp;
5657-
5658+
boolean usingIfExists = false;
56585659
}
56595660
{
5660-
<K_ALTER> <K_TABLE> [ <K_ONLY> { alter.setUseOnly(true); } ] table=Table() { alter.setTable(table); }
5661-
( alterExp=AlterExpression() { alter.addAlterExpression(alterExp); }
5662-
("," alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } )*
5663-
)
5661+
<K_ALTER> <K_TABLE>
5662+
[ <K_ONLY> { alter.setUseOnly(true); } ]
5663+
[ LOOKAHEAD(2) <K_IF> <K_EXISTS> { usingIfExists = true; } ]
5664+
5665+
table=Table() { alter.setTable(table); }
5666+
5667+
alterExp=AlterExpression() { if (usingIfExists)
5668+
alter.addAlterExpression( alterExp.withUsingIfExists(true) );
5669+
else
5670+
alter.addAlterExpression(alterExp); }
5671+
5672+
("," alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } )*
56645673

56655674
{
56665675
return alter;

src/test/java/net/sf/jsqlparser/statement/alter/RenameTableStatementTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
package net.sf.jsqlparser.statement.alter;
1212

13-
import java.util.List;
1413
import net.sf.jsqlparser.JSQLParserException;
1514
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
1615
import net.sf.jsqlparser.schema.Table;
@@ -23,6 +22,8 @@
2322
import org.junit.Assert;
2423
import org.junit.Test;
2524

25+
import java.util.List;
26+
2627
/**
2728
*
2829
* @author <a href="mailto:[email protected]">Andreas Reichel</a>
@@ -88,10 +89,33 @@ public void testTableNamesFinder() throws JSQLParserException {
8889
@Test
8990
public void testValidator() throws JSQLParserException {
9091
String sqlStr = "RENAME oldTableName TO newTableName";
92+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
93+
94+
// this needs to succeed
95+
ValidationTestAsserts.validateNoErrors(sqlStr, 1, DatabaseType.ORACLE);
96+
97+
// this should fail when not supported in Postgres
98+
ValidationTestAsserts.validateNoErrors(sqlStr, 1, DatabaseType.POSTGRESQL);
99+
100+
sqlStr = "ALTER TABLE public.oldTableName RENAME TO newTableName";
101+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
102+
103+
// this needs to succeed according to: https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_3001.htm
104+
ValidationTestAsserts.validateNoErrors(sqlStr, 1, DatabaseType.ORACLE);
105+
106+
// this needs to succeed
107+
ValidationTestAsserts.validateNoErrors(sqlStr, 1, DatabaseType.POSTGRESQL);
91108

109+
sqlStr = "ALTER TABLE IF EXISTS public.oldTableName RENAME TO newTableName";
110+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
111+
112+
// should fail when IF EXISTS is not supported in Oracle 11
113+
ValidationTestAsserts.validateNoErrors(sqlStr, 1, DatabaseType.ORACLE);
114+
115+
// this needs to succeed
92116
ValidationTestAsserts.validateNoErrors(sqlStr, 1, DatabaseType.POSTGRESQL);
93117
}
94-
118+
95119
@Test
96120
public void testObjectAccess() {
97121
Table oldTable = new Table("oldTableName");

0 commit comments

Comments
 (0)