diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index dabcbb0736..878fcc2236 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -11938,7 +11938,7 @@ check_recovery_target_xid(char **newval, void **extra, GucSource source) TransactionId *myextra; errno = 0; - xid = (TransactionId) strtoul(*newval, NULL, 0); + xid = (TransactionId) pg_strtouint64(*newval, NULL, 0); if (errno == EINVAL || errno == ERANGE) return false; diff --git a/src/test/recovery/t/003_recovery_targets.pl b/src/test/recovery/t/003_recovery_targets.pl index cc701c5539..dd8e1cc47c 100644 --- a/src/test/recovery/t/003_recovery_targets.pl +++ b/src/test/recovery/t/003_recovery_targets.pl @@ -50,6 +50,10 @@ sub test_recovery_standby my $node_primary = get_new_node('primary'); $node_primary->init(has_archiving => 1, allows_streaming => 1); +# Bump the transaction ID epoch. This is useful to stress the portability +# of recovery_target_xid parsing. +system_or_bail('pg_resetwal', '--epoch', '1', $node_primary->data_dir); + # Start it $node_primary->start;