From 8ff7c5ffc8f2da689fd9e87c29caf0edc4516da8 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 12 Nov 2024 11:05:07 +0100 Subject: [PATCH] [jOOQ/jOOQ#17600] ORA-22848 thrown if a BLOB or CLOB field is used in condition part of a query This includes: - [jOOQ/jOOQ#17601] Avoid CAST(? AS BLOB) in Oracle and render TO_BLOB(?) instead --- jOOQ/src/main/java/org/jooq/impl/Cast.java | 8 ++++++++ jOOQ/src/main/java/org/jooq/impl/Eq.java | 15 ++++++++------- jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Cast.java b/jOOQ/src/main/java/org/jooq/impl/Cast.java index f99e94efd9..0a3f3e00b1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Cast.java +++ b/jOOQ/src/main/java/org/jooq/impl/Cast.java @@ -50,6 +50,7 @@ import static org.jooq.impl.Keywords.K_ON; import static org.jooq.impl.Keywords.K_TRIM; import static org.jooq.impl.Names.N_CAST; import static org.jooq.impl.Names.N_SAFE_CAST; +import static org.jooq.impl.Names.N_TO_BLOB; import static org.jooq.impl.Names.N_TO_CLOB; import static org.jooq.impl.Names.N_TO_DATE; import static org.jooq.impl.Names.N_TO_TIMESTAMP; @@ -317,6 +318,13 @@ final class Cast extends AbstractField implements QOM.Cast { + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Eq.java b/jOOQ/src/main/java/org/jooq/impl/Eq.java index 8c121271b6..bba58dc368 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Eq.java +++ b/jOOQ/src/main/java/org/jooq/impl/Eq.java @@ -126,21 +126,21 @@ implements Function2 compareRowRow, Function3, ? super Field, ? super Field, ? extends Context> acceptDefault ) { - boolean field1Embeddable = arg1.getDataType().isEmbeddable(); + DataType t1 = arg1.getDataType(); + DataType t2 = arg2.getDataType(); + boolean field1Embeddable = t1.isEmbeddable(); SelectQueryImpl s; if (field1Embeddable && arg2 instanceof ScalarSubquery) ctx.visit(compareRowSubquery.apply(row(embeddedFields(arg1)), ((ScalarSubquery) arg2).query)); - else if (field1Embeddable && arg2.getDataType().isEmbeddable()) + else if (field1Embeddable && t2.isEmbeddable()) ctx.visit(compareRowRow.apply(row(embeddedFields(arg1)), row(embeddedFields(arg2)))); else if ((op == org.jooq.Comparator.IN || op == org.jooq.Comparator.NOT_IN) && (s = Transformations.subqueryWithLimit(arg2)) != null && Transformations.NO_SUPPORT_IN_LIMIT.contains(ctx.dialect())) { ctx.visit(arg1.compare(op, (Select) select(asterisk()).from(s.asTable("t")))); } - else if (arg1.getDataType().isMultiset() - && arg2.getDataType().isMultiset() - && !Boolean.TRUE.equals(ctx.data(DATA_MULTISET_CONDITION))) + else if (t1.isMultiset() && t2.isMultiset() && !Boolean.TRUE.equals(ctx.data(DATA_MULTISET_CONDITION))) ctx.data(DATA_MULTISET_CONDITION, true, c -> c.visit(condition)); @@ -158,10 +158,11 @@ implements + else if (arg1 instanceof Array && ((Array) arg1).fields.fields.length == 0) - ctx.data(ExtendedDataKey.DATA_EMPTY_ARRAY_BASE_TYPE, arg2.getDataType().getArrayComponentDataType(), c -> acceptDefault.apply(c, arg1, arg2)); + ctx.data(ExtendedDataKey.DATA_EMPTY_ARRAY_BASE_TYPE, t2.getArrayComponentDataType(), c -> acceptDefault.apply(c, arg1, arg2)); else if (arg2 instanceof Array && ((Array) arg2).fields.fields.length == 0) - ctx.data(ExtendedDataKey.DATA_EMPTY_ARRAY_BASE_TYPE, arg1.getDataType().getArrayComponentDataType(), c -> acceptDefault.apply(c, arg1, arg2)); + ctx.data(ExtendedDataKey.DATA_EMPTY_ARRAY_BASE_TYPE, t1.getArrayComponentDataType(), c -> acceptDefault.apply(c, arg1, arg2)); else acceptDefault.apply(ctx, arg1, arg2); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 4ea7d960de..f9f3593ca5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -299,6 +299,7 @@ final class Names { static final Name N_TIMESTAMP_DIFF = systemName("timestamp_diff"); static final Name N_TIMESTAMP_SUB = systemName("timestamp_sub"); static final Name N_toJSONString = systemName("toJSONString"); + static final Name N_TO_BLOB = systemName("to_blob"); static final Name N_TO_CLOB = systemName("to_clob"); static final Name N_TO_JSON = systemName("to_json"); static final Name N_TO_JSON_STRING = systemName("to_json_string");