📄 preproc.y
字号:
* QUERIES : * CREATE PROCEDURAL LANGUAGE ... * DROP PROCEDURAL LANGUAGE ... * *****************************************************************************/CreatePLangStmt: CREATE opt_Trusted opt_procedural LANGUAGE ColId_or_Sconst HANDLER handler_name opt_lancompiler { $$ = cat_str(8, make_str("create"), $2, $3, make_str("language"), $5, make_str("handler"), $7, $8); } ;opt_Trusted: TRUSTED { $$ = make_str("trusted"); } | /*EMPTY*/ { $$ = EMPTY; } ;/* 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 name and dotted_name separately. */handler_name: name { $$ = $1; } | dotted_name { $$ = $1; /* XXX changing soon */ } ;opt_lancompiler: LANCOMPILER StringConst { $$ = cat2_str(make_str("lancompiler"), $2); } | /*EMPTY*/ { $$ = ""; } ;DropPLangStmt: DROP opt_procedural LANGUAGE StringConst opt_drop_behavior { $$ = cat_str(5, make_str("drop"), $2, make_str("language"), $4, $5); } ;opt_procedural: PROCEDURAL { $$ = make_str("prcedural"); } | /*EMPTY*/ { $$ = EMPTY; } ;/***************************************************************************** * * QUERIES : * CREATE TRIGGER ... * DROP TRIGGER ... * *****************************************************************************/CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON qualified_name TriggerForSpec EXECUTE PROCEDURE name '(' TriggerFuncArgs ')' { $$ = cat_str(12, make_str("create trigger"), $3, $4, $5, make_str("on"), $7, $8, make_str("execute procedure"), $11, make_str("("), $13, make_str(")")); } | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON qualified_name OptConstrFromTable ConstraintAttributeSpec FOR EACH ROW EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')' { $$ = cat_str(13, make_str("create constraint trigger"), $4, make_str("after"), $6, make_str("on"), $8, $9, $10, make_str("for each row execute procedure"), $16, make_str("("), $18, make_str(")")); } ;TriggerActionTime: BEFORE { $$ = make_str("before"); } | AFTER { $$ = make_str("after"); } ;TriggerEvents: TriggerOneEvent { $$ = $1; } | TriggerOneEvent OR TriggerOneEvent { $$ = cat_str(3, $1, make_str("or"), $3); } | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent { $$ = cat_str(5, $1, make_str("or"), $3, make_str("or"), $5); } ;TriggerOneEvent: INSERT { $$ = make_str("insert"); } | DELETE_P { $$ = make_str("delete"); } | UPDATE { $$ = make_str("update"); } ;TriggerForSpec: FOR TriggerForOpt TriggerForType { $$ = cat_str(3, make_str("for"), $2, $3); } | /* EMPTY */ { $$ = EMPTY; } ;TriggerForOpt: EACH { $$ = make_str("each"); } | /*EMPTY*/ { $$ = EMPTY; } ;TriggerForType: ROW { $$ = make_str("row"); } | STATEMENT { $$ = make_str("statement"); } ;TriggerFuncArgs: TriggerFuncArg { $$ = $1; } | TriggerFuncArgs ',' TriggerFuncArg { $$ = cat_str(3, $1, make_str(","), $3); } | /*EMPTY*/ { $$ = EMPTY; } ;TriggerFuncArg: PosAllConst { $$ = $1; } | ColId { $$ = $1; } ;OptConstrFromTable: /* Empty */ { $$ = EMPTY; } | FROM qualified_name { $$ = cat2_str(make_str("from"), $2); } ;ConstraintAttributeSpec: ConstraintDeferrabilitySpec { $$ = $1; } | ConstraintDeferrabilitySpec ConstraintTimeSpec { if (strcmp($1, "deferrable") != 0 && strcmp($2, "initially deferrable") == 0 ) mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE"); $$ = cat2_str($1, $2); } | ConstraintTimeSpec { $$ = $1; } | ConstraintTimeSpec ConstraintDeferrabilitySpec { if (strcmp($2, "deferrable") != 0 && strcmp($1, "initially deferrable") == 0 ) mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE"); $$ = cat2_str($1, $2); } ;ConstraintDeferrabilitySpec: NOT DEFERRABLE { $$ = make_str("not deferrable"); } | DEFERRABLE { $$ = make_str("deferrable"); } ;ConstraintTimeSpec: INITIALLY IMMEDIATE { $$ = make_str("initially immediate"); } | INITIALLY DEFERRED { $$ = make_str("initially deferred"); } ;DropTrigStmt: DROP TRIGGER name ON qualified_name opt_drop_behavior { $$ = cat_str(5, make_str("drop trigger"), $3, make_str("on"), $5, $6); } ;/***************************************************************************** * * QUERIES : * CREATE ASSERTION ... * DROP ASSERTION ... * *****************************************************************************/CreateAssertStmt: CREATE ASSERTION name CHECK '(' a_expr ')' ConstraintAttributeSpec { mmerror(PARSE_ERROR, ET_ERROR, "CREATE ASSERTION is not yet supported"); $$ = cat_str(6, make_str("create assertion"), $3, make_str("check ("), $6, make_str(")"), $8); } ;DropAssertStmt: DROP ASSERTION name { mmerror(PARSE_ERROR, ET_ERROR, "DROP ASSERTION is not yet supported"); $$ = cat2_str(make_str("drop assertion"), $3); } ;/***************************************************************************** * * QUERY : * define (type,operator,aggregate) * *****************************************************************************/DefineStmt: CREATE AGGREGATE func_name definition { $$ = cat_str(3, make_str("create aggregate"), $3, $4); } | CREATE OPERATOR all_Op definition { $$ = cat_str(3, make_str("create operator"), $3, $4); } | CREATE TYPE_P any_name definition { $$ = cat_str(3, make_str("create type"), $3, $4); } | CREATE TYPE_P any_name AS rowdefinition { $$ = cat_str(4, make_str("create type"), $3, make_str("as"), $5); } ;rowdefinition: '(' TableFuncElementList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")"));} ;definition: '(' def_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } ;def_list: def_elem { $$ = $1; } | def_list ',' def_elem { $$ = cat_str(3, $1, make_str(","), $3); } ;def_elem: ColLabel '=' def_arg { $$ = cat_str(3, $1, make_str("="), $3); } | ColLabel { $$ = $1; } ;/* Note: any simple identifier will be returned as a type name! */def_arg: func_return { $$ = $1; } | qual_all_Op { $$ = $1; } | AllConst { $$ = $1; } ;CreateOpClassStmt: CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename USING access_method AS opclass_item_list { $$ = cat_str(9, make_str("create operator class"), $4, $5, make_str("for type"), $8, make_str("using"), $10, make_str("as"), $12); } ;opclass_item_list: opclass_item { $$ = $1; } | opclass_item_list ',' opclass_item { $$ = cat_str(3, $1, make_str(","), $3); } ;opclass_item: OPERATOR PosIntConst any_operator opt_recheck { $$ = cat_str(4, make_str("operator"), $2, $3, $4); } | OPERATOR PosIntConst any_operator '(' oper_argtypes ')' opt_recheck { $$ = cat_str(7, make_str("operator"), $2, $3, make_str("("), $5, make_str(")"), $7); } | FUNCTION PosIntConst func_name func_args { $$ = cat_str(4, make_str("function"), $2, $3, $4); } | STORAGE Typename { $$ = cat2_str(make_str("storage"), $2); } ;opt_default: DEFAULT { $$ = make_str("default"); } | /*EMPTY*/ { $$ = EMPTY; } ;opt_recheck: RECHECK { $$ = make_str("recheck"); } | /*EMPTY*/ { $$ = EMPTY; } ;DropOpClassStmt: DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior { $$ = cat_str(5,make_str("drop operator class"), $4, make_str("using"), $6, $7); } ;/***************************************************************************** * * QUERY: * * DROP itemtype itemname [, itemname ...] * *****************************************************************************/DropStmt: DROP drop_type any_name_list opt_drop_behavior { $$ = cat_str(4, make_str("drop"), $2, $3, $4); } ;drop_type: TABLE { $$ = make_str("table"); } | SEQUENCE { $$ = make_str("sequence"); } | VIEW { $$ = make_str("view"); } | INDEX { $$ = make_str("index"); } | TYPE_P { $$ = make_str("type"); } | DOMAIN_P { $$ = make_str("domain"); } | CONVERSION_P { $$ = make_str("conversion"); } | SCHEMA { $$ = make_str("schema"); } ;any_name_list: any_name { $$ = $1; } | any_name_list ',' any_name { $$ = cat_str(3, $1, make_str(","), $3); } ;any_name: ColId { $$ = $1; } | dotted_name { $$ = $1; } ;/***************************************************************************** * * QUERY: * truncate table relname * *****************************************************************************/TruncateStmt: TRUNCATE opt_table qualified_name { $$ = cat_str(3, make_str("truncate table"), $2, $3); } ;/***************************************************************************** * * QUERY: * fetch/move * *****************************************************************************//* This is different from the backend as we try to be compatible with many other * embedded SQL implementations. So we accept their syntax as well and * translate it to the PGSQL syntax. */ FetchStmt: FETCH fetch_direction from_in name ecpg_into_using { add_additional_variables($4, false); $$ = cat_str(4, make_str("fetch"), $2, $3, $4); } | FETCH fetch_direction name ecpg_into_using { add_additional_variables($3, false); $$ = cat_str(4, make_str("fetch"), $2, make_str("from"), $3); } | FETCH from_in name ecpg_into_using { add_additional_variables($3, false); $$ = cat_str(3, make_str("fetch"), $2, $3); } | FETCH name ecpg_into_using { add_additional_variables($2, false); $$ = cat2_str(make_str("fetch"), $2); } | FETCH fetch_direction from_in name { add_additional_variables($4, false); $$ = cat_str(4, make_str("fetch"), $2, $3, $4); } | FETCH fetch_direction name { add_additional_variables($3, false); $$ = cat_str(4, make_str("fetch"), $2, make_str("from"), $3); } | FETCH from_in name { add_additional_variables($3, false); $$ = cat_str(3, make_str("fetch"), $2, $3); } | FETCH name { add_additional_variables($2, false); $$ = cat2_str(make_str("fetch"), $2); } | MOVE fetch_direction from_in name { $$ = cat_str(4, make_str("move"), $2, $3, $4); } | MOVE name { $$ = cat2_str(make_str("move"), $2); } ;fetch_direction: NEXT { $$ = make_str("next"); } | PRIOR { $$ = make_str("prior"); } | FIRST_P { $$ = make_str("first"); } | LAST_P { $$ = make_str("last"); } | ABSOLUTE_P fetch_count { $$ = cat2_str(make_str("absolute"), $2); } | RELATIVE_P fetch_count { $$ = cat2_str(make_str("relative"), $2); } | fetch_count { $$ = $1; } | ALL { $$ = make_str("all"); } | FORWARD { $$ = make_str("forward"); } | FORWARD fetch_count { $$ = cat2_str(make_str("forward"), $2); } | FORWARD ALL { $$ = make_str("forward all"); } | BACKWARD { $$ = make_str("backward"); } | BACKWARD fetch_count { $$ = cat2_str(make_str("backward"), $2); } | BACKWARD ALL { $$ = make_str("backward all"); } ;fetch_count: IntConst { $$ = $1; } ;from_in: IN_P { $$ = make_str("in"); } | FROM { $$ = make_str("from"); } ;/***************************************************************************** * * 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 name IS comment_text { $$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6); } | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')' IS comment_text { $$ = cat_str(6, make_str("comment on aggregate"), $4, make_str("("), $6, make_str(") is"), $9); } | COMMENT ON FUNCTION func_name func_args IS comment_text { $$ = cat_str(5, make_str("comment on function"), $4, $5, make_str("is"), $7); } | COMMENT ON OPERATOR all_Op '(' oper_argtypes ')' IS comment_text { $$ = cat_str(6, make_str("comment on operator"), $4, make_str("("), $6, make_str(") is"), $9); } | COMMENT ON TRIGGER name ON any_name IS comment_text { $$ = cat_str(6, make_str("comment on trigger"), $4, make_str("on"), $6, make_str("is"), $8); } | COMMENT ON RULE name ON any_name IS comment_text
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -