From 2e7be261c64bc4520e20725ad90e92602da0ce9a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 17 Oct 2024 11:49:49 +0200 Subject: [PATCH] [jOOQ/jOOQ#7539] Auto-alias CTE contents --- .../jooq/impl/CommonTableExpressionImpl.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java b/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java index 5bac360ef4..4195006a4d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java @@ -51,6 +51,8 @@ import static org.jooq.impl.Keywords.K_AS; import static org.jooq.impl.Keywords.K_MATERIALIZED; import static org.jooq.impl.Keywords.K_NOT; import static org.jooq.impl.SubqueryCharacteristics.DERIVED_TABLE; +import static org.jooq.impl.Tools.isEmpty; +import static org.jooq.impl.Tools.isNotEmpty; import static org.jooq.impl.Tools.map; import static org.jooq.impl.Tools.visitSubquery; @@ -61,6 +63,7 @@ import org.jooq.Context; import org.jooq.DataType; import org.jooq.DerivedColumnList; import org.jooq.Field; +import org.jooq.Name; // ... import org.jooq.QueryPart; import org.jooq.Record; @@ -79,8 +82,9 @@ import org.jooq.impl.Tools.SimpleDataKey; */ final class CommonTableExpressionImpl extends AbstractTable implements CommonTableExpression { - static final Set SUPPORT_MATERIALIZED = SQLDialect.supportedBy(POSTGRES, SQLITE); - static final Set NO_SUPPORT_COLUMN_LIST = SQLDialect.supportedBy(CLICKHOUSE); + static final Set SUPPORT_MATERIALIZED = SQLDialect.supportedBy(POSTGRES, SQLITE); + static final Set NO_SUPPORT_COLUMN_LIST = SQLDialect.supportedBy(CLICKHOUSE); + static final Set REQUIRE_EXPLICIT_ALIASING = SQLDialect.supportedBy(CLICKHOUSE); @@ -133,7 +137,7 @@ final class CommonTableExpressionImpl extends AbstractTable QueryPart s = query; // [#4474] [#16629] Support this for ResultQuery as well - if (NO_SUPPORT_COLUMN_LIST.contains(ctx.dialect())) { + if (NO_SUPPORT_COLUMN_LIST.contains(ctx.dialect()) && isNotEmpty(name.fieldNames)) { ctx.visit(name.name); if (query instanceof Select q) @@ -144,6 +148,14 @@ final class CommonTableExpressionImpl extends AbstractTable query ); } + + // [#7539] The automatic aliases generated by ClickHouse for CTE and derived tables are unreliable + else if (REQUIRE_EXPLICIT_ALIASING.contains(ctx.dialect()) && isEmpty(name.fieldNames)) { + ctx.visit(name.name); + + if (query instanceof Select q) + s = new AliasedSelect<>(q, false, true, false, map(q.getSelect(), f -> f.getUnqualifiedName(), Name[]::new)); + } else ctx.visit(name);