From ed0e0bd525ea16ea724e9794b5f4feddf29da497 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Thu, 15 Dec 2022 17:49:40 +1300 Subject: [PATCH v3 1/3] Re-adjust drop-index-concurrently-1 isolation test It seems that drop-index-concurrently has started to forget what it was originally meant to be testing. d2d8a229b, which added incremental sorts changed the expected plan to be an Index Scan plan instead of a Seq Scan plan. This occurred as the primary key index of the table in question provided presorted input and, because that index happened to be the cheapest input path due to enable_seqscan being disabled, the incremental sort changes just added a Sort on top of that. It seems based on the name of the PREPAREd statement that the intention here is that query produce a seqscan plan. The reason this test has become broken seems to be due to how the test was originally coded. It tried to force a seqscan plan by performing some casting to make it so the test_dc couldn't be used to perform the required filtering. This likely wasn't the best design. It seems much better just to toggle enable_seqscan to allow the planner to produce a more predictable plan. Trying to coax the planner into using a plan which has costed in a disable_cost seems like it's always going to be flakey. So let's get rid of that and put the expected plans closer to what they were originally when the test was added. Additionally, rename a few things in the test and add some additional wording to the comments to try and make it more clear in the future what we expect this test to be doing. --- .../expected/drop-index-concurrently-1.out | 31 ++++++++++--------- .../expected/drop-index-concurrently-1_2.out | 31 ++++++++++--------- .../specs/drop-index-concurrently-1.spec | 22 +++++++------ 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/test/isolation/expected/drop-index-concurrently-1.out b/src/test/isolation/expected/drop-index-concurrently-1.out index 97e1a6e779..1cb2250891 100644 --- a/src/test/isolation/expected/drop-index-concurrently-1.out +++ b/src/test/isolation/expected/drop-index-concurrently-1.out @@ -1,17 +1,17 @@ Parsed test spec with 3 sessions -starting permutation: noseq chkiso prepi preps begin explaini explains select2 drop insert2 end2 selecti selects end -step noseq: SET enable_seqscan = false; +starting permutation: chkiso prepi preps begin disableseq explaini enableseq explains select2 drop insert2 end2 selecti selects end step chkiso: SELECT (setting in ('read committed','read uncommitted')) AS is_read_committed FROM pg_settings WHERE name = 'default_transaction_isolation'; is_read_committed ----------------- t (1 row) -step prepi: PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; -step preps: PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text ORDER BY id,data; +step prepi: PREPARE getrow_idxscan AS SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; +step preps: PREPARE getrow_seqscan AS SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; step begin: BEGIN; -step explaini: EXPLAIN (COSTS OFF) EXECUTE getrow_idx; +step disableseq: SET enable_seqscan = false; +step explaini: EXPLAIN (COSTS OFF) EXECUTE getrow_idxscan; QUERY PLAN ---------------------------------------------- Sort @@ -20,16 +20,17 @@ Sort Index Cond: (data = 34) (4 rows) -step explains: EXPLAIN (COSTS OFF) EXECUTE getrow_seq; -QUERY PLAN ----------------------------------------------- -Sort - Sort Key: id, data - -> Index Scan using test_dc_pkey on test_dc - Filter: ((data)::text = '34'::text) +step enableseq: SET enable_seqscan = true; +step explains: EXPLAIN (COSTS OFF) EXECUTE getrow_seqscan; +QUERY PLAN +--------------------------- +Sort + Sort Key: id + -> Seq Scan on test_dc + Filter: (data = 34) (4 rows) -step select2: SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; +step select2: SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; id|data --+---- 34| 34 @@ -38,14 +39,14 @@ id|data step drop: DROP INDEX CONCURRENTLY test_dc_data; step insert2: INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); step end2: COMMIT; -step selecti: EXECUTE getrow_idx; +step selecti: EXECUTE getrow_idxscan; id|data ---+---- 34| 34 134| 34 (2 rows) -step selects: EXECUTE getrow_seq; +step selects: EXECUTE getrow_seqscan; id|data ---+---- 34| 34 diff --git a/src/test/isolation/expected/drop-index-concurrently-1_2.out b/src/test/isolation/expected/drop-index-concurrently-1_2.out index 04612d3cac..266b0e4ada 100644 --- a/src/test/isolation/expected/drop-index-concurrently-1_2.out +++ b/src/test/isolation/expected/drop-index-concurrently-1_2.out @@ -1,17 +1,17 @@ Parsed test spec with 3 sessions -starting permutation: noseq chkiso prepi preps begin explaini explains select2 drop insert2 end2 selecti selects end -step noseq: SET enable_seqscan = false; +starting permutation: chkiso prepi preps begin disableseq explaini enableseq explains select2 drop insert2 end2 selecti selects end step chkiso: SELECT (setting in ('read committed','read uncommitted')) AS is_read_committed FROM pg_settings WHERE name = 'default_transaction_isolation'; is_read_committed ----------------- f (1 row) -step prepi: PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; -step preps: PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text ORDER BY id,data; +step prepi: PREPARE getrow_idxscan AS SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; +step preps: PREPARE getrow_seqscan AS SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; step begin: BEGIN; -step explaini: EXPLAIN (COSTS OFF) EXECUTE getrow_idx; +step disableseq: SET enable_seqscan = false; +step explaini: EXPLAIN (COSTS OFF) EXECUTE getrow_idxscan; QUERY PLAN ---------------------------------------------- Sort @@ -20,16 +20,17 @@ Sort Index Cond: (data = 34) (4 rows) -step explains: EXPLAIN (COSTS OFF) EXECUTE getrow_seq; -QUERY PLAN ----------------------------------------------- -Sort - Sort Key: id, data - -> Index Scan using test_dc_pkey on test_dc - Filter: ((data)::text = '34'::text) +step enableseq: SET enable_seqscan = true; +step explains: EXPLAIN (COSTS OFF) EXECUTE getrow_seqscan; +QUERY PLAN +--------------------------- +Sort + Sort Key: id + -> Seq Scan on test_dc + Filter: (data = 34) (4 rows) -step select2: SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; +step select2: SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; id|data --+---- 34| 34 @@ -38,13 +39,13 @@ id|data step drop: DROP INDEX CONCURRENTLY test_dc_data; step insert2: INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); step end2: COMMIT; -step selecti: EXECUTE getrow_idx; +step selecti: EXECUTE getrow_idxscan; id|data --+---- 34| 34 (1 row) -step selects: EXECUTE getrow_seq; +step selects: EXECUTE getrow_seqscan; id|data --+---- 34| 34 diff --git a/src/test/isolation/specs/drop-index-concurrently-1.spec b/src/test/isolation/specs/drop-index-concurrently-1.spec index 812b5de226..a57a02469d 100644 --- a/src/test/isolation/specs/drop-index-concurrently-1.spec +++ b/src/test/isolation/specs/drop-index-concurrently-1.spec @@ -3,7 +3,8 @@ # This test shows that the concurrent write behaviour works correctly # with the expected output being 2 rows at the READ COMMITTED and READ # UNCOMMITTED transaction isolation levels, and 1 row at the other -# transaction isolation levels. +# transaction isolation levels. We ensure this is the case by checking +# the returned rows in an index scan plan and a seq scan plan. # setup { @@ -18,24 +19,25 @@ teardown } session s1 -step noseq { SET enable_seqscan = false; } step chkiso { SELECT (setting in ('read committed','read uncommitted')) AS is_read_committed FROM pg_settings WHERE name = 'default_transaction_isolation'; } -step prepi { PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; } -step preps { PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text ORDER BY id,data; } +step prepi { PREPARE getrow_idxscan AS SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; } +step preps { PREPARE getrow_seqscan AS SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; } step begin { BEGIN; } -step explaini { EXPLAIN (COSTS OFF) EXECUTE getrow_idx; } -step explains { EXPLAIN (COSTS OFF) EXECUTE getrow_seq; } -step selecti { EXECUTE getrow_idx; } -step selects { EXECUTE getrow_seq; } +step disableseq { SET enable_seqscan = false; } +step explaini { EXPLAIN (COSTS OFF) EXECUTE getrow_idxscan; } +step enableseq { SET enable_seqscan = true; } +step explains { EXPLAIN (COSTS OFF) EXECUTE getrow_seqscan; } +step selecti { EXECUTE getrow_idxscan; } +step selects { EXECUTE getrow_seqscan; } step end { COMMIT; } session s2 setup { BEGIN; } -step select2 { SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; } +step select2 { SELECT * FROM test_dc WHERE data = 34 ORDER BY id,data; } step insert2 { INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); } step end2 { COMMIT; } session s3 step drop { DROP INDEX CONCURRENTLY test_dc_data; } -permutation noseq chkiso prepi preps begin explaini explains select2 drop insert2 end2 selecti selects end +permutation chkiso prepi preps begin disableseq explaini enableseq explains select2 drop insert2 end2 selecti selects end -- 2.35.1.windows.2