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:
Lukas Eder 2021-03-18 16:48:26 +01:00
parent f25596ff19
commit d3f9928ff0
2 changed files with 11 additions and 5 deletions

View File

@ -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) {

View File

@ -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);