This is a new bug in PG12. When you have a database with an OID above INT32_MAX (signed), then pg_basebackup fails thus:

pg_basebackup: error: could not get write-ahead log end position from server: ERROR: value "3000000000" is out of range for type integer

The cause appears to be commit 6b9e875f7286d8535bff7955e5aa3602e188e436.

A possible fix is attached. An alternative to using OidInputFunctionCall() would be exporting something like oidin_subr().

--
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 19ee6b09568b4247c33c2920277dde2fbd3f0ac4 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Sun, 29 Dec 2019 20:15:50 +0100
Subject: [PATCH] Fix base backup with database OIDs larger than INT32_MAX

---
 src/backend/replication/basebackup.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/backend/replication/basebackup.c 
b/src/backend/replication/basebackup.c
index a73893237a..0e3e0c7a38 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -38,6 +38,7 @@
 #include "storage/ipc.h"
 #include "storage/reinit.h"
 #include "utils/builtins.h"
+#include "utils/fmgroids.h"
 #include "utils/ps_status.h"
 #include "utils/relcache.h"
 #include "utils/timestamp.h"
@@ -1316,7 +1317,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, 
List *tablespaces,
 
                        if (!sizeonly)
                                sent = sendFile(pathbuf, pathbuf + basepathlen 
+ 1, &statbuf,
-                                                               true, isDbDir ? 
pg_atoi(lastDir + 1, sizeof(Oid), 0) : InvalidOid);
+                                                               true, isDbDir ? 
DatumGetObjectId(OidInputFunctionCall(F_OIDIN, unconstify(char *, lastDir + 1), 
0, -1)) : InvalidOid);
 
                        if (sent || sizeonly)
                        {
-- 
2.24.1

Reply via email to