Fix ExecReScanGatherMerge.

Not surprisingly, since it'd never ever been tested, ExecReScanGatherMerge
didn't work.  Fix it, and add a regression test case to exercise it.

Amit Kapila

Discussion: https://postgr.es/m/CAA4eK1JkByysFJNh9M349u_nNjqETuEnY_y1VUc_kJiU0bxtaQ@mail.gmail.com
This commit is contained in:
Tom Lane 2017-08-17 13:49:22 -04:00
parent b5178c5d08
commit a2b70c89ca
3 changed files with 60 additions and 0 deletions

View File

@ -334,6 +334,7 @@ ExecReScanGatherMerge(GatherMergeState *node)
ExecShutdownGatherMergeWorkers(node);
node->initialized = false;
node->gm_initialized = false;
if (node->pei)
ExecParallelReinitialize(node->pei);

View File

@ -300,6 +300,49 @@ select count(*) from tenk1 group by twenty;
500
(20 rows)
--test rescan behavior of gather merge
set enable_material = false;
explain (costs off)
select * from
(select string4, count(unique2)
from tenk1 group by string4 order by string4) ss
right join (values (1),(2),(3)) v(x) on true;
QUERY PLAN
----------------------------------------------------------
Nested Loop Left Join
-> Values Scan on "*VALUES*"
-> Finalize GroupAggregate
Group Key: tenk1.string4
-> Gather Merge
Workers Planned: 4
-> Partial GroupAggregate
Group Key: tenk1.string4
-> Sort
Sort Key: tenk1.string4
-> Parallel Seq Scan on tenk1
(11 rows)
select * from
(select string4, count(unique2)
from tenk1 group by string4 order by string4) ss
right join (values (1),(2),(3)) v(x) on true;
string4 | count | x
---------+-------+---
AAAAxx | 2500 | 1
HHHHxx | 2500 | 1
OOOOxx | 2500 | 1
VVVVxx | 2500 | 1
AAAAxx | 2500 | 2
HHHHxx | 2500 | 2
OOOOxx | 2500 | 2
VVVVxx | 2500 | 2
AAAAxx | 2500 | 3
HHHHxx | 2500 | 3
OOOOxx | 2500 | 3
VVVVxx | 2500 | 3
(12 rows)
reset enable_material;
-- gather merge test with 0 worker
set max_parallel_workers = 0;
explain (costs off)

View File

@ -118,6 +118,22 @@ explain (costs off)
select count(*) from tenk1 group by twenty;
--test rescan behavior of gather merge
set enable_material = false;
explain (costs off)
select * from
(select string4, count(unique2)
from tenk1 group by string4 order by string4) ss
right join (values (1),(2),(3)) v(x) on true;
select * from
(select string4, count(unique2)
from tenk1 group by string4 order by string4) ss
right join (values (1),(2),(3)) v(x) on true;
reset enable_material;
-- gather merge test with 0 worker
set max_parallel_workers = 0;
explain (costs off)