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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. SQL parser
  3. (c) 1996 Innobase Oy
  4. Created 11/19/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef pars0pars_h
  7. #define pars0pars_h
  8. #include "univ.i"
  9. #include "que0types.h"
  10. #include "usr0types.h"
  11. #include "pars0types.h"
  12. #include "row0types.h"
  13. #include "trx0types.h"
  14. extern int yydebug;
  15. /* If the following is set TRUE, the lexer will print the SQL string
  16. as it tokenizes it */
  17. #ifdef UNIV_SQL_DEBUG
  18. extern ibool pars_print_lexed;
  19. #endif /* UNIV_SQL_DEBUG */
  20. /* Global variable used while parsing a single procedure or query : the code is
  21. NOT re-entrant */
  22. extern sym_tab_t* pars_sym_tab_global;
  23. extern pars_res_word_t pars_to_char_token;
  24. extern pars_res_word_t pars_to_number_token;
  25. extern pars_res_word_t pars_to_binary_token;
  26. extern pars_res_word_t pars_binary_to_number_token;
  27. extern pars_res_word_t pars_substr_token;
  28. extern pars_res_word_t pars_replstr_token;
  29. extern pars_res_word_t pars_concat_token;
  30. extern pars_res_word_t pars_length_token;
  31. extern pars_res_word_t pars_instr_token;
  32. extern pars_res_word_t pars_sysdate_token;
  33. extern pars_res_word_t pars_printf_token;
  34. extern pars_res_word_t pars_assert_token;
  35. extern pars_res_word_t pars_rnd_token;
  36. extern pars_res_word_t pars_rnd_str_token;
  37. extern pars_res_word_t pars_count_token;
  38. extern pars_res_word_t pars_sum_token;
  39. extern pars_res_word_t pars_distinct_token;
  40. extern pars_res_word_t pars_int_token;
  41. extern pars_res_word_t pars_char_token;
  42. extern pars_res_word_t pars_float_token;
  43. extern pars_res_word_t pars_update_token;
  44. extern pars_res_word_t pars_asc_token;
  45. extern pars_res_word_t pars_desc_token;
  46. extern pars_res_word_t pars_open_token;
  47. extern pars_res_word_t pars_close_token;
  48. extern pars_res_word_t pars_consistent_token;
  49. extern pars_res_word_t pars_unique_token;
  50. extern pars_res_word_t pars_clustered_token;
  51. extern ulint pars_star_denoter;
  52. /* Procedure parameter types */
  53. #define PARS_INPUT 0
  54. #define PARS_OUTPUT 1
  55. #define PARS_NOT_PARAM 2
  56. int
  57. yyparse(void);
  58. /*****************************************************************
  59. Parses an SQL string returning the query graph. */
  60. que_t*
  61. pars_sql(
  62. /*=====*/
  63. /* out, own: the query graph */
  64. const char* str); /* in: SQL string */
  65. /*****************************************************************
  66. Retrieves characters to the lexical analyzer. */
  67. void
  68. pars_get_lex_chars(
  69. /*===============*/
  70. char* buf, /* in/out: buffer where to copy */
  71. int* result, /* out: number of characters copied or EOF */
  72. int max_size); /* in: maximum number of characters which fit
  73. in the buffer */
  74. /*****************************************************************
  75. Called by yyparse on error. */
  76. void
  77. yyerror(
  78. /*====*/
  79. const char* s); /* in: error message string */
  80. /*************************************************************************
  81. Parses a variable declaration. */
  82. sym_node_t*
  83. pars_variable_declaration(
  84. /*======================*/
  85. /* out, own: symbol table node of type
  86. SYM_VAR */
  87. sym_node_t* node, /* in: symbol table node allocated for the
  88. id of the variable */
  89. pars_res_word_t* type); /* in: pointer to a type token */
  90. /*************************************************************************
  91. Parses a function expression. */
  92. func_node_t*
  93. pars_func(
  94. /*======*/
  95. /* out, own: function node in a query tree */
  96. que_node_t*  res_word,/* in: function name reserved word */
  97. que_node_t* arg); /* in: first argument in the argument list */
  98. /*************************************************************************
  99. Parses an operator expression. */
  100. func_node_t*
  101. pars_op(
  102. /*====*/
  103. /* out, own: function node in a query tree */
  104. int func, /* in: operator token code */
  105. que_node_t* arg1, /* in: first argument */
  106. que_node_t* arg2); /* in: second argument or NULL for an unary
  107. operator */
  108. /*************************************************************************
  109. Parses an ORDER BY clause. Order by a single column only is supported. */
  110. order_node_t*
  111. pars_order_by(
  112. /*==========*/
  113. /* out, own: order-by node in a query tree */
  114. sym_node_t* column, /* in: column name */
  115. pars_res_word_t* asc); /* in: &pars_asc_token or pars_desc_token */
  116. /*************************************************************************
  117. Parses a select list; creates a query graph node for the whole SELECT
  118. statement. */
  119. sel_node_t*
  120. pars_select_list(
  121. /*=============*/
  122. /* out, own: select node in a query
  123. tree */
  124. que_node_t* select_list, /* in: select list */
  125. sym_node_t* into_list); /* in: variables list or NULL */
  126. /*************************************************************************
  127. Parses a cursor declaration. */
  128. que_node_t*
  129. pars_cursor_declaration(
  130. /*====================*/
  131. /* out: sym_node */
  132. sym_node_t* sym_node, /* in: cursor id node in the symbol
  133. table */
  134. sel_node_t* select_node); /* in: select node */
  135. /*************************************************************************
  136. Parses a select statement. */
  137. sel_node_t*
  138. pars_select_statement(
  139. /*==================*/
  140. /* out, own: select node in a query
  141. tree */
  142. sel_node_t* select_node, /* in: select node already containing
  143. the select list */
  144. sym_node_t* table_list, /* in: table list */
  145. que_node_t* search_cond, /* in: search condition or NULL */
  146. pars_res_word_t* for_update, /* in: NULL or &pars_update_token */
  147. pars_res_word_t* consistent_read,/* in: NULL or
  148. &pars_consistent_token */
  149. order_node_t* order_by); /* in: NULL or an order-by node */
  150. /*************************************************************************
  151. Parses a column assignment in an update. */
  152. col_assign_node_t*
  153. pars_column_assignment(
  154. /*===================*/
  155. /* out: column assignment node */
  156. sym_node_t* column, /* in: column to assign */
  157. que_node_t* exp); /* in: value to assign */
  158. /*************************************************************************
  159. Parses a delete or update statement start. */
  160. upd_node_t*
  161. pars_update_statement_start(
  162. /*========================*/
  163. /* out, own: update node in a query
  164. tree */
  165. ibool is_delete, /* in: TRUE if delete */
  166. sym_node_t* table_sym, /* in: table name node */
  167. col_assign_node_t* col_assign_list);/* in: column assignment list, NULL
  168. if delete */
  169. /*************************************************************************
  170. Parses an update or delete statement. */
  171. upd_node_t*
  172. pars_update_statement(
  173. /*==================*/
  174. /* out, own: update node in a query
  175. tree */
  176. upd_node_t* node, /* in: update node */
  177. sym_node_t* cursor_sym, /* in: pointer to a cursor entry in
  178. the symbol table or NULL */
  179. que_node_t* search_cond); /* in: search condition or NULL */
  180. /*************************************************************************
  181. Parses an insert statement. */
  182. ins_node_t*
  183. pars_insert_statement(
  184. /*==================*/
  185. /* out, own: update node in a query
  186. tree */
  187. sym_node_t* table_sym, /* in: table name node */
  188. que_node_t*  values_list, /* in: value expression list or NULL */
  189. sel_node_t* select); /* in: select condition or NULL */
  190. /*************************************************************************
  191. Parses a procedure parameter declaration. */
  192. sym_node_t*
  193. pars_parameter_declaration(
  194. /*=======================*/
  195. /* out, own: symbol table node of type
  196. SYM_VAR */
  197. sym_node_t* node, /* in: symbol table node allocated for the
  198. id of the parameter */
  199. ulint param_type,
  200. /* in: PARS_INPUT or PARS_OUTPUT */
  201. pars_res_word_t* type); /* in: pointer to a type token */
  202. /*************************************************************************
  203. Parses an elsif element. */
  204. elsif_node_t*
  205. pars_elsif_element(
  206. /*===============*/
  207. /* out: elsif node */
  208. que_node_t* cond, /* in: if-condition */
  209. que_node_t* stat_list); /* in: statement list */
  210. /*************************************************************************
  211. Parses an if-statement. */
  212. if_node_t*
  213. pars_if_statement(
  214. /*==============*/
  215. /* out: if-statement node */
  216. que_node_t* cond, /* in: if-condition */
  217. que_node_t* stat_list, /* in: statement list */
  218. que_node_t* else_part); /* in: else-part statement list */
  219. /*************************************************************************
  220. Parses a for-loop-statement. */
  221. for_node_t*
  222. pars_for_statement(
  223. /*===============*/
  224. /* out: for-statement node */
  225. sym_node_t* loop_var, /* in: loop variable */
  226. que_node_t* loop_start_limit,/* in: loop start expression */
  227. que_node_t* loop_end_limit, /* in: loop end expression */
  228. que_node_t* stat_list); /* in: statement list */
  229. /*************************************************************************
  230. Parses a while-statement. */
  231. while_node_t*
  232. pars_while_statement(
  233. /*=================*/
  234. /* out: while-statement node */
  235. que_node_t* cond, /* in: while-condition */
  236. que_node_t* stat_list); /* in: statement list */
  237. /*************************************************************************
  238. Parses a return-statement. */
  239. return_node_t*
  240. pars_return_statement(void);
  241. /*=======================*/
  242. /* out: return-statement node */
  243. /*************************************************************************
  244. Parses a procedure call. */
  245. func_node_t*
  246. pars_procedure_call(
  247. /*================*/
  248. /* out: function node */
  249. que_node_t* res_word,/* in: procedure name reserved word */
  250. que_node_t* args); /* in: argument list */
  251. /*************************************************************************
  252. Parses an assignment statement. */
  253. assign_node_t*
  254. pars_assignment_statement(
  255. /*======================*/
  256. /* out: assignment statement node */
  257. sym_node_t* var, /* in: variable to assign */
  258. que_node_t* val); /* in: value to assign */
  259. /*************************************************************************
  260. Parses a fetch statement. */
  261. fetch_node_t*
  262. pars_fetch_statement(
  263. /*=================*/
  264. /* out: fetch statement node */
  265. sym_node_t* cursor, /* in: cursor node */
  266. sym_node_t* into_list); /* in: variables to set */
  267. /*************************************************************************
  268. Parses an open or close cursor statement. */
  269. open_node_t*
  270. pars_open_statement(
  271. /*================*/
  272. /* out: fetch statement node */
  273. ulint type, /* in: ROW_SEL_OPEN_CURSOR
  274. or ROW_SEL_CLOSE_CURSOR */
  275. sym_node_t* cursor); /* in: cursor node */
  276. /*************************************************************************
  277. Parses a row_printf-statement. */
  278. row_printf_node_t*
  279. pars_row_printf_statement(
  280. /*======================*/
  281. /* out: row_printf-statement node */
  282. sel_node_t* sel_node); /* in: select node */
  283. /*************************************************************************
  284. Parses a commit statement. */
  285. commit_node_t*
  286. pars_commit_statement(void);
  287. /*=======================*/
  288. /*************************************************************************
  289. Parses a rollback statement. */
  290. roll_node_t*
  291. pars_rollback_statement(void);
  292. /*=========================*/
  293. /*************************************************************************
  294. Parses a column definition at a table creation. */
  295. sym_node_t*
  296. pars_column_def(
  297. /*============*/
  298. /* out: column sym table node */
  299. sym_node_t* sym_node, /* in: column node in the symbol
  300. table */
  301. pars_res_word_t* type); /* in: data type */
  302. /*************************************************************************
  303. Parses a table creation operation. */
  304. tab_node_t*
  305. pars_create_table(
  306. /*==============*/
  307. /* out: table create subgraph */
  308. sym_node_t* table_sym, /* in: table name node in the symbol
  309. table */
  310. sym_node_t* column_defs, /* in: list of column names */
  311. void* not_fit_in_memory);/* in: a non-NULL pointer means that
  312. this is a table which in simulations
  313. should be simulated as not fitting
  314. in memory; thread is put to sleep
  315. to simulate disk accesses; NOTE that
  316. this flag is not stored to the data
  317. dictionary on disk, and the database
  318. will forget about non-NULL value if
  319. it has to reload the table definition
  320. from disk */
  321. /*************************************************************************
  322. Parses an index creation operation. */
  323. ind_node_t*
  324. pars_create_index(
  325. /*==============*/
  326. /* out: index create subgraph */
  327. pars_res_word_t* unique_def, /* in: not NULL if a unique index */
  328. pars_res_word_t* clustered_def, /* in: not NULL if a clustered index */
  329. sym_node_t* index_sym, /* in: index name node in the symbol
  330. table */
  331. sym_node_t* table_sym, /* in: table name node in the symbol
  332. table */
  333. sym_node_t* column_list); /* in: list of column names */
  334. /*************************************************************************
  335. Parses a procedure definition. */
  336. que_fork_t*
  337. pars_procedure_definition(
  338. /*======================*/
  339. /* out: query fork node */
  340. sym_node_t* sym_node, /* in: procedure id node in the symbol
  341. table */
  342. sym_node_t* param_list, /* in: parameter declaration list */
  343. que_node_t* stat_list); /* in: statement list */
  344. /*****************************************************************
  345. Parses a stored procedure call, when this is not within another stored
  346. procedure, that is, the client issues a procedure call directly.
  347. In MySQL/InnoDB, stored InnoDB procedures are invoked via the
  348. parsed procedure tree, not via InnoDB SQL, so this function is not used. */
  349. que_fork_t*
  350. pars_stored_procedure_call(
  351. /*=======================*/
  352. /* out: query graph */
  353. sym_node_t* sym_node); /* in: stored procedure name */
  354. /**********************************************************************
  355. Completes a query graph by adding query thread and fork nodes
  356. above it and prepares the graph for running. The fork created is of
  357. type QUE_FORK_MYSQL_INTERFACE. */
  358. que_thr_t*
  359. pars_complete_graph_for_exec(
  360. /*=========================*/
  361. /* out: query thread node to run */
  362. que_node_t* node, /* in: root node for an incomplete
  363. query graph */
  364. trx_t* trx, /* in: transaction handle */
  365. mem_heap_t* heap); /* in: memory heap from which allocated */
  366. /* Struct used to denote a reserved word in a parsing tree */
  367. struct pars_res_word_struct{
  368. int code; /* the token code for the reserved word from
  369. pars0grm.h */
  370. };
  371. /* A predefined function or operator node in a parsing tree; this construct
  372. is also used for some non-functions like the assignment ':=' */
  373. struct func_node_struct{
  374. que_common_t common; /* type: QUE_NODE_FUNC */
  375. int func; /* token code of the function name */
  376. ulint class; /* class of the function */
  377. que_node_t* args; /* argument(s) of the function */
  378. UT_LIST_NODE_T(func_node_t) cond_list;
  379. /* list of comparison conditions; defined
  380. only for comparison operator nodes except,
  381. presently, for OPT_SCROLL_TYPE ones */
  382. UT_LIST_NODE_T(func_node_t) func_node_list;
  383. /* list of function nodes in a parsed
  384. query graph */
  385. };
  386. /* An order-by node in a select */
  387. struct order_node_struct{
  388. que_common_t common; /* type: QUE_NODE_ORDER */
  389. sym_node_t* column; /* order-by column */
  390. ibool asc; /* TRUE if ascending, FALSE if descending */
  391. };
  392. /* Procedure definition node */
  393. struct proc_node_struct{
  394. que_common_t common; /* type: QUE_NODE_PROC */
  395. sym_node_t* proc_id; /* procedure name symbol in the symbol
  396. table of this same procedure */
  397. sym_node_t* param_list; /* input and output parameters */
  398. que_node_t* stat_list; /* statement list */
  399. sym_tab_t* sym_tab; /* symbol table of this procedure */
  400. };
  401. /* elsif-element node */
  402. struct elsif_node_struct{
  403. que_common_t common; /* type: QUE_NODE_ELSIF */
  404. que_node_t* cond; /* if condition */
  405. que_node_t* stat_list; /* statement list */
  406. };
  407. /* if-statement node */
  408. struct if_node_struct{
  409. que_common_t common; /* type: QUE_NODE_IF */
  410. que_node_t* cond; /* if condition */
  411. que_node_t* stat_list; /* statement list */
  412. que_node_t* else_part; /* else-part statement list */
  413.   elsif_node_t* elsif_list; /* elsif element list */
  414. };
  415. /* while-statement node */
  416. struct while_node_struct{
  417. que_common_t common; /* type: QUE_NODE_WHILE */
  418. que_node_t* cond; /* while condition */
  419. que_node_t* stat_list; /* statement list */
  420. };
  421. /* for-loop-statement node */
  422. struct for_node_struct{
  423. que_common_t common; /* type: QUE_NODE_FOR */
  424. sym_node_t* loop_var; /* loop variable: this is the
  425. dereferenced symbol from the
  426. variable declarations, not the
  427. symbol occurrence in the for loop
  428. definition */
  429. que_node_t* loop_start_limit;/* initial value of loop variable */
  430. que_node_t* loop_end_limit; /* end value of loop variable */
  431. int loop_end_value; /* evaluated value for the end value:
  432. it is calculated only when the loop
  433. is entered, and will not change within
  434. the loop */
  435. que_node_t* stat_list; /* statement list */
  436. };
  437. /* return-statement node */
  438. struct return_node_struct{
  439. que_common_t common; /* type: QUE_NODE_RETURN */
  440. };
  441. /* Assignment statement node */
  442. struct assign_node_struct{
  443. que_common_t common; /* type: QUE_NODE_ASSIGNMENT */
  444. sym_node_t* var; /* variable to set */
  445. que_node_t* val; /* value to assign */
  446. };
  447. /* Column assignment node */
  448. struct col_assign_node_struct{
  449. que_common_t common; /* type: QUE_NODE_COL_ASSIGN */
  450. sym_node_t* col; /* column to set */
  451. que_node_t* val; /* value to assign */
  452. };
  453. /* Classes of functions */
  454. #define PARS_FUNC_ARITH 1 /* +, -, *, / */
  455. #define PARS_FUNC_LOGICAL 2
  456. #define PARS_FUNC_CMP 3
  457. #define PARS_FUNC_PREDEFINED 4 /* TO_NUMBER, SUBSTR, ... */
  458. #define PARS_FUNC_AGGREGATE 5 /* COUNT, DISTINCT, SUM */
  459. #define PARS_FUNC_OTHER 6 /* these are not real functions,
  460. e.g., := */
  461. #ifndef UNIV_NONINL
  462. #include "pars0pars.ic"
  463. #endif
  464. #endif