Skip to content

Commit a068dd4

Browse files
authored
Add KeywordOrIdentifier rule to support keywords as identifiers (#2203)
1 parent b73cee6 commit a068dd4

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,35 @@ TOKEN:
719719
}
720720
}
721721

722+
/**
723+
* Parses identifiers including standard SQL identifiers, quoted identifiers, and specific keywords.
724+
*
725+
* This is used in cases where certain SQL keywords (like NAME, NEXT, VALUE, etc.) can appear
726+
* as identifiers (e.g., table names, column names) depending on the SQL dialect or context.
727+
*
728+
* Supported tokens:
729+
* - <S_IDENTIFIER>: Standard unquoted SQL identifier
730+
* - <S_QUOTED_IDENTIFIER>: Quoted identifier (e.g., `identifier` or "identifier")
731+
* - <K_NAME>, <K_NEXT>, <K_VALUE>, <K_PUBLIC>, <K_STRING>: Specific keywords treated as identifiers
732+
*
733+
* @return Token representing the identifier or keyword used as identifier
734+
*/
735+
Token KeywordOrIdentifier():
736+
{
737+
Token tk;
738+
}
739+
{
740+
(
741+
tk = <S_IDENTIFIER>
742+
| tk = <S_QUOTED_IDENTIFIER>
743+
| tk = <K_NAME>
744+
| tk = <K_NEXT>
745+
| tk = <K_VALUE>
746+
| tk = <K_PUBLIC>
747+
| tk = <K_STRING>
748+
)
749+
{ return tk; }
750+
}
722751

723752
Statement Statement() #Statement:
724753
{
@@ -7997,9 +8026,9 @@ AlterExpression AlterExpression():
79978026
)
79988027
|
79998028
LOOKAHEAD(2) <K_RENAME> { alterExp.setOperation(AlterOperation.RENAME); } [ <K_COLUMN> { alterExp.hasColumn(true);} ]
8000-
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> ) { alterExp.setColOldName(tk.image); }
8029+
( tk=KeywordOrIdentifier() ) { alterExp.setColOldName(tk.image); }
80018030
<K_TO>
8002-
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk2.image); }
8031+
( tk2=KeywordOrIdentifier() ) { alterExp.setColumnName(tk2.image); }
80038032
|
80048033
LOOKAHEAD(2)(
80058034
<K_RENAME> <K_TO> {alterExp.setOperation(AlterOperation.RENAME_TABLE);}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,19 @@ public void testAlterTableRenameColumn() throws JSQLParserException {
621621
assertSqlCanBeParsedAndDeparsed(sql);
622622
}
623623

624+
@Test
625+
public void testAlterTableRenameColumn2() throws JSQLParserException {
626+
// Additional test case: Renaming column from 'name' to 'full_name'
627+
String sql = "ALTER TABLE test_table RENAME COLUMN name TO full_name";
628+
assertSqlCanBeParsedAndDeparsed(sql);
629+
630+
Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
631+
AlterExpression expression = alter.getAlterExpressions().get(0);
632+
assertEquals(expression.getOperation(), AlterOperation.RENAME);
633+
assertEquals(expression.getColOldName(), "name");
634+
assertEquals(expression.getColumnName(), "full_name");
635+
}
636+
624637
@Test
625638
public void testAlterTableForeignKeyIssue981() throws JSQLParserException {
626639
assertSqlCanBeParsedAndDeparsed(

0 commit comments

Comments
 (0)