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)