From 26f39d72483a1f2f14dec189af8ef4a65c57e5d5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 30 Sep 2024 16:51:15 +0200 Subject: [PATCH] [jOOQ/jOOQ#17397] IN-list padding truncates row IN lists to 1000 elements in Oracle pre 23ai --- .../java/org/jooq/impl/AbstractInList.java | 55 +++++++------------ .../java/org/jooq/impl/RowInCondition.java | 2 +- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java b/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java index 87baae78c2..a0dcb381f7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java @@ -198,47 +198,34 @@ abstract class AbstractInList extends AbstractCondition { else ctx.visit(trueCondition()); } - else if (values.size() > limit) { - // [#798] Oracle and some other dialects can only hold 1000 values - // in an IN (...) clause - switch (ctx.family()) { - case DERBY: + // [#798] Oracle and some other dialects can only hold 1000 values + // in an IN (...) clause + else if (REQUIRES_IN_LIMIT.contains(ctx.dialect()) && values.size() > limit) { + ctx.sqlIndentStart('('); + for (int i = 0; i < values.size(); i += limit) { + if (i > 0) { - - case FIREBIRD: { - ctx.sqlIndentStart('('); - - for (int i = 0; i < values.size(); i += limit) { - if (i > 0) { - - // [#1515] The connector depends on the IN / NOT IN - // operator - if (in) - ctx.formatSeparator() - .visit(K_OR) - .sql(' '); - else - ctx.formatSeparator() - .visit(K_AND) - .sql(' '); - } - - toSQLSubValues(ctx, field, in, padded(ctx, values.subList(i, Math.min(i + limit, values.size())), limit)); - } - - ctx.sqlIndentEnd(')'); - break; + // [#1515] The connector depends on the IN / NOT IN + // operator + if (in) + ctx.formatSeparator() + .visit(K_OR) + .sql(' '); + else + ctx.formatSeparator() + .visit(K_AND) + .sql(' '); } - // Most dialects can handle larger lists - default: { - toSQLSubValues(ctx, field, in, padded(ctx, values, limit)); - break; - } + toSQLSubValues(ctx, field, in, padded(ctx, values.subList(i, Math.min(i + limit, values.size())), limit)); } + + ctx.sqlIndentEnd(')'); } + + // Most dialects can handle larger lists else toSQLSubValues(ctx, field, in, padded(ctx, values, limit)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java index 3eec4ca894..85b294b5bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java @@ -139,7 +139,7 @@ implements ctx.visit(left) .sql(' ') .visit((not ? NOT_IN : IN).toKeyword()) - .sql(" (").visit(new QueryPartListView<>(AbstractInList.padded(ctx, right, AbstractInList.limit(ctx)))).sql(')'); + .sql(" (").visit(new QueryPartListView<>(AbstractInList.padded(ctx, right, Integer.MAX_VALUE))).sql(')'); } } }