Turn transaction_isolation into GUC enum
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 9 Oct 2018 19:21:57 +0000 (21:21 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 9 Oct 2018 19:26:00 +0000 (21:26 +0200)
It was previously a string setting that was converted into an enum by
custom code, but using the GUC enum facility seems much simpler and
doesn't change any functionality, except that

    set transaction_isolation='default';

no longer works, but that was never documented and doesn't work with
any other transaction characteristics.  (Note that this is not the
same as RESET or SET TO DEFAULT, which still work.)

Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://www.postgresql.org/message-id/457db615-e84c-4838-310e-43841eb806e5@iki.fi

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

index 9a754dae3fd7625e05e256812b4899838a7a5ae7..c2d7a5bebf6107541fa6c6bbad65d96511f4789d 100644 (file)
@@ -522,32 +522,9 @@ check_transaction_read_only(bool *newval, void **extra, GucSource source)
  * As in check_transaction_read_only, allow it if not inside a transaction.
  */
 bool
-check_XactIsoLevel(char **newval, void **extra, GucSource source)
+check_XactIsoLevel(int *newval, void **extra, GucSource source)
 {
-   int         newXactIsoLevel;
-
-   if (strcmp(*newval, "serializable") == 0)
-   {
-       newXactIsoLevel = XACT_SERIALIZABLE;
-   }
-   else if (strcmp(*newval, "repeatable read") == 0)
-   {
-       newXactIsoLevel = XACT_REPEATABLE_READ;
-   }
-   else if (strcmp(*newval, "read committed") == 0)
-   {
-       newXactIsoLevel = XACT_READ_COMMITTED;
-   }
-   else if (strcmp(*newval, "read uncommitted") == 0)
-   {
-       newXactIsoLevel = XACT_READ_UNCOMMITTED;
-   }
-   else if (strcmp(*newval, "default") == 0)
-   {
-       newXactIsoLevel = DefaultXactIsoLevel;
-   }
-   else
-       return false;
+   int         newXactIsoLevel = *newval;
 
    if (newXactIsoLevel != XactIsoLevel && IsTransactionState())
    {
@@ -574,39 +551,9 @@ check_XactIsoLevel(char **newval, void **extra, GucSource source)
        }
    }
 
-   *extra = malloc(sizeof(int));
-   if (!*extra)
-       return false;
-   *((int *) *extra) = newXactIsoLevel;
-
    return true;
 }
 
-void
-assign_XactIsoLevel(const char *newval, void *extra)
-{
-   XactIsoLevel = *((int *) extra);
-}
-
-const char *
-show_XactIsoLevel(void)
-{
-   /* We need this because we don't want to show "default". */
-   switch (XactIsoLevel)
-   {
-       case XACT_READ_UNCOMMITTED:
-           return "read uncommitted";
-       case XACT_READ_COMMITTED:
-           return "read committed";
-       case XACT_REPEATABLE_READ:
-           return "repeatable read";
-       case XACT_SERIALIZABLE:
-           return "serializable";
-       default:
-           return "bogus";
-   }
-}
-
 /*
  * SET TRANSACTION [NOT] DEFERRABLE
  */
index 0bec3914f80759c2d21348186f392cdef9a53887..2317e8be6be6b287bf160edabe9145d513d16964 100644 (file)
@@ -515,7 +515,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 *data_directory;
 static char *session_authorization_string;
 static int max_function_args;
@@ -3618,17 +3617,6 @@ static struct config_string ConfigureNamesString[] =
        check_timezone_abbreviations, assign_timezone_abbreviations, NULL
    },
 
-   {
-       {"transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
-           gettext_noop("Sets the current transaction's isolation level."),
-           NULL,
-           GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
-       },
-       &XactIsoLevel_string,
-       "default",
-       check_XactIsoLevel, assign_XactIsoLevel, show_XactIsoLevel
-   },
-
    {
        {"unix_socket_group", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
            gettext_noop("Sets the owning group of the Unix-domain socket."),
@@ -3968,6 +3956,17 @@ static struct config_enum ConfigureNamesEnum[] =
        NULL, NULL, NULL
    },
 
+   {
+       {"transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
+           gettext_noop("Sets the current transaction's isolation level."),
+           NULL,
+           GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+       },
+       &XactIsoLevel,
+       XACT_READ_COMMITTED, isolation_level_options,
+       check_XactIsoLevel, NULL, NULL
+   },
+
    {
        {"IntervalStyle", PGC_USERSET, CLIENT_CONN_LOCALE,
            gettext_noop("Sets the display format for interval values."),
@@ -4776,7 +4775,7 @@ InitializeGUCOptions(void)
     * Prevent any attempt to override the transaction modes from
     * non-interactive sources.
     */
-   SetConfigOption("transaction_isolation", "default",
+   SetConfigOption("transaction_isolation", "read committed",
                    PGC_POSTMASTER, PGC_S_OVERRIDE);
    SetConfigOption("transaction_read_only", "no",
                    PGC_POSTMASTER, PGC_S_OVERRIDE);
index 4ea3b0209b1733ef6955dc00e405bcc2426260f6..7373a3f99f8a9217c37519ef025377cf3528cfa3 100644 (file)
@@ -22,9 +22,7 @@ extern bool check_log_timezone(char **newval, void **extra, GucSource source);
 extern void assign_log_timezone(const char *newval, void *extra);
 extern const char *show_log_timezone(void);
 extern bool check_transaction_read_only(bool *newval, void **extra, GucSource source);
-extern bool check_XactIsoLevel(char **newval, void **extra, GucSource source);
-extern void assign_XactIsoLevel(const char *newval, void *extra);
-extern const char *show_XactIsoLevel(void);
+extern bool check_XactIsoLevel(int *newval, void **extra, GucSource source);
 extern bool check_transaction_deferrable(bool *newval, void **extra, GucSource source);
 extern bool check_random_seed(double *newval, void **extra, GucSource source);
 extern void assign_random_seed(double newval, void *extra);