diff options
Diffstat (limited to 'src/bin/pg_basebackup/streamutil.c')
-rw-r--r-- | src/bin/pg_basebackup/streamutil.c | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index 0ed61440b09..a5cad350f8a 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -31,6 +31,8 @@ #include "common/fe_memutils.h" #include "datatype/timestamp.h" +#define ERRCODE_DUPLICATE_OBJECT "42710" + const char *progname; char *connection_string = NULL; char *dbhost = NULL; @@ -314,7 +316,7 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli, */ bool CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, - XLogRecPtr *startpos, bool is_physical) + bool is_physical, bool slot_exists_ok) { PQExpBuffer query; PGresult *res; @@ -336,12 +338,23 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, res = PQexec(conn, query->data); if (PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), - progname, query->data, PQerrorMessage(conn)); + const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE); - destroyPQExpBuffer(query); - PQclear(res); - return false; + if (slot_exists_ok && strcmp(sqlstate, ERRCODE_DUPLICATE_OBJECT) == 0) + { + destroyPQExpBuffer(query); + PQclear(res); + return true; + } + else + { + fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), + progname, query->data, PQerrorMessage(conn)); + + destroyPQExpBuffer(query); + PQclear(res); + return false; + } } if (PQntuples(res) != 1 || PQnfields(res) != 4) @@ -356,25 +369,6 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, return false; } - /* Get LSN start position if necessary */ - if (startpos != NULL) - { - uint32 hi, - lo; - - if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &hi, &lo) != 2) - { - fprintf(stderr, - _("%s: could not parse transaction log location \"%s\"\n"), - progname, PQgetvalue(res, 0, 1)); - - destroyPQExpBuffer(query); - PQclear(res); - return false; - } - *startpos = ((uint64) hi) << 32 | lo; - } - destroyPQExpBuffer(query); PQclear(res); return true; |