Skip to content

Commit 10cb171

Browse files
committed
fix(parser): support MySQL table rename variants
1 parent 4b89a35 commit 10cb171

4 files changed

Lines changed: 62 additions & 4 deletions

File tree

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,15 @@
3232
@SuppressWarnings({"PMD.CyclomaticComplexity"})
3333
public class AlterExpression implements Serializable {
3434

35+
public enum TableRenameKeyword {
36+
NONE, TO, AS
37+
}
38+
3539
private final Set<ReferentialAction> referentialActions = new LinkedHashSet<>(2);
3640
private AlterOperation operation;
3741
private String optionalSpecifier;
3842
private String newTableName;
43+
private TableRenameKeyword tableRenameKeyword = TableRenameKeyword.TO;
3944
private String columnName;
4045
// private ColDataType dataType;
4146
private String columnOldName;
@@ -449,6 +454,14 @@ public void setNewTableName(String newTableName) {
449454
this.newTableName = newTableName;
450455
}
451456

457+
public TableRenameKeyword getTableRenameKeyword() {
458+
return tableRenameKeyword;
459+
}
460+
461+
public void setTableRenameKeyword(TableRenameKeyword tableRenameKeyword) {
462+
this.tableRenameKeyword = tableRenameKeyword;
463+
}
464+
452465
public String getColumnName() {
453466
return columnName;
454467
}
@@ -1217,6 +1230,16 @@ public AlterExpression withOptionalSpecifier(String optionalSpecifier) {
12171230
return this;
12181231
}
12191232

1233+
public AlterExpression withNewTableName(String newTableName) {
1234+
setNewTableName(newTableName);
1235+
return this;
1236+
}
1237+
1238+
public AlterExpression withTableRenameKeyword(TableRenameKeyword tableRenameKeyword) {
1239+
setTableRenameKeyword(tableRenameKeyword);
1240+
return this;
1241+
}
1242+
12201243
public AlterExpression withColumnName(String columnName) {
12211244
this.setColumnName(columnName);
12221245
return this;

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ protected void appendBody(StringBuilder b) {
2626
b.append(getColumnOldName()).append(" TO ").append(getColumnName());
2727
break;
2828
case RENAME_TABLE:
29-
b.append("RENAME TO ").append(getNewTableName());
29+
b.append("RENAME");
30+
if (getTableRenameKeyword() != TableRenameKeyword.NONE) {
31+
b.append(" ").append(getTableRenameKeyword());
32+
}
33+
b.append(" ").append(getNewTableName());
3034
break;
3135
case RENAME_INDEX:
3236
case RENAME_KEY:

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13571,7 +13571,7 @@ AlterExpression AlterExpressionAddAlterModify():
1357113571

1357213572
/**
1357313573
* Parses all RENAME variants within ALTER TABLE.
13574-
* Handles: RENAME [COLUMN] old TO new, RENAME TO tablename,
13574+
* Handles: RENAME [COLUMN] old TO new, RENAME [TO|AS] tablename, RENAME tablename,
1357513575
* RENAME INDEX/KEY/CONSTRAINT old TO new.
1357613576
*/
1357713577
AlterExpression AlterExpressionRenameOp():
@@ -13602,17 +13602,30 @@ AlterExpression AlterExpressionRenameOp():
1360213602
}
1360313603
|
1360413604
LOOKAHEAD(2) (
13605-
<K_TO> { alterExp.setOperation(AlterOperation.RENAME_TABLE); }
13606-
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setNewTableName(tk2.image); }
13605+
(tk=<K_TO> | tk=<K_AS>) {
13606+
alterExp.setOperation(AlterOperation.RENAME_TABLE);
13607+
alterExp.setTableRenameKeyword(AlterExpression.TableRenameKeyword.valueOf(
13608+
tk.image.toUpperCase(Locale.ROOT)));
13609+
}
13610+
tk2=KeywordOrIdentifier() { alterExp.setNewTableName(tk2.image); }
1360713611
)
1360813612
|
13613+
LOOKAHEAD(3)
1360913614
(
1361013615
{ alterExp.setOperation(AlterOperation.RENAME); }
1361113616
[ <K_COLUMN> { alterExp.hasColumn(true); } ]
1361213617
(tk=KeywordOrIdentifier()) { alterExp.setColOldName(tk.image); }
1361313618
<K_TO>
1361413619
(tk2=KeywordOrIdentifier()) { alterExp.setColumnName(tk2.image); }
1361513620
)
13621+
|
13622+
(
13623+
{
13624+
alterExp.setOperation(AlterOperation.RENAME_TABLE);
13625+
alterExp.setTableRenameKeyword(AlterExpression.TableRenameKeyword.NONE);
13626+
}
13627+
tk2=KeywordOrIdentifier() { alterExp.setNewTableName(tk2.image); }
13628+
)
1361613629
)
1361713630
{ return alterExp; }
1361813631
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,24 @@ public void testAlterTableRenameColumnIssue2447() throws JSQLParserException {
738738
assertEquals(expression.getColumnName(), "type2");
739739
}
740740

741+
@Test
742+
public void testMySqlAlterTableRenameVariants() throws JSQLParserException {
743+
Alter withoutKeyword = (Alter) assertSqlCanBeParsedAndDeparsed(
744+
"ALTER TABLE t1 RENAME t2");
745+
AlterExpression rename = withoutKeyword.getAlterExpressions().get(0);
746+
assertEquals(AlterOperation.RENAME_TABLE, rename.getOperation());
747+
assertEquals("t2", rename.getNewTableName());
748+
assertEquals(AlterExpression.TableRenameKeyword.NONE, rename.getTableRenameKeyword());
749+
750+
Alter withAs = (Alter) assertSqlCanBeParsedAndDeparsed("ALTER TABLE t1 RENAME AS t2");
751+
assertEquals(AlterExpression.TableRenameKeyword.AS,
752+
withAs.getAlterExpressions().get(0).getTableRenameKeyword());
753+
754+
Alter withTo = (Alter) assertSqlCanBeParsedAndDeparsed("ALTER TABLE t1 RENAME TO t2");
755+
assertEquals(AlterExpression.TableRenameKeyword.TO,
756+
withTo.getAlterExpressions().get(0).getTableRenameKeyword());
757+
}
758+
741759
@Test
742760
public void testAlterTableForeignKeyIssue981() throws JSQLParserException {
743761
assertSqlCanBeParsedAndDeparsed(

0 commit comments

Comments
 (0)