Skip to content

Commit dc12382

Browse files
minleejaemj-db
andauthored
Add parsing functionality for MySQL CONVERT TO statement (#2097)
Co-authored-by: mj-db <[email protected]>
1 parent f3f6b72 commit dc12382

File tree

4 files changed

+61
-1
lines changed

4 files changed

+61
-1
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public class AlterExpression implements Serializable {
5757

5858
private List<ConstraintState> constraints;
5959
private List<String> parameters;
60+
private String characterSet;
61+
private String collation;
6062
private String lockOption;
6163
private String commentText;
6264

@@ -396,6 +398,22 @@ public List<String> getParameters() {
396398
return parameters;
397399
}
398400

401+
public String getCharacterSet() {
402+
return characterSet;
403+
}
404+
405+
public void setCharacterSet(String characterSet) {
406+
this.characterSet = characterSet;
407+
}
408+
409+
public String getCollation() {
410+
return collation;
411+
}
412+
413+
public void setCollation(String collation) {
414+
this.collation = collation;
415+
}
416+
399417
public String getLockOption() {
400418
return lockOption;
401419
}

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, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC, TRUNCATE_PARTITION, LOCK;
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, TRUNCATE_PARTITION, LOCK;
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: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7322,6 +7322,11 @@ AlterExpression AlterExpression():
73227322
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>) { alterExp.setNewTableName(tk2.image);}
73237323
)
73247324
|
7325+
(<K_CONVERT> { alterExp.setOperation(AlterOperation.CONVERT); }
7326+
<K_TO> <K_CHARACTER> <K_SET> tk=<S_IDENTIFIER> { alterExp.setCharacterSet(tk.image); }
7327+
[<K_COLLATE> tk2=<S_IDENTIFIER> { alterExp.setCollation(tk2.image); }]
7328+
)
7329+
|
73257330
(<K_COMMENT> {alterExp.setOperation(AlterOperation.COMMENT);}
73267331
["=" {alterExp.setOperation(AlterOperation.COMMENT_WITH_EQUAL_SIGN);} ]
73277332
tk=<S_CHAR_LITERAL> { alterExp.setCommentText(tk.image); }

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,4 +1097,41 @@ public void testIssue2090LockExclusive() throws JSQLParserException {
10971097
assertEquals(AlterOperation.LOCK, lockExp.getOperation());
10981098
assertEquals("EXCLUSIVE", lockExp.getLockOption());
10991099
}
1100+
1101+
@Test
1102+
public void testIssue2089() throws JSQLParserException {
1103+
String sql = "ALTER TABLE test_table CONVERT TO CHARACTER SET utf8mb4";
1104+
Statement stmt = CCJSqlParserUtil.parse(sql);
1105+
assertTrue(stmt instanceof Alter);
1106+
Alter alter = (Alter) stmt;
1107+
assertEquals("test_table", alter.getTable().getFullyQualifiedName());
1108+
1109+
List<AlterExpression> alterExpressions = alter.getAlterExpressions();
1110+
assertNotNull(alterExpressions);
1111+
assertEquals(1, alterExpressions.size());
1112+
1113+
AlterExpression convertExp = alterExpressions.get(0);
1114+
assertEquals(AlterOperation.CONVERT, convertExp.getOperation());
1115+
assertEquals("utf8mb4", convertExp.getCharacterSet());
1116+
assertNull(convertExp.getCollation());
1117+
}
1118+
1119+
@Test
1120+
public void testIssue2089WithCollation() throws JSQLParserException {
1121+
String sql =
1122+
"ALTER TABLE test_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci";
1123+
Statement stmt = CCJSqlParserUtil.parse(sql);
1124+
assertTrue(stmt instanceof Alter);
1125+
Alter alter = (Alter) stmt;
1126+
assertEquals("test_table", alter.getTable().getFullyQualifiedName());
1127+
1128+
List<AlterExpression> alterExpressions = alter.getAlterExpressions();
1129+
assertNotNull(alterExpressions);
1130+
assertEquals(1, alterExpressions.size());
1131+
1132+
AlterExpression convertExp = alterExpressions.get(0);
1133+
assertEquals(AlterOperation.CONVERT, convertExp.getOperation());
1134+
assertEquals("utf8mb4", convertExp.getCharacterSet());
1135+
assertEquals("utf8mb4_general_ci", convertExp.getCollation());
1136+
}
11001137
}

0 commit comments

Comments
 (0)