From e54f9574b3e615de0dc75529345b674fef4c92e3 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 16 Jun 2025 16:28:18 +0200 Subject: [PATCH] [jOOQ/jOOQ#18607] Inlining of large SQLDataType.NCLOB values doesn't use TO_NCLOB() in Oracle, like for large CLOB values --- .../java/org/jooq/impl/DefaultBinding.java | 56 +++++++++++-------- .../main/java/org/jooq/impl/package-info.java | 8 +++ 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index bfdc2720ba..67f56fed47 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -1336,6 +1336,33 @@ public class DefaultBinding implements Binding { .sql('\''); } + static final void sqlInlineWorkaround6516( + BindingSQLContext ctx, + String value, + int limit, + String prefix, + ThrowingBiConsumer, ? super String, SQLException> sqlInline0 + ) throws SQLException { + int l = value.length(); + + if (l > limit) { + ctx.render().sql('('); + + for (int i = 0; i < l; i += limit) { + if (i > 0) + ctx.render().sql(" || "); + + ctx.render().sql(prefix).sql("("); + sqlInline0.accept(ctx, value.substring(i, Math.min(l, i + limit))); + ctx.render().sql(')'); + } + + ctx.render().sql(')'); + } + else + sqlInline0.accept(ctx, value); + } + @SuppressWarnings("unused") /* non-final */ void sqlBind0(BindingSQLContext ctx, T value) throws SQLException { ctx.render().sql(ctx.variable()); @@ -5010,7 +5037,7 @@ public class DefaultBinding implements Binding { // future UTF encodings which may use more bytes per // character are not handled here, yet. if (ctx.family() == DERBY) - sqlInlineWorkaround6516(ctx, value, 8192, ""); + sqlInlineWorkaround6516(ctx, value, 8192, "", super::sqlInline0); @@ -5026,28 +5053,6 @@ public class DefaultBinding implements Binding { super.sqlInline0(ctx, value); } - private final void sqlInlineWorkaround6516(BindingSQLContext ctx, String value, int limit, String prefix) throws SQLException { - int l = value.length(); - - if (l > limit) { - ctx.render().sql('('); - - for (int i = 0; i < l; i += limit) { - if (i > 0) - ctx.render().sql(" || "); - - ctx.render().sql(prefix).sql("("); - super.sqlInline0(ctx, value.substring(i, Math.min(l, i + limit))); - ctx.render().sql(')'); - } - - ctx.render().sql(')'); - } - else - super.sqlInline0(ctx, value); - } - - @Override final void set0(BindingSetStatementContext ctx, String value) throws SQLException { @@ -5159,6 +5164,11 @@ public class DefaultBinding implements Binding { if (NO_SUPPORT_NVARCHAR.contains(ctx.dialect())) { fallback.sqlInline0(ctx, value); } + + + + + else { ctx.render().sql('N'); super.sqlInline0(ctx, value); diff --git a/jOOQ/src/main/java/org/jooq/impl/package-info.java b/jOOQ/src/main/java/org/jooq/impl/package-info.java index 8ca957ec82..d7a06aa58b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/package-info.java +++ b/jOOQ/src/main/java/org/jooq/impl/package-info.java @@ -40,6 +40,14 @@ interface ThrowingConsumer { void accept(T t) throws E; } +/** + * A checked exception throwing {@link BiConsumer}. + */ +@FunctionalInterface +interface ThrowingBiConsumer { + void accept(T1 t1, T2 t2) throws E; +} + /** * A checked exception throwing {@link Supplier}. */