From 29bcf7b208edf27f2c48e5b37d4f25be8afdae30 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 30 Jan 2020 15:01:38 +0100 Subject: [PATCH] [jOOQ/jOOQ#9778] Support NULLS [ FIRST | LAST ] in SQLite 3.30 --- .../java/org/jooq/impl/SortFieldImpl.java | 79 +++++++++---------- 1 file changed, 36 insertions(+), 43 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java index 3c9131e457..8a3e6b5529 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java @@ -37,14 +37,33 @@ */ package org.jooq.impl; +// ... +// ... +// ... +// ... +import static org.jooq.SQLDialect.CUBRID; +// ... +// ... +import static org.jooq.SQLDialect.MARIADB; +// ... +import static org.jooq.SQLDialect.MYSQL; +// ... +// ... +import static org.jooq.SQLDialect.SQLITE; +// ... +// ... +// ... import static org.jooq.impl.DSL.nvl2; import static org.jooq.impl.DSL.one; import static org.jooq.impl.DSL.zero; import static org.jooq.impl.Keywords.K_NULLS_FIRST; import static org.jooq.impl.Keywords.K_NULLS_LAST; +import java.util.Set; + import org.jooq.Context; import org.jooq.Field; +import org.jooq.SQLDialect; import org.jooq.SortField; import org.jooq.SortOrder; @@ -53,12 +72,15 @@ final class SortFieldImpl extends AbstractQueryPart implements SortField { /** * Generated UID */ - private static final long serialVersionUID = 1223739398544155873L; + private static final long serialVersionUID = 1223739398544155873L; - private final Field field; - private final SortOrder order; - private boolean nullsFirst; - private boolean nullsLast; + // DB2 supports NULLS FIRST/LAST only in OLAP (window) functions + private static final Set NO_SUPPORT_NULLS = SQLDialect.supportedUntil(CUBRID, MARIADB, MYSQL); + + private final Field field; + private final SortOrder order; + private boolean nullsFirst; + private boolean nullsLast; SortFieldImpl(Field field, SortOrder order) { this.field = field; @@ -104,46 +126,17 @@ final class SortFieldImpl extends AbstractQueryPart implements SortField { @Override public final void accept(Context ctx) { if (nullsFirst || nullsLast) { - switch (ctx.family()) { + if (NO_SUPPORT_NULLS.contains(ctx.dialect())) { + Field ifNull = nullsFirst ? zero() : one(); + Field ifNotNull = nullsFirst ? one() : zero(); + ctx.visit(nvl2(field, ifNotNull, ifNull)) + .sql(", "); - - - - - - - - - - - - - - - - - - // These OSS dialects don't support this syntax at all - case CUBRID: - case MARIADB: - case MYSQL: - case SQLITE: { - Field ifNull = nullsFirst ? zero() : one(); - Field ifNotNull = nullsFirst ? one() : zero(); - - ctx.visit(nvl2(field, ifNotNull, ifNull)) - .sql(", "); - - acceptFieldAndOrder(ctx, false); - break; - } - - // DERBY, H2, HSQLDB, ORACLE, POSTGRES - default: { - acceptFieldAndOrder(ctx, true); - break; - } + acceptFieldAndOrder(ctx, false); + } + else { + acceptFieldAndOrder(ctx, true); } } else {