@@ -1560,9 +1560,15 @@ public class CCJSqlParser extends AbstractJSqlParser<CCJSqlParser> {
15601560 return isKeywordAhead("ENGINE_ATTRIBUTE") || isKeywordAhead("SECONDARY_ENGINE_ATTRIBUTE");
15611561 }
15621562
1563+ private boolean isMySqlAdditionalTableOptionAhead() {
1564+ String name = getToken(1).image.toUpperCase(Locale.ROOT);
1565+ return Arrays.asList("SECONDARY_ENGINE", "AUTOEXTEND_SIZE", "INSERT_METHOD", "PACK_KEYS",
1566+ "DELAY_KEY_WRITE", "CHECKSUM", "CONNECTION", "COMPRESSION").contains(name);
1567+ }
1568+
15631569 private boolean isMySqlScalarTableOptionAhead() {
15641570 int kind = getToken(1).kind;
1565- return isMySqlEngineAttributeAhead() || kind == K_ENCRYPTION || kind == K_PASSWORD || kind == K_AUTO_INCREMENT
1571+ return isMySqlAdditionalTableOptionAhead() || isMySqlEngineAttributeAhead() || kind == K_ENCRYPTION || kind == K_PASSWORD || kind == K_AUTO_INCREMENT
15661572 || (kind == K_DATA || kind == K_INDEX) && getToken(2).kind == K_DIRECTORY;
15671573 }
15681574
@@ -15434,17 +15440,22 @@ TableOption MySqlTableOption(): {
1543415440 }
1543515441}
1543615442
15437- /** Common CREATE/ALTER options with a quoted string or unsigned integer value. */
15443+ /** Shared CREATE/ALTER table options with option-specific value syntax . */
1543815444TableOption MySqlScalarTableOption():
1543915445{
1544015446 Token token;
1544115447 String name;
1544215448 String value;
1544315449 TableOption.Kind kind;
1544415450 boolean useEquals = false;
15451+ TableOption additional;
1544515452}
1544615453{
1544715454 (
15455+ LOOKAHEAD({ isMySqlAdditionalTableOptionAhead() }) additional=MySqlAdditionalTableOption()
15456+ { name = additional.getName(); kind = additional.getKind();
15457+ value = additional.getValue(); useEquals = additional.isUseEquals(); }
15458+ |
1544815459 <K_AUTO_INCREMENT> { name = "AUTO_INCREMENT"; kind = TableOption.Kind.AUTO_INCREMENT; }
1544915460 [ "=" { useEquals = true; } ] token=<S_LONG> { value = token.image; }
1545015461 |
@@ -15463,6 +15474,65 @@ TableOption MySqlScalarTableOption():
1546315474 { return new TableOption(kind, name, value, useEquals); }
1546415475}
1546515476
15477+ TableOption MySqlAdditionalTableOption():
15478+ {
15479+ Token token;
15480+ String name;
15481+ String value;
15482+ boolean useEquals = false;
15483+ }
15484+ {
15485+ (
15486+ LOOKAHEAD({ isKeywordAhead("SECONDARY_ENGINE") })
15487+ token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
15488+ [ "=" { useEquals = true; } ]
15489+ ( token=<K_NULL> { value = token.image; } | token=<S_CHAR_LITERAL> { value = token.image; } | value=RelObjectName() )
15490+ |
15491+ LOOKAHEAD({ isKeywordAhead("INSERT_METHOD") })
15492+ token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
15493+ [ "=" { useEquals = true; } ]
15494+ ( token=<K_NO> | token=<K_FIRST> | token=<K_LAST> ) { value = token.image; }
15495+ |
15496+ LOOKAHEAD({ isKeywordAhead("PACK_KEYS") })
15497+ token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
15498+ [ "=" { useEquals = true; } ]
15499+ ( token=<K_DEFAULT> | token=<S_LONG> ) {
15500+ value = token.image;
15501+ if (token.kind == S_LONG && !"0".equals(value) && !"1".equals(value)) {
15502+ throw new ParseException("PACK_KEYS requires 0, 1 or DEFAULT");
15503+ }
15504+ }
15505+ |
15506+ LOOKAHEAD({ isKeywordAhead("AUTOEXTEND_SIZE") })
15507+ token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
15508+ [ "=" { useEquals = true; } ]
15509+ value=MySqlSizeNumber()
15510+ |
15511+ LOOKAHEAD({ isKeywordAhead("CHECKSUM") || isKeywordAhead("DELAY_KEY_WRITE") })
15512+ token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
15513+ [ "=" { useEquals = true; } ]
15514+ token=<S_LONG> { value = token.image; }
15515+ |
15516+ token=<S_IDENTIFIER> { name = token.image.toUpperCase(Locale.ROOT); }
15517+ [ "=" { useEquals = true; } ]
15518+ token=<S_CHAR_LITERAL> { value = token.image; }
15519+ )
15520+ { if (true) { return new TableOption(TableOption.Kind.valueOf(name), name, value, useEquals); } }
15521+ }
15522+
15523+ String MySqlSizeNumber():
15524+ {
15525+ Token number;
15526+ }
15527+ {
15528+ ( number=<S_LONG> | number=<S_IDENTIFIER> )
15529+ {
15530+ requireDdlSyntax(number.kind == S_LONG || number.image.matches("[0-9]+[kKmMgG]"),
15531+ "Expected an unsigned size with an optional K, M or G suffix");
15532+ return number.image;
15533+ }
15534+ }
15535+
1546615536AlterExpressionTableOption AlterScalarTableOption():
1546715537{
1546815538 TableOption option;
0 commit comments