postgres.git / summary / log / commit / refs
commit bb6125ca3ac756a44be9ef574e89aa5cff482afb
Author: Fujii Masao <fujii@postgresql.org>
Date: Sat Jul 25 01:30:30 2026 +0000
Avoid reporting permission-denied publisher sequences as missing
Previously, if a sequence synchronization batch contained both a sequence
that had been dropped on the publisher and another for which the
replication role lacked SELECT privilege, the latter was reported
twice: once as a permission failure and again as missing on the
publisher.
This happened because the permission-denied sequence was not marked as
found on the publisher. As a result, when another sequence in the batch
was genuinely missing, the later missing-sequence check incorrectly
classified the permission-denied sequence as missing as well.
Fix this by marking the permission-denied sequence as found before
reporting the permission failure, so it is not later reported as
missing.
Reported-by: Noah Misch <noah@leadboat.com>
Author: Vignesh C <vignesh21@gmail.com>
Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
Discussion: https://postgr.es/m/CALDaNm3LsUjW7PahuCsbYAxajSF+S328tw5E9rF0erdh7dKOXw@mail.gmail.com
Backpatch-through: 19
src/backend/replication/logical/sequencesync.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/backend/replication/logical/sequencesync.c b/src/backend/replication/logical/sequencesync.c
index 06946afe683..69a1a4c0473 100644
--- a/src/backend/replication/logical/sequencesync.c
+++ b/src/backend/replication/logical/sequencesync.c
@@ -308,8 +308,24 @@ get_and_validate_seq_info(TupleTableSlot *slot, Relation *sequence_rel,
*/
datum = slot_getattr(slot, ++col, &isnull);
if (isnull)
- return remote_has_select_priv ? COPYSEQ_SKIPPED :
- COPYSEQ_PUBLISHER_INSUFFICIENT_PERM;
+ {
+ /*
+ * The sequence was dropped concurrently after it was identified in
+ * the catalog snapshot. Treat it as skipped (and, since it no longer
+ * exists on the publisher, ultimately missing).
+ */
+ if (remote_has_select_priv)
+ return COPYSEQ_SKIPPED;
+
+ /*
+ * The publisher lacks the SELECT privilege required by
+ * pg_get_sequence_data(). Since has_sequence_privilege() returned
+ * false, not NULL, do not classify this sequence as missing on the
+ * publisher.
+ */
+ seqinfo_local->found_on_pub = true;
+ return COPYSEQ_PUBLISHER_INSUFFICIENT_PERM;
+ }
seqinfo_local->last_value = DatumGetInt64(datum);
[parent: 72207b17daa3]