From 10cb171bada7973b58a6b66bc77434bdb39308de Mon Sep 17 00:00:00 2001 From: Minjae Lee Date: Fri, 4 Sep 2026 18:33:53 +0900 Subject: [PATCH] fix(parser): support MySQL table rename variants --- .../statement/alter/AlterExpression.java | 23 +++++++++++++++++++ .../alter/AlterExpressionRename.java | 6 ++++- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 19 ++++++++++++--- .../jsqlparser/statement/alter/AlterTest.java | 18 +++++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java index 4055eb8b1..4f3fbb5a2 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -32,10 +32,15 @@ @SuppressWarnings({"PMD.CyclomaticComplexity"}) public class AlterExpression implements Serializable { + public enum TableRenameKeyword { + NONE, TO, AS + } + private final Set referentialActions = new LinkedHashSet<>(2); private AlterOperation operation; private String optionalSpecifier; private String newTableName; + private TableRenameKeyword tableRenameKeyword = TableRenameKeyword.TO; private String columnName; // private ColDataType dataType; private String columnOldName; @@ -449,6 +454,14 @@ public void setNewTableName(String newTableName) { this.newTableName = newTableName; } + public TableRenameKeyword getTableRenameKeyword() { + return tableRenameKeyword; + } + + public void setTableRenameKeyword(TableRenameKeyword tableRenameKeyword) { + this.tableRenameKeyword = tableRenameKeyword; + } + public String getColumnName() { return columnName; } @@ -1217,6 +1230,16 @@ public AlterExpression withOptionalSpecifier(String optionalSpecifier) { return this; } + public AlterExpression withNewTableName(String newTableName) { + setNewTableName(newTableName); + return this; + } + + public AlterExpression withTableRenameKeyword(TableRenameKeyword tableRenameKeyword) { + setTableRenameKeyword(tableRenameKeyword); + return this; + } + public AlterExpression withColumnName(String columnName) { this.setColumnName(columnName); return this; diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpressionRename.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpressionRename.java index 703e20047..3fa50fe73 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpressionRename.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpressionRename.java @@ -26,7 +26,11 @@ protected void appendBody(StringBuilder b) { b.append(getColumnOldName()).append(" TO ").append(getColumnName()); break; case RENAME_TABLE: - b.append("RENAME TO ").append(getNewTableName()); + b.append("RENAME"); + if (getTableRenameKeyword() != TableRenameKeyword.NONE) { + b.append(" ").append(getTableRenameKeyword()); + } + b.append(" ").append(getNewTableName()); break; case RENAME_INDEX: case RENAME_KEY: diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 52994191b..53b04273b 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -13571,7 +13571,7 @@ AlterExpression AlterExpressionAddAlterModify(): /** * Parses all RENAME variants within ALTER TABLE. - * Handles: RENAME [COLUMN] old TO new, RENAME TO tablename, + * Handles: RENAME [COLUMN] old TO new, RENAME [TO|AS] tablename, RENAME tablename, * RENAME INDEX/KEY/CONSTRAINT old TO new. */ AlterExpression AlterExpressionRenameOp(): @@ -13602,10 +13602,15 @@ AlterExpression AlterExpressionRenameOp(): } | LOOKAHEAD(2) ( - { alterExp.setOperation(AlterOperation.RENAME_TABLE); } - (tk2= | tk2=) { alterExp.setNewTableName(tk2.image); } + (tk= | tk=) { + alterExp.setOperation(AlterOperation.RENAME_TABLE); + alterExp.setTableRenameKeyword(AlterExpression.TableRenameKeyword.valueOf( + tk.image.toUpperCase(Locale.ROOT))); + } + tk2=KeywordOrIdentifier() { alterExp.setNewTableName(tk2.image); } ) | + LOOKAHEAD(3) ( { alterExp.setOperation(AlterOperation.RENAME); } [ { alterExp.hasColumn(true); } ] @@ -13613,6 +13618,14 @@ AlterExpression AlterExpressionRenameOp(): (tk2=KeywordOrIdentifier()) { alterExp.setColumnName(tk2.image); } ) + | + ( + { + alterExp.setOperation(AlterOperation.RENAME_TABLE); + alterExp.setTableRenameKeyword(AlterExpression.TableRenameKeyword.NONE); + } + tk2=KeywordOrIdentifier() { alterExp.setNewTableName(tk2.image); } + ) ) { return alterExp; } } diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java index 99c222c78..d26451fdb 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -738,6 +738,24 @@ public void testAlterTableRenameColumnIssue2447() throws JSQLParserException { assertEquals(expression.getColumnName(), "type2"); } + @Test + public void testMySqlAlterTableRenameVariants() throws JSQLParserException { + Alter withoutKeyword = (Alter) assertSqlCanBeParsedAndDeparsed( + "ALTER TABLE t1 RENAME t2"); + AlterExpression rename = withoutKeyword.getAlterExpressions().get(0); + assertEquals(AlterOperation.RENAME_TABLE, rename.getOperation()); + assertEquals("t2", rename.getNewTableName()); + assertEquals(AlterExpression.TableRenameKeyword.NONE, rename.getTableRenameKeyword()); + + Alter withAs = (Alter) assertSqlCanBeParsedAndDeparsed("ALTER TABLE t1 RENAME AS t2"); + assertEquals(AlterExpression.TableRenameKeyword.AS, + withAs.getAlterExpressions().get(0).getTableRenameKeyword()); + + Alter withTo = (Alter) assertSqlCanBeParsedAndDeparsed("ALTER TABLE t1 RENAME TO t2"); + assertEquals(AlterExpression.TableRenameKeyword.TO, + withTo.getAlterExpressions().get(0).getTableRenameKeyword()); + } + @Test public void testAlterTableForeignKeyIssue981() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(