From 8fd072bd72cc66d66c0ef14136646bd8b7c41c70 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 1 Mar 2024 10:04:20 +0100 Subject: [PATCH] [jOOQ/jOOQ#16392] Regression in fetchCount execution when argument query uses plain SQL tables This includes: - [jOOQ/jOOQ#16393] Empty derived column lists generate wrong SQL syntax --- jOOQ/src/main/java/org/jooq/impl/Alias.java | 11 ++++++++--- .../main/java/org/jooq/impl/InlineDerivedTable.java | 2 +- jOOQ/src/main/java/org/jooq/impl/TableAlias.java | 6 +----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index 0c6c872963..80d5c1c3a6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -88,6 +88,7 @@ import static org.jooq.impl.QueryPartListView.wrap; import static org.jooq.impl.SubqueryCharacteristics.DERIVED_TABLE; import static org.jooq.impl.Tools.EMPTY_NAME; import static org.jooq.impl.Tools.combine; +import static org.jooq.impl.Tools.isNotEmpty; import static org.jooq.impl.Tools.map; import static org.jooq.impl.Tools.visitSubquery; import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED; @@ -157,6 +158,10 @@ final class Alias extends AbstractQueryPart implements UEmp return wrapped; } + final boolean hasFieldAliases() { + return isNotEmpty(fieldAliases); + } + @Override public final boolean isSimple(Context ctx) { return wrapped instanceof Table && !ctx.declareTables() @@ -233,7 +238,7 @@ final class Alias extends AbstractQueryPart implements UEmp // [#454] [#1801] Some databases don't allow "derived column names" in // "simple class specifications", or "common table expression references". // Hence, wrap the table reference in a subselect - if (fieldAliases != null + if (hasFieldAliases() && (SUPPORT_DERIVED_COLUMN_NAMES_SPECIAL1.contains(dialect)) && (wrapped instanceof TableImpl || wrapped instanceof CommonTableExpressionImpl)) { @@ -243,7 +248,7 @@ final class Alias extends AbstractQueryPart implements UEmp // [#1801] Some databases do not support "derived column names". // They can be emulated by concatenating a dummy SELECT with no // results using UNION ALL - else if (fieldAliases != null && ( + else if (hasFieldAliases() && ( emulatedDerivedColumnList || SUPPORT_DERIVED_COLUMN_NAMES_SPECIAL2.contains(dialect) @@ -341,7 +346,7 @@ final class Alias extends AbstractQueryPart implements UEmp .qualify(false, c -> c.visit(alias)); // [#1801] Add field aliases to the table alias, if applicable - if (fieldAliases != null && !emulatedDerivedColumnList) { + if (hasFieldAliases() && !emulatedDerivedColumnList) { toSQLDerivedColumnList(context); } diff --git a/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java b/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java index f3c7e5a4a8..27999e5d0f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java @@ -231,7 +231,7 @@ final class InlineDerivedTable extends DerivedTable { if (u.where != null) { Select q = new InlineDerivedTable<>(u).query(); - if (a.hasFieldAliases()) + if (a.alias.hasFieldAliases()) return q.asTable(a.getUnqualifiedName(), a.alias.fieldAliases); else return q.asTable(a); diff --git a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java index 77546d274a..3e82bcba7d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java @@ -104,7 +104,7 @@ implements // [#13418] List> result = Tools.map(this.alias.wrapped().fieldsRow().fields(), (f, i) -> new TableFieldImpl( - hasFieldAliases() && alias.fieldAliases.length > i + alias.hasFieldAliases() && alias.fieldAliases.length > i ? alias.fieldAliases[i] : f.getUnqualifiedName(), removeGenerator(CONFIG.get(), f.getDataType()), this, f.getCommentPart(), f.getBinding() )); @@ -112,10 +112,6 @@ implements return new FieldsImpl<>(result); } - final boolean hasFieldAliases() { - return alias.fieldAliases != null; - } - /** * Get the aliased table wrapped by this table. */