diff options
author | Tom Lane | 2007-09-03 18:46:30 +0000 |
---|---|---|
committer | Tom Lane | 2007-09-03 18:46:30 +0000 |
commit | e7889b83b7059e776f0a3d76bbbdd98687f4592c (patch) | |
tree | e0b51d43d089c38a1debbe9d9d15499e68a548dd /src/backend/parser | |
parent | dd4594e332a86b563801b6bbed0a7d256dcd7e43 (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.y | 170 |
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; } ; |