Commit 4ea03f3f authored by Tom Lane's avatar Tom Lane

Improve stability of partition_prune regression test.

This test already knew that, to get stable test output, it had to hide
"loops" counts in EXPLAIN ANALYZE results.  But that's not nearly enough:
if we get a smaller number of workers than we planned for, then the
"Workers Launched" number will change, and so will all the rows and loops
counts up to the Gather node.  This has resulted in repeated failures in
the buildfarm, so adjust the test to filter out all these counts.

(Really, we wouldn't bother with EXPLAIN ANALYZE at all here, except
that currently the only way to verify that executor-time pruning has
happened is to look for '(never executed)' annotations.  Those are
stable and needn't be filtered out.)

Back-patch to v11 where the test was introduced.

Discussion: https://postgr.es/m/11952.1569536725@sss.pgh.pa.us
parent 55282fa2
...@@ -451,9 +451,14 @@ drop table list_part; ...@@ -451,9 +451,14 @@ drop table list_part;
-- Parallel append -- Parallel append
-- Suppress the number of loops each parallel node runs for. This is because -- Parallel queries won't necessarily get as many workers as the planner
-- more than one worker may run the same parallel node if timing conditions -- asked for. This affects not only the "Workers Launched:" field of EXPLAIN
-- are just right, which destabilizes the test. -- results, but also row counts and loop counts for parallel scans, Gathers,
-- and everything in between. This function filters out the values we can't
-- rely on to be stable.
-- This removes enough info that you might wonder why bother with EXPLAIN
-- ANALYZE at all. The answer is that we need to see '(never executed)'
-- notations because that's the only way to verify runtime pruning.
create function explain_parallel_append(text) returns setof text create function explain_parallel_append(text) returns setof text
language plpgsql as language plpgsql as
$$ $$
...@@ -464,9 +469,8 @@ begin ...@@ -464,9 +469,8 @@ begin
execute format('explain (analyze, costs off, summary off, timing off) %s', execute format('explain (analyze, costs off, summary off, timing off) %s',
$1) $1)
loop loop
if ln like '%Parallel%' then ln := regexp_replace(ln, 'Workers Launched: \d+', 'Workers Launched: N');
ln := regexp_replace(ln, 'loops=\d*', 'loops=N'); ln := regexp_replace(ln, 'actual rows=\d+ loops=\d+', 'actual rows=N loops=N');
end if;
return next ln; return next ln;
end loop; end loop;
end; end;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment