[jOOQ/jOOQ#17785] Revert change for most dialects

The change was introduced because some dialects (BIGQUERY, SQLDATAWAREHOUSE) don't have LIKE .. ESCAPE support, which is a requirement for the historic implementation of CONTAINS, STARTS_WITH, ENDS_WITH. For other dialects, switching to POSITION() is a risk, especially when case insensitive string types are involved, such as PostgreSQL's citext type.
This commit is contained in:
Lukas Eder 2025-02-05 16:10:59 +01:00
parent 44ef3b2f22
commit b4486c4209
3 changed files with 63 additions and 46 deletions

View File

@ -113,12 +113,6 @@ implements
case CLICKHOUSE:
@ -134,6 +128,12 @@ implements
case TRINO:
return false;
default:
return true;
}
@ -159,7 +159,7 @@ implements
else if (value.getDataType().getType() == JSONB.class || content.getDataType().getType() == JSONB.class)
ctx.visit(value).sql(" @> ").visit(content);
else
acceptDefault(ctx);
acceptLike(ctx);
break;
}
@ -175,13 +175,6 @@ implements
@ -196,10 +189,18 @@ implements
case MYSQL:
case SQLITE:
case TRINO: {
acceptDefault(ctx);
acceptLike(ctx);
break;
}
default:
ctx.visit(function(N_CONTAINS, BOOLEAN, value, content));
break;
@ -215,7 +216,11 @@ implements
private final void acceptDefault(Context<?> ctx) {
private final void acceptLike(Context<?> ctx) {
ctx.visit(value.like(DSL.concat(inline("%"), Tools.escapeForLike(content, ctx.configuration()), inline("%")), Tools.ESCAPE));
}
private final void acceptPosition(Context<?> ctx) {
ctx.visit(DSL.position(Like.requiresStringCast(value), Like.requiresStringCast(content)).gt(inline(0)));
}

View File

@ -108,12 +108,6 @@ implements
@ -136,6 +130,10 @@ implements
case DUCKDB:
return true;
@ -165,13 +163,6 @@ implements
@ -191,9 +182,16 @@ implements
case POSTGRES:
case SQLITE:
case TRINO:
case YUGABYTEDB:
ctx.visit(DSL.position(Like.requiresStringCast(string), Like.requiresStringCast(suffix)).eq(iadd(isub(Like.requiresStringCast(string).length(), Like.requiresStringCast(suffix).length()), inline(1))));
case YUGABYTEDB: {
acceptLike(ctx);
break;
}
@ -224,6 +222,14 @@ implements
private final void acceptLike(Context<?> ctx) {
ctx.visit(string.like(DSL.concat(inline("%"), Tools.escapeForLike(suffix, ctx.configuration())), Tools.ESCAPE));
}
private final void acceptPosition(Context<?> ctx) {
ctx.visit(DSL.position(Like.requiresStringCast(string), Like.requiresStringCast(suffix)).eq(iadd(isub(Like.requiresStringCast(string).length(), Like.requiresStringCast(suffix).length()), inline(1))));
}
// -------------------------------------------------------------------------
// XXX: Query Object Model
// -------------------------------------------------------------------------

View File

@ -108,12 +108,6 @@ implements
@ -135,6 +129,10 @@ implements
case DUCKDB:
case TRINO:
return true;
@ -165,13 +163,6 @@ implements
@ -190,9 +181,16 @@ implements
case MYSQL:
case POSTGRES:
case SQLITE:
case YUGABYTEDB:
ctx.visit(DSL.position(Like.requiresStringCast(string), Like.requiresStringCast(prefix)).eq(inline(1)));
case YUGABYTEDB: {
acceptLike(ctx);
break;
}
@ -224,6 +222,14 @@ implements
private final void acceptLike(Context<?> ctx) {
ctx.visit(string.like(DSL.concat(Tools.escapeForLike(prefix, ctx.configuration()), inline("%")), Tools.ESCAPE));
}
private final void acceptPosition(Context<?> ctx) {
ctx.visit(DSL.position(Like.requiresStringCast(string), Like.requiresStringCast(prefix)).eq(inline(1)));
}
// -------------------------------------------------------------------------
// XXX: Query Object Model
// -------------------------------------------------------------------------