[jOOQ/jOOQ#12044] Correctly emulate XMLAGG(...) FILTER (WHERE ...) in Db2, Oracle, Teradata

This commit is contained in:
Lukas Eder 2021-06-23 11:56:58 +02:00
parent c1431efdd5
commit 339ce915c5
7 changed files with 64 additions and 3 deletions

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.Names.N_XMLAGG;
import org.jooq.Context;
@ -46,8 +47,6 @@ import org.jooq.XMLAggOrderByStep;
/**
* The JSON array constructor.
*
* @author Lukas Eder
*/
final class XMLAgg extends AbstractAggregateFunction<XML> implements XMLAggOrderByStep<XML> {
@ -58,7 +57,19 @@ final class XMLAgg extends AbstractAggregateFunction<XML> implements XMLAggOrder
@Override
public void accept(Context<?> ctx) {
ctx.visit(N_XMLAGG).sql('(').visit(arguments);
ctx.visit(N_XMLAGG).sql('(');
acceptArguments0(ctx);
acceptOrderBy(ctx);
ctx.sql(')');

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.Names.N_XMLATTRIBUTES;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED;
@ -59,6 +60,13 @@ final class XMLAttributesImpl extends AbstractQueryPart implements XMLAttributes
@Override
public final void accept(Context<?> ctx) {
boolean format = attributes.size() > 1;
ctx.data(DATA_AS_REQUIRED, true, c -> {

View File

@ -87,6 +87,11 @@ extends
@Override
public final void accept(Context<?> ctx) {
ctx.visit(N_XMLCOMMENT).sql('(').visit(comment).sql(')');
}

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.Names.N_XMLCONCAT;
import java.util.Collection;
@ -59,6 +60,13 @@ final class XMLConcat extends AbstractField<XML> {
@Override
public final void accept(Context<?> ctx) {
ctx.visit(N_XMLCONCAT).sql('(').visit(args).sql(')');
}
}

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.Names.N_XMLDOCUMENT;
import org.jooq.Context;
@ -58,6 +59,13 @@ final class XMLDocument extends AbstractField<XML> {
@Override
public final void accept(Context<?> ctx) {
ctx.visit(N_XMLDOCUMENT).sql('(').visit(content).sql(')');
}
}

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.Keywords.K_NAME;
import static org.jooq.impl.Names.N_XMLCONCAT;
import static org.jooq.impl.Names.N_XMLELEMENT;
@ -69,6 +70,21 @@ final class XMLElement extends AbstractField<XML> {
@Override
public final void accept(Context<?> ctx) {
boolean hasAttributes = attributes != null && !((XMLAttributesImpl) attributes).attributes.isEmpty();
boolean hasContent = !content.isEmpty();
boolean format = hasAttributes || hasContent;

View File

@ -87,6 +87,11 @@ extends
@Override
public final void accept(Context<?> ctx) {
ctx.data(DATA_AS_REQUIRED, true,
c -> c.visit(N_XMLFOREST).sql('(')
.declareFields(true, x -> x.visit(new SelectFieldList<>(fields)))