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)