32 #include "pars0pars.ic"
44 # include "pars0grm.hh"
57 UNIV_INTERN ibool pars_print_lexed = FALSE;
62 UNIV_INTERN
sym_tab_t* pars_sym_tab_global;
68 UNIV_INTERN
pars_res_word_t pars_to_number_token = {PARS_TO_NUMBER_TOKEN};
69 UNIV_INTERN
pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN};
70 UNIV_INTERN
pars_res_word_t pars_binary_to_number_token = {PARS_BINARY_TO_NUMBER_TOKEN};
83 UNIV_INTERN
pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN};
96 UNIV_INTERN
pars_res_word_t pars_clustered_token = {PARS_CLUSTERED_TOKEN};
112 case '+':
case '-':
case '*':
case '/':
115 case '=':
case '<':
case '>':
116 case PARS_GE_TOKEN:
case PARS_LE_TOKEN:
case PARS_NE_TOKEN:
119 case PARS_AND_TOKEN:
case PARS_OR_TOKEN:
case PARS_NOT_TOKEN:
122 case PARS_COUNT_TOKEN:
case PARS_SUM_TOKEN:
125 case PARS_TO_CHAR_TOKEN:
126 case PARS_TO_NUMBER_TOKEN:
127 case PARS_TO_BINARY_TOKEN:
128 case PARS_BINARY_TO_NUMBER_TOKEN:
129 case PARS_SUBSTR_TOKEN:
130 case PARS_CONCAT_TOKEN:
131 case PARS_LENGTH_TOKEN:
132 case PARS_INSTR_TOKEN:
133 case PARS_SYSDATE_TOKEN:
134 case PARS_NOTFOUND_TOKEN:
135 case PARS_PRINTF_TOKEN:
136 case PARS_ASSERT_TOKEN:
138 case PARS_RND_STR_TOKEN:
139 case PARS_REPLSTR_TOKEN:
163 node->
common.val_buf_size = 0;
183 que_node_t* res_word,
207 return(pars_func_low(func, arg1));
228 if (asc == &pars_asc_token) {
231 ut_a(asc == &pars_desc_token);
249 case DATA_VARCHAR:
case DATA_CHAR:
250 case DATA_FIXBINARY:
case DATA_BINARY:
262 pars_resolve_func_data_type(
272 switch (node->
func) {
274 case '+':
case '-':
case '*':
case '/':
285 case PARS_COUNT_TOKEN:
290 case PARS_TO_CHAR_TOKEN:
291 case PARS_RND_STR_TOKEN:
297 case PARS_TO_BINARY_TOKEN:
307 case PARS_TO_NUMBER_TOKEN:
308 case PARS_BINARY_TO_NUMBER_TOKEN:
309 case PARS_LENGTH_TOKEN:
310 case PARS_INSTR_TOKEN:
315 case PARS_SYSDATE_TOKEN:
320 case PARS_SUBSTR_TOKEN:
321 case PARS_CONCAT_TOKEN:
327 case '>':
case '<':
case '=':
334 case PARS_NOTFOUND_TOKEN:
355 pars_resolve_exp_variables_and_types(
361 que_node_t* exp_node)
373 arg = func_node->
args;
376 pars_resolve_exp_variables_and_types(select_node, arg);
381 pars_resolve_func_data_type(func_node);
388 sym_node =
static_cast<sym_node_t *
>(exp_node);
420 fprintf(stderr,
"PARSER ERROR: Unresolved identifier %s\n",
428 sym_node->
alias = node;
446 pars_resolve_exp_list_variables_and_types(
449 que_node_t* exp_node)
453 pars_resolve_exp_variables_and_types(select_node, exp_node);
463 pars_resolve_exp_columns(
466 que_node_t* exp_node)
481 arg = func_node->
args;
484 pars_resolve_exp_columns(table_node, arg);
494 sym_node =
static_cast<sym_node_t *
>(exp_node);
507 table = t_node->
table;
511 for (i = 0; i < n_cols; i++) {
513 = dict_table_get_nth_col(table, i);
523 sym_node->
table = table;
529 dfield_get_type(&sym_node
544 pars_resolve_exp_list_columns(
547 que_node_t* exp_node)
551 pars_resolve_exp_columns(table_node, exp_node);
561 pars_retrieve_table_def(
565 const char* table_name;
573 table_name = (
const char*) sym_node->
name;
585 pars_retrieve_table_list_defs(
591 if (sym_node == NULL) {
597 pars_retrieve_table_def(sym_node);
611 pars_select_all_columns(
626 table = table_node->
table;
652 que_node_t* select_list,
662 pars_resolve_exp_list_variables_and_types(NULL, into_list);
672 pars_check_aggregate(
677 que_node_t* exp_node;
680 ulint n_aggregate_nodes = 0;
701 if (n_aggregate_nodes > 0) {
702 ut_a(n_nodes == n_aggregate_nodes);
720 que_node_t* search_cond,
728 select_node->
n_tables = pars_retrieve_table_list_defs(table_list);
733 pars_select_all_columns(select_node);
743 pars_resolve_exp_list_columns(table_list, select_node->
select_list);
744 pars_resolve_exp_list_variables_and_types(select_node,
746 pars_check_aggregate(select_node);
751 pars_resolve_exp_columns(table_list, search_cond);
752 pars_resolve_exp_variables_and_types(select_node, search_cond);
763 }
else if (lock_shared){
779 pars_resolve_exp_columns(table_list, order_by->
column);
850 node->is_delete = is_delete;
852 node->table_sym = table_sym;
853 node->col_assign_list = col_assign_list;
884 pars_process_assign_list(
894 ulint changes_ord_field;
895 ulint changes_field_size;
899 table_sym = node->table_sym;
901 clust_index = dict_table_get_first_index(node->
table);
903 assign_node = col_assign_list;
906 while (assign_node) {
907 pars_resolve_exp_columns(table_sym, assign_node->
col);
908 pars_resolve_exp_columns(table_sym, assign_node->
val);
909 pars_resolve_exp_variables_and_types(NULL, assign_node->
val);
916 assign_node->
val))));
931 assign_node = col_assign_list;
933 changes_field_size = UPD_NODE_NO_SIZE_CHANGE;
935 for (i = 0; i < n_assigns; i++) {
936 upd_field = upd_get_nth_field(node->
update, i);
938 col_sym = assign_node->
col;
941 clust_index, col_sym->
col_no),
943 upd_field->
exp = assign_node->
val;
949 changes_field_size = 0;
957 changes_ord_field = UPD_NODE_NO_ORD_CHANGE;
961 changes_ord_field = 0;
964 node->cmpl_info = changes_ord_field | changes_field_size;
977 que_node_t* search_cond)
983 table_sym = node->table_sym;
985 pars_retrieve_table_def(table_sym);
995 pars_resolve_exp_variables_and_types(NULL, cursor_sym);
999 node->searched_update = FALSE;
1004 &pars_share_token, NULL);
1005 node->searched_update = TRUE;
1011 ut_a(!node->is_delete || (node->col_assign_list == NULL));
1012 ut_a(node->is_delete || (node->col_assign_list != NULL));
1014 if (node->is_delete) {
1015 node->cmpl_info = 0;
1017 pars_process_assign_list(node);
1020 if (node->searched_update) {
1021 node->has_clust_rec_x_lock = TRUE;
1025 node->has_clust_rec_x_lock = sel_node->
set_x_locks;
1035 node->
state = UPD_NODE_UPDATE_CLUSTERED;
1061 que_node_t* values_list,
1068 ut_a(values_list || select);
1069 ut_a(!values_list || !select);
1072 ins_type = INS_VALUES;
1074 ins_type = INS_SEARCHED;
1077 pars_retrieve_table_def(table_sym);
1080 pars_sym_tab_global->
heap);
1098 node->values_list = values_list;
1100 if (node->values_list) {
1101 pars_resolve_exp_list_variables_and_types(NULL, values_list);
1114 pars_set_dfield_type(
1128 flags |= DATA_NOT_NULL;
1132 flags |= DATA_UNSIGNED;
1135 if (type == &pars_int_token) {
1136 ut_a((len == 0) || (len == 8));
1138 dtype_set(dfield_get_type(dfield), DATA_INT, flags, 8);
1140 dtype_set(dfield_get_type(dfield), DATA_INT, flags, 4);
1143 }
else if (type == &pars_char_token) {
1146 dtype_set(dfield_get_type(dfield), DATA_VARCHAR,
1147 DATA_ENGLISH | flags, 0);
1148 }
else if (type == &pars_binary_token) {
1151 dtype_set(dfield_get_type(dfield), DATA_FIXBINARY,
1152 DATA_BINARY_TYPE | flags, len);
1153 }
else if (type == &pars_blob_token) {
1156 dtype_set(dfield_get_type(dfield), DATA_BLOB,
1157 DATA_BINARY_TYPE | flags, 0);
1197 ut_a((param_type == PARS_INPUT) || (param_type == PARS_OUTPUT));
1210 pars_set_parent_in_list(
1212 que_node_t* node_list,
1235 que_node_t* stat_list)
1245 pars_resolve_exp_variables_and_types(NULL, cond);
1260 que_node_t* stat_list,
1261 que_node_t* else_part)
1273 pars_resolve_exp_variables_and_types(NULL, cond);
1286 while (elsif_node) {
1287 pars_set_parent_in_list(elsif_node->
stat_list, node);
1295 pars_set_parent_in_list(else_part, node);
1298 pars_set_parent_in_list(stat_list, node);
1311 que_node_t* stat_list)
1321 pars_resolve_exp_variables_and_types(NULL, cond);
1325 pars_set_parent_in_list(stat_list, node);
1338 que_node_t* loop_start_limit,
1339 que_node_t* loop_end_limit,
1340 que_node_t* stat_list)
1348 pars_resolve_exp_variables_and_types(NULL, loop_var);
1349 pars_resolve_exp_variables_and_types(NULL, loop_start_limit);
1350 pars_resolve_exp_variables_and_types(NULL, loop_end_limit);
1361 pars_set_parent_in_list(stat_list, node);
1418 pars_resolve_exp_variables_and_types(NULL, var);
1419 pars_resolve_exp_variables_and_types(NULL, val);
1434 que_node_t* res_word,
1441 pars_resolve_exp_list_variables_and_types(NULL, args);
1462 ut_a(!into_list != !user_func);
1468 pars_resolve_exp_variables_and_types(NULL, cursor);
1471 pars_resolve_exp_list_variables_and_types(NULL, into_list);
1475 pars_resolve_exp_variables_and_types(NULL, user_func);
1484 cursor_decl = cursor->
alias;
1516 pars_resolve_exp_variables_and_types(NULL, cursor);
1518 cursor_decl = cursor->
alias;
1598 is_unsigned != NULL, is_not_null != NULL);
1639 if (not_fit_in_memory != NULL) {
1640 table->does_not_fit_in_memory = TRUE;
1643 column = column_defs;
1694 if (clustered_def) {
1699 ind_type, n_fields);
1700 column = column_list;
1732 que_node_t* stat_list)
1739 heap = pars_sym_tab_global->
heap;
1758 pars_set_parent_in_list(stat_list, node);
1760 node->
sym_tab = pars_sym_tab_global;
1813 if (len > max_size) {
1817 #ifdef UNIV_SQL_DEBUG
1818 if (pars_print_lexed) {
1848 fputs(
"PARSER ERROR: Syntax error in SQL string\n", stderr);
1876 pars_sym_tab_global->
string_len = strlen(str);
1878 heap, str, pars_sym_tab_global->
string_len + 1));
1880 pars_sym_tab_global->
info = info;
1894 graph->
sym_tab = pars_sym_tab_global;
1976 const void* address,
2013 DATA_VARCHAR, DATA_ENGLISH);
2130 if (!info || !info->
funcs) {
2139 if (strcmp(puf->
name, name) == 0) {
2169 if (strcmp(pbl->
name, name) == 0) {
2199 if (strcmp(bid->
name, name) == 0) {
UNIV_INTERN ins_node_t * ins_node_create(ulint ins_type, dict_table_t *table, mem_heap_t *heap)
UNIV_INTERN void dict_mem_index_add_field(dict_index_t *index, const char *name, ulint prefix_len)
UNIV_INTERN sym_node_t * pars_column_def(sym_node_t *sym_node, pars_res_word_t *type, sym_node_t *len, void *is_unsigned, void *is_not_null)
que_node_t * loop_end_limit
#define UT_LIST_GET_NEXT(NAME, N)
UNIV_INTERN sym_node_t * sym_tab_add_id(sym_tab_t *sym_tab, byte *name, ulint len)
UNIV_INTERN ind_node_t * ind_create_graph_create(dict_index_t *index, mem_heap_t *heap)
UNIV_INTERN const char * dict_table_get_col_name(const dict_table_t *table, ulint col_nr)
UNIV_INTERN sel_node_t * pars_select_list(que_node_t *select_list, sym_node_t *into_list)
enum sel_node_state state
UNIV_INLINE void * ib_vector_get(ib_vector_t *vec, ulint n)
enum sym_tab_entry token_type
UNIV_INLINE void mach_write_to_4(byte *b, ulint n)
UNIV_INTERN que_thr_t * pars_complete_graph_for_exec(que_node_t *node, trx_t *trx, mem_heap_t *heap)
UNIV_INLINE que_node_t * que_node_list_add_last(que_node_t *node_list, que_node_t *node)
UNIV_INLINE plan_t * sel_node_get_nth_plan(sel_node_t *node, ulint i)
UNIV_INLINE lint eval_node_get_int_val(que_node_t *node)
UNIV_INLINE dtuple_t * dtuple_create(mem_heap_t *heap, ulint n_fields)
UNIV_INTERN assign_node_t * pars_assignment_statement(sym_node_t *var, que_node_t *val)
UNIV_INLINE void * ut_memcpy(void *dest, const void *sour, ulint n)
UNIV_INTERN void pars_info_add_id(pars_info_t *info, const char *name, const char *id)
UNIV_INTERN que_t * pars_sql(pars_info_t *info, const char *str)
UNIV_INTERN void * mem_heap_dup(mem_heap_t *heap, const void *data, ulint len)
UNIV_INLINE ibool dict_table_is_comp(const dict_table_t *table)
UNIV_INLINE ulint dtype_get_mtype(const dtype_t *type)
UNIV_INLINE void mach_write_to_8(byte *b, ib_uint64_t n)
UNIV_INTERN que_node_t * pars_cursor_declaration(sym_node_t *sym_node, sel_node_t *select_node)
UNIV_INTERN elsif_node_t * pars_elsif_element(que_node_t *cond, que_node_t *stat_list)
UNIV_INTERN row_printf_node_t * pars_row_printf_statement(sel_node_t *sel_node)
UNIV_INTERN upd_node_t * pars_update_statement(upd_node_t *node, sym_node_t *cursor_sym, que_node_t *search_cond)
UNIV_INTERN upd_node_t * pars_update_statement_start(ibool is_delete, sym_node_t *table_sym, col_assign_node_t *col_assign_list)
UNIV_INTERN dict_index_t * dict_mem_index_create(const char *table_name, const char *index_name, ulint space, ulint type, ulint n_fields)
UNIV_INTERN void ins_node_set_new_row(ins_node_t *node, dtuple_t *row)
UNIV_INTERN ulint dict_index_get_nth_col_pos(const dict_index_t *index, ulint n)
#define mem_heap_free(heap)
UNIV_INLINE ulint dict_col_get_fixed_size(const dict_col_t *col, ulint comp)
UNIV_INTERN void pars_info_add_int4_literal(pars_info_t *info, const char *name, lint val)
UNIV_INTERN col_assign_node_t * pars_column_assignment(sym_node_t *column, que_node_t *exp)
UNIV_INTERN func_node_t * pars_op(int func, que_node_t *arg1, que_node_t *arg2)
UNIV_INLINE void dict_col_copy_type(const dict_col_t *col, dtype_t *type)
#define PARS_FUNC_AGGREGATE
UNIV_INLINE dict_table_t * dict_table_get_low(const char *table_name)
UNIV_INLINE const dict_col_t * dict_index_get_nth_col(const dict_index_t *index, ulint pos)
UNIV_INTERN roll_node_t * roll_node_create(mem_heap_t *heap)
UNIV_INTERN sym_tab_t * sym_tab_create(mem_heap_t *heap)
UNIV_INLINE ulint que_node_list_get_len(que_node_t *node_list)
UNIV_INTERN void dict_table_copy_types(dtuple_t *tuple, const dict_table_t *table)
UNIV_INTERN void yyerror(const char *s)
UNIV_INTERN ins_node_t * pars_insert_statement(sym_node_t *table_sym, que_node_t *values_list, sel_node_t *select)
UNIV_INTERN sel_node_t * sel_node_create(mem_heap_t *heap)
UNIV_INTERN void opt_find_all_cols(ibool copy_val, dict_index_t *index, sym_node_list_t *col_list, plan_t *plan, que_node_t *exp)
UNIV_INLINE ulint ib_vector_size(const ib_vector_t *vec)
UNIV_INLINE dtype_t * que_node_get_data_type(que_node_t *node)
UNIV_INTERN pars_user_func_t * pars_info_get_user_func(pars_info_t *info, const char *name)
UNIV_INTERN void pars_info_add_str_literal(pars_info_t *info, const char *name, const char *str)
UNIV_INLINE void dfield_set_data(dfield_t *field, const void *data, ulint len)
UNIV_INTERN que_fork_t * pars_stored_procedure_call(sym_node_t *sym_node)
UNIV_INTERN ib_vector_t * ib_vector_create(mem_heap_t *heap, ulint size)
UNIV_INTERN que_fork_t * pars_procedure_definition(sym_node_t *sym_node, sym_node_t *param_list, que_node_t *stat_list)
UNIV_INLINE void que_node_set_parent(que_node_t *node, que_node_t *parent)
UNIV_INTERN commit_node_t * pars_commit_statement(void)
UNIV_INTERN sel_node_t * pars_select_statement(sel_node_t *select_node, sym_node_t *table_list, que_node_t *search_cond, pars_res_word_t *for_update, pars_res_word_t *consistent_read, order_node_t *order_by)
UNIV_INTERN dict_table_t * dict_mem_table_create(const char *name, ulint space, ulint n_cols, ulint flags)
UNIV_INTERN while_node_t * pars_while_statement(que_node_t *cond, que_node_t *stat_list)
UNIV_INLINE ulint dict_index_is_clust(const dict_index_t *index) __attribute__((pure))
UNIV_INTERN upd_node_t * upd_node_create(mem_heap_t *heap)
UNIV_INTERN fetch_node_t * pars_fetch_statement(sym_node_t *cursor, sym_node_t *into_list, sym_node_t *user_func)
UNIV_INTERN tab_node_t * tab_create_graph_create(dict_table_t *table, mem_heap_t *heap)
UNIV_INLINE void dfield_set_type(dfield_t *field, dtype_t *type)
UNIV_INTERN pars_info_t * pars_info_create(void)
UNIV_INLINE void * mem_heap_alloc(mem_heap_t *heap, ulint n)
#define mem_heap_create(N)
UNIV_INTERN que_node_t * pars_function_declaration(sym_node_t *sym_node)
UNIV_INTERN roll_node_t * pars_rollback_statement(void)
UNIV_INTERN void dict_mem_table_add_col(dict_table_t *table, mem_heap_t *heap, const char *name, ulint mtype, ulint prtype, ulint len)
UNIV_INTERN void opt_search_plan(sel_node_t *sel_node)
UNIV_INTERN void pars_info_add_ull_literal(pars_info_t *info, const char *name, ib_uint64_t val)
#define UT_LIST_ADD_LAST(NAME, BASE, N)
#define UT_LIST_GET_FIRST(BASE)
UNIV_INTERN func_node_t * pars_func(que_node_t *res_word, que_node_t *arg)
UNIV_INTERN sym_node_t * pars_variable_declaration(sym_node_t *node, pars_res_word_t *type)
UNIV_INLINE void upd_field_set_field_no(upd_field_t *upd_field, ulint field_no, dict_index_t *index, trx_t *trx)
UNIV_INTERN tab_node_t * pars_create_table(sym_node_t *table_sym, sym_node_t *column_defs, void *not_fit_in_memory)
UNIV_INLINE ulint dict_table_get_n_cols(const dict_table_t *table)
#define UT_LIST_INIT(BASE)
UNIV_INTERN sym_node_t * pars_parameter_declaration(sym_node_t *node, ulint param_type, pars_res_word_t *type)
UNIV_INLINE ulint dict_table_get_n_user_cols(const dict_table_t *table)
enum open_node_op op_type
UNIV_INTERN return_node_t * pars_return_statement(void)
UNIV_INLINE ulint que_node_get_type(que_node_t *node)
elsif_node_t * elsif_list
UNIV_INTERN void pars_get_lex_chars(char *buf, int *result, int max_size)
UNIV_INTERN ibool row_upd_changes_some_index_ord_field_binary(const dict_table_t *table, const upd_t *update)
UNIV_INLINE void dtype_set(dtype_t *type, ulint mtype, ulint prtype, ulint len)
UNIV_INTERN func_node_t * pars_procedure_call(que_node_t *res_word, que_node_t *args)
#define PARS_FUNC_PREDEFINED
UNIV_INTERN void ib_vector_push(ib_vector_t *vec, void *elem)
UNIV_INTERN commit_node_t * commit_node_create(mem_heap_t *heap)
UNIV_INTERN if_node_t * pars_if_statement(que_node_t *cond, que_node_t *stat_list, que_node_t *else_part)
UNIV_INLINE void dtype_copy(dtype_t *type1, const dtype_t *type2)
UNIV_INTERN void pars_info_free(pars_info_t *info)
UNIV_INLINE dfield_t * que_node_get_val(que_node_t *node)
#define PARS_FUNC_LOGICAL
UNIV_INTERN que_thr_t * que_thr_create(que_fork_t *parent, mem_heap_t *heap)
UNIV_INTERN exit_node_t * pars_exit_statement(void)
UNIV_INTERN order_node_t * pars_order_by(sym_node_t *column, pars_res_word_t *asc)
UNIV_INLINE que_node_t * que_node_get_next(que_node_t *node)
UNIV_INLINE int ut_memcmp(const void *str1, const void *str2, ulint n)
UNIV_INTERN open_node_t * pars_open_statement(ulint type, sym_node_t *cursor)
UNIV_INTERN pars_bound_lit_t * pars_info_get_bound_lit(pars_info_t *info, const char *name)
que_node_t * loop_start_limit
UNIV_INTERN for_node_t * pars_for_statement(sym_node_t *loop_var, que_node_t *loop_start_limit, que_node_t *loop_end_limit, que_node_t *stat_list)
UNIV_INTERN ind_node_t * pars_create_index(pars_res_word_t *unique_def, pars_res_word_t *clustered_def, sym_node_t *index_sym, sym_node_t *table_sym, sym_node_t *column_list)
sym_node_t * explicit_cursor
UNIV_INLINE upd_t * upd_create(ulint n, mem_heap_t *heap)
UNIV_INTERN void pars_info_add_function(pars_info_t *info, const char *name, pars_user_func_cb_t func, void *arg)
UNIV_INTERN pars_bound_id_t * pars_info_get_bound_id(pars_info_t *info, const char *name)
UNIV_INTERN void pars_info_add_literal(pars_info_t *info, const char *name, const void *address, ulint length, ulint type, ulint prtype)
void *(* pars_user_func_cb_t)(void *arg, void *user_arg)
UNIV_INTERN que_fork_t * que_fork_create(que_t *graph, que_node_t *parent, ulint fork_type, mem_heap_t *heap)
UNIV_INLINE ulint ut_strlen(const char *str)