Hi all,
When attempting to use multiple times pg_replication_slot_advance on a
slot, then the caller gets back directly InvalidXLogRecPtr as result,
for example:
=# select * from pg_replication_slot_advance('popo', 'FF/0');
slot_name | end_lsn
-----------+-----------
popo | 0/60021E0
(1 row)
=# select * from pg_replication_slot_advance('popo', 'FF/0');
slot_name | end_lsn
-----------+---------
popo | 0/0
(1 row)Wouldn't it be more simple to return NULL to mean that the slot could not be moved forward? That would be easier to parse for clients. Please see the attached. Thanks, -- Michael
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index b851fe023a..df63201eb3 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -19329,7 +19329,8 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup());
Advances the current confirmed position of a replication slot named
<parameter>slot_name</parameter>. The slot will not be moved backwards,
and it will not be moved beyond the current insert location. Returns
- name of the slot and real position to which it was advanced to.
+ name of the slot and real position to which it was advanced to, or
+ <literal>NULL</literal> if the slot could not be advanced.
</entry>
</row>
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index d9e10263bb..cd8fc1560a 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -502,9 +502,17 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
ReplicationSlotRelease();
- /* Return the reached position. */
- values[1] = LSNGetDatum(endlsn);
- nulls[1] = false;
+ /*
+ * Return the reached position, or NULL if the slot has not been
+ * advanced.
+ */
+ if (XLogRecPtrIsInvalid(endlsn))
+ nulls[1] = true;
+ else
+ {
+ values[1] = LSNGetDatum(endlsn);
+ nulls[1] = false;
+ }
tuple = heap_form_tuple(tupdesc, values, nulls);
result = HeapTupleGetDatum(tuple);
signature.asc
Description: PGP signature
