⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gram.y

📁 PostgreSQL7.4.6 for Linux
💻 Y
📖 第 1 页 / 共 5 页
字号:
				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_PRIMARY;					n->name = NULL;					n->raw_expr = NULL;					n->cooked_expr = NULL;					n->keys = NULL;					$$ = (Node *)n;				}			| CHECK '(' a_expr ')'				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_CHECK;					n->name = NULL;					n->raw_expr = $3;					n->cooked_expr = NULL;					n->keys = NULL;					$$ = (Node *)n;				}			| DEFAULT b_expr				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_DEFAULT;					n->name = NULL;					if (exprIsNullConstant($2))					{						/* DEFAULT NULL should be reported as empty expr */						n->raw_expr = NULL;					}					else					{						n->raw_expr = $2;					}					n->cooked_expr = NULL;					n->keys = NULL;					$$ = (Node *)n;				}			| REFERENCES qualified_name opt_column_list key_match key_actions				{					FkConstraint *n = makeNode(FkConstraint);					n->constr_name		= NULL;					n->pktable			= $2;					n->fk_attrs			= NIL;					n->pk_attrs			= $3;					n->fk_matchtype		= $4;					n->fk_upd_action	= (char) ($5 >> 8);					n->fk_del_action	= (char) ($5 & 0xFF);					n->deferrable		= FALSE;					n->initdeferred		= FALSE;					$$ = (Node *)n;				}		;/* * ConstraintAttr represents constraint attributes, which we parse as if * they were independent constraint clauses, in order to avoid shift/reduce * conflicts (since NOT might start either an independent NOT NULL clause * or an attribute).  analyze.c is responsible for attaching the attribute * information to the preceding "real" constraint node, and for complaining * if attribute clauses appear in the wrong place or wrong combinations. * * See also ConstraintAttributeSpec, which can be used in places where * there is no parsing conflict. */ConstraintAttr:			DEFERRABLE				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_ATTR_DEFERRABLE;					$$ = (Node *)n;				}			| NOT DEFERRABLE				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_ATTR_NOT_DEFERRABLE;					$$ = (Node *)n;				}			| INITIALLY DEFERRED				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_ATTR_DEFERRED;					$$ = (Node *)n;				}			| INITIALLY IMMEDIATE				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_ATTR_IMMEDIATE;					$$ = (Node *)n;				}		;/* * SQL99 supports wholesale borrowing of a table definition via the LIKE clause. * This seems to be a poor man's inheritance capability, with the resulting * tables completely decoupled except for the original commonality in definitions. * * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension * which is a part of SQL 200N */TableLikeClause:			LIKE qualified_name like_including_defaults				{					InhRelation *n = makeNode(InhRelation);					n->relation = $2;					n->including_defaults = $3;					$$ = (Node *)n;				}		;like_including_defaults:				INCLUDING DEFAULTS		{ $$ = true; }				| EXCLUDING DEFAULTS		{ $$ = false; }				| /* EMPTY */				{ $$ = false; }		;/* 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				{					switch (nodeTag($3))					{						case T_Constraint:							{								Constraint *n = (Constraint *)$3;								n->name = $2;							}							break;						case T_FkConstraint:							{								FkConstraint *n = (FkConstraint *)$3;								n->constr_name = $2;							}							break;						default:							break;					}					$$ = $3;				}			| ConstraintElem						{ $$ = $1; }		;ConstraintElem:			CHECK '(' a_expr ')'				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_CHECK;					n->name = NULL;					n->raw_expr = $3;					n->cooked_expr = NULL;					$$ = (Node *)n;				}			| UNIQUE '(' columnList ')'				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_UNIQUE;					n->name = NULL;					n->raw_expr = NULL;					n->cooked_expr = NULL;					n->keys = $3;					$$ = (Node *)n;				}			| PRIMARY KEY '(' columnList ')'				{					Constraint *n = makeNode(Constraint);					n->contype = CONSTR_PRIMARY;					n->name = NULL;					n->raw_expr = NULL;					n->cooked_expr = NULL;					n->keys = $4;					$$ = (Node *)n;				}			| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name				opt_column_list key_match key_actions ConstraintAttributeSpec				{					FkConstraint *n = makeNode(FkConstraint);					n->constr_name		= NULL;					n->pktable			= $7;					n->fk_attrs			= $4;					n->pk_attrs			= $8;					n->fk_matchtype		= $9;					n->fk_upd_action	= (char) ($10 >> 8);					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								{ $$ = makeList1($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								{ $$ = TRUE; }			| WITHOUT OIDS							{ $$ = FALSE; }			| /*EMPTY*/								{ $$ = TRUE; }		;OnCommitOption:  ON COMMIT DROP				{ $$ = ONCOMMIT_DROP; }			| ON COMMIT DELETE_P ROWS		{ $$ = ONCOMMIT_DELETE_ROWS; }			| ON COMMIT PRESERVE ROWS		{ $$ = ONCOMMIT_PRESERVE_ROWS; }			| /*EMPTY*/						{ $$ = ONCOMMIT_NOOP; }		;/* * Note: CREATE TABLE ... AS SELECT ... is just another spelling for * SELECT ... INTO. */CreateAsStmt:			CREATE OptTemp TABLE qualified_name OptCreateAs AS 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;					$$ = $7;				}		;OptCreateAs:			'(' CreateAsList ')'					{ $$ = $2; }			| /*EMPTY*/								{ $$ = NIL; }		;CreateAsList:			CreateAsElement							{ $$ = makeList1($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", (Node *)NULL);				}			| NO MINVALUE				{					$$ = makeDefElem("minvalue", (Node *)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:			Iconst				{					$$ = makeInteger($1);				}			| '-' Iconst				{					$$ = makeInteger($2);					$$->val.ival = - $$->val.ival;				}		;/***************************************************************************** * *		QUERIES : *				CREATE PROCEDURAL LANGUAGE ... *				DROP PROCEDURAL LANGUAGE ... * *****************************************************************************/CreatePLangStmt:			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;				$$ = (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 name and dotted_name separately. */handler_name:			name							{ $$ = makeList1(makeString($1)); }			| dotted_name							{ $$ = $1; }		;opt_lancompiler:			LANCOMPILER Sconst						{ $$ = $2; }			| /*EMPTY*/								{ $$ = ""; }		;opt_validator:			VALIDATOR handler_name { $$ = $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*/								{}		;/***************************************************************************** * *		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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -