📄 gram.y
字号:
n->fk_del_action = (char) ($10 & 0xFF); n->deferrable = ($11 & 1) != 0; n->initdeferred = ($11 & 2) != 0; $$ = (Node *)n; } ;opt_column_list: '(' columnList ')' { $$ = $2; } | /*EMPTY*/ { $$ = NIL; } ;columnList: columnElem { $$ = list_make1($1); } | columnList ',' columnElem { $$ = lappend($1, $3); } ;columnElem: ColId { $$ = (Node *) makeString($1); } ;key_match: MATCH FULL { $$ = FKCONSTR_MATCH_FULL; } | MATCH PARTIAL { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("MATCH PARTIAL not yet implemented"))); $$ = FKCONSTR_MATCH_PARTIAL; } | MATCH SIMPLE { $$ = FKCONSTR_MATCH_UNSPECIFIED; } | /*EMPTY*/ { $$ = FKCONSTR_MATCH_UNSPECIFIED; } ;/* * We combine the update and delete actions into one value temporarily * for simplicity of parsing, and then break them down again in the * calling production. update is in the left 8 bits, delete in the right. * Note that NOACTION is the default. */key_actions: key_update { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); } | key_delete { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); } | key_update key_delete { $$ = ($1 << 8) | ($2 & 0xFF); } | key_delete key_update { $$ = ($2 << 8) | ($1 & 0xFF); } | /*EMPTY*/ { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); } ;key_update: ON UPDATE key_action { $$ = $3; } ;key_delete: ON DELETE_P key_action { $$ = $3; } ;key_action: NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; } | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; } | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; } | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; } | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; } ;OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; } | /*EMPTY*/ { $$ = NIL; } ;OptWithOids: WITH OIDS { $$ = MUST_HAVE_OIDS; } | WITHOUT OIDS { $$ = MUST_NOT_HAVE_OIDS; } | /*EMPTY*/ { $$ = DEFAULT_OIDS; } ;OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; } | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; } | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; } | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; } ;OptTableSpace: TABLESPACE name { $$ = $2; } | /*EMPTY*/ { $$ = NULL; } ;OptConsTableSpace: USING INDEX TABLESPACE name { $$ = $4; } | /*EMPTY*/ { $$ = NULL; } ;/* * Note: CREATE TABLE ... AS SELECT ... is just another spelling for * SELECT ... INTO. */CreateAsStmt: CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs SelectStmt { /* * When the SelectStmt is a set-operation tree, we must * stuff the INTO information into the leftmost component * Select, because that's where analyze.c will expect * to find it. Similarly, the output column names must * be attached to that Select's target list. */ SelectStmt *n = findLeftmostSelect((SelectStmt *) $7); if (n->into != NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("CREATE TABLE AS may not specify INTO"))); $4->istemp = $2; n->into = $4; n->intoColNames = $5; n->intoHasOids = $6; $$ = $7; } ;/* * To avoid a shift/reduce conflict in CreateAsStmt, we need to * include the 'AS' terminal in the parsing of WITH/WITHOUT * OIDS. Unfortunately that means this production is effectively a * duplicate of OptWithOids. */WithOidsAs: WITH OIDS AS { $$ = MUST_HAVE_OIDS; } | WITHOUT OIDS AS { $$ = MUST_NOT_HAVE_OIDS; } | AS { $$ = DEFAULT_OIDS; } ;OptCreateAs: '(' CreateAsList ')' { $$ = $2; } | /*EMPTY*/ { $$ = NIL; } ;CreateAsList: CreateAsElement { $$ = list_make1($1); } | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); } ;CreateAsElement: ColId { ColumnDef *n = makeNode(ColumnDef); n->colname = $1; n->typename = NULL; n->inhcount = 0; n->is_local = true; n->is_not_null = false; n->raw_default = NULL; n->cooked_default = NULL; n->constraints = NIL; n->support = NULL; $$ = (Node *)n; } ;/***************************************************************************** * * QUERY : * CREATE SEQUENCE seqname * ALTER SEQUENCE seqname * *****************************************************************************/CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList { CreateSeqStmt *n = makeNode(CreateSeqStmt); $4->istemp = $2; n->sequence = $4; n->options = $5; $$ = (Node *)n; } ;AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList { AlterSeqStmt *n = makeNode(AlterSeqStmt); n->sequence = $3; n->options = $4; $$ = (Node *)n; } ;OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); } | /*EMPTY*/ { $$ = NIL; } ;OptSeqElem: CACHE NumericOnly { $$ = makeDefElem("cache", (Node *)$2); } | CYCLE { $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE)); } | NO CYCLE { $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE)); } | INCREMENT opt_by NumericOnly { $$ = makeDefElem("increment", (Node *)$3); } | MAXVALUE NumericOnly { $$ = makeDefElem("maxvalue", (Node *)$2); } | MINVALUE NumericOnly { $$ = makeDefElem("minvalue", (Node *)$2); } | NO MAXVALUE { $$ = makeDefElem("maxvalue", NULL); } | NO MINVALUE { $$ = makeDefElem("minvalue", NULL); } | START opt_with NumericOnly { $$ = makeDefElem("start", (Node *)$3); } | RESTART opt_with NumericOnly { $$ = makeDefElem("restart", (Node *)$3); } ;opt_by: BY {} | /* empty */ {} ;NumericOnly: FloatOnly { $$ = $1; } | IntegerOnly { $$ = $1; } ;FloatOnly: FCONST { $$ = makeFloat($1); } | '-' FCONST { $$ = makeFloat($2); doNegateFloat($$); } ;IntegerOnly: SignedIconst { $$ = makeInteger($1); };/***************************************************************************** * * QUERIES : * CREATE PROCEDURAL LANGUAGE ... * DROP PROCEDURAL LANGUAGE ... * *****************************************************************************/CreatePLangStmt: CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst { CreatePLangStmt *n = makeNode(CreatePLangStmt); n->plname = $5; /* parameters are all to be supplied by system */ n->plhandler = NIL; n->plvalidator = NIL; n->pltrusted = false; $$ = (Node *)n; } | CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst HANDLER handler_name opt_validator opt_lancompiler { CreatePLangStmt *n = makeNode(CreatePLangStmt); n->plname = $5; n->plhandler = $7; n->plvalidator = $8; n->pltrusted = $2; /* LANCOMPILER is now ignored entirely */ $$ = (Node *)n; } ;opt_trusted: TRUSTED { $$ = TRUE; } | /*EMPTY*/ { $$ = FALSE; } ;/* This ought to be just func_name, but that causes reduce/reduce conflicts * (CREATE LANGUAGE is the only place where func_name isn't followed by '('). * Work around by using simple names, instead. */handler_name: name { $$ = list_make1(makeString($1)); } | name attrs { $$ = lcons(makeString($1), $2); } ;opt_validator: VALIDATOR handler_name { $$ = $2; } | /*EMPTY*/ { $$ = NIL; } ;opt_lancompiler: LANCOMPILER Sconst { $$ = $2; } | /*EMPTY*/ { $$ = NULL; } ;DropPLangStmt: DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior { DropPLangStmt *n = makeNode(DropPLangStmt); n->plname = $4; n->behavior = $5; $$ = (Node *)n; } ;opt_procedural: PROCEDURAL {} | /*EMPTY*/ {} ;/***************************************************************************** * * QUERY: * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/' * *****************************************************************************/CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst { CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt); n->tablespacename = $3; n->owner = $4; n->location = $6; $$ = (Node *) n; } ;OptTableSpaceOwner: OWNER name { $$ = $2; } | /*EMPTY */ { $$ = NULL; } ;/***************************************************************************** * * QUERY : * DROP TABLESPACE <tablespace> * * No need for drop behaviour as we cannot implement dependencies for * objects in other databases; we can only support RESTRICT. * ****************************************************************************/DropTableSpaceStmt: DROP TABLESPACE name { DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt); n->tablespacename = $3; $$ = (Node *) n; } ;/***************************************************************************** * * QUERIES : * CREATE TRIGGER ... * DROP TRIGGER ... * *****************************************************************************/CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON qualified_name TriggerForSpec EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')' { CreateTrigStmt *n = makeNode(CreateTrigStmt); n->trigname = $3; n->relation = $7; n->funcname = $11; n->args = $13; n->before = $4; n->row = $8; memcpy(n->actions, $5, 4); n->isconstraint = FALSE; n->deferrable = FALSE; n->initdeferred = FALSE; n->constrrel = NULL; $$ = (Node *)n; } | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON qualified_name OptConstrFromTable ConstraintAttributeSpec FOR EACH ROW EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')' { CreateTrigStmt *n = makeNode(CreateTrigStmt); n->trigname = $4; n->relation = $8; n->funcname = $16; n->args = $18; n->before = FALSE; n->row = TRUE; memcpy(n->actions, $6, 4); n->isconstraint = TRUE; n->deferrable = ($10 & 1) != 0; n->initdeferred = ($10 & 2) != 0; n->constrrel = $9; $$ = (Node *)n; } ;TriggerActionTime: BEFORE { $$ = TRUE; } | AFTER { $$ = FALSE; } ;TriggerEvents: TriggerOneEvent { char *e = palloc(4); e[0] = $1; e[1] = '\0'; $$ = e; } | TriggerOneEvent OR TriggerOneEvent { char *e = palloc(4); e[0] = $1; e[1] = $3; e[2] = '\0'; $$ = e; } | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent { char *e = palloc(4); e[0] = $1; e[1] = $3; e[2] = $5; e[3] = '\0'; $$ = e; } ;TriggerOneEvent: INSERT { $$ = 'i'; } | DELETE_P { $$ = 'd'; } | UPDATE { $$ = 'u'; } ;TriggerForSpec: FOR TriggerForOpt TriggerForType { $$ = $3; } | /* EMPTY */ { /* * If ROW/STATEMENT not specified, default to * STATEMENT, per SQL */ $$ = FALSE; } ;TriggerForOpt: EACH {} | /*EMPTY*/ {} ;TriggerForType: ROW { $$ = TRUE; } | STATEMENT { $$ = FALSE; } ;TriggerFuncArgs: TriggerFuncArg { $$ = list_make1($1); } | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); } | /*EMPTY*/ { $$ = NIL; } ;TriggerFuncArg: ICONST { char buf[64]; snprintf(buf, sizeof(buf), "%d", $1); $$ = makeString(pstrdup(buf)); } | FCONST { $$ = makeString($1); } | Sconst { $$ = makeString($1); } | BCONST { $$ = makeString($1); } | XCONST { $$ = makeString($1); } | ColId { $$ = makeString($1); } ;OptConstrFromTable: FROM qualified_name { $$ = $2; } | /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -