This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 49fa3edbb9 [CALCITE-7287] In simplifyLike, the makeLiteral call does
not preserve the RelDataType
49fa3edbb9 is described below
commit 49fa3edbb98e3f01fccc028c517e8abf78c1f49f
Author: xuzifu666 <[email protected]>
AuthorDate: Wed Nov 12 20:22:30 2025 +0800
[CALCITE-7287] In simplifyLike, the makeLiteral call does not preserve the
RelDataType
---
core/src/main/java/org/apache/calcite/rex/RexSimplify.java | 7 ++++---
.../test/java/org/apache/calcite/rex/RexProgramBuilderBase.java | 7 +++++++
core/src/test/java/org/apache/calcite/rex/RexProgramTest.java | 7 +++++++
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
index 0704731137..3b0b04043b 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -522,15 +522,16 @@ private RexNode simplifyLike(RexCall e, RexUnknownAs
unknownAs) {
if (e.operands.size() == 2) {
e = (RexCall) rexBuilder
.makeCall(e.getParserPosition(), e.getOperator(),
e.operands.get(0),
- rexBuilder.makeLiteral(simplifyLikeString(likeStr, '\\',
'%')));
+ rexBuilder.makeLiteral(simplifyLikeString(likeStr, '\\',
'%'),
+ e.operands.get(1).getType(), true, true));
}
if (e.operands.size() == 3 && e.operands.get(2) instanceof RexLiteral) {
final RexLiteral escapeLiteral = (RexLiteral) e.operands.get(2);
Character escape =
requireNonNull(escapeLiteral.getValueAs(Character.class));
e = (RexCall) rexBuilder
.makeCall(e.getParserPosition(), e.getOperator(),
e.operands.get(0),
- rexBuilder.makeLiteral(simplifyLikeString(likeStr, escape,
'%')),
- escapeLiteral);
+ rexBuilder.makeLiteral(simplifyLikeString(likeStr, escape,
'%'),
+ e.operands.get(1).getType(), true, true), escapeLiteral);
}
}
return simplifyGenericNode(e);
diff --git
a/core/src/test/java/org/apache/calcite/rex/RexProgramBuilderBase.java
b/core/src/test/java/org/apache/calcite/rex/RexProgramBuilderBase.java
index b0286bd73a..4b873fce5c 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexProgramBuilderBase.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexProgramBuilderBase.java
@@ -539,6 +539,13 @@ protected RexLiteral literal(String value) {
return rexBuilder.makeLiteral(value, nonNullableVarchar);
}
+ protected RexLiteral literalVarchar(String value) {
+ if (value == null) {
+ return rexBuilder.makeNullLiteral(nullableVarchar);
+ }
+ return (RexLiteral) rexBuilder.makeLiteral(value, nonNullableVarchar,
true, true);
+ }
+
protected RexLiteral literal(double value) {
return rexBuilder.makeApproxLiteral(value, nonNullableDouble);
}
diff --git a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
index fc769f966c..5e727d3005 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
@@ -4092,6 +4092,13 @@ private void checkSarg(String message, Sarg sarg,
checkSimplify(or(isNull(ref), like(ref, literal("%"), literal("#"))),
"true");
checkSimplifyUnchanged(like(ref, literal("%A")));
+
+ RexCall simplifyLike = (RexCall) simplify.simplify(like(ref,
literalVarchar("%%A")));
+
assertThat(simplifyLike.getOperands().get(1).getType().getSqlTypeName().name(),
is("VARCHAR"));
+
+ simplifyLike = (RexCall) simplify.simplify(like(ref, literal("%%A")));
+
assertThat(simplifyLike.getOperands().get(1).getType().getSqlTypeName().name(),
is("CHAR"));
+
checkSimplify(like(ref, literal("%%A")), "LIKE($0, '%A')");
checkSimplify(like(ref, literal("%%%_A%%B%%")), "LIKE($0, '_%A%B%')");
checkSimplify(like(ref, literal("%%A%%%")), "LIKE($0, '%A%')");