[jOOQ/jOOQ#13341] Avoid asTable() call when creating scalar subqueries

This commit is contained in:
Lukas Eder 2022-03-28 11:47:46 +02:00
parent 5a2d5885af
commit 0984e36834
3 changed files with 20 additions and 9 deletions

View File

@ -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<R extends Record> 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<SelectField<?>, Field<?>, RuntimeException> toField() {
return f -> f instanceof Row
? new RowAsField<>((Row) f)

View File

@ -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);
}
}

View File

@ -3579,7 +3579,7 @@ final class Tools {
return map(query.fields(), f -> f.getDataType());
return asList(query.dataTypes());
}
static final DataType<?> scalarType(ResultQuery<?> query) {