pars0pars.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:44k
源码类别:

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