diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 59dc394..f11d4e4 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -62,6 +62,7 @@ #define PARALLEL_KEY_ACTIVE_SNAPSHOT UINT64CONST(0xFFFFFFFFFFFF0007) #define PARALLEL_KEY_TRANSACTION_STATE UINT64CONST(0xFFFFFFFFFFFF0008) #define PARALLEL_KEY_EXTENSION_TRAMPOLINE UINT64CONST(0xFFFFFFFFFFFF0009) +#define QUERY_TEXT UINT64CONST(0xE000000000000010) /* Fixed-size parallel state. */ typedef struct FixedParallelState @@ -208,10 +209,16 @@ InitializeParallelDSM(ParallelContext *pcxt) Size tstatelen = 0; Size segsize = 0; int i; + char *query_string; + char *query_data; + int query_len; FixedParallelState *fps; Snapshot transaction_snapshot = GetTransactionSnapshot(); Snapshot active_snapshot = GetActiveSnapshot(); + query_data = (char *)palloc(strlen(debug_query_string)); + strcpy(query_data, debug_query_string); + /* We might be running in a very short-lived memory context. */ oldcontext = MemoryContextSwitchTo(TopTransactionContext); @@ -259,6 +266,9 @@ InitializeParallelDSM(ParallelContext *pcxt) + strlen(pcxt->function_name) + 2); shm_toc_estimate_keys(&pcxt->estimator, 1); } + query_len = strlen(query_data) + 1; + shm_toc_estimate_chunk(&pcxt->estimator, query_len); + shm_toc_estimate_keys(&pcxt->estimator, 1); } /* @@ -303,6 +313,11 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->last_xlog_end = 0; shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); + /* Store query string */ + query_string = shm_toc_allocate(pcxt->toc, query_len); + memcpy(query_string, query_data, query_len); + shm_toc_insert(pcxt->toc, QUERY_TEXT, query_string); + /* We can skip the rest of this if we're not budgeting for any workers. */ if (pcxt->nworkers > 0) { @@ -1042,6 +1057,7 @@ ParallelWorkerMain(Datum main_arg) /* Restore database connection. */ BackgroundWorkerInitializeConnectionByOid(fps->database_id, fps->authenticated_user_id); + pgstat_report_activity(STATE_RUNNING, shm_toc_lookup(toc, QUERY_TEXT)); /* * Set the client encoding to the database encoding, since that is what diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c index 5aa6f02..fa533d5 100644 --- a/src/backend/executor/execParallel.c +++ b/src/backend/executor/execParallel.c @@ -50,6 +50,7 @@ #define PARALLEL_TUPLE_QUEUE_SIZE 65536 +#define QUERY_TEXT UINT64CONST(0xE000000000000010) /* * DSM structure for accumulating per-PlanState instrumentation. * @@ -607,6 +608,10 @@ ExecParallelGetQueryDesc(shm_toc *toc, DestReceiver *receiver, char *paramspace; PlannedStmt *pstmt; ParamListInfo paramLI; + char *queryString; + + /* Get the query string from shared memory */ + queryString = shm_toc_lookup(toc, QUERY_TEXT); /* Reconstruct leader-supplied PlannedStmt. */ pstmtspace = shm_toc_lookup(toc, PARALLEL_KEY_PLANNEDSTMT); @@ -625,7 +630,7 @@ ExecParallelGetQueryDesc(shm_toc *toc, DestReceiver *receiver, * revising this someday. */ return CreateQueryDesc(pstmt, - "", + queryString, GetActiveSnapshot(), InvalidSnapshot, receiver, paramLI, instrument_options); }