From 61ca24dffaa5098547bcba3e964ca19da154e723 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 14 Jul 2021 15:42:00 +0200 Subject: [PATCH] [jOOQ/jOOQ#12187] The XML MULTISET_AGG emulation doesn't work with unnamed bind values in Db2 --- jOOQ/src/main/java/org/jooq/impl/Multiset.java | 6 +++--- jOOQ/src/main/java/org/jooq/impl/MultisetAgg.java | 2 +- jOOQ/src/main/java/org/jooq/impl/XMLHandler.java | 12 ++++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index 955412dbaf..fddf9e9cd3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -258,7 +258,7 @@ final class Multiset extends AbstractField> { XMLAggOrderByStep order; AggregateFilterStep 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 extends AbstractField> { ) : field; } - static final XMLAggOrderByStep xmlaggEmulation(Fields fields, boolean multisetCondition, boolean agg) { + static final XMLAggOrderByStep 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()) )) ) diff --git a/jOOQ/src/main/java/org/jooq/impl/MultisetAgg.java b/jOOQ/src/main/java/org/jooq/impl/MultisetAgg.java index 26974085b7..50b619f91b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MultisetAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/MultisetAgg.java @@ -137,7 +137,7 @@ final class MultisetAgg extends DefaultAggregateFunction order = xmlaggEmulation(row, multisetCondition, true); + XMLAggOrderByStep order = xmlaggEmulation(row, true); Field f = xmlelement(N_RESULT, multisetCondition diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLHandler.java b/jOOQ/src/main/java/org/jooq/impl/XMLHandler.java index 0aa34860be..84d8cb9e60 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLHandler.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLHandler.java @@ -208,13 +208,8 @@ final class XMLHandler 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 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 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; } }