You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Julian Hyde (Jira)" <ji...@apache.org> on 2021/07/30 19:40:00 UTC

[jira] [Created] (CALCITE-4711) RexProgramBuilder should not simplify

Julian Hyde created CALCITE-4711:
------------------------------------

             Summary: RexProgramBuilder should not simplify
                 Key: CALCITE-4711
                 URL: https://issues.apache.org/jira/browse/CALCITE-4711
             Project: Calcite
          Issue Type: Bug
            Reporter: Julian Hyde


{{RexProgramBuilder}} currently simplifies expressions even if no {{RexSimplifier}} instance is supplied in its constructor: the method {{registerInternal}} creates a {{RexSimplifier}}.

This simplification used to be beneficial. For instance, as of [4ef9f467|https://github.com/apache/calcite/commits/4ef9f46757528d21c510eb8bd171fa04ba86e36d], {{RexProgramBuilder}} can simplify "x AND y AND x" to "x AND y". But now we have RexSimplifier, which is applied pretty much any time a RexNode is included in a RelNode via a RelBuilder method.

Simplify is now called in too many places, and I suspect that the running time is multiplying. Consider: {{RexSimplify.simplifyCast}} calls {{RexExecutor.reduce}} to reduce constants. To do this, {{RexExecutor}} uses {{RexProgramBuilder}} to generate a program (which will then be executed to yield the reduced value), and the RexProgramBuilder calls simplify again. It is ridiculous to call simplify at so many levels. It's time that we reduced the responsibilities of {{RexProgramBuilder}} to just building programs.

(It is possible that, once a {{RexProgram}} has been created, we can see some patterns in the flattened expressions that would not be apparent to {{RexSimplify}}. If this happens, we could have a simplify step that works on {{Calc}} after its program has been generated.)

After this change, {{RexProgramBuilder}} will simplify only if a {{RexSimplify}} is passed in the constructor. {{RexProgramBuilder}} will no longer be able to simplify "x AND y AND x". We will add a test to ensure that {{RelBuilder.filter}} can do this.



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