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%')");

Reply via email to