From 830e32c791ee718b1765807a1d533bcd76dd8c38 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 16 Mar 2023 12:09:51 +0100 Subject: [PATCH] [jOOQ/jOOQ#14800] Error when PostgreSQL anonymous block contains dollar quoted string token --- .../main/java/org/jooq/codegen/Constants.java | 2 +- .../main/java/org/jooq/meta/Constants.java | 2 +- jOOQ/src/main/java/org/jooq/Constants.java | 2 +- .../jooq/conf/InterpreterSearchSchema.java | 2 +- .../java/org/jooq/conf/MappedCatalog.java | 2 +- .../main/java/org/jooq/conf/MappedSchema.java | 2 +- .../main/java/org/jooq/conf/MappedTable.java | 2 +- .../java/org/jooq/conf/MigrationSchema.java | 2 +- .../java/org/jooq/conf/ParseSearchSchema.java | 2 +- .../java/org/jooq/conf/RenderFormatting.java | 2 +- .../java/org/jooq/conf/RenderMapping.java | 2 +- .../src/main/java/org/jooq/conf/Settings.java | 40 ++++++++++++++++++- .../main/java/org/jooq/impl/BlockImpl.java | 4 +- jOOQ/src/main/java/org/jooq/impl/Tools.java | 4 +- ...ime-3.18.0.xsd => jooq-runtime-3.19.0.xsd} | 8 +++- 15 files changed, 60 insertions(+), 18 deletions(-) rename jOOQ/src/main/resources/org/jooq/xsd/{jooq-runtime-3.18.0.xsd => jooq-runtime-3.19.0.xsd} (99%) 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 2589917362..faab8b8c0e 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Constants.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Constants.java @@ -74,7 +74,7 @@ public final class Constants { /** * The current jooq-runtime XSD file name. */ - public static final String XSD_RUNTIME = "jooq-runtime-3.18.0.xsd"; + public static final String XSD_RUNTIME = "jooq-runtime-3.19.0.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 57dd97f9b4..8a96d70e3b 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Constants.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Constants.java @@ -74,7 +74,7 @@ public final class Constants { /** * The current jooq-runtime XSD file name. */ - public static final String XSD_RUNTIME = "jooq-runtime-3.18.0.xsd"; + public static final String XSD_RUNTIME = "jooq-runtime-3.19.0.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 31e72c39c5..56bdc6dd90 100644 --- a/jOOQ/src/main/java/org/jooq/Constants.java +++ b/jOOQ/src/main/java/org/jooq/Constants.java @@ -74,7 +74,7 @@ public final class Constants { /** * The current jooq-runtime XSD file name. */ - public static final String XSD_RUNTIME = "jooq-runtime-3.18.0.xsd"; + public static final String XSD_RUNTIME = "jooq-runtime-3.19.0.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 5dd24cf48e..78efcfa2ca 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 = 31800L; + private final static long serialVersionUID = 31900L; 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 c5dc131855..63e0b4ae83 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 = 31800L; + private final static long serialVersionUID = 31900L; 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 06c1e01a58..4178ff59d4 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 = 31800L; + private final static long serialVersionUID = 31900L; 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 78052e4fba..266e0b3a0a 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, XMLAppendable { - private final static long serialVersionUID = 31800L; + private final static long serialVersionUID = 31900L; 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 0eba528738..b099a01abe 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 = 31800L; + private final static long serialVersionUID = 31900L; protected String catalog; @XmlElement(required = true) protected String schema; diff --git a/jOOQ/src/main/java/org/jooq/conf/ParseSearchSchema.java b/jOOQ/src/main/java/org/jooq/conf/ParseSearchSchema.java index 5d3fabfe3a..448401cafa 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 = 31800L; + private final static long serialVersionUID = 31900L; 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 cd9f9d0121..92d82d065d 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 = 31800L; + private final static long serialVersionUID = 31900L; @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 66806c2fa6..50d5c61532 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 = 31800L; + private final static long serialVersionUID = 31900L; 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 661178c0cc..f5a0aae2fd 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 = 31800L; + private final static long serialVersionUID = 31900L; @XmlElement(defaultValue = "true") protected Boolean forceIntegerTypesOnZeroScaleDecimals = true; @XmlElement(defaultValue = "true") @@ -114,6 +114,8 @@ public class Settings protected Boolean renderRedundantConditionForSeekClause = false; @XmlElement(defaultValue = "false") protected Boolean renderPlainSQLTemplatesAsRaw = false; + @XmlElement(defaultValue = "") + protected String renderDollarQuotedStringToken = ""; @XmlElement(defaultValue = ".") protected String namePathSeparator = "."; @XmlElement(defaultValue = "false") @@ -1288,6 +1290,22 @@ public class Settings this.renderPlainSQLTemplatesAsRaw = value; } + /** + * The token to place between the $$ signs of a PostgreSQL dollar quoted string generated by jOOQ. + * + */ + public String getRenderDollarQuotedStringToken() { + return renderDollarQuotedStringToken; + } + + /** + * The token to place between the $$ signs of a PostgreSQL dollar quoted string generated by jOOQ. + * + */ + public void setRenderDollarQuotedStringToken(String value) { + this.renderDollarQuotedStringToken = value; + } + /** * The character(s) to be used as a separator in paths encoded in a {@link Name} *

@@ -6125,6 +6143,15 @@ public class Settings return this; } + /** + * The token to place between the $$ signs of a PostgreSQL dollar quoted string generated by jOOQ. + * + */ + public Settings withRenderDollarQuotedStringToken(String value) { + setRenderDollarQuotedStringToken(value); + return this; + } + /** * The character(s) to be used as a separator in paths encoded in a {@link Name} *

@@ -7444,6 +7471,7 @@ public class Settings builder.append("renderRowConditionForSeekClause", renderRowConditionForSeekClause); builder.append("renderRedundantConditionForSeekClause", renderRedundantConditionForSeekClause); builder.append("renderPlainSQLTemplatesAsRaw", renderPlainSQLTemplatesAsRaw); + builder.append("renderDollarQuotedStringToken", renderDollarQuotedStringToken); builder.append("namePathSeparator", namePathSeparator); builder.append("bindOffsetDateTimeType", bindOffsetDateTimeType); builder.append("bindOffsetTimeType", bindOffsetTimeType); @@ -7936,6 +7964,15 @@ public class Settings return false; } } + if (renderDollarQuotedStringToken == null) { + if (other.renderDollarQuotedStringToken!= null) { + return false; + } + } else { + if (!renderDollarQuotedStringToken.equals(other.renderDollarQuotedStringToken)) { + return false; + } + } if (namePathSeparator == null) { if (other.namePathSeparator!= null) { return false; @@ -9622,6 +9659,7 @@ public class Settings result = ((prime*result)+((renderRowConditionForSeekClause == null)? 0 :renderRowConditionForSeekClause.hashCode())); result = ((prime*result)+((renderRedundantConditionForSeekClause == null)? 0 :renderRedundantConditionForSeekClause.hashCode())); result = ((prime*result)+((renderPlainSQLTemplatesAsRaw == null)? 0 :renderPlainSQLTemplatesAsRaw.hashCode())); + result = ((prime*result)+((renderDollarQuotedStringToken == null)? 0 :renderDollarQuotedStringToken.hashCode())); result = ((prime*result)+((namePathSeparator == null)? 0 :namePathSeparator.hashCode())); result = ((prime*result)+((bindOffsetDateTimeType == null)? 0 :bindOffsetDateTimeType.hashCode())); result = ((prime*result)+((bindOffsetTimeType == null)? 0 :bindOffsetTimeType.hashCode())); diff --git a/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java b/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java index 1b17f91156..75a7c5aeb6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java @@ -323,7 +323,7 @@ final class BlockImpl extends AbstractRowCountQuery implements Block { if (keyword != null) ctx.visit(keyword).sql(' '); - ctx.sql("$$") + ctx.sql('$').sql(ctx.settings().getRenderDollarQuotedStringToken()).sql('$') .formatSeparator() .data(DATA_FORCE_STATIC_STATEMENT, true); } @@ -332,7 +332,7 @@ final class BlockImpl extends AbstractRowCountQuery implements Block { if (decrement(ctx.data(), DATA_BLOCK_NESTING)) ctx.formatSeparator() - .sql("$$") + .sql('$').sql(ctx.settings().getRenderDollarQuotedStringToken()).sql('$') .paramType(previous); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 234f472a4d..2edbac6eec 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5047,7 +5047,7 @@ final class Tools { case POSTGRES: case YUGABYTEDB: if (increment(ctx.data(), DATA_BLOCK_NESTING)) - ctx.visit(K_DO).sql(" $$").formatSeparator(); + ctx.visit(K_DO).sql(" $").sql(ctx.settings().getRenderDollarQuotedStringToken()).sql('$').formatSeparator(); ctx.visit(K_BEGIN).formatIndentStart().formatSeparator(); break; @@ -5082,7 +5082,7 @@ final class Tools { .visit(K_END); if (decrement(ctx.data(), DATA_BLOCK_NESTING)) - ctx.sql(" $$"); + ctx.sql(" $").sql(ctx.settings().getRenderDollarQuotedStringToken()).sql('$'); break; } diff --git a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.19.0.xsd similarity index 99% rename from jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd rename to jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.19.0.xsd index aa1ab8bd74..309e482fa8 100644 --- a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd +++ b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.19.0.xsd @@ -1,10 +1,10 @@ @@ -255,6 +255,10 @@ jOOQ may help the optimiser, e.g. (a <= :a) AND (a, b) < ('a', 'b') + + $$ signs of a PostgreSQL dollar quoted string generated by jOOQ.]]> + +