📄 preproc.y
字号:
} | ECPGDeclare { output_simple_statement($1); } | ECPGDisconnect { if (connection) yyerror("no at option for disconnect statement.\n"); fprintf(yyout, "{ ECPGdisconnect(__LINE__, \"%s\");", $1); whenever_action(2); free($1); } | ECPGExecute { output_statement($1, 0); } | ECPGFree { fprintf(yyout, "{ ECPGdeallocate(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1); whenever_action(2); free($1); } | ECPGOpen { struct cursor *ptr; for (ptr = cur; ptr != NULL; ptr=ptr->next) { if (strcmp(ptr->name, $1) == 0) break; } if (ptr == NULL) { sprintf(errortext, "trying to open undeclared cursor %s\n", $1); yyerror(errortext); } fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"%s\",", ptr->connection ? ptr->connection : "NULL", ptr->command); /* dump variables to C file*/ dump_variables(ptr->argsinsert, 0); dump_variables(argsinsert, 0); fputs("ECPGt_EOIT, ", yyout); dump_variables(ptr->argsresult, 0); fputs("ECPGt_EORT);", yyout); whenever_action(2); free($1); } | ECPGPrepare { if (connection) yyerror("no at option for set connection statement.\n"); fprintf(yyout, "{ ECPGprepare(__LINE__, %s);", $1); whenever_action(2); free($1); } | ECPGRelease { /* output already done */ } | ECPGSetAutocommit { fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL"); whenever_action(2); free($1); } | ECPGSetConnection { if (connection) yyerror("no at option for set connection statement.\n"); fprintf(yyout, "{ ECPGsetconn(__LINE__, %s);", $1); whenever_action(2); free($1); } | ECPGTypedef { if (connection) yyerror("no at option for typedef statement.\n"); output_simple_statement($1); } | ECPGVar { if (connection) yyerror("no at option for var statement.\n"); output_simple_statement($1); } | ECPGWhenever { if (connection) yyerror("no at option for whenever statement.\n"); output_simple_statement($1); } ;/* * We start with a lot of stuff that's very similar to the backend's parsing *//***************************************************************************** * * Create a new Postgres DBMS user * * *****************************************************************************/CreateUserStmt: CREATE USER UserId user_passwd_clause user_createdb_clause user_createuser_clause user_group_clause user_valid_clause { $$ = cat3_str(cat5_str(make1_str("create user"), $3, $4, $5, $6), $7, $8); } ;/***************************************************************************** * * Alter a postresql DBMS user * * *****************************************************************************/AlterUserStmt: ALTER USER UserId user_passwd_clause user_createdb_clause user_createuser_clause user_group_clause user_valid_clause { $$ = cat3_str(cat5_str(make1_str("alter user"), $3, $4, $5, $6), $7, $8); } ;/***************************************************************************** * * Drop a postresql DBMS user * * *****************************************************************************/DropUserStmt: DROP USER UserId { $$ = cat2_str(make1_str("drop user"), $3); } ;user_passwd_clause: WITH PASSWORD UserId { $$ = cat2_str(make1_str("with password") , $3); } | /*EMPTY*/ { $$ = make1_str(""); } ;user_createdb_clause: CREATEDB { $$ = make1_str("createdb"); } | NOCREATEDB { $$ = make1_str("nocreatedb"); } | /*EMPTY*/ { $$ = make1_str(""); } ;user_createuser_clause: CREATEUSER { $$ = make1_str("createuser"); } | NOCREATEUSER { $$ = make1_str("nocreateuser"); } | /*EMPTY*/ { $$ = NULL; } ;user_group_list: user_group_list ',' UserId { $$ = cat3_str($1, make1_str(","), $3); } | UserId { $$ = $1; } ;user_group_clause: IN GROUP user_group_list { $$ = cat2_str(make1_str("in group"), $3); } | /*EMPTY*/ { $$ = make1_str(""); } ;user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3); } | /*EMPTY*/ { $$ = make1_str(""); } ;/***************************************************************************** * * Set PG internal variable * SET name TO 'var_value' * Include SQL92 syntax (thomas 1997-10-22): * SET TIME ZONE 'var_value' * *****************************************************************************/VariableSetStmt: SET ColId TO var_value { $$ = cat4_str(make1_str("set"), $2, make1_str("to"), $4); } | SET ColId '=' var_value { $$ = cat4_str(make1_str("set"), $2, make1_str("="), $4); } | SET TIME ZONE zone_value { $$ = cat2_str(make1_str("set time zone"), $4); } | SET TRANSACTION ISOLATION LEVEL opt_level { $$ = cat2_str(make1_str("set transaction isolation level"), $5); } | SET NAMES encoding {#ifdef MB $$ = cat2_str(make1_str("set names"), $3);#else yyerror("SET NAMES is not supported");#endif } ;opt_level: READ COMMITTED { $$ = make1_str("read committed"); } | SERIALIZABLE { $$ = make1_str("serializable"); } ;var_value: Sconst { $$ = $1; } | DEFAULT { $$ = make1_str("default"); } ;zone_value: Sconst { $$ = $1; } | DEFAULT { $$ = make1_str("default"); } | LOCAL { $$ = make1_str("local"); } ;VariableShowStmt: SHOW ColId { $$ = cat2_str(make1_str("show"), $2); } | SHOW TIME ZONE { $$ = make1_str("show time zone"); } | SHOW TRANSACTION ISOLATION LEVEL { $$ = make1_str("show transaction isolation level"); } ;VariableResetStmt: RESET ColId { $$ = cat2_str(make1_str("reset"), $2); } | RESET TIME ZONE { $$ = make1_str("reset time zone"); } | RESET TRANSACTION ISOLATION LEVEL { $$ = make1_str("reset transaction isolation level"); } ;/***************************************************************************** * * QUERY : * addattr ( attr1 = type1 .. attrn = typen ) to <relname> [*] * *****************************************************************************/AddAttrStmt: ALTER TABLE relation_name opt_inh_star alter_clause { $$ = cat4_str(make1_str("alter table"), $3, $4, $5); } ;alter_clause: ADD opt_column columnDef { $$ = cat3_str(make1_str("add"), $2, $3); } | ADD '(' OptTableElementList ')' { $$ = make3_str(make1_str("add("), $3, make1_str(")")); } | DROP opt_column ColId { yyerror("ALTER TABLE/DROP COLUMN not yet implemented"); } | ALTER opt_column ColId SET DEFAULT default_expr { yyerror("ALTER TABLE/ALTER COLUMN/SET DEFAULT not yet implemented"); } | ALTER opt_column ColId DROP DEFAULT { yyerror("ALTER TABLE/ALTER COLUMN/DROP DEFAULT not yet implemented"); } | ADD ConstraintElem { yyerror("ALTER TABLE/ADD CONSTRAINT not yet implemented"); } ;/***************************************************************************** * * QUERY : * close <optname> * *****************************************************************************/ClosePortalStmt: CLOSE opt_id { $$ = cat2_str(make1_str("close"), $2); } ;/***************************************************************************** * * QUERY : * COPY [BINARY] <relname> FROM/TO * [USING DELIMITERS <delimiter>] * *****************************************************************************/CopyStmt: COPY opt_binary relation_name opt_with_copy copy_dirn copy_file_name copy_delimiter { $$ = cat3_str(cat5_str(make1_str("copy"), $2, $3, $4, $5), $6, $7); } ;copy_dirn: TO { $$ = make1_str("to"); } | FROM { $$ = make1_str("from"); } ;/* * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is * used depends on the direction. (It really doesn't make sense to copy from * stdout. We silently correct the "typo". - AY 9/94 */copy_file_name: Sconst { $$ = $1; } | STDIN { $$ = make1_str("stdin"); } | STDOUT { $$ = make1_str("stdout"); } ;opt_binary: BINARY { $$ = make1_str("binary"); } | /*EMPTY*/ { $$ = make1_str(""); } ;opt_with_copy: WITH OIDS { $$ = make1_str("with oids"); } | /*EMPTY*/ { $$ = make1_str(""); } ;/* * the default copy delimiter is tab but the user can configure it */copy_delimiter: USING DELIMITERS Sconst { $$ = cat2_str(make1_str("using delimiters"), $3); } | /*EMPTY*/ { $$ = make1_str(""); } ;/***************************************************************************** * * QUERY : * CREATE relname * *****************************************************************************/CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')' OptInherit { $$ = cat3_str(cat4_str(make1_str("create"), $2, make1_str("table"), $4), make3_str(make1_str("("), $6, make1_str(")")), $8); } ;OptTemp: OptTempType { $$ = $1; } | OptTempScope OptTempType { $$ = cat2_str($1,$2); } ;OptTempType: TEMP { $$ = make1_str("temp"); } | TEMPORARY { $$ = make1_str("temporary"); } | /* EMPTY */ { $$ = make1_str(""); } ;OptTempScope: GLOBAL { yyerror("GLOBAL TEMPORARY TABLE is not currently supported"); $$ = make1_str("global"); } | LOCAL { $$ = make1_str("local"); } ;OptTableElementList: OptTableElementList ',' OptTableElement { $$ = cat3_str($1, make1_str(","), $3); } | OptTableElement { $$ = $1; } | /*EMPTY*/ { $$ = make1_str(""); } ;OptTableElement: columnDef { $$ = $1; } | TableConstraint { $$ = $1; } ;columnDef: ColId Typename ColQualifier { $$ = cat3_str($1, $2, $3); } | ColId SERIAL ColPrimaryKey { $$ = make3_str($1, make1_str(" serial "), $3); } ;ColQualifier: ColQualList { $$ = $1; } | /*EMPTY*/ { $$ = make1_str(""); } ;ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); } | ColConstraint { $$ = $1; } ;ColPrimaryKey: PRIMARY KEY { $$ = make1_str("primary key"); } | /*EMPTY*/ { $$ = make1_str(""); } ;ColConstraint: CONSTRAINT name ColConstraintElem { $$ = cat3_str(make1_str("constraint"), $2, $3); } | ColConstraintElem { $$ = $1; } ;/* DEFAULT NULL is already the default for Postgres. * Bue define it here and carry it forward into the system * to make it explicit. * - thomas 1998-09-13 * WITH NULL and NULL are not SQL92-standard syntax elements, * so leave them out. Use DEFAULT NULL to explicitly indicate * that a column may have that value. WITH NULL leads to * shift/reduce conflicts with WITH TIME ZONE anyway. * - thomas 1999-01-08 */ColConstraintElem: CHECK '(' constraint_expr ')' { $$ = make3_str(make1_str("check("), $3, make1_str(")")); } | DEFAULT NULL_P { $$ = make1_str("default null"); } | DEFAULT default_expr { $$ = cat2_str(make1_str("default"), $2); } | NOT NULL_P { $$ = make1_str("not null"); } | UNIQUE { $$ = make1_str("unique"); } | PRIMARY KEY { $$ = make1_str("primary key"); } | REFERENCES ColId opt_column_list key_match key_actions { fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented"); $$ = make1_str(""); } ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -