PostgreSQL Source Code: src/backend/executor/execParallel.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
25
53
54
55
56
57
58
59#define PARALLEL_KEY_EXECUTOR_FIXED UINT64CONST(0xE000000000000001)
60#define PARALLEL_KEY_PLANNEDSTMT UINT64CONST(0xE000000000000002)
61#define PARALLEL_KEY_PARAMLISTINFO UINT64CONST(0xE000000000000003)
62#define PARALLEL_KEY_BUFFER_USAGE UINT64CONST(0xE000000000000004)
63#define PARALLEL_KEY_TUPLE_QUEUE UINT64CONST(0xE000000000000005)
64#define PARALLEL_KEY_INSTRUMENTATION UINT64CONST(0xE000000000000006)
65#define PARALLEL_KEY_DSA UINT64CONST(0xE000000000000007)
66#define PARALLEL_KEY_QUERY_TEXT UINT64CONST(0xE000000000000008)
67#define PARALLEL_KEY_JIT_INSTRUMENTATION UINT64CONST(0xE000000000000009)
68#define PARALLEL_KEY_WAL_USAGE UINT64CONST(0xE00000000000000A)
69
70#define PARALLEL_TUPLE_QUEUE_SIZE 65536
71
72
73
74
76{
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
100{
106
107};
108#define GetInstrumentationArray(sei) \
109 (AssertVariableIsOfTypeMacro(sei, SharedExecutorInstrumentation *), \
110 (Instrumentation *) (((char *) sei) + sei->instrument_offset))
111
112
114{
118
119
121{
126
127
134 bool reinitialize);
139
140
142
143
144
145
146static char *
148{
151
152
154
155
156
157
158
159
160
161
162
163
164 foreach(lc, plan->targetlist)
165 {
167
168 tle->resjunk = false;
169 }
170
171
172
173
174
175
194
195
196
197
198
199
200
201
204 {
206
208 subplan = NULL;
210 }
211
215 pstmt->invalItems = NIL;
220
221
223}
224
225
226
227
228
229
230
231
232
233
234static bool
236{
237 if (planstate == NULL)
238 return false;
239
240
241 e->nnodes++;
242
243 switch (nodeTag(planstate))
244 {
245 case T_SeqScanState:
248 e->pcxt);
249 break;
250 case T_IndexScanState:
251
253 e->pcxt);
254 break;
255 case T_IndexOnlyScanState:
256
258 e->pcxt);
259 break;
260 case T_BitmapIndexScanState:
261
263 e->pcxt);
264 break;
265 case T_ForeignScanState:
266 if (planstate->plan->parallel_aware)
268 e->pcxt);
269 break;
270 case T_TidRangeScanState:
271 if (planstate->plan->parallel_aware)
273 e->pcxt);
274 break;
275 case T_AppendState:
276 if (planstate->plan->parallel_aware)
278 e->pcxt);
279 break;
280 case T_CustomScanState:
281 if (planstate->plan->parallel_aware)
283 e->pcxt);
284 break;
285 case T_BitmapHeapScanState:
286 if (planstate->plan->parallel_aware)
288 e->pcxt);
289 break;
290 case T_HashJoinState:
291 if (planstate->plan->parallel_aware)
293 e->pcxt);
294 break;
295 case T_HashState:
296
298 break;
299 case T_SortState:
300
302 break;
303 case T_IncrementalSortState:
304
306 break;
307 case T_AggState:
308
310 break;
311 case T_MemoizeState:
312
314 break;
315 default:
316 break;
317 }
318
320}
321
322
323
324
327{
328 int paramid;
329 Size sz = sizeof(int);
330
331 paramid = -1;
332 while ((paramid = bms_next_member(params, paramid)) >= 0)
333 {
334 Oid typeOid;
336 bool typByVal;
338
341 paramid);
342
343 sz = add_size(sz, sizeof(int));
344
345
348 else
349 {
350
351 typLen = sizeof(Datum);
352 typByVal = true;
353 }
356 typByVal, typLen));
357 }
358 return sz;
359}
360
361
362
363
364
365
366
367
368
371{
373 int nparams;
374 int paramid;
377 char *start_address;
378
379
383
384
386 memcpy(start_address, &nparams, sizeof(int));
387 start_address += sizeof(int);
388
389
390 paramid = -1;
391 while ((paramid = bms_next_member(params, paramid)) >= 0)
392 {
393 Oid typeOid;
395 bool typByVal;
396
399 paramid);
400
401
402 memcpy(start_address, ¶mid, sizeof(int));
403 start_address += sizeof(int);
404
405
408 else
409 {
410
411 typLen = sizeof(Datum);
412 typByVal = true;
413 }
415 &start_address);
416 }
417
418 return handle;
419}
420
421
422
423
424static void
426{
427 int nparams;
428 int i;
429 int paramid;
430
431 memcpy(&nparams, start_address, sizeof(int));
432 start_address += sizeof(int);
433
434 for (i = 0; i < nparams; i++)
435 {
437
438
439 memcpy(¶mid, start_address, sizeof(int));
440 start_address += sizeof(int);
442
443
446 }
447}
448
449
450
451
452
453static bool
456{
457 if (planstate == NULL)
458 return false;
459
460
464
465
467
468
469
470
471
472
473
474
475
476
477 switch (nodeTag(planstate))
478 {
479 case T_SeqScanState:
483 break;
484 case T_IndexScanState:
485
487 break;
488 case T_IndexOnlyScanState:
489
492 break;
493 case T_BitmapIndexScanState:
494
496 break;
497 case T_ForeignScanState:
498 if (planstate->plan->parallel_aware)
501 break;
502 case T_TidRangeScanState:
503 if (planstate->plan->parallel_aware)
506 break;
507 case T_AppendState:
508 if (planstate->plan->parallel_aware)
511 break;
512 case T_CustomScanState:
513 if (planstate->plan->parallel_aware)
516 break;
517 case T_BitmapHeapScanState:
518 if (planstate->plan->parallel_aware)
521 break;
522 case T_HashJoinState:
523 if (planstate->plan->parallel_aware)
526 break;
527 case T_HashState:
528
530 break;
531 case T_SortState:
532
534 break;
535 case T_IncrementalSortState:
536
538 break;
539 case T_AggState:
540
542 break;
543 case T_MemoizeState:
544
546 break;
547 default:
548 break;
549 }
550
552}
553
554
555
556
557
560{
562 char *tqueuespace;
563 int i;
564
565
567 return NULL;
568
569
572
573
574
575
576
577 if (!reinitialize)
578 tqueuespace =
582 else
584
585
587 {
589
593
596 }
597
598
599 if (!reinitialize)
601
602
603 return responseq;
604}
605
606
607
608
609
612 Bitmapset *sendParams, int nworkers,
613 int64 tuples_needed)
614{
620 char *pstmt_data;
621 char *pstmt_space;
622 char *paramlistinfo_space;
627 int pstmt_len;
628 int paramlistinfo_len;
629 int instrumentation_len = 0;
630 int jit_instrumentation_len = 0;
631 int instrument_offset = 0;
633 char *query_string;
634 int query_len;
635
636
637
638
639
640
641
642
643
644
645
646
648
649
653
654
656
657
659 pei->pcxt = pcxt;
660
661
662
663
664
665
666
667
671
672
676
677
678 pstmt_len = strlen(pstmt_data) + 1;
681
682
686
687
688
689
690
691
692
693
697
698
699
700
704
705
709
710
711
712
713
714 e.pcxt = pcxt;
715 e.nnodes = 0;
717
718
720 {
721 instrumentation_len =
723 sizeof(int) * e.nnodes;
724 instrumentation_len = MAXALIGN(instrumentation_len);
725 instrument_offset = instrumentation_len;
726 instrumentation_len +=
731
732
734 {
735 jit_instrumentation_len =
740 }
741 }
742
743
746
747
748
749
750
751
753
754
756
757
758
759
760
761
762
763
764
765
772
773
775 memcpy(query_string, estate->es_sourceText, query_len + 1);
777
778
780 memcpy(pstmt_space, pstmt_data, pstmt_len);
782
783
787
788
793
794
799
800
802
803
805
806
807
808
809
810
812 {
814 int i;
815
822 for (i = 0; i < nworkers * e.nnodes; ++i)
825 instrumentation);
827
829 {
831 jit_instrumentation_len);
832 jit_instrumentation->num_workers = nworkers;
833 memset(jit_instrumentation->jit_instr, 0,
836 jit_instrumentation);
838 }
839 }
840
841
842
843
844
845
846 if (pcxt->seg != NULL)
847 {
848 char *area_space;
849
853 LWTRANCHE_PARALLEL_QUERY_DSA,
854 pcxt->seg);
855
856
857
858
859
860
861
863 {
867 }
868 }
869
870
871
872
873
874
875 d.pcxt = pcxt;
878
879
883
884
885
886
887
889 elog(ERROR, "inconsistent count of PlanState nodes");
890
891
892 return pei;
893}
894
895
896
897
898
899
900
901void
903{
905 int i;
906
908
909 if (nworkers > 0)
910 {
913
914 for (i = 0; i < nworkers; i++)
915 {
919 }
920 }
921}
922
923
924
925
926
927void
931{
934
935
937
938
939
940
941
942
944
949
951
952
954 {
957 }
958
959
961 {
965 }
966
967
971}
972
973
974
975
976static bool
979{
980 if (planstate == NULL)
981 return false;
982
983
984
985
986 switch (nodeTag(planstate))
987 {
988 case T_SeqScanState:
991 pcxt);
992 break;
993 case T_IndexScanState:
994 if (planstate->plan->parallel_aware)
996 pcxt);
997 break;
998 case T_IndexOnlyScanState:
999 if (planstate->plan->parallel_aware)
1001 pcxt);
1002 break;
1003 case T_ForeignScanState:
1004 if (planstate->plan->parallel_aware)
1006 pcxt);
1007 break;
1008 case T_TidRangeScanState:
1009 if (planstate->plan->parallel_aware)
1011 pcxt);
1012 break;
1013 case T_AppendState:
1014 if (planstate->plan->parallel_aware)
1016 break;
1017 case T_CustomScanState:
1018 if (planstate->plan->parallel_aware)
1020 pcxt);
1021 break;
1022 case T_BitmapHeapScanState:
1023 if (planstate->plan->parallel_aware)
1025 pcxt);
1026 break;
1027 case T_HashJoinState:
1028 if (planstate->plan->parallel_aware)
1030 pcxt);
1031 break;
1032 case T_BitmapIndexScanState:
1033 case T_HashState:
1034 case T_SortState:
1035 case T_IncrementalSortState:
1036 case T_MemoizeState:
1037
1038 break;
1039
1040 default:
1041 break;
1042 }
1043
1045}
1046
1047
1048
1049
1050
1051static bool
1054{
1056 int i;
1057 int n;
1058 int ibytes;
1061
1062
1064 if (instrumentation->plan_node_id[i] == plan_node_id)
1065 break;
1067 elog(ERROR, "plan node %d not found", plan_node_id);
1068
1069
1071 instrument += i * instrumentation->num_workers;
1072 for (n = 0; n < instrumentation->num_workers; ++n)
1074
1075
1076
1077
1078
1079
1080
1081
1087
1090
1091
1092 switch (nodeTag(planstate))
1093 {
1094 case T_IndexScanState:
1096 break;
1097 case T_IndexOnlyScanState:
1099 break;
1100 case T_BitmapIndexScanState:
1102 break;
1103 case T_SortState:
1105 break;
1106 case T_IncrementalSortState:
1108 break;
1109 case T_HashState:
1111 break;
1112 case T_AggState:
1114 break;
1115 case T_MemoizeState:
1117 break;
1118 case T_BitmapHeapScanState:
1120 break;
1121 default:
1122 break;
1123 }
1124
1126 instrumentation);
1127}
1128
1129
1130
1131
1132static void
1135{
1137 int ibytes;
1138
1139 int n;
1140
1141
1142
1143
1144
1149
1150
1151 for (n = 0; n < shared_jit->num_workers; ++n)
1153
1154
1155
1156
1157
1158
1159
1164
1166}
1167
1168
1169
1170
1171
1172void
1174{
1176 int i;
1177
1178
1180 return;
1181
1182
1183
1184
1185
1186 if (pei->tqueue != NULL)
1187 {
1188 for (i = 0; i < nworkers; i++)
1192 }
1193
1194
1195
1196
1197
1198 if (pei->reader != NULL)
1199 {
1200 for (i = 0; i < nworkers; i++)
1204 }
1205
1206
1208
1209
1210
1211
1212
1213 for (i = 0; i < nworkers; i++)
1215
1217}
1218
1219
1220
1221
1222
1223
1224
1225void
1227{
1228
1232
1233
1237
1238
1240 {
1243 }
1244 if (pei->area != NULL)
1245 {
1247 pei->area = NULL;
1248 }
1249 if (pei->pcxt != NULL)
1250 {
1252 pei->pcxt = NULL;
1253 }
1255}
1256
1257
1258
1259
1260
1263{
1264 char *mqspace;
1266
1269 mq = (shm_mq *) mqspace;
1272}
1273
1274
1275
1276
1279 int instrument_options)
1280{
1281 char *pstmtspace;
1282 char *paramspace;
1285 char *queryString;
1286
1287
1289
1290
1293
1294
1297
1298
1300 queryString,
1302 receiver, paramLI, NULL, instrument_options);
1303}
1304
1305
1306
1307
1308
1309static bool
1312{
1313 int i;
1316
1318
1319
1320
1321
1322
1323
1324
1326 if (instrumentation->plan_node_id[i] == plan_node_id)
1327 break;
1329 elog(ERROR, "plan node %d not found", plan_node_id);
1330
1331
1332
1333
1334
1336 instrument += i * instrumentation->num_workers;
1338 Assert(ParallelWorkerNumber < instrumentation->num_workers);
1340
1342 instrumentation);
1343}
1344
1345
1346
1347
1348
1349
1350static bool
1352{
1353 if (planstate == NULL)
1354 return false;
1355
1356 switch (nodeTag(planstate))
1357 {
1358 case T_SeqScanState:
1361 break;
1362 case T_IndexScanState:
1363
1365 break;
1366 case T_IndexOnlyScanState:
1367
1369 pwcxt);
1370 break;
1371 case T_BitmapIndexScanState:
1372
1374 pwcxt);
1375 break;
1376 case T_ForeignScanState:
1377 if (planstate->plan->parallel_aware)
1379 pwcxt);
1380 break;
1381 case T_TidRangeScanState:
1382 if (planstate->plan->parallel_aware)
1384 pwcxt);
1385 break;
1386 case T_AppendState:
1387 if (planstate->plan->parallel_aware)
1389 break;
1390 case T_CustomScanState:
1391 if (planstate->plan->parallel_aware)
1393 pwcxt);
1394 break;
1395 case T_BitmapHeapScanState:
1396 if (planstate->plan->parallel_aware)
1398 pwcxt);
1399 break;
1400 case T_HashJoinState:
1401 if (planstate->plan->parallel_aware)
1403 pwcxt);
1404 break;
1405 case T_HashState:
1406
1408 break;
1409 case T_SortState:
1410
1412 break;
1413 case T_IncrementalSortState:
1414
1416 pwcxt);
1417 break;
1418 case T_AggState:
1419
1421 break;
1422 case T_MemoizeState:
1423
1425 break;
1426 default:
1427 break;
1428 }
1429
1431 pwcxt);
1432}
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450void
1452{
1460 int instrument_options = 0;
1461 void *area_space;
1464
1465
1467
1468
1471 if (instrumentation != NULL)
1474 true);
1476
1477
1479
1480
1482
1483
1486
1487
1490
1491
1494 {
1495 char *paramexec_space;
1496
1499 }
1500 pwcxt.toc = toc;
1501 pwcxt.seg = seg;
1503
1504
1506
1507
1508
1509
1510
1511
1512
1513
1515
1516
1517
1518
1519
1523
1524
1526
1527
1532
1533
1534 if (instrumentation != NULL)
1536 instrumentation);
1537
1538
1539 if (queryDesc->estate->es_jit && jit_instrumentation != NULL)
1540 {
1541 Assert(ParallelWorkerNumber < jit_instrumentation->num_workers);
1544 }
1545
1546
1548
1549
1552 receiver->rDestroy(receiver);
1553}
void InitializeParallelDSM(ParallelContext *pcxt)
void WaitForParallelWorkersToFinish(ParallelContext *pcxt)
void ReinitializeParallelDSM(ParallelContext *pcxt)
void DestroyParallelContext(ParallelContext *pcxt)
ParallelContext * CreateParallelContext(const char *library_name, const char *function_name, int nworkers)
int64 pgstat_get_my_query_id(void)
void pgstat_report_activity(BackendState state, const char *cmd_str)
int64 pgstat_get_my_plan_id(void)
int bms_next_member(const Bitmapset *a, int prevbit)
int bms_num_members(const Bitmapset *a)
#define FLEXIBLE_ARRAY_MEMBER
#define OidIsValid(objectId)
Datum datumRestore(char **start_address, bool *isnull)
void datumSerialize(Datum value, bool isnull, bool typByVal, int typLen, char **start_address)
Size datumEstimateSpace(Datum value, bool isnull, bool typByVal, int typLen)
dsa_area * dsa_attach_in_place(void *place, dsm_segment *segment)
void * dsa_get_address(dsa_area *area, dsa_pointer dp)
void dsa_detach(dsa_area *area)
void dsa_free(dsa_area *area, dsa_pointer dp)
size_t dsa_minimum_size(void)
#define dsa_allocate(area, size)
#define dsa_create_in_place(place, size, tranche_id, segment)
#define InvalidDsaPointer
#define DsaPointerIsValid(x)
void ExecutorEnd(QueryDesc *queryDesc)
void ExecutorFinish(QueryDesc *queryDesc)
void ExecutorStart(QueryDesc *queryDesc, int eflags)
void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count)
#define PARALLEL_KEY_BUFFER_USAGE
static bool ExecParallelReInitializeDSM(PlanState *planstate, ParallelContext *pcxt)
#define PARALLEL_KEY_JIT_INSTRUMENTATION
struct ExecParallelEstimateContext ExecParallelEstimateContext
#define PARALLEL_KEY_PARAMLISTINFO
#define PARALLEL_TUPLE_QUEUE_SIZE
static QueryDesc * ExecParallelGetQueryDesc(shm_toc *toc, DestReceiver *receiver, int instrument_options)
static bool ExecParallelRetrieveInstrumentation(PlanState *planstate, SharedExecutorInstrumentation *instrumentation)
static dsa_pointer SerializeParamExecParams(EState *estate, Bitmapset *params, dsa_area *area)
void ExecParallelCleanup(ParallelExecutorInfo *pei)
struct ExecParallelInitializeDSMContext ExecParallelInitializeDSMContext
#define PARALLEL_KEY_INSTRUMENTATION
static DestReceiver * ExecParallelGetReceiver(dsm_segment *seg, shm_toc *toc)
void ParallelQueryMain(dsm_segment *seg, shm_toc *toc)
static shm_mq_handle ** ExecParallelSetupTupleQueues(ParallelContext *pcxt, bool reinitialize)
#define PARALLEL_KEY_PLANNEDSTMT
static bool ExecParallelEstimate(PlanState *planstate, ExecParallelEstimateContext *e)
#define GetInstrumentationArray(sei)
void ExecParallelReinitialize(PlanState *planstate, ParallelExecutorInfo *pei, Bitmapset *sendParams)
static bool ExecParallelInitializeWorker(PlanState *planstate, ParallelWorkerContext *pwcxt)
void ExecParallelCreateReaders(ParallelExecutorInfo *pei)
#define PARALLEL_KEY_TUPLE_QUEUE
#define PARALLEL_KEY_EXECUTOR_FIXED
static char * ExecSerializePlan(Plan *plan, EState *estate)
ParallelExecutorInfo * ExecInitParallelPlan(PlanState *planstate, EState *estate, Bitmapset *sendParams, int nworkers, int64 tuples_needed)
struct FixedParallelExecutorState FixedParallelExecutorState
#define PARALLEL_KEY_QUERY_TEXT
static Size EstimateParamExecSpace(EState *estate, Bitmapset *params)
void ExecParallelFinish(ParallelExecutorInfo *pei)
static bool ExecParallelReportInstrumentation(PlanState *planstate, SharedExecutorInstrumentation *instrumentation)
#define PARALLEL_KEY_WAL_USAGE
static void ExecParallelRetrieveJitInstrumentation(PlanState *planstate, SharedJitInstrumentation *shared_jit)
static bool ExecParallelInitializeDSM(PlanState *planstate, ExecParallelInitializeDSMContext *d)
static void RestoreParamExecParams(char *start_address, EState *estate)
void ExecSetTupleBound(int64 tuples_needed, PlanState *child_node)
#define GetPerTupleExprContext(estate)
#define palloc0_object(type)
Assert(PointerIsAligned(start, uint64))
#define IsParallelWorker()
void InstrAccumParallelQuery(BufferUsage *bufusage, WalUsage *walusage)
void InstrEndLoop(Instrumentation *instr)
void InstrAggNode(Instrumentation *dst, Instrumentation *add)
void InstrEndParallelQuery(BufferUsage *bufusage, WalUsage *walusage)
void InstrStartParallelQuery(void)
void InstrInit(Instrumentation *instr, int instrument_options)
void InstrJitAgg(JitInstrumentation *dst, JitInstrumentation *add)
struct JitInstrumentation JitInstrumentation
List * lappend(List *list, void *datum)
void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
void * MemoryContextAlloc(MemoryContext context, Size size)
void * MemoryContextAllocZero(MemoryContext context, Size size)
void pfree(void *pointer)
void ExecAggEstimate(AggState *node, ParallelContext *pcxt)
void ExecAggInitializeWorker(AggState *node, ParallelWorkerContext *pwcxt)
void ExecAggRetrieveInstrumentation(AggState *node)
void ExecAggInitializeDSM(AggState *node, ParallelContext *pcxt)
void ExecAppendReInitializeDSM(AppendState *node, ParallelContext *pcxt)
void ExecAppendInitializeWorker(AppendState *node, ParallelWorkerContext *pwcxt)
void ExecAppendInitializeDSM(AppendState *node, ParallelContext *pcxt)
void ExecAppendEstimate(AppendState *node, ParallelContext *pcxt)
void ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node, ParallelWorkerContext *pwcxt)
void ExecBitmapHeapEstimate(BitmapHeapScanState *node, ParallelContext *pcxt)
void ExecBitmapHeapRetrieveInstrumentation(BitmapHeapScanState *node)
void ExecBitmapHeapInitializeDSM(BitmapHeapScanState *node, ParallelContext *pcxt)
void ExecBitmapHeapReInitializeDSM(BitmapHeapScanState *node, ParallelContext *pcxt)
void ExecBitmapIndexScanEstimate(BitmapIndexScanState *node, ParallelContext *pcxt)
void ExecBitmapIndexScanInitializeDSM(BitmapIndexScanState *node, ParallelContext *pcxt)
void ExecBitmapIndexScanRetrieveInstrumentation(BitmapIndexScanState *node)
void ExecBitmapIndexScanInitializeWorker(BitmapIndexScanState *node, ParallelWorkerContext *pwcxt)
void ExecCustomScanInitializeDSM(CustomScanState *node, ParallelContext *pcxt)
void ExecCustomScanEstimate(CustomScanState *node, ParallelContext *pcxt)
void ExecCustomScanReInitializeDSM(CustomScanState *node, ParallelContext *pcxt)
void ExecCustomScanInitializeWorker(CustomScanState *node, ParallelWorkerContext *pwcxt)
void ExecForeignScanInitializeDSM(ForeignScanState *node, ParallelContext *pcxt)
void ExecForeignScanReInitializeDSM(ForeignScanState *node, ParallelContext *pcxt)
void ExecForeignScanEstimate(ForeignScanState *node, ParallelContext *pcxt)
void ExecForeignScanInitializeWorker(ForeignScanState *node, ParallelWorkerContext *pwcxt)
#define planstate_tree_walker(ps, w, c)
void ExecHashInitializeDSM(HashState *node, ParallelContext *pcxt)
void ExecHashInitializeWorker(HashState *node, ParallelWorkerContext *pwcxt)
void ExecHashEstimate(HashState *node, ParallelContext *pcxt)
void ExecHashRetrieveInstrumentation(HashState *node)
void ExecHashJoinInitializeDSM(HashJoinState *state, ParallelContext *pcxt)
void ExecHashJoinEstimate(HashJoinState *state, ParallelContext *pcxt)
void ExecHashJoinReInitializeDSM(HashJoinState *state, ParallelContext *pcxt)
void ExecHashJoinInitializeWorker(HashJoinState *state, ParallelWorkerContext *pwcxt)
void ExecIncrementalSortEstimate(IncrementalSortState *node, ParallelContext *pcxt)
void ExecIncrementalSortInitializeDSM(IncrementalSortState *node, ParallelContext *pcxt)
void ExecIncrementalSortRetrieveInstrumentation(IncrementalSortState *node)
void ExecIncrementalSortInitializeWorker(IncrementalSortState *node, ParallelWorkerContext *pwcxt)
void ExecIndexOnlyScanEstimate(IndexOnlyScanState *node, ParallelContext *pcxt)
void ExecIndexOnlyScanRetrieveInstrumentation(IndexOnlyScanState *node)
void ExecIndexOnlyScanInitializeWorker(IndexOnlyScanState *node, ParallelWorkerContext *pwcxt)
void ExecIndexOnlyScanReInitializeDSM(IndexOnlyScanState *node, ParallelContext *pcxt)
void ExecIndexOnlyScanInitializeDSM(IndexOnlyScanState *node, ParallelContext *pcxt)
void ExecIndexScanRetrieveInstrumentation(IndexScanState *node)
void ExecIndexScanEstimate(IndexScanState *node, ParallelContext *pcxt)
void ExecIndexScanReInitializeDSM(IndexScanState *node, ParallelContext *pcxt)
void ExecIndexScanInitializeDSM(IndexScanState *node, ParallelContext *pcxt)
void ExecIndexScanInitializeWorker(IndexScanState *node, ParallelWorkerContext *pwcxt)
void ExecMemoizeInitializeDSM(MemoizeState *node, ParallelContext *pcxt)
void ExecMemoizeEstimate(MemoizeState *node, ParallelContext *pcxt)
void ExecMemoizeRetrieveInstrumentation(MemoizeState *node)
void ExecMemoizeInitializeWorker(MemoizeState *node, ParallelWorkerContext *pwcxt)
void ExecSeqScanReInitializeDSM(SeqScanState *node, ParallelContext *pcxt)
void ExecSeqScanInitializeWorker(SeqScanState *node, ParallelWorkerContext *pwcxt)
void ExecSeqScanInitializeDSM(SeqScanState *node, ParallelContext *pcxt)
void ExecSeqScanEstimate(SeqScanState *node, ParallelContext *pcxt)
void ExecSortInitializeWorker(SortState *node, ParallelWorkerContext *pwcxt)
void ExecSortEstimate(SortState *node, ParallelContext *pcxt)
void ExecSortInitializeDSM(SortState *node, ParallelContext *pcxt)
void ExecSortRetrieveInstrumentation(SortState *node)
void ExecSetParamPlanMulti(const Bitmapset *params, ExprContext *econtext)
void ExecTidRangeScanEstimate(TidRangeScanState *node, ParallelContext *pcxt)
void ExecTidRangeScanInitializeWorker(TidRangeScanState *node, ParallelWorkerContext *pwcxt)
void ExecTidRangeScanInitializeDSM(TidRangeScanState *node, ParallelContext *pcxt)
void ExecTidRangeScanReInitializeDSM(TidRangeScanState *node, ParallelContext *pcxt)
char * nodeToString(const void *obj)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Size EstimateParamListSpace(ParamListInfo paramLI)
void SerializeParamList(ParamListInfo paramLI, char **start_address)
ParamListInfo RestoreParamList(char **start_address)
#define lfirst_node(type, lc)
static Oid list_nth_oid(const List *list, int n)
const char * debug_query_string
void FreeQueryDesc(QueryDesc *qdesc)
QueryDesc * CreateQueryDesc(PlannedStmt *plannedstmt, const char *sourceText, Snapshot snapshot, Snapshot crosscheck_snapshot, DestReceiver *dest, ParamListInfo params, QueryEnvironment *queryEnv, int instrument_options)
void * stringToNode(const char *str)
void shm_mq_set_sender(shm_mq *mq, PGPROC *proc)
shm_mq * shm_mq_create(void *address, Size size)
void shm_mq_set_handle(shm_mq_handle *mqh, BackgroundWorkerHandle *handle)
void shm_mq_detach(shm_mq_handle *mqh)
void shm_mq_set_receiver(shm_mq *mq, PGPROC *proc)
shm_mq_handle * shm_mq_attach(shm_mq *mq, dsm_segment *seg, BackgroundWorkerHandle *handle)
void * shm_toc_allocate(shm_toc *toc, Size nbytes)
void shm_toc_insert(shm_toc *toc, uint64 key, void *address)
void * shm_toc_lookup(shm_toc *toc, uint64 key, bool noError)
#define shm_toc_estimate_chunk(e, sz)
#define shm_toc_estimate_keys(e, cnt)
Size add_size(Size s1, Size s2)
Size mul_size(Size s1, Size s2)
Snapshot GetActiveSnapshot(void)
List * es_part_prune_infos
struct dsa_area * es_query_dsa
struct JitContext * es_jit
PlannedStmt * es_plannedstmt
struct JitInstrumentation * es_jit_worker_instr
ParamExecData * es_param_exec_vals
Bitmapset * es_unpruned_relids
ParamListInfo es_param_list_info
MemoryContext es_query_cxt
const char * es_sourceText
SharedExecutorInstrumentation * instrumentation
shm_toc_estimator estimator
ParallelWorkerInfo * worker
struct SharedJitInstrumentation * jit_instrumentation
BufferUsage * buffer_usage
SharedExecutorInstrumentation * instrumentation
struct TupleQueueReader ** reader
BackgroundWorkerHandle * bgwhandle
struct SharedJitInstrumentation * worker_jit_instrument
Instrumentation * instrument
WorkerInstrumentation * worker_instrument
Bitmapset * rewindPlanIDs
PlannedStmtOrigin planOrigin
Bitmapset * unprunableRelids
PlannedStmt * plannedstmt
Instrumentation instrument[FLEXIBLE_ARRAY_MEMBER]
void(* rDestroy)(DestReceiver *self)
DestReceiver * CreateTupleQueueDestReceiver(shm_mq_handle *handle)
TupleQueueReader * CreateTupleQueueReader(shm_mq_handle *handle)
void DestroyTupleQueueReader(TupleQueueReader *reader)