From 2e8c8d5493e299bdd25a784253efea422ddce438 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 23 May 2023 16:33:50 +0200 Subject: [PATCH] [jOOQ/jOOQ#8012] Get Table.where() to work with derived column lists --- .../main/java/org/jooq/impl/InlineDerivedTable.java | 9 ++++++++- .../src/main/java/org/jooq/impl/SelectQueryImpl.java | 12 ++++++++++++ jOOQ/src/main/java/org/jooq/impl/TableAlias.java | 8 ++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java b/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java index 8e4395d060..f192bdea35 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java @@ -66,7 +66,14 @@ final class InlineDerivedTable extends DerivedTable { @Override final FieldsImpl fields0() { - return new FieldsImpl<>(table.as(table).fields()); + + // [#8012] Re-use the existing fields row if this is an aliased table + if (table instanceof TableAlias) + return new FieldsImpl<>(table.fields()); + + // [#8012] Re-wrap fields in new TableAlias to prevent StackOverflowError + else + return new FieldsImpl<>(table.as(table).fields()); } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 1859eacf45..ad86b61fb4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -2727,6 +2727,18 @@ final class SelectQueryImpl extends AbstractResultQuery imp return new InlineDerivedTable<>(removeWhere(u), u.where).query().asTable(i); } } + else if (t instanceof TableAlias a) { + if (a.$aliased() instanceof TableImpl u) { + if (u.where != null) { + Select q = new InlineDerivedTable<>(removeWhere(u), u.where).query(); + + if (a.hasFieldAliases()) + return q.asTable(a.getUnqualifiedName(), a.alias.fieldAliases); + else + return q.asTable(a); + } + } + } return null; } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java index 8f13be0c07..77546d274a 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( - alias.fieldAliases != null && alias.fieldAliases.length > i + hasFieldAliases() && alias.fieldAliases.length > i ? alias.fieldAliases[i] : f.getUnqualifiedName(), removeGenerator(CONFIG.get(), f.getDataType()), this, f.getCommentPart(), f.getBinding() )); @@ -112,10 +112,14 @@ implements return new FieldsImpl<>(result); } + final boolean hasFieldAliases() { + return alias.fieldAliases != null; + } + /** * Get the aliased table wrapped by this table. */ - Table getAliasedTable() { + final Table getAliasedTable() { if (alias != null) return alias.wrapped();