[jOOQ/jOOQ#10565] Support parsing FOR XML as scalar subqueries

This commit is contained in:
Lukas Eder 2020-09-01 10:16:20 +02:00
parent 5aeadd3017
commit 520892d5fa
3 changed files with 46 additions and 9 deletions

View File

@ -7179,11 +7179,10 @@ final class ParserImpl implements Parser {
try {
if (peekSelect(ctx, true)) {
SelectQueryImpl<Record> select = parseSelect(ctx);
if (select.getSelect().size() != 1)
if (Tools.degree(select) != 1)
throw ctx.exception("Select list must contain exactly one column");
field = field((Select) select);
return field;
return field((Select) select);
}
}
catch (ParserException e) {

View File

@ -374,12 +374,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
@SuppressWarnings("unchecked")
@Override
public final <T> Field<T> asField() {
List<Field<?>> s = getSelect();
if (s.size() != 1)
throw new IllegalStateException("Can only use single-column ResultProviderQuery as a field");
return new ScalarSubquery<>(this, (DataType<T>) s.get(0).getDataType());
return new ScalarSubquery<>(this, (DataType<T>) Tools.scalarType(this));
}
@Override
@ -2707,6 +2702,14 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp

View File

@ -150,7 +150,10 @@ import static org.jooq.impl.Keywords.K_THROW;
import static org.jooq.impl.Keywords.K_WHEN;
import static org.jooq.impl.SQLDataType.BLOB;
import static org.jooq.impl.SQLDataType.CLOB;
import static org.jooq.impl.SQLDataType.JSON;
import static org.jooq.impl.SQLDataType.JSONB;
import static org.jooq.impl.SQLDataType.VARCHAR;
import static org.jooq.impl.SQLDataType.XML;
import static org.jooq.impl.Tools.DataCacheKey.DATA_REFLECTION_CACHE_GET_ANNOTATED_GETTER;
import static org.jooq.impl.Tools.DataCacheKey.DATA_REFLECTION_CACHE_GET_ANNOTATED_MEMBERS;
import static org.jooq.impl.Tools.DataCacheKey.DATA_REFLECTION_CACHE_GET_ANNOTATED_SETTERS;
@ -3124,6 +3127,38 @@ final class Tools {
return null;
}
static final int degree(Select<?> select) {
return select.getSelect().size();
}
static final DataType<?> scalarType(Select<?> select) {
List<Field<?>> list = select.getSelect();
if (list.size() != 1)
throw new IllegalStateException("Only single-column selects have a scalar type");
return list.get(0).getDataType();
}
/**
* Add primary key conditions to a query
*/