Steve Carlin has uploaded this change for review. ( http://gerrit.cloudera.org:8080/23723
Change subject: IMPALA-13712: Calcite Planner - Enable constant folding ...................................................................... IMPALA-13712: Calcite Planner - Enable constant folding Constant folding is enabled by this patch. Calcite does constant folding via the RexExecutor.reduce() method. However, we need to use Impala's constant folding algorithm to ensure that Impala expressions are folded. This is done through the derived class ImpalaRexExecutor and is called from the Simplify rules. The ImpalaRexExecutor calls an internal shuttle class which recursively walks through the RexNode which checks if portions of the expression can be constant folded. Some expressions are not folded due to various reasons: - We avoid folding 'cast(1.2 as double)' type expressions because folding this creates an inexact number, and this is problematic for partition pruning directory names on double columns which contain the exact number (1.2 in this case). - Interval expressions are skipped temporarily since the Expr class generated is not meant to be simplified. However, an Expr object that contains an IntervalExpr may be simplified. There is a special case that needed to be handled for a values query with different sized arguments across rows. In Calcite version 1.40 (not yet upgraded as of this commit), an extra cast is added around smaller strings to ensure the char(x) is the same size across all rows. However, this adds extra spaces to the string which causes results different from the original Impala planner. This must be caught before Calcite converts the abstract syntax tree into a RelNode logical tree. A special RexExecutor has been created to handle this which looks for char casts around a char literal and removes it. This is fine because the literal will be changed into a string in the "coercenodes" module. Change-Id: I98c21ef75b2f5f8e3390ff5de5fdf45d9645b326 --- M java/calcite-planner/src/main/java/org/apache/impala/calcite/functions/RexCallConverter.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/util/ExprConjunctsConverter.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/rules/ImpalaFilterSimplifyRule.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/rules/ImpalaJoinSimplifyRule.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/rules/ImpalaProjectSimplifyRule.java A java/calcite-planner/src/main/java/org/apache/impala/calcite/rules/ImpalaRexExecutor.java A java/calcite-planner/src/main/java/org/apache/impala/calcite/rules/RemoveUnraggedCharCastRexExecutor.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteJniFrontend.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteOptimizer.java M java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteRelNodeConverter.java A java/calcite-planner/src/test/java/org/apache/impala/planner/TestReduceExprShuttle.java M testdata/workloads/functional-query/queries/QueryTest/calcite.test 12 files changed, 903 insertions(+), 9 deletions(-) git pull ssh://gerrit.cloudera.org:29418/Impala-ASF refs/changes/23/23723/1 -- To view, visit http://gerrit.cloudera.org:8080/23723 To unsubscribe, visit http://gerrit.cloudera.org:8080/settings Gerrit-Project: Impala-ASF Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: I98c21ef75b2f5f8e3390ff5de5fdf45d9645b326 Gerrit-Change-Number: 23723 Gerrit-PatchSet: 1 Gerrit-Owner: Steve Carlin <[email protected]> Gerrit-Reviewer: Aman Sinha <[email protected]> Gerrit-Reviewer: Fang-Yu Rao <[email protected]> Gerrit-Reviewer: Joe McDonnell <[email protected]> Gerrit-Reviewer: Michael Smith <[email protected]> Gerrit-Reviewer: Pranav Lodha <[email protected]> Gerrit-Reviewer: Riza Suminto <[email protected]>
