Reproduce debug_query_string==NULL on parallel workers.
authorNoah Misch
Sat, 31 Oct 2020 15:43:28 +0000 (08:43 -0700)
committerNoah Misch
Sat, 31 Oct 2020 15:44:13 +0000 (08:44 -0700)
Certain background workers initiate parallel queries while
debug_query_string==NULL, at which point they attempted strlen(NULL) and
died to SIGSEGV.  Older debug_query_string observers allow NULL, so do
likewise in these newer ones.  Back-patch to v11, where commit
7de4a1bcc56f494acbd0d6e70781df877dc8ecb5 introduced the first of these.

Discussion: https://postgr.es/m/20201014022636[email protected]

src/backend/access/nbtree/nbtsort.c

index 1aa2363f1a59f9a83d67929023d75539c4118e3f..286d2cc93f197daf2e850a3deee7f41bfb4a6e42 100644 (file)
@@ -1341,7 +1341,6 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
    BTLeader   *btleader = (BTLeader *) palloc0(sizeof(BTLeader));
    BufferUsage *bufferusage;
    bool        leaderparticipates = true;
-   char       *sharedquery;
    int         querylen;
 
 #ifdef DISABLE_LEADER_PARTICIPATION
@@ -1404,9 +1403,14 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
    shm_toc_estimate_keys(&pcxt->estimator, 1);
 
    /* Finally, estimate PARALLEL_KEY_QUERY_TEXT space */
-   querylen = strlen(debug_query_string);
-   shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1);
-   shm_toc_estimate_keys(&pcxt->estimator, 1);
+   if (debug_query_string)
+   {
+       querylen = strlen(debug_query_string);
+       shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1);
+       shm_toc_estimate_keys(&pcxt->estimator, 1);
+   }
+   else
+       querylen = 0;           /* keep compiler quiet */
 
    /* Everyone's had a chance to ask for space, so now create the DSM */
    InitializeParallelDSM(pcxt);
@@ -1470,9 +1474,14 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
    }
 
    /* Store query string for workers */
-   sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1);
-   memcpy(sharedquery, debug_query_string, querylen + 1);
-   shm_toc_insert(pcxt->toc, PARALLEL_KEY_QUERY_TEXT, sharedquery);
+   if (debug_query_string)
+   {
+       char       *sharedquery;
+
+       sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1);
+       memcpy(sharedquery, debug_query_string, querylen + 1);
+       shm_toc_insert(pcxt->toc, PARALLEL_KEY_QUERY_TEXT, sharedquery);
+   }
 
    /* Allocate space for each worker's BufferUsage; no need to initialize */
    bufferusage = shm_toc_allocate(pcxt->toc,
@@ -1669,7 +1678,7 @@ _bt_parallel_build_main(dsm_segment *seg, shm_toc *toc)
 #endif                         /* BTREE_BUILD_STATS */
 
    /* Set debug_query_string for individual workers first */
-   sharedquery = shm_toc_lookup(toc, PARALLEL_KEY_QUERY_TEXT, false);
+   sharedquery = shm_toc_lookup(toc, PARALLEL_KEY_QUERY_TEXT, true);
    debug_query_string = sharedquery;
 
    /* Report the query string from leader */