From 346d7cd7fa5723d45b52b1e61c0cb0ba41a8ce99 Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Thu, 10 Jun 2010 07:00:27 +0000
Subject: [PATCH] Return NULL instead of 0/0 in pg_last_xlog_receive_location()
 and pg_last_xlog_replay_location(). Per Robert Haas's suggestion, after
 Itagaki Takahiro pointed out an issue in the docs. Also, some wording changes
 in the docs by me.

---
 doc/src/sgml/func.sgml            | 19 +++++++++----------
 src/backend/access/transam/xlog.c |  8 +++++++-
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index fc7ec51a1a9..f4831359215 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.517 2010/06/05 14:56:36 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.518 2010/06/10 07:00:25 heikki Exp $ -->
 
  <chapter id="functions">
   <title>Functions and Operators</title>
@@ -13280,13 +13280,12 @@ postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
         <literal><function>pg_last_xlog_receive_location</function>()</literal>
         </entry>
        <entry><type>text</type></entry>
-       <entry>Get last transaction log location received and synced to disk during
-        streaming recovery. If streaming recovery is still in progress
-        this will increase monotonically. If streaming recovery has completed
-        then this value will remain static at the value of the last WAL record
-        received and synced to disk during that recovery. When the server has
-        been started without a streaming recovery then the return value will be
-        InvalidXLogRecPtr (0/0).
+       <entry>Get last transaction log location received and synced to disk by
+        streaming replication. While streaming replication is in progress
+        this will increase monotonically. If recovevery has completed
+        this will remain static at the value of the last WAL record
+        received and synced to disk during recovery. If streaming replication
+        is disabled, or it has not yet started, the function returns NULL.
        </entry>
       </row>
       <row>
@@ -13298,8 +13297,8 @@ postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
         If recovery is still in progress this will increase monotonically.
         If recovery has completed then this value will remain static at
         the value of the last WAL record applied during that recovery.
-        When the server has been started normally without a recovery
-        then the return value will be InvalidXLogRecPtr (0/0).
+        When the server has been started normally without recovery
+        the function returns NULL.
        </entry>
       </row>
      </tbody>
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 4718b538e89..ecd7df2107a 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.419 2010/06/09 15:04:06 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.420 2010/06/10 07:00:27 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -8757,6 +8757,9 @@ pg_last_xlog_receive_location(PG_FUNCTION_ARGS)
 
 	recptr = GetWalRcvWriteRecPtr();
 
+	if (recptr.xlogid == 0 && recptr.xrecoff == 0)
+		PG_RETURN_NULL();
+
 	snprintf(location, sizeof(location), "%X/%X",
 			 recptr.xlogid, recptr.xrecoff);
 	PG_RETURN_TEXT_P(cstring_to_text(location));
@@ -8780,6 +8783,9 @@ pg_last_xlog_replay_location(PG_FUNCTION_ARGS)
 	recptr = xlogctl->recoveryLastRecPtr;
 	SpinLockRelease(&xlogctl->info_lck);
 
+	if (recptr.xlogid == 0 && recptr.xrecoff == 0)
+		PG_RETURN_NULL();
+
 	snprintf(location, sizeof(location), "%X/%X",
 			 recptr.xlogid, recptr.xrecoff);
 	PG_RETURN_TEXT_P(cstring_to_text(location));
-- 
GitLab