Merge pull request #579 from citusdata/fix/569_count_distinct_crash

Fix crash in count distinct with filters in repartition subqueries
pull/563/head
Murat Tuncer 2016-06-09 12:01:07 +03:00
commit c42c393cc5
3 changed files with 85 additions and 15 deletions

View File

@ -1360,9 +1360,7 @@ MasterAggregateExpression(Aggref *originalAggregate,
walkerContext->repartitionSubquery)
{
Aggref *aggregate = (Aggref *) copyObject(originalAggregate);
List *aggTargetEntryList = aggregate->args;
TargetEntry *distinctTargetEntry = linitial(aggTargetEntryList);
List *varList = pull_var_clause_default((Node *) distinctTargetEntry->expr);
List *varList = pull_var_clause_default((Node *) aggregate);
ListCell *varCell = NULL;
List *uniqueVarList = NIL;
int startColumnCount = walkerContext->columnId;
@ -1878,22 +1876,12 @@ WorkerAggregateExpressionList(Aggref *originalAggregate,
walkerContext->repartitionSubquery)
{
Aggref *aggregate = (Aggref *) copyObject(originalAggregate);
List *aggTargetEntryList = aggregate->args;
TargetEntry *distinctTargetEntry = (TargetEntry *) linitial(aggTargetEntryList);
List *columnList = pull_var_clause_default((Node *) distinctTargetEntry);
List *columnList = pull_var_clause_default((Node *) aggregate);
ListCell *columnCell = NULL;
List *processedColumnList = NIL;
foreach(columnCell, columnList)
{
Var *column = (Var *) lfirst(columnCell);
if (list_member(processedColumnList, column))
{
continue;
}
processedColumnList = lappend(processedColumnList, column);
workerAggregateList = lappend(workerAggregateList, copyObject(column));
workerAggregateList = list_append_unique(workerAggregateList, column);
}
walkerContext->createGroupByClause = true;

View File

@ -76,6 +76,34 @@ SELECT *
ORDER BY 2 DESC, 1 DESC
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.
-- count orders partkeys if l_shipmode is air
SELECT *

View File

@ -122,6 +122,60 @@ SELECT *
1927 | 3
(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.
-- count orders partkeys if l_shipmode is air
SELECT *