[jOOQ/jOOQ#9132] Support parsing MySQL's USING [ BTREE | HASH ] index type syntax everywhere where it is supported

This commit is contained in:
Lukas Eder 2019-09-17 16:34:40 +02:00
parent b4af3ab133
commit e4e803beea

View File

@ -3133,6 +3133,9 @@ final class ParserImpl implements Parser {
if (!parseKeywordIf(ctx, "KEY"))
parseKeywordIf(ctx, "INDEX");
// [#9132] Avoid parsing "using" as an identifier
parseUsingBtreeOrHashIf(ctx);
// [#7268] MySQL has some legacy syntax where an index name
// can override a constraint name
Name index = parseIdentifierIf(ctx);
@ -3151,12 +3154,19 @@ final class ParserImpl implements Parser {
continue columnLoop;
}
else if (constraint == null && parseIndexOrKeyIf(ctx)) {
parseUsingBtreeOrHashIf(ctx);
int p2 = ctx.position();
// [#7348] [#7651] Look ahead if the next tokens indicate a MySQL index definition
if (parseIf(ctx, '(') || (parseIdentifierIf(ctx) != null && parseIf(ctx, '('))) {
// [#7348] [#7651] [#9132] Look ahead if the next tokens
// indicate a MySQL index definition
if (parseIf(ctx, '(') || (parseIdentifierIf(ctx) != null
&& parseUsingBtreeOrHashIf(ctx)
&& parseIf(ctx, '('))) {
ctx.position(p2);
indexes.add(parseIndexSpecification(ctx, tableName));
parseUsingBtreeOrHashIf(ctx);
continue columnLoop;
}
else {
@ -3566,6 +3576,7 @@ final class ParserImpl implements Parser {
private static final Index parseIndexSpecification(ParserContext ctx, Table<?> table) {
Name name = parseIdentifierIf(ctx);
parseUsingBtreeOrHashIf(ctx);
parse(ctx, '(');
SortField<?>[] fields = parseSortSpecification(ctx).toArray(EMPTY_SORTFIELD);
parse(ctx, ')');
@ -3578,6 +3589,8 @@ final class ParserImpl implements Parser {
}
private static final Constraint parsePrimaryKeySpecification(ParserContext ctx, ConstraintTypeStep constraint) {
parseUsingBtreeOrHashIf(ctx);
parse(ctx, '(');
Field<?>[] fieldNames = parseFieldNames(ctx).toArray(EMPTY_FIELD);
parse(ctx, ')');
@ -3586,11 +3599,14 @@ final class ParserImpl implements Parser {
? primaryKey(fieldNames)
: constraint.primaryKey(fieldNames);
parseUsingBtreeOrHashIf(ctx);
parseConstraintStateIf(ctx);
return e;
}
private static final Constraint parseUniqueSpecification(ParserContext ctx, ConstraintTypeStep constraint) {
parseUsingBtreeOrHashIf(ctx);
parse(ctx, '(');
Field<?>[] fieldNames = parseFieldNames(ctx).toArray(EMPTY_FIELD);
parse(ctx, ')');
@ -3599,6 +3615,7 @@ final class ParserImpl implements Parser {
? unique(fieldNames)
: constraint.unique(fieldNames);
parseUsingBtreeOrHashIf(ctx);
parseConstraintStateIf(ctx);
return e;
}
@ -4198,13 +4215,13 @@ final class ParserImpl implements Parser {
private static final DDLQuery parseCreateIndex(ParserContext ctx, boolean unique) {
boolean ifNotExists = parseKeywordIf(ctx, "IF NOT EXISTS");
Name indexName = parseIndexNameIf(ctx);
parseUsingBtreeOrHashIf(ctx);
parseKeyword(ctx, "ON");
Table<?> tableName = parseTableName(ctx);
if (parseKeywordIf(ctx, "USING BTREE") || parseKeywordIf(ctx, "USING HASH"))
;
parse(ctx, '(');
SortField<?>[] fields = parseSortSpecification(ctx).toArray(EMPTY_SORTFIELD);
parse(ctx, ')');
parseUsingBtreeOrHashIf(ctx);
Name[] include = null;
if (parseKeywordIf(ctx, "INCLUDE")) {
@ -4240,6 +4257,13 @@ final class ParserImpl implements Parser {
return s4;
}
private static final boolean parseUsingBtreeOrHashIf(ParserContext ctx) {
if (parseKeywordIf(ctx, "USING BTREE") || parseKeywordIf(ctx, "USING HASH"))
;
return true;
}
private static final DDLQuery parseAlterDomain(ParserContext ctx) {
parseIdentifier(ctx);