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)