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

📄 preproc.y

📁 关系型数据库 Postgresql 6.5.2
💻 Y
📖 第 1 页 / 共 5 页
字号:
	free(str2);	free(str3);	free(str4);        return(res_str);}static char *make5_str(char *str1, char *str2, char *str3, char *str4, char *str5){            char * res_str  = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 1);             strcpy(res_str, str1);        strcat(res_str, str2);	strcat(res_str, str3);	strcat(res_str, str4);	strcat(res_str, str5);	free(str1);	free(str2);	free(str3);	free(str4);	free(str5);        return(res_str);}    static char *cat5_str(char *str1, char *str2, char *str3, char *str4, char *str5){            char * res_str  = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 5);             strcpy(res_str, str1);	strcat(res_str, " ");        strcat(res_str, str2);	strcat(res_str, " ");	strcat(res_str, str3);	strcat(res_str, " ");	strcat(res_str, str4);	strcat(res_str, " ");	strcat(res_str, str5);	free(str1);	free(str2);	free(str3);	free(str4);	free(str5);        return(res_str);}    static char *make_name(void){	char * name = (char *)mm_alloc(yyleng + 1);	strncpy(name, yytext, yyleng);	name[yyleng] = '\0';	return(name);}static voidoutput_statement(char * stmt, int mode){	int i, j=strlen(stmt);	fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"", connection ? connection : "NULL");	/* do this char by char as we have to filter '\"' */	for (i = 0;i < j; i++)		if (stmt[i] != '\"')			fputc(stmt[i], yyout);	fputs("\", ", yyout);	/* dump variables to C file*/	dump_variables(argsinsert, 1);	fputs("ECPGt_EOIT, ", yyout);	dump_variables(argsresult, 1);	fputs("ECPGt_EORT);", yyout);	mode |= 2;	whenever_action(mode);	free(stmt);	if (connection != NULL)		free(connection);}static struct typedefs *get_typedef(char *name){	struct typedefs *this;	for (this = types; this && strcmp(this->name, name); this = this->next);	if (!this)	{		sprintf(errortext, "invalid datatype '%s'", name);		yyerror(errortext);	}	return(this);}static voidadjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dimension, int type_index, bool pointer){	if (type_index >= 0) 	{		if (*length >= 0)                      	yyerror("No multi-dimensional array support");		*length = type_index;	}		       	if (type_dimension >= 0)	{		if (*dimension >= 0 && *length >= 0)			yyerror("No multi-dimensional array support");		if (*dimension >= 0)			*length = *dimension;		*dimension = type_dimension;	}	if (*length >= 0 && *dimension >= 0 && pointer)		yyerror("No multi-dimensional array support");	switch (type_enum)	{	   case ECPGt_struct:	   case ECPGt_union:	        /* pointer has to get dimension 0 */                if (pointer)	        {		    *length = *dimension;                    *dimension = 0;	        }                if (*length >= 0)                   yyerror("No multi-dimensional array support for structures");                break;           case ECPGt_varchar:	        /* pointer has to get dimension 0 */                if (pointer)                    *dimension = 0;                /* one index is the string length */                if (*length < 0)                {                   *length = *dimension;                   *dimension = -1;                }                break;           case ECPGt_char:           case ECPGt_unsigned_char:	        /* pointer has to get length 0 */                if (pointer)                    *length=0;                /* one index is the string length */                if (*length < 0)                {                   *length = (*dimension < 0) ? 1 : *dimension;                   *dimension = -1;                }                break;           default: 	        /* a pointer has dimension = 0 */                if (pointer) {                    *length = *dimension;		    *dimension = 0;	        }                if (*length >= 0)                   yyerror("No multi-dimensional array support for simple data types");                break;	}}%}%union {	double                  dval;        int                     ival;	char *                  str;	struct when             action;	struct index		index;	int			tagname;	struct this_type	type;	enum ECPGttype		type_enum;}/* special embedded SQL token */%token		SQL_AT SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK %token		SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE%token		SQL_DEALLOCATE SQL_DISCONNECT SQL_ENUM %token		SQL_FOUND SQL_FREE SQL_GO SQL_GOTO%token		SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_INT SQL_LONG%token		SQL_OFF SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE%token		SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT%token		SQL_SQLWARNING SQL_START SQL_STOP SQL_STRUCT SQL_UNSIGNED%token		SQL_VAR SQL_WHENEVER/* C token */%token		S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_ENUM S_EXTERN%token		S_FLOAT S_INT S%token		S_LONG S_REGISTER S_SHORT S_SIGNED S_STATIC S_STRUCT%token		S_UNION S_UNSIGNED S_VARCHAR/* I need this and don't know where it is defined inside the backend */%token		TYPECAST/* Keywords (in SQL92 reserved words) */%token  ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,                BEGIN_TRANS, BETWEEN, BOTH, BY,                CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,		COALESCE, COLLATE, COLUMN, COMMIT,                 CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,                 CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,                DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,                ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT,                FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,                GLOBAL, GRANT, GROUP, HAVING, HOUR_P,                IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS,                ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,                MATCH, MINUTE_P, MONTH_P, NAMES,                NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,                OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,                PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,                READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,                SCROLL, SECOND_P, SELECT, SET, SUBSTRING,                TABLE, TEMP, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR,		TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P,                UNION, UNIQUE, UPDATE, USER, USING,                VALUES, VARCHAR, VARYING, VIEW,                WHEN, WHERE, WITH, WORK, YEAR_P, ZONE/* Keywords (in SQL3 reserved words) */%token  TRIGGER/* Keywords (in SQL92 non-reserved words) */%token  COMMITTED, SERIALIZABLE, TYPE_P/* Keywords for Postgres support (not in SQL92 reserved words) * * The CREATEDB and CREATEUSER tokens should go away * when some sort of pg_privileges relation is introduced. * - Todd A. Brandys 1998-01-01? */%token  ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE,		BACKWARD, BEFORE, BINARY,		CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,                DATABASE, DELIMITERS, DO,		EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND,                FORWARD, FUNCTION, HANDLER,                INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,                LANCOMPILER, LIMIT, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P,		MAXVALUE, MINVALUE, MODE, MOVE,                NEW,  NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,		OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,                RENAME, RESET, RETURNS, ROW, RULE,                SERIAL, SEQUENCE, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT,		TRUSTED,                UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION/* Special keywords, not in the query language - see the "lex" file */%token <str>    IDENT SCONST Op CSTRING CVARIABLE CPP_LINE%token <ival>   ICONST PARAM%token <dval>   FCONST/* these are not real. they are here so that they get generated as #define's*/%token                  OP/* precedence */%left		OR%left		AND%right		NOT%right		'='%nonassoc	'<' '>'%nonassoc	LIKE%nonassoc	BETWEEN%nonassoc	IN%left		Op				/* multi-character ops and user-defined operators */%nonassoc	NOTNULL%nonassoc	ISNULL%nonassoc	NULL_P%nonassoc	IS%left		'+' '-'%left		'*' '/' '%'%left		'|'				/* this is the relation union op, not logical or *//* Unary Operators */%right		':'%left		';'				/* end of statement or natural log */%right		UMINUS%left		'.'%left		'[' ']'%nonassoc	TYPECAST%left		UNION INTERSECT EXCEPT%type  <str>	Iconst Fconst Sconst TransactionStmt CreateStmt UserId%type  <str>	CreateAsElement OptCreateAs CreateAsList CreateAsStmt%type  <str>	OptInherit key_reference key_action%type  <str>    key_match constraint_expr ColLabel SpecialRuleRelation%type  <str> 	ColId default_expr ColQualifier columnDef ColQualList%type  <str>    ColConstraint ColConstraintElem default_list NumericOnly FloatOnly%type  <str>    OptTableElementList OptTableElement TableConstraint%type  <str>    ConstraintElem key_actions constraint_list ColPrimaryKey%type  <str>    res_target_list res_target_el res_target_list2%type  <str>    res_target_el2 opt_id relation_name database_name%type  <str>    access_method attr_name class index_name name func_name%type  <str>    file_name AexprConst ParamNo TypeId%type  <str>	in_expr_nodes not_in_expr_nodes a_expr b_expr%type  <str> 	opt_indirection expr_list extract_list extract_arg%type  <str>	position_list position_expr substr_list substr_from%type  <str>	trim_list in_expr substr_for not_in_expr attr attrs%type  <str>	Typename Array Generic Numeric generic opt_float opt_numeric%type  <str> 	opt_decimal Character character opt_varying opt_charset%type  <str>	opt_collate Datetime datetime opt_timezone opt_interval%type  <str>	numeric a_expr_or_null row_expr row_descriptor row_list%type  <str>	SelectStmt SubSelect result OptTemp OptTempType OptTempScope%type  <str>	opt_table opt_union opt_unique sort_clause sortby_list%type  <str>	sortby OptUseOp opt_inh_star relation_name_list name_list%type  <str>	group_clause having_clause from_clause c_list %type  <str>	table_list join_outer where_clause relation_expr row_op sub_type%type  <str>	opt_column_list insert_rest InsertStmt OptimizableStmt%type  <str>    columnList DeleteStmt LockStmt UpdateStmt CursorStmt%type  <str>    NotifyStmt columnElem copy_dirn c_expr UnlistenStmt%type  <str>    copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary%type  <str>    opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name%type  <str>    ClosePortalStmt DestroyStmt VacuumStmt opt_verbose%type  <str>    opt_analyze opt_va_list va_list ExplainStmt index_params%type  <str>    index_list func_index index_elem opt_type opt_class access_method_clause%type  <str>    index_opt_unique IndexStmt set_opt func_return def_rest%type  <str>    func_args_list func_args opt_with ProcedureStmt def_arg%type  <str>    def_elem def_list definition def_name def_type DefineStmt%type  <str>    opt_instead event event_object RuleActionList,%type  <str>	RuleActionBlock RuleActionMulti join_list%type  <str>    RuleStmt opt_column opt_name oper_argtypes%type  <str>    MathOp RemoveFuncStmt aggr_argtype for_update_clause%type  <str>    RemoveAggrStmt remove_type RemoveStmt ExtendStmt%type  <str>    RemoveOperStmt RenameStmt all_Op user_valid_clause%type  <str>    VariableSetStmt var_value zone_value VariableShowStmt%type  <str>    VariableResetStmt AddAttrStmt alter_clause DropUserStmt%type  <str>    user_passwd_clause user_createdb_clause opt_trans%type  <str>    user_createuser_clause user_group_list user_group_clause%type  <str>    CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList%type  <str>    OptSeqElem TriggerForSpec TriggerForOpt TriggerForType%type  <str>	DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt%type  <str>    TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted%type  <str>    CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg%type  <str>    ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location%type  <str>    DestroydbStmt ClusterStmt grantee RevokeStmt encoding%type  <str>	GrantStmt privileges operation_commalist operation%type  <str>	opt_cursor opt_lmode%type  <str>	case_expr when_clause_list case_default case_arg when_clause%type  <str>    select_clause opt_select_limit select_limit_value%type  <str>    select_offset_value table_list using_expr join_expr%type  <str>	using_list from_expr table_expr join_clause join_type%type  <str>	join_qual update_list join_clause join_clause_with_union%type  <str>	opt_level opt_lock lock_type%type  <str>	ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using%type  <str>	indicator ECPGExecute ecpg_expr dotext ECPGPrepare%type  <str>    storage_clause opt_initializer vartext c_anything blockstart%type  <str>    blockend variable_list variable var_anything do_anything%type  <str>	opt_pointer cvariable ECPGDisconnect dis_name%type  <str>	stmt symbol opt_symbol ECPGRelease execstring server_name%type  <str>	connection_object opt_server opt_port c_thing opt_reference%type  <str>    user_name opt_user char_variable ora_user ident%type  <str>    db_prefix server opt_options opt_connection_name%type  <str>	ECPGSetConnection c_line cpp_line s_enum ECPGTypedef%type  <str>	enum_type civariableonly ECPGCursorStmt ECPGDeallocate%type  <str>	ECPGFree ECPGDeclare ECPGVar sql_variable_declarations%type  <str>	sql_declaration sql_variable_list sql_variable opt_at%type  <str>    struct_type s_struct declaration variable_declarations%type  <str>    s_struct s_union union_type ECPGSetAutocommit on_off%type  <type_enum> simple_type varchar_type%type  <type>	type ctype%type  <action> action%type  <index>	opt_array_bounds nest_array_bounds opt_type_array_bounds%type  <index>  nest_type_array_bounds%type  <ival>	Iresult%%prog: statements;statements: /* empty */	| statements statementstatement: ecpgstart opt_at stmt ';'	{ connection = NULL; }	| ecpgstart stmt ';'	| ECPGDeclaration	| c_thing 			{ fprintf(yyout, "%s", $1); free($1); }	| cpp_line			{ fprintf(yyout, "%s", $1); free($1); }	| blockstart			{ fputs($1, yyout); free($1); }	| blockend			{ fputs($1, yyout); free($1); }opt_at:	SQL_AT connection_target	{ connection = $2; }stmt:  AddAttrStmt			{ output_statement($1, 0); }		| AlterUserStmt		{ output_statement($1, 0); }		| ClosePortalStmt	{ output_statement($1, 0); }		| CopyStmt		{ output_statement($1, 0); }		| CreateStmt		{ output_statement($1, 0); }		| CreateAsStmt		{ output_statement($1, 0); }		| CreateSeqStmt		{ output_statement($1, 0); }		| CreatePLangStmt	{ output_statement($1, 0); }		| CreateTrigStmt	{ output_statement($1, 0); }		| CreateUserStmt	{ output_statement($1, 0); }  		| ClusterStmt		{ output_statement($1, 0); }		| DefineStmt 		{ output_statement($1, 0); }		| DestroyStmt		{ output_statement($1, 0); }		| DropPLangStmt		{ output_statement($1, 0); }		| DropTrigStmt		{ output_statement($1, 0); }		| DropUserStmt		{ output_statement($1, 0); }		| ExtendStmt 		{ output_statement($1, 0); }		| ExplainStmt		{ output_statement($1, 0); }		| FetchStmt		{ output_statement($1, 1); }		| GrantStmt		{ output_statement($1, 0); }		| IndexStmt		{ output_statement($1, 0); }		| ListenStmt		{ output_statement($1, 0); }		| UnlistenStmt		{ output_statement($1, 0); }		| LockStmt		{ output_statement($1, 0); }		| ProcedureStmt		{ output_statement($1, 0); }		| RemoveAggrStmt	{ output_statement($1, 0); }		| RemoveOperStmt	{ output_statement($1, 0); }		| RemoveFuncStmt	{ output_statement($1, 0); }		| RemoveStmt		{ output_statement($1, 0); }		| RenameStmt		{ output_statement($1, 0); }		| RevokeStmt		{ output_statement($1, 0); }                | OptimizableStmt	{						if (strncmp($1, "/* " , sizeof("/* ")-1) == 0)							output_simple_statement($1);						else							output_statement($1, 1);					}		| RuleStmt		{ output_statement($1, 0); }		| TransactionStmt	{						fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);						whenever_action(2);						free($1);					}		| ViewStmt		{ output_statement($1, 0); }		| LoadStmt		{ output_statement($1, 0); }		| CreatedbStmt		{ output_statement($1, 0); }		| DestroydbStmt		{ output_statement($1, 0); }		| VacuumStmt		{ output_statement($1, 0); }		| VariableSetStmt	{ output_statement($1, 0); }		| VariableShowStmt	{ output_statement($1, 0); }		| VariableResetStmt	{ output_statement($1, 0); }		| ECPGConnect		{						if (connection)							yyerror("no at option for connect statement.\n");						fprintf(yyout, "{ ECPGconnect(__LINE__, %s, %d);", $1, autocommit);						whenever_action(2);						free($1);					} 		| ECPGCursorStmt	{						output_simple_statement($1);					}		| ECPGDeallocate	{						if (connection)							yyerror("no at option for connect statement.\n");						fputc('{', yyout);						fputs($1, yyout);						whenever_action(2);						free($1);

⌨️ 快捷键说明

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