summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-05-17 01:19:19 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-05-17 01:19:19 +0000
commitf0811a74b37427d7ee5eee56b00f7f2ea323d7d6 (patch)
tree51a596c44fd21144383062aa7d2ce852ae270268 /src/backend/parser
parentfa613fa1eafd8fd80272a31e8477ad9368c95dbb (diff)
Merge the last few variable.c configuration variables into the generic
GUC support. It's now possible to set datestyle, timezone, and client_encoding from postgresql.conf and per-database or per-user settings. Also, implement rollback of SET commands that occur in a transaction that later fails. Create a SET LOCAL var = value syntax that sets the variable only for the duration of the current transaction. All per previous discussions in pghackers.
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y131
1 files changed, 80 insertions, 51 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index bd3a7a0832b..0009b9df2f0 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.315 2002/05/13 17:45:30 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.316 2002/05/17 01:19:17 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -128,6 +128,7 @@ static void doNegateFloat(Value *v);
PrivTarget *privtarget;
InsertStmt *istmt;
+ VariableSetStmt *vsetstmt;
}
%type <node> stmt, schema_stmt,
@@ -246,6 +247,8 @@ static void doNegateFloat(Value *v);
%type <istmt> insert_rest
+%type <vsetstmt> set_rest
+
%type <node> OptTableElement, ConstraintElem
%type <node> columnDef
%type <defelt> def_elem
@@ -563,12 +566,12 @@ AlterUserStmt: ALTER USER UserId OptUserList
;
-AlterUserSetStmt: ALTER USER UserId VariableSetStmt
+AlterUserSetStmt: ALTER USER UserId SET set_rest
{
AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
n->user = $3;
- n->variable = ((VariableSetStmt *)$4)->name;
- n->value = ((VariableSetStmt *)$4)->args;
+ n->variable = $5->name;
+ n->value = $5->args;
$$ = (Node *)n;
}
| ALTER USER UserId VariableResetStmt
@@ -576,7 +579,7 @@ AlterUserSetStmt: ALTER USER UserId VariableSetStmt
AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
n->user = $3;
n->variable = ((VariableResetStmt *)$4)->name;
- n->value = NULL;
+ n->value = NIL;
$$ = (Node *)n;
}
;
@@ -834,63 +837,83 @@ schema_stmt: CreateStmt
*
*****************************************************************************/
-VariableSetStmt: SET ColId TO var_list_or_default
+VariableSetStmt: SET set_rest
{
- VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = $2;
- n->args = $4;
+ VariableSetStmt *n = $2;
+ n->is_local = false;
$$ = (Node *) n;
}
- | SET ColId '=' var_list_or_default
+ | SET LOCAL set_rest
{
- VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = $2;
- n->args = $4;
+ VariableSetStmt *n = $3;
+ n->is_local = true;
$$ = (Node *) n;
}
- | SET TIME ZONE zone_value
+ | SET SESSION set_rest
{
- VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "timezone";
- if ($4 != NULL)
- n->args = makeList1($4);
+ VariableSetStmt *n = $3;
+ n->is_local = false;
$$ = (Node *) n;
}
- | SET TRANSACTION ISOLATION LEVEL opt_level
+ ;
+
+set_rest: ColId TO var_list_or_default
{
VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "XactIsoLevel";
- n->args = makeList1(makeStringConst($5, NULL));
- $$ = (Node *) n;
+ n->name = $1;
+ n->args = $3;
+ $$ = n;
}
- | SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level
+ | ColId '=' var_list_or_default
{
VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "default_transaction_isolation";
- n->args = makeList1(makeStringConst($8, NULL));
- $$ = (Node *) n;
+ n->name = $1;
+ n->args = $3;
+ $$ = n;
}
- | SET NAMES opt_encoding
+ | TIME ZONE zone_value
{
VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "client_encoding";
+ n->name = "timezone";
if ($3 != NULL)
- n->args = makeList1(makeStringConst($3, NULL));
- $$ = (Node *) n;
+ n->args = makeList1($3);
+ $$ = n;
}
- | SET SESSION AUTHORIZATION ColId_or_Sconst
+ | TRANSACTION ISOLATION LEVEL opt_level
{
VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "session_authorization";
+ n->name = "TRANSACTION ISOLATION LEVEL";
n->args = makeList1(makeStringConst($4, NULL));
- $$ = (Node *) n;
+ $$ = n;
+ }
+ | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level
+ {
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->name = "default_transaction_isolation";
+ n->args = makeList1(makeStringConst($7, NULL));
+ $$ = n;
+ }
+ | NAMES opt_encoding
+ {
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->name = "client_encoding";
+ if ($2 != NULL)
+ n->args = makeList1(makeStringConst($2, NULL));
+ $$ = n;
+ }
+ | SESSION AUTHORIZATION ColId_or_Sconst
+ {
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->name = "session_authorization";
+ n->args = makeList1(makeStringConst($3, NULL));
+ $$ = n;
}
- | SET SESSION AUTHORIZATION DEFAULT
+ | SESSION AUTHORIZATION DEFAULT
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = "session_authorization";
n->args = NIL;
- $$ = (Node *) n;
+ $$ = n;
}
;
@@ -926,10 +949,10 @@ opt_boolean: TRUE_P { $$ = "true"; }
/* Timezone values can be:
* - a string such as 'pst8pdt'
- * - a column identifier such as "pst8pdt"
+ * - an identifier such as "pst8pdt"
* - an integer or floating point number
* - a time interval per SQL99
- * ConstInterval and ColId give shift/reduce errors,
+ * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
* so use IDENT and reject anything which is a reserved word.
*/
zone_value: Sconst
@@ -988,25 +1011,31 @@ ColId_or_Sconst: ColId { $$ = $1; }
VariableShowStmt: SHOW ColId
{
VariableShowStmt *n = makeNode(VariableShowStmt);
- n->name = $2;
+ n->name = $2;
$$ = (Node *) n;
}
| SHOW TIME ZONE
{
VariableShowStmt *n = makeNode(VariableShowStmt);
- n->name = "timezone";
+ n->name = "timezone";
$$ = (Node *) n;
}
- | SHOW ALL
+ | SHOW TRANSACTION ISOLATION LEVEL
{
VariableShowStmt *n = makeNode(VariableShowStmt);
- n->name = "all";
+ n->name = "TRANSACTION ISOLATION LEVEL";
$$ = (Node *) n;
}
- | SHOW TRANSACTION ISOLATION LEVEL
+ | SHOW SESSION AUTHORIZATION
+ {
+ VariableShowStmt *n = makeNode(VariableShowStmt);
+ n->name = "session_authorization";
+ $$ = (Node *) n;
+ }
+ | SHOW ALL
{
VariableShowStmt *n = makeNode(VariableShowStmt);
- n->name = "XactIsoLevel";
+ n->name = "all";
$$ = (Node *) n;
}
;
@@ -1014,19 +1043,19 @@ VariableShowStmt: SHOW ColId
VariableResetStmt: RESET ColId
{
VariableResetStmt *n = makeNode(VariableResetStmt);
- n->name = $2;
+ n->name = $2;
$$ = (Node *) n;
}
| RESET TIME ZONE
{
VariableResetStmt *n = makeNode(VariableResetStmt);
- n->name = "timezone";
+ n->name = "timezone";
$$ = (Node *) n;
}
| RESET TRANSACTION ISOLATION LEVEL
{
VariableResetStmt *n = makeNode(VariableResetStmt);
- n->name = "XactIsoLevel";
+ n->name = "TRANSACTION ISOLATION LEVEL";
$$ = (Node *) n;
}
| RESET SESSION AUTHORIZATION
@@ -1038,7 +1067,7 @@ VariableResetStmt: RESET ColId
| RESET ALL
{
VariableResetStmt *n = makeNode(VariableResetStmt);
- n->name = "all";
+ n->name = "all";
$$ = (Node *) n;
}
;
@@ -3329,12 +3358,12 @@ opt_equal: '=' { $$ = TRUE; }
*
*****************************************************************************/
-AlterDatabaseSetStmt: ALTER DATABASE database_name VariableSetStmt
+AlterDatabaseSetStmt: ALTER DATABASE database_name SET set_rest
{
AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
n->dbname = $3;
- n->variable = ((VariableSetStmt *)$4)->name;
- n->value = ((VariableSetStmt *)$4)->args;
+ n->variable = $5->name;
+ n->value = $5->args;
$$ = (Node *)n;
}
| ALTER DATABASE database_name VariableResetStmt
@@ -3342,7 +3371,7 @@ AlterDatabaseSetStmt: ALTER DATABASE database_name VariableSetStmt
AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
n->dbname = $3;
n->variable = ((VariableResetStmt *)$4)->name;
- n->value = NULL;
+ n->value = NIL;
$$ = (Node *)n;
}
;