From b4b8efbd3826ac0af2d1c2e7c40fcf80a4bfba45 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 14:18:03 +0200 Subject: Adding upstream version 15.6. Signed-off-by: Daniel Baumann --- src/test/subscription/t/100_bugs.pl | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'src/test/subscription/t/100_bugs.pl') diff --git a/src/test/subscription/t/100_bugs.pl b/src/test/subscription/t/100_bugs.pl index 61c9f53..28ca4af 100644 --- a/src/test/subscription/t/100_bugs.pl +++ b/src/test/subscription/t/100_bugs.pl @@ -365,4 +365,57 @@ is( $node_subscriber_d_cols->safe_psql( $node_publisher_d_cols->stop('fast'); $node_subscriber_d_cols->stop('fast'); +# The bug was that pgoutput was incorrectly replacing missing attributes in +# tuples with NULL. This could result in incorrect replication with +# `REPLICA IDENTITY FULL`. + +$node_publisher->rotate_logfile(); +$node_publisher->start(); + +$node_subscriber->rotate_logfile(); +$node_subscriber->start(); + +# Set up a table with schema `(a int, b bool)` where the `b` attribute is +# missing for one row due to the `ALTER TABLE ... ADD COLUMN ... DEFAULT` +# fast path. +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE tab_default (a int); + ALTER TABLE tab_default REPLICA IDENTITY FULL; + INSERT INTO tab_default VALUES (1); + ALTER TABLE tab_default ADD COLUMN b bool DEFAULT false NOT NULL; + INSERT INTO tab_default VALUES (2, true); + CREATE PUBLICATION pub1 FOR TABLE tab_default; +)); + +# Replicate to the subscriber. +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE TABLE tab_default (a int, b bool); + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub1; +)); + +$node_subscriber->wait_for_subscription_sync($node_publisher, 'sub1'); +my $result = $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_default"); +is($result, qq(1|f +2|t), 'check snapshot on subscriber'); + +# Update all rows in the table and ensure the rows with the missing `b` +# attribute replicate correctly. +$node_publisher->safe_psql('postgres', + "UPDATE tab_default SET a = a + 1"); +$node_publisher->wait_for_catchup('sub1'); + +# When the bug is present, the `1|f` row will not be updated to `2|f` because +# the publisher incorrectly fills in `NULL` for `b` and publishes an update +# for `1|NULL`, which doesn't exist in the subscriber. +$result = $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_default"); +is($result, qq(2|f +3|t), 'check replicated update on subscriber'); + +$node_publisher->stop('fast'); +$node_subscriber->stop('fast'); + done_testing(); -- cgit v1.2.3