From 810419b4ff2145af77bb22905801e2cb705e56a1 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 8 Apr 2020 18:02:06 +0200 Subject: [PATCH] [jOOQ/jOOQ#7291] Work around http://tracker.firebirdsql.org/browse/JDBC-621 --- .../main/java/org/jooq/impl/MergeImpl.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java index 7d65bbf7d2..a5895c2e57 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java @@ -47,6 +47,7 @@ import static org.jooq.Clause.MERGE_USING; import static org.jooq.Clause.MERGE_VALUES; import static org.jooq.Clause.MERGE_WHEN_MATCHED_THEN_UPDATE; import static org.jooq.Clause.MERGE_WHEN_NOT_MATCHED_THEN_INSERT; +import static org.jooq.SQLDialect.FIREBIRD; import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.HSQLDB; // ... @@ -243,14 +244,15 @@ implements /** * Generated UID */ - private static final long serialVersionUID = -8835479296876774391L; - private static final Clause[] CLAUSES = { MERGE }; + private static final long serialVersionUID = -8835479296876774391L; + private static final Clause[] CLAUSES = { MERGE }; - private static final Set NO_SUPPORT_MULTI = SQLDialect.supportedBy(HSQLDB); - private static final Set REQUIRE_NEGATION = SQLDialect.supportedBy(H2); + private static final Set NO_SUPPORT_MULTI = SQLDialect.supportedBy(HSQLDB); + private static final Set REQUIRE_NEGATION = SQLDialect.supportedBy(H2); + private static final Set NO_SUPPORT_CONDITION_AFTER_NO_CONDITION = SQLDialect.supportedBy(FIREBIRD); private final WithImpl with; private final Table table; @@ -1591,21 +1593,21 @@ implements boolean emulate = false; boolean requireMatchedConditions = false; + // Prevent error 5324 "In a MERGE statement, a 'WHEN MATCHED' clause with a search condition + // cannot appear after a 'WHEN MATCHED' clause with no search condition." + // This can also happen in Firebird: http://tracker.firebirdsql.org/browse/JDBC-621 + // [#10054] TODO: Skip all WHEN MATCHED clauses after a WHEN MATCHED clause with no search condition + if (NO_SUPPORT_CONDITION_AFTER_NO_CONDITION.contains(ctx.family())) { + boolean withoutMatchedConditionFound = false; + for (MatchedClause m : matched) { + if (requireMatchedConditions |= withoutMatchedConditionFound) + break; - - - - - - - - - - - - + withoutMatchedConditionFound |= m.condition instanceof NoCondition; + } + } emulateCheck: if (NO_SUPPORT_MULTI.contains(ctx.dialect()) && matched.size() > 1) {