OSDN Git Service

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 848685f..1e9bdc3 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 e4dea31..ffff601 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 91ad65e..c07f263 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;