[ 
https://issues.apache.org/jira/browse/CALCITE-7687?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18103161#comment-18103161
 ] 

Etienne Pelissier commented on CALCITE-7687:
--------------------------------------------

I plan to go back to working on this issue at the beginning of September.

> RelMdSelectivity and RelMdDistinctRowCount for Aggregate can propagate a 
> predicate with wrong references
> --------------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-7687
>                 URL: https://issues.apache.org/jira/browse/CALCITE-7687
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.42.0
>            Reporter: Etienne Pelissier
>            Assignee: Etienne Pelissier
>            Priority: Minor
>              Labels: in-progress, pull-request-available
>
> {{[RelMdSelectivity#getSelectivity|https://github.com/apache/calcite/blob/0211999427e294114db8f6b58cad95870cc13ccb/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java#L178](Aggregate
>  rel, RelMetadataQuery mq, @Nullable RexNode predicate)}} method:
> {code:java}
>   public @Nullable Double getSelectivity(Aggregate rel, RelMetadataQuery mq,
>       @Nullable RexNode predicate) {
>     ...
>     RelOptUtil.splitFilters(
>         rel.getGroupSet(),
>         predicate,
>         pushable,
>         notPushable);
>     final RexBuilder rexBuilder = rel.getCluster().getRexBuilder();
>     RexNode childPred =
>         RexUtil.composeConjunction(rexBuilder, pushable, true);
>     Double selectivity = mq.getSelectivity(rel.getInput(), childPred);
>     ...
>   }
> {code}
> {{[RelMdDistinctRowCount#getDistinctRowCount|https://github.com/apache/calcite/blob/0211999427e294114db8f6b58cad95870cc13ccb/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java#L168](Aggregate
>  rel, RelMetadataQuery mq, ImmutableBitSet groupKey, @Nullable RexNode 
> predicate)}} method:
> {code:java}
>   public @Nullable Double getDistinctRowCount(Aggregate rel, RelMetadataQuery 
> mq,
>       ImmutableBitSet groupKey, @Nullable RexNode predicate) {
>     ...
>     RelOptUtil.splitFilters(
>         ImmutableBitSet.range(rel.getGroupCount()),
>         predicate,
>         pushable,
>         notPushable);
>     final RexBuilder rexBuilder = rel.getCluster().getRexBuilder();
>     RexNode childPreds =
>         RexUtil.composeConjunction(rexBuilder, pushable, true);
>     // set the bits as they correspond to the child input
>     ImmutableBitSet.Builder childKey = ImmutableBitSet.builder();
>     RelMdUtil.setAggChildKeys(groupKey, rel, childKey);
>     Double distinctRowCount =
>         mq.getDistinctRowCount(rel.getInput(), childKey.build(), childPreds);
>     ...
>   }
> {code}
> [CALCITE-4414|https://issues.apache.org/jira/browse/CALCITE-4414] fixed the 
> analogous problem in RelMdSelectivity#getSelectivity for Calc: it pushes a 
> predicate to its input, and RelOptUtil.pushPastCalc converts it to 
> input-column references first, which is possible because Calc output fields 
> are themselves expressions over the input.
> Aggregate's group-key output fields are also references to specific input 
> fields, so predicates that reference only group keys can be translated the 
> same way, via an analogous RelOptUtil.pushPastAggregate, which currently 
> doesn't exist. Aggregate call outputs (e.g., COUNT(x\)) have no equivalent 
> input expression, so a predicate referencing one must not be pushed at all. 
> FilterAggregateTransposeRule already computes the same group-key mapping to 
> push a Filter past an Aggregate, and can be used as a basis to implement the 
> missing RelOptUtil.pushPastAggregate.
> The two examples below show the problem for 
> RelMdSelectivity#getSelectivity(Aggregate) and 
> RelMdDistinctRowCount#getDistinctRowCount(Aggregate), respectively.
> In both cases, the predicates reach the input with the wrong field 
> references, silently returning statistics for the wrong column rather than 
> raising an exception.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to