diff --git a/jOOQ/src/main/java/org/jooq/conf/Settings.java b/jOOQ/src/main/java/org/jooq/conf/Settings.java
index bdd0ac3250..4bd691aec2 100644
--- a/jOOQ/src/main/java/org/jooq/conf/Settings.java
+++ b/jOOQ/src/main/java/org/jooq/conf/Settings.java
@@ -145,6 +145,8 @@ public class Settings
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsUnnecessaryDistinct = true;
@XmlElement(defaultValue = "true")
+ protected Boolean transformPatternsUnnecessaryExistsSubqueryClauses = true;
+ @XmlElement(defaultValue = "true")
protected Boolean transformPatternsCountConstant = true;
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsTrim = true;
@@ -1677,6 +1679,43 @@ public class Settings
this.transformPatternsUnnecessaryDistinct = value;
}
+ /**
+ * Transform [ NOT ] EXISTS (SELECT DISTINCT a, b FROM t ORDER BY c LIMIT d) to [ NOT ] EXISTS (SELECT 1 FROM t).
+ *
+ * In EXISTS subqueries, quite a few SELECT clauses are meaningless, and can
+ * thus be removed. These include:
+ *
SELECT (any projection can be ignored)DISTINCTORDER BYLIMIT (except LIMIT 0, in case of which {@link #transformPatternsTrivialPredicates} applies).+ * To enable this feature, {@link #transformPatterns} must be enabled as well. + *
+ * This feature is available in the commercial distribution only.
+ *
+ * @return
+ * possible object is
+ * {@link Boolean }
+ *
+ */
+ public Boolean isTransformPatternsUnnecessaryExistsSubqueryClauses() {
+ return transformPatternsUnnecessaryExistsSubqueryClauses;
+ }
+
+ /**
+ * Sets the value of the transformPatternsUnnecessaryExistsSubqueryClauses property.
+ *
+ * @param value
+ * allowed object is
+ * {@link Boolean }
+ *
+ */
+ public void setTransformPatternsUnnecessaryExistsSubqueryClauses(Boolean value) {
+ this.transformPatternsUnnecessaryExistsSubqueryClauses = value;
+ }
+
/**
* Transform COUNT(1) or any other COUNT(const) to COUNT(*).
*
@@ -5367,6 +5406,11 @@ public class Settings
return this;
}
+ public Settings withTransformPatternsUnnecessaryExistsSubqueryClauses(Boolean value) {
+ setTransformPatternsUnnecessaryExistsSubqueryClauses(value);
+ return this;
+ }
+
public Settings withTransformPatternsCountConstant(Boolean value) {
setTransformPatternsCountConstant(value);
return this;
@@ -6455,6 +6499,7 @@ public class Settings
builder.append("transformPatterns", transformPatterns);
builder.append("transformPatternsLogging", transformPatternsLogging);
builder.append("transformPatternsUnnecessaryDistinct", transformPatternsUnnecessaryDistinct);
+ builder.append("transformPatternsUnnecessaryExistsSubqueryClauses", transformPatternsUnnecessaryExistsSubqueryClauses);
builder.append("transformPatternsCountConstant", transformPatternsCountConstant);
builder.append("transformPatternsTrim", transformPatternsTrim);
builder.append("transformPatternsNotNot", transformPatternsNotNot);
@@ -7040,6 +7085,15 @@ public class Settings
return false;
}
}
+ if (transformPatternsUnnecessaryExistsSubqueryClauses == null) {
+ if (other.transformPatternsUnnecessaryExistsSubqueryClauses!= null) {
+ return false;
+ }
+ } else {
+ if (!transformPatternsUnnecessaryExistsSubqueryClauses.equals(other.transformPatternsUnnecessaryExistsSubqueryClauses)) {
+ return false;
+ }
+ }
if (transformPatternsCountConstant == null) {
if (other.transformPatternsCountConstant!= null) {
return false;
@@ -8363,6 +8417,7 @@ public class Settings
result = ((prime*result)+((transformPatterns == null)? 0 :transformPatterns.hashCode()));
result = ((prime*result)+((transformPatternsLogging == null)? 0 :transformPatternsLogging.hashCode()));
result = ((prime*result)+((transformPatternsUnnecessaryDistinct == null)? 0 :transformPatternsUnnecessaryDistinct.hashCode()));
+ result = ((prime*result)+((transformPatternsUnnecessaryExistsSubqueryClauses == null)? 0 :transformPatternsUnnecessaryExistsSubqueryClauses.hashCode()));
result = ((prime*result)+((transformPatternsCountConstant == null)? 0 :transformPatternsCountConstant.hashCode()));
result = ((prime*result)+((transformPatternsTrim == null)? 0 :transformPatternsTrim.hashCode()));
result = ((prime*result)+((transformPatternsNotNot == null)? 0 :transformPatternsNotNot.hashCode()));
diff --git a/jOOQ/src/main/java/org/jooq/impl/Patterns.java b/jOOQ/src/main/java/org/jooq/impl/Patterns.java
index 3f04a6ac50..babc144da4 100644
--- a/jOOQ/src/main/java/org/jooq/impl/Patterns.java
+++ b/jOOQ/src/main/java/org/jooq/impl/Patterns.java
@@ -2021,6 +2021,45 @@ package org.jooq.impl;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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.18.0.xsd
index d5aa2b07bf..66523ec829 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.18.0.xsd
@@ -400,6 +400,23 @@ To enable this feature, {@link #transformPatterns} must be enabled as well.
This feature is available in the commercial distribution only.]]>
+
+In
+To enable this feature, {@link #transformPatterns} must be enabled as well.
+
+This feature is available in the commercial distribution only.]]>
[ NOT ] EXISTS (SELECT 1 FROM t).
+EXISTS subqueries, quite a few SELECT clauses are meaningless, and can
+thus be removed. These include:
+
+
+SELECT (any projection can be ignored)DISTINCTORDER BYLIMIT (except LIMIT 0, in case of which {@link #transformPatternsTrivialPredicates} applies).COUNT(const) to COUNT(*).