]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix publisher retain_dead_tuples check when also changing origin.
authorAmit Kapila <akapila@postgresql.org>
Mon, 8 Jun 2026 05:29:05 +0000 (10:59 +0530)
committerAmit Kapila <akapila@postgresql.org>
Mon, 8 Jun 2026 05:29:05 +0000 (10:59 +0530)
In AlterSubscription(), when the SET clause includes both
retain_dead_tuples and origin options, the origin branch was using
assignment (=) rather than bitwise-or assignment (|=) when setting
check_pub_rdt. This meant that if retain_dead_tuples had already set the
flag to true in the same command, the origin branch would silently
overwrite it. As a result, the publisher-side retain_dead_tuples check
could be incorrectly skipped.

Fix by changing the assignment to |= so that the flag accumulates across
both option branches within the same ALTER SUBSCRIPTION command.

Author: SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com>
Reviewed-by: Zhijie Hou <houzj.fnst@fujitsu.com>
Reviewed-by: Amit Kapila <amit.kapila16@gmail.com>
Discussion: https://postgr.es/m/CAHg+QDfe7WPOhVGKzv83ZB+BmXM88r=KPQn1sa_ZXMMChcNo=A@mail.gmail.com

src/backend/commands/subscriptioncmds.c

index 523959ba0ce6aece5c13c5778651347d6852a620..fd026b304c24fa4ef7b258475222d6acd2b9b25c 100644 (file)
@@ -1748,9 +1748,11 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt,
                                        /*
                                         * Check if changes from different origins may be received
                                         * from the publisher when the origin is changed to ANY
-                                        * and retain_dead_tuples is enabled.
+                                        * and retain_dead_tuples is enabled. Use |= so that we
+                                        * don't clear the flag already set when
+                                        * retain_dead_tuples was changed in the same command.
                                         */
-                                       check_pub_rdt = retain_dead_tuples &&
+                                       check_pub_rdt |= retain_dead_tuples &&
                                                pg_strcasecmp(opts.origin, LOGICALREP_ORIGIN_ANY) == 0;
 
                                        origin = opts.origin;