Skip to content

Commit 262ef55

Browse files
Fix: [MySQL] Add COMMENT for ALTER ADD (#1919)
* Closed #1906, Add `COMMENT` for `ALTER ADD` and format jjt file * Closed #1906, Add `COMMENT` for `ALTER ADD` and format jjt file * Fix
1 parent 37b3c0b commit 262ef55

File tree

4 files changed

+116
-66
lines changed

4 files changed

+116
-66
lines changed

src/main/java/net/sf/jsqlparser/statement/create/table/Index.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class Index implements Serializable {
2626
private List<ColumnParams> columns;
2727
private final List<String> name = new ArrayList<>();
2828
private List<String> idxSpec;
29+
private String commentText;
2930

3031
public List<String> getColumnsNames() {
3132
return columns.stream()
@@ -142,6 +143,11 @@ public String toString() {
142143
return head;
143144
}
144145

146+
// MYSQL: ALTER TABLE ADD INDEX COMMENT 'comment'
147+
if (getCommentText() != null) {
148+
return head + " " + tail + " COMMENT " + getCommentText();
149+
}
150+
145151
return head + " " + tail;
146152
}
147153

@@ -192,4 +198,12 @@ public String toString() {
192198
return columnName + (params != null ? " " + String.join(" ", params) : "");
193199
}
194200
}
201+
202+
public String getCommentText() {
203+
return commentText;
204+
}
205+
206+
public void setCommentText(String commentText) {
207+
this.commentText = commentText;
208+
}
195209
}

src/main/java/net/sf/jsqlparser/statement/create/table/NamedConstraint.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,16 @@ public class NamedConstraint extends Index {
1818
@Override
1919
public String toString() {
2020
String idxSpecText = PlainSelect.getStringList(getIndexSpec(), false, false);
21-
return (getName() != null ? "CONSTRAINT " + getName() + " " : "")
22-
+ getType() + " " + PlainSelect.getStringList(getColumnsNames(), true, true) + (!"".
23-
equals(idxSpecText) ? " " + idxSpecText : "");
21+
String head = getName() != null ? "CONSTRAINT " + getName() + " " : "";
22+
String tail = getType() + " " + PlainSelect.getStringList(getColumnsNames(), true, true) +
23+
(!"".equals(idxSpecText) ? " " + idxSpecText : "");
24+
25+
// MYSQL: ALTER TABLE ADD CONSTRAINT COMMENT 'comment'
26+
if (getCommentText() != null) {
27+
return head + tail + " COMMENT " + getCommentText();
28+
}
29+
30+
return head + tail;
2431
}
2532

2633
@Override

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

Lines changed: 75 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6160,6 +6160,18 @@ List<ConstraintState> AlterExpressionConstraintState():
61606160
}
61616161
}
61626162

6163+
Index IndexWithComment(Index index):
6164+
{
6165+
Token tk = null;
6166+
}
6167+
{
6168+
<K_COMMENT> tk=<S_CHAR_LITERAL> {
6169+
index.setCommentText(tk.image);
6170+
}
6171+
{
6172+
return index;
6173+
}
6174+
}
61636175

61646176
/**
61656177
* This production needs refactoring to multiple smaller productions. The target class should
@@ -6191,17 +6203,15 @@ AlterExpression AlterExpression():
61916203
(
61926204
(
61936205
(
6194-
<K_ADD> { alterExp.setOperation(AlterOperation.ADD); }
6206+
<K_ADD> { alterExp.setOperation(AlterOperation.ADD); }
61956207
|
6196-
<K_ALTER> { alterExp.setOperation(AlterOperation.ALTER); }
6208+
<K_ALTER> { alterExp.setOperation(AlterOperation.ALTER); }
61976209
|
61986210
<K_MODIFY> { alterExp.setOperation(AlterOperation.MODIFY); }
61996211
)
62006212

62016213
(
6202-
LOOKAHEAD(2) (
6203-
<K_PRIMARY> <K_KEY> columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); }
6204-
)
6214+
LOOKAHEAD(2) (<K_PRIMARY> <K_KEY> columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); })
62056215

62066216
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
62076217
[<K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
@@ -6214,6 +6224,7 @@ AlterExpression AlterExpression():
62146224
index = new Index().withType(tk.image).withName(sk3).withColumnsNames(columnNames);
62156225
alterExp.setIndex(index);
62166226
}
6227+
[ index = IndexWithComment(index) { alterExp.setIndex(index); } ]
62176228
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
62186229
[<K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
62196230
)
@@ -6223,47 +6234,50 @@ AlterExpression AlterExpression():
62236234

62246235
(
62256236
LOOKAHEAD(4) (
6226-
"(" { alterExp.useBrackets(true);}
6237+
"("
6238+
{ alterExp.useBrackets(true);}
62276239
alterExpressionColumnDataType = AlterExpressionColumnDataType() {
62286240
alterExp.addColDataType(alterExpressionColumnDataType);
62296241
}
62306242
(
62316243
","
62326244
alterExpressionColumnDataType = AlterExpressionColumnDataType() {
6233-
alterExp.addColDataType(alterExpressionColumnDataType);
6234-
}
6245+
alterExp.addColDataType(alterExpressionColumnDataType);
6246+
}
62356247
)*
6236-
")"
6237-
)
6248+
")"
6249+
)
62386250
|
6239-
LOOKAHEAD(2) alterExpressionColumnDataType = AlterExpressionColumnDataType() {
6240-
alterExp.addColDataType(alterExpressionColumnDataType);
6241-
}
6251+
LOOKAHEAD(2) alterExpressionColumnDataType = AlterExpressionColumnDataType()
6252+
{ alterExp.addColDataType(alterExpressionColumnDataType); }
62426253
|
6243-
LOOKAHEAD(3) alterExpressionColumnDropNotNull = AlterExpressionColumnDropNotNull() {
6244-
alterExp.addColDropNotNull( alterExpressionColumnDropNotNull);
6245-
}
6254+
LOOKAHEAD(3) alterExpressionColumnDropNotNull = AlterExpressionColumnDropNotNull()
6255+
{ alterExp.addColDropNotNull( alterExpressionColumnDropNotNull);}
62466256
|
6247-
alterExpressionColumnDropDefault = AlterExpressionColumnDropDefault() {
6248-
alterExp.addColDropDefault( alterExpressionColumnDropDefault);
6249-
}
6257+
alterExpressionColumnDropDefault = AlterExpressionColumnDropDefault()
6258+
{ alterExp.addColDropDefault( alterExpressionColumnDropDefault); }
62506259
)
62516260
)
62526261
|
62536262
(
62546263
"(" alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); }
6255-
("," alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } )* ")"
6264+
(","
6265+
alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); }
6266+
)*
6267+
")"
62566268
)
62576269
|
62586270
( <K_UNIQUE> ((<K_KEY> { alterExp.setUk(true); } | <K_INDEX>) (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setUkName(tk.image); } )?
62596271
columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); }
6260-
[<K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }])
6272+
[<K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
6273+
[ index = IndexWithComment(index) { alterExp.setIndex(index); } ]
6274+
)
62616275
|
62626276
//following two choices regarding foreign keys should be merged
62636277
( <K_FOREIGN> <K_KEY> columnNames=ColumnsNamesList() { alterExp.setFkColumns(columnNames); columnNames = null; }
62646278
/*
62656279
<K_REFERENCES> tk=<S_IDENTIFIER> [ columnNames=ColumnsNamesList() ]
6266-
{ alterExp.setFkSourceTable(tk.image); alterExp.setFkSourceColumns(columnNames); }
6280+
{ alterExp.setFkSourceTable(tk.image); alterExp.setFkSourceColumns(columnNames); }
62676281
*/
62686282
<K_REFERENCES> fkTable=Table() [ columnNames=ColumnsNamesList() ]
62696283
{
@@ -6273,17 +6287,17 @@ AlterExpression AlterExpression():
62736287
}
62746288

62756289
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6276-
{ alterExp.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6277-
)]
6290+
{ alterExp.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6291+
)]
62786292
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6279-
{ alterExp.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6280-
)]
6293+
{ alterExp.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6294+
)]
62816295
)
62826296
|
62836297
(
62846298
<K_CONSTRAINT> sk3=RelObjectName()
6285-
6286-
( ( tk=<K_FOREIGN> tk2=<K_KEY>
6299+
(
6300+
( tk=<K_FOREIGN> tk2=<K_KEY>
62876301
columnNames=ColumnsNamesList()
62886302
{
62896303
fkIndex = new ForeignKeyIndex()
@@ -6298,12 +6312,12 @@ AlterExpression AlterExpression():
62986312
alterExp.setIndex(fkIndex);
62996313
}
63006314

6301-
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6302-
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6303-
)]
6304-
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6305-
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6306-
)]
6315+
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6316+
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6317+
)]
6318+
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6319+
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6320+
)]
63076321
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
63086322
)
63096323
|
@@ -6318,13 +6332,14 @@ AlterExpression AlterExpression():
63186332
}
63196333
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
63206334
[<K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
6335+
[ index = IndexWithComment(index) { alterExp.setIndex(index); } ]
63216336
)
63226337
|
63236338
(
63246339
<K_CHECK> {Expression exp = null;} ("(" exp = Expression() ")")* {
6325-
CheckConstraint checkCs = new CheckConstraint().withName(sk3).withExpression(exp);
6326-
alterExp.setIndex(checkCs);
6327-
}
6340+
CheckConstraint checkCs = new CheckConstraint().withName(sk3).withExpression(exp);
6341+
alterExp.setIndex(checkCs);
6342+
}
63286343
)
63296344
|
63306345
(
@@ -6339,28 +6354,25 @@ AlterExpression AlterExpression():
63396354
}
63406355
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
63416356
[<K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
6357+
[ index = IndexWithComment(index) { alterExp.setIndex(index); } ]
63426358
)
63436359
|
63446360
(
63456361
tk=<K_KEY>
6346-
columnNames=ColumnsNamesList()
6347-
{
6348-
index = new NamedConstraint()
6349-
.withName(sk3)
6350-
.withType(tk.image)
6351-
.withColumnsNames(columnNames);
6352-
alterExp.setIndex(index);
6353-
}
6354-
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
6362+
columnNames=ColumnsNamesList()
6363+
{
6364+
index = new NamedConstraint()
6365+
.withName(sk3)
6366+
.withType(tk.image)
6367+
.withColumnsNames(columnNames);
6368+
alterExp.setIndex(index);
6369+
}
6370+
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
63556371
)
6356-
)
6372+
)
63576373
)
63586374
|
6359-
( sk3=RelObjectName() <K_COMMENT>
6360-
tk=<S_CHAR_LITERAL> {
6361-
alterExp.withColumnName(sk3).withCommentText(tk.image);
6362-
}
6363-
)
6375+
( sk3=RelObjectName() <K_COMMENT> tk=<S_CHAR_LITERAL> { alterExp.withColumnName(sk3).withCommentText(tk.image); } )
63646376
)
63656377
)
63666378
|
@@ -6373,7 +6385,7 @@ AlterExpression AlterExpression():
63736385
)
63746386
)
63756387
|
6376-
<K_DROP> { alterExp.setOperation(AlterOperation.DROP); }
6388+
<K_DROP> { alterExp.setOperation(AlterOperation.DROP); }
63776389
(
63786390
(
63796391
(
@@ -6406,9 +6418,9 @@ AlterExpression AlterExpression():
64066418
(
64076419
( tk=<K_INDEX> | tk=<K_KEY> )
64086420
( tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER> ) {
6409-
index = new Index().withType(tk.image).withName(tk2.image);
6410-
alterExp.setIndex(index);
6411-
}
6421+
index = new Index().withType(tk.image).withName(tk2.image);
6422+
alterExp.setIndex(index);
6423+
}
64126424
)
64136425
|
64146426
(
@@ -6435,18 +6447,18 @@ AlterExpression AlterExpression():
64356447
)
64366448
)
64376449
|
6438-
(<K_ALGORITHM>
6439-
{
6450+
(
6451+
<K_ALGORITHM> {
64406452
alterExp.setOperation(AlterOperation.ALGORITHM);
64416453
}
64426454
["=" { alterExp.setUseEqual(true);} ]
64436455
sk3 = RelObjectName() {alterExp.addParameters(sk3); }
6444-
)
6456+
)
64456457
|
6446-
LOOKAHEAD(2) <K_RENAME> { alterExp.setOperation(AlterOperation.RENAME); } [ <K_COLUMN> { alterExp.hasColumn(true);} ]
6447-
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> ) { alterExp.setColOldName(tk.image); }
6458+
LOOKAHEAD(2) <K_RENAME> { alterExp.setOperation(AlterOperation.RENAME); } [ <K_COLUMN> { alterExp.hasColumn(true);} ]
6459+
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> ) { alterExp.setColOldName(tk.image); }
64486460
<K_TO>
6449-
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk2.image); }
6461+
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk2.image); }
64506462
|
64516463
(
64526464
<K_RENAME> <K_TO> {alterExp.setOperation(AlterOperation.RENAME_TABLE);}
@@ -6471,7 +6483,7 @@ AlterExpression AlterExpression():
64716483
}
64726484

64736485
alterExp.setOptionalSpecifier( optionalSpecifier.toString() );
6474-
}
6486+
}
64756487
)
64766488

64776489
{

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,23 @@ public void testAlterTableDropMultipleColumnsIfExists() throws JSQLParserExcepti
873873
"ALTER TABLE test DROP COLUMN IF EXISTS name, DROP COLUMN IF EXISTS surname");
874874
}
875875

876+
@Test
877+
public void testAlterTableAddIndexWithComment1906() throws JSQLParserException {
878+
assertSqlCanBeParsedAndDeparsed(
879+
"ALTER TABLE `student` ADD KEY `idx_name` (`name`) COMMENT 'name'");
880+
}
881+
882+
@Test
883+
public void testAlterTableAddIndexWithComment2() throws JSQLParserException {
884+
assertSqlCanBeParsedAndDeparsed(
885+
"ALTER TABLE team_phases ADD CONSTRAINT team_phases_id_key UNIQUE (id) COMMENT 'name'");
886+
assertSqlCanBeParsedAndDeparsed(
887+
"ALTER TABLE team_phases ADD CONSTRAINT team_phases_id_key UNIQUE KEY (c1, c2) COMMENT 'name'");
888+
889+
assertSqlCanBeParsedAndDeparsed(
890+
"ALTER TABLE team_phases ADD CONSTRAINT team_phases_id_key PRIMARY KEY (id) COMMENT 'name'");
891+
}
892+
876893
@Test
877894
public void testAlterTableDropMultipleColumnsIfExistsWithParams() throws JSQLParserException {
878895
assertSqlCanBeParsedAndDeparsed(

0 commit comments

Comments
 (0)