📄 parse.y
字号:
$1, $2, $4, $6); } | '(' joined_view_table ')' { $$ = $2; } ;/* these rules will capture the input string for storage in metadata */begin_string : { beginning = lex_position(); } ;end_string : { $$ = (NOD) MAKE_string ((UCHAR *) beginning, (lex_position() == end) ? lex_position()-beginning : last_token-beginning);} ;begin_trigger : { beginning = last_token; } ;end_trigger : { $$ = (NOD) MAKE_string ((UCHAR *) beginning, lex_position()-beginning); } ;check_opt : WITH CHECK OPTION { $$ = make_node (nod_def_constraint, (int) e_cnstr_count, MAKE_string (NULL_STRING, 0), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); } | { $$ = 0; } ;/* CREATE TRIGGER */def_trigger_clause : symbol_trigger_name FOR simple_table_name trigger_active trigger_type trigger_position begin_trigger trigger_action end_trigger { $$ = make_node (nod_def_trigger, (int) e_trg_count, $1, $3, $4, $5, $6, $8, $9, NULL); } ;trigger_active : ACTIVE { $$ = MAKE_constant ((STR) 0, CONSTANT_SLONG); } | INACTIVE { $$ = MAKE_constant ((STR) 1, CONSTANT_SLONG); } | { $$ = NULL; } ;trigger_type : BEFORE INSERT { $$ = MAKE_constant ((STR) 1, CONSTANT_SLONG); } | AFTER INSERT { $$ = MAKE_constant ((STR) 2, CONSTANT_SLONG); } | BEFORE UPDATE { $$ = MAKE_constant ((STR) 3, CONSTANT_SLONG); } | AFTER UPDATE { $$ = MAKE_constant ((STR) 4, CONSTANT_SLONG); } | BEFORE DELETE { $$ = MAKE_constant ((STR) 5, CONSTANT_SLONG); } | AFTER DELETE { $$ = MAKE_constant ((STR) 6, CONSTANT_SLONG); } ;trigger_position : POSITION nonneg_short_integer { $$ = MAKE_constant ((STR) $2, CONSTANT_SLONG); } | { $$ = NULL; } ;trigger_action : AS begin_trigger var_declaration_list full_proc_block { $$ = make_node (nod_list, 2, $3, $4); } ;/* ALTER statement */alter : ALTER alter_clause { $$ = $2; } ; alter_clause : EXCEPTION symbol_exception_name sql_string { $$ = make_node (nod_mod_exception, (int) e_xcp_count, $2, $3); } | TABLE simple_table_name alter_ops { $$ = make_node (nod_mod_relation, (int) e_alt_count, $2, make_list ($3)); } | TRIGGER alter_trigger_clause { $$ = $2; } | PROCEDURE alter_procedure_clause { $$ = $2; } | DATABASE init_alter_db alter_db { $$ = make_node (nod_mod_database, (int) e_adb_count, make_list ($3)); } | DOMAIN alter_column_name alter_domain_ops { $$ = make_node (nod_mod_domain, (int) e_alt_count, $2, make_list ($3)); } | INDEX alter_index_clause { $$ = make_node (nod_mod_index, (int) e_mod_idx_count, $2); } ;domain_default_opt2 : DEFAULT begin_trigger default_value { $$ = $3; }domain_check_constraint2 : CHECK begin_trigger '(' search_condition ')' end_trigger { $$ = make_node (nod_def_constraint, (int) e_cnstr_count, MAKE_string (NULL_STRING, 0), NULL, NULL, NULL, $4, NULL, $6, NULL, NULL); } ;alter_domain_ops : alter_domain_op | alter_domain_ops alter_domain_op { $$ = make_node (nod_list, 2, $1, $2); } ;alter_domain_op : SET begin_trigger domain_default_opt2 end_trigger { $$ = make_node (nod_def_default, (int) e_dft_count, $3, $4); } /* SET begin_string default_opt end_trigger { $$ = make_node (nod_def_default, (int) e_dft_count, $3, $4); } | begin_trigger default_opt end_trigger { $$ = make_node (nod_def_default, (int) e_dft_count, $2, $3); } */ | ADD CONSTRAINT domain_check_constraint2 { $$ = $3; } /* | ADD CONSTRAINT domain_check_constraint { $$ = $3; } */ | ADD domain_check_constraint { $$ = $2; } | DROP DEFAULT {$$ = make_node (nod_del_default, (int) 0, NULL); } | DROP CONSTRAINT { $$ = make_node (nod_delete_rel_constraint, (int) 1, NULL); } | TO simple_column_name { $$ = $2; } | TYPE init_data_type non_array_type { $$ = make_node (nod_mod_domain_type, 2, $2); } ;alter_ops : alter_op | alter_ops ',' alter_op { $$ = make_node (nod_list, 2, $1, $3); } ;alter_op : DROP simple_column_name drop_behaviour { $$ = make_node (nod_del_field, 2, $2, $3); } | DROP CONSTRAINT symbol_constraint_name { $$ = make_node (nod_delete_rel_constraint, (int) 1, $3);} | ADD column_def { $$ = $2; } | ADD table_constraint_definition { $$ = $2; }/* CVC: From SQL, field positions start at 1, not zero. Think in ORDER BY, for example. | col_opt simple_column_name POSITION nonneg_short_integer { $$ = make_node (nod_mod_field_pos, 2, $2, MAKE_constant ((STR) $4, CONSTANT_SLONG)); } */ | col_opt simple_column_name POSITION pos_short_integer { $$ = make_node (nod_mod_field_pos, 2, $2, MAKE_constant ((STR) $4, CONSTANT_SLONG)); } | col_opt alter_column_name TO simple_column_name { $$ = make_node (nod_mod_field_name, 2, $2, $4); } | col_opt alter_col_name TYPE alter_data_type_or_domain end_trigger { $$ = make_node (nod_mod_field_type, 3, $2, $5, $4); } ;alter_column_name : keyword_or_column { $$ = make_node (nod_field_name, (int) e_fln_count, NULL, $1); } ; keyword_or_column : COLUMN | TYPE | EXTRACT | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | WEEKDAY | YEARDAY | TIME | TIMESTAMP | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER /* CVC: Added the following except SYMBOL. */ | CURRENT_ROLE | SYMBOL | KW_BREAK | SUBSTRING | KW_DESCRIPTOR ;col_opt : ALTER { $$ = NULL; } | ALTER COLUMN { $$ = NULL; } ;alter_data_type_or_domain : non_array_type begin_trigger { $$ = NULL; } | simple_column_name begin_string { $$ = make_node (nod_def_domain, (int) e_dom_count, $1, NULL, NULL, NULL, NULL); }alter_col_name : simple_column_name { field_name = $1; field = make_field ($1); $$ = (NOD) field; }drop_behaviour : RESTRICT { $$ = make_node (nod_restrict, 0, NULL); } | CASCADE { $$ = make_node (nod_cascade, 0, NULL); } | { $$ = make_node (nod_restrict, 0, NULL); } ;alter_index_clause : symbol_index_name ACTIVE { $$ = make_node (nod_idx_active, 1, $1); } | symbol_index_name INACTIVE { $$ = make_node (nod_idx_inactive, 1, $1); } ;/* ALTER DATABASE */init_alter_db : { log_defined = FALSE; cache_defined = FALSE; $$ = (NOD) NULL; } ;alter_db : db_alter_clause | alter_db db_alter_clause { $$ = make_node (nod_list, (int) 2, $1, $2); } ;db_alter_clause : ADD db_file_list { $$ = $2; }/* | ADD db_cache { $$ = $2; } | DROP CACHE { $$ = make_node (nod_drop_cache, (int) 0, NULL); }*/ | DROP LOGFILE { $$ = make_node (nod_drop_log, (int) 0, NULL); } | SET db_log_option_list { $$ = $2; } | ADD db_log { $$ = $2; } ;db_log_option_list : db_log_option | db_log_option_list ',' db_log_option { $$ = make_node (nod_list, (int) 2, $1, $3); } ;/* ALTER TRIGGER */alter_trigger_clause : symbol_trigger_name trigger_active new_trigger_type trigger_position begin_trigger new_trigger_action end_trigger { $$ = make_node (nod_mod_trigger, (int) e_trg_count, $1, NULL, $2, $3, $4, $6, $7, NULL); } ;new_trigger_type : trigger_type | { $$ = NULL; } ;new_trigger_action : trigger_action | { $$ = NULL; } ;/* DROP metadata operations */ drop : DROP drop_clause { $$ = $2; } ; drop_clause : EXCEPTION symbol_exception_name { $$ = make_node (nod_del_exception, 1, $2); } | INDEX symbol_index_name { $$ = make_node (nod_del_index, (int) 1, $2); } | PROCEDURE symbol_procedure_name { $$ = make_node (nod_del_procedure, (int) 1, $2); } | TABLE symbol_table_name { $$ = make_node (nod_del_relation, (int) 1, $2); } | TRIGGER symbol_trigger_name { $$ = make_node (nod_del_trigger, (int) 1, $2); } | VIEW symbol_view_name { $$ = make_node (nod_del_view, (int) 1, $2); } | FILTER symbol_filter_name { $$ = make_node (nod_del_filter, (int) 1, $2); } | DOMAIN symbol_domain_name { $$ = make_node (nod_del_domain, (int) 1, $2); } | EXTERNAL FUNCTION symbol_UDF_name { $$ = make_node (nod_del_udf, (int) 1, $3); } | SHADOW pos_short_integer { $$ = make_node (nod_del_shadow, (int) 1, $2); } | ROLE symbol_role_name { $$ = make_node (nod_del_role, (int) 1, $2); } | GENERATOR symbol_generator_name { $$ = make_node (nod_del_generator, (int) 1, $2); } ;/* these are the allowable datatypes */data_type : non_array_type | array_type ;non_array_type : simple_type | blob_type ;array_type : non_charset_simple_type '[' array_spec ']' { field->fld_ranges = make_list ($3); field->fld_dimensions = field->fld_ranges->nod_count / 2; field->fld_element_dtype = field->fld_dtype; $$ = $1; } | character_type '[' array_spec ']' charset_clause { field->fld_ranges = make_list ($3); field->fld_dimensions = field->fld_ranges->nod_count / 2; field->fld_element_dtype = field->fld_dtype; $$ = $1; } ;array_spec : array_range | array_spec ',' array_range { $$ = make_node (nod_list, (int) 2, $1, $3); } ;array_range : signed_long_integer { if ((SLONG) $1 < 1) $$ = make_node (nod_list, (int) 2, MAKE_constant ((STR) $1, CONSTANT_SLONG), MAKE_constant ((STR) 1, CONSTANT_SLONG)); else $$ = make_node (nod_list, (int) 2, MAKE_constant ((STR) 1, CONSTANT_SLONG), MAKE_constant ((STR) $1, CONSTANT_SLONG) ); } | signed_long_integer ':' signed_long_integer { $$ = make_node (nod_list, (int) 2, MAKE_constant ((STR) $1, CONSTANT_SLONG), MAKE_constant ((STR) $3, CONSTANT_SLONG)); } ;simple_type : non_charset_simple_type | character_type charset_clause ;non_charset_simple_type : national_character_type | numeric_type | float_type | integer_keyword { field->fld_dtype = dtype_long; field->fld_length = sizeof (SLONG); } | SMALLINT { field->fld_dtype = dtype_short; field->fld_length = sizeof (SSHORT); } | DATE { *stmt_ambiguous = TRUE; if (client_dialect <= SQL_DIALECT_V5) { /* Post warning saying that DATE is equivalent to TIMESTAMP */ ERRD_post_warning (isc_sqlwarn, gds_arg_number, (SLONG) 301, isc_arg_warning, isc_dtype_renamed, 0); field->fld_dtype = dtype_timestamp; field->fld_length = sizeof (GDS_TIMESTAMP); } else if (client_dialect == SQL_DIALECT_V6_TRANSITION) yyabandon (-104, isc_transitional_date); else { field->fld_dtype = dtype_sql_date; field->fld_length = sizeof (ULONG); } } | TIME { if (client_dialect < SQL_DIALECT_V6_TRANSITION) ERRD_post (gds__sqlerr, gds_arg_number, (SLONG) -104, gds_arg_gds, isc_sql_dialect_datatype_unsupport, gds_arg_number, client_dialect, gds_arg_string, "TIME", 0); if (db_dialect < SQL_DIALECT_V6_TRANSITION) ERRD_post (gds__sqlerr, gds_arg_number, (SLONG) -104, gds_arg_gds, isc_sql_db_dialect_dtype_unsupport, gds_arg_number, db_dialect, gds_arg_string, "TIME", 0); field->fld_dtype = dtype_sql_time; field->fld_length = sizeof (SLONG); } | TIMESTAMP { field->fld_dtype = dtype_timestamp; field->fld_length = sizeof (GDS_TIMESTAMP); } ;integer_keyword : INTEGER | KW_INT ;/* allow a blob to be specified with any combination of segment length and subtype */blob_type : BLOB blob_subtype blob_segsize charset_clause { field->fld_dtype = dtype_blob; } | BLOB '(' unsigned_short_integer ')' { field->fld_dtype = dtype_blob; field->fld_seg_length = (SLONG) $3; field->fld_sub_type = 0; } | BLOB '(' unsigned_short_integer ',' signed_short_integer ')' { field->fld_dtype = dtype_blob; field->fld_seg_length = (SLONG) $3; field->fld_sub_type = (SLONG) $5; } | BLOB '(' ',' signed_short_integer ')' { field->fld_dtype = dtype_blob; field->fld_seg_length = 80; field->fld_sub_type = (SLONG) $4; } ;blob_segsize : SEGMENT SIZE unsigned_short_integer { field->fld_seg_length = (SLONG) $3; } | { field->fld_seg_length = (SLONG) 80; } ;blob_subtype : SUB_TYPE signed_short_integer { field->fld_sub_type = (SLONG) $2; } | SUB_TYPE symbol_blob_subtype_name { field->fld_sub_type_name = $2; } | { field->fld_sub_type = (SLONG) 0; } ;charset_clause : CHARACTER SET symbol_character_set_name { field->fld_character_set = $3; } | ;/* character type */national_character_type : national_character_keyword '(' pos_short_integer ')' { field->fld_dtype = dtype_text; field->fld_character_length = (SLONG) $3; field->fld_flags |= FLD_national; } | national_character_keyword { field->fld_dtype = dtype_text; field->fld_character_length = 1; field->fld_flags |= FLD_national; } | national_character_keyword VARYING '(' pos_short_integer ')' { field->fld_dtype = dtype_varying; field->fld_character_length = (SLONG) $4; field->fld_flags |= FLD_national; } ;character_type : character_keyword '(' pos_short_integer ')' { field->fld_dtype = dtype_text; field->fld_character_length = (SLONG) $3; } | character_keyword { field->fld_dtype = dtype_text; field->fld_character_length = 1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -