[jOOQ/jOOQ#10565] Correctly interpret CREATE VIEW .. FOR XML

This commit is contained in:
Lukas Eder 2020-09-01 15:48:40 +02:00
parent 0e358f3970
commit 3613a37884
2 changed files with 39 additions and 17 deletions

View File

@ -50,6 +50,7 @@ import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.schema;
import static org.jooq.impl.SQLDataType.BIGINT;
import static org.jooq.impl.Tools.EMPTY_FIELD;
import static org.jooq.impl.Tools.dataTypes;
import static org.jooq.impl.Tools.intersect;
import static org.jooq.impl.Tools.normaliseNameCase;
import static org.jooq.impl.Tools.reverseIterable;
@ -810,9 +811,9 @@ final class Interpreter {
return;
}
List<DataType<?>> columnTypes = new ArrayList<>();
for (Field<?> f : (query.$select() != null ? query.$select().getSelect() : asList(query.$fields())))
columnTypes.add(f.getDataType());
List<DataType<?>> columnTypes = query.$select() != null
? dataTypes(query.$select())
: asList(dataTypes(query.$fields()));
newTable(table, schema, asList(query.$fields()), columnTypes, query.$select(), null, TableOptions.view(query.$select()));
}

View File

@ -1212,6 +1212,18 @@ final class Tools {
return result;
}
static final DataType<?>[] dataTypes(Field<?>[] fields) {
if (fields == null)
return null;
DataType<?>[] result = new DataType<?>[fields.length];
for (int i = 0; i < fields.length; i++)
result[i] = fields[i].getDataType();
return result;
}
// ------------------------------------------------------------------------
// XXX: General utility methods
// ------------------------------------------------------------------------
@ -3138,25 +3150,34 @@ final class Tools {
return select.getSelect().size();
}
static final List<DataType<?>> dataTypes(Select<?> select) {
List<DataType<?>> result = new ArrayList<>();
for (Field<?> f : select.getSelect())
result.add(f.getDataType());
return result;
}
static final DataType<?> scalarType(Select<?> select) {
List<Field<?>> list = select.getSelect();
List<DataType<?>> list = dataTypes(select);
if (list.size() != 1)
throw new IllegalStateException("Only single-column selects have a scalar type");
return list.get(0).getDataType();
return list.get(0);
}
/**