From: Jehan-Guillaume de Rorthais Date: Tue, 23 Jul 2019 17:28:44 +0200 Subject: [PATCH] Support pg_walfile_name on standby Support executing both SQL functions pg_walfile_name() and pg_walfile_name_offset() on a standby. --- src/backend/access/transam/xlogfuncs.c | 39 +++++++++++++++++--------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index b35043bf71..86c4d8382b 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -460,13 +460,7 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) TupleDesc resultTupleDesc; HeapTuple resultHeapTuple; Datum result; - - if (RecoveryInProgress()) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("recovery is in progress"), - errhint("%s cannot be executed during recovery.", - "pg_walfile_name_offset()"))); + TimeLineID tl; /* * Construct a tuple descriptor for the result row. This must match this @@ -480,11 +474,24 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) resultTupleDesc = BlessTupleDesc(resultTupleDesc); + if (RecoveryInProgress()) + { + GetWalRcvWriteRecPtr(NULL, &tl); + + if (!tl) + { + isnull[0] = isnull[1] = true; + goto result; + } + } + else + tl = ThisTimeLineID; + /* * xlogfilename */ XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); - XLogFileName(xlogfilename, ThisTimeLineID, xlogsegno, wal_segment_size); + XLogFileName(xlogfilename, tl, xlogsegno, wal_segment_size); values[0] = CStringGetTextDatum(xlogfilename); isnull[0] = false; @@ -497,6 +504,7 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) values[1] = UInt32GetDatum(xrecoff); isnull[1] = false; +result: /* * Tuple jam: Having first prepared your Datums, then squash together */ @@ -517,16 +525,19 @@ pg_walfile_name(PG_FUNCTION_ARGS) XLogSegNo xlogsegno; XLogRecPtr locationpoint = PG_GETARG_LSN(0); char xlogfilename[MAXFNAMELEN]; + TimeLineID tl; if (RecoveryInProgress()) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("recovery is in progress"), - errhint("%s cannot be executed during recovery.", - "pg_walfile_name()"))); + { + GetWalRcvWriteRecPtr(NULL, &tl); + if (!tl) + PG_RETURN_NULL(); + } + else + tl = ThisTimeLineID; XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); - XLogFileName(xlogfilename, ThisTimeLineID, xlogsegno, wal_segment_size); + XLogFileName(xlogfilename, tl, xlogsegno, wal_segment_size); PG_RETURN_TEXT_P(cstring_to_text(xlogfilename)); } -- 2.20.1 --MP_/ioOWfsqs/5fRg3CRPtZ8uQl--