You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@datafusion.apache.org by "adriangb (via GitHub)" <gi...@apache.org> on 2026/09/17 16:01:12 UTC

[I] Filter on a volatile GROUP BY key returns rows that do not satisfy the filter [datafusion]

adriangb opened a new issue, #25415:
URL: https://github.com/apache/datafusion/issues/25415

   ### Describe the bug
   
   A filter on a grouping key that contains a volatile function (for example `random()`) gives incorrect results. The query returns rows that do not satisfy the `WHERE` clause.
   
   The optimizer moves the filter below the aggregate. It then replaces the key column with the key expression. Thus DataFusion calculates `random()` two times for each row: one time in the filter and one time in the `GROUP BY`. The two values are not the same, so the filter and the groups do not agree.
   
   ### To Reproduce
   
   Use `datafusion-cli`:
   
   ```sql
   CREATE TABLE v AS SELECT value AS a FROM generate_series(1, 10000);
   
   SELECT k, c
   FROM (SELECT random() < 0.5 AS k, count(*) AS c FROM v GROUP BY random() < 0.5)
   WHERE k;
   ```
   
   Actual result (DataFusion 54.0.0 and `main` at 4e907557ad):
   
   ```
   +-------+------+
   | k     | c    |
   +-------+------+
   | false | 2447 |
   | true  | 2474 |
   +-------+------+
   ```
   
   The query returns a row with `k = false`, but the filter is `WHERE k`. Also, the total count is approximately 5000, not 10000, because the filter removes approximately half of the rows before the aggregate.
   
   The same problem occurs with `GROUP BY k` and with `WHERE k = false`.
   
   `EXPLAIN` shows that the filter is below the aggregate:
   
   ```
   ProjectionExec: c, k
     AggregateExec: mode=FinalPartitioned, group_by=[random() < 0.5]
       RepartitionExec: Hash(...)
         AggregateExec: mode=Partial, group_by=[random() < 0.5]
           FilterExec: random() < 0.5          <-- second calculation of random()
             RepartitionExec: RoundRobinBatch
               DataSourceExec
   ```
   
   ### Expected behavior
   
   The query must return only one row, with `k = true`. The count must be approximately 5000.
   
   PostgreSQL 17.11 gives the expected result. It keeps the filter above the aggregate:
   
   ```sql
   CREATE TABLE v AS SELECT value AS a FROM generate_series(1, 10000) AS value;
   SELECT k, c FROM (SELECT random() < 0.5 AS k, count(*) AS c FROM v GROUP BY random() < 0.5) AS s WHERE k;
   ```
   
   ```
    k |  c
   ---+------
    t | 4949
   (1 row)
   ```
   
   ```
    Subquery Scan on s
      Filter: s.k
      ->  HashAggregate
            Group Key: (random() < '0.5'::double precision)
            ->  Seq Scan on v
   ```
   
   Note: DuckDB 1.5.2 has the same bug. It returns both `false` and `true` rows for this query, and its plan also has `FILTER (random() < 0.5)` below `HASH_GROUP_BY`. Thus DuckDB is not a correct reference for this query.
   
   ### Additional context
   
   The cause is in `PushDownFilter`, in the `LogicalPlan::Aggregate` branch ([`push_down_filter.rs`](https://github.com/apache/datafusion/blob/4e907557ad7e01d4f4bfaffc7f8df86f205ffed8/datafusion/optimizer/src/push_down_filter.rs#L998-L1030)). This branch pushes a predicate below the aggregate when all the columns of the predicate are grouping columns. It does not examine whether the grouping expression is volatile. The `LogicalPlan::Projection` branch (`rewrite_projection`) already keeps predicates on volatile expressions above the projection. The `Aggregate` branch must do the same.
   
   Found while investigating https://github.com/apache/datafusion/issues/25329 and https://github.com/apache/datafusion/pull/25388.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org


Re: [I] Filter on a volatile GROUP BY key returns rows that do not satisfy the filter [datafusion]

Posted by "adriangb (via GitHub)" <gi...@apache.org>.
adriangb closed issue #25415: Filter on a volatile GROUP BY key returns rows that do not satisfy the filter
URL: https://github.com/apache/datafusion/issues/25415


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org