mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Teach bitmap heap scan to cope with absence of a DSA.
If we have a plan that uses parallelism but are unable to execute it using parallelism, for example due to a lack of available DSM segments, then the EState's es_query_dsa will be NULL. Parallel bitmap heap scan needs to fall back to a non-parallel scan in such cases. Patch by me, reviewed by Dilip Kumar Discussion: http://postgr.es/m/CAEepm=0kADK5inNf_KuemjX=HQ=PuTP0DykM--fO5jS5ePVFEA@mail.gmail.com
This commit is contained in:
parent
e42e2f3890
commit
c6755e233b
@ -1051,6 +1051,11 @@ ExecBitmapHeapInitializeDSM(BitmapHeapScanState *node,
|
||||
{
|
||||
ParallelBitmapHeapState *pstate;
|
||||
EState *estate = node->ss.ps.state;
|
||||
dsa_area *dsa = node->ss.ps.state->es_query_dsa;
|
||||
|
||||
/* If there's no DSA, there are no workers; initialize nothing. */
|
||||
if (dsa == NULL)
|
||||
return;
|
||||
|
||||
pstate = shm_toc_allocate(pcxt->toc, node->pscan_len);
|
||||
|
||||
@ -1083,6 +1088,10 @@ ExecBitmapHeapReInitializeDSM(BitmapHeapScanState *node,
|
||||
ParallelBitmapHeapState *pstate = node->pstate;
|
||||
dsa_area *dsa = node->ss.ps.state->es_query_dsa;
|
||||
|
||||
/* If there's no DSA, there are no workers; do nothing. */
|
||||
if (dsa == NULL)
|
||||
return;
|
||||
|
||||
pstate->state = BM_INITIAL;
|
||||
|
||||
if (DsaPointerIsValid(pstate->tbmiterator))
|
||||
@ -1108,6 +1117,8 @@ ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node,
|
||||
ParallelBitmapHeapState *pstate;
|
||||
Snapshot snapshot;
|
||||
|
||||
Assert(node->ss.ps.state->es_query_dsa != NULL);
|
||||
|
||||
pstate = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false);
|
||||
node->pstate = pstate;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user