Code cleanup for assign_XactIsoLevel.
authorRobert Haas <rhaas@postgresql.org>
Sat, 22 Jan 2011 02:49:19 +0000 (21:49 -0500)
committerRobert Haas <rhaas@postgresql.org>
Sat, 22 Jan 2011 02:49:19 +0000 (21:49 -0500)
The new coding avoids a spurious debug message when a transaction
that has changed the isolation level has been rolled back.  It also
allows the property to be freely changed to the current value within
a subtransaction.

Kevin Grittner, with one small change by me.

src/backend/commands/variable.c
src/backend/utils/misc/guc.c
src/include/utils/guc.h

index 848685f2e8ae118bbe4c68061152418173d24e94..1e9bdc3f21833b01ebbf07bda48e1bb1f9bd7e52 100644 (file)
@@ -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)
index e4dea31e793ea0c16f04b6d6040731619ce8843c..ffff60155966c52402c4d47d18084c7bb0b251ca 100644 (file)
@@ -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;
 
 
 /*
index 91ad65e721fb60c6a84e34b7666213c7ab4b8576..c07f263ea073b0dab52c0f3960904e0767cceb45 100644 (file)
@@ -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;