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);
515 = dict_table_get_col_name(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;
629 const char* col_name = dict_table_get_col_name(
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);
1085 dict_table_copy_types(row, table_sym->
table);
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);
1636 table = dict_mem_table_create(table_sym->
name, 0, n_cols, 0);
1639 if (not_fit_in_memory != NULL) {
1640 table->does_not_fit_in_memory = TRUE;
1643 column = column_defs;
1648 dict_mem_table_add_col(table, table->
heap,
1657 node = tab_create_graph_create(table, pars_sym_tab_global->
heap);
1694 if (clustered_def) {
1698 index = dict_mem_index_create(table_sym->
name, index_sym->
name, 0,
1699 ind_type, n_fields);
1700 column = column_list;
1703 dict_mem_index_add_field(index, column->
name, 0);
1711 node = ind_create_graph_create(index, pars_sym_tab_global->
heap);
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) {