summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorTom Lane2007-09-03 18:46:30 +0000
committerTom Lane2007-09-03 18:46:30 +0000
commite7889b83b7059e776f0a3d76bbbdd98687f4592c (patch)
treee0b51d43d089c38a1debbe9d9d15499e68a548dd /src/backend/parser
parentdd4594e332a86b563801b6bbed0a7d256dcd7e43 (diff)
Support SET FROM CURRENT in CREATE/ALTER FUNCTION, ALTER DATABASE, ALTER ROLE.
(Actually, it works as a plain statement too, but I didn't document that because it seems a bit useless.) Unify VariableResetStmt with VariableSetStmt, and clean up some ancient cruft in the representation of same.
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y170
1 files changed, 87 insertions, 83 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 9f9f644168f..a7521eca522 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.601 2007/09/03 00:39:16 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.602 2007/09/03 18:46:30 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -292,7 +292,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
%type <istmt> insert_rest
-%type <vsetstmt> set_rest
+%type <vsetstmt> set_rest SetResetClause
%type <node> TableElement ConstraintElem TableFuncElement
%type <node> columnDef
@@ -330,7 +330,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
%type <ival> Iconst SignedIconst
%type <str> Sconst comment_text
%type <str> RoleId opt_granted_by opt_boolean ColId_or_Sconst
-%type <list> var_list var_list_or_default
+%type <list> var_list
%type <str> ColId ColLabel var_name type_function_name param_name
%type <node> var_value zone_value
@@ -796,20 +796,11 @@ AlterRoleStmt:
;
AlterRoleSetStmt:
- ALTER ROLE RoleId SET set_rest
+ ALTER ROLE RoleId SetResetClause
{
AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
n->role = $3;
- n->variable = $5->name;
- n->value = $5->args;
- $$ = (Node *)n;
- }
- | ALTER ROLE RoleId VariableResetStmt
- {
- AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
- n->role = $3;
- n->variable = ((VariableResetStmt *)$4)->name;
- n->value = NIL;
+ n->setstmt = $4;
$$ = (Node *)n;
}
;
@@ -834,20 +825,11 @@ AlterUserStmt:
AlterUserSetStmt:
- ALTER USER RoleId SET set_rest
+ ALTER USER RoleId SetResetClause
{
AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
n->role = $3;
- n->variable = $5->name;
- n->value = $5->args;
- $$ = (Node *)n;
- }
- | ALTER USER RoleId VariableResetStmt
- {
- AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
- n->role = $3;
- n->variable = ((VariableResetStmt *)$4)->name;
- n->value = NIL;
+ n->setstmt = $4;
$$ = (Node *)n;
}
;
@@ -1056,31 +1038,60 @@ VariableSetStmt:
}
;
-set_rest: var_name TO var_list_or_default
+set_rest: /* Generic SET syntaxes: */
+ var_name TO var_list
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = $1;
n->args = $3;
$$ = n;
}
- | var_name '=' var_list_or_default
+ | var_name '=' var_list
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = $1;
n->args = $3;
$$ = n;
}
+ | var_name TO DEFAULT
+ {
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_DEFAULT;
+ n->name = $1;
+ $$ = n;
+ }
+ | var_name '=' DEFAULT
+ {
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_DEFAULT;
+ n->name = $1;
+ $$ = n;
+ }
+ | var_name FROM CURRENT_P
+ {
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_CURRENT;
+ n->name = $1;
+ $$ = n;
+ }
+ /* Special syntaxes mandated by SQL standard: */
| TIME ZONE zone_value
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = "timezone";
if ($3 != NULL)
n->args = list_make1($3);
+ else
+ n->kind = VAR_SET_DEFAULT;
$$ = n;
}
| TRANSACTION transaction_mode_list
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_MULTI;
n->name = "TRANSACTION";
n->args = $2;
$$ = n;
@@ -1088,6 +1099,7 @@ set_rest: var_name TO var_list_or_default
| SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_MULTI;
n->name = "SESSION CHARACTERISTICS";
n->args = $5;
$$ = n;
@@ -1095,14 +1107,18 @@ set_rest: var_name TO var_list_or_default
| NAMES opt_encoding
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = "client_encoding";
if ($2 != NULL)
n->args = list_make1(makeStringConst($2, NULL));
+ else
+ n->kind = VAR_SET_DEFAULT;
$$ = n;
}
| ROLE ColId_or_Sconst
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = "role";
n->args = list_make1(makeStringConst($2, NULL));
$$ = n;
@@ -1110,6 +1126,7 @@ set_rest: var_name TO var_list_or_default
| SESSION AUTHORIZATION ColId_or_Sconst
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = "session_authorization";
n->args = list_make1(makeStringConst($3, NULL));
$$ = n;
@@ -1117,37 +1134,28 @@ set_rest: var_name TO var_list_or_default
| SESSION AUTHORIZATION DEFAULT
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_DEFAULT;
n->name = "session_authorization";
- n->args = NIL;
$$ = n;
}
| XML_P OPTION document_or_content
{
VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_SET_VALUE;
n->name = "xmloption";
n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", NULL));
$$ = n;
}
;
-var_name:
- ColId { $$ = $1; }
+var_name: ColId { $$ = $1; }
| var_name '.' ColId
{
- int qLen = strlen($1);
- char* qualName = palloc(qLen + strlen($3) + 2);
- strcpy(qualName, $1);
- qualName[qLen] = '.';
- strcpy(qualName + qLen + 1, $3);
- $$ = qualName;
+ $$ = palloc(strlen($1) + strlen($3) + 2);
+ sprintf($$, "%s.%s", $1, $3);
}
;
-var_list_or_default:
- var_list { $$ = $1; }
- | DEFAULT { $$ = NIL; }
- ;
-
var_list: var_value { $$ = list_make1($1); }
| var_list ',' var_value { $$ = lappend($1, $3); }
;
@@ -1231,68 +1239,78 @@ ColId_or_Sconst:
| SCONST { $$ = $1; }
;
-
-VariableShowStmt:
- SHOW var_name
+VariableResetStmt:
+ RESET var_name
{
- VariableShowStmt *n = makeNode(VariableShowStmt);
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_RESET;
n->name = $2;
$$ = (Node *) n;
}
- | SHOW TIME ZONE
+ | RESET TIME ZONE
{
- VariableShowStmt *n = makeNode(VariableShowStmt);
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_RESET;
n->name = "timezone";
$$ = (Node *) n;
}
- | SHOW TRANSACTION ISOLATION LEVEL
+ | RESET TRANSACTION ISOLATION LEVEL
{
- VariableShowStmt *n = makeNode(VariableShowStmt);
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_RESET;
n->name = "transaction_isolation";
$$ = (Node *) n;
}
- | SHOW SESSION AUTHORIZATION
+ | RESET SESSION AUTHORIZATION
{
- VariableShowStmt *n = makeNode(VariableShowStmt);
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_RESET;
n->name = "session_authorization";
$$ = (Node *) n;
}
- | SHOW ALL
+ | RESET ALL
{
- VariableShowStmt *n = makeNode(VariableShowStmt);
- n->name = "all";
+ VariableSetStmt *n = makeNode(VariableSetStmt);
+ n->kind = VAR_RESET_ALL;
$$ = (Node *) n;
}
;
-VariableResetStmt:
- RESET var_name
+/* SetResetClause allows SET or RESET without LOCAL */
+SetResetClause:
+ SET set_rest { $$ = $2; }
+ | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
+ ;
+
+
+VariableShowStmt:
+ SHOW var_name
{
- VariableResetStmt *n = makeNode(VariableResetStmt);
+ VariableShowStmt *n = makeNode(VariableShowStmt);
n->name = $2;
$$ = (Node *) n;
}
- | RESET TIME ZONE
+ | SHOW TIME ZONE
{
- VariableResetStmt *n = makeNode(VariableResetStmt);
+ VariableShowStmt *n = makeNode(VariableShowStmt);
n->name = "timezone";
$$ = (Node *) n;
}
- | RESET TRANSACTION ISOLATION LEVEL
+ | SHOW TRANSACTION ISOLATION LEVEL
{
- VariableResetStmt *n = makeNode(VariableResetStmt);
+ VariableShowStmt *n = makeNode(VariableShowStmt);
n->name = "transaction_isolation";
$$ = (Node *) n;
}
- | RESET SESSION AUTHORIZATION
+ | SHOW SESSION AUTHORIZATION
{
- VariableResetStmt *n = makeNode(VariableResetStmt);
+ VariableShowStmt *n = makeNode(VariableShowStmt);
n->name = "session_authorization";
$$ = (Node *) n;
}
- | RESET ALL
+ | SHOW ALL
{
- VariableResetStmt *n = makeNode(VariableResetStmt);
+ VariableShowStmt *n = makeNode(VariableShowStmt);
n->name = "all";
$$ = (Node *) n;
}
@@ -4270,15 +4288,10 @@ common_func_opt_item:
{
$$ = makeDefElem("rows", (Node *)$2);
}
- | SET set_rest
- {
- /* we abuse the normal content of a DefElem here */
- $$ = makeDefElem("set", (Node *)$2);
- }
- | VariableResetStmt
+ | SetResetClause
{
/* we abuse the normal content of a DefElem here */
- $$ = makeDefElem("set", $1);
+ $$ = makeDefElem("set", (Node *)$1);
}
;
@@ -5391,20 +5404,11 @@ AlterDatabaseStmt:
;
AlterDatabaseSetStmt:
- ALTER DATABASE database_name SET set_rest
- {
- AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
- n->dbname = $3;
- n->variable = $5->name;
- n->value = $5->args;
- $$ = (Node *)n;
- }
- | ALTER DATABASE database_name VariableResetStmt
+ ALTER DATABASE database_name SetResetClause
{
AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
n->dbname = $3;
- n->variable = ((VariableResetStmt *)$4)->name;
- n->value = NIL;
+ n->setstmt = $4;
$$ = (Node *)n;
}
;