[jOOQ/jOOQ#7539] Auto-alias CTE contents

This commit is contained in:
Lukas Eder 2024-10-17 11:49:49 +02:00
parent c5d1e154ae
commit 2e7be261c6

View File

@ -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<R extends Record> extends AbstractTable<R> implements CommonTableExpression<R> {
static final Set<SQLDialect> SUPPORT_MATERIALIZED = SQLDialect.supportedBy(POSTGRES, SQLITE);
static final Set<SQLDialect> NO_SUPPORT_COLUMN_LIST = SQLDialect.supportedBy(CLICKHOUSE);
static final Set<SQLDialect> SUPPORT_MATERIALIZED = SQLDialect.supportedBy(POSTGRES, SQLITE);
static final Set<SQLDialect> NO_SUPPORT_COLUMN_LIST = SQLDialect.supportedBy(CLICKHOUSE);
static final Set<SQLDialect> REQUIRE_EXPLICIT_ALIASING = SQLDialect.supportedBy(CLICKHOUSE);
@ -133,7 +137,7 @@ final class CommonTableExpressionImpl<R extends Record> extends AbstractTable<R>
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<R> q)
@ -144,6 +148,14 @@ final class CommonTableExpressionImpl<R extends Record> extends AbstractTable<R>
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<R> q)
s = new AliasedSelect<>(q, false, true, false, map(q.getSelect(), f -> f.getUnqualifiedName(), Name[]::new));
}
else
ctx.visit(name);