From 5201a73d9caea79d1aa176a4244aa000c76a9175 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 20 Mar 2020 14:38:22 +0100 Subject: [PATCH] [jOOQ/jOOQ#9925] Added DB2 support --- .../java/org/jooq/XMLExistsPassingStep.java | 1 + jOOQ/src/main/java/org/jooq/impl/Alias.java | 9 ++++- jOOQ/src/main/java/org/jooq/impl/DSL.java | 3 +- .../main/java/org/jooq/impl/ParserImpl.java | 3 +- jOOQ/src/main/java/org/jooq/impl/Tools.java | 5 +++ jOOQ/src/main/java/org/jooq/impl/XMLAgg.java | 3 +- .../java/org/jooq/impl/XMLAttributesImpl.java | 5 ++- .../main/java/org/jooq/impl/XMLExists.java | 22 +++++++++-- .../main/java/org/jooq/impl/XMLForest.java | 3 ++ jOOQ/src/main/java/org/jooq/impl/XMLPI.java | 2 +- .../src/main/java/org/jooq/impl/XMLParse.java | 38 ++++++++++++++++++- 11 files changed, 84 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/XMLExistsPassingStep.java b/jOOQ/src/main/java/org/jooq/XMLExistsPassingStep.java index 8d471534e8..38e491e8a4 100644 --- a/jOOQ/src/main/java/org/jooq/XMLExistsPassingStep.java +++ b/jOOQ/src/main/java/org/jooq/XMLExistsPassingStep.java @@ -37,6 +37,7 @@ */ package org.jooq; +// ... import static org.jooq.SQLDialect.POSTGRES; /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index 6fff2b9d23..164d255345 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -74,6 +74,7 @@ import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.select; import static org.jooq.impl.Keywords.K_AS; +import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED; import static org.jooq.impl.Tools.BooleanDataKey.DATA_UNALIAS_ALIASED_EXPRESSIONS; import java.util.Set; @@ -284,7 +285,13 @@ final class Alias extends AbstractQueryPart { } void toSQLAs(Context ctx) { - if (wrapped instanceof Field) { + + // [#9925] In some cases, AS is always required, regardless + // of the dialect or settings (e.g. XMLATTRIBUTES). + if (TRUE.equals(ctx.data(DATA_AS_REQUIRED))) { + ctx.sql(' ').visit(K_AS); + } + else if (wrapped instanceof Field) { if (ctx.settings().getRenderOptionalAsKeywordForFieldAliases() == RenderOptionalKeyword.DEFAULT && SUPPORT_AS_REQUIRED.contains(ctx.family())) ctx.sql(' ').visit(K_AS); else if (ctx.settings().getRenderOptionalAsKeywordForFieldAliases() == RenderOptionalKeyword.ON) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 0a45819fe4..f34f72ed1b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -390,6 +390,7 @@ import org.jooq.WithAsStep8; import org.jooq.WithAsStep9; import org.jooq.WithStep; import org.jooq.XML; +import org.jooq.XMLAggOrderByStep; import org.jooq.XMLAttributes; import org.jooq.XMLExistsPassingStep; import org.jooq.conf.Settings; @@ -18292,7 +18293,7 @@ public class DSL { * The XML aggregate function. */ @Support({ POSTGRES }) - public static ArrayAggOrderByStep xmlagg(Field field) { + public static XMLAggOrderByStep xmlagg(Field field) { return new XMLAgg(field); } diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 5cfc0f29df..57c6010943 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -513,6 +513,7 @@ import org.jooq.WindowSpecificationOrderByStep; import org.jooq.WindowSpecificationRowsAndStep; import org.jooq.WindowSpecificationRowsStep; import org.jooq.XML; +import org.jooq.XMLAggOrderByStep; import org.jooq.XMLAttributes; import org.jooq.conf.ParseSearchSchema; import org.jooq.conf.ParseUnknownFunctions; @@ -6854,7 +6855,7 @@ final class ParserImpl implements Parser { private static final AggregateFilterStep parseXMLAggFunctionIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "XMLAGG")) { - ArrayAggOrderByStep s1; + XMLAggOrderByStep s1; AggregateFilterStep s2; parse(ctx, '('); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 14ad72c7bb..1feaa861b5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -496,6 +496,11 @@ final class Tools { * [#1535] We're currently generating the window specification of a ranking function. */ DATA_ORDERED_WINDOW_FUNCTION, + + /** + * [#9925] In some cases the AS keyword is required for aliasing, e.g. XML. + */ + DATA_AS_REQUIRED } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLAgg.java b/jOOQ/src/main/java/org/jooq/impl/XMLAgg.java index b4dd0672d8..8f58742164 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLAgg.java @@ -42,6 +42,7 @@ import static org.jooq.impl.Names.N_XMLAGG; import org.jooq.Context; import org.jooq.Field; import org.jooq.XML; +import org.jooq.XMLAggOrderByStep; /** @@ -49,7 +50,7 @@ import org.jooq.XML; * * @author Lukas Eder */ -final class XMLAgg extends AbstractAggregateFunction { +final class XMLAgg extends AbstractAggregateFunction implements XMLAggOrderByStep { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java b/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java index 51c38741ca..770f638287 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static org.jooq.impl.Names.N_XMLATTRIBUTES; +import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED; import java.util.Collection; @@ -53,7 +54,7 @@ final class XMLAttributesImpl extends AbstractQueryPart implements XMLAttributes /** * Generated UID */ - private static final long serialVersionUID = 1887555231334164185L; + private static final long serialVersionUID = 1887555231334164185L; final SelectFieldList> attributes; @@ -66,6 +67,7 @@ final class XMLAttributesImpl extends AbstractQueryPart implements XMLAttributes boolean declareFields = ctx.declareFields(); boolean format = attributes.size() > 1; + Object previous = ctx.data(DATA_AS_REQUIRED, true); ctx.visit(N_XMLATTRIBUTES).sql('('); if (format) @@ -81,5 +83,6 @@ final class XMLAttributesImpl extends AbstractQueryPart implements XMLAttributes .formatNewLine(); ctx.sql(')'); + ctx.data(DATA_AS_REQUIRED, previous); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLExists.java b/jOOQ/src/main/java/org/jooq/impl/XMLExists.java index 1994cb5482..2b7c025715 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLExists.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLExists.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +// ... +import static org.jooq.conf.ParamType.INLINED; import static org.jooq.impl.Keywords.K_BY; import static org.jooq.impl.Keywords.K_PASSING; import static org.jooq.impl.Keywords.K_REF; @@ -50,6 +52,7 @@ import org.jooq.Context; import org.jooq.Field; import org.jooq.XML; import org.jooq.XMLExistsPassingStep; +import org.jooq.conf.ParamType; /** * @author Lukas Eder @@ -117,9 +120,22 @@ final class XMLExists extends AbstractCondition implements XMLExistsPassingStep public final void accept(Context ctx) { ctx.visit(K_XMLEXISTS).sql('(') .formatIndentStart() - .formatNewLine() - .visit(xpath) - .formatSeparator() + .formatNewLine(); + + + + + + + + + + + + + ctx.visit(xpath); + + ctx.formatSeparator() .visit(K_PASSING); if (passingMechanism == BY_REF) diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLForest.java b/jOOQ/src/main/java/org/jooq/impl/XMLForest.java index 50629a704a..3fb91c83a2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLForest.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLForest.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static org.jooq.impl.Names.N_XMLFOREST; +import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED; import java.util.Collection; @@ -66,10 +67,12 @@ final class XMLForest extends AbstractField { public final void accept(Context ctx) { boolean declareFields = ctx.declareFields(); + Object previous = ctx.data(DATA_AS_REQUIRED, true); ctx.visit(N_XMLFOREST).sql('(') .declareFields(true) .visit(args) .declareFields(declareFields) .sql(')'); + ctx.data(DATA_AS_REQUIRED, previous); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLPI.java b/jOOQ/src/main/java/org/jooq/impl/XMLPI.java index b267aa9a63..8d50aa705e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLPI.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLPI.java @@ -67,7 +67,7 @@ final class XMLPI extends AbstractField { @Override public final void accept(Context ctx) { - ctx.visit(N_XMLPI).sql('(').visit(K_NAME).sql(' ').visit(target.unquotedName()); + ctx.visit(N_XMLPI).sql('(').visit(K_NAME).sql(' ').visit(target); if (content != null) ctx.sql(", ").visit(content); diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLParse.java b/jOOQ/src/main/java/org/jooq/impl/XMLParse.java index c02d07707b..cc4e4ad40e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLParse.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLParse.java @@ -37,9 +37,12 @@ */ package org.jooq.impl; +import static org.jooq.impl.DSL.inline; +import static org.jooq.impl.DSL.xmlparseDocument; import static org.jooq.impl.Keywords.K_CONTENT; import static org.jooq.impl.Keywords.K_DOCUMENT; import static org.jooq.impl.Names.N_XMLPARSE; +import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.XMLParse.DocumentOrContent.DOCUMENT; import org.jooq.Context; @@ -67,7 +70,40 @@ final class XMLParse extends AbstractField { @Override public final void accept(Context ctx) { - ctx.visit(N_XMLPARSE).sql('(').visit(documentOrContent == DOCUMENT ? K_DOCUMENT : K_CONTENT).sql(' ').visit(content).sql(')'); + switch (ctx.family()) { + + + + + + + + + + + + + + + + + + case POSTGRES: + default: + acceptStandard(ctx, documentOrContent, content); + break; + } + } + + private static final void acceptStandard( + Context ctx, + DocumentOrContent documentOrContent, + Field content + ) { + ctx.visit(N_XMLPARSE).sql('(') + .visit(documentOrContent == DOCUMENT ? K_DOCUMENT : K_CONTENT).sql(' ') + .visit(content) + .sql(')'); } enum DocumentOrContent { DOCUMENT, CONTENT }