diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 848685f2e8ae118bbe4c68061152418173d24e94..1e9bdc3f21833b01ebbf07bda48e1bb1f9bd7e52 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -546,27 +546,27 @@ show_log_timezone(void) /* * SET TRANSACTION ISOLATION LEVEL */ - const char * assign_XactIsoLevel(const char *value, bool doit, GucSource source) { - if (FirstSnapshotSet) + /* source == PGC_S_OVERRIDE means do it anyway, eg at xact abort */ + if (source != PGC_S_OVERRIDE) { - ereport(GUC_complaint_elevel(source), - (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION), - errmsg("SET TRANSACTION ISOLATION LEVEL must be called before any query"))); - /* source == PGC_S_OVERRIDE means do it anyway, eg at xact abort */ - if (source != PGC_S_OVERRIDE) + if (FirstSnapshotSet) + { + ereport(GUC_complaint_elevel(source), + (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION), + errmsg("SET TRANSACTION ISOLATION LEVEL must be called before any query"))); return NULL; - } - else if (IsSubTransaction()) - { - ereport(GUC_complaint_elevel(source), - (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION), - errmsg("SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction"))); - /* source == PGC_S_OVERRIDE means do it anyway, eg at xact abort */ - if (source != PGC_S_OVERRIDE) + } + /* We ignore a subtransaction setting it to the existing value. */ + if (IsSubTransaction() && strcmp(value, XactIsoLevel_string) != 0) + { + ereport(GUC_complaint_elevel(source), + (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION), + errmsg("SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction"))); return NULL; + } } if (strcmp(value, "serializable") == 0) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index e4dea31e793ea0c16f04b6d6040731619ce8843c..ffff60155966c52402c4d47d18084c7bb0b251ca 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -425,7 +425,6 @@ static int server_version_num; static char *timezone_string; static char *log_timezone_string; static char *timezone_abbreviations_string; -static char *XactIsoLevel_string; static char *custom_variable_classes; static int max_function_args; static int max_index_keys; @@ -440,6 +439,7 @@ static int effective_io_concurrency; /* should be static, but commands/variable.c needs to get at these */ char *role_string; char *session_authorization_string; +char *XactIsoLevel_string; /* diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 91ad65e721fb60c6a84e34b7666213c7ab4b8576..c07f263ea073b0dab52c0f3960904e0767cceb45 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -201,6 +201,7 @@ extern char *ConfigFileName; extern char *HbaFileName; extern char *IdentFileName; extern char *external_pid_file; +extern char *XactIsoLevel_string; extern char *application_name;