📄 gram.y
字号:
| DropRuleStmt | DropStmt | DropTrigStmt | DropUserStmt | DropdbStmt | ExecuteStmt | ExplainStmt | FetchStmt | GrantStmt | IndexStmt | InsertStmt | ListenStmt | LoadStmt | LockStmt | NotifyStmt | PrepareStmt | ReindexStmt | RemoveAggrStmt | RemoveFuncStmt | RemoveOperStmt | RenameStmt | RevokeStmt | RuleStmt | SelectStmt | TransactionStmt | TruncateStmt | UnlistenStmt | UpdateStmt | VacuumStmt | VariableResetStmt | VariableSetStmt | VariableShowStmt | ViewStmt | /*EMPTY*/ { $$ = (Node *)NULL; } ;/***************************************************************************** * * Create a new Postgres DBMS user * * *****************************************************************************/CreateUserStmt: CREATE USER UserId opt_with OptUserList { CreateUserStmt *n = makeNode(CreateUserStmt); n->user = $3; n->options = $5; $$ = (Node *)n; } ;opt_with: WITH {} | /*EMPTY*/ {} ;/***************************************************************************** * * Alter a postgresql DBMS user * * *****************************************************************************/AlterUserStmt: ALTER USER UserId opt_with OptUserList { AlterUserStmt *n = makeNode(AlterUserStmt); n->user = $3; n->options = $5; $$ = (Node *)n; } ;AlterUserSetStmt: ALTER USER UserId SET set_rest { AlterUserSetStmt *n = makeNode(AlterUserSetStmt); n->user = $3; n->variable = $5->name; n->value = $5->args; $$ = (Node *)n; } | ALTER USER UserId VariableResetStmt { AlterUserSetStmt *n = makeNode(AlterUserSetStmt); n->user = $3; n->variable = ((VariableResetStmt *)$4)->name; n->value = NIL; $$ = (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 user_list { DropUserStmt *n = makeNode(DropUserStmt); n->users = $3; $$ = (Node *)n; } ;/* * Options for CREATE USER and ALTER USER */OptUserList: OptUserList OptUserElem { $$ = lappend($1, $2); } | /* EMPTY */ { $$ = NIL; } ;OptUserElem: PASSWORD Sconst { $$ = makeDefElem("password", (Node *)makeString($2)); } | ENCRYPTED PASSWORD Sconst { $$ = makeDefElem("encryptedPassword", (Node *)makeString($3)); } | UNENCRYPTED PASSWORD Sconst { $$ = makeDefElem("unencryptedPassword", (Node *)makeString($3)); } | SYSID Iconst { $$ = makeDefElem("sysid", (Node *)makeInteger($2)); } | CREATEDB { $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE)); } | NOCREATEDB { $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE)); } | CREATEUSER { $$ = makeDefElem("createuser", (Node *)makeInteger(TRUE)); } | NOCREATEUSER { $$ = makeDefElem("createuser", (Node *)makeInteger(FALSE)); } | IN_P GROUP_P user_list { $$ = makeDefElem("groupElts", (Node *)$3); } | VALID UNTIL Sconst { $$ = makeDefElem("validUntil", (Node *)makeString($3)); } ;user_list: user_list ',' UserId { $$ = lappend($1, makeString($3)); } | UserId { $$ = makeList1(makeString($1)); } ;/***************************************************************************** * * Create a postgresql group * * *****************************************************************************/CreateGroupStmt: CREATE GROUP_P UserId opt_with OptGroupList { CreateGroupStmt *n = makeNode(CreateGroupStmt); n->name = $3; n->options = $5; $$ = (Node *)n; } ;/* * Options for CREATE GROUP */OptGroupList: OptGroupList OptGroupElem { $$ = lappend($1, $2); } | /* EMPTY */ { $$ = NIL; } ;OptGroupElem: USER user_list { $$ = makeDefElem("userElts", (Node *)$2); } | SYSID Iconst { $$ = makeDefElem("sysid", (Node *)makeInteger($2)); } ;/***************************************************************************** * * Alter a postgresql group * * *****************************************************************************/AlterGroupStmt: ALTER GROUP_P UserId add_drop USER user_list { AlterGroupStmt *n = makeNode(AlterGroupStmt); n->name = $3; n->action = $4; n->listUsers = $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 UserId { DropGroupStmt *n = makeNode(DropGroupStmt); n->name = $3; $$ = (Node *)n; } ;/***************************************************************************** * * Manipulate a schema * *****************************************************************************/CreateSchemaStmt: CREATE SCHEMA OptSchemaName AUTHORIZATION UserId 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 | 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: ColId TO var_list_or_default { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = $1; n->args = $3; $$ = n; } | ColId '=' 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 = makeList1($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"; n->args = $5; $$ = 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; } | SESSION AUTHORIZATION DEFAULT { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "session_authorization"; n->args = NIL; $$ = n; } ;var_list_or_default: var_list { $$ = $1; } | DEFAULT { $$ = NIL; } ;var_list: var_value { $$ = makeList1($1); } | var_list ',' var_value { $$ = lappend($1, $3); } ;var_value: opt_boolean { $$ = makeStringConst($1, NULL); } | ColId_or_Sconst { $$ = makeStringConst($1, NULL); } | NumericOnly { $$ = makeAConst($1); } ;iso_level: READ COMMITTED { $$ = "read committed"; } | SERIALIZABLE { $$ = "serializable"; } ;opt_boolean: TRUE_P { $$ = "true"; } | FALSE_P { $$ = "false"; } | ON { $$ = "on"; } | OFF { $$ = "off"; } ;/* Timezone values can be: * - a string such as 'pst8pdt' * - an identifier such as "pst8pdt" * - an integer or floating point number * - a time interval per SQL99 * ColId gives reduce/reduce errors against ConstInterval and LOCAL, * so use IDENT and reject anything which is a reserved word. */zone_value: Sconst { $$ = makeStringConst($1, NULL); } | IDENT { $$ = makeStringConst($1, NULL); } | ConstInterval Sconst opt_interval { A_Const *n = (A_Const *) makeStringConst($2, $1); if ($3 != INTERVAL_FULL_RANGE) { if (($3 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("time zone interval must be HOUR or HOUR TO MINUTE"))); n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3); } $$ = (Node *)n; } | ConstInterval '(' Iconst ')' Sconst opt_interval { A_Const *n = (A_Const *) makeStringConst($5, $1); if ($3 < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision must not be negative", $3))); if ($3 > MAX_INTERVAL_PRECISION) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d", $3, MAX_INTERVAL_PRECISION))); $3 = MAX_INTERVAL_PRECISION; } if (($6 != INTERVAL_FULL_RANGE) && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("time zone interval must be HOUR or HOUR TO MINUTE"))); n->typename->typmod = INTERVAL_TYPMOD($3, $6); $$ = (Node *)n; } | NumericOnly { $$ = makeAConst($1); } | DEFAULT { $$ = NULL; } | LOCAL { $$ = NULL; } ;opt_encoding: Sconst { $$ = $1; } | DEFAULT { $$ = NULL; } | /*EMPTY*/ { $$ = NULL; } ;ColId_or_Sconst: ColId { $$ = $1; } | SCONST { $$ = $1; } ;VariableShowStmt: SHOW ColId { VariableShowStmt *n = makeNode(VariableShowStmt); n->name = $2; $$ = (Node *) n; } | SHOW TIME ZONE { VariableShowStmt *n = makeNode(VariableShowStmt); n->name = "timezone"; $$ = (Node *) n; } | SHOW TRANSACTION ISOLATION LEVEL { VariableShowStmt *n = makeNode(VariableShowStmt); n->name = "transaction_isolation"; $$ = (Node *) n; } | SHOW SESSION AUTHORIZATION { VariableShowStmt *n = makeNode(VariableShowStmt); n->name = "session_authorization"; $$ = (Node *) n; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -