You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Thomas Rebele (Jira)" <ji...@apache.org> on 2025/02/10 13:50:00 UTC
[jira] [Created] (CALCITE-6823) Cannot convert CHAR to Integer when applying SubstitutionVisitor
Thomas Rebele created CALCITE-6823:
--------------------------------------
Summary: Cannot convert CHAR to Integer when applying SubstitutionVisitor
Key: CALCITE-6823
URL: https://issues.apache.org/jira/browse/CALCITE-6823
Project: Calcite
Issue Type: Bug
Components: core
Reporter: Thomas Rebele
I've encountered an assertion {{cannot convert CHAR literal to class java.lang.Integer}} with the following test in MaterializedViewSubstitutionVisitorTest:
{code:java}
@Test void testDateFilter() {
sql("SELECT HIREDATE FROM EMP WHERE HIREDATE > '1990-10-01'",
"SELECT * FROM EMP WHERE HIREDATE > '1990-05-01'")
.withDefaultSchemaSpec(SchemaSpec.SCOTT)
.noMat();
}{code}
The stacktrace:
{code:java}
java.lang.AssertionError: cannot convert CHAR literal to class java.lang.Integer
at org.apache.calcite.rex.RexLiteral.getValueAs(RexLiteral.java:1177)
at org.apache.calcite.plan.VisitorDataContext.getValue(VisitorDataContext.java:144)
at org.apache.calcite.plan.VisitorDataContext.of(VisitorDataContext.java:98)
at org.apache.calcite.plan.RexImplicationChecker.implies2(RexImplicationChecker.java:243)
at org.apache.calcite.plan.RexImplicationChecker.impliesConjunction(RexImplicationChecker.java:151)
at org.apache.calcite.plan.RexImplicationChecker.impliesAny(RexImplicationChecker.java:141)
at org.apache.calcite.plan.RexImplicationChecker.implies(RexImplicationChecker.java:127)
at org.apache.calcite.plan.SubstitutionVisitor.implies(SubstitutionVisitor.java:1832)
at org.apache.calcite.plan.SubstitutionVisitor.access$900(SubstitutionVisitor.java:128)
at org.apache.calcite.plan.SubstitutionVisitor$CalcToCalcUnifyRule.apply(SubstitutionVisitor.java:1162)
at org.apache.calcite.plan.SubstitutionVisitor.go(SubstitutionVisitor.java:587)
at org.apache.calcite.plan.SubstitutionVisitor.go(SubstitutionVisitor.java:521)
at org.apache.calcite.test.MaterializedViewSubstitutionVisitorTest$1.optimize(MaterializedViewSubstitutionVisitorTest.java:91)
at org.apache.calcite.test.MaterializedViewTester.checkNoMaterialize(MaterializedViewTester.java:94)
at org.apache.calcite.test.MaterializedViewFixture.noMat(MaterializedViewFixture.java:60)
at org.apache.calcite.test.MaterializedViewSubstitutionVisitorTest.testDateFilter(MaterializedViewSubstitutionVisitorTest.java:117) {code}
The assertion disappears when adding DATE in front of the literals, e.g., {{{}HIREDATE > DATE '1990-10-01'{}}}.
Many databases support comparing DATE fields with CHAR literals, e.g., SQLite and Postgres:
[https://sqlfiddle.com/postgresql/online-compiler?id=70a19e42-4909-4c74-af09-a063cc567021]. For Oracle Database the DATE keyword is required, though.
I would have expected that if Calcite converts SQL queries to RelNode objects, that these RelNode objects can be used for view substitution.
PS: I've checked with the most recent commit on the main branch, f1c370a0cb57675b6e5a442b3d98e29d75a64043.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)