[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.
This commit is contained in:
parent
f25596ff19
commit
d3f9928ff0
@ -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<SQLDialect> SUPPORT_NATIVE_EXCEPT = SQLDialect.supportedBy(H2);
|
||||
private static final long serialVersionUID = 6298415939984684260L;
|
||||
static final AsteriskImpl INSTANCE = new AsteriskImpl(new QueryPartList<>());
|
||||
static final Set<SQLDialect> SUPPORT_NATIVE_EXCEPT = SQLDialect.supportedBy(H2);
|
||||
static final Set<SQLDialect> NO_SUPPORT_UNQUALIFIED_COMBINED = SQLDialect.supportedBy();
|
||||
final QueryPartList<Field<?>> fields;
|
||||
|
||||
private AsteriskImpl(QueryPartList<Field<?>> fields) {
|
||||
|
||||
@ -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<R extends Record> extends AbstractResultQuery<R> 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<SelectFieldOrAsterisk> 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<R extends Record> extends AbstractResultQuery<R> 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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user