diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index bb0d1589c5..032078da2a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -4305,32 +4305,42 @@ public class DefaultBinding implements Binding { @Override final void sqlInline0(BindingSQLContext ctx, String value) throws SQLException { + // [#6516] The below heuristics work for UTF-32 and UTF-8 + // future UTF encodings which may use more bytes per + // character are not handled here, yet. + if (ctx.family() == DERBY) + sqlInlineWorkaround6516(ctx, value, 8192, ""); - - - - - - - - - - - - - - - - - - - super.sqlInline0(ctx, value); + else + 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 { ctx.statement().setString(ctx.index(), value);