diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt index 5630206339..d1533259f6 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt @@ -238,8 +238,8 @@ setClause = fieldName '=' field deleteStatement = 'DELETE' [ 'FROM' ] tableName [ 'WHERE' condition ] [ 'RETURNING' ( '*' | fields ) ] ; -mergeStatement = 'MERGE INTO' tableName - 'USING' '(' select ')' [ 'AS' identifier ] +mergeStatement = 'MERGE INTO' tableName [ [ 'AS' ] identifier ] + 'USING' '(' select ')' [ [ 'AS' ] identifier ] 'ON' condition break { 'WHEN MATCHED THEN UPDATE' 'SET' setClauses diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index d84a8d5f37..145b5d294a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -1198,13 +1198,19 @@ final class ParserImpl implements Parser { private static final Merge parseMerge(ParserContext ctx) { parseKeyword(ctx, "MERGE INTO"); Table target = parseTableName(ctx); + + if (parseKeywordIf(ctx, "AS") || !peekKeyword(ctx, "USING")) + target = target.as(parseIdentifier(ctx)); + parseKeyword(ctx, "USING"); parse(ctx, '('); Select using = parseSelect(ctx); TableLike usingTable = using; parse(ctx, ')'); - if (parseKeywordIf(ctx, "AS")) + + if (parseKeywordIf(ctx, "AS") || !peekKeyword(ctx, "ON")) usingTable = DSL.table(using).as(parseIdentifier(ctx)); + parseKeyword(ctx, "ON"); Condition on = parseCondition(ctx); boolean update = false;