📄 gram.y
字号:
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 { $$ = makeList1($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; } | /*EMPTY*/ { $$ = NULL; } ;ConstraintAttributeSpec: ConstraintDeferrabilitySpec { $$ = $1; } | ConstraintDeferrabilitySpec ConstraintTimeSpec { if ($1 == 0 && $2 != 0) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"))); $$ = $1 | $2; } | ConstraintTimeSpec { if ($1 != 0) $$ = 3; else $$ = 0; } | ConstraintTimeSpec ConstraintDeferrabilitySpec { if ($2 == 0 && $1 != 0) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"))); $$ = $1 | $2; } | /*EMPTY*/ { $$ = 0; } ;ConstraintDeferrabilitySpec: NOT DEFERRABLE { $$ = 0; } | DEFERRABLE { $$ = 1; } ;ConstraintTimeSpec: INITIALLY IMMEDIATE { $$ = 0; } | INITIALLY DEFERRED { $$ = 2; } ;DropTrigStmt: DROP TRIGGER name ON qualified_name opt_drop_behavior { DropPropertyStmt *n = makeNode(DropPropertyStmt); n->relation = $5; n->property = $3; n->behavior = $6; n->removeType = OBJECT_TRIGGER; $$ = (Node *) n; } ;/***************************************************************************** * * QUERIES : * CREATE ASSERTION ... * DROP ASSERTION ... * *****************************************************************************/CreateAssertStmt: CREATE ASSERTION name CHECK '(' a_expr ')' ConstraintAttributeSpec { CreateTrigStmt *n = makeNode(CreateTrigStmt); n->trigname = $3; n->args = makeList1($6); n->isconstraint = TRUE; n->deferrable = ($8 & 1) != 0; n->initdeferred = ($8 & 2) != 0; ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("CREATE ASSERTION is not yet implemented"))); $$ = (Node *)n; } ;DropAssertStmt: DROP ASSERTION name opt_drop_behavior { DropPropertyStmt *n = makeNode(DropPropertyStmt); n->relation = NULL; n->property = $3; n->behavior = $4; n->removeType = OBJECT_TRIGGER; /* XXX */ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("DROP ASSERTION is not yet implemented"))); $$ = (Node *) n; } ;/***************************************************************************** * * QUERY : * define (aggregate,operator,type) * *****************************************************************************/DefineStmt: CREATE AGGREGATE func_name definition { DefineStmt *n = makeNode(DefineStmt); n->kind = OBJECT_AGGREGATE; n->defnames = $3; n->definition = $4; $$ = (Node *)n; } | CREATE OPERATOR any_operator definition { DefineStmt *n = makeNode(DefineStmt); n->kind = OBJECT_OPERATOR; n->defnames = $3; n->definition = $4; $$ = (Node *)n; } | CREATE TYPE_P any_name definition { DefineStmt *n = makeNode(DefineStmt); n->kind = OBJECT_TYPE; n->defnames = $3; n->definition = $4; $$ = (Node *)n; } | CREATE TYPE_P any_name AS '(' TableFuncElementList ')' { CompositeTypeStmt *n = makeNode(CompositeTypeStmt); RangeVar *r = makeNode(RangeVar); /* can't use qualified_name, sigh */ switch (length($3)) { case 1: r->catalogname = NULL; r->schemaname = NULL; r->relname = strVal(lfirst($3)); break; case 2: r->catalogname = NULL; r->schemaname = strVal(lfirst($3)); r->relname = strVal(lsecond($3)); break; case 3: r->catalogname = strVal(lfirst($3)); r->schemaname = strVal(lsecond($3)); r->relname = strVal(lthird($3)); break; default: ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("improper qualified name (too many dotted names): %s", NameListToString($3)))); break; } n->typevar = r; n->coldeflist = $6; $$ = (Node *)n; } ;definition: '(' def_list ')' { $$ = $2; } ;def_list: def_elem { $$ = makeList1($1); } | def_list ',' def_elem { $$ = lappend($1, $3); } ;def_elem: ColLabel '=' def_arg { $$ = makeDefElem($1, (Node *)$3); } | ColLabel { $$ = makeDefElem($1, (Node *)NULL); } ;/* Note: any simple identifier will be returned as a type name! */def_arg: func_return { $$ = (Node *)$1; } | qual_all_Op { $$ = (Node *)$1; } | NumericOnly { $$ = (Node *)$1; } | Sconst { $$ = (Node *)makeString($1); } ;/***************************************************************************** * * QUERIES : * CREATE OPERATOR CLASS ... * DROP OPERATOR CLASS ... * *****************************************************************************/CreateOpClassStmt: CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename USING access_method AS opclass_item_list { CreateOpClassStmt *n = makeNode(CreateOpClassStmt); n->opclassname = $4; n->isDefault = $5; n->datatype = $8; n->amname = $10; n->items = $12; $$ = (Node *) n; } ;opclass_item_list: opclass_item { $$ = makeList1($1); } | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); } ;opclass_item: OPERATOR Iconst any_operator opt_recheck { CreateOpClassItem *n = makeNode(CreateOpClassItem); n->itemtype = OPCLASS_ITEM_OPERATOR; n->name = $3; n->args = NIL; n->number = $2; n->recheck = $4; $$ = (Node *) n; } | OPERATOR Iconst any_operator '(' oper_argtypes ')' opt_recheck { CreateOpClassItem *n = makeNode(CreateOpClassItem); n->itemtype = OPCLASS_ITEM_OPERATOR; n->name = $3; n->args = $5; n->number = $2; n->recheck = $7; $$ = (Node *) n; } | FUNCTION Iconst func_name func_args { CreateOpClassItem *n = makeNode(CreateOpClassItem); n->itemtype = OPCLASS_ITEM_FUNCTION; n->name = $3; n->args = $4; n->number = $2; $$ = (Node *) n; } | STORAGE Typename { CreateOpClassItem *n = makeNode(CreateOpClassItem); n->itemtype = OPCLASS_ITEM_STORAGETYPE; n->storedtype = $2; $$ = (Node *) n; } ;opt_default: DEFAULT { $$ = TRUE; } | /*EMPTY*/ { $$ = FALSE; } ;opt_recheck: RECHECK { $$ = TRUE; } | /*EMPTY*/ { $$ = FALSE; } ;DropOpClassStmt: DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior { RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt); n->opclassname = $4; n->amname = $6; n->behavior = $7; $$ = (Node *) n; } ;/***************************************************************************** * * QUERY: * * DROP itemtype itemname [, itemname ...] [ RESTRICT | CASCADE ] * *****************************************************************************/DropStmt: DROP drop_type any_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); n->removeType = $2; n->objects = $3; n->behavior = $4; $$ = (Node *)n; } ;drop_type: TABLE { $$ = OBJECT_TABLE; } | SEQUENCE { $$ = OBJECT_SEQUENCE; } | VIEW { $$ = OBJECT_VIEW; } | INDEX { $$ = OBJECT_INDEX; } | TYPE_P { $$ = OBJECT_TYPE; } | DOMAIN_P { $$ = OBJECT_DOMAIN; } | CONVERSION_P { $$ = OBJECT_CONVERSION; } | SCHEMA { $$ = OBJECT_SCHEMA; } ;any_name_list: any_name { $$ = makeList1($1); } | any_name_list ',' any_name { $$ = lappend($1, $3); } ;any_name: ColId { $$ = makeList1(makeString($1)); } | dotted_name { $$ = $1; } ;/***************************************************************************** * * QUERY: * truncate table relname * *****************************************************************************/TruncateStmt: TRUNCATE opt_table qualified_name { TruncateStmt *n = makeNode(TruncateStmt); n->relation = $3; $$ = (Node *)n; } ;/***************************************************************************** * * The COMMENT ON statement can take different forms based upon the type of * the object associated with the comment. The form of the statement is: * * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW ] * <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION * <funcname> (arg1, arg2, ...) | OPERATOR <op> * (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON * <relname> | RULE <rulename> ON <relname> ] IS 'text' * *****************************************************************************/CommentStmt: COMMENT ON comment_type any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); n->objtype = $3; n->objname = $4; n->objargs = NIL; n->comment = $6; $$ = (Node *) n; } | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')' IS comment_text { CommentStmt *n = makeNode(CommentStmt); n->objtype = OBJECT_AGGREGATE; n->objname = $4; n->objargs = makeList1($6); n->comment = $9; $$ = (Node *) n; } | COMMENT ON FUNCTION func_name func_args IS comment_text { CommentStmt *n = makeNode(CommentStmt); n->objtype = OBJECT_FUNCTION; n->objname = $4; n->objargs = $5; n->comment = $7; $$ = (Node *) n; } | COMMENT ON OPERATOR any_operator '(' oper_argtypes ')' IS comment_text { CommentStmt *n = makeNode(CommentStmt); n->objtype = OBJECT_OPERATOR; n->objname = $4; n->objargs = $6; n->comment = $9; $$ = (Node *) n; } | COMMENT ON CONSTRAINT name ON any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); n->objtype = OBJECT_CONSTRAINT; n->objname = lappend($6, makeString($4)); n->objargs = NIL; n->comment = $8; $$ = (Node *) n; } | COMMENT ON RULE name ON any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); n->objtype = OBJECT_RULE; n->objname = lappend($6, makeString($4)); n->objargs = NIL; n->comment =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -