Mihai Budiu created CALCITE-6639:
------------------------------------

             Summary: Optimization that pulls up predicates causes ASOF join 
validation failures
                 Key: CALCITE-6639
                 URL: https://issues.apache.org/jira/browse/CALCITE-6639
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.38.0
            Reporter: Mihai Budiu


The following test added to the RelOptRulesTest causes an assertion failure:

{code:java}
@Test void testAsofOpt() {
    final String sql = "SELECT *\n" +
        "FROM (VALUES (NULL, 0), (1, NULL), (1, 0), (1, 1), (1, 2), (1, 3), (1, 
4), (2, 3), (3, 4)) AS t1(k, t)\n" +
        "ASOF JOIN (VALUES (1, NULL), (1, 2), (1, 3), (2, 10), (2, 0)) AS t2(k, 
t)\n" +
        "MATCH_CONDITION t2.t < t1.t\n" +
        "ON t1.k = t2.k\n";
    sql(sql).withRule(CoreRules.PROJECT_REDUCE_EXPRESSIONS)
        .checkUnchanged();
  }
{code}

This test is taken straigt from asof.iq.

This test fails with the following assertion failure:

{code}
java.lang.AssertionError
        at 
org.apache.calcite.rel.metadata.RelMdPredicates$JoinConditionBasedPredicateInference.inferPredicates(RelMdPredicates.java:850)
        at 
org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:346)
        at 
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates_$(Unknown
 Source)
        at 
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates(Unknown
 Source)
        at 
org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:887)
        at 
org.apache.calcite.rel.rules.ReduceExpressionsRule$ProjectReduceExpressionsRule.onMatch(ReduceExpressionsRule.java:310)
{code}

Diagnosis: the definition of ASOF join implementation, inspired by the 
Snowflake variant of the operation, imposes some strong "syntactical" 
constraints on the predicate structure. In particular, each predicate in the 
equi-join part must compare expressions from the two joined relations.

These constraints ensure that the ASOF join can be efficiently implemented. 
However, this definition inhibits some optimizations, such as pull-up 
predicates, which may rewrite predicates into a shape that does not satisfy the 
above rules.

It is not clear what the right course of action is. 

One solution would be to relax the requirements on the ASOF join and to 
validate its shape only after optimizations. But then it is not clear that the 
resulting program would always be efficiently implementable - the original goal 
of ASOF.

Another solution would be to inhibit optimizations from optimizing such joins.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to