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

📄 parse.y

📁 firebird源代码
💻 Y
📖 第 1 页 / 共 5 页
字号:
		| varying_keyword '(' pos_short_integer ')'			{ 			field->fld_dtype = dtype_varying; 			field->fld_character_length = (SLONG) $3; 			}		;varying_keyword 	   : VARCHAR			   | CHARACTER VARYING			   | KW_CHAR VARYING			   ;character_keyword 	   : CHARACTER			   | KW_CHAR			   ;national_character_keyword : NCHAR			   | NATIONAL CHARACTER		           | NATIONAL KW_CHAR		           ;/* numeric type */numeric_type	: KW_NUMERIC prec_scale                        { 			  field->fld_sub_type = dsc_num_type_numeric;			}		| decimal_keyword prec_scale			{  			   field->fld_sub_type = dsc_num_type_decimal;			   if (field->fld_dtype == dtype_short)				{				field->fld_dtype = dtype_long;				field->fld_length = sizeof (SLONG);				}			}		;ordinal		: pos_short_integer			{ $$ = make_node (nod_position, 1, $1); }		;prec_scale	: 			{			field->fld_dtype = dtype_long; 		    	field->fld_length = sizeof (SLONG); 			field->fld_precision = 9;		    	}		| '(' signed_long_integer ')'			{         			if ( ((SLONG) $2 < 1) || ((SLONG) $2 > 18) )			    yyabandon (-842, isc_precision_err);				/* Precision most be between 1 and 18. */ 			if ((SLONG) $2 > 9)			    {			    if ( ( (client_dialect <= SQL_DIALECT_V5) &&				   (db_dialect     >  SQL_DIALECT_V5) ) ||				 ( (client_dialect >  SQL_DIALECT_V5) &&				   (db_dialect     <= SQL_DIALECT_V5) ) )			        ERRD_post (gds__sqlerr,					   gds_arg_number, (SLONG) -817,					   gds_arg_gds,					   isc_ddl_not_allowed_by_db_sql_dial,					   gds_arg_number, (SLONG) db_dialect,					   0);			    if (client_dialect <= SQL_DIALECT_V5)			        {				field->fld_dtype = dtype_double;				field->fld_length = sizeof (double);			        }			    else			        {				if (client_dialect == SQL_DIALECT_V6_TRANSITION)				    {				    ERRD_post_warning (					isc_dsql_warn_precision_ambiguous,					gds_arg_end );				    ERRD_post_warning (					isc_dsql_warn_precision_ambiguous1,					gds_arg_end );				    ERRD_post_warning (					isc_dsql_warn_precision_ambiguous2,					gds_arg_end );				    }				field->fld_dtype = dtype_int64;				field->fld_length = sizeof (SINT64);			        }			    }			else 			    if ((SLONG) $2 < 5)			    	{			    	field->fld_dtype = dtype_short; 			    	field->fld_length = sizeof (SSHORT); 			    	}			    else			    	{			    	field->fld_dtype = dtype_long; 			    	field->fld_length = sizeof (SLONG); 			    	}			field->fld_precision = (SLONG) $2;			}		| '(' signed_long_integer ',' signed_long_integer ')'			{ 			if ( ((SLONG) $2 < 1) || ((SLONG) $2 > 18) )			    yyabandon (-842, isc_precision_err);				/* Precision should be between 1 and 18 */ 			if (((SLONG) $4 > (SLONG) $2) || ((SLONG) $4 < 0))			    yyabandon (-842, isc_scale_nogt);				/* Scale must be between 0 and precision */			if ((SLONG) $2 > 9)			    {			    if ( ( (client_dialect <= SQL_DIALECT_V5) &&				   (db_dialect     >  SQL_DIALECT_V5) ) ||				 ( (client_dialect >  SQL_DIALECT_V5) &&				   (db_dialect     <= SQL_DIALECT_V5) ) )			        ERRD_post (gds__sqlerr,					   gds_arg_number, (SLONG) -817,					   gds_arg_gds,					   isc_ddl_not_allowed_by_db_sql_dial,					   gds_arg_number, (SLONG) db_dialect,					   0);			    if (client_dialect <= SQL_DIALECT_V5)			        {				field->fld_dtype = dtype_double;				field->fld_length = sizeof (double); 			        }			    else			        {				if (client_dialect == SQL_DIALECT_V6_TRANSITION)				  {				    ERRD_post_warning (					isc_dsql_warn_precision_ambiguous,					gds_arg_end );				    ERRD_post_warning (					isc_dsql_warn_precision_ambiguous1,					gds_arg_end );				    ERRD_post_warning (					isc_dsql_warn_precision_ambiguous2,					gds_arg_end );				  }				  /* client_dialect >= SQL_DIALECT_V6 */				field->fld_dtype = dtype_int64;				field->fld_length = sizeof (SINT64);			        }			    }			else			    {			    if ((SLONG) $2 < 5)			    	{			    	field->fld_dtype = dtype_short; 			    	field->fld_length = sizeof (SSHORT); 			    	}			    else			    	{			    	field->fld_dtype = dtype_long; 			    	field->fld_length = sizeof (SLONG); 			    	}			    }			field->fld_precision = (SLONG) $2;			field->fld_scale = - (SLONG) $4;			}		;decimal_keyword	: DECIMAL			| KW_DEC		;/* floating point type */float_type	: KW_FLOAT precision_opt			{ 			if ((SLONG) $2 > 7)			    {			    field->fld_dtype = dtype_double;			    field->fld_length = sizeof (double); 			    }			else			    {			    field->fld_dtype = dtype_real; 			    field->fld_length = sizeof (float);			    }			}		| KW_LONG KW_FLOAT precision_opt			{ 			field->fld_dtype = dtype_double; 			field->fld_length = sizeof (double); 			}		| REAL			{ 			field->fld_dtype = dtype_real; 			field->fld_length = sizeof (float); 			}		| KW_DOUBLE PRECISION			{ 			field->fld_dtype = dtype_double; 			field->fld_length = sizeof (double); 			}		;precision_opt	: '(' nonneg_short_integer ')'			{ $$ = $2; }		|			{ $$ = 0; }		;/* SET statements */set		: set_transaction		| set_generator		| set_statistics		;set_generator	: SET GENERATOR symbol_generator_name TO signed_long_integer			{ 			  $$ = make_node (nod_set_generator2,e_gen_id_count,$3,						MAKE_constant ((STR) $5, CONSTANT_SLONG));			}                | SET GENERATOR symbol_generator_name TO NUMBER64BIT                        {			  $$ = make_node (nod_set_generator2,e_gen_id_count,$3,				       MAKE_constant((STR)$5, CONSTANT_SINT64));			}                | SET GENERATOR symbol_generator_name TO '-' NUMBER64BIT                        {			  $$ = make_node (nod_set_generator2, e_gen_id_count, $3,					  make_node(nod_negate, 1,						    MAKE_constant((STR)$6, CONSTANT_SINT64)));			}		;/* transaction statements */commit		: COMMIT optional_work optional_retain			{ $$ = make_node (nod_commit, 1, $3); }		;rollback	: ROLLBACK optional_work			{ $$ = make_node (nod_rollback, 0, NULL); }		;optional_work	: WORK		|		;optional_retain	: RETAIN opt_snapshot			{ $$ = make_node (nod_commit_retain, 0, NULL); }		|		 	{ $$ = (NOD) NULL; }		;opt_snapshot	: SNAPSHOT		|		 	{ $$ = (NOD) NULL; }		;set_transaction	: SET TRANSACTION tran_opt_list_m			{$$ = make_node (nod_trans, 1, make_list ($3)); }		;tran_opt_list_m	: tran_opt_list			|		 	{ $$ = (NOD) NULL; }		;tran_opt_list	: tran_opt		| tran_opt_list tran_opt		    { $$ = make_node (nod_list, (int) 2, $1, $2); }		;tran_opt	: access_mode 		| lock_wait 		| isolation_mode 		| tbl_reserve_options 		;access_mode	: READ ONLY			{ $$ = make_flag_node (nod_access, NOD_READ_ONLY, (int) 0, NULL); }		| READ WRITE			{ $$ = make_flag_node (nod_access, NOD_READ_WRITE, (int) 0, NULL); }		;lock_wait	: WAIT			{ $$ = make_flag_node (nod_wait, NOD_WAIT, (int) 0, NULL); }		| NO WAIT			{ $$ = make_flag_node (nod_wait, NOD_NO_WAIT, (int) 0, NULL); }		;isolation_mode	: ISOLATION LEVEL iso_mode			{ $$ = $3;}		| iso_mode		;iso_mode	: snap_shot			{ $$ = $1;}		| READ UNCOMMITTED version_mode 			{ $$ = make_flag_node (nod_isolation, NOD_READ_COMMITTED, 1, $3); }		| READ COMMITTED version_mode 			{ $$ = make_flag_node (nod_isolation, NOD_READ_COMMITTED, 1, $3); }		;snap_shot	: SNAPSHOT			{ $$ = make_flag_node (nod_isolation, NOD_CONCURRENCY, 0, NULL); }		| SNAPSHOT TABLE 			{ $$ = make_flag_node (nod_isolation, NOD_CONSISTENCY, 0, NULL); }		| SNAPSHOT TABLE STABILITY			{ $$ = make_flag_node (nod_isolation, NOD_CONSISTENCY, 0, NULL); }		;version_mode	: VERSION			{ $$ = make_flag_node (nod_version, NOD_VERSION, 0, NULL); }		| NO VERSION			{ $$ = make_flag_node (nod_version, NOD_NO_VERSION, 0, NULL); }		|			{ $$ = 0; }		;tbl_reserve_options: RESERVING restr_list			{ $$ = make_node (nod_reserve, 1, make_list ($2)); }		;lock_type	: SHARED			{ $$ = (NOD) NOD_SHARED; }		| PROTECTED			{ $$ = (NOD) NOD_PROTECTED ; }		|			{ $$ = (NOD) 0; }		;lock_mode	: READ			{ $$ = (NOD) NOD_READ; }		| WRITE			{ $$ = (NOD) NOD_WRITE; }		;restr_list	: restr_option		| restr_list ',' restr_option		    { $$ = make_node (nod_list, (int) 2, $1, $3); }		;restr_option	: table_list table_lock			{ $$ = make_node (nod_table_lock, (int) 2, make_list ($1), $2); }		;table_lock	: FOR lock_type lock_mode			{ $$ = make_flag_node (nod_lock_mode, ((SSHORT) $2 | (SSHORT) $3), 0, NULL); }		|			{ $$ = 0; }		;table_list	: simple_table_name		| table_list ',' simple_table_name		    { $$ = make_node (nod_list, (int) 2, $1, $3); }		;set_statistics	: SET STATISTICS INDEX symbol_index_name			{$$ = make_node (nod_set_statistics, 				(int)e_stat_count, $4); }/* SELECT statement */select		: union_expr order_clause for_update_clause			{ $$ = make_node (nod_select, 3, $1, $2, $3); }		;union_expr	: select_expr			{ $$ = make_node (nod_list, 1, $1); }		| union_expr UNION select_expr			{ $$ = make_node (nod_list, 2, $1, $3); }                | union_expr UNION ALL select_expr                        { $$ = make_flag_node (nod_list, NOD_UNION_ALL, 2, $1, $4); }		;order_clause	: ORDER BY order_list			{ $$ = make_list ($3); }		|			{ $$ = 0; }		;order_list	: order_item		| order_list ',' order_item			{ $$ = make_node (nod_list, 2, $1, $3); }		;order_item	: column_name collate_clause order_direction			{ $$ = make_node (nod_order, e_order_count, $1, $3, $2); }		| ordinal collate_clause order_direction			{ $$ = make_node (nod_order, e_order_count, $1, $3, $2); }		;order_direction	: ASC			{ $$ = 0; }		| DESC			{ $$ = make_node (nod_flag, 0, NULL); }		|			{ $$ = 0; }		;for_update_clause : FOR UPDATE for_update_list			{ $$ = $3; }		|			{ $$ = 0; }		;for_update_list	: OF column_list			{ $$ = $2; }		|			{ $$ = make_node (nod_flag, 0, NULL); }		;/* SELECT expression */select_expr	: SELECT limit_clause			 distinct_clause			 select_list 			 from_clause 			 where_clause 			 group_clause 			 having_clause			 plan_clause			{ $$ = make_node (nod_select_expr, e_sel_count, 					$2, $3, $4, $5, $6, $7, $8, $9, NULL); }		;                                               distinct_clause	: DISTINCT			{ $$ = make_node (nod_flag, 0, NULL); }		| all_noise 			{ $$ = 0; }		;select_list	: select_items			{ $$ = make_list ($1); }		| '*'			{ $$ = 0; }		;select_items	: select_item		| select_items ',' select_item			{ $$ = make_node (nod_list, 2, $1, $3); }		;select_item	: rhs		| rhs symbol_item_alias_name			{ $$ = make_node (nod_alias, 2, $1, $2); }		| rhs AS symbol_item_alias_name			{ $$ = make_node (nod_alias, 2, $1, $3); }		;/* FROM clause */from_clause	: FROM from_list		 	{ $$ = make_list ($2); }/*		| FROM '(' select_expr ')'			/*{ $$ = make_list ($3); }*./			{ $$ = make_node (nod_list, 1, $3); }*/		;from_list	: table_reference		| from_list ',' table_reference			{ $$ = make_node (nod_list, 2, $1, $3); }		;table_reference	: joined_table		| table_proc		;joined_table	: table_reference join_type JOIN table_reference ON search_condition			{ $$ = make_node (nod_join, (int) e_join_count, $1, $2, $4, $6); }		| '(' joined_table ')'			{ $$ = $2; }		;table_proc	: symbol_procedure_name proc_table_inputs symbol_table_alias_name			{ $$ = make_node (nod_rel_proc_name, 					(int) e_rpn_count, $1, $3, $2); }		| symbol_procedure_name proc_table_inputs			{ $$ = make_node (nod_rel_proc_name, 					(int) e_rpn_count, $1, NULL, $2); }		;proc_table_inputs	: '(' null_or_value_list ')'				{ $$ = make_list ($2); }			|				{ $$ = NULL; }			;null_or_value_list : null_or_value		   | null_or_value_list ',' null_or_value			{ $$ = make_node (nod_list, 2, $1, $3); }		   ;null_or_value : null_value               | value              ;table_name	: simple_table_name		| symbol_table_name symbol_table_alias_name			{ $$ = make_node (nod_relation_name, 						(int) e_rln_count, $1, $2); }		;                         simple_table_name: symbol_table_name			{ $$ = make_node (nod_relation_name, 						(int) e_rln_count, $1, NULL); }		;join_type	: INNER			{ $$ = make_node (nod_join_inner, (int) 0, NULL); }		| LEFT			{ $$ = make_node (nod_join_left, (int) 0, NULL); }		| LEFT OUTER			{ $$ = make_node (nod_join_left, (int) 0, NULL); }		| RIGHT			{ $$ = make_node (nod_join_right, (int) 0, NULL); }		| RIGH

⌨️ 快捷键说明

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