00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00026 #pragma once
00027 #ifndef pars0pars_h
00028 #define pars0pars_h
00029
00030 #include "univ.i"
00031 #include "que0types.h"
00032 #include "usr0types.h"
00033 #include "pars0types.h"
00034 #include "row0types.h"
00035 #include "trx0types.h"
00036 #include "ut0vec.h"
00037
00042 typedef void* (*pars_user_func_cb_t)(void* arg, void* user_arg);
00043
00046 extern int yydebug;
00047
00048 #ifdef UNIV_SQL_DEBUG
00049
00051 extern ibool pars_print_lexed;
00052 #endif
00053
00054
00055
00056 extern sym_tab_t* pars_sym_tab_global;
00057
00058 extern pars_res_word_t pars_to_char_token;
00059 extern pars_res_word_t pars_to_number_token;
00060 extern pars_res_word_t pars_to_binary_token;
00061 extern pars_res_word_t pars_binary_to_number_token;
00062 extern pars_res_word_t pars_substr_token;
00063 extern pars_res_word_t pars_replstr_token;
00064 extern pars_res_word_t pars_concat_token;
00065 extern pars_res_word_t pars_length_token;
00066 extern pars_res_word_t pars_instr_token;
00067 extern pars_res_word_t pars_sysdate_token;
00068 extern pars_res_word_t pars_printf_token;
00069 extern pars_res_word_t pars_assert_token;
00070 extern pars_res_word_t pars_rnd_token;
00071 extern pars_res_word_t pars_rnd_str_token;
00072 extern pars_res_word_t pars_count_token;
00073 extern pars_res_word_t pars_sum_token;
00074 extern pars_res_word_t pars_distinct_token;
00075 extern pars_res_word_t pars_binary_token;
00076 extern pars_res_word_t pars_blob_token;
00077 extern pars_res_word_t pars_int_token;
00078 extern pars_res_word_t pars_char_token;
00079 extern pars_res_word_t pars_float_token;
00080 extern pars_res_word_t pars_update_token;
00081 extern pars_res_word_t pars_asc_token;
00082 extern pars_res_word_t pars_desc_token;
00083 extern pars_res_word_t pars_open_token;
00084 extern pars_res_word_t pars_close_token;
00085 extern pars_res_word_t pars_share_token;
00086 extern pars_res_word_t pars_unique_token;
00087 extern pars_res_word_t pars_clustered_token;
00088
00089 extern ulint pars_star_denoter;
00090
00091
00092 #define PARS_INPUT 0
00093 #define PARS_OUTPUT 1
00094 #define PARS_NOT_PARAM 2
00095
00096 int
00097 yyparse(void);
00098
00099
00102 UNIV_INTERN
00103 que_t*
00104 pars_sql(
00105
00106 pars_info_t* info,
00107 const char* str);
00108
00110 #ifdef __cplusplus
00111 extern "C"
00112 #endif
00113 UNIV_INTERN
00114 void
00115 pars_get_lex_chars(
00116
00117 char* buf,
00118 int* result,
00119 int max_size);
00121
00123 UNIV_INTERN
00124 void
00125 yyerror(
00126
00127 const char* s);
00128
00131 UNIV_INTERN
00132 sym_node_t*
00133 pars_variable_declaration(
00134
00135 sym_node_t* node,
00137 pars_res_word_t* type);
00138
00141 UNIV_INTERN
00142 func_node_t*
00143 pars_func(
00144
00145 que_node_t* res_word,
00146 que_node_t* arg);
00147
00150 UNIV_INTERN
00151 func_node_t*
00152 pars_op(
00153
00154 int func,
00155 que_node_t* arg1,
00156 que_node_t* arg2);
00158
00161 UNIV_INTERN
00162 order_node_t*
00163 pars_order_by(
00164
00165 sym_node_t* column,
00166 pars_res_word_t* asc);
00167
00171 UNIV_INTERN
00172 sel_node_t*
00173 pars_select_list(
00174
00175 que_node_t* select_list,
00176 sym_node_t* into_list);
00177
00180 UNIV_INTERN
00181 que_node_t*
00182 pars_cursor_declaration(
00183
00184 sym_node_t* sym_node,
00186 sel_node_t* select_node);
00187
00190 UNIV_INTERN
00191 que_node_t*
00192 pars_function_declaration(
00193
00194 sym_node_t* sym_node);
00196
00199 UNIV_INTERN
00200 sel_node_t*
00201 pars_select_statement(
00202
00203 sel_node_t* select_node,
00205 sym_node_t* table_list,
00206 que_node_t* search_cond,
00207 pars_res_word_t* for_update,
00208 pars_res_word_t* consistent_read,
00210 order_node_t* order_by);
00211
00214 UNIV_INTERN
00215 col_assign_node_t*
00216 pars_column_assignment(
00217
00218 sym_node_t* column,
00219 que_node_t* exp);
00220
00223 UNIV_INTERN
00224 upd_node_t*
00225 pars_update_statement_start(
00226
00227 ibool is_delete,
00228 sym_node_t* table_sym,
00229 col_assign_node_t* col_assign_list);
00231
00234 UNIV_INTERN
00235 upd_node_t*
00236 pars_update_statement(
00237
00238 upd_node_t* node,
00239 sym_node_t* cursor_sym,
00241 que_node_t* search_cond);
00242
00245 UNIV_INTERN
00246 ins_node_t*
00247 pars_insert_statement(
00248
00249 sym_node_t* table_sym,
00250 que_node_t* values_list,
00251 sel_node_t* select);
00252
00255 UNIV_INTERN
00256 sym_node_t*
00257 pars_parameter_declaration(
00258
00259 sym_node_t* node,
00261 ulint param_type,
00263 pars_res_word_t* type);
00264
00267 UNIV_INTERN
00268 elsif_node_t*
00269 pars_elsif_element(
00270
00271 que_node_t* cond,
00272 que_node_t* stat_list);
00273
00276 UNIV_INTERN
00277 if_node_t*
00278 pars_if_statement(
00279
00280 que_node_t* cond,
00281 que_node_t* stat_list,
00282 que_node_t* else_part);
00283
00286 UNIV_INTERN
00287 for_node_t*
00288 pars_for_statement(
00289
00290 sym_node_t* loop_var,
00291 que_node_t* loop_start_limit,
00292 que_node_t* loop_end_limit,
00293 que_node_t* stat_list);
00294
00297 UNIV_INTERN
00298 while_node_t*
00299 pars_while_statement(
00300
00301 que_node_t* cond,
00302 que_node_t* stat_list);
00303
00306 UNIV_INTERN
00307 exit_node_t*
00308 pars_exit_statement(void);
00309
00310
00313 UNIV_INTERN
00314 return_node_t*
00315 pars_return_statement(void);
00316
00317
00320 UNIV_INTERN
00321 func_node_t*
00322 pars_procedure_call(
00323
00324 que_node_t* res_word,
00325 que_node_t* args);
00326
00329 UNIV_INTERN
00330 assign_node_t*
00331 pars_assignment_statement(
00332
00333 sym_node_t* var,
00334 que_node_t* val);
00335
00339 UNIV_INTERN
00340 fetch_node_t*
00341 pars_fetch_statement(
00342
00343 sym_node_t* cursor,
00344 sym_node_t* into_list,
00345 sym_node_t* user_func);
00346
00349 UNIV_INTERN
00350 open_node_t*
00351 pars_open_statement(
00352
00353 ulint type,
00355 sym_node_t* cursor);
00356
00359 UNIV_INTERN
00360 row_printf_node_t*
00361 pars_row_printf_statement(
00362
00363 sel_node_t* sel_node);
00364
00367 UNIV_INTERN
00368 commit_node_t*
00369 pars_commit_statement(void);
00370
00371
00374 UNIV_INTERN
00375 roll_node_t*
00376 pars_rollback_statement(void);
00377
00378
00381 UNIV_INTERN
00382 sym_node_t*
00383 pars_column_def(
00384
00385 sym_node_t* sym_node,
00387 pars_res_word_t* type,
00388 sym_node_t* len,
00390 void* is_unsigned,
00392 void* is_not_null);
00394
00397 UNIV_INTERN
00398 tab_node_t*
00399 pars_create_table(
00400
00401 sym_node_t* table_sym,
00403 sym_node_t* column_defs,
00404 void* not_fit_in_memory);
00414
00417 UNIV_INTERN
00418 ind_node_t*
00419 pars_create_index(
00420
00421 pars_res_word_t* unique_def,
00422 pars_res_word_t* clustered_def,
00423 sym_node_t* index_sym,
00425 sym_node_t* table_sym,
00427 sym_node_t* column_list);
00428
00431 UNIV_INTERN
00432 que_fork_t*
00433 pars_procedure_definition(
00434
00435 sym_node_t* sym_node,
00437 sym_node_t* param_list,
00438 que_node_t* stat_list);
00440
00446 UNIV_INTERN
00447 que_fork_t*
00448 pars_stored_procedure_call(
00449
00450 sym_node_t* sym_node);
00451
00456 UNIV_INTERN
00457 que_thr_t*
00458 pars_complete_graph_for_exec(
00459
00460 que_node_t* node,
00462 trx_t* trx,
00463 mem_heap_t* heap);
00465
00468 UNIV_INTERN
00469 pars_info_t*
00470 pars_info_create(void);
00471
00472
00473
00475 UNIV_INTERN
00476 void
00477 pars_info_free(
00478
00479 pars_info_t* info);
00481
00483 UNIV_INTERN
00484 void
00485 pars_info_add_literal(
00486
00487 pars_info_t* info,
00488 const char* name,
00489 const void* address,
00490 ulint length,
00491 ulint type,
00492 ulint prtype);
00495
00498 UNIV_INTERN
00499 void
00500 pars_info_add_str_literal(
00501
00502 pars_info_t* info,
00503 const char* name,
00504 const char* str);
00506
00515 UNIV_INTERN
00516 void
00517 pars_info_add_int4_literal(
00518
00519 pars_info_t* info,
00520 const char* name,
00521 lint val);
00523
00532 UNIV_INTERN
00533 void
00534 pars_info_add_ull_literal(
00535
00536 pars_info_t* info,
00537 const char* name,
00538 ib_uint64_t val);
00539
00541 UNIV_INTERN
00542 void
00543 pars_info_add_function(
00544
00545 pars_info_t* info,
00546 const char* name,
00547 pars_user_func_cb_t func,
00548 void* arg);
00550
00552 UNIV_INTERN
00553 void
00554 pars_info_add_id(
00555
00556 pars_info_t* info,
00557 const char* name,
00558 const char* id);
00560
00563 UNIV_INTERN
00564 pars_user_func_t*
00565 pars_info_get_user_func(
00566
00567 pars_info_t* info,
00568 const char* name);
00570
00573 UNIV_INTERN
00574 pars_bound_lit_t*
00575 pars_info_get_bound_lit(
00576
00577 pars_info_t* info,
00578 const char* name);
00580
00583 UNIV_INTERN
00584 pars_bound_id_t*
00585 pars_info_get_bound_id(
00586
00587 pars_info_t* info,
00588 const char* name);
00590
00592 #ifdef __cplusplus
00593 extern "C"
00594 #endif
00595 UNIV_INTERN
00596 void
00597 pars_lexer_close(void);
00598
00599
00601 struct pars_info_struct {
00602 mem_heap_t* heap;
00604 ib_vector_t* funcs;
00606 ib_vector_t* bound_lits;
00608 ib_vector_t* bound_ids;
00611 ibool graph_owns_us;
00613 };
00614
00616 struct pars_user_func_struct {
00617 const char* name;
00618 pars_user_func_cb_t func;
00619 void* arg;
00620 };
00621
00623 struct pars_bound_lit_struct {
00624 const char* name;
00625 const void* address;
00626 ulint length;
00627 ulint type;
00628 ulint prtype;
00629 };
00630
00632 struct pars_bound_id_struct {
00633 const char* name;
00634 const char* id;
00635 };
00636
00638 struct pars_res_word_struct{
00639 int code;
00641 };
00642
00645 struct func_node_struct{
00646 que_common_t common;
00647 int func;
00648 ulint func_class;
00649 que_node_t* args;
00650 UT_LIST_NODE_T(func_node_t) cond_list;
00654 UT_LIST_NODE_T(func_node_t) func_node_list;
00657 };
00658
00660 struct order_node_struct{
00661 que_common_t common;
00662 sym_node_t* column;
00663 ibool asc;
00664 };
00665
00667 struct proc_node_struct{
00668 que_common_t common;
00669 sym_node_t* proc_id;
00671 sym_node_t* param_list;
00672 que_node_t* stat_list;
00673 sym_tab_t* sym_tab;
00674 };
00675
00677 struct elsif_node_struct{
00678 que_common_t common;
00679 que_node_t* cond;
00680 que_node_t* stat_list;
00681 };
00682
00684 struct if_node_struct{
00685 que_common_t common;
00686 que_node_t* cond;
00687 que_node_t* stat_list;
00688 que_node_t* else_part;
00689 elsif_node_t* elsif_list;
00690 };
00691
00693 struct while_node_struct{
00694 que_common_t common;
00695 que_node_t* cond;
00696 que_node_t* stat_list;
00697 };
00698
00700 struct for_node_struct{
00701 que_common_t common;
00702 sym_node_t* loop_var;
00707 que_node_t* loop_start_limit;
00708 que_node_t* loop_end_limit;
00709 lint loop_end_value;
00713 que_node_t* stat_list;
00714 };
00715
00717 struct exit_node_struct{
00718 que_common_t common;
00719 };
00720
00722 struct return_node_struct{
00723 que_common_t common;
00724 };
00725
00727 struct assign_node_struct{
00728 que_common_t common;
00729 sym_node_t* var;
00730 que_node_t* val;
00731 };
00732
00734 struct col_assign_node_struct{
00735 que_common_t common;
00736 sym_node_t* col;
00737 que_node_t* val;
00738 };
00739
00741
00742 #define PARS_FUNC_ARITH 1
00743 #define PARS_FUNC_LOGICAL 2
00744 #define PARS_FUNC_CMP 3
00745 #define PARS_FUNC_PREDEFINED 4
00746 #define PARS_FUNC_AGGREGATE 5
00747 #define PARS_FUNC_OTHER 6
00749
00750
00751 #ifndef UNIV_NONINL
00752 #include "pars0pars.ic"
00753 #endif
00754
00755 #endif