From d3f9928ff0cbb7d82f5957e6b788abb219579a00 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 18 Mar 2021 16:48:26 +0100 Subject: [PATCH] [jOOQ/jOOQ#5810] Emulate QUALIFY This includes: - [jOOQ/jOOQ#11666] Expand unqualified asterisk when combined with other projection expressions and when not supported The current QUALIFY emulation works with unqualified asterisks in the synthetic derived table, which may need to be expanded again in some dialects. --- jOOQ/src/main/java/org/jooq/impl/AsteriskImpl.java | 8 +++++--- jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java | 8 ++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AsteriskImpl.java b/jOOQ/src/main/java/org/jooq/impl/AsteriskImpl.java index e0ef96a543..753fcd98cb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AsteriskImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AsteriskImpl.java @@ -39,6 +39,7 @@ package org.jooq.impl; // ... import static org.jooq.SQLDialect.H2; +// ... import static org.jooq.impl.Keywords.K_EXCEPT; import java.util.Arrays; @@ -58,9 +59,10 @@ final class AsteriskImpl extends AbstractQueryPart implements Asterisk { /** * Generated UI */ - private static final long serialVersionUID = 6298415939984684260L; - static final AsteriskImpl INSTANCE = new AsteriskImpl(new QueryPartList<>()); - static final Set SUPPORT_NATIVE_EXCEPT = SQLDialect.supportedBy(H2); + private static final long serialVersionUID = 6298415939984684260L; + static final AsteriskImpl INSTANCE = new AsteriskImpl(new QueryPartList<>()); + static final Set SUPPORT_NATIVE_EXCEPT = SQLDialect.supportedBy(H2); + static final Set NO_SUPPORT_UNQUALIFIED_COMBINED = SQLDialect.supportedBy(); final QueryPartList> fields; private AsteriskImpl(QueryPartList> fields) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 3ea93f5650..b6a0beaf2b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -105,6 +105,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... import static org.jooq.SortOrder.DESC; import static org.jooq.conf.ParamType.INLINED; +import static org.jooq.impl.AsteriskImpl.NO_SUPPORT_UNQUALIFIED_COMBINED; import static org.jooq.impl.AsteriskImpl.SUPPORT_NATIVE_EXCEPT; import static org.jooq.impl.CombineOperator.EXCEPT; import static org.jooq.impl.CombineOperator.EXCEPT_ALL; @@ -3560,9 +3561,12 @@ final class SelectQueryImpl extends AbstractResultQuery imp // [#7921] Only H2 supports the * EXCEPT (..) syntax boolean resolveExcept = resolveSupported || !SUPPORT_NATIVE_EXCEPT.contains(c.dialect()); + boolean resolveUnqualifiedCombined = resolveSupported || NO_SUPPORT_UNQUALIFIED_COMBINED.contains(c.dialect()); // [#7921] TODO Find a better, more efficient way to resolve asterisks - for (SelectFieldOrAsterisk f : getSelectResolveImplicitAsterisks()) + SelectFieldList list = getSelectResolveImplicitAsterisks(); + + for (SelectFieldOrAsterisk f : list) if (f instanceof Field) result.add(getResolveProjection(c, (Field) f)); else if (f instanceof QualifiedAsterisk) @@ -3577,7 +3581,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp result.add(f); else if (f instanceof Asterisk) if (((AsteriskImpl) f).fields.isEmpty()) - if (resolveSupported) + if (resolveSupported || resolveUnqualifiedCombined && list.size() > 1) result.addAll(resolveAsterisk(new QueryPartList<>())); else result.add(f);