diff --git a/expected/parallel.out b/expected/parallel.out index 2e0b053..eeb49b8 100644 --- a/expected/parallel.out +++ b/expected/parallel.out @@ -70,6 +70,15 @@ set parallel_setup_cost=0; set parallel_tuple_cost=0; set min_parallel_table_scan_size=0; set max_parallel_workers_per_gather=2; +-- Test a sampled parallel hash join. Parallel Hash nodes may have +-- instrumentation even when their child was executed by another worker. +set enable_nestloop=false; +set enable_mergejoin=false; +/*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000005-01'*/ select count(*) from pg_tracing_test r join pg_tracing_test s using (a) \gset +\echo :count +10000 +CALL clean_spans(); +-- Test leaderless parallel query set parallel_leader_participation=false; /*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000001-01'*/ select 1 from pg_class limit 1; ?column? diff --git a/regress/16/expected/parallel.out b/regress/16/expected/parallel.out index 2e0b053..eeb49b8 100644 --- a/regress/16/expected/parallel.out +++ b/regress/16/expected/parallel.out @@ -70,6 +70,15 @@ set parallel_setup_cost=0; set parallel_tuple_cost=0; set min_parallel_table_scan_size=0; set max_parallel_workers_per_gather=2; +-- Test a sampled parallel hash join. Parallel Hash nodes may have +-- instrumentation even when their child was executed by another worker. +set enable_nestloop=false; +set enable_mergejoin=false; +/*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000005-01'*/ select count(*) from pg_tracing_test r join pg_tracing_test s using (a) \gset +\echo :count +10000 +CALL clean_spans(); +-- Test leaderless parallel query set parallel_leader_participation=false; /*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000001-01'*/ select 1 from pg_class limit 1; ?column? diff --git a/regress/17/expected/parallel.out b/regress/17/expected/parallel.out index 2e0b053..eeb49b8 100644 --- a/regress/17/expected/parallel.out +++ b/regress/17/expected/parallel.out @@ -70,6 +70,15 @@ set parallel_setup_cost=0; set parallel_tuple_cost=0; set min_parallel_table_scan_size=0; set max_parallel_workers_per_gather=2; +-- Test a sampled parallel hash join. Parallel Hash nodes may have +-- instrumentation even when their child was executed by another worker. +set enable_nestloop=false; +set enable_mergejoin=false; +/*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000005-01'*/ select count(*) from pg_tracing_test r join pg_tracing_test s using (a) \gset +\echo :count +10000 +CALL clean_spans(); +-- Test leaderless parallel query set parallel_leader_participation=false; /*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000001-01'*/ select 1 from pg_class limit 1; ?column? diff --git a/regress/18/expected/parallel.out b/regress/18/expected/parallel.out index 2e0b053..eeb49b8 100644 --- a/regress/18/expected/parallel.out +++ b/regress/18/expected/parallel.out @@ -70,6 +70,15 @@ set parallel_setup_cost=0; set parallel_tuple_cost=0; set min_parallel_table_scan_size=0; set max_parallel_workers_per_gather=2; +-- Test a sampled parallel hash join. Parallel Hash nodes may have +-- instrumentation even when their child was executed by another worker. +set enable_nestloop=false; +set enable_mergejoin=false; +/*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000005-01'*/ select count(*) from pg_tracing_test r join pg_tracing_test s using (a) \gset +\echo :count +10000 +CALL clean_spans(); +-- Test leaderless parallel query set parallel_leader_participation=false; /*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000001-01'*/ select 1 from pg_class limit 1; ?column? diff --git a/sql/parallel.sql b/sql/parallel.sql index 9a139f1..7d52b42 100644 --- a/sql/parallel.sql +++ b/sql/parallel.sql @@ -41,6 +41,16 @@ set parallel_setup_cost=0; set parallel_tuple_cost=0; set min_parallel_table_scan_size=0; set max_parallel_workers_per_gather=2; + +-- Test a sampled parallel hash join. Parallel Hash nodes may have +-- instrumentation even when their child was executed by another worker. +set enable_nestloop=false; +set enable_mergejoin=false; +/*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000005-01'*/ select count(*) from pg_tracing_test r join pg_tracing_test s using (a) \gset +\echo :count +CALL clean_spans(); + +-- Test leaderless parallel query set parallel_leader_participation=false; /*dddbs='postgres.db',traceparent='00-00000000000000000000000000000001-0000000000000001-01'*/ select 1 from pg_class limit 1; diff --git a/src/pg_tracing_planstate.c b/src/pg_tracing_planstate.c index 184b457..4a78e18 100644 --- a/src/pg_tracing_planstate.c +++ b/src/pg_tracing_planstate.c @@ -395,10 +395,12 @@ create_spans_from_planstate(PlanState *planstate, planstateTraceContext * planst span_id = generate_rnd_uint64(); break; case T_Hash: - /* For hash node, use the child's start */ + /* The child may be executed by another parallel worker */ traced_planstate = get_traced_planstate(outerPlanState(planstate)); - Assert(traced_planstate != NULL); - span_start = traced_planstate->node_start; + if (traced_planstate != NULL) + span_start = traced_planstate->node_start; + else + span_start = parent_start; /* * We still need to generate a dedicated span_id since