[jOOQ/jOOQ#12187] The XML MULTISET_AGG emulation doesn't work with unnamed bind values in Db2

This commit is contained in:
Lukas Eder 2021-07-14 15:42:00 +02:00
parent 4caea0581c
commit 61ca24dffa
3 changed files with 8 additions and 12 deletions

View File

@ -258,7 +258,7 @@ final class Multiset<R extends Record> extends AbstractField<Result<R>> {
XMLAggOrderByStep<XML> order;
AggregateFilterStep<XML> filter;
filter = order = xmlaggEmulation(select, multisetCondition, false);
filter = order = xmlaggEmulation(select, false);
// TODO: Re-apply derived table's ORDER BY clause as aggregate ORDER BY
if (multisetCondition)
@ -385,11 +385,11 @@ final class Multiset<R extends Record> extends AbstractField<Result<R>> {
)
: field;
}
static final XMLAggOrderByStep<XML> xmlaggEmulation(Fields fields, boolean multisetCondition, boolean agg) {
static final XMLAggOrderByStep<XML> xmlaggEmulation(Fields fields, boolean agg) {
return xmlagg(
xmlelement(N_RECORD,
map(fields.fields(), (f, i) -> xmlelement(
multisetCondition ? fieldNameString(i) : f.getName(),
fieldNameString(i),
agg ? f : DSL.field(fieldName(i), f.getDataType())
))
)

View File

@ -137,7 +137,7 @@ final class MultisetAgg<R extends Record> extends DefaultAggregateFunction<Resul
}
case XML: {
XMLAggOrderByStep<XML> order = xmlaggEmulation(row, multisetCondition, true);
XMLAggOrderByStep<XML> order = xmlaggEmulation(row, true);
Field<XML> f = xmlelement(N_RESULT,
multisetCondition

View File

@ -208,13 +208,8 @@ final class XMLHandler<R extends Record> extends DefaultHandler {
else
fieldName = qName;
Field<?> f;
if (s.row != null)
if ((f = s.row.field(fieldName)) != null)
s.fields.add(f);
else
s.fields.add(s.row.field(s.fields.size()));
s.fields.add(s.row.field(s.fields.size()));
else
s.fields.add(field(name(fieldName), VARCHAR));
}
@ -233,7 +228,7 @@ final class XMLHandler<R extends Record> extends DefaultHandler {
if (log.isDebugEnabled())
log.debug("< " + qName);
if (s.inResult && s.inRecord == 0 && "result".equalsIgnoreCase(qName)) {
if (states.isEmpty() && s.inResult && s.inRecord == 0 && "result".equalsIgnoreCase(qName)) {
s.inResult = false;
}
else if (s.inResult && s.inFields && "fields".equalsIgnoreCase(qName)) {
@ -269,10 +264,11 @@ final class XMLHandler<R extends Record> extends DefaultHandler {
s = states.pop();
break x;
}
else if (f.getName().equals(qName) && f.getDataType().isMultiset()) {
else if ("result".equalsIgnoreCase(qName) && f.getDataType().isMultiset()) {
initResult();
peek.values.add(s.result);
s = states.pop();
break x;
}
}