Skip to content

Commit 2243e2b

Browse files
authored
fix(parser): preserve unique index comments in ALTER TABLE (#2533)
1 parent bc9ca85 commit 2243e2b

2 files changed

Lines changed: 38 additions & 6 deletions

File tree

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13495,20 +13495,30 @@ AlterExpression AlterExpressionAddAlterModify():
1349513495
LOOKAHEAD(3) AlterExpressionColumnChanges(alterExp)
1349613496
|
1349713497
(
13498-
<K_UNIQUE>
13498+
<K_UNIQUE> { index = new Index().withType("UNIQUE"); }
1349913499
(
1350013500
(
13501-
<K_KEY> { alterExp.setUk(true); }
13502-
| <K_INDEX> { alterExp.setUk(false); }
13501+
tk2=<K_KEY> { alterExp.setUk(true); }
13502+
| tk2=<K_INDEX> { alterExp.setUk(false); }
1350313503
)
13504-
[ (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setUkName(tk.image); } ]
13504+
[ (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) {
13505+
sk3 = tk.image;
13506+
alterExp.setUkName(sk3);
13507+
} ]
1350513508
|
1350613509
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) {
13510+
sk3 = tk.image;
1350713511
alterExp.setUkTypeSpecified(false);
13508-
alterExp.setUkName(tk.image);
13512+
alterExp.setUkName(sk3);
1350913513
}
1351013514
)?
13511-
columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); }
13515+
columnNames=ColumnsNamesList() {
13516+
alterExp.setUkColumns(columnNames);
13517+
index.withIndexKeyword(tk2 != null ? tk2.image : null)
13518+
.withName(sk3)
13519+
.withColumnsNames(columnNames);
13520+
alterExp.setIndex(index);
13521+
}
1351213522
[
1351313523
AlterExpressionUsingIndex(alterExp)
1351413524
]

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,28 @@ public void testAlterTableDropAndAddUniqueIndexWithAscendingColumns() throws Exc
600600
result.toString());
601601
}
602602

603+
@Test
604+
public void testAlterTableAddUniqueIndexWithCommentIssue2503() throws Exception {
605+
String sql = "ALTER TABLE `wxp_dm`.`xqgl_req_report` "
606+
+ "ADD UNIQUE INDEX `index2` (`report_name` ASC) USING BTREE COMMENT '唯一索引'";
607+
608+
Alter alter = (Alter) assertSqlCanBeParsedAndDeparsed(sql);
609+
AlterExpression alterExpression = alter.getAlterExpressions().get(0);
610+
Index index = alterExpression.getIndex();
611+
612+
assertNotNull(index);
613+
assertEquals("UNIQUE", index.getType());
614+
assertEquals("INDEX", index.getIndexKeyword());
615+
assertEquals("`index2`", index.getName());
616+
assertEquals(List.of("`report_name` ASC"), index.getColumnsNames());
617+
assertEquals("'唯一索引'", index.getCommentText());
618+
619+
// Keep the legacy fields populated for existing consumers.
620+
assertEquals("`index2`", alterExpression.getUkName());
621+
assertEquals(List.of("`report_name` ASC"), alterExpression.getUkColumns());
622+
assertEquals(List.of("USING", "BTREE"), alterExpression.getParameters());
623+
}
624+
603625
@Test
604626
public void testIssue259() throws JSQLParserException {
605627
assertSqlCanBeParsedAndDeparsed(

0 commit comments

Comments
 (0)