📄 gram.y
字号:
| ConstraintsSetStmt | CopyStmt | CreateAsStmt | CreateAssertStmt | CreateCastStmt | CreateConversionStmt | CreateDomainStmt | CreateFunctionStmt | CreateGroupStmt | CreateOpClassStmt | CreatePLangStmt | CreateSchemaStmt | CreateSeqStmt | CreateStmt | CreateTableSpaceStmt | CreateTrigStmt | CreateRoleStmt | CreateUserStmt | CreatedbStmt | DeallocateStmt | DeclareCursorStmt | DefineStmt | DeleteStmt | DropAssertStmt | DropCastStmt | DropGroupStmt | DropOpClassStmt | DropPLangStmt | DropRuleStmt | DropStmt | DropTableSpaceStmt | DropTrigStmt | DropRoleStmt | DropUserStmt | DropdbStmt | ExecuteStmt | ExplainStmt | FetchStmt | GrantStmt | GrantRoleStmt | IndexStmt | InsertStmt | ListenStmt | LoadStmt | LockStmt | NotifyStmt | PrepareStmt | ReindexStmt | RemoveAggrStmt | RemoveFuncStmt | RemoveOperStmt | RenameStmt | RevokeStmt | RevokeRoleStmt | RuleStmt | SelectStmt | TransactionStmt | TruncateStmt | UnlistenStmt | UpdateStmt | VacuumStmt | VariableResetStmt | VariableSetStmt | VariableShowStmt | ViewStmt | /*EMPTY*/ { $$ = NULL; } ;/***************************************************************************** * * Create a new Postgres DBMS role * *****************************************************************************/CreateRoleStmt: CREATE ROLE RoleId opt_with OptRoleList { CreateRoleStmt *n = makeNode(CreateRoleStmt); n->stmt_type = ROLESTMT_ROLE; n->role = $3; n->options = $5; $$ = (Node *)n; } ;opt_with: WITH {} | /*EMPTY*/ {} ;/* * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER * for backwards compatibility). Note: the only option required by SQL99 * is "WITH ADMIN name". */OptRoleList: OptRoleList OptRoleElem { $$ = lappend($1, $2); } | /* EMPTY */ { $$ = NIL; } ;OptRoleElem: PASSWORD Sconst { $$ = makeDefElem("password", (Node *)makeString($2)); } | ENCRYPTED PASSWORD Sconst { $$ = makeDefElem("encryptedPassword", (Node *)makeString($3)); } | UNENCRYPTED PASSWORD Sconst { $$ = makeDefElem("unencryptedPassword", (Node *)makeString($3)); } | SUPERUSER_P { $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE)); } | NOSUPERUSER { $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE)); } | INHERIT { $$ = makeDefElem("inherit", (Node *)makeInteger(TRUE)); } | NOINHERIT { $$ = makeDefElem("inherit", (Node *)makeInteger(FALSE)); } | CREATEDB { $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE)); } | NOCREATEDB { $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE)); } | CREATEROLE { $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE)); } | NOCREATEROLE { $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE)); } | CREATEUSER { /* For backwards compatibility, synonym for SUPERUSER */ $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE)); } | NOCREATEUSER { $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE)); } | LOGIN_P { $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE)); } | NOLOGIN_P { $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE)); } | CONNECTION LIMIT SignedIconst { $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3)); } | VALID UNTIL Sconst { $$ = makeDefElem("validUntil", (Node *)makeString($3)); } /* Supported but not documented for roles, for use by ALTER GROUP. */ | USER name_list { $$ = makeDefElem("rolemembers", (Node *)$2); } /* The following are not supported by ALTER ROLE/USER/GROUP */ | SYSID Iconst { $$ = makeDefElem("sysid", (Node *)makeInteger($2)); } | ADMIN name_list { $$ = makeDefElem("adminmembers", (Node *)$2); } | ROLE name_list { $$ = makeDefElem("rolemembers", (Node *)$2); } | IN_P ROLE name_list { $$ = makeDefElem("addroleto", (Node *)$3); } | IN_P GROUP_P name_list { $$ = makeDefElem("addroleto", (Node *)$3); } ;/***************************************************************************** * * Create a new Postgres DBMS user (role with implied login ability) * *****************************************************************************/CreateUserStmt: CREATE USER RoleId opt_with OptRoleList { CreateRoleStmt *n = makeNode(CreateRoleStmt); n->stmt_type = ROLESTMT_USER; n->role = $3; n->options = $5; $$ = (Node *)n; } ;/***************************************************************************** * * Alter a postgresql DBMS role * *****************************************************************************/AlterRoleStmt: ALTER ROLE RoleId opt_with OptRoleList { AlterRoleStmt *n = makeNode(AlterRoleStmt); n->role = $3; n->action = +1; /* add, if there are members */ n->options = $5; $$ = (Node *)n; } ;AlterRoleSetStmt: ALTER ROLE RoleId SET set_rest { 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; $$ = (Node *)n; } ;/***************************************************************************** * * Alter a postgresql DBMS user * *****************************************************************************/AlterUserStmt: ALTER USER RoleId opt_with OptRoleList { AlterRoleStmt *n = makeNode(AlterRoleStmt); n->role = $3; n->action = +1; /* add, if there are members */ n->options = $5; $$ = (Node *)n; } ;AlterUserSetStmt: ALTER USER RoleId SET set_rest { 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; $$ = (Node *)n; } ;/***************************************************************************** * * Drop a postgresql DBMS role * * XXX Ideally this would have CASCADE/RESTRICT options, but since a role * might own objects in multiple databases, there is presently no way to * implement either cascading or restricting. Caveat DBA. *****************************************************************************/DropRoleStmt: DROP ROLE name_list { DropRoleStmt *n = makeNode(DropRoleStmt); n->roles = $3; $$ = (Node *)n; } ;/***************************************************************************** * * Drop a postgresql DBMS user * * XXX Ideally this would have CASCADE/RESTRICT options, but since a user * might own objects in multiple databases, there is presently no way to * implement either cascading or restricting. Caveat DBA. *****************************************************************************/DropUserStmt: DROP USER name_list { DropRoleStmt *n = makeNode(DropRoleStmt); n->roles = $3; $$ = (Node *)n; } ;/***************************************************************************** * * Create a postgresql group (role without login ability) * *****************************************************************************/CreateGroupStmt: CREATE GROUP_P RoleId opt_with OptRoleList { CreateRoleStmt *n = makeNode(CreateRoleStmt); n->stmt_type = ROLESTMT_GROUP; n->role = $3; n->options = $5; $$ = (Node *)n; } ;/***************************************************************************** * * Alter a postgresql group * *****************************************************************************/AlterGroupStmt: ALTER GROUP_P RoleId add_drop USER name_list { AlterRoleStmt *n = makeNode(AlterRoleStmt); n->role = $3; n->action = $4; n->options = list_make1(makeDefElem("rolemembers", (Node *)$6)); $$ = (Node *)n; } ;add_drop: ADD { $$ = +1; } | DROP { $$ = -1; } ;/***************************************************************************** * * Drop a postgresql group * * XXX see above notes about cascading DROP USER; groups have same problem. *****************************************************************************/DropGroupStmt: DROP GROUP_P name_list { DropRoleStmt *n = makeNode(DropRoleStmt); n->roles = $3; $$ = (Node *)n; } ;/***************************************************************************** * * Manipulate a schema * *****************************************************************************/CreateSchemaStmt: CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList { CreateSchemaStmt *n = makeNode(CreateSchemaStmt); /* One can omit the schema name or the authorization id. */ if ($3 != NULL) n->schemaname = $3; else n->schemaname = $5; n->authid = $5; n->schemaElts = $6; $$ = (Node *)n; } | CREATE SCHEMA ColId OptSchemaEltList { CreateSchemaStmt *n = makeNode(CreateSchemaStmt); /* ...but not both */ n->schemaname = $3; n->authid = NULL; n->schemaElts = $4; $$ = (Node *)n; } ;OptSchemaName: ColId { $$ = $1; } | /* EMPTY */ { $$ = NULL; } ;OptSchemaEltList: OptSchemaEltList schema_stmt { $$ = lappend($1, $2); } | /* EMPTY */ { $$ = NIL; } ;/* * schema_stmt are the ones that can show up inside a CREATE SCHEMA * statement (in addition to by themselves). */schema_stmt: CreateStmt | IndexStmt | CreateSeqStmt | CreateTrigStmt | GrantStmt | ViewStmt ;/***************************************************************************** * * Set PG internal variable * SET name TO 'var_value' * Include SQL92 syntax (thomas 1997-10-22): * SET TIME ZONE 'var_value' * *****************************************************************************/VariableSetStmt: SET set_rest { VariableSetStmt *n = $2; n->is_local = false; $$ = (Node *) n; } | SET LOCAL set_rest { VariableSetStmt *n = $3; n->is_local = true; $$ = (Node *) n; } | SET SESSION set_rest { VariableSetStmt *n = $3; n->is_local = false; $$ = (Node *) n; } ;set_rest: var_name TO var_list_or_default { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = $1; n->args = $3; $$ = n; } | var_name '=' var_list_or_default { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = $1; n->args = $3; $$ = n; } | TIME ZONE zone_value { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "timezone"; if ($3 != NULL) n->args = list_make1($3); $$ = n; } | TRANSACTION transaction_mode_list { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "TRANSACTION"; n->args = $2; $$ = n; } | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "SESSION CHARACTERISTICS";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -