diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/Constants.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Constants.java index be813aa4f0..b26b395520 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Constants.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Constants.java @@ -79,7 +79,7 @@ public final class Constants { /** * The current jooq-runtime XSD file name. */ - public static final String XSD_RUNTIME = "jooq-runtime-3.20.0.xsd"; + public static final String XSD_RUNTIME = "jooq-runtime-3.20.3.xsd"; /** * The current jooq-runtime XML namespace. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Constants.java b/jOOQ-meta/src/main/java/org/jooq/meta/Constants.java index 866c116f5a..4167f6c34e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Constants.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Constants.java @@ -79,7 +79,7 @@ public final class Constants { /** * The current jooq-runtime XSD file name. */ - public static final String XSD_RUNTIME = "jooq-runtime-3.20.0.xsd"; + public static final String XSD_RUNTIME = "jooq-runtime-3.20.3.xsd"; /** * The current jooq-runtime XML namespace. diff --git a/jOOQ/src/main/java/org/jooq/Constants.java b/jOOQ/src/main/java/org/jooq/Constants.java index bb8590840f..fc10a5d98c 100644 --- a/jOOQ/src/main/java/org/jooq/Constants.java +++ b/jOOQ/src/main/java/org/jooq/Constants.java @@ -79,7 +79,7 @@ public final class Constants { /** * The current jooq-runtime XSD file name. */ - public static final String XSD_RUNTIME = "jooq-runtime-3.20.0.xsd"; + public static final String XSD_RUNTIME = "jooq-runtime-3.20.3.xsd"; /** * The current jooq-runtime XML namespace. diff --git a/jOOQ/src/main/java/org/jooq/conf/InterpreterSearchSchema.java b/jOOQ/src/main/java/org/jooq/conf/InterpreterSearchSchema.java index 78efcfa2ca..f528c82037 100644 --- a/jOOQ/src/main/java/org/jooq/conf/InterpreterSearchSchema.java +++ b/jOOQ/src/main/java/org/jooq/conf/InterpreterSearchSchema.java @@ -28,7 +28,7 @@ public class InterpreterSearchSchema implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String catalog; @XmlElement(required = true) protected String schema; diff --git a/jOOQ/src/main/java/org/jooq/conf/MappedCatalog.java b/jOOQ/src/main/java/org/jooq/conf/MappedCatalog.java index 63e0b4ae83..c82bf16ba2 100644 --- a/jOOQ/src/main/java/org/jooq/conf/MappedCatalog.java +++ b/jOOQ/src/main/java/org/jooq/conf/MappedCatalog.java @@ -34,7 +34,7 @@ public class MappedCatalog implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String input; @XmlElement(type = String.class) @XmlJavaTypeAdapter(RegexAdapter.class) diff --git a/jOOQ/src/main/java/org/jooq/conf/MappedSchema.java b/jOOQ/src/main/java/org/jooq/conf/MappedSchema.java index 7c817447a9..09c9a4060e 100644 --- a/jOOQ/src/main/java/org/jooq/conf/MappedSchema.java +++ b/jOOQ/src/main/java/org/jooq/conf/MappedSchema.java @@ -34,7 +34,7 @@ public class MappedSchema implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String input; @XmlElement(type = String.class) @XmlJavaTypeAdapter(RegexAdapter.class) diff --git a/jOOQ/src/main/java/org/jooq/conf/MappedTable.java b/jOOQ/src/main/java/org/jooq/conf/MappedTable.java index e24920c329..84811ba131 100644 --- a/jOOQ/src/main/java/org/jooq/conf/MappedTable.java +++ b/jOOQ/src/main/java/org/jooq/conf/MappedTable.java @@ -30,7 +30,7 @@ public class MappedTable implements Serializable, Cloneable, MappedSchemaObject, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String input; @XmlElement(type = String.class) @XmlJavaTypeAdapter(RegexAdapter.class) diff --git a/jOOQ/src/main/java/org/jooq/conf/MappedUDT.java b/jOOQ/src/main/java/org/jooq/conf/MappedUDT.java index 9e5e647c1d..e230c05dae 100644 --- a/jOOQ/src/main/java/org/jooq/conf/MappedUDT.java +++ b/jOOQ/src/main/java/org/jooq/conf/MappedUDT.java @@ -30,7 +30,7 @@ public class MappedUDT implements Serializable, Cloneable, MappedSchemaObject, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String input; @XmlElement(type = String.class) @XmlJavaTypeAdapter(RegexAdapter.class) diff --git a/jOOQ/src/main/java/org/jooq/conf/MigrationSchema.java b/jOOQ/src/main/java/org/jooq/conf/MigrationSchema.java index b099a01abe..8dd8bcf3fb 100644 --- a/jOOQ/src/main/java/org/jooq/conf/MigrationSchema.java +++ b/jOOQ/src/main/java/org/jooq/conf/MigrationSchema.java @@ -28,7 +28,7 @@ public class MigrationSchema implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String catalog; @XmlElement(required = true) protected String schema; diff --git a/jOOQ/src/main/java/org/jooq/conf/ObjectFactory.java b/jOOQ/src/main/java/org/jooq/conf/ObjectFactory.java index f1340d05cf..d647b1acde 100644 --- a/jOOQ/src/main/java/org/jooq/conf/ObjectFactory.java +++ b/jOOQ/src/main/java/org/jooq/conf/ObjectFactory.java @@ -24,7 +24,7 @@ import javax.xml.namespace.QName; @XmlRegistry public class ObjectFactory { - private final static QName _Settings_QNAME = new QName("http://www.jooq.org/xsd/jooq-runtime-3.20.0.xsd", "settings"); + private final static QName _Settings_QNAME = new QName("http://www.jooq.org/xsd/jooq-runtime-3.20.3.xsd", "settings"); /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.jooq.conf @@ -121,7 +121,7 @@ public class ObjectFactory { * @return * the new instance of {@link JAXBElement }{@code <}{@link Settings }{@code >} */ - @XmlElementDecl(namespace = "http://www.jooq.org/xsd/jooq-runtime-3.20.0.xsd", name = "settings") + @XmlElementDecl(namespace = "http://www.jooq.org/xsd/jooq-runtime-3.20.3.xsd", name = "settings") public JAXBElement createSettings(Settings value) { return new JAXBElement(_Settings_QNAME, Settings.class, null, value); } diff --git a/jOOQ/src/main/java/org/jooq/conf/ParseSearchSchema.java b/jOOQ/src/main/java/org/jooq/conf/ParseSearchSchema.java index 448401cafa..b56fde9cac 100644 --- a/jOOQ/src/main/java/org/jooq/conf/ParseSearchSchema.java +++ b/jOOQ/src/main/java/org/jooq/conf/ParseSearchSchema.java @@ -28,7 +28,7 @@ public class ParseSearchSchema implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String catalog; @XmlElement(required = true) protected String schema; diff --git a/jOOQ/src/main/java/org/jooq/conf/RenderFormatting.java b/jOOQ/src/main/java/org/jooq/conf/RenderFormatting.java index 92d82d065d..b85d4b2436 100644 --- a/jOOQ/src/main/java/org/jooq/conf/RenderFormatting.java +++ b/jOOQ/src/main/java/org/jooq/conf/RenderFormatting.java @@ -28,7 +28,7 @@ public class RenderFormatting implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; @XmlElement(defaultValue = "\n") protected String newline = "\n"; @XmlElement(defaultValue = " ") diff --git a/jOOQ/src/main/java/org/jooq/conf/RenderMapping.java b/jOOQ/src/main/java/org/jooq/conf/RenderMapping.java index 50d5c61532..3b50fbc67e 100644 --- a/jOOQ/src/main/java/org/jooq/conf/RenderMapping.java +++ b/jOOQ/src/main/java/org/jooq/conf/RenderMapping.java @@ -32,7 +32,7 @@ public class RenderMapping implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; protected String defaultCatalog; protected String defaultSchema; @XmlElementWrapper(name = "catalogs") diff --git a/jOOQ/src/main/java/org/jooq/conf/Settings.java b/jOOQ/src/main/java/org/jooq/conf/Settings.java index 54de1d9190..38d87c838d 100644 --- a/jOOQ/src/main/java/org/jooq/conf/Settings.java +++ b/jOOQ/src/main/java/org/jooq/conf/Settings.java @@ -36,7 +36,7 @@ public class Settings implements Serializable, Cloneable, XMLAppendable { - private final static long serialVersionUID = 31900L; + private final static long serialVersionUID = 32003L; @XmlElement(defaultValue = "true") protected Boolean forceIntegerTypesOnZeroScaleDecimals = true; @XmlElement(defaultValue = "true") @@ -449,6 +449,8 @@ public class Settings @XmlSchemaType(name = "string") protected NestedCollectionEmulation emulateMultiset = NestedCollectionEmulation.DEFAULT; @XmlElement(defaultValue = "false") + protected Boolean emulateNestedRecordProjectionsUsingMultisetEmulation = false; + @XmlElement(defaultValue = "false") protected Boolean emulateComputedColumns = false; @XmlElement(defaultValue = "true") protected Boolean computedOnClientVirtual = true; @@ -5893,6 +5895,30 @@ public class Settings this.emulateMultiset = value; } + /** + * [#13598] Whether nested record projections at the top level should be emulated using the MULTISET emulation rather than the flattening emulation, if supported by the dialect. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isEmulateNestedRecordProjectionsUsingMultisetEmulation() { + return emulateNestedRecordProjectionsUsingMultisetEmulation; + } + + /** + * [#13598] Whether nested record projections at the top level should be emulated using the MULTISET emulation rather than the flattening emulation, if supported by the dialect. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setEmulateNestedRecordProjectionsUsingMultisetEmulation(Boolean value) { + this.emulateNestedRecordProjectionsUsingMultisetEmulation = value; + } + /** * [#13418] Whether computed columns should be emulated in the client. *

@@ -9293,6 +9319,15 @@ public class Settings return this; } + /** + * [#13598] Whether nested record projections at the top level should be emulated using the MULTISET emulation rather than the flattening emulation, if supported by the dialect. + * + */ + public Settings withEmulateNestedRecordProjectionsUsingMultisetEmulation(Boolean value) { + setEmulateNestedRecordProjectionsUsingMultisetEmulation(value); + return this; + } + /** * [#13418] Whether computed columns should be emulated in the client. *

@@ -10007,6 +10042,7 @@ public class Settings builder.append("delimiter", delimiter); builder.append("emulateOnDuplicateKeyUpdateOnPrimaryKeyOnly", emulateOnDuplicateKeyUpdateOnPrimaryKeyOnly); builder.append("emulateMultiset", emulateMultiset); + builder.append("emulateNestedRecordProjectionsUsingMultisetEmulation", emulateNestedRecordProjectionsUsingMultisetEmulation); builder.append("emulateComputedColumns", emulateComputedColumns); builder.append("computedOnClientVirtual", computedOnClientVirtual); builder.append("computedOnClientStored", computedOnClientStored); @@ -11736,6 +11772,15 @@ public class Settings return false; } } + if (emulateNestedRecordProjectionsUsingMultisetEmulation == null) { + if (other.emulateNestedRecordProjectionsUsingMultisetEmulation!= null) { + return false; + } + } else { + if (!emulateNestedRecordProjectionsUsingMultisetEmulation.equals(other.emulateNestedRecordProjectionsUsingMultisetEmulation)) { + return false; + } + } if (emulateComputedColumns == null) { if (other.emulateComputedColumns!= null) { return false; @@ -12395,6 +12440,7 @@ public class Settings result = ((prime*result)+((delimiter == null)? 0 :delimiter.hashCode())); result = ((prime*result)+((emulateOnDuplicateKeyUpdateOnPrimaryKeyOnly == null)? 0 :emulateOnDuplicateKeyUpdateOnPrimaryKeyOnly.hashCode())); result = ((prime*result)+((emulateMultiset == null)? 0 :emulateMultiset.hashCode())); + result = ((prime*result)+((emulateNestedRecordProjectionsUsingMultisetEmulation == null)? 0 :emulateNestedRecordProjectionsUsingMultisetEmulation.hashCode())); result = ((prime*result)+((emulateComputedColumns == null)? 0 :emulateComputedColumns.hashCode())); result = ((prime*result)+((computedOnClientVirtual == null)? 0 :computedOnClientVirtual.hashCode())); result = ((prime*result)+((computedOnClientStored == null)? 0 :computedOnClientStored.hashCode())); diff --git a/jOOQ/src/main/java/org/jooq/conf/package-info.java b/jOOQ/src/main/java/org/jooq/conf/package-info.java index f8df3971f8..e3e3b3c3c2 100644 --- a/jOOQ/src/main/java/org/jooq/conf/package-info.java +++ b/jOOQ/src/main/java/org/jooq/conf/package-info.java @@ -1,2 +1,2 @@ -@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://www.jooq.org/xsd/jooq-runtime-3.20.0.xsd", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) +@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://www.jooq.org/xsd/jooq-runtime-3.20.3.xsd", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) package org.jooq.conf; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index d86da48f21..aab77b646e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -222,6 +222,13 @@ abstract class AbstractContext> extends AbstractScope imple else return new DefaultScopeStackElement(k, v); }); + + if (TRUE.equals(configuration.settings().isEmulateNestedRecordProjectionsUsingMultisetEmulation())) { + data(DATA_MULTISET_CONTENT, true); + + if (ctx != null) + ctx.data(DATA_MULTISET_CONTENT, true); + } } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRowAsField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRowAsField.java index 2979b9cad0..25f146002c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRowAsField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRowAsField.java @@ -124,6 +124,7 @@ implements // All types of row expressions must be emulated using MULTISET // emulations if nested in some sort of MULTISET content + // [#13598] Users can also override the default behaviour TRUE.equals(ctx.data(DATA_MULTISET_CONTENT)) // Row expressions of degree > 1 must also be emulated using MULTISET diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index f5ce196aee..bfdc2720ba 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -4471,6 +4471,8 @@ public class DefaultBinding implements Binding { @Override final Record get0(BindingGetResultSetContext ctx) throws SQLException { + boolean skipDegree1 = !TRUE.equals(ctx.settings().isEmulateNestedRecordProjectionsUsingMultisetEmulation()); + switch (ctx.family()) { @@ -4479,7 +4481,7 @@ public class DefaultBinding implements Binding { // [#17979] Native ROW support may be overridden for various reasons if (TRUE.equals(ctx.executeContext().data(DATA_MULTISET_CONTENT))) - return readMultiset(ctx, dataType, true); + return readMultiset(ctx, dataType, skipDegree1); else return pgNewRecord(ctx, dataType.getType(), @@ -4495,14 +4497,14 @@ public class DefaultBinding implements Binding { if (object == null) return null; - return readMultiset(ctx, dataType, !(object instanceof Struct)); + return readMultiset(ctx, dataType, skipDegree1 && !(object instanceof Struct)); } default: if (UDTRecord.class.isAssignableFrom(dataType.getType())) return localExecuteContext(ctx.executeContext(), () -> (Record) ctx.resultSet().getObject(ctx.index(), typeMap(dataType.getType(), ctx))); else - return readMultiset(ctx, dataType, true); + return readMultiset(ctx, dataType, skipDegree1); } } diff --git a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.20.0.xsd b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.20.3.xsd similarity index 99% rename from jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.20.0.xsd rename to jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.20.3.xsd index b0eb124362..abfb22c263 100644 --- a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.20.0.xsd +++ b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.20.3.xsd @@ -1,10 +1,10 @@ @@ -1473,6 +1473,10 @@ jOOQ queries, for which no specific fetchSize value was specified.]]> MULTISET support should be emulated.]]> + + + MULTISET emulation rather than the flattening emulation, if supported by the dialect.]]> +