📄 gram.y
字号:
| USER { $$ = lcons( makeString( "USER"), NIL); } ;/* 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 { Constraint *n = (Constraint *)$3; if (n != NULL) n->name = fmtId($2); $$ = $3; } | ConstraintElem { $$ = $1; } ;ConstraintElem: CHECK '(' constraint_expr ')' { Constraint *n = makeNode(Constraint); n->contype = CONSTR_CHECK; n->name = NULL; n->def = FlattenStringList($3); $$ = (Node *)n; } | UNIQUE '(' columnList ')' { Constraint *n = makeNode(Constraint); n->contype = CONSTR_UNIQUE; n->name = NULL; n->def = NULL; n->keys = $3; $$ = (Node *)n; } | PRIMARY KEY '(' columnList ')' { Constraint *n = makeNode(Constraint); n->contype = CONSTR_PRIMARY; n->name = NULL; n->def = NULL; n->keys = $4; $$ = (Node *)n; } | FOREIGN KEY '(' columnList ')' REFERENCES ColId opt_column_list key_match key_actions { elog(NOTICE,"CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented"); $$ = NULL; } ;constraint_list: constraint_list ',' constraint_expr { $$ = lappend($1,makeString(",")); $$ = nconc($$, $3); } | constraint_expr { $$ = $1; } ;constraint_expr: AexprConst { $$ = makeConstantList((A_Const *) $1); } | NULL_P { $$ = lcons( makeString("NULL"), NIL); } | ColId { $$ = lcons( makeString(fmtId($1)), NIL); } | '-' constraint_expr %prec UMINUS { $$ = lcons( makeString( "-"), $2); } | constraint_expr '+' constraint_expr { $$ = nconc( $1, lcons( makeString( "+"), $3)); } | constraint_expr '-' constraint_expr { $$ = nconc( $1, lcons( makeString( "-"), $3)); } | constraint_expr '/' constraint_expr { $$ = nconc( $1, lcons( makeString( "/"), $3)); } | constraint_expr '%' constraint_expr { $$ = nconc( $1, lcons( makeString( "%"), $3)); } | constraint_expr '*' constraint_expr { $$ = nconc( $1, lcons( makeString( "*"), $3)); } | constraint_expr '^' constraint_expr { $$ = nconc( $1, lcons( makeString( "^"), $3)); } | constraint_expr '=' constraint_expr { $$ = nconc( $1, lcons( makeString( "="), $3)); } | constraint_expr '<' constraint_expr { $$ = nconc( $1, lcons( makeString( "<"), $3)); } | constraint_expr '>' constraint_expr { $$ = nconc( $1, lcons( makeString( ">"), $3)); } | ':' constraint_expr { $$ = lcons( makeString( ":"), $2); } | ';' constraint_expr { $$ = lcons( makeString( ";"), $2); } | '|' constraint_expr { $$ = lcons( makeString( "|"), $2); } | constraint_expr TYPECAST Typename { $3->name = fmtId($3->name); $$ = nconc( lcons( makeString( "CAST"), $1), makeList( makeString("AS"), $3, -1)); } | CAST '(' constraint_expr AS Typename ')' { $5->name = fmtId($5->name); $$ = nconc( lcons( makeString( "CAST"), $3), makeList( makeString("AS"), $5, -1)); } | '(' constraint_expr ')' { $$ = lappend( lcons( makeString( "("), $2), makeString( ")")); } | func_name '(' ')' { $$ = makeList( makeString($1), makeString("("), -1); $$ = lappend( $$, makeString(")")); } | func_name '(' constraint_list ')' { $$ = makeList( makeString($1), makeString("("), -1); $$ = nconc( $$, $3); $$ = lappend( $$, makeString(")")); } | constraint_expr Op constraint_expr { $$ = nconc( $1, lcons( makeString( $2), $3)); } | constraint_expr LIKE constraint_expr { $$ = nconc( $1, lcons( makeString( "LIKE"), $3)); } | constraint_expr NOT LIKE constraint_expr { $$ = nconc( $1, lcons( makeString( "NOT LIKE"), $4)); } | constraint_expr AND constraint_expr { $$ = nconc( $1, lcons( makeString( "AND"), $3)); } | constraint_expr OR constraint_expr { $$ = nconc( $1, lcons( makeString( "OR"), $3)); } | NOT constraint_expr { $$ = lcons( makeString( "NOT"), $2); } | Op constraint_expr { $$ = lcons( makeString( $1), $2); } | constraint_expr Op { $$ = lappend( $1, makeString( $2)); } | constraint_expr ISNULL { $$ = lappend( $1, makeString( "IS NULL")); } | constraint_expr IS NULL_P { $$ = lappend( $1, makeString( "IS NULL")); } | constraint_expr NOTNULL { $$ = lappend( $1, makeString( "IS NOT NULL")); } | constraint_expr IS NOT NULL_P { $$ = lappend( $1, makeString( "IS NOT NULL")); } | constraint_expr IS TRUE_P { $$ = lappend( $1, makeString( "IS TRUE")); } | constraint_expr IS FALSE_P { $$ = lappend( $1, makeString( "IS FALSE")); } | constraint_expr IS NOT TRUE_P { $$ = lappend( $1, makeString( "IS NOT TRUE")); } | constraint_expr IS NOT FALSE_P { $$ = lappend( $1, makeString( "IS NOT FALSE")); } | constraint_expr IN '(' c_list ')' { $$ = lappend( $1, makeString("IN")); $$ = lappend( $$, makeString("(")); $$ = nconc( $$, $4); $$ = lappend( $$, makeString(")")); } | constraint_expr NOT IN '(' c_list ')' { $$ = lappend( $1, makeString("NOT IN")); $$ = lappend( $$, makeString("(")); $$ = nconc( $$, $5); $$ = lappend( $$, makeString(")")); } | constraint_expr BETWEEN c_expr AND c_expr { $$ = lappend( $1, makeString("BETWEEN")); $$ = nconc( $$, $3); $$ = lappend( $$, makeString("AND")); $$ = nconc( $$, $5); } | constraint_expr NOT BETWEEN c_expr AND c_expr { $$ = lappend( $1, makeString("NOT BETWEEN")); $$ = nconc( $$, $4); $$ = lappend( $$, makeString("AND")); $$ = nconc( $$, $6); } ;c_list: c_list ',' c_expr { $$ = lappend($1, makeString(",")); $$ = nconc($$, $3); } | c_expr { $$ = $1; } ;c_expr: AexprConst { $$ = makeConstantList((A_Const *) $1); } ;key_match: MATCH FULL { $$ = NULL; } | MATCH PARTIAL { $$ = NULL; } | /*EMPTY*/ { $$ = NULL; } ;key_actions: key_action key_action { $$ = NIL; } | key_action { $$ = NIL; } | /*EMPTY*/ { $$ = NIL; } ;key_action: ON DELETE key_reference { $$ = NIL; } | ON UPDATE key_reference { $$ = NIL; } ;key_reference: NO ACTION { $$ = NULL; } | CASCADE { $$ = NULL; } | SET DEFAULT { $$ = NULL; } | SET NULL_P { $$ = NULL; } ;OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; } | /*EMPTY*/ { $$ = NIL; } ;CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SubSelect { SelectStmt *n = (SelectStmt *)$7; if ($5 != NIL) mapTargetColumns($5, n->targetList); n->istemp = $2; n->into = $4; $$ = (Node *)n; } ;OptCreateAs: '(' CreateAsList ')' { $$ = $2; } | /*EMPTY*/ { $$ = NULL; } ;CreateAsList: CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); } | CreateAsElement { $$ = lcons($1, NIL); } ;CreateAsElement: ColId { ColumnDef *n = makeNode(ColumnDef); n->colname = $1; n->typename = NULL; n->defval = NULL; n->is_not_null = FALSE; n->constraints = NULL; $$ = (Node *)n; } ;/***************************************************************************** * * QUERY : * CREATE SEQUENCE seqname * *****************************************************************************/CreateSeqStmt: CREATE SEQUENCE relation_name OptSeqList { CreateSeqStmt *n = makeNode(CreateSeqStmt); n->seqname = $3; n->options = $4; $$ = (Node *)n; } ;OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); } | { $$ = NIL; } ;OptSeqElem: CACHE IntegerOnly { $$ = makeNode(DefElem); $$->defname = "cache"; $$->arg = (Node *)$2; } | CYCLE { $$ = makeNode(DefElem); $$->defname = "cycle"; $$->arg = (Node *)NULL; } | INCREMENT IntegerOnly { $$ = makeNode(DefElem); $$->defname = "increment"; $$->arg = (Node *)$2; } | MAXVALUE IntegerOnly { $$ = makeNode(DefElem); $$->defname = "maxvalue"; $$->arg = (Node *)$2; } | MINVALUE IntegerOnly { $$ = makeNode(DefElem); $$->defname = "minvalue"; $$->arg = (Node *)$2; } | START IntegerOnly { $$ = makeNode(DefElem); $$->defname = "start"; $$->arg = (Node *)$2; } ;NumericOnly: FloatOnly { $$ = $1; } | IntegerOnly { $$ = $1; }FloatOnly: FCONST { $$ = makeFloat($1); } | '-' FCONST { $$ = makeFloat($2); $$->val.dval = - $$->val.dval; } ;IntegerOnly: Iconst { $$ = makeInteger($1); } | '-' Iconst { $$ = makeInteger($2); $$->val.ival = - $$->val.ival; } ;/***************************************************************************** * * QUERIES : * CREATE PROCEDURAL LANGUAGE ... * DROP PROCEDURAL LANGUAGE ... * *****************************************************************************/CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst HANDLER def_name LANCOMPILER Sconst { CreatePLangStmt *n = makeNode(CreatePLangStmt); n->plname = $5; n->plhandler = $7; n->plcompiler = $9; n->pltrusted = $2; $$ = (Node *)n; } ;PLangTrusted: TRUSTED { $$ = TRUE; } | { $$ = FALSE; }DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst { DropPLangStmt *n = makeNode(DropPLangStmt); n->plname = $4; $$ = (Node *)n; } ;/***************************************************************************** * * QUERIES : * CREATE TRIGGER ... * DROP TRIGGER ... * *****************************************************************************/CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON relation_name TriggerForSpec EXECUTE PROCEDURE name '(' TriggerFuncArgs ')' { CreateTrigStmt *n = makeNode(CreateTrigStmt); n->trigname = $3; n->relname = $7; n->funcname = $11; n->args = $13; n->before = $4; n->row = $8; memcpy (n->actions, $5, 4); $$ = (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 { $$ = 'd'; } | UPDATE { $$ = 'u'; } ;TriggerForSpec: FOR TriggerForOpt TriggerForType { $$ = $3; } ;TriggerForOpt: EACH { $$ = TRUE; } | /*EMPTY*/ { $$ = FALSE; } ;TriggerForType: ROW { $$ = TRUE; } | STATEMENT { $$ = FALSE; } ;TriggerFuncArgs: TriggerFuncArg { $$ = lcons($1, NIL); } | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); } | /*EMPTY*/ { $$ = NIL; } ;TriggerFuncArg: ICONST { char *s = (char *) palloc (256); sprintf (s, "%d", $1); $$ = s; } | FCONST { char *s = (char *) palloc (256); sprintf (s, "%g", $1); $$ = s; } | Sconst { $$ = $1; } | IDENT { $$ = $1; } ;DropTrigStmt: DROP TRIGGER name ON relation_name { DropTrigStmt *n = makeNode(DropTrigStmt); n->trigname = $3; n->relname = $5; $$ = (Node *) n; } ;/***************************************************************************** * * QUERY : * define (type,operator,aggregate) * *****************************************************************************/DefineStmt: CREATE def_type def_rest { $3->defType = $2; $$ = (Node *)$3; } ;def_rest: def_name definition { $$ = makeNode(DefineStmt); $$->defname = $1; $$->definition = $2; } ;def_type: OPERATOR { $$ = OPERATOR; } | TYPE_P { $$ = TYPE_P; } | AGGREGATE { $$ = AGGREGATE; } ;def_name: PROCEDURE { $$ = "procedure"; } | JOIN { $$ = "join"; } | ColId { $$ = $1; } | MathOp { $$ = $1; } | Op { $$ = $1; } ;definition: '(' def_list ')' { $$ = $2; } ;def_list: def_elem { $$ = lcons($1, NIL); } | def_list ',' def_elem { $$ = lappend($1, $3); } ;def_elem: def_name '=' def_arg { $$ = makeNode(DefElem); $$->defname = $1; $$->arg = (Node *)$3; } | def_name { $$ = makeNode(DefElem); $$->defname = $1; $$->arg = (Node *)NULL; } | DEFAULT '=' def_arg { $$ = makeNode(DefElem);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -