diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index e5ddcda0b4..038da968b6 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -531,14 +531,16 @@ check_XactIsoLevel(int *newval, void **extra, GucSource source) if (FirstSnapshotSet) { GUC_check_errcode(ERRCODE_ACTIVE_SQL_TRANSACTION); - GUC_check_errmsg("SET TRANSACTION ISOLATION LEVEL must be called before any query"); + GUC_check_errmsg("%s TRANSACTION ISOLATION LEVEL must be called before any query", + (source == PGC_S_OVERRIDE) ? "RESET" : "SET"); return false; } /* We ignore a subtransaction setting it to the existing value. */ if (IsSubTransaction()) { GUC_check_errcode(ERRCODE_ACTIVE_SQL_TRANSACTION); - GUC_check_errmsg("SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction"); + GUC_check_errmsg("%s TRANSACTION ISOLATION LEVEL must not be called in a subtransaction", + (source == PGC_S_OVERRIDE) ? "RESET" : "SET"); return false; } /* Can't go to serializable mode while recovery is still active */ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 4c94f09c64..2ffd6fb844 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -8021,6 +8021,17 @@ set_config_option(const char *name, const char *value, newextra = conf->reset_extra; source = conf->gen.reset_source; context = conf->gen.reset_scontext; + + /* + * Reseted transaction_isolation value can be not + * applicable to current transaction + */ + if (strcmp(name, "transaction_isolation") == 0) + { + if (!call_enum_check_hook(conf, &newval, &newextra, + source, elevel)) + return 0; + } } if (prohibitValueChange)