diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index c42b16882..0f1fb080a 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -719,6 +719,35 @@ TOKEN: } } +/** + * Parses identifiers including standard SQL identifiers, quoted identifiers, and specific keywords. + * + * This is used in cases where certain SQL keywords (like NAME, NEXT, VALUE, etc.) can appear + * as identifiers (e.g., table names, column names) depending on the SQL dialect or context. + * + * Supported tokens: + * - : Standard unquoted SQL identifier + * - : Quoted identifier (e.g., `identifier` or "identifier") + * - , , , , : Specific keywords treated as identifiers + * + * @return Token representing the identifier or keyword used as identifier + */ +Token KeywordOrIdentifier(): +{ + Token tk; +} +{ + ( + tk = + | tk = + | tk = + | tk = + | tk = + | tk = + | tk = + ) + { return tk; } +} Statement Statement() #Statement: { @@ -7997,9 +8026,9 @@ AlterExpression AlterExpression(): ) | LOOKAHEAD(2) { alterExp.setOperation(AlterOperation.RENAME); } [ { alterExp.hasColumn(true);} ] - ( tk= | tk= ) { alterExp.setColOldName(tk.image); } + ( tk=KeywordOrIdentifier() ) { alterExp.setColOldName(tk.image); } - (tk2= | tk2=) { alterExp.setColumnName(tk2.image); } + ( tk2=KeywordOrIdentifier() ) { alterExp.setColumnName(tk2.image); } | LOOKAHEAD(2)( {alterExp.setOperation(AlterOperation.RENAME_TABLE);} 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 0e549f05d..87fcda56f 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -621,6 +621,19 @@ public void testAlterTableRenameColumn() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(sql); } + @Test + public void testAlterTableRenameColumn2() throws JSQLParserException { + // Additional test case: Renaming column from 'name' to 'full_name' + String sql = "ALTER TABLE test_table RENAME COLUMN name TO full_name"; + assertSqlCanBeParsedAndDeparsed(sql); + + Alter alter = (Alter) CCJSqlParserUtil.parse(sql); + AlterExpression expression = alter.getAlterExpressions().get(0); + assertEquals(expression.getOperation(), AlterOperation.RENAME); + assertEquals(expression.getColOldName(), "name"); + assertEquals(expression.getColumnName(), "full_name"); + } + @Test public void testAlterTableForeignKeyIssue981() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(