[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
This commit is contained in:
Lukas Eder 2024-11-12 11:05:07 +01:00
parent d6285384bc
commit 8ff7c5ffc8
3 changed files with 17 additions and 7 deletions

View File

@ -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<T> extends AbstractField<T> implements QOM.Cast<T> {

View File

@ -126,21 +126,21 @@ implements
Function2<RowN, RowN, Condition> compareRowRow,
Function3<? super Context<?>, ? super Field<?>, ? super Field<?>, ? extends Context<?>> acceptDefault
) {
boolean field1Embeddable = arg1.getDataType().isEmbeddable();
DataType<T> t1 = arg1.getDataType();
DataType<T> 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);
}

View File

@ -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");