]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Teach bitmap heap scan to cope with absence of a DSA.
authorRobert Haas <rhaas@postgresql.org>
Tue, 28 Nov 2017 16:39:16 +0000 (11:39 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 28 Nov 2017 16:49:01 +0000 (11:49 -0500)
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

src/backend/executor/nodeBitmapHeapscan.c

index f7e55e0b45bd54e4f2fcd571147c53b012e53873..b7be62e92d6510db255b56a764d202c384dd5d91 100644 (file)
@@ -963,6 +963,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);
 
@@ -995,6 +1000,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))
@@ -1019,6 +1028,8 @@ ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node, shm_toc *toc)
        ParallelBitmapHeapState *pstate;
        Snapshot        snapshot;
 
+       Assert(node->ss.ps.state->es_query_dsa != NULL);
+
        pstate = shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, false);
        node->pstate = pstate;