📄 preproc.y
字号:
{ $$ = cat_str(3, make_str("like"), $2, $3); } ;like_including_defaults: INCLUDING DEFAULTS { $$ = make_str("including defaults"); } | EXCLUDING DEFAULTS { $$ = make_str("excluding defaults"); } | /* EMPTY */ { $$ = EMPTY; } ;/* ConstraintElem specifies constraint syntax which is not embedded into * a column definition. ColConstraintElem specifies the embedded form. * - thomas 1997-12-03 */TableConstraint: CONSTRAINT name ConstraintElem { $$ = cat_str(3, make_str("constraint"), $2, $3); } | ConstraintElem { $$ = $1; } ;ConstraintElem: CHECK '(' a_expr ')' { $$ = cat_str(3, make_str("check("), $3, make_str(")")); } | UNIQUE '(' columnList ')' OptConsTableSpace { $$ = cat_str(4, make_str("unique("), $3, make_str(")"), $5); } | PRIMARY KEY '(' columnList ')' OptConsTableSpace { $$ = cat_str(4, make_str("primary key("), $4, make_str(")"), $6); } | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list key_match key_actions ConstraintAttributeSpec { $$ = cat_str(8, make_str("foreign key("), $4, make_str(") references"), $7, $8, $9, $10, $11); } ;opt_column_list: '(' columnList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ;columnList: columnList ',' columnElem { $$ = cat_str(3, $1, make_str(","), $3); } | columnElem { $$ = $1; } ;columnElem: ColId { $$ = $1; } ;key_match: MATCH FULL { $$ = make_str("match full"); } | MATCH PARTIAL { mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported FOREIGN KEY/MATCH PARTIAL will be passed to backend"); $$ = make_str("match partial"); } | /*EMPTY*/ { $$ = EMPTY; } ;key_actions: key_delete { $$ = $1; } | key_update { $$ = $1; } | key_delete key_update { $$ = cat2_str($1, $2); } | key_update key_delete { $$ = cat2_str($1, $2); } | /*EMPTY*/ { $$ = EMPTY; } ;key_delete: ON DELETE_P key_action { $$ = cat2_str(make_str("on delete"), $3); } ;key_update: ON UPDATE key_action { $$ = cat2_str(make_str("on update"), $3); } ;key_action: NO ACTION { $$ = make_str("no action"); } | RESTRICT { $$ = make_str("restrict"); } | CASCADE { $$ = make_str("cascade"); } | SET DEFAULT { $$ = make_str("set default"); } | SET NULL_P { $$ = make_str("set null"); } ;OptInherit: INHERITS '(' qualified_name_list ')' { $$ = cat_str(3, make_str("inherits ("), $3, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ;OptWithOids: WITH OIDS { $$ = make_str("with oids"); } | WITHOUT OIDS { $$ = make_str("without oids"); } | /*EMPTY*/ { $$ = EMPTY; } ;OnCommitOption: ON COMMIT DROP { $$ = make_str("on commit drop"); } | ON COMMIT DELETE_P ROWS { $$ = make_str("on commit delete rows"); } | ON COMMIT PRESERVE ROWS { $$ = make_str("on commit preserve rows"); } | /*EMPTY*/ { $$ = EMPTY; } ;OptTableSpace: TABLESPACE name { $$ = cat2_str(make_str("tablespace"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ;OptConsTableSpace: USING INDEX TABLESPACE name { $$ = cat2_str(make_str("using index tablespace"), $4); } | /*EMPTY*/ { $$ = EMPTY; } ; /* * Note: CREATE TABLE ... AS SELECT ... is just another spelling for * SELECT ... INTO. */CreateAsStmt: CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs { FoundInto = 0; } SelectStmt { if (FoundInto == 1) mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE / AS SELECT may not specify INTO"); $$ = cat_str(7, make_str("create"), $2, make_str("table"), $4, $5, $6, $8); } ;/* * 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 { $$ = make_str("with oids as"); } | WITHOUT OIDS AS { $$ = make_str("without oids as"); } | AS { $$ = make_str("as"); } ;OptCreateAs: '(' CreateAsList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ;CreateAsList: CreateAsList ',' CreateAsElement { $$ = cat_str(3, $1, make_str(","), $3); } | CreateAsElement { $$ = $1; } ;CreateAsElement: ColId { $$ = $1; } ;/***************************************************************************** * * QUERY : * CREATE SEQUENCE seqname * ALTER SEQUENCE seqname * *****************************************************************************/CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList { $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5); } ;AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList { $$ = cat_str(3,make_str("alter sequence"), $3, $4); } ;OptSeqList: OptSeqList OptSeqElem { $$ = cat2_str($1, $2); } | /*EMPTY*/ { $$ = EMPTY; } ;OptSeqElem: CACHE NumConst { $$ = cat2_str(make_str("cache"), $2); } | CYCLE { $$ = make_str("cycle"); } | NO CYCLE { $$ = make_str("no cycle"); } | INCREMENT opt_by NumConst { $$ = cat_str(3, make_str("increment"), $2, $3); } | MAXVALUE NumConst { $$ = cat2_str(make_str("maxvalue"), $2); } | MINVALUE NumConst { $$ = cat2_str(make_str("minvalue"), $2); } | NO MAXVALUE { $$ = make_str("no maxvalue"); } | NO MINVALUE { $$ = make_str("no minvalue"); } | START opt_with NumConst { $$ = cat_str(3, make_str("start"), $2, $3); } | RESTART opt_with NumConst { $$ = cat_str(3, make_str("restart"), $2, $3); } ;opt_by: BY { $$ = make_str("by"); } | /*EMPTY*/ { $$ = EMPTY; } ;/***************************************************************************** * * QUERIES : * CREATE PROCEDURAL LANGUAGE ... * DROP PROCEDURAL LANGUAGE ... * *****************************************************************************/CreatePLangStmt: CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst { $$ = cat_str(5, make_str("create"), $2, $3, make_str("language"), $5); } | CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst HANDLER handler_name opt_validator opt_lancompiler { $$ = cat_str(9, make_str("create"), $2, $3, make_str("language"), $5, make_str("handler"), $7, $8, $9); } ;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 simple names instead. */handler_name: name { $$ = $1; } | name attrs { $$ = cat2_str($1, $2); } ;opt_validator: VALIDATOR handler_name { $$ = cat2_str(make_str("validator"), $2); } | /*EMPTY*/ { $$ = ""; } ;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; } ;/***************************************************************************** * * QUERY: * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/' * *****************************************************************************/CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst { $$ = cat_str(5,make_str("create tablespace"), $3, $4, make_str("location"), $6); } ;OptTableSpaceOwner: OWNER name { $$ = cat2_str(make_str("owner"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ;/***************************************************************************** * * 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 { $$ = cat2_str(make_str("drop tablespace"), $3); };/***************************************************************************** * * 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -