@@ -405,3 +405,84 @@ ExecInitTidRangeScan(TidRangeScan *node, EState *estate, int eflags)
405
405
*/
406
406
return tidrangestate ;
407
407
}
408
+ /* ----------------------------------------------------------------
409
+ * Parallel Scan Support
410
+ * ----------------------------------------------------------------
411
+ */
412
+
413
+ /* ----------------------------------------------------------------
414
+ * ExecTidRangeScanEstimate
415
+ *
416
+ * Compute the amount of space we'll need in the parallel
417
+ * query DSM, and inform pcxt->estimator about our needs.
418
+ * ----------------------------------------------------------------
419
+ */
420
+ void
421
+ ExecTidRangeScanEstimate (TidRangeScanState * node ,
422
+ ParallelContext * pcxt )
423
+ {
424
+ EState * estate = node -> ss .ps .state ;
425
+
426
+ node -> trss_pscanlen = table_parallelscan_estimate (node -> ss .ss_currentRelation ,
427
+ estate -> es_snapshot );
428
+ shm_toc_estimate_chunk (& pcxt -> estimator , node -> trss_pscanlen );
429
+ shm_toc_estimate_keys (& pcxt -> estimator , 1 );
430
+ }
431
+
432
+ /* ----------------------------------------------------------------
433
+ * ExecTidRangeScanInitializeDSM
434
+ *
435
+ * Set up a parallel TID scan descriptor.
436
+ * ----------------------------------------------------------------
437
+ */
438
+ void
439
+ ExecTidRangeScanInitializeDSM (TidRangeScanState * node ,
440
+ ParallelContext * pcxt )
441
+ {
442
+ EState * estate = node -> ss .ps .state ;
443
+ ParallelTableScanDesc pscan ;
444
+
445
+ pscan = shm_toc_allocate (pcxt -> toc , node -> trss_pscanlen );
446
+ table_parallelscan_initialize (node -> ss .ss_currentRelation ,
447
+ pscan ,
448
+ estate -> es_snapshot );
449
+ /* disable syncscan in parallel tid range scan. */
450
+ pscan -> phs_syncscan = false;
451
+ shm_toc_insert (pcxt -> toc , node -> ss .ps .plan -> plan_node_id , pscan );
452
+ node -> ss .ss_currentScanDesc =
453
+ table_beginscan_parallel_tidrange (node -> ss .ss_currentRelation , pscan );
454
+ }
455
+
456
+ /* ----------------------------------------------------------------
457
+ * ExecTidRangeScanReInitializeDSM
458
+ *
459
+ * Reset shared state before beginning a fresh scan.
460
+ * ----------------------------------------------------------------
461
+ */
462
+ void
463
+ ExecTidRangeScanReInitializeDSM (TidRangeScanState * node ,
464
+ ParallelContext * pcxt )
465
+ {
466
+ ParallelTableScanDesc pscan ;
467
+
468
+ pscan = node -> ss .ss_currentScanDesc -> rs_parallel ;
469
+ table_parallelscan_reinitialize (node -> ss .ss_currentRelation , pscan );
470
+
471
+ }
472
+
473
+ /* ----------------------------------------------------------------
474
+ * ExecTidRangeScanInitializeWorker
475
+ *
476
+ * Copy relevant information from TOC into planstate.
477
+ * ----------------------------------------------------------------
478
+ */
479
+ void
480
+ ExecTidRangeScanInitializeWorker (TidRangeScanState * node ,
481
+ ParallelWorkerContext * pwcxt )
482
+ {
483
+ ParallelTableScanDesc pscan ;
484
+
485
+ pscan = shm_toc_lookup (pwcxt -> toc , node -> ss .ps .plan -> plan_node_id , false);
486
+ node -> ss .ss_currentScanDesc =
487
+ table_beginscan_parallel_tidrange (node -> ss .ss_currentRelation , pscan );
488
+ }
0 commit comments