mySQL 5.0.11 sources for tomato
[tomato.git] / release / src / router / mysql / storage / innobase / include / pars0pars.h
blob1c6c550d313c7935740f398847f1a37a0db482bd
1 /******************************************************
2 SQL parser
4 (c) 1996 Innobase Oy
6 Created 11/19/1996 Heikki Tuuri
7 *******************************************************/
9 #ifndef pars0pars_h
10 #define pars0pars_h
12 #include "univ.i"
13 #include "que0types.h"
14 #include "usr0types.h"
15 #include "pars0types.h"
16 #include "row0types.h"
17 #include "trx0types.h"
18 #include "ut0vec.h"
20 /* Type of the user functions. The first argument is always InnoDB-supplied
21 and varies in type, while 'user_arg' is a user-supplied argument. The
22 meaning of the return type also varies. See the individual use cases, e.g.
23 the FETCH statement, for details on them. */
24 typedef void* (*pars_user_func_cb_t)(void* arg, void* user_arg);
26 extern int yydebug;
28 /* If the following is set TRUE, the lexer will print the SQL string
29 as it tokenizes it */
31 #ifdef UNIV_SQL_DEBUG
32 extern ibool pars_print_lexed;
33 #endif /* UNIV_SQL_DEBUG */
35 /* Global variable used while parsing a single procedure or query : the code is
36 NOT re-entrant */
37 extern sym_tab_t* pars_sym_tab_global;
39 extern pars_res_word_t pars_to_char_token;
40 extern pars_res_word_t pars_to_number_token;
41 extern pars_res_word_t pars_to_binary_token;
42 extern pars_res_word_t pars_binary_to_number_token;
43 extern pars_res_word_t pars_substr_token;
44 extern pars_res_word_t pars_replstr_token;
45 extern pars_res_word_t pars_concat_token;
46 extern pars_res_word_t pars_length_token;
47 extern pars_res_word_t pars_instr_token;
48 extern pars_res_word_t pars_sysdate_token;
49 extern pars_res_word_t pars_printf_token;
50 extern pars_res_word_t pars_assert_token;
51 extern pars_res_word_t pars_rnd_token;
52 extern pars_res_word_t pars_rnd_str_token;
53 extern pars_res_word_t pars_count_token;
54 extern pars_res_word_t pars_sum_token;
55 extern pars_res_word_t pars_distinct_token;
56 extern pars_res_word_t pars_binary_token;
57 extern pars_res_word_t pars_blob_token;
58 extern pars_res_word_t pars_int_token;
59 extern pars_res_word_t pars_char_token;
60 extern pars_res_word_t pars_float_token;
61 extern pars_res_word_t pars_update_token;
62 extern pars_res_word_t pars_asc_token;
63 extern pars_res_word_t pars_desc_token;
64 extern pars_res_word_t pars_open_token;
65 extern pars_res_word_t pars_close_token;
66 extern pars_res_word_t pars_share_token;
67 extern pars_res_word_t pars_unique_token;
68 extern pars_res_word_t pars_clustered_token;
70 extern ulint pars_star_denoter;
72 /* Procedure parameter types */
73 #define PARS_INPUT 0
74 #define PARS_OUTPUT 1
75 #define PARS_NOT_PARAM 2
77 int
78 yyparse(void);
80 /*****************************************************************
81 Parses an SQL string returning the query graph. */
83 que_t*
84 pars_sql(
85 /*=====*/
86 /* out, own: the query graph */
87 pars_info_t* info, /* in: extra information, or NULL */
88 const char* str); /* in: SQL string */
89 /*****************************************************************
90 Retrieves characters to the lexical analyzer. */
92 void
93 pars_get_lex_chars(
94 /*===============*/
95 char* buf, /* in/out: buffer where to copy */
96 int* result, /* out: number of characters copied or EOF */
97 int max_size); /* in: maximum number of characters which fit
98 in the buffer */
99 /*****************************************************************
100 Called by yyparse on error. */
102 void
103 yyerror(
104 /*====*/
105 const char* s); /* in: error message string */
106 /*************************************************************************
107 Parses a variable declaration. */
109 sym_node_t*
110 pars_variable_declaration(
111 /*======================*/
112 /* out, own: symbol table node of type
113 SYM_VAR */
114 sym_node_t* node, /* in: symbol table node allocated for the
115 id of the variable */
116 pars_res_word_t* type); /* in: pointer to a type token */
117 /*************************************************************************
118 Parses a function expression. */
120 func_node_t*
121 pars_func(
122 /*======*/
123 /* out, own: function node in a query tree */
124 que_node_t* res_word,/* in: function name reserved word */
125 que_node_t* arg); /* in: first argument in the argument list */
126 /*************************************************************************
127 Parses an operator expression. */
129 func_node_t*
130 pars_op(
131 /*====*/
132 /* out, own: function node in a query tree */
133 int func, /* in: operator token code */
134 que_node_t* arg1, /* in: first argument */
135 que_node_t* arg2); /* in: second argument or NULL for an unary
136 operator */
137 /*************************************************************************
138 Parses an ORDER BY clause. Order by a single column only is supported. */
140 order_node_t*
141 pars_order_by(
142 /*==========*/
143 /* out, own: order-by node in a query tree */
144 sym_node_t* column, /* in: column name */
145 pars_res_word_t* asc); /* in: &pars_asc_token or pars_desc_token */
146 /*************************************************************************
147 Parses a select list; creates a query graph node for the whole SELECT
148 statement. */
150 sel_node_t*
151 pars_select_list(
152 /*=============*/
153 /* out, own: select node in a query
154 tree */
155 que_node_t* select_list, /* in: select list */
156 sym_node_t* into_list); /* in: variables list or NULL */
157 /*************************************************************************
158 Parses a cursor declaration. */
160 que_node_t*
161 pars_cursor_declaration(
162 /*====================*/
163 /* out: sym_node */
164 sym_node_t* sym_node, /* in: cursor id node in the symbol
165 table */
166 sel_node_t* select_node); /* in: select node */
167 /*************************************************************************
168 Parses a function declaration. */
170 que_node_t*
171 pars_function_declaration(
172 /*======================*/
173 /* out: sym_node */
174 sym_node_t* sym_node); /* in: function id node in the symbol
175 table */
176 /*************************************************************************
177 Parses a select statement. */
179 sel_node_t*
180 pars_select_statement(
181 /*==================*/
182 /* out, own: select node in a query
183 tree */
184 sel_node_t* select_node, /* in: select node already containing
185 the select list */
186 sym_node_t* table_list, /* in: table list */
187 que_node_t* search_cond, /* in: search condition or NULL */
188 pars_res_word_t* for_update, /* in: NULL or &pars_update_token */
189 pars_res_word_t* consistent_read,/* in: NULL or
190 &pars_consistent_token */
191 order_node_t* order_by); /* in: NULL or an order-by node */
192 /*************************************************************************
193 Parses a column assignment in an update. */
195 col_assign_node_t*
196 pars_column_assignment(
197 /*===================*/
198 /* out: column assignment node */
199 sym_node_t* column, /* in: column to assign */
200 que_node_t* exp); /* in: value to assign */
201 /*************************************************************************
202 Parses a delete or update statement start. */
204 upd_node_t*
205 pars_update_statement_start(
206 /*========================*/
207 /* out, own: update node in a query
208 tree */
209 ibool is_delete, /* in: TRUE if delete */
210 sym_node_t* table_sym, /* in: table name node */
211 col_assign_node_t* col_assign_list);/* in: column assignment list, NULL
212 if delete */
213 /*************************************************************************
214 Parses an update or delete statement. */
216 upd_node_t*
217 pars_update_statement(
218 /*==================*/
219 /* out, own: update node in a query
220 tree */
221 upd_node_t* node, /* in: update node */
222 sym_node_t* cursor_sym, /* in: pointer to a cursor entry in
223 the symbol table or NULL */
224 que_node_t* search_cond); /* in: search condition or NULL */
225 /*************************************************************************
226 Parses an insert statement. */
228 ins_node_t*
229 pars_insert_statement(
230 /*==================*/
231 /* out, own: update node in a query
232 tree */
233 sym_node_t* table_sym, /* in: table name node */
234 que_node_t* values_list, /* in: value expression list or NULL */
235 sel_node_t* select); /* in: select condition or NULL */
236 /*************************************************************************
237 Parses a procedure parameter declaration. */
239 sym_node_t*
240 pars_parameter_declaration(
241 /*=======================*/
242 /* out, own: symbol table node of type
243 SYM_VAR */
244 sym_node_t* node, /* in: symbol table node allocated for the
245 id of the parameter */
246 ulint param_type,
247 /* in: PARS_INPUT or PARS_OUTPUT */
248 pars_res_word_t* type); /* in: pointer to a type token */
249 /*************************************************************************
250 Parses an elsif element. */
252 elsif_node_t*
253 pars_elsif_element(
254 /*===============*/
255 /* out: elsif node */
256 que_node_t* cond, /* in: if-condition */
257 que_node_t* stat_list); /* in: statement list */
258 /*************************************************************************
259 Parses an if-statement. */
261 if_node_t*
262 pars_if_statement(
263 /*==============*/
264 /* out: if-statement node */
265 que_node_t* cond, /* in: if-condition */
266 que_node_t* stat_list, /* in: statement list */
267 que_node_t* else_part); /* in: else-part statement list */
268 /*************************************************************************
269 Parses a for-loop-statement. */
271 for_node_t*
272 pars_for_statement(
273 /*===============*/
274 /* out: for-statement node */
275 sym_node_t* loop_var, /* in: loop variable */
276 que_node_t* loop_start_limit,/* in: loop start expression */
277 que_node_t* loop_end_limit, /* in: loop end expression */
278 que_node_t* stat_list); /* in: statement list */
279 /*************************************************************************
280 Parses a while-statement. */
282 while_node_t*
283 pars_while_statement(
284 /*=================*/
285 /* out: while-statement node */
286 que_node_t* cond, /* in: while-condition */
287 que_node_t* stat_list); /* in: statement list */
288 /*************************************************************************
289 Parses an exit statement. */
291 exit_node_t*
292 pars_exit_statement(void);
293 /*=====================*/
294 /* out: exit statement node */
295 /*************************************************************************
296 Parses a return-statement. */
298 return_node_t*
299 pars_return_statement(void);
300 /*=======================*/
301 /* out: return-statement node */
302 /*************************************************************************
303 Parses a procedure call. */
305 func_node_t*
306 pars_procedure_call(
307 /*================*/
308 /* out: function node */
309 que_node_t* res_word,/* in: procedure name reserved word */
310 que_node_t* args); /* in: argument list */
311 /*************************************************************************
312 Parses an assignment statement. */
314 assign_node_t*
315 pars_assignment_statement(
316 /*======================*/
317 /* out: assignment statement node */
318 sym_node_t* var, /* in: variable to assign */
319 que_node_t* val); /* in: value to assign */
320 /*************************************************************************
321 Parses a fetch statement. into_list or user_func (but not both) must be
322 non-NULL. */
324 fetch_node_t*
325 pars_fetch_statement(
326 /*=================*/
327 /* out: fetch statement node */
328 sym_node_t* cursor, /* in: cursor node */
329 sym_node_t* into_list, /* in: variables to set, or NULL */
330 sym_node_t* user_func); /* in: user function name, or NULL */
331 /*************************************************************************
332 Parses an open or close cursor statement. */
334 open_node_t*
335 pars_open_statement(
336 /*================*/
337 /* out: fetch statement node */
338 ulint type, /* in: ROW_SEL_OPEN_CURSOR
339 or ROW_SEL_CLOSE_CURSOR */
340 sym_node_t* cursor); /* in: cursor node */
341 /*************************************************************************
342 Parses a row_printf-statement. */
344 row_printf_node_t*
345 pars_row_printf_statement(
346 /*======================*/
347 /* out: row_printf-statement node */
348 sel_node_t* sel_node); /* in: select node */
349 /*************************************************************************
350 Parses a commit statement. */
352 commit_node_t*
353 pars_commit_statement(void);
354 /*=======================*/
355 /*************************************************************************
356 Parses a rollback statement. */
358 roll_node_t*
359 pars_rollback_statement(void);
360 /*=========================*/
361 /*************************************************************************
362 Parses a column definition at a table creation. */
364 sym_node_t*
365 pars_column_def(
366 /*============*/
367 /* out: column sym table
368 node */
369 sym_node_t* sym_node, /* in: column node in the
370 symbol table */
371 pars_res_word_t* type, /* in: data type */
372 sym_node_t* len, /* in: length of column, or
373 NULL */
374 void* is_unsigned, /* in: if not NULL, column
375 is of type UNSIGNED. */
376 void* is_not_null); /* in: if not NULL, column
377 is of type NOT NULL. */
378 /*************************************************************************
379 Parses a table creation operation. */
381 tab_node_t*
382 pars_create_table(
383 /*==============*/
384 /* out: table create subgraph */
385 sym_node_t* table_sym, /* in: table name node in the symbol
386 table */
387 sym_node_t* column_defs, /* in: list of column names */
388 void* not_fit_in_memory);/* in: a non-NULL pointer means that
389 this is a table which in simulations
390 should be simulated as not fitting
391 in memory; thread is put to sleep
392 to simulate disk accesses; NOTE that
393 this flag is not stored to the data
394 dictionary on disk, and the database
395 will forget about non-NULL value if
396 it has to reload the table definition
397 from disk */
398 /*************************************************************************
399 Parses an index creation operation. */
401 ind_node_t*
402 pars_create_index(
403 /*==============*/
404 /* out: index create subgraph */
405 pars_res_word_t* unique_def, /* in: not NULL if a unique index */
406 pars_res_word_t* clustered_def, /* in: not NULL if a clustered index */
407 sym_node_t* index_sym, /* in: index name node in the symbol
408 table */
409 sym_node_t* table_sym, /* in: table name node in the symbol
410 table */
411 sym_node_t* column_list); /* in: list of column names */
412 /*************************************************************************
413 Parses a procedure definition. */
415 que_fork_t*
416 pars_procedure_definition(
417 /*======================*/
418 /* out: query fork node */
419 sym_node_t* sym_node, /* in: procedure id node in the symbol
420 table */
421 sym_node_t* param_list, /* in: parameter declaration list */
422 que_node_t* stat_list); /* in: statement list */
424 /*****************************************************************
425 Parses a stored procedure call, when this is not within another stored
426 procedure, that is, the client issues a procedure call directly.
427 In MySQL/InnoDB, stored InnoDB procedures are invoked via the
428 parsed procedure tree, not via InnoDB SQL, so this function is not used. */
430 que_fork_t*
431 pars_stored_procedure_call(
432 /*=======================*/
433 /* out: query graph */
434 sym_node_t* sym_node); /* in: stored procedure name */
435 /**********************************************************************
436 Completes a query graph by adding query thread and fork nodes
437 above it and prepares the graph for running. The fork created is of
438 type QUE_FORK_MYSQL_INTERFACE. */
440 que_thr_t*
441 pars_complete_graph_for_exec(
442 /*=========================*/
443 /* out: query thread node to run */
444 que_node_t* node, /* in: root node for an incomplete
445 query graph */
446 trx_t* trx, /* in: transaction handle */
447 mem_heap_t* heap); /* in: memory heap from which allocated */
449 /********************************************************************
450 Create parser info struct.*/
452 pars_info_t*
453 pars_info_create(void);
454 /*==================*/
455 /* out, own: info struct */
457 /********************************************************************
458 Free info struct and everything it contains.*/
460 void
461 pars_info_free(
462 /*===========*/
463 pars_info_t* info); /* in: info struct */
465 /********************************************************************
466 Add bound literal. */
468 void
469 pars_info_add_literal(
470 /*==================*/
471 pars_info_t* info, /* in: info struct */
472 const char* name, /* in: name */
473 const void* address, /* in: address */
474 ulint length, /* in: length of data */
475 ulint type, /* in: type, e.g. DATA_FIXBINARY */
476 ulint prtype); /* in: precise type, e.g.
477 DATA_UNSIGNED */
479 /********************************************************************
480 Equivalent to pars_info_add_literal(info, name, str, strlen(str),
481 DATA_VARCHAR, DATA_ENGLISH). */
483 void
484 pars_info_add_str_literal(
485 /*======================*/
486 pars_info_t* info, /* in: info struct */
487 const char* name, /* in: name */
488 const char* str); /* in: string */
490 /********************************************************************
491 Equivalent to:
493 char buf[4];
494 mach_write_to_4(buf, val);
495 pars_info_add_literal(info, name, buf, 4, DATA_INT, 0);
497 except that the buffer is dynamically allocated from the info struct's
498 heap. */
500 void
501 pars_info_add_int4_literal(
502 /*=======================*/
503 pars_info_t* info, /* in: info struct */
504 const char* name, /* in: name */
505 lint val); /* in: value */
507 /********************************************************************
508 Equivalent to:
510 char buf[8];
511 mach_write_to_8(buf, val);
512 pars_info_add_literal(info, name, buf, 8, DATA_BINARY, 0);
514 except that the buffer is dynamically allocated from the info struct's
515 heap. */
517 void
518 pars_info_add_dulint_literal(
519 /*=========================*/
520 pars_info_t* info, /* in: info struct */
521 const char* name, /* in: name */
522 dulint val); /* in: value */
523 /********************************************************************
524 Add user function. */
526 void
527 pars_info_add_function(
528 /*===================*/
529 pars_info_t* info, /* in: info struct */
530 const char* name, /* in: function name */
531 pars_user_func_cb_t func, /* in: function address */
532 void* arg); /* in: user-supplied argument */
534 /********************************************************************
535 Add bound id. */
537 void
538 pars_info_add_id(
539 /*=============*/
540 pars_info_t* info, /* in: info struct */
541 const char* name, /* in: name */
542 const char* id); /* in: id */
544 /********************************************************************
545 Get user function with the given name.*/
547 pars_user_func_t*
548 pars_info_get_user_func(
549 /*====================*/
550 /* out: user func, or NULL if not
551 found */
552 pars_info_t* info, /* in: info struct */
553 const char* name); /* in: function name to find*/
555 /********************************************************************
556 Get bound literal with the given name.*/
558 pars_bound_lit_t*
559 pars_info_get_bound_lit(
560 /*====================*/
561 /* out: bound literal, or NULL if
562 not found */
563 pars_info_t* info, /* in: info struct */
564 const char* name); /* in: bound literal name to find */
566 /********************************************************************
567 Get bound id with the given name.*/
569 pars_bound_id_t*
570 pars_info_get_bound_id(
571 /*===================*/
572 /* out: bound id, or NULL if not
573 found */
574 pars_info_t* info, /* in: info struct */
575 const char* name); /* in: bound id name to find */
578 /* Extra information supplied for pars_sql(). */
579 struct pars_info_struct {
580 mem_heap_t* heap; /* our own memory heap */
582 ib_vector_t* funcs; /* user functions, or NUll
583 (pars_user_func_t*) */
584 ib_vector_t* bound_lits; /* bound literals, or NULL
585 (pars_bound_lit_t*) */
586 ib_vector_t* bound_ids; /* bound ids, or NULL
587 (pars_bound_id_t*) */
589 ibool graph_owns_us; /* if TRUE (which is the default),
590 que_graph_free() will free us */
593 /* User-supplied function and argument. */
594 struct pars_user_func_struct {
595 const char* name; /* function name */
596 pars_user_func_cb_t func; /* function address */
597 void* arg; /* user-supplied argument */
600 /* Bound literal. */
601 struct pars_bound_lit_struct {
602 const char* name; /* name */
603 const void* address; /* address */
604 ulint length; /* length of data */
605 ulint type; /* type, e.g. DATA_FIXBINARY */
606 ulint prtype; /* precise type, e.g. DATA_UNSIGNED */
609 /* Bound id. */
610 struct pars_bound_id_struct {
611 const char* name; /* name */
612 const char* id; /* id */
615 /* Struct used to denote a reserved word in a parsing tree */
616 struct pars_res_word_struct{
617 int code; /* the token code for the reserved word from
618 pars0grm.h */
621 /* A predefined function or operator node in a parsing tree; this construct
622 is also used for some non-functions like the assignment ':=' */
623 struct func_node_struct{
624 que_common_t common; /* type: QUE_NODE_FUNC */
625 int func; /* token code of the function name */
626 ulint class; /* class of the function */
627 que_node_t* args; /* argument(s) of the function */
628 UT_LIST_NODE_T(func_node_t) cond_list;
629 /* list of comparison conditions; defined
630 only for comparison operator nodes except,
631 presently, for OPT_SCROLL_TYPE ones */
632 UT_LIST_NODE_T(func_node_t) func_node_list;
633 /* list of function nodes in a parsed
634 query graph */
637 /* An order-by node in a select */
638 struct order_node_struct{
639 que_common_t common; /* type: QUE_NODE_ORDER */
640 sym_node_t* column; /* order-by column */
641 ibool asc; /* TRUE if ascending, FALSE if descending */
644 /* Procedure definition node */
645 struct proc_node_struct{
646 que_common_t common; /* type: QUE_NODE_PROC */
647 sym_node_t* proc_id; /* procedure name symbol in the symbol
648 table of this same procedure */
649 sym_node_t* param_list; /* input and output parameters */
650 que_node_t* stat_list; /* statement list */
651 sym_tab_t* sym_tab; /* symbol table of this procedure */
654 /* elsif-element node */
655 struct elsif_node_struct{
656 que_common_t common; /* type: QUE_NODE_ELSIF */
657 que_node_t* cond; /* if condition */
658 que_node_t* stat_list; /* statement list */
661 /* if-statement node */
662 struct if_node_struct{
663 que_common_t common; /* type: QUE_NODE_IF */
664 que_node_t* cond; /* if condition */
665 que_node_t* stat_list; /* statement list */
666 que_node_t* else_part; /* else-part statement list */
667 elsif_node_t* elsif_list; /* elsif element list */
670 /* while-statement node */
671 struct while_node_struct{
672 que_common_t common; /* type: QUE_NODE_WHILE */
673 que_node_t* cond; /* while condition */
674 que_node_t* stat_list; /* statement list */
677 /* for-loop-statement node */
678 struct for_node_struct{
679 que_common_t common; /* type: QUE_NODE_FOR */
680 sym_node_t* loop_var; /* loop variable: this is the
681 dereferenced symbol from the
682 variable declarations, not the
683 symbol occurrence in the for loop
684 definition */
685 que_node_t* loop_start_limit;/* initial value of loop variable */
686 que_node_t* loop_end_limit; /* end value of loop variable */
687 lint loop_end_value; /* evaluated value for the end value:
688 it is calculated only when the loop
689 is entered, and will not change within
690 the loop */
691 que_node_t* stat_list; /* statement list */
694 /* exit statement node */
695 struct exit_node_struct{
696 que_common_t common; /* type: QUE_NODE_EXIT */
699 /* return-statement node */
700 struct return_node_struct{
701 que_common_t common; /* type: QUE_NODE_RETURN */
704 /* Assignment statement node */
705 struct assign_node_struct{
706 que_common_t common; /* type: QUE_NODE_ASSIGNMENT */
707 sym_node_t* var; /* variable to set */
708 que_node_t* val; /* value to assign */
711 /* Column assignment node */
712 struct col_assign_node_struct{
713 que_common_t common; /* type: QUE_NODE_COL_ASSIGN */
714 sym_node_t* col; /* column to set */
715 que_node_t* val; /* value to assign */
718 /* Classes of functions */
719 #define PARS_FUNC_ARITH 1 /* +, -, *, / */
720 #define PARS_FUNC_LOGICAL 2
721 #define PARS_FUNC_CMP 3
722 #define PARS_FUNC_PREDEFINED 4 /* TO_NUMBER, SUBSTR, ... */
723 #define PARS_FUNC_AGGREGATE 5 /* COUNT, DISTINCT, SUM */
724 #define PARS_FUNC_OTHER 6 /* these are not real functions,
725 e.g., := */
727 #ifndef UNIV_NONINL
728 #include "pars0pars.ic"
729 #endif
731 #endif