pars0pars.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:49k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. SQL parser
  3. (c) 1996 Innobase Oy
  4. Created 11/19/1996 Heikki Tuuri
  5. *******************************************************/
  6. /* Historical note: Innobase executed its first SQL string (CREATE TABLE)
  7. on 1/27/1998 */
  8. #include "pars0pars.h"
  9. #ifdef UNIV_NONINL
  10. #include "pars0pars.ic"
  11. #endif
  12. #include "row0sel.h"
  13. #include "row0ins.h"
  14. #include "row0upd.h"
  15. #include "dict0dict.h"
  16. #include "dict0mem.h"
  17. #include "dict0crea.h"
  18. #include "que0que.h"
  19. #include "pars0grm.h"
  20. #include "pars0opt.h"
  21. #include "data0data.h"
  22. #include "data0type.h"
  23. #include "trx0trx.h"
  24. #include "trx0roll.h"
  25. #include "lock0lock.h"
  26. #include "odbc0odbc.h"
  27. #include "eval0eval.h"
  28. /* If the following is set TRUE, the lexer will print the SQL string
  29. as it tokenizes it */
  30. ibool pars_print_lexed = FALSE;
  31. /* Global variable used while parsing a single procedure or query : the code is
  32. NOT re-entrant */
  33. sym_tab_t* pars_sym_tab_global;
  34. /* Global variables used to denote certain reserved words, used in
  35. constructing the parsing tree */
  36. pars_res_word_t pars_to_char_token = {PARS_TO_CHAR_TOKEN};
  37. pars_res_word_t pars_to_number_token = {PARS_TO_NUMBER_TOKEN};
  38. pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN};
  39. pars_res_word_t pars_binary_to_number_token = {PARS_BINARY_TO_NUMBER_TOKEN};
  40. pars_res_word_t pars_substr_token = {PARS_SUBSTR_TOKEN};
  41. pars_res_word_t pars_replstr_token = {PARS_REPLSTR_TOKEN};
  42. pars_res_word_t pars_concat_token = {PARS_CONCAT_TOKEN};
  43. pars_res_word_t pars_instr_token = {PARS_INSTR_TOKEN};
  44. pars_res_word_t pars_length_token = {PARS_LENGTH_TOKEN};
  45. pars_res_word_t pars_sysdate_token = {PARS_SYSDATE_TOKEN};
  46. pars_res_word_t pars_printf_token = {PARS_PRINTF_TOKEN};
  47. pars_res_word_t pars_assert_token = {PARS_ASSERT_TOKEN};
  48. pars_res_word_t pars_rnd_token = {PARS_RND_TOKEN};
  49. pars_res_word_t pars_rnd_str_token = {PARS_RND_STR_TOKEN};
  50. pars_res_word_t pars_count_token = {PARS_COUNT_TOKEN};
  51. pars_res_word_t pars_sum_token = {PARS_SUM_TOKEN};
  52. pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN};
  53. pars_res_word_t pars_int_token = {PARS_INT_TOKEN};
  54. pars_res_word_t pars_char_token = {PARS_CHAR_TOKEN};
  55. pars_res_word_t pars_float_token = {PARS_FLOAT_TOKEN};
  56. pars_res_word_t pars_update_token = {PARS_UPDATE_TOKEN};
  57. pars_res_word_t pars_asc_token = {PARS_ASC_TOKEN};
  58. pars_res_word_t pars_desc_token = {PARS_DESC_TOKEN};
  59. pars_res_word_t pars_open_token = {PARS_OPEN_TOKEN};
  60. pars_res_word_t pars_close_token = {PARS_CLOSE_TOKEN};
  61. pars_res_word_t pars_consistent_token = {PARS_CONSISTENT_TOKEN};
  62. pars_res_word_t pars_unique_token = {PARS_UNIQUE_TOKEN};
  63. pars_res_word_t pars_clustered_token = {PARS_CLUSTERED_TOKEN};
  64. /* Global variable used to denote the '*' in SELECT * FROM.. */
  65. #define PARS_STAR_DENOTER 12345678
  66. ulint pars_star_denoter = PARS_STAR_DENOTER;
  67. /*************************************************************************
  68. Determines the class of a function code. */
  69. static
  70. ulint
  71. pars_func_get_class(
  72. /*================*/
  73. /* out: function class: PARS_FUNC_ARITH, ... */
  74. int func) /* in: function code: '=', PARS_GE_TOKEN, ... */
  75. {
  76. if ((func == '+') || (func == '-') || (func == '*') || (func == '/')) {
  77. return(PARS_FUNC_ARITH);
  78. } else if ((func == '=') || (func == '<') || (func == '>')
  79.    || (func == PARS_GE_TOKEN) || (func == PARS_LE_TOKEN)
  80.    || (func == PARS_NE_TOKEN)) {
  81. return(PARS_FUNC_CMP);
  82. } else if ((func == PARS_AND_TOKEN) || (func == PARS_OR_TOKEN)
  83.    || (func == PARS_NOT_TOKEN)) {
  84. return(PARS_FUNC_LOGICAL);
  85. } else if ((func == PARS_COUNT_TOKEN) || (func == PARS_SUM_TOKEN)) {
  86. return(PARS_FUNC_AGGREGATE);
  87. } else if ((func == PARS_TO_CHAR_TOKEN)
  88.    || (func == PARS_TO_NUMBER_TOKEN)
  89.    || (func == PARS_TO_BINARY_TOKEN)
  90.    || (func == PARS_BINARY_TO_NUMBER_TOKEN)
  91.    || (func == PARS_SUBSTR_TOKEN)
  92.    || (func == PARS_CONCAT_TOKEN)
  93.    || (func == PARS_LENGTH_TOKEN)
  94.    || (func == PARS_INSTR_TOKEN)
  95.    || (func == PARS_SYSDATE_TOKEN)
  96.    || (func == PARS_NOTFOUND_TOKEN)
  97.    || (func == PARS_PRINTF_TOKEN)
  98.    || (func == PARS_ASSERT_TOKEN)
  99.    || (func == PARS_RND_TOKEN)
  100.    || (func == PARS_RND_STR_TOKEN)
  101.    || (func == PARS_REPLSTR_TOKEN)) {
  102. return(PARS_FUNC_PREDEFINED);
  103. } else {
  104. return(PARS_FUNC_OTHER);
  105. }
  106. }
  107. /*************************************************************************
  108. Parses an operator or predefined function expression. */
  109. static
  110. func_node_t*
  111. pars_func_low(
  112. /*==========*/
  113. /* out, own: function node in a query tree */
  114. int func, /* in: function token code */
  115. que_node_t* arg) /* in: first argument in the argument list */
  116. {
  117. func_node_t* node;
  118. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(func_node_t));
  119. node->common.type = QUE_NODE_FUNC;
  120. dfield_set_data(&(node->common.val), NULL, 0);
  121. node->common.val_buf_size = 0;
  122. node->func = func;
  123. node->class = pars_func_get_class(func);
  124. node->args = arg;
  125. UT_LIST_ADD_LAST(func_node_list, pars_sym_tab_global->func_node_list,
  126. node);
  127. return(node);
  128. }
  129. /*************************************************************************
  130. Parses a function expression. */
  131. func_node_t*
  132. pars_func(
  133. /*======*/
  134. /* out, own: function node in a query tree */
  135. que_node_t*  res_word,/* in: function name reserved word */
  136. que_node_t* arg) /* in: first argument in the argument list */
  137. {
  138. return(pars_func_low(((pars_res_word_t*)res_word)->code, arg));
  139. }
  140. /*************************************************************************
  141. Parses an operator expression. */
  142. func_node_t*
  143. pars_op(
  144. /*====*/
  145. /* out, own: function node in a query tree */
  146. int func, /* in: operator token code */
  147. que_node_t* arg1, /* in: first argument */
  148. que_node_t* arg2) /* in: second argument or NULL for an unary
  149. operator */
  150. {
  151. que_node_list_add_last(NULL, arg1);
  152. if (arg2) {
  153. que_node_list_add_last(arg1, arg2);
  154. }
  155. return(pars_func_low(func, arg1));
  156. }
  157. /*************************************************************************
  158. Parses an ORDER BY clause. Order by a single column only is supported. */
  159. order_node_t*
  160. pars_order_by(
  161. /*==========*/
  162. /* out, own: order-by node in a query tree */
  163. sym_node_t* column, /* in: column name */
  164. pars_res_word_t* asc) /* in: &pars_asc_token or pars_desc_token */
  165. {
  166. order_node_t* node;
  167. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(order_node_t));
  168. node->common.type = QUE_NODE_ORDER;
  169. node->column = column;
  170. if (asc == &pars_asc_token) {
  171. node->asc = TRUE;
  172. } else {
  173. ut_a(asc == &pars_desc_token);
  174. node->asc = FALSE;
  175. }
  176. return(node);
  177. }
  178. /*************************************************************************
  179. Resolves the data type of a function in an expression. The argument data
  180. types must already be resolved. */
  181. static
  182. void
  183. pars_resolve_func_data_type(
  184. /*========================*/
  185. func_node_t* node) /* in: function node */
  186. {
  187. que_node_t* arg;
  188. ulint func;
  189. ut_a(que_node_get_type(node) == QUE_NODE_FUNC);
  190. arg = node->args;
  191. func = node->func;
  192. if ((func == PARS_SUM_TOKEN)
  193.      || (func == '+') || (func == '-') || (func == '*')
  194. || (func == '/') || (func == '+')) {
  195. /* Inherit the data type from the first argument (which must
  196. not be the SQL null literal whose type is DATA_ERROR) */
  197. ut_a(dtype_get_mtype(que_node_get_data_type(arg))
  198. != DATA_ERROR);
  199. dtype_copy(que_node_get_data_type(node),
  200. que_node_get_data_type(arg));
  201. ut_a(dtype_get_mtype(que_node_get_data_type(node)) == DATA_INT);
  202. } else if (func == PARS_COUNT_TOKEN) {
  203. ut_a(arg);
  204. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  205. } else if (func == PARS_TO_CHAR_TOKEN) {
  206. ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
  207. dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
  208. DATA_ENGLISH, 0, 0);
  209. } else if (func == PARS_TO_BINARY_TOKEN) {
  210. ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
  211. dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
  212. DATA_ENGLISH, 0, 0);
  213. } else if (func == PARS_TO_NUMBER_TOKEN) {
  214. ut_a(dtype_get_mtype(que_node_get_data_type(arg))
  215. == DATA_VARCHAR);
  216. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  217. } else if (func == PARS_BINARY_TO_NUMBER_TOKEN) {
  218. ut_a(dtype_get_mtype(que_node_get_data_type(arg))
  219. == DATA_VARCHAR);
  220. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  221. } else if (func == PARS_LENGTH_TOKEN) {
  222. ut_a(dtype_get_mtype(que_node_get_data_type(arg))
  223. == DATA_VARCHAR);
  224. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  225. } else if (func == PARS_INSTR_TOKEN) {
  226. ut_a(dtype_get_mtype(que_node_get_data_type(arg))
  227. == DATA_VARCHAR);
  228. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  229. } else if (func == PARS_SYSDATE_TOKEN) {
  230. ut_a(arg == NULL);
  231. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  232. } else if ((func == PARS_SUBSTR_TOKEN)
  233. || (func == PARS_CONCAT_TOKEN)) {
  234. ut_a(dtype_get_mtype(que_node_get_data_type(arg))
  235. == DATA_VARCHAR);
  236. dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
  237. DATA_ENGLISH, 0, 0);
  238. } else if ((func == '>') || (func == '<') || (func == '=')
  239.    || (func == PARS_GE_TOKEN)
  240.    || (func == PARS_LE_TOKEN)
  241.    || (func == PARS_NE_TOKEN)
  242.    || (func == PARS_AND_TOKEN)
  243.    || (func == PARS_OR_TOKEN)
  244.    || (func == PARS_NOT_TOKEN)
  245.    || (func == PARS_NOTFOUND_TOKEN)) {
  246. /* We currently have no iboolean type: use integer type */
  247. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  248. } else if (func == PARS_RND_TOKEN) {
  249. ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
  250. dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0);
  251. } else if (func == PARS_RND_STR_TOKEN) {
  252. ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
  253. dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
  254. DATA_ENGLISH, 0, 0);
  255. } else {
  256. ut_error;
  257. }
  258. }
  259. /*************************************************************************
  260. Resolves the meaning of variables in an expression and the data types of
  261. functions. It is an error if some identifier cannot be resolved here. */
  262. static
  263. void
  264. pars_resolve_exp_variables_and_types(
  265. /*=================================*/
  266. sel_node_t* select_node, /* in: select node or NULL; if
  267. this is not NULL then the variable
  268. sym nodes are added to the
  269. copy_variables list of select_node */
  270. que_node_t* exp_node) /* in: expression */
  271. {
  272. func_node_t* func_node;
  273. que_node_t* arg;
  274. sym_node_t* sym_node;
  275. sym_node_t* node;
  276. ut_a(exp_node);
  277. if (que_node_get_type(exp_node) == QUE_NODE_FUNC) {
  278. func_node = exp_node;
  279. arg = func_node->args;
  280. while (arg) {
  281. pars_resolve_exp_variables_and_types(select_node, arg);
  282. arg = que_node_get_next(arg);
  283. }
  284. pars_resolve_func_data_type(func_node);
  285. return;
  286. }
  287. ut_a(que_node_get_type(exp_node) == QUE_NODE_SYMBOL);
  288. sym_node = exp_node;
  289. if (sym_node->resolved) {
  290. return;
  291. }
  292. /* Not resolved yet: look in the symbol table for a variable
  293. or a cursor with the same name */
  294. node = UT_LIST_GET_FIRST(pars_sym_tab_global->sym_list);
  295. while (node) {
  296. if (node->resolved
  297. && ((node->token_type == SYM_VAR)
  298. || (node->token_type == SYM_CURSOR))
  299. && node->name
  300. && (sym_node->name_len == node->name_len)
  301. && (ut_memcmp(sym_node->name, node->name,
  302. node->name_len) == 0)) {
  303. /* Found a variable or a cursor declared with
  304. the same name */
  305. break;
  306. }
  307. node = UT_LIST_GET_NEXT(sym_list, node);
  308. }
  309. if (!node) {
  310. printf("PARSER ERROR: Unresolved identifier %sn",
  311. sym_node->name);
  312. }
  313. ut_a(node);
  314. sym_node->resolved = TRUE;
  315. sym_node->token_type = SYM_IMPLICIT_VAR;
  316. sym_node->alias = node;
  317. sym_node->indirection = node;
  318. if (select_node) {
  319. UT_LIST_ADD_LAST(col_var_list, select_node->copy_variables,
  320. sym_node);
  321. }
  322. dfield_set_type(que_node_get_val(sym_node),
  323. que_node_get_data_type(node));
  324. }
  325. /*************************************************************************
  326. Resolves the meaning of variables in an expression list. It is an error if
  327. some identifier cannot be resolved here. Resolves also the data types of
  328. functions. */
  329. static
  330. void
  331. pars_resolve_exp_list_variables_and_types(
  332. /*======================================*/
  333. sel_node_t* select_node, /* in: select node or NULL */
  334. que_node_t* exp_node) /* in: expression list first node, or
  335. NULL */
  336. {
  337. while (exp_node) {
  338. pars_resolve_exp_variables_and_types(select_node, exp_node);
  339. exp_node = que_node_get_next(exp_node);
  340. }
  341. }
  342. /*************************************************************************
  343. Resolves the columns in an expression. */
  344. static
  345. void
  346. pars_resolve_exp_columns(
  347. /*=====================*/
  348. sym_node_t* table_node, /* in: first node in a table list */
  349. que_node_t* exp_node) /* in: expression */
  350. {
  351. func_node_t* func_node;
  352. que_node_t* arg;
  353. sym_node_t* sym_node;
  354. dict_table_t* table;
  355. sym_node_t* t_node;
  356. dict_col_t* col;
  357. ulint n_cols;
  358. ulint i;
  359. ut_a(exp_node);
  360. if (que_node_get_type(exp_node) == QUE_NODE_FUNC) {
  361. func_node = exp_node;
  362. arg = func_node->args;
  363. while (arg) {
  364. pars_resolve_exp_columns(table_node, arg);
  365. arg = que_node_get_next(arg);
  366. }
  367. return;
  368. }
  369. ut_a(que_node_get_type(exp_node) == QUE_NODE_SYMBOL);
  370. sym_node = exp_node;
  371. if (sym_node->resolved) {
  372. return;
  373. }
  374. /* Not resolved yet: look in the table list for a column with the
  375. same name */
  376. t_node = table_node;
  377. while (t_node) {
  378. table = t_node->table;
  379. n_cols = dict_table_get_n_user_cols(table);
  380. for (i = 0; i < n_cols; i++) {
  381. col = dict_table_get_nth_col(table, i);
  382. if ((sym_node->name_len == ut_strlen(col->name))
  383.     && (0 == ut_memcmp(sym_node->name, col->name,
  384.      sym_node->name_len))) {
  385.      /* Found */
  386. sym_node->resolved = TRUE;
  387. sym_node->token_type = SYM_COLUMN;
  388. sym_node->table = table;
  389. sym_node->col_no = i;
  390. sym_node->prefetch_buf = NULL;
  391. dfield_set_type(&(sym_node->common.val),
  392. dict_col_get_type(col));
  393. return;
  394. }
  395. }
  396. t_node = que_node_get_next(t_node);
  397. }
  398. }
  399. /*************************************************************************
  400. Resolves the meaning of columns in an expression list. */
  401. static
  402. void
  403. pars_resolve_exp_list_columns(
  404. /*==========================*/
  405. sym_node_t* table_node, /* in: first node in a table list */
  406. que_node_t* exp_node) /* in: expression list first node, or
  407. NULL */
  408. {
  409. while (exp_node) {
  410. pars_resolve_exp_columns(table_node, exp_node);
  411. exp_node = que_node_get_next(exp_node);
  412. }
  413. }
  414. /*************************************************************************
  415. Retrieves the stored procedure definition for a procedure name. */
  416. static
  417. void
  418. pars_retrieve_procedure_def(
  419. /*========================*/
  420. sym_node_t* sym_node) /* in: procedure name node */
  421. {
  422. ut_a(sym_node);
  423. ut_a(que_node_get_type(sym_node) == QUE_NODE_SYMBOL);
  424. sym_node->resolved = TRUE;
  425. sym_node->token_type = SYM_PROCEDURE_NAME;
  426. sym_node->procedure_def = dict_procedure_get((char*)sym_node->name,
  427. NULL);
  428. ut_a(sym_node->procedure_def);
  429. }
  430. /*************************************************************************
  431. Retrieves the table definition for a table name id. */
  432. static
  433. void
  434. pars_retrieve_table_def(
  435. /*====================*/
  436. sym_node_t* sym_node) /* in: table node */
  437. {
  438. char* table_name;
  439. ut_a(sym_node);
  440. ut_a(que_node_get_type(sym_node) == QUE_NODE_SYMBOL);
  441. sym_node->resolved = TRUE;
  442. sym_node->token_type = SYM_TABLE;
  443. table_name = (char*) sym_node->name;
  444. sym_node->table = dict_table_get_low(table_name);
  445. ut_a(sym_node->table);
  446. }
  447. /*************************************************************************
  448. Retrieves the table definitions for a list of table name ids. */
  449. static
  450. ulint
  451. pars_retrieve_table_list_defs(
  452. /*==========================*/
  453. /* out: number of tables */
  454. sym_node_t* sym_node) /* in: first table node in list */
  455. {
  456. ulint count = 0;
  457. if (sym_node == NULL) {
  458. return(count);
  459. }
  460. while (sym_node) {
  461. pars_retrieve_table_def(sym_node);
  462. count++;
  463. sym_node = que_node_get_next(sym_node);
  464. }
  465. return(count);
  466. }
  467. /*************************************************************************
  468. Adds all columns to the select list if the query is SELECT * FROM ... */
  469. static
  470. void
  471. pars_select_all_columns(
  472. /*====================*/
  473. sel_node_t* select_node) /* in: select node already containing
  474. the table list */
  475. {
  476. sym_node_t* col_node;
  477. sym_node_t* table_node;
  478. dict_table_t* table;
  479. dict_col_t* col;
  480. ulint i;
  481. select_node->select_list = NULL;
  482. table_node = select_node->table_list;
  483. while (table_node) {
  484. table = table_node->table;
  485. for (i = 0; i < dict_table_get_n_user_cols(table); i++) {
  486. col = dict_table_get_nth_col(table, i);
  487. col_node = sym_tab_add_id(pars_sym_tab_global,
  488. (byte*)col->name,
  489. ut_strlen(col->name));
  490. select_node->select_list
  491. = que_node_list_add_last(
  492. select_node->select_list,
  493. col_node);
  494. }
  495. table_node = que_node_get_next(table_node);
  496. }
  497. }
  498. /*************************************************************************
  499. Parses a select list; creates a query graph node for the whole SELECT
  500. statement. */
  501. sel_node_t*
  502. pars_select_list(
  503. /*=============*/
  504. /* out, own: select node in a query
  505. tree */
  506. que_node_t* select_list, /* in: select list */
  507. sym_node_t* into_list) /* in: variables list or NULL */
  508. {
  509. sel_node_t* node;
  510. node = sel_node_create(pars_sym_tab_global->heap);
  511. node->select_list = select_list;
  512. node->into_list = into_list;
  513. pars_resolve_exp_list_variables_and_types(NULL, into_list);
  514. return(node);
  515. }
  516. /*************************************************************************
  517. Checks if the query is an aggregate query, in which case the selct list must
  518. contain only aggregate function items. */
  519. static
  520. void
  521. pars_check_aggregate(
  522. /*=================*/
  523. sel_node_t* select_node) /* in: select node already containing
  524. the select list */
  525. {
  526. que_node_t* exp_node;
  527. func_node_t* func_node;
  528. ulint n_nodes = 0;
  529. ulint n_aggregate_nodes = 0;
  530. exp_node = select_node->select_list;
  531. while (exp_node) {
  532. n_nodes++;
  533. if (que_node_get_type(exp_node) == QUE_NODE_FUNC) {
  534. func_node = exp_node;
  535. if (func_node->class == PARS_FUNC_AGGREGATE) {
  536. n_aggregate_nodes++;
  537. }
  538. }
  539. exp_node = que_node_get_next(exp_node);
  540. }
  541. if (n_aggregate_nodes > 0) {
  542. ut_a(n_nodes == n_aggregate_nodes);
  543. select_node->is_aggregate = TRUE;
  544. } else {
  545. select_node->is_aggregate = FALSE;
  546. }
  547. }
  548. /*************************************************************************
  549. Parses a select statement. */
  550. sel_node_t*
  551. pars_select_statement(
  552. /*==================*/
  553. /* out, own: select node in a query
  554. tree */
  555. sel_node_t* select_node, /* in: select node already containing
  556. the select list */
  557. sym_node_t* table_list, /* in: table list */
  558. que_node_t* search_cond, /* in: search condition or NULL */
  559. pars_res_word_t* for_update, /* in: NULL or &pars_update_token */
  560. pars_res_word_t* consistent_read,/* in: NULL or
  561. &pars_consistent_token */
  562. order_node_t* order_by) /* in: NULL or an order-by node */
  563. {
  564. select_node->state = SEL_NODE_OPEN;
  565. select_node->table_list = table_list;
  566. select_node->n_tables = pars_retrieve_table_list_defs(table_list);
  567. if (select_node->select_list == &pars_star_denoter) {
  568. /* SELECT * FROM ... */
  569. pars_select_all_columns(select_node);
  570. }
  571. if (select_node->into_list) {
  572. ut_a(que_node_list_get_len(select_node->into_list)
  573. == que_node_list_get_len(select_node->select_list));
  574. }
  575. UT_LIST_INIT(select_node->copy_variables);
  576. pars_resolve_exp_list_columns(table_list, select_node->select_list);
  577. pars_resolve_exp_list_variables_and_types(select_node,
  578. select_node->select_list);
  579. pars_check_aggregate(select_node);
  580. select_node->search_cond = search_cond;
  581. if (search_cond) {
  582. pars_resolve_exp_columns(table_list, search_cond);
  583. pars_resolve_exp_variables_and_types(select_node, search_cond);
  584. }
  585. if (for_update) {
  586. ut_a(!consistent_read);
  587. select_node->set_x_locks = TRUE;
  588. select_node->row_lock_mode = LOCK_X;
  589. } else {
  590. select_node->set_x_locks = FALSE;
  591. select_node->row_lock_mode = LOCK_S;
  592. }
  593. if (consistent_read) {
  594. select_node->consistent_read = TRUE;
  595. } else {
  596. select_node->consistent_read = FALSE;
  597. select_node->read_view = NULL;
  598. }
  599. select_node->order_by = order_by;
  600. if (order_by) {
  601. pars_resolve_exp_columns(table_list, order_by->column);
  602. }
  603. /* The final value of the following fields depend on the environment
  604. where the select statement appears: */
  605. select_node->can_get_updated = FALSE;
  606. select_node->explicit_cursor = NULL;
  607. opt_search_plan(select_node);
  608. return(select_node);
  609. }
  610. /*************************************************************************
  611. Parses a cursor declaration. */
  612. que_node_t*
  613. pars_cursor_declaration(
  614. /*====================*/
  615. /* out: sym_node */
  616. sym_node_t* sym_node, /* in: cursor id node in the symbol
  617. table */
  618. sel_node_t* select_node) /* in: select node */
  619. {
  620. sym_node->resolved = TRUE;
  621. sym_node->token_type = SYM_CURSOR;
  622. sym_node->cursor_def = select_node;
  623. select_node->state = SEL_NODE_CLOSED;
  624. select_node->explicit_cursor = sym_node;
  625. return(sym_node);
  626. }
  627. /*************************************************************************
  628. Parses a delete or update statement start. */
  629. upd_node_t*
  630. pars_update_statement_start(
  631. /*========================*/
  632. /* out, own: update node in a query
  633. tree */
  634. ibool is_delete, /* in: TRUE if delete */
  635. sym_node_t* table_sym, /* in: table name node */
  636. col_assign_node_t* col_assign_list)/* in: column assignment list, NULL
  637. if delete */
  638. {
  639. upd_node_t* node;
  640. node = upd_node_create(pars_sym_tab_global->heap);
  641. node->is_delete = is_delete;
  642. node->table_sym = table_sym;
  643. node->col_assign_list = col_assign_list;
  644. return(node);
  645. }
  646. /*************************************************************************
  647. Parses a column assignment in an update. */
  648. col_assign_node_t*
  649. pars_column_assignment(
  650. /*===================*/
  651. /* out: column assignment node */
  652. sym_node_t* column, /* in: column to assign */
  653. que_node_t* exp) /* in: value to assign */
  654. {
  655. col_assign_node_t* node;
  656. node = mem_heap_alloc(pars_sym_tab_global->heap,
  657. sizeof(col_assign_node_t));
  658. node->common.type = QUE_NODE_COL_ASSIGNMENT;
  659. node->col = column;
  660. node->val = exp;
  661. return(node);
  662. }
  663. /*************************************************************************
  664. Processes an update node assignment list. */
  665. static
  666. void
  667. pars_process_assign_list(
  668. /*=====================*/
  669. upd_node_t* node) /* in: update node */
  670. {
  671. col_assign_node_t* col_assign_list;
  672. sym_node_t* table_sym;
  673. col_assign_node_t* assign_node;
  674. upd_field_t* upd_field;
  675. dict_index_t* clust_index;
  676. sym_node_t* col_sym;
  677. ulint changes_ord_field;
  678. ulint changes_field_size;
  679. ulint n_assigns;
  680. ulint i;
  681. table_sym = node->table_sym;
  682. col_assign_list = node->col_assign_list;
  683. clust_index = dict_table_get_first_index(node->table);
  684. assign_node = col_assign_list;
  685. n_assigns = 0;
  686. while (assign_node) {
  687. pars_resolve_exp_columns(table_sym, assign_node->col);
  688. pars_resolve_exp_columns(table_sym, assign_node->val);
  689. pars_resolve_exp_variables_and_types(NULL, assign_node->val);
  690. /* ut_a(dtype_get_mtype(dfield_get_type(
  691. que_node_get_val(assign_node->col)))
  692.      == dtype_get_mtype(dfield_get_type(
  693. que_node_get_val(assign_node->val)))); */
  694. /* Add to the update node all the columns found in assignment
  695. values as columns to copy: therefore, TRUE */
  696. opt_find_all_cols(TRUE, clust_index, &(node->columns), NULL,
  697. assign_node->val);
  698. n_assigns++;
  699. assign_node = que_node_get_next(assign_node);
  700. }
  701. node->update = upd_create(n_assigns, pars_sym_tab_global->heap);
  702. assign_node = col_assign_list;
  703. changes_field_size = UPD_NODE_NO_SIZE_CHANGE;
  704. for (i = 0; i < n_assigns; i++) {
  705. upd_field = upd_get_nth_field(node->update, i);
  706. col_sym = assign_node->col;
  707. upd_field_set_field_no(upd_field,
  708. dict_index_get_nth_col_pos(clust_index,
  709. col_sym->col_no),
  710. clust_index);
  711. upd_field->exp = assign_node->val;
  712. if (!dtype_is_fixed_size(
  713. dict_index_get_nth_type(clust_index,
  714. upd_field->field_no))) {
  715. changes_field_size = 0;
  716. }
  717. assign_node = que_node_get_next(assign_node);
  718. }
  719. /* Find out if the update can modify an ordering field in any index */
  720. changes_ord_field = UPD_NODE_NO_ORD_CHANGE;
  721. if (row_upd_changes_some_index_ord_field(node->table, node->update)) {
  722. changes_ord_field = 0;
  723. }
  724. node->cmpl_info = changes_ord_field | changes_field_size;
  725. }
  726. /*************************************************************************
  727. Parses an update or delete statement. */
  728. upd_node_t*
  729. pars_update_statement(
  730. /*==================*/
  731. /* out, own: update node in a query
  732. tree */
  733. upd_node_t* node, /* in: update node */
  734. sym_node_t* cursor_sym, /* in: pointer to a cursor entry in
  735. the symbol table or NULL */
  736. que_node_t* search_cond) /* in: search condition or NULL */
  737. {
  738. sym_node_t* table_sym;
  739. sel_node_t* sel_node;
  740. plan_t* plan;
  741. table_sym = node->table_sym;
  742. pars_retrieve_table_def(table_sym);
  743. node->table = table_sym->table;
  744. UT_LIST_INIT(node->columns);
  745. /* Make the single table node into a list of table nodes of length 1 */
  746. que_node_list_add_last(NULL, table_sym);
  747. if (cursor_sym) {
  748. pars_resolve_exp_variables_and_types(NULL, cursor_sym);
  749. sel_node = cursor_sym->alias->cursor_def;
  750. node->searched_update = FALSE;
  751. } else {
  752. sel_node = pars_select_list(NULL, NULL);
  753. pars_select_statement(sel_node, table_sym, search_cond, NULL,
  754. NULL, NULL);
  755. node->searched_update = TRUE;
  756. sel_node->common.parent = node;
  757. }
  758. node->select = sel_node;
  759. ut_a(!node->is_delete || (node->col_assign_list == NULL));
  760. ut_a(node->is_delete || (node->col_assign_list != NULL));
  761. if (node->is_delete) {
  762. node->cmpl_info = 0;
  763. } else {
  764. pars_process_assign_list(node);
  765. }
  766. if (node->searched_update) {
  767. node->has_clust_rec_x_lock = TRUE;
  768. sel_node->set_x_locks = TRUE;
  769. sel_node->row_lock_mode = LOCK_X;
  770. } else {
  771. node->has_clust_rec_x_lock = sel_node->set_x_locks;
  772. }
  773. ut_a(sel_node->n_tables == 1);
  774. ut_a(sel_node->consistent_read == FALSE);
  775. ut_a(sel_node->order_by == NULL);
  776. ut_a(sel_node->is_aggregate == FALSE);
  777. sel_node->can_get_updated = TRUE;
  778. node->state = UPD_NODE_UPDATE_CLUSTERED;
  779. plan = sel_node_get_nth_plan(sel_node, 0);
  780. plan->no_prefetch = TRUE;
  781. if (!((plan->index)->type & DICT_CLUSTERED)) {
  782. plan->must_get_clust = TRUE;
  783. node->pcur = &(plan->clust_pcur);
  784. } else {
  785. node->pcur = &(plan->pcur);
  786. }
  787. if (!node->is_delete && node->searched_update
  788. && (node->cmpl_info & UPD_NODE_NO_SIZE_CHANGE)
  789. && (node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) {
  790. /* The select node can perform the update in-place */
  791. ut_a(plan->asc);
  792. node->select_will_do_update = TRUE;
  793. sel_node->select_will_do_update = TRUE;
  794. sel_node->latch_mode = BTR_MODIFY_LEAF;
  795. }
  796. return(node);
  797. }
  798. /*************************************************************************
  799. Parses an insert statement. */
  800. ins_node_t*
  801. pars_insert_statement(
  802. /*==================*/
  803. /* out, own: update node in a query
  804. tree */
  805. sym_node_t* table_sym, /* in: table name node */
  806. que_node_t*  values_list, /* in: value expression list or NULL */
  807. sel_node_t* select) /* in: select condition or NULL */
  808. {
  809. ins_node_t* node;
  810. dtuple_t* row;
  811. ulint ins_type;
  812. ut_a(values_list || select);
  813. ut_a(!values_list || !select);
  814. if (values_list) {
  815. ins_type = INS_VALUES;
  816. } else {
  817. ins_type = INS_SEARCHED;
  818. }
  819. pars_retrieve_table_def(table_sym);
  820. node = ins_node_create(ins_type, table_sym->table,
  821. pars_sym_tab_global->heap);
  822. row = dtuple_create(pars_sym_tab_global->heap,
  823. dict_table_get_n_cols(node->table));
  824. dict_table_copy_types(row, table_sym->table);
  825. ins_node_set_new_row(node, row);
  826. node->select = select;
  827. if (select) {
  828. select->common.parent = node;
  829. ut_a(que_node_list_get_len(select->select_list)
  830. == dict_table_get_n_user_cols(table_sym->table));
  831. }
  832. node->values_list = values_list;
  833. if (node->values_list) {
  834. pars_resolve_exp_list_variables_and_types(NULL, values_list);
  835. ut_a(que_node_list_get_len(values_list)
  836. == dict_table_get_n_user_cols(table_sym->table));
  837. }
  838. return(node);
  839. }
  840. /*************************************************************************
  841. Set the type of a dfield. */
  842. static
  843. void
  844. pars_set_dfield_type(
  845. /*=================*/
  846. dfield_t* dfield, /* in: dfield */
  847. pars_res_word_t* type) /* in: pointer to a type token */
  848. {
  849. if (type == &pars_int_token) {
  850. dtype_set(dfield_get_type(dfield), DATA_INT, 0, 4, 0);
  851. } else if (type == &pars_char_token) {
  852. dtype_set(dfield_get_type(dfield), DATA_VARCHAR,
  853. DATA_ENGLISH, 0, 0);
  854. } else {
  855. ut_error;
  856. }
  857. }
  858. /*************************************************************************
  859. Parses a variable declaration. */
  860. sym_node_t*
  861. pars_variable_declaration(
  862. /*======================*/
  863. /* out, own: symbol table node of type
  864. SYM_VAR */
  865. sym_node_t* node, /* in: symbol table node allocated for the
  866. id of the variable */
  867. pars_res_word_t* type) /* in: pointer to a type token */
  868. {
  869. node->resolved = TRUE;
  870. node->token_type = SYM_VAR;
  871. node->param_type = PARS_NOT_PARAM;
  872. pars_set_dfield_type(que_node_get_val(node), type);
  873. return(node);
  874. }
  875. /*************************************************************************
  876. Parses a procedure parameter declaration. */
  877. sym_node_t*
  878. pars_parameter_declaration(
  879. /*=======================*/
  880. /* out, own: symbol table node of type
  881. SYM_VAR */
  882. sym_node_t* node, /* in: symbol table node allocated for the
  883. id of the parameter */
  884. ulint param_type,
  885. /* in: PARS_INPUT or PARS_OUTPUT */
  886. pars_res_word_t* type) /* in: pointer to a type token */
  887. {
  888. ut_a((param_type == PARS_INPUT) || (param_type == PARS_OUTPUT));
  889. pars_variable_declaration(node, type);
  890. node->param_type = param_type;
  891. return(node);
  892. }
  893. /*************************************************************************
  894. Sets the parent field in a query node list. */
  895. static
  896. void
  897. pars_set_parent_in_list(
  898. /*====================*/
  899. que_node_t* node_list, /* in: first node in a list */
  900. que_node_t* parent) /* in: parent value to set in all
  901. nodes of the list */
  902. {
  903. que_common_t* common;
  904. common = node_list;
  905. while (common) {
  906. common->parent = parent;
  907. common = que_node_get_next(common);
  908. }
  909. }
  910. /*************************************************************************
  911. Parses an elsif element. */
  912. elsif_node_t*
  913. pars_elsif_element(
  914. /*===============*/
  915. /* out: elsif node */
  916. que_node_t* cond, /* in: if-condition */
  917. que_node_t* stat_list) /* in: statement list */
  918. {
  919. elsif_node_t* node;
  920. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(elsif_node_t));
  921. node->common.type = QUE_NODE_ELSIF;
  922. node->cond = cond;
  923. pars_resolve_exp_variables_and_types(NULL, cond);
  924. node->stat_list = stat_list;
  925. return(node);
  926. }
  927. /*************************************************************************
  928. Parses an if-statement. */
  929. if_node_t*
  930. pars_if_statement(
  931. /*==============*/
  932. /* out: if-statement node */
  933. que_node_t* cond, /* in: if-condition */
  934. que_node_t* stat_list, /* in: statement list */
  935. que_node_t* else_part) /* in: else-part statement list
  936. or elsif element list */
  937. {
  938. if_node_t* node;
  939. elsif_node_t* elsif_node;
  940. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(if_node_t));
  941. node->common.type = QUE_NODE_IF;
  942. node->cond = cond;
  943. pars_resolve_exp_variables_and_types(NULL, cond);
  944. node->stat_list = stat_list;
  945. if (else_part && (que_node_get_type(else_part) == QUE_NODE_ELSIF)) {
  946. /* There is a list of elsif conditions */
  947. node->else_part = NULL;
  948. node->elsif_list = else_part;
  949. elsif_node = else_part;
  950. while (elsif_node) {
  951. pars_set_parent_in_list(elsif_node->stat_list, node);
  952. elsif_node = que_node_get_next(elsif_node);
  953. }
  954. } else {
  955. node->else_part = else_part;
  956. node->elsif_list = NULL;
  957. pars_set_parent_in_list(else_part, node);
  958. }
  959. pars_set_parent_in_list(stat_list, node);
  960. return(node);
  961. }
  962. /*************************************************************************
  963. Parses a while-statement. */
  964. while_node_t*
  965. pars_while_statement(
  966. /*=================*/
  967. /* out: while-statement node */
  968. que_node_t* cond, /* in: while-condition */
  969. que_node_t* stat_list) /* in: statement list */
  970. {
  971. while_node_t* node;
  972. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(while_node_t));
  973. node->common.type = QUE_NODE_WHILE;
  974. node->cond = cond;
  975. pars_resolve_exp_variables_and_types(NULL, cond);
  976. node->stat_list = stat_list;
  977. pars_set_parent_in_list(stat_list, node);
  978. return(node);
  979. }
  980. /*************************************************************************
  981. Parses a for-loop-statement. */
  982. for_node_t*
  983. pars_for_statement(
  984. /*===============*/
  985. /* out: for-statement node */
  986. sym_node_t* loop_var, /* in: loop variable */
  987. que_node_t* loop_start_limit,/* in: loop start expression */
  988. que_node_t* loop_end_limit, /* in: loop end expression */
  989. que_node_t* stat_list) /* in: statement list */
  990. {
  991. for_node_t* node;
  992. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(for_node_t));
  993. node->common.type = QUE_NODE_FOR;
  994. pars_resolve_exp_variables_and_types(NULL, loop_var);
  995. pars_resolve_exp_variables_and_types(NULL, loop_start_limit);
  996. pars_resolve_exp_variables_and_types(NULL, loop_end_limit);
  997. node->loop_var = loop_var->indirection;
  998. ut_a(loop_var->indirection);
  999. node->loop_start_limit = loop_start_limit;
  1000. node->loop_end_limit = loop_end_limit;
  1001. node->stat_list = stat_list;
  1002. pars_set_parent_in_list(stat_list, node);
  1003. return(node);
  1004. }
  1005. /*************************************************************************
  1006. Parses a return-statement. */
  1007. return_node_t*
  1008. pars_return_statement(void)
  1009. /*=======================*/
  1010. /* out: return-statement node */
  1011. {
  1012. return_node_t* node;
  1013. node = mem_heap_alloc(pars_sym_tab_global->heap,
  1014. sizeof(return_node_t));
  1015. node->common.type = QUE_NODE_RETURN;
  1016. return(node);
  1017. }
  1018. /*************************************************************************
  1019. Parses an assignment statement. */
  1020. assign_node_t*
  1021. pars_assignment_statement(
  1022. /*======================*/
  1023. /* out: assignment statement node */
  1024. sym_node_t* var, /* in: variable to assign */
  1025. que_node_t* val) /* in: value to assign */
  1026. {
  1027. assign_node_t* node;
  1028. node = mem_heap_alloc(pars_sym_tab_global->heap,
  1029. sizeof(assign_node_t));
  1030. node->common.type = QUE_NODE_ASSIGNMENT;
  1031. node->var = var;
  1032. node->val = val;
  1033. pars_resolve_exp_variables_and_types(NULL, var);
  1034. pars_resolve_exp_variables_and_types(NULL, val);
  1035. ut_a(dtype_get_mtype(dfield_get_type(que_node_get_val(var)))
  1036.       == dtype_get_mtype(dfield_get_type(que_node_get_val(val))));
  1037. return(node);
  1038. }
  1039. /*************************************************************************
  1040. Parses a procedure call. */
  1041. func_node_t*
  1042. pars_procedure_call(
  1043. /*================*/
  1044. /* out: function node */
  1045. que_node_t* res_word,/* in: procedure name reserved word */
  1046. que_node_t* args) /* in: argument list */
  1047. {
  1048. func_node_t* node;
  1049. node = pars_func(res_word, args);
  1050. pars_resolve_exp_list_variables_and_types(NULL, args);
  1051. return(node);
  1052. }
  1053. /*************************************************************************
  1054. Parses a fetch statement. */
  1055. fetch_node_t*
  1056. pars_fetch_statement(
  1057. /*=================*/
  1058. /* out: fetch statement node */
  1059. sym_node_t* cursor, /* in: cursor node */
  1060. sym_node_t* into_list) /* in: variables to set */
  1061. {
  1062. sym_node_t* cursor_decl;
  1063. fetch_node_t* node;
  1064. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(fetch_node_t));
  1065. node->common.type = QUE_NODE_FETCH;
  1066. pars_resolve_exp_variables_and_types(NULL, cursor);
  1067. pars_resolve_exp_list_variables_and_types(NULL, into_list);
  1068. node->into_list = into_list;
  1069. cursor_decl = cursor->alias;
  1070. ut_a(cursor_decl->token_type == SYM_CURSOR);
  1071. node->cursor_def = cursor_decl->cursor_def;
  1072. ut_a(que_node_list_get_len(into_list)
  1073. == que_node_list_get_len(node->cursor_def->select_list));
  1074. return(node);
  1075. }
  1076. /*************************************************************************
  1077. Parses an open or close cursor statement. */
  1078. open_node_t*
  1079. pars_open_statement(
  1080. /*================*/
  1081. /* out: fetch statement node */
  1082. ulint type, /* in: ROW_SEL_OPEN_CURSOR
  1083. or ROW_SEL_CLOSE_CURSOR */
  1084. sym_node_t* cursor) /* in: cursor node */
  1085. {
  1086. sym_node_t* cursor_decl;
  1087. open_node_t* node;
  1088. node = mem_heap_alloc(pars_sym_tab_global->heap, sizeof(open_node_t));
  1089. node->common.type = QUE_NODE_OPEN;
  1090. pars_resolve_exp_variables_and_types(NULL, cursor);
  1091. cursor_decl = cursor->alias;
  1092. ut_a(cursor_decl->token_type == SYM_CURSOR);
  1093. node->op_type = type;
  1094. node->cursor_def = cursor_decl->cursor_def;
  1095. return(node);
  1096. }
  1097. /*************************************************************************
  1098. Parses a row_printf-statement. */
  1099. row_printf_node_t*
  1100. pars_row_printf_statement(
  1101. /*======================*/
  1102. /* out: row_printf-statement node */
  1103. sel_node_t* sel_node) /* in: select node */
  1104. {
  1105. row_printf_node_t* node;
  1106. node = mem_heap_alloc(pars_sym_tab_global->heap,
  1107. sizeof(row_printf_node_t));
  1108. node->common.type = QUE_NODE_ROW_PRINTF;
  1109. node->sel_node = sel_node;
  1110. sel_node->common.parent = node;
  1111. return(node);
  1112. }
  1113. /*************************************************************************
  1114. Parses a commit statement. */
  1115. commit_node_t*
  1116. pars_commit_statement(void)
  1117. /*=======================*/
  1118. {
  1119. return(commit_node_create(pars_sym_tab_global->heap));
  1120. }
  1121. /*************************************************************************
  1122. Parses a rollback statement. */
  1123. roll_node_t*
  1124. pars_rollback_statement(void)
  1125. /*=========================*/
  1126. {
  1127. return(roll_node_create(pars_sym_tab_global->heap));
  1128. }
  1129. /*************************************************************************
  1130. Parses a column definition at a table creation. */
  1131. sym_node_t*
  1132. pars_column_def(
  1133. /*============*/
  1134. /* out: column sym table node */
  1135. sym_node_t* sym_node, /* in: column node in the symbol
  1136. table */
  1137. pars_res_word_t* type) /* in: data type */
  1138. {
  1139. pars_set_dfield_type(que_node_get_val(sym_node), type);
  1140. return(sym_node);
  1141. }
  1142. /*************************************************************************
  1143. Parses a table creation operation. */
  1144. tab_node_t*
  1145. pars_create_table(
  1146. /*==============*/
  1147. /* out: table create subgraph */
  1148. sym_node_t* table_sym, /* in: table name node in the symbol
  1149. table */
  1150. sym_node_t* column_defs, /* in: list of column names */
  1151. void* not_fit_in_memory)/* in: a non-NULL pointer means that
  1152. this is a table which in simulations
  1153. should be simulated as not fitting
  1154. in memory; thread is put to sleep
  1155. to simulate disk accesses; NOTE that
  1156. this flag is not stored to the data
  1157. dictionary on disk, and the database
  1158. will forget about non-NULL value if
  1159. it has to reload the table definition
  1160. from disk */
  1161. {
  1162. dict_table_t* table;
  1163. sym_node_t* column;
  1164. tab_node_t* node;
  1165. dtype_t* dtype;
  1166. ulint n_cols;
  1167. n_cols = que_node_list_get_len(column_defs);
  1168. table = dict_mem_table_create(table_sym->name, 0, n_cols);
  1169. if (not_fit_in_memory != NULL) {
  1170. table->does_not_fit_in_memory = TRUE;
  1171. }
  1172. column = column_defs;
  1173. while (column) {
  1174. dtype = dfield_get_type(que_node_get_val(column));
  1175. dict_mem_table_add_col(table, column->name, dtype->mtype,
  1176. dtype->prtype, dtype->len,
  1177. dtype->prec);
  1178. column->resolved = TRUE;
  1179. column->token_type = SYM_COLUMN;
  1180. column = que_node_get_next(column);
  1181. }
  1182. node = tab_create_graph_create(table, pars_sym_tab_global->heap);
  1183. table_sym->resolved = TRUE;
  1184. table_sym->token_type = SYM_TABLE;
  1185. return(node);
  1186. }
  1187. /*************************************************************************
  1188. Parses an index creation operation. */
  1189. ind_node_t*
  1190. pars_create_index(
  1191. /*==============*/
  1192. /* out: index create subgraph */
  1193. pars_res_word_t* unique_def, /* in: not NULL if a unique index */
  1194. pars_res_word_t* clustered_def, /* in: not NULL if a clustered index */
  1195. sym_node_t* index_sym, /* in: index name node in the symbol
  1196. table */
  1197. sym_node_t* table_sym, /* in: table name node in the symbol
  1198. table */
  1199. sym_node_t* column_list) /* in: list of column names */
  1200. {
  1201. dict_index_t* index;
  1202. sym_node_t* column;
  1203. ind_node_t* node;
  1204. ulint n_fields;
  1205. ulint ind_type;
  1206. n_fields = que_node_list_get_len(column_list);
  1207. ind_type = 0;
  1208. if (unique_def) {
  1209. ind_type = ind_type | DICT_UNIQUE;
  1210. }
  1211. if (clustered_def) {
  1212. ind_type = ind_type | DICT_CLUSTERED;
  1213. }
  1214. index = dict_mem_index_create(table_sym->name, index_sym->name, 0,
  1215. ind_type, n_fields);
  1216. column = column_list;
  1217. while (column) {
  1218. dict_mem_index_add_field(index, column->name, 0);
  1219. column->resolved = TRUE;
  1220. column->token_type = SYM_COLUMN;
  1221. column = que_node_get_next(column);
  1222. }
  1223. node = ind_create_graph_create(index, pars_sym_tab_global->heap);
  1224. table_sym->resolved = TRUE;
  1225. table_sym->token_type = SYM_TABLE;
  1226. index_sym->resolved = TRUE;
  1227. index_sym->token_type = SYM_TABLE;
  1228. return(node);
  1229. }
  1230. /*************************************************************************
  1231. Parses a procedure definition. */
  1232. que_fork_t*
  1233. pars_procedure_definition(
  1234. /*======================*/
  1235. /* out: query fork node */
  1236. sym_node_t* sym_node, /* in: procedure id node in the symbol
  1237. table */
  1238. sym_node_t* param_list, /* in: parameter declaration list */
  1239. que_node_t* stat_list) /* in: statement list */
  1240. {
  1241. proc_node_t* node;
  1242. que_fork_t* fork;
  1243. que_thr_t* thr;
  1244. mem_heap_t* heap;
  1245. heap = pars_sym_tab_global->heap;
  1246. fork = que_fork_create(NULL, NULL, QUE_FORK_PROCEDURE, heap);
  1247. fork->trx = NULL;
  1248. thr = que_thr_create(fork, heap);
  1249. node = mem_heap_alloc(heap, sizeof(proc_node_t));
  1250. node->common.type = QUE_NODE_PROC;
  1251. node->common.parent = thr;
  1252. sym_node->token_type = SYM_PROCEDURE_NAME;
  1253. sym_node->resolved = TRUE;
  1254. node->proc_id = sym_node;
  1255. node->param_list = param_list;
  1256. node->stat_list = stat_list;
  1257. pars_set_parent_in_list(stat_list, node);
  1258. node->sym_tab = pars_sym_tab_global;
  1259. thr->child = node;
  1260.   pars_sym_tab_global->query_graph = fork;
  1261. return(fork);
  1262. }
  1263. /*****************************************************************
  1264. Parses a stored procedure call, when this is not within another stored
  1265. procedure, that is, the client issues a procedure call directly. */
  1266. que_fork_t*
  1267. pars_stored_procedure_call(
  1268. /*=======================*/
  1269. /* out: query graph */
  1270. sym_node_t* sym_node) /* in: stored procedure name */
  1271. {
  1272. call_node_t* node;
  1273. que_fork_t* fork;
  1274. que_thr_t* thr;
  1275. mem_heap_t* heap;
  1276. heap = pars_sym_tab_global->heap;
  1277. fork = que_fork_create(NULL, NULL, QUE_FORK_PROCEDURE_CALL, heap);
  1278. fork->trx = NULL;
  1279. thr = que_thr_create(fork, heap);
  1280. node = mem_heap_alloc(heap, sizeof(call_node_t));
  1281. thr->child = node;
  1282. node->common.type = QUE_NODE_CALL;
  1283. node->common.parent = thr;
  1284. sym_node->token_type = SYM_PROCEDURE_NAME;
  1285. pars_retrieve_procedure_def(sym_node);
  1286. node->procedure_def = sym_node->procedure_def;
  1287. node->proc_name = sym_node;
  1288. node->sym_tab = pars_sym_tab_global;
  1289.   pars_sym_tab_global->query_graph = fork;
  1290. return(fork);
  1291. }
  1292. /*****************************************************************
  1293. Writes info about query parameter markers (denoted with '?' in ODBC) into a
  1294. buffer. */
  1295. ulint
  1296. pars_write_query_param_info(
  1297. /*========================*/
  1298. /* out: number of bytes used for info in buf */
  1299. byte* buf, /* in: buffer which must be big enough */
  1300. que_fork_t* graph) /* in: parsed query graph */
  1301. {
  1302. que_thr_t* thr;
  1303. call_node_t* call_node;
  1304. dict_proc_t* procedure_def;
  1305. que_t* stored_graph;
  1306. proc_node_t* proc_node;
  1307. sym_node_t* param;
  1308. ulint n_params;
  1309. ibool is_input;
  1310. /* We currently support parameter markers only in stored procedure
  1311. calls, and there ALL procedure parameters must be marked with '?':
  1312. no literal values are allowed */
  1313. thr = UT_LIST_GET_FIRST(graph->thrs);
  1314. n_params = 0;
  1315. if (que_node_get_type(thr->child) == QUE_NODE_CALL) {
  1316. call_node = thr->child;
  1317. procedure_def = call_node->procedure_def;
  1318. stored_graph = dict_procedure_reserve_parsed_copy(
  1319. procedure_def);
  1320. proc_node = que_fork_get_child(stored_graph);
  1321. param = proc_node->param_list;
  1322. while (param) {
  1323. if (param->param_type == PARS_INPUT) {
  1324. is_input = TRUE;
  1325. } else {
  1326. is_input = FALSE;
  1327. }
  1328. mach_write_to_1(buf + 4 + n_params, is_input);
  1329. n_params++;
  1330. param = que_node_get_next(param);
  1331. }
  1332. dict_procedure_release_parsed_copy(stored_graph);
  1333. }
  1334. mach_write_to_4(buf, n_params);
  1335. return(4 + n_params);
  1336. }
  1337. /*****************************************************************
  1338. Reads stored procedure input parameter values from a buffer. */
  1339. void
  1340. pars_proc_read_input_params_from_buf(
  1341. /*=================================*/
  1342. que_t* graph, /* in: query graph which contains a stored procedure */
  1343. byte* buf) /* in: buffer */
  1344. {
  1345. que_thr_t* thr;
  1346. proc_node_t* proc_node;
  1347. sym_node_t* param;
  1348. byte* ptr;
  1349. ulint len;
  1350. lint odbc_len;
  1351. ut_ad(graph->fork_type == QUE_FORK_PROCEDURE);
  1352. thr = UT_LIST_GET_FIRST(graph->thrs);
  1353. proc_node = thr->child;
  1354. ptr = buf;
  1355. param = proc_node->param_list;
  1356. while (param) {
  1357. if (param->param_type == PARS_INPUT) {
  1358. odbc_len = (lint)mach_read_from_4(ptr);
  1359. ptr += 4;
  1360. if (odbc_len == SQL_NULL_DATA) {
  1361. len = UNIV_SQL_NULL;
  1362. } else {
  1363. len = (ulint)odbc_len;
  1364. }
  1365.   eval_node_copy_and_alloc_val(param, ptr, len);
  1366. if (len != UNIV_SQL_NULL) {
  1367. ptr += len;
  1368. }
  1369. }
  1370. param = que_node_get_next(param);
  1371. }
  1372. ut_ad(ptr - buf < ODBC_DATAGRAM_SIZE);
  1373. }
  1374. /*****************************************************************
  1375. Writes stored procedure output parameter values to a buffer. */
  1376. ulint
  1377. pars_proc_write_output_params_to_buf(
  1378. /*=================================*/
  1379. /* out: bytes used in buf */
  1380. byte* buf, /* in: buffer which must be big enough */
  1381. que_t* graph) /* in: query graph which contains a stored procedure */
  1382. {
  1383. que_thr_t* thr;
  1384. proc_node_t* proc_node;
  1385. sym_node_t* param;
  1386. dfield_t* dfield;
  1387. byte* ptr;
  1388. ulint len;
  1389. lint odbc_len;
  1390. ut_ad(graph->fork_type == QUE_FORK_PROCEDURE);
  1391. thr = UT_LIST_GET_FIRST(graph->thrs);
  1392. proc_node = thr->child;
  1393. ptr = buf;
  1394. param = proc_node->param_list;
  1395. while (param) {
  1396. if (param->param_type == PARS_OUTPUT) {
  1397. dfield = que_node_get_val(param);
  1398. len = dfield_get_len(dfield);
  1399. if (len == UNIV_SQL_NULL) {
  1400. odbc_len = SQL_NULL_DATA;
  1401. } else {
  1402. odbc_len = (lint)len;
  1403. }
  1404. mach_write_to_4(ptr, (ulint)odbc_len);
  1405. ptr += 4;
  1406. if (len != UNIV_SQL_NULL) {
  1407. ut_memcpy(ptr, dfield_get_data(dfield), len);
  1408. ptr += len;
  1409. }
  1410. }
  1411. param = que_node_get_next(param);
  1412. }
  1413. ut_ad(ptr - buf < ODBC_DATAGRAM_SIZE);
  1414. return((ulint)(ptr - buf));
  1415. }
  1416. /*****************************************************************
  1417. Retrieves characters to the lexical analyzer. */
  1418. void
  1419. pars_get_lex_chars(
  1420. /*===============*/
  1421. char* buf, /* in/out: buffer where to copy */
  1422. int* result, /* out: number of characters copied or EOF */
  1423. int max_size) /* in: maximum number of characters which fit
  1424. in the buffer */
  1425. {
  1426. int len;
  1427. char print_buf[16];
  1428. len = pars_sym_tab_global->string_len
  1429. - pars_sym_tab_global->next_char_pos;
  1430. if (len == 0) {
  1431. #ifdef YYDEBUG
  1432. /* printf("SQL string endsn"); */
  1433. #endif
  1434. *result = 0;
  1435. return;
  1436. }
  1437. if (len > max_size) {
  1438. len = max_size;
  1439. }
  1440. if (pars_print_lexed) {
  1441. if (len >= 5) {
  1442. len = 5;
  1443. }
  1444. ut_memcpy(print_buf, pars_sym_tab_global->sql_string +
  1445. pars_sym_tab_global->next_char_pos, len);
  1446. print_buf[len] = '';
  1447. printf("%s", print_buf);
  1448. }
  1449. ut_memcpy(buf, pars_sym_tab_global->sql_string +
  1450. pars_sym_tab_global->next_char_pos, len);
  1451. *result = len;
  1452. pars_sym_tab_global->next_char_pos += len;
  1453. }
  1454. /*****************************************************************
  1455. Instructs the lexical analyzer to stop when it receives the EOF integer. */
  1456. int
  1457. yywrap(void)
  1458. /*========*/
  1459. /* out: returns TRUE */
  1460. {
  1461. return(1);
  1462. }
  1463. /*****************************************************************
  1464. Called by yyparse on error. */
  1465. void
  1466. yyerror(
  1467. /*====*/
  1468.         char* s) /* in: error message string */
  1469. {
  1470. ut_ad(s);
  1471. printf("PARSER ERROR: Syntax error in SQL stringn");
  1472. ut_error;
  1473. }
  1474. /*****************************************************************
  1475. Parses an SQL string returning the query graph. */
  1476. que_t*
  1477. pars_sql(
  1478. /*=====*/
  1479. /* out, own: the query graph */
  1480. char* str) /* in: SQL string */
  1481. {
  1482. sym_node_t* sym_node;
  1483. mem_heap_t* heap;
  1484. que_t* graph;
  1485. ulint len;
  1486. char* buf;
  1487. ut_ad(str);
  1488. heap = mem_heap_create(256);
  1489. /* Currently, the parser is not reentrant: */
  1490. ut_ad(mutex_own(&(dict_sys->mutex)));
  1491. pars_sym_tab_global = sym_tab_create(heap);
  1492. len = ut_strlen(str);
  1493. buf = mem_heap_alloc(heap, len + 1);
  1494. ut_memcpy(buf, str, len + 1);
  1495. pars_sym_tab_global->sql_string = buf;
  1496. pars_sym_tab_global->string_len = len;
  1497. pars_sym_tab_global->next_char_pos = 0;
  1498. yyparse();
  1499. sym_node = UT_LIST_GET_FIRST(pars_sym_tab_global->sym_list);
  1500. while (sym_node) {
  1501. ut_a(sym_node->resolved);
  1502. sym_node = UT_LIST_GET_NEXT(sym_list, sym_node);
  1503. }
  1504. graph = pars_sym_tab_global->query_graph;
  1505. graph->sym_tab = pars_sym_tab_global;
  1506. /* printf("SQL graph size %lun", mem_heap_get_size(heap)); */
  1507. return(graph);
  1508. }
  1509. /**********************************************************************
  1510. Completes a query graph by adding query thread and fork nodes
  1511. above it and prepares the graph for running. The fork created is of
  1512. type QUE_FORK_MYSQL_INTERFACE. */
  1513. que_thr_t*
  1514. pars_complete_graph_for_exec(
  1515. /*=========================*/
  1516. /* out: query thread node to run */
  1517. que_node_t* node, /* in: root node for an incomplete
  1518. query graph */
  1519. trx_t* trx, /* in: transaction handle */
  1520. mem_heap_t* heap) /* in: memory heap from which allocated */
  1521. {
  1522. que_fork_t* fork;
  1523. que_thr_t* thr;
  1524. fork = que_fork_create(NULL, NULL, QUE_FORK_MYSQL_INTERFACE, heap);
  1525. fork->trx = trx;
  1526. thr = que_thr_create(fork, heap);
  1527. thr->child = node;
  1528. que_node_set_parent(node, thr);
  1529. mutex_enter(&kernel_mutex);
  1530. trx->graph = NULL;
  1531. mutex_exit(&kernel_mutex);
  1532. return(thr);
  1533. }