Skip to content

Commit 910e5b1

Browse files
committed
fix(parser): preserve unique index comments in ALTER TABLE
1 parent 8397d3a commit 910e5b1

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
@@ -13306,20 +13306,30 @@ AlterExpression AlterExpressionAddAlterModify():
1330613306
LOOKAHEAD(3) AlterExpressionColumnChanges(alterExp)
1330713307
|
1330813308
(
13309-
<K_UNIQUE>
13309+
<K_UNIQUE> { index = new Index().withType("UNIQUE"); }
1331013310
(
1331113311
(
13312-
<K_KEY> { alterExp.setUk(true); }
13313-
| <K_INDEX> { alterExp.setUk(false); }
13312+
tk2=<K_KEY> { alterExp.setUk(true); }
13313+
| tk2=<K_INDEX> { alterExp.setUk(false); }
1331413314
)
13315-
[ (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setUkName(tk.image); } ]
13315+
[ (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) {
13316+
sk3 = tk.image;
13317+
alterExp.setUkName(sk3);
13318+
} ]
1331613319
|
1331713320
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) {
13321+
sk3 = tk.image;
1331813322
alterExp.setUkTypeSpecified(false);
13319-
alterExp.setUkName(tk.image);
13323+
alterExp.setUkName(sk3);
1332013324
}
1332113325
)?
13322-
columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); }
13326+
columnNames=ColumnsNamesList() {
13327+
alterExp.setUkColumns(columnNames);
13328+
index.withIndexKeyword(tk2 != null ? tk2.image : null)
13329+
.withName(sk3)
13330+
.withColumnsNames(columnNames);
13331+
alterExp.setIndex(index);
13332+
}
1332313333
[
1332413334
AlterExpressionUsingIndex(alterExp)
1332513335
]

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

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

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

0 commit comments

Comments
 (0)