From 1e901bbe8430ce870f7dbfcc33c14f4c82c2f9aa Mon Sep 17 00:00:00 2001
From: "Thomas G. Lockhart" <lockhart@fourpalms.org>
Date: Fri, 14 Jul 2000 15:35:44 +0000
Subject: [PATCH] Implement SET SESSION CHARACTERISTICS and SET
 DefaultXactIsoLevel.

---
 src/backend/commands/variable.c | 75 ++++++++++++++++++++++++++++++++-
 1 file changed, 73 insertions(+), 2 deletions(-)

diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index 154be6a23dd..d7e730544b0 100644
--- a/src/backend/commands/variable.c
+++ b/src/backend/commands/variable.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.38 2000/06/22 22:31:17 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.39 2000/07/14 15:35:44 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,6 +43,9 @@ static bool show_timezone(void);
 static bool reset_timezone(void);
 static bool parse_timezone(char *);
 
+static bool show_DefaultXactIsoLevel(void);
+static bool reset_DefaultXactIsoLevel(void);
+static bool parse_DefaultXactIsoLevel(char *);
 static bool show_XactIsoLevel(void);
 static bool reset_XactIsoLevel(void);
 static bool parse_XactIsoLevel(char *);
@@ -434,6 +437,68 @@ reset_timezone()
 
 /* SET TRANSACTION */
 
+static bool
+parse_DefaultXactIsoLevel(char *value)
+{
+#if 0
+	TransactionState s = CurrentTransactionState;
+#endif
+
+	if (value == NULL)
+	{
+		reset_DefaultXactIsoLevel();
+		return TRUE;
+	}
+
+#if 0
+	if (s->state != TRANS_DEFAULT)
+	{
+		elog(ERROR, "ALTER SESSION/SET TRANSACTION ISOLATION LEVEL"
+			 " can not be called within a transaction");
+		return TRUE;
+	}
+#endif
+
+	if (strcasecmp(value, "SERIALIZABLE") == 0)
+		DefaultXactIsoLevel = XACT_SERIALIZABLE;
+	else if (strcasecmp(value, "COMMITTED") == 0)
+		DefaultXactIsoLevel = XACT_READ_COMMITTED;
+	else
+		elog(ERROR, "Bad TRANSACTION ISOLATION LEVEL (%s)", value);
+
+	return TRUE;
+}
+
+static bool
+show_DefaultXactIsoLevel()
+{
+
+	if (DefaultXactIsoLevel == XACT_SERIALIZABLE)
+		elog(NOTICE, "Default TRANSACTION ISOLATION LEVEL is SERIALIZABLE");
+	else
+		elog(NOTICE, "Default TRANSACTION ISOLATION LEVEL is READ COMMITTED");
+	return TRUE;
+}
+
+static bool
+reset_DefaultXactIsoLevel()
+{
+#if 0
+	TransactionState s = CurrentTransactionState;
+
+	if (s->state != TRANS_DEFAULT)
+	{
+		elog(ERROR, "ALTER SESSION/SET TRANSACTION ISOLATION LEVEL"
+			 " can not be called within a transaction");
+		return TRUE;
+	}
+#endif
+
+	DefaultXactIsoLevel = XACT_READ_COMMITTED;
+
+	return TRUE;
+}
+
 static bool
 parse_XactIsoLevel(char *value)
 {
@@ -535,6 +600,8 @@ SetPGVariable(const char *name, const char *value)
         parse_date(pstrdup(value));
     else if (strcasecmp(name, "timezone")==0)
         parse_timezone(pstrdup(value));
+    else if (strcasecmp(name, "DefaultXactIsoLevel")==0)
+        parse_DefaultXactIsoLevel(pstrdup(value));
     else if (strcasecmp(name, "XactIsoLevel")==0)
         parse_XactIsoLevel(pstrdup(value));
 #ifdef MULTIBYTE
@@ -557,6 +624,8 @@ GetPGVariable(const char *name)
         show_date();
     else if (strcasecmp(name, "timezone")==0)
         show_timezone();
+    else if (strcasecmp(name, "DefaultXactIsoLevel")==0)
+        show_DefaultXactIsoLevel();
     else if (strcasecmp(name, "XactIsoLevel")==0)
         show_XactIsoLevel();
 #ifdef MULTIBYTE
@@ -581,8 +650,10 @@ ResetPGVariable(const char *name)
         reset_date();
     else if (strcasecmp(name, "timezone")==0)
         reset_timezone();
+    else if (strcasecmp(name, "DefaultXactIsoLevel")==0)
+			reset_DefaultXactIsoLevel();
     else if (strcasecmp(name, "XactIsoLevel")==0)
-        reset_XactIsoLevel();
+			reset_XactIsoLevel();
 #ifdef MULTIBYTE
     else if (strcasecmp(name, "client_encoding")==0)
         reset_client_encoding();
-- 
GitLab