Skip to content

Commit 48d195b

Browse files
authored
Add support for ALTER TABLE ... [DEFAULT] COLLATE [=] collation_name syntax (#2204)
1 parent a068dd4 commit 48d195b

File tree

4 files changed

+92
-9
lines changed

4 files changed

+92
-9
lines changed

src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class AlterExpression implements Serializable {
6060

6161
private String characterSet;
6262
private String collation;
63+
private boolean defaultCollateSpecified;
6364
private String lockOption;
6465
private String algorithmOption;
6566
private String engineOption;
@@ -432,6 +433,14 @@ public void setCollation(String collation) {
432433
this.collation = collation;
433434
}
434435

436+
public void setDefaultCollateSpecified(boolean value) {
437+
this.defaultCollateSpecified = value;
438+
}
439+
440+
public boolean isDefaultCollateSpecified() {
441+
return defaultCollateSpecified;
442+
}
443+
435444
public String getLockOption() {
436445
return lockOption;
437446
}
@@ -564,6 +573,17 @@ public String toString() {
564573
}
565574
b.append(getCollation());
566575
}
576+
} else if (operation == AlterOperation.COLLATE) {
577+
if (isDefaultCollateSpecified()) {
578+
b.append("DEFAULT ");
579+
}
580+
b.append("COLLATE ");
581+
if (hasEqualForCollate) {
582+
b.append("= ");
583+
}
584+
if (getCollation() != null) {
585+
b.append(getCollation());
586+
}
567587
} else if (operation == AlterOperation.DROP_UNIQUE) {
568588

569589
b.append("DROP UNIQUE (").append(PlainSelect.getStringList(pkColumns)).append(')');

src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
package net.sf.jsqlparser.statement.alter;
1111

1212
public enum AlterOperation {
13-
ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, CONVERT, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC, ADD_PARTITION, DROP_PARTITION, TRUNCATE_PARTITION, SET_TABLE_OPTION, ENGINE, FORCE, LOCK, DISCARD_TABLESPACE, IMPORT_TABLESPACE;
13+
ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, CONVERT, COLLATE, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC, ADD_PARTITION, DROP_PARTITION, TRUNCATE_PARTITION, SET_TABLE_OPTION, ENGINE, FORCE, LOCK, DISCARD_TABLESPACE, IMPORT_TABLESPACE;
1414

1515
public static AlterOperation from(String operation) {
1616
return Enum.valueOf(AlterOperation.class, operation.toUpperCase());

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8041,14 +8041,28 @@ AlterExpression AlterExpression():
80418041
<K_TO> <K_CHARACTER> <K_SET> tk=<S_IDENTIFIER> { alterExp.setCharacterSet(tk.image); }
80428042
[<K_COLLATE> tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
80438043
)
8044-
| (<K_DEFAULT> {
8045-
alterExp.setOperation(AlterOperation.CONVERT);
8046-
alterExp.setConvertType(AlterExpression.ConvertType.DEFAULT_CHARACTER_SET);
8047-
}
8048-
<K_CHARACTER> <K_SET> [ "=" { alterExp.setHasEqualForCharacterSet(true); } ]
8049-
tk=<S_IDENTIFIER> { alterExp.setCharacterSet(tk.image); }
8050-
[<K_COLLATE> [ "=" { alterExp.setHasEqualForCollate(true); } ]
8051-
tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
8044+
|
8045+
LOOKAHEAD(3)
8046+
(
8047+
<K_DEFAULT>
8048+
(
8049+
<K_CHARACTER> <K_SET> [ "=" { alterExp.setHasEqualForCharacterSet(true); } ]
8050+
tk=<S_IDENTIFIER> {
8051+
alterExp.setOperation(AlterOperation.CONVERT);
8052+
alterExp.setConvertType(AlterExpression.ConvertType.DEFAULT_CHARACTER_SET);
8053+
alterExp.setCharacterSet(tk.image);
8054+
}
8055+
[<K_COLLATE> [ "=" { alterExp.setHasEqualForCollate(true); } ]
8056+
tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
8057+
|
8058+
<K_COLLATE>
8059+
[ "=" { alterExp.setHasEqualForCollate(true); } ]
8060+
tk=<S_IDENTIFIER> {
8061+
alterExp.setOperation(AlterOperation.COLLATE);
8062+
alterExp.setCollation(tk.image);
8063+
alterExp.setDefaultCollateSpecified(true);
8064+
}
8065+
)
80528066
)
80538067
| (<K_CHARACTER> <K_SET> [ "=" { alterExp.setHasEqualForCharacterSet(true); } ]
80548068
tk=<S_IDENTIFIER> {
@@ -8059,6 +8073,12 @@ AlterExpression AlterExpression():
80598073
[<K_COLLATE> [ "=" { alterExp.setHasEqualForCollate(true); } ]
80608074
tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
80618075
)
8076+
| (<K_COLLATE> { alterExp.setOperation(AlterOperation.COLLATE); }
8077+
[ "=" { alterExp.setHasEqualForCollate(true); } ]
8078+
tk=<S_IDENTIFIER> {
8079+
alterExp.setCollation(tk.image);
8080+
}
8081+
)
80628082
|
80638083
(<K_COMMENT> {alterExp.setOperation(AlterOperation.COMMENT);}
80648084
["=" {alterExp.setOperation(AlterOperation.COMMENT_WITH_EQUAL_SIGN);} ]

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,49 @@ public void testIssue2027() throws JSQLParserException {
10741074
assertSqlCanBeParsedAndDeparsed(sqlLongText);
10751075
}
10761076

1077+
@Test
1078+
public void testAlterTableCollate() throws JSQLParserException {
1079+
// Case 1: Without DEFAULT and without =
1080+
String sql = "ALTER TABLE tbl_name COLLATE collation_name";
1081+
1082+
Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
1083+
AlterExpression expression = alter.getAlterExpressions().get(0);
1084+
assertEquals(expression.getOperation(), AlterOperation.COLLATE);
1085+
assertEquals(expression.getCollation(), "collation_name");
1086+
assertFalse(expression.isDefaultCollateSpecified());
1087+
assertSqlCanBeParsedAndDeparsed(sql);
1088+
1089+
// Case 2: Without DEFAULT and with =
1090+
sql = "ALTER TABLE tbl_name COLLATE = collation_name";
1091+
1092+
alter = (Alter) CCJSqlParserUtil.parse(sql);
1093+
expression = alter.getAlterExpressions().get(0);
1094+
assertEquals(expression.getOperation(), AlterOperation.COLLATE);
1095+
assertEquals(expression.getCollation(), "collation_name");
1096+
assertFalse(expression.isDefaultCollateSpecified());
1097+
assertSqlCanBeParsedAndDeparsed(sql);
1098+
1099+
// Case 3: With DEFAULT and without =
1100+
sql = "ALTER TABLE tbl_name DEFAULT COLLATE collation_name";
1101+
1102+
alter = (Alter) CCJSqlParserUtil.parse(sql);
1103+
expression = alter.getAlterExpressions().get(0);
1104+
assertEquals(expression.getOperation(), AlterOperation.COLLATE);
1105+
assertEquals(expression.getCollation(), "collation_name");
1106+
assertTrue(expression.isDefaultCollateSpecified());
1107+
assertSqlCanBeParsedAndDeparsed(sql);
1108+
1109+
// Case 4: With DEFAULT and with =
1110+
sql = "ALTER TABLE tbl_name DEFAULT COLLATE = collation_name";
1111+
1112+
alter = (Alter) CCJSqlParserUtil.parse(sql);
1113+
expression = alter.getAlterExpressions().get(0);
1114+
assertEquals(expression.getOperation(), AlterOperation.COLLATE);
1115+
assertEquals(expression.getCollation(), "collation_name");
1116+
assertTrue(expression.isDefaultCollateSpecified());
1117+
assertSqlCanBeParsedAndDeparsed(sql);
1118+
}
1119+
10771120
@Test
10781121
public void testIssue2090LockNone() throws JSQLParserException {
10791122
String sql =

0 commit comments

Comments
 (0)