mirror of
https://github.com/postgres/postgres.git
synced 2025-11-22 12:22:45 +03:00
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.
This commit is contained in:
@@ -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,6 +1239,49 @@ ColId_or_Sconst:
|
||||
| SCONST { $$ = $1; }
|
||||
;
|
||||
|
||||
VariableResetStmt:
|
||||
RESET var_name
|
||||
{
|
||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||
n->kind = VAR_RESET;
|
||||
n->name = $2;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET TIME ZONE
|
||||
{
|
||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||
n->kind = VAR_RESET;
|
||||
n->name = "timezone";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET TRANSACTION ISOLATION LEVEL
|
||||
{
|
||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||
n->kind = VAR_RESET;
|
||||
n->name = "transaction_isolation";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET SESSION AUTHORIZATION
|
||||
{
|
||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||
n->kind = VAR_RESET;
|
||||
n->name = "session_authorization";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET ALL
|
||||
{
|
||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||
n->kind = VAR_RESET_ALL;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
;
|
||||
|
||||
/* SetResetClause allows SET or RESET without LOCAL */
|
||||
SetResetClause:
|
||||
SET set_rest { $$ = $2; }
|
||||
| VariableResetStmt { $$ = (VariableSetStmt *) $1; }
|
||||
;
|
||||
|
||||
|
||||
VariableShowStmt:
|
||||
SHOW var_name
|
||||
@@ -1265,39 +1316,6 @@ VariableShowStmt:
|
||||
}
|
||||
;
|
||||
|
||||
VariableResetStmt:
|
||||
RESET var_name
|
||||
{
|
||||
VariableResetStmt *n = makeNode(VariableResetStmt);
|
||||
n->name = $2;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET TIME ZONE
|
||||
{
|
||||
VariableResetStmt *n = makeNode(VariableResetStmt);
|
||||
n->name = "timezone";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET TRANSACTION ISOLATION LEVEL
|
||||
{
|
||||
VariableResetStmt *n = makeNode(VariableResetStmt);
|
||||
n->name = "transaction_isolation";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET SESSION AUTHORIZATION
|
||||
{
|
||||
VariableResetStmt *n = makeNode(VariableResetStmt);
|
||||
n->name = "session_authorization";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| RESET ALL
|
||||
{
|
||||
VariableResetStmt *n = makeNode(VariableResetStmt);
|
||||
n->name = "all";
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
ConstraintsSetStmt:
|
||||
SET CONSTRAINTS constraints_set_list constraints_set_mode
|
||||
@@ -4270,15 +4288,10 @@ common_func_opt_item:
|
||||
{
|
||||
$$ = makeDefElem("rows", (Node *)$2);
|
||||
}
|
||||
| SET set_rest
|
||||
| SetResetClause
|
||||
{
|
||||
/* we abuse the normal content of a DefElem here */
|
||||
$$ = makeDefElem("set", (Node *)$2);
|
||||
}
|
||||
| VariableResetStmt
|
||||
{
|
||||
/* 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
|
||||
ALTER DATABASE database_name SetResetClause
|
||||
{
|
||||
AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
|
||||
n->dbname = $3;
|
||||
n->variable = $5->name;
|
||||
n->value = $5->args;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER DATABASE database_name VariableResetStmt
|
||||
{
|
||||
AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
|
||||
n->dbname = $3;
|
||||
n->variable = ((VariableResetStmt *)$4)->name;
|
||||
n->value = NIL;
|
||||
n->setstmt = $4;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user