mirror of https://github.com/citusdata/citus.git
Merge pull request #579 from citusdata/fix/569_count_distinct_crash
Fix crash in count distinct with filters in repartition subqueriespull/563/head
commit
c42c393cc5
|
@ -1360,9 +1360,7 @@ MasterAggregateExpression(Aggref *originalAggregate,
|
||||||
walkerContext->repartitionSubquery)
|
walkerContext->repartitionSubquery)
|
||||||
{
|
{
|
||||||
Aggref *aggregate = (Aggref *) copyObject(originalAggregate);
|
Aggref *aggregate = (Aggref *) copyObject(originalAggregate);
|
||||||
List *aggTargetEntryList = aggregate->args;
|
List *varList = pull_var_clause_default((Node *) aggregate);
|
||||||
TargetEntry *distinctTargetEntry = linitial(aggTargetEntryList);
|
|
||||||
List *varList = pull_var_clause_default((Node *) distinctTargetEntry->expr);
|
|
||||||
ListCell *varCell = NULL;
|
ListCell *varCell = NULL;
|
||||||
List *uniqueVarList = NIL;
|
List *uniqueVarList = NIL;
|
||||||
int startColumnCount = walkerContext->columnId;
|
int startColumnCount = walkerContext->columnId;
|
||||||
|
@ -1878,22 +1876,12 @@ WorkerAggregateExpressionList(Aggref *originalAggregate,
|
||||||
walkerContext->repartitionSubquery)
|
walkerContext->repartitionSubquery)
|
||||||
{
|
{
|
||||||
Aggref *aggregate = (Aggref *) copyObject(originalAggregate);
|
Aggref *aggregate = (Aggref *) copyObject(originalAggregate);
|
||||||
List *aggTargetEntryList = aggregate->args;
|
List *columnList = pull_var_clause_default((Node *) aggregate);
|
||||||
TargetEntry *distinctTargetEntry = (TargetEntry *) linitial(aggTargetEntryList);
|
|
||||||
List *columnList = pull_var_clause_default((Node *) distinctTargetEntry);
|
|
||||||
ListCell *columnCell = NULL;
|
ListCell *columnCell = NULL;
|
||||||
List *processedColumnList = NIL;
|
|
||||||
|
|
||||||
foreach(columnCell, columnList)
|
foreach(columnCell, columnList)
|
||||||
{
|
{
|
||||||
Var *column = (Var *) lfirst(columnCell);
|
Var *column = (Var *) lfirst(columnCell);
|
||||||
if (list_member(processedColumnList, column))
|
workerAggregateList = list_append_unique(workerAggregateList, column);
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
processedColumnList = lappend(processedColumnList, column);
|
|
||||||
workerAggregateList = lappend(workerAggregateList, copyObject(column));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
walkerContext->createGroupByClause = true;
|
walkerContext->createGroupByClause = true;
|
||||||
|
|
|
@ -76,6 +76,34 @@ SELECT *
|
||||||
ORDER BY 2 DESC, 1 DESC
|
ORDER BY 2 DESC, 1 DESC
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
|
|
||||||
|
-- there is a known issue with aggregates with filters in non-repartition queries (#395)
|
||||||
|
SELECT
|
||||||
|
l_orderkey, count(DISTINCT l_partkey) FILTER (WHERE l_shipmode = 'AIR')
|
||||||
|
FROM lineitem_hash
|
||||||
|
GROUP BY l_orderkey
|
||||||
|
ORDER BY 2 DESC, 1 DESC
|
||||||
|
LIMIT 10;
|
||||||
|
|
||||||
|
-- filter column already exists in target list
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
l_orderkey, count(DISTINCT l_partkey) FILTER (WHERE l_orderkey > 100)
|
||||||
|
FROM lineitem_hash
|
||||||
|
GROUP BY l_orderkey) sub
|
||||||
|
ORDER BY 2 DESC, 1 DESC
|
||||||
|
LIMIT 10;
|
||||||
|
|
||||||
|
-- filter column does not exist in target list
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
l_orderkey, count(DISTINCT l_partkey) FILTER (WHERE l_shipmode = 'AIR')
|
||||||
|
FROM lineitem_hash
|
||||||
|
GROUP BY l_orderkey) sub
|
||||||
|
ORDER BY 2 DESC, 1 DESC
|
||||||
|
LIMIT 10;
|
||||||
|
|
||||||
-- case expr in count distinct is supported.
|
-- case expr in count distinct is supported.
|
||||||
-- count orders partkeys if l_shipmode is air
|
-- count orders partkeys if l_shipmode is air
|
||||||
SELECT *
|
SELECT *
|
||||||
|
|
|
@ -122,6 +122,60 @@ SELECT *
|
||||||
1927 | 3
|
1927 | 3
|
||||||
(10 rows)
|
(10 rows)
|
||||||
|
|
||||||
|
-- there is a known issue with aggregates with filters in non-repartition queries (#395)
|
||||||
|
SELECT
|
||||||
|
l_orderkey, count(DISTINCT l_partkey) FILTER (WHERE l_shipmode = 'AIR')
|
||||||
|
FROM lineitem_hash
|
||||||
|
GROUP BY l_orderkey
|
||||||
|
ORDER BY 2 DESC, 1 DESC
|
||||||
|
LIMIT 10;
|
||||||
|
ERROR: attribute number 15 exceeds number of columns 2
|
||||||
|
-- filter column already exists in target list
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
l_orderkey, count(DISTINCT l_partkey) FILTER (WHERE l_orderkey > 100)
|
||||||
|
FROM lineitem_hash
|
||||||
|
GROUP BY l_orderkey) sub
|
||||||
|
ORDER BY 2 DESC, 1 DESC
|
||||||
|
LIMIT 10;
|
||||||
|
l_orderkey | count
|
||||||
|
------------+-------
|
||||||
|
14885 | 7
|
||||||
|
14884 | 7
|
||||||
|
14821 | 7
|
||||||
|
14790 | 7
|
||||||
|
14785 | 7
|
||||||
|
14755 | 7
|
||||||
|
14725 | 7
|
||||||
|
14694 | 7
|
||||||
|
14627 | 7
|
||||||
|
14624 | 7
|
||||||
|
(10 rows)
|
||||||
|
|
||||||
|
-- filter column does not exist in target list
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
l_orderkey, count(DISTINCT l_partkey) FILTER (WHERE l_shipmode = 'AIR')
|
||||||
|
FROM lineitem_hash
|
||||||
|
GROUP BY l_orderkey) sub
|
||||||
|
ORDER BY 2 DESC, 1 DESC
|
||||||
|
LIMIT 10;
|
||||||
|
l_orderkey | count
|
||||||
|
------------+-------
|
||||||
|
12005 | 4
|
||||||
|
5409 | 4
|
||||||
|
4964 | 4
|
||||||
|
14848 | 3
|
||||||
|
14496 | 3
|
||||||
|
13473 | 3
|
||||||
|
13122 | 3
|
||||||
|
12929 | 3
|
||||||
|
12645 | 3
|
||||||
|
12417 | 3
|
||||||
|
(10 rows)
|
||||||
|
|
||||||
-- case expr in count distinct is supported.
|
-- case expr in count distinct is supported.
|
||||||
-- count orders partkeys if l_shipmode is air
|
-- count orders partkeys if l_shipmode is air
|
||||||
SELECT *
|
SELECT *
|
||||||
|
|
Loading…
Reference in New Issue