This is an automated email from the ASF dual-hosted git repository.

xiong 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 bfdb3fe991 [CALCITE-6346] JdbcAdapter: Cast for dynamic filter 
arguments is lost
bfdb3fe991 is described below

commit bfdb3fe99111bcdcfa54590c2804c81d46b4e511
Author: suibianwanwan <[email protected]>
AuthorDate: Sun Aug 18 21:48:08 2024 +0800

    [CALCITE-6346] JdbcAdapter: Cast for dynamic filter arguments is lost
---
 .../main/java/org/apache/calcite/rex/RexSimplify.java  |  4 +++-
 .../java/org/apache/calcite/test/JdbcAdapterTest.java  | 18 ++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

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 0feb39a9da..301348447e 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -2198,7 +2198,9 @@ public class RexSimplify {
   private RexNode simplifyCast(RexCall e) {
     RexNode operand = e.getOperands().get(0);
     operand = simplify(operand, UNKNOWN);
-    if (sameTypeOrNarrowsNullability(e.getType(), operand.getType())) {
+    // The type of DYNAMIC_PARAM is indeterminate, so the cast cannot be 
eliminated
+    if (operand.getKind() != SqlKind.DYNAMIC_PARAM
+        && sameTypeOrNarrowsNullability(e.getType(), operand.getType())) {
       return operand;
     }
     if (RexUtil.isLosslessCast(operand)) {
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java 
b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
index 2b7aa4b9b9..cfa3e0c443 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
@@ -925,6 +925,24 @@ class JdbcAdapterTest {
             + "FROM \"foodmart\".\"expense_fact\"");
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6346";>[CALCITE-6346]
+   * JdbcAdapter: Cast for dynamic filter arguments is lost</a>. */
+  @Test void testCastDynamic() {
+    CalciteAssert.that()
+        .with(CalciteAssert.Config.FOODMART_CLONE)
+        .query("SELECT * FROM \"foodmart\".\"sales_fact_1997\""
+            + " WHERE cast (? as varchar(10)) = cast(? as varchar(10))")
+        .planHasSql("SELECT *\n"
+            + "FROM \"foodmart\".\"sales_fact_1997\"\n"
+            + "WHERE CAST(? AS VARCHAR(10)) = CAST(? AS VARCHAR(10))")
+        .consumesPreparedStatement(p -> {
+          p.setInt(1, 10);
+          p.setLong(2, 10);
+        })
+        .runs();
+  }
+
   @Test void testLastValueOver() {
     CalciteAssert
         .model(FoodmartSchema.FOODMART_MODEL)

Reply via email to