From f9b5537d7072553d234d3a3c6324f74436729629 Mon Sep 17 00:00:00 2001 From: Minjae Lee Date: Wed, 5 Aug 2026 18:06:14 +0900 Subject: [PATCH] fix: add 'K_TYPE' to KeywordOrIdentifier to allow 'type' as a column name TYPE is a non-reserved keyword in MySQL, so statements like 'ALTER TABLE tbl DROP COLUMN type' are valid without quoting. Follows the same approach as #2340 (K_DATA). Fixes #2447 --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 ++- .../jsqlparser/statement/alter/AlterTest.java | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 5883319e7..2a28d21ba 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1756,7 +1756,7 @@ TOKEN: * Supported tokens: * - : Standard unquoted SQL identifier * - : Quoted identifier (e.g., `identifier` or "identifier") - * - , , , , , : Specific keywords treated as identifiers + * - , , , , , , : Specific keywords treated as identifiers * * @return Token representing the identifier or keyword used as identifier */ @@ -1774,6 +1774,7 @@ Token KeywordOrIdentifier(): | tk = | tk = | tk = + | tk = ) { return tk; } } 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 ab135ebb2..5ba1a8762 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -259,6 +259,11 @@ public void testAlterTableDropColumnIssue2339() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("ALTER TABLE test DROP COLUMN Data"); } + @Test + public void testAlterTableDropColumnIssue2447() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("ALTER TABLE test DROP COLUMN type"); + } + @Test public void testAlterTableDropConstraint() throws JSQLParserException { final String sql = "ALTER TABLE test DROP CONSTRAINT YYY"; @@ -469,6 +474,11 @@ public void testAlterTableChangeColumnIssue2339() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("ALTER TABLE tb_test CHANGE data INT (10)"); } + @Test + public void testAlterTableChangeColumnIssue2447() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("ALTER TABLE tb_test CHANGE type INT (10)"); + } + @Test public void testAlterTableAddColumnWithZone() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( @@ -668,6 +678,18 @@ public void testAlterTableRenameColumn2() throws JSQLParserException { assertEquals(expression.getColumnName(), "full_name"); } + @Test + public void testAlterTableRenameColumnIssue2447() throws JSQLParserException { + String sql = "ALTER TABLE test_table RENAME COLUMN type TO type2"; + assertSqlCanBeParsedAndDeparsed(sql); + + Alter alter = (Alter) CCJSqlParserUtil.parse(sql); + AlterExpression expression = alter.getAlterExpressions().get(0); + assertEquals(expression.getOperation(), AlterOperation.RENAME); + assertEquals(expression.getColOldName(), "type"); + assertEquals(expression.getColumnName(), "type2"); + } + @Test public void testAlterTableForeignKeyIssue981() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(