From d877f19e986409c2937d3f13be1c0b702be8aca3 Mon Sep 17 00:00:00 2001
From: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Mon, 23 Jun 2025 18:18:57 -0700
Subject: [PATCH v2] Fix cache-dependent test failures in logical decoding.

The regression test added in commit 1230be12f failed with
CLOBBER_CACHE_ALWAYS builds as it depends on cache behavior. This test
failure occurred only on v13 because the original data loss problem
was fixed differently in v13 compared to v14 and later versions,
resulting in different expected-output files.

This commit adds an extra expected-output file to cover both regular
and CLOBBER_CACHE_ALWAYS build cases.

Oversight in 1230be12f.

Per buildfarm member trilobite.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Reviewed-by: Amit Kapila <amit.kapila16@gmail.com>
Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/dbf561f7-465e-4086-adfa-733b9b9a34b3@gmail.com
---
 .../expected/invalidation_distribution_1.out  | 41 +++++++++++++++++++
 .../specs/invalidation_distribution.spec      | 10 +++++
 2 files changed, 51 insertions(+)
 create mode 100644 contrib/test_decoding/expected/invalidation_distribution_1.out

diff --git a/contrib/test_decoding/expected/invalidation_distribution_1.out b/contrib/test_decoding/expected/invalidation_distribution_1.out
new file mode 100644
index 00000000000..e5a19becb68
--- /dev/null
+++ b/contrib/test_decoding/expected/invalidation_distribution_1.out
@@ -0,0 +1,41 @@
+Parsed test spec with 3 sessions
+
+starting permutation: s1_insert_tbl1 s1_begin s1_insert_tbl1 s2_alter_pub_add_tbl s1_commit s1_insert_tbl1 s2_get_binary_changes
+step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
+step s1_begin: BEGIN;
+step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
+step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1;
+step s1_commit: COMMIT;
+step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
+step s2_get_binary_changes: SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '1', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73;
+count
+-----
+    1
+(1 row)
+
+?column?
+--------
+stop    
+(1 row)
+
+
+starting permutation: s1_begin s1_insert_tbl1 s3_begin s3_insert_tbl1 s2_alter_pub_add_tbl s1_insert_tbl1 s1_commit s3_commit s2_get_binary_changes
+step s1_begin: BEGIN;
+step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
+step s3_begin: BEGIN;
+step s3_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (2, 2);
+step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1;
+step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
+step s1_commit: COMMIT;
+step s3_commit: COMMIT;
+step s2_get_binary_changes: SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '1', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73;
+count
+-----
+    1
+(1 row)
+
+?column?
+--------
+stop    
+(1 row)
+
diff --git a/contrib/test_decoding/specs/invalidation_distribution.spec b/contrib/test_decoding/specs/invalidation_distribution.spec
index c5977b8c483..c36ee2d59e5 100644
--- a/contrib/test_decoding/specs/invalidation_distribution.spec
+++ b/contrib/test_decoding/specs/invalidation_distribution.spec
@@ -1,6 +1,10 @@
 # Test that catalog cache invalidation messages are distributed to ongoing
 # transactions, ensuring they can access the updated catalog content after
 # processing these messages.
+#
+# This file contains a cache-behavior-dependent test case. Its result is
+# different between regular and CLOBBER_CACHE_ALWAYS builds, so we must have
+# two expected-output files to cover both cases.
 setup
 {
     SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'pgoutput');
@@ -40,4 +44,10 @@ permutation "s1_insert_tbl1" "s1_begin" "s1_insert_tbl1" "s2_alter_pub_add_tbl"
 # Expect to get no change because both s1's and s3's transactions
 # use the snapshot from before adding the table tbl1 to the
 # publication by "s2_alter_pub_add_tbl".
+#
+# Note that with CLOBBER_CACHE_ALWAYS, we expect to get one insert
+# change with LOGICAL_REP_MSG_INSERT = 'I' from the second
+# "s1_insert_tbl1" executed after adding the table tbl1 to the
+# publication in "s2_alter_pub_add_tbl" as the cache for table tbl1
+# is forcibly flushed due to CLOBBER_CACHE_ALWAYS.
 permutation "s1_begin" "s1_insert_tbl1" "s3_begin" "s3_insert_tbl1" "s2_alter_pub_add_tbl" "s1_insert_tbl1" "s1_commit" "s3_commit" "s2_get_binary_changes"
-- 
2.43.5

