[ https://issues.apache.org/jira/browse/CALCITE-5448?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17649869#comment-17649869 ]
Ruben Q L edited comment on CALCITE-5448 at 12/20/22 4:16 PM: -------------------------------------------------------------- [~julianhyde], I agree that is the general case. But in the particular case of {{ReduceExpressionsRule}}, if we look at the code that calls {{reduceExpressionsInternal}}, the {{RexSimply}} is built using either the executor from the planner, or as a fallback the "default" executor in RexUtil [1]: {code} final RexExecutor executor = Util.first(cluster.getPlanner().getExecutor(), RexUtil.EXECUTOR); final RexSimplify simplify = new RexSimplify(rexBuilder, predicates, executor); final RexUnknownAs unknownAs = RexUnknownAs.falseIf(unknownAsFalse); final boolean reduced = reduceExpressionsInternal(rel, simplify, unknownAs, expList, predicates, treatDynamicCallsAsConstant); {code} IMO it seems a bit strange to use the {{RexUtil.EXECUTOR}} "fallback" in there, and not insider {{reduceExpressionsInternal}}. Perhaps another alternative to avoid adding a new getter {{RexSimplify#getExecutor}} could be adding the {{RexExecutor executor}} as a parameter in {{reduceExpressionsInternal}} [1] https://github.com/apache/calcite/blob/013f034dee3e24083760b4695e2eacfbf592c2cb/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java#L702 was (Author: rubenql): [~julianhyde], I agree that is the general case. But in the particular case of {{ReduceExpressionsRule}}, if we look at the code that calls {{reduceExpressionsInternal}}, the {{RexSimply}} is built using either the executor from the planner, or as a fallback the "default" executor in RexUtil [1]: {code} final RexExecutor executor = Util.first(cluster.getPlanner().getExecutor(), RexUtil.EXECUTOR); final RexSimplify simplify = new RexSimplify(rexBuilder, predicates, executor); // Simplify predicates in place final RexUnknownAs unknownAs = RexUnknownAs.falseIf(unknownAsFalse); final boolean reduced = reduceExpressionsInternal(rel, simplify, unknownAs, expList, predicates, treatDynamicCallsAsConstant); {code} IMO it seems a bit strange to use the {{RexUtil.EXECUTOR}} "fallback" in there, and not insider {{reduceExpressionsInternal}}. Perhaps another alternative to avoid adding a new getter {{RexSimplify#getExecutor}} could be adding the {{RexExecutor executor}} as a parameter in {{reduceExpressionsInternal}} [1] https://github.com/apache/calcite/blob/013f034dee3e24083760b4695e2eacfbf592c2cb/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java#L702 > ReduceExpressionsRule does not always constant fold expressions > ---------------------------------------------------------------- > > Key: CALCITE-5448 > URL: https://issues.apache.org/jira/browse/CALCITE-5448 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.32.0 > Reporter: Mihai Budiu > Priority: Minor > > I have manually built a HepPlanner to optimize the SQL queries, and I > discovered that the rule ReduceExpressionsRule does not really do anything in > my setup. > I am looking at method ReduceExpressionsRule.reduceExpressionsInternal. > There is this piece of code: > {code} > RexExecutor executor = rel.getCluster().getPlanner().getExecutor(); > if (executor == null) { > // Cannot reduce expressions: caller has not set an executor in their > // environment. Caller should execute something like the following > before > // invoking the planner: > // > // final RexExecutorImpl executor = > // new RexExecutorImpl(Schemas.createDataContext(null)); > // rootRel.getCluster().getPlanner().setExecutor(executor); > return changed; > } > {code} > > However, the caller of this function, the method reduceExpressions, has > carefully inserted an executor in the RexSimplify class in case the cluster > has no executor. Shouldn't that executor be used instead of trying the > missing one? (It is currently private in the RexSimplify class.) > -- This message was sent by Atlassian Jira (v8.20.10#820010)