mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Don't call data type input functions in GUC check hooks
Instead of calling pg_lsn_in() in check_recovery_target_lsn and timestamptz_in() in check_recovery_target_time, reorganize the respective code so that we don't raise any errors in the check hooks. The previous code tried to use PG_TRY/PG_CATCH to handle errors in a way that is not safe, so now the code contains no ereport() calls and can operate safely within the GUC error handling system. Moreover, since the interpretation of the recovery_target_time string may depend on the time zone, we cannot do the final processing of that string until all the GUC processing is done. Instead, check_recovery_target_time() now does some parsing for syntax checking, but the actual conversion to a timestamptz value is done later in the recovery code that uses it. Reported-by: Andres Freund <andres@anarazel.de> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://www.postgresql.org/message-id/flat/20190611061115.njjwkagvxp4qujhp%40alap3.anarazel.de
This commit is contained in:
@ -272,7 +272,8 @@ RecoveryTargetType recoveryTarget = RECOVERY_TARGET_UNSET;
|
||||
bool recoveryTargetInclusive = true;
|
||||
int recoveryTargetAction = RECOVERY_TARGET_ACTION_PAUSE;
|
||||
TransactionId recoveryTargetXid;
|
||||
TimestampTz recoveryTargetTime;
|
||||
char *recovery_target_time_string;
|
||||
static TimestampTz recoveryTargetTime;
|
||||
const char *recoveryTargetName;
|
||||
XLogRecPtr recoveryTargetLSN;
|
||||
int recovery_min_apply_delay = 0;
|
||||
@ -5409,6 +5410,18 @@ validateRecoveryParameters(void)
|
||||
!EnableHotStandby)
|
||||
recoveryTargetAction = RECOVERY_TARGET_ACTION_SHUTDOWN;
|
||||
|
||||
/*
|
||||
* Final parsing of recovery_target_time string; see also
|
||||
* check_recovery_target_time().
|
||||
*/
|
||||
if (recoveryTarget == RECOVERY_TARGET_TIME)
|
||||
{
|
||||
recoveryTargetTime = DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in,
|
||||
CStringGetDatum(recovery_target_time_string),
|
||||
ObjectIdGetDatum(InvalidOid),
|
||||
Int32GetDatum(-1)));
|
||||
}
|
||||
|
||||
/*
|
||||
* If user specified recovery_target_timeline, validate it or compute the
|
||||
* "latest" value. We can't do this until after we've gotten the restore
|
||||
|
Reference in New Issue
Block a user