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

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