Skip to content

Commit db73399

Browse files
committed
fix(parser): model common MySQL table options
1 parent 3e67a33 commit db73399

2 files changed

Lines changed: 49 additions & 5 deletions

File tree

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

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,8 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
11981198

11991199
private boolean isMySqlTableOptionAhead() {
12001200
int kind = getToken(1).kind;
1201-
if (kind == K_ENGINE) {
1201+
if (kind == K_ENGINE || kind == K_COLLATE || kind == K_COMMENT
1202+
|| kind == K_AUTO_INCREMENT) {
12021203
return true;
12031204
}
12041205
if (kind == K_CHARACTER && getToken(2).kind == K_SET
@@ -1212,7 +1213,7 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
12121213
return false;
12131214
}
12141215
int secondKind = getToken(2).kind;
1215-
return secondKind == K_CHARACTER || secondKind == K_CHAR
1216+
return secondKind == K_CHARACTER || secondKind == K_CHAR || secondKind == K_COLLATE
12161217
|| secondKind == S_IDENTIFIER
12171218
&& "CHARSET".equalsIgnoreCase(getToken(2).image);
12181219
}
@@ -11880,7 +11881,7 @@ TableOption MySqlTableOption(): {
1188011881
String value;
1188111882
boolean useEquals = false;
1188211883
String name = "";
11883-
TableOption.Kind kind;
11884+
TableOption.Kind kind = null;
1188411885
TableOption option;
1188511886
} {
1188611887
(
@@ -11902,8 +11903,27 @@ TableOption MySqlTableOption(): {
1190211903
}
1190311904
|
1190411905
tk=<S_IDENTIFIER> { name += tk.image; }
11906+
|
11907+
tk=<K_COLLATE> {
11908+
name += tk.image;
11909+
kind = TableOption.Kind.COLLATE;
11910+
}
1190511911
)
11906-
{ kind = TableOption.Kind.CHARACTER_SET; }
11912+
{ if (kind == null) { kind = TableOption.Kind.CHARACTER_SET; } }
11913+
[ "=" { useEquals = true; } ]
11914+
value=MySqlTableOptionValue()
11915+
|
11916+
tk=<K_COMMENT> {
11917+
name = tk.image;
11918+
kind = TableOption.Kind.COMMENT;
11919+
}
11920+
[ "=" { useEquals = true; } ]
11921+
value=MySqlTableOptionValue()
11922+
|
11923+
tk=<K_AUTO_INCREMENT> {
11924+
name = tk.image;
11925+
kind = TableOption.Kind.AUTO_INCREMENT;
11926+
}
1190711927
[ "=" { useEquals = true; } ]
1190811928
value=MySqlTableOptionValue()
1190911929
)
@@ -11921,6 +11941,9 @@ String MySqlTableOptionValue(): {
1192111941
value=RelObjectName()
1192211942
| token=<K_CSV> { value = token.image; }
1192311943
| token=<K_BINARY> { value = token.image; }
11944+
| token=<S_CHAR_LITERAL> { value = token.image; }
11945+
| token=<S_LONG> { value = token.image; }
11946+
| token=<S_DOUBLE> { value = token.image; }
1192411947
)
1192511948
{ return value; }
1192611949
}
@@ -12352,6 +12375,7 @@ CheckConstraint CheckConstraintSpec(String constraintName):
1235212375
{
1235312376
Expression exp = null;
1235412377
Boolean enforced = null;
12378+
CheckConstraint checkConstraint;
1235512379
}
1235612380
{
1235712381
<K_CHECK> ( LOOKAHEAD(2) "(" exp = Expression() ")" )*
@@ -12360,8 +12384,10 @@ CheckConstraint CheckConstraintSpec(String constraintName):
1236012384
<K_ENFORCED> { if (enforced == null) { enforced = true; } }
1236112385
]
1236212386
{
12363-
return new CheckConstraint().withName(constraintName).withExpression(exp)
12387+
checkConstraint = new CheckConstraint().withName(constraintName).withExpression(exp)
1236412388
.withEnforced(enforced);
12389+
checkConstraint.setKind(Index.Kind.CHECK);
12390+
return checkConstraint;
1236512391
}
1236612392
}
1236712393

‎src/test/java/net/sf/jsqlparser/statement/create/MySqlTableDefinitionTest.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,24 @@ public void testStructuredMySqlTableOptionsAndKeywordColumn() throws JSQLParserE
133133
assertEquals(TableOption.Kind.CHARACTER_SET, table.getTableOptions().get(1).getKind());
134134
assertEquals("utf8mb4", table.getTableOptions().get(1).getValue());
135135
assertReparse(table);
136+
137+
CreateTable quotedEngine = parseMySql("CREATE TABLE archive_entry (id INT) "
138+
+ "ENGINE='InnoDB'");
139+
assertEquals("'InnoDB'", quotedEngine.getTableOption(TableOption.Kind.ENGINE)
140+
.orElseThrow().getValue());
141+
assertReparse(quotedEngine);
142+
143+
CreateTable commonOptions = parseMySql("CREATE TABLE table_options "
144+
+ "(id BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB "
145+
+ "DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=7 "
146+
+ "COMMENT='archive'");
147+
assertEquals("utf8mb4_bin", commonOptions.getTableOption(TableOption.Kind.COLLATE)
148+
.orElseThrow().getValue());
149+
assertEquals("7", commonOptions.getTableOption(TableOption.Kind.AUTO_INCREMENT)
150+
.orElseThrow().getValue());
151+
assertEquals("'archive'", commonOptions.getTableOption(TableOption.Kind.COMMENT)
152+
.orElseThrow().getValue());
153+
assertReparse(commonOptions);
136154
}
137155

138156
@Test

0 commit comments

Comments
 (0)