1
0
mirror of https://github.com/postgres/postgres.git synced 2026-10-23 13:29:09 +03:00

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
This commit is contained in:
Fujii Masao
2026-07-25 10:30:30 +09:00
parent 72207b17da
commit bb6125ca3a

View File

@@ -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);