Repository navigation
Closed
Labels
bugSomething isn't workingSomething isn't workingregressionSomething that used to work no longer doesSomething that used to work no longer does
Description
Describe the bug
Wrong result when there are 2 count distinct in the select clause,
To Reproduce
I will share there file with @alamb because I cannot attached .parquet file here
Bug
-- BUG
SELECT COUNT(DISTINCT host) AS servers_count, count(distinct pool) as pool_count, server_role, os, env, datacenter from '/tmp/file.parquet' WHERE time >= '2024-02-25T00:00:00Z' and time < '2024-02-25T00:00:01Z' and server_role = 'mesg' GROUP BY server_role, os, env, datacenter;
+---------------+------------+-------------+---------+------------+------------+
| servers_count | pool_count | server_role | os | env | datacenter |
+---------------+------------+-------------+---------+------------+------------+
| 1 | 1 | mesg | windows | production | mn |
| 2 | 2 | mesg | windows | production | va | -- should have 4 servers_count and 3 pool_count
+---------------+------------+-------------+---------+------------+------------+Here are other queries running in DF CLI that tell me the right results
SELECT DISTINCT host, server_role, os, env, datacenter from '/tmp/file.parquet' WHERE time >= '2024-02-25T00:00:00Z' and time < '2024-02-25T00:00:01Z' and server_role = 'mesg' order by datacenter;
+---------------+-------------+---------+------------+------------+
| host | server_role | os | env | datacenter |
+---------------+-------------+---------+------------+------------+
| mpm-mesg1002c | mesg | windows | production | mn |
| vpm-mesg1001c | mesg | windows | production | va |
| vpm-mesg1005b | mesg | windows | production | va |
| vpm-mesg1008d | mesg | windows | production | va |
| vpm-mesg1007b | mesg | windows | production | va |
+---------------+-------------+---------+------------+------------+
SELECT DISTINCT pool, server_role, os, env, datacenter from '/tmp/file.parquet' WHERE time >= '2024-02-25T00:00:00Z' and time < '2024-02-25T00:00:01Z' and server_role = 'mesg' order by datacenter;
+------+-------------+---------+------------+------------+
| pool | server_role | os | env | datacenter |
+------+-------------+---------+------------+------------+
| c | mesg | windows | production | mn |
| b | mesg | windows | production | va |
| c | mesg | windows | production | va |
| d | mesg | windows | production | va |
+------+-------------+---------+------------+------------+
SELECT COUNT(DISTINCT host) AS servers_count, "server_role", "os", "env", "datacenter" from '/tmp/file.parquet' WHERE time >= '2024-02-25T00:00:00Z' and time < '2024-02-25T00:00:01Z' and server_role = 'mesg' GROUP BY "server_role", "os", "env", "datacenter";
+---------------+-------------+---------+------------+------------+
| servers_count | server_role | os | env | datacenter |
+---------------+-------------+---------+------------+------------+
| 4 | mesg | windows | production | va |
| 1 | mesg | windows | production | mn |
+---------------+-------------+---------+------------+------------+
SELECT count(distinct pool) as pool_count, "server_role", "os", "env", "datacenter" from '/tmp/file.parquet' WHERE time >= '2024-02-25T00:00:00Z' and time < '2024-02-25T00:00:01Z' and server_role = 'mesg' GROUP BY "server_role", "os", "env", "datacenter";
+------------+-------------+---------+------------+------------+
| pool_count | server_role | os | env | datacenter |
+------------+-------------+---------+------------+------------+
| 1 | mesg | windows | production | mn |
| 3 | mesg | windows | production | va |
+------------+-------------+---------+------------+------------+Expected behavior
SELECT COUNT(DISTINCT host) AS servers_count, count(distinct pool) as pool_count, server_role, os, env, datacenter from '/tmp/file.parquet' WHERE time >= '2024-02-25T00:00:00Z' and time < '2024-02-25T00:00:01Z' and server_role = 'mesg' GROUP BY server_role, os, env, datacenter;
+---------------+------------+-------------+---------+------------+------------+
| servers_count | pool_count | server_role | os | env | datacenter |
+---------------+------------+-------------+---------+------------+------------+
| 1 | 1 | mesg | windows | production | mn |
| 4 | 3 | mesg | windows | production | va |
+---------------+------------+-------------+---------+------------+------------+
### Additional context
_No response_
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workingregressionSomething that used to work no longer doesSomething that used to work no longer does
Activity
viirya commentedon Mar 12, 2024
cc @huaxingao
alamb commentedon Mar 12, 2024
Here is the schema:
alamb commentedon Mar 12, 2024
An update here is that @erratic-pattern is working on creating a reproducer we can share on this ticket
NGA-TRAN commentedon Mar 14, 2024
Many thanks to @erratic-pattern who has identified the PR that introduce:
Issue is related to this PR for array aggregate order and distinct.
the commit immediately before it works correctly with the above queries.
in arrow-datafusion:
if you then try to run the same query after the above PR, you get the incorrect result:
bug.sql:
We are working to share the file
kallisti-dev commentedon Mar 14, 2024
I am continuing to investigate this to see if I can create a minimal reproduction.
alamb commentedon Mar 15, 2024
I have a theory about what is wrong
I think this change from #9234
https://github.com/apache/arrow-datafusion/pull/9234/files#diff-a292ca8deeaaff7ba19bad4adf609c476ff383db56249f75cb6aeab77e887744R245-R248
effectively skips all but the first intermediate result when combining data together
Here is the code on main, specificaly, that I think should look at all elements in the array:
https://github.com/apache/arrow-datafusion/blob/3c26e597aeacde0a5e6a51f30394d3d31c6acd96/datafusion/physical-expr/src/aggregate/count_distinct/mod.rs#L256
So to find a reproducer it would need:
GROUP BYI think the best idea here is to make a fuzz test that triggers the issue (randomly send inputs). We can potentially follow the model here:
https://github.com/apache/arrow-datafusion/blob/main/datafusion/core/tests/fuzz_cases/aggregate_fuzz.rs
I will try to do so later today if no one beats me to it
alamb commentedon Mar 15, 2024
Here is a self contained reproducer with just datafusion-cli
Step 1: Create data
Now, run queries
Running the same query against the non dictionary encoded column in
testproduces the correct result:alamb commentedon Mar 18, 2024
I plan to fix this issue
[-]Wrong result when there are 2 count(distinct)[/-][+]Regression: Wrong result when there are 2 count(distinct)[/+]