diff --git a/jOOQ/src/main/java/org/jooq/Param.java b/jOOQ/src/main/java/org/jooq/Param.java index 6a8d0e7053..bb050abf4c 100644 --- a/jOOQ/src/main/java/org/jooq/Param.java +++ b/jOOQ/src/main/java/org/jooq/Param.java @@ -151,7 +151,13 @@ public interface Param extends ParamOrVariable { void setInline(boolean inline); /** - * A flag on the bind value to force it to be inlined in rendered SQL + * A flag on the bind value to force it to be inlined in rendered SQL. + *

+ * Please note that despite this flag returning false, jOOQ + * internals may decide to inline a {@link Param} at their own discretion, + * e.g. because of a limitation in the dialect's syntactic capabilities + * (e.g. some functions may require literals as arguments), or of the JDBC + * driver. */ boolean isInline(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java index 0a5f7f9e76..b9ac5f540a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java @@ -193,7 +193,7 @@ abstract class AbstractParam extends AbstractParamX implements SimpleQuery return inline; } - final boolean isInline(Context ctx) { + /* non-final */ boolean isInline(Context ctx) { return isInline() || (ctx.paramType() == INLINED) || (ctx.paramType() == NAMED_OR_INLINED && StringUtils.isBlank(paramName)) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index 064aee79d8..5c90de4159 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -740,10 +740,8 @@ class DefaultRenderContext extends AbstractContext implements Ren // collected the bind variable. The same is true if custom data // type bindings use Context.visit(Param), in case of which we // must not collect the current Param - if (after == before && paramType != INLINED && internal instanceof Param) { - Param param = (Param) internal; - - if (!param.isInline()) { + if (after == before && paramType != INLINED && internal instanceof AbstractParam param) { + if (!param.isInline(this)) { // [#16340] Increment index even if we don't need it internally, while rendering nextIndex(); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java b/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java index 0024287bc5..eb7098a5f8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java @@ -75,10 +75,10 @@ final class ParamCollector extends AbstractBindContext { @Override protected final void bindInternal(QueryPartInternal internal) { - if (internal instanceof Param param) { + if (internal instanceof AbstractParam param) { // [#3131] Inlined parameters should not be returned in some contexts - if (includeInlinedParams || !param.isInline()) { + if (includeInlinedParams || !param.isInline(this)) { String i = String.valueOf(nextIndex()); String paramName = param.getParamName(); diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedRecordConstant.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedRecordConstant.java index 16f8389d82..932843c733 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedRecordConstant.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedRecordConstant.java @@ -138,9 +138,32 @@ final class QualifiedRecordConstant> extends Abstra ctx.paramType(paramType); } + @Override + final boolean isInline(Context ctx) { + switch (ctx.family()) { + + + + + + + + // [#18274] NULL values are inlined, not bound in these dialects + + + case POSTGRES: + case YUGABYTEDB: + default: + return value == null + || super.isInline(ctx); + } + } + private final void toSQLInline(RenderContext ctx) { Cast.renderCastIf(ctx, c -> { + + // [#18274] NULL values are inlined, not bound in these dialects if (value == null) { c.visit(K_NULL); }