You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Chunwei Lei (Jira)" <ji...@apache.org> on 2019/12/25 04:01:00 UTC

[jira] [Created] (CALCITE-3630) Improve ReduceExpressionsRule

Chunwei Lei created CALCITE-3630:
------------------------------------

             Summary: Improve ReduceExpressionsRule
                 Key: CALCITE-3630
                 URL: https://issues.apache.org/jira/browse/CALCITE-3630
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.21.0
            Reporter: Chunwei Lei
            Assignee: Chunwei Lei


In {{FilterReduceExpressionsRule}}, if the expression is a IS [NOT] NULL on a non-nullable column, then we can either remove the filter or replace it with an Empty(namely {{reduceNotNullableFilter}}). In such a case, we can set importance to 0 to reduce search space.

 
{code:java}
// code placeholder
  private void reduceNotNullableFilter(
      RelOptRuleCall call,
      Filter filter,
      RexNode rexNode,
      boolean reverse) {
    // If the expression is a IS [NOT] NULL on a non-nullable
    // column, then we can either remove the filter or replace
    // it with an Empty.
    boolean alwaysTrue;
    switch (rexNode.getKind()) {
    case IS_NULL:
    case IS_UNKNOWN:
      alwaysTrue = false;
      break;
    case IS_NOT_NULL:
      alwaysTrue = true;
      break;
    default:
      return;
    }
    if (reverse) {
      alwaysTrue = !alwaysTrue;
    }
    RexNode operand = ((RexCall) rexNode).getOperands().get(0);
    if (operand instanceof RexInputRef) {
      RexInputRef inputRef = (RexInputRef) operand;
      if (!inputRef.getType().isNullable()) {
        if (alwaysTrue) {
          call.transformTo(filter.getInput());
        } else {
          call.transformTo(createEmptyRelOrEquivalent(call, filter));
        }
        // New plan is absolutely better than old plan.
        call.getPlanner().setImportance(filter, 0.0);
      }
    }
  }
}
{code}
 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)