Skip to content

Commit bb37719

Browse files
authored
fix(parser): support MySQL table rename variants (#2543)
1 parent 5320066 commit bb37719

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
}
@@ -1219,6 +1232,16 @@ public AlterExpression withOptionalSpecifier(String optionalSpecifier) {
12191232
return this;
12201233
}
12211234

1235+
public AlterExpression withNewTableName(String newTableName) {
1236+
setNewTableName(newTableName);
1237+
return this;
1238+
}
1239+
1240+
public AlterExpression withTableRenameKeyword(TableRenameKeyword tableRenameKeyword) {
1241+
setTableRenameKeyword(tableRenameKeyword);
1242+
return this;
1243+
}
1244+
12221245
public AlterExpression withColumnName(String columnName) {
12231246
this.setColumnName(columnName);
12241247
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
@@ -13816,7 +13816,7 @@ AlterExpression AlterExpressionAddAlterModify():
1381613816

1381713817
/**
1381813818
* Parses all RENAME variants within ALTER TABLE.
13819-
* Handles: RENAME [COLUMN] old TO new, RENAME TO tablename,
13819+
* Handles: RENAME [COLUMN] old TO new, RENAME [TO|AS] tablename, RENAME tablename,
1382013820
* RENAME INDEX/KEY/CONSTRAINT old TO new.
1382113821
*/
1382213822
AlterExpression AlterExpressionRenameOp():
@@ -13847,17 +13847,30 @@ AlterExpression AlterExpressionRenameOp():
1384713847
}
1384813848
|
1384913849
LOOKAHEAD(2) (
13850-
<K_TO> { alterExp.setOperation(AlterOperation.RENAME_TABLE); }
13851-
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setNewTableName(tk2.image); }
13850+
(tk=<K_TO> | tk=<K_AS>) {
13851+
alterExp.setOperation(AlterOperation.RENAME_TABLE);
13852+
alterExp.setTableRenameKeyword(AlterExpression.TableRenameKeyword.valueOf(
13853+
tk.image.toUpperCase(Locale.ROOT)));
13854+
}
13855+
tk2=KeywordOrIdentifier() { alterExp.setNewTableName(tk2.image); }
1385213856
)
1385313857
|
13858+
LOOKAHEAD(3)
1385413859
(
1385513860
{ alterExp.setOperation(AlterOperation.RENAME); }
1385613861
[ <K_COLUMN> { alterExp.hasColumn(true); } ]
1385713862
(tk=KeywordOrIdentifier()) { alterExp.setColOldName(tk.image); }
1385813863
<K_TO>
1385913864
(tk2=KeywordOrIdentifier()) { alterExp.setColumnName(tk2.image); }
1386013865
)
13866+
|
13867+
(
13868+
{
13869+
alterExp.setOperation(AlterOperation.RENAME_TABLE);
13870+
alterExp.setTableRenameKeyword(AlterExpression.TableRenameKeyword.NONE);
13871+
}
13872+
tk2=KeywordOrIdentifier() { alterExp.setNewTableName(tk2.image); }
13873+
)
1386113874
)
1386213875
{ return alterExp; }
1386313876
}

‎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)