44
41
/* Global variable used while parsing a single procedure or query : the code is
46
UNIV_INTERN sym_tab_t* pars_sym_tab_global;
43
sym_tab_t* pars_sym_tab_global;
48
45
/* Global variables used to denote certain reserved words, used in
49
46
constructing the parsing tree */
51
UNIV_INTERN pars_res_word_t pars_to_char_token = {PARS_TO_CHAR_TOKEN};
52
UNIV_INTERN pars_res_word_t pars_to_number_token = {PARS_TO_NUMBER_TOKEN};
53
UNIV_INTERN pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN};
54
UNIV_INTERN pars_res_word_t pars_binary_to_number_token = {PARS_BINARY_TO_NUMBER_TOKEN};
55
UNIV_INTERN pars_res_word_t pars_substr_token = {PARS_SUBSTR_TOKEN};
56
UNIV_INTERN pars_res_word_t pars_replstr_token = {PARS_REPLSTR_TOKEN};
57
UNIV_INTERN pars_res_word_t pars_concat_token = {PARS_CONCAT_TOKEN};
58
UNIV_INTERN pars_res_word_t pars_instr_token = {PARS_INSTR_TOKEN};
59
UNIV_INTERN pars_res_word_t pars_length_token = {PARS_LENGTH_TOKEN};
60
UNIV_INTERN pars_res_word_t pars_sysdate_token = {PARS_SYSDATE_TOKEN};
61
UNIV_INTERN pars_res_word_t pars_printf_token = {PARS_PRINTF_TOKEN};
62
UNIV_INTERN pars_res_word_t pars_assert_token = {PARS_ASSERT_TOKEN};
63
UNIV_INTERN pars_res_word_t pars_rnd_token = {PARS_RND_TOKEN};
64
UNIV_INTERN pars_res_word_t pars_rnd_str_token = {PARS_RND_STR_TOKEN};
65
UNIV_INTERN pars_res_word_t pars_count_token = {PARS_COUNT_TOKEN};
66
UNIV_INTERN pars_res_word_t pars_sum_token = {PARS_SUM_TOKEN};
67
UNIV_INTERN pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN};
68
UNIV_INTERN pars_res_word_t pars_binary_token = {PARS_BINARY_TOKEN};
69
UNIV_INTERN pars_res_word_t pars_blob_token = {PARS_BLOB_TOKEN};
70
UNIV_INTERN pars_res_word_t pars_int_token = {PARS_INT_TOKEN};
71
UNIV_INTERN pars_res_word_t pars_char_token = {PARS_CHAR_TOKEN};
72
UNIV_INTERN pars_res_word_t pars_float_token = {PARS_FLOAT_TOKEN};
73
UNIV_INTERN pars_res_word_t pars_update_token = {PARS_UPDATE_TOKEN};
74
UNIV_INTERN pars_res_word_t pars_asc_token = {PARS_ASC_TOKEN};
75
UNIV_INTERN pars_res_word_t pars_desc_token = {PARS_DESC_TOKEN};
76
UNIV_INTERN pars_res_word_t pars_open_token = {PARS_OPEN_TOKEN};
77
UNIV_INTERN pars_res_word_t pars_close_token = {PARS_CLOSE_TOKEN};
78
UNIV_INTERN pars_res_word_t pars_share_token = {PARS_SHARE_TOKEN};
79
UNIV_INTERN pars_res_word_t pars_unique_token = {PARS_UNIQUE_TOKEN};
80
UNIV_INTERN pars_res_word_t pars_clustered_token = {PARS_CLUSTERED_TOKEN};
48
pars_res_word_t pars_to_char_token = {PARS_TO_CHAR_TOKEN};
49
pars_res_word_t pars_to_number_token = {PARS_TO_NUMBER_TOKEN};
50
pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN};
51
pars_res_word_t pars_binary_to_number_token = {PARS_BINARY_TO_NUMBER_TOKEN};
52
pars_res_word_t pars_substr_token = {PARS_SUBSTR_TOKEN};
53
pars_res_word_t pars_replstr_token = {PARS_REPLSTR_TOKEN};
54
pars_res_word_t pars_concat_token = {PARS_CONCAT_TOKEN};
55
pars_res_word_t pars_instr_token = {PARS_INSTR_TOKEN};
56
pars_res_word_t pars_length_token = {PARS_LENGTH_TOKEN};
57
pars_res_word_t pars_sysdate_token = {PARS_SYSDATE_TOKEN};
58
pars_res_word_t pars_printf_token = {PARS_PRINTF_TOKEN};
59
pars_res_word_t pars_assert_token = {PARS_ASSERT_TOKEN};
60
pars_res_word_t pars_rnd_token = {PARS_RND_TOKEN};
61
pars_res_word_t pars_rnd_str_token = {PARS_RND_STR_TOKEN};
62
pars_res_word_t pars_count_token = {PARS_COUNT_TOKEN};
63
pars_res_word_t pars_sum_token = {PARS_SUM_TOKEN};
64
pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN};
65
pars_res_word_t pars_binary_token = {PARS_BINARY_TOKEN};
66
pars_res_word_t pars_blob_token = {PARS_BLOB_TOKEN};
67
pars_res_word_t pars_int_token = {PARS_INT_TOKEN};
68
pars_res_word_t pars_char_token = {PARS_CHAR_TOKEN};
69
pars_res_word_t pars_float_token = {PARS_FLOAT_TOKEN};
70
pars_res_word_t pars_update_token = {PARS_UPDATE_TOKEN};
71
pars_res_word_t pars_asc_token = {PARS_ASC_TOKEN};
72
pars_res_word_t pars_desc_token = {PARS_DESC_TOKEN};
73
pars_res_word_t pars_open_token = {PARS_OPEN_TOKEN};
74
pars_res_word_t pars_close_token = {PARS_CLOSE_TOKEN};
75
pars_res_word_t pars_share_token = {PARS_SHARE_TOKEN};
76
pars_res_word_t pars_unique_token = {PARS_UNIQUE_TOKEN};
77
pars_res_word_t pars_clustered_token = {PARS_CLUSTERED_TOKEN};
82
79
/* Global variable used to denote the '*' in SELECT * FROM.. */
83
80
#define PARS_STAR_DENOTER 12345678
84
UNIV_INTERN ulint pars_star_denoter = PARS_STAR_DENOTER;
81
ulint pars_star_denoter = PARS_STAR_DENOTER;
87
84
/*************************************************************************
93
90
/* out: function class: PARS_FUNC_ARITH, ... */
94
91
int func) /* in: function code: '=', PARS_GE_TOKEN, ... */
97
case '+': case '-': case '*': case '/':
93
if ((func == '+') || (func == '-') || (func == '*') || (func == '/')) {
98
95
return(PARS_FUNC_ARITH);
100
case '=': case '<': case '>':
101
case PARS_GE_TOKEN: case PARS_LE_TOKEN: case PARS_NE_TOKEN:
97
} else if ((func == '=') || (func == '<') || (func == '>')
98
|| (func == PARS_GE_TOKEN) || (func == PARS_LE_TOKEN)
99
|| (func == PARS_NE_TOKEN)) {
102
101
return(PARS_FUNC_CMP);
104
case PARS_AND_TOKEN: case PARS_OR_TOKEN: case PARS_NOT_TOKEN:
103
} else if ((func == PARS_AND_TOKEN) || (func == PARS_OR_TOKEN)
104
|| (func == PARS_NOT_TOKEN)) {
105
106
return(PARS_FUNC_LOGICAL);
107
case PARS_COUNT_TOKEN: case PARS_SUM_TOKEN:
108
} else if ((func == PARS_COUNT_TOKEN) || (func == PARS_SUM_TOKEN)) {
108
110
return(PARS_FUNC_AGGREGATE);
110
case PARS_TO_CHAR_TOKEN:
111
case PARS_TO_NUMBER_TOKEN:
112
case PARS_TO_BINARY_TOKEN:
113
case PARS_BINARY_TO_NUMBER_TOKEN:
114
case PARS_SUBSTR_TOKEN:
115
case PARS_CONCAT_TOKEN:
116
case PARS_LENGTH_TOKEN:
117
case PARS_INSTR_TOKEN:
118
case PARS_SYSDATE_TOKEN:
119
case PARS_NOTFOUND_TOKEN:
120
case PARS_PRINTF_TOKEN:
121
case PARS_ASSERT_TOKEN:
123
case PARS_RND_STR_TOKEN:
124
case PARS_REPLSTR_TOKEN:
112
} else if ((func == PARS_TO_CHAR_TOKEN)
113
|| (func == PARS_TO_NUMBER_TOKEN)
114
|| (func == PARS_TO_BINARY_TOKEN)
115
|| (func == PARS_BINARY_TO_NUMBER_TOKEN)
116
|| (func == PARS_SUBSTR_TOKEN)
117
|| (func == PARS_CONCAT_TOKEN)
118
|| (func == PARS_LENGTH_TOKEN)
119
|| (func == PARS_INSTR_TOKEN)
120
|| (func == PARS_SYSDATE_TOKEN)
121
|| (func == PARS_NOTFOUND_TOKEN)
122
|| (func == PARS_PRINTF_TOKEN)
123
|| (func == PARS_ASSERT_TOKEN)
124
|| (func == PARS_RND_TOKEN)
125
|| (func == PARS_RND_STR_TOKEN)
126
|| (func == PARS_REPLSTR_TOKEN)) {
125
128
return(PARS_FUNC_PREDEFINED);
128
130
return(PARS_FUNC_OTHER);
266
253
ut_a(dtype_get_mtype(que_node_get_data_type(node))
270
case PARS_COUNT_TOKEN:
255
} else if (func == PARS_COUNT_TOKEN) {
272
257
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
275
case PARS_TO_CHAR_TOKEN:
276
case PARS_RND_STR_TOKEN:
259
} else if (func == PARS_TO_CHAR_TOKEN) {
277
260
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
278
261
dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
279
262
DATA_ENGLISH, 0);
282
case PARS_TO_BINARY_TOKEN:
263
} else if (func == PARS_TO_BINARY_TOKEN) {
283
264
if (dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT) {
284
265
dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
285
266
DATA_ENGLISH, 0);
287
268
dtype_set(que_node_get_data_type(node), DATA_BINARY,
292
case PARS_TO_NUMBER_TOKEN:
293
case PARS_BINARY_TO_NUMBER_TOKEN:
294
case PARS_LENGTH_TOKEN:
295
case PARS_INSTR_TOKEN:
296
ut_a(pars_is_string_type(que_node_get_data_type(arg)->mtype));
297
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
300
case PARS_SYSDATE_TOKEN:
271
} else if (func == PARS_TO_NUMBER_TOKEN) {
272
ut_a(dtype_get_mtype(que_node_get_data_type(arg))
274
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
276
} else if (func == PARS_BINARY_TO_NUMBER_TOKEN) {
277
ut_a(dtype_get_mtype(que_node_get_data_type(arg))
279
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
281
} else if (func == PARS_LENGTH_TOKEN) {
282
ut_a(dtype_get_mtype(que_node_get_data_type(arg))
284
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
286
} else if (func == PARS_INSTR_TOKEN) {
287
ut_a(dtype_get_mtype(que_node_get_data_type(arg))
289
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
291
} else if (func == PARS_SYSDATE_TOKEN) {
301
292
ut_a(arg == NULL);
302
293
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
305
case PARS_SUBSTR_TOKEN:
306
case PARS_CONCAT_TOKEN:
307
ut_a(pars_is_string_type(que_node_get_data_type(arg)->mtype));
295
} else if ((func == PARS_SUBSTR_TOKEN)
296
|| (func == PARS_CONCAT_TOKEN)) {
298
ut_a(dtype_get_mtype(que_node_get_data_type(arg))
308
300
dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
309
301
DATA_ENGLISH, 0);
312
case '>': case '<': case '=':
319
case PARS_NOTFOUND_TOKEN:
303
} else if ((func == '>') || (func == '<') || (func == '=')
304
|| (func == PARS_GE_TOKEN)
305
|| (func == PARS_LE_TOKEN)
306
|| (func == PARS_NE_TOKEN)
307
|| (func == PARS_AND_TOKEN)
308
|| (func == PARS_OR_TOKEN)
309
|| (func == PARS_NOT_TOKEN)
310
|| (func == PARS_NOTFOUND_TOKEN)) {
321
312
/* We currently have no iboolean type: use integer type */
322
313
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
315
} else if (func == PARS_RND_TOKEN) {
326
316
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
327
318
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
320
} else if (func == PARS_RND_STR_TOKEN) {
321
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
323
dtype_set(que_node_get_data_type(node), DATA_VARCHAR,