diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldsImpl.java b/jOOQ/src/main/java/org/jooq/impl/FieldsImpl.java index ed04bcbe9c..c8c0c1f8c5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldsImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldsImpl.java @@ -62,6 +62,7 @@ import org.jooq.Record; import org.jooq.RecordMapper; import org.jooq.RecordType; import org.jooq.Row; +import org.jooq.Select; import org.jooq.SelectField; import org.jooq.Table; import org.jooq.TableField; @@ -196,6 +197,14 @@ final class FieldsImpl extends AbstractQueryPart implements Re // RecordType API // ------------------------------------------------------------------------- + /** + * [#13341] Prevent costly calls to Select.asTable() where not strictly + * needed. + */ + static final Row fieldsRow0(FieldsTrait fields) { + return fields instanceof Select ? ((Select) fields).asTable("t").fieldsRow() : fields.fieldsRow(); + } + private static final ThrowingFunction, Field, RuntimeException> toField() { return f -> f instanceof Row ? new RowAsField<>((Row) f) diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldsTrait.java b/jOOQ/src/main/java/org/jooq/impl/FieldsTrait.java index f6711f4b31..7694ccd70a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldsTrait.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldsTrait.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +import static org.jooq.impl.FieldsImpl.fieldsRow0; + import java.util.stream.Stream; import org.jooq.DataType; @@ -174,41 +176,41 @@ interface FieldsTrait extends Fields { @Override default Class[] types() { - return fieldsRow().types(); + return fieldsRow0(this).types(); } @Override default Class type(int index) { - return fieldsRow().type(index); + return fieldsRow0(this).type(index); } @Override default Class type(String name) { - return fieldsRow().type(name); + return fieldsRow0(this).type(name); } @Override default Class type(Name name) { - return fieldsRow().type(name); + return fieldsRow0(this).type(name); } @Override default DataType[] dataTypes() { - return fieldsRow().dataTypes(); + return fieldsRow0(this).dataTypes(); } @Override default DataType dataType(int index) { - return fieldsRow().dataType(index); + return fieldsRow0(this).dataType(index); } @Override default DataType dataType(String name) { - return fieldsRow().dataType(name); + return fieldsRow0(this).dataType(name); } @Override default DataType dataType(Name name) { - return fieldsRow().dataType(name); + return fieldsRow0(this).dataType(name); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 45ac62fc68..080705c772 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3579,7 +3579,7 @@ final class Tools { - return map(query.fields(), f -> f.getDataType()); + return asList(query.dataTypes()); } static final DataType scalarType(ResultQuery query) {