From 910e5b1ebffdd41cd418543a8b4eb369eca64b50 Mon Sep 17 00:00:00 2001 From: Minjae Lee Date: Thu, 3 Sep 2026 16:20:17 +0900 Subject: [PATCH] fix(parser): preserve unique index comments in ALTER TABLE --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 22 ++++++++++++++----- .../jsqlparser/statement/alter/AlterTest.java | 22 +++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 8ed4a18d5..867f07fcc 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -13306,20 +13306,30 @@ AlterExpression AlterExpressionAddAlterModify(): LOOKAHEAD(3) AlterExpressionColumnChanges(alterExp) | ( - + { index = new Index().withType("UNIQUE"); } ( ( - { alterExp.setUk(true); } - | { alterExp.setUk(false); } + tk2= { alterExp.setUk(true); } + | tk2= { alterExp.setUk(false); } ) - [ (tk= | tk=) { alterExp.setUkName(tk.image); } ] + [ (tk= | tk=) { + sk3 = tk.image; + alterExp.setUkName(sk3); + } ] | (tk= | tk=) { + sk3 = tk.image; alterExp.setUkTypeSpecified(false); - alterExp.setUkName(tk.image); + alterExp.setUkName(sk3); } )? - columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); } + columnNames=ColumnsNamesList() { + alterExp.setUkColumns(columnNames); + index.withIndexKeyword(tk2 != null ? tk2.image : null) + .withName(sk3) + .withColumnsNames(columnNames); + alterExp.setIndex(index); + } [ AlterExpressionUsingIndex(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 66e947ac0..0f801a710 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -598,6 +598,28 @@ public void testAlterTableDropAndAddUniqueIndexWithAscendingColumns() throws Exc result.toString()); } + @Test + public void testAlterTableAddUniqueIndexWithCommentIssue2503() throws Exception { + String sql = "ALTER TABLE `wxp_dm`.`xqgl_req_report` " + + "ADD UNIQUE INDEX `index2` (`report_name` ASC) USING BTREE COMMENT '唯一索引'"; + + Alter alter = (Alter) assertSqlCanBeParsedAndDeparsed(sql); + AlterExpression alterExpression = alter.getAlterExpressions().get(0); + Index index = alterExpression.getIndex(); + + assertNotNull(index); + assertEquals("UNIQUE", index.getType()); + assertEquals("INDEX", index.getIndexKeyword()); + assertEquals("`index2`", index.getName()); + assertEquals(List.of("`report_name` ASC"), index.getColumnsNames()); + assertEquals("'唯一索引'", index.getCommentText()); + + // Keep the legacy fields populated for existing consumers. + assertEquals("`index2`", alterExpression.getUkName()); + assertEquals(List.of("`report_name` ASC"), alterExpression.getUkColumns()); + assertEquals(List.of("USING", "BTREE"), alterExpression.getParameters()); + } + @Test public void testIssue259() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(