mySQL 5.0.11 sources for tomato
[tomato.git] / release / src / router / mysql / storage / innodb_plugin / pars / pars0grm.y
blob893b514a43c85c689e35b7d6db2d53502b488249
1 /*****************************************************************************
3 Copyright (c) 1997, 2009, Innobase Oy. All Rights Reserved.
5 This program is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free Software
7 Foundation; version 2 of the License.
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License along with
14 this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 *****************************************************************************/
19 /******************************************************
20 SQL parser: input file for the GNU Bison parser generator
22 Look from pars0lex.l for instructions how to generate the C files for
23 the InnoDB parser.
25 Created 12/14/1997 Heikki Tuuri
26 *******************************************************/
29 /* The value of the semantic attribute is a pointer to a query tree node
30 que_node_t */
32 #include "univ.i"
33 #include <math.h> /* Can't be before univ.i */
34 #include "pars0pars.h"
35 #include "mem0mem.h"
36 #include "que0types.h"
37 #include "que0que.h"
38 #include "row0sel.h"
40 #define YYSTYPE que_node_t*
42 /* #define __STDC__ */
44 int
45 yylex(void);
48 %token PARS_INT_LIT
49 %token PARS_FLOAT_LIT
50 %token PARS_STR_LIT
51 %token PARS_FIXBINARY_LIT
52 %token PARS_BLOB_LIT
53 %token PARS_NULL_LIT
54 %token PARS_ID_TOKEN
55 %token PARS_AND_TOKEN
56 %token PARS_OR_TOKEN
57 %token PARS_NOT_TOKEN
58 %token PARS_GE_TOKEN
59 %token PARS_LE_TOKEN
60 %token PARS_NE_TOKEN
61 %token PARS_PROCEDURE_TOKEN
62 %token PARS_IN_TOKEN
63 %token PARS_OUT_TOKEN
64 %token PARS_BINARY_TOKEN
65 %token PARS_BLOB_TOKEN
66 %token PARS_INT_TOKEN
67 %token PARS_INTEGER_TOKEN
68 %token PARS_FLOAT_TOKEN
69 %token PARS_CHAR_TOKEN
70 %token PARS_IS_TOKEN
71 %token PARS_BEGIN_TOKEN
72 %token PARS_END_TOKEN
73 %token PARS_IF_TOKEN
74 %token PARS_THEN_TOKEN
75 %token PARS_ELSE_TOKEN
76 %token PARS_ELSIF_TOKEN
77 %token PARS_LOOP_TOKEN
78 %token PARS_WHILE_TOKEN
79 %token PARS_RETURN_TOKEN
80 %token PARS_SELECT_TOKEN
81 %token PARS_SUM_TOKEN
82 %token PARS_COUNT_TOKEN
83 %token PARS_DISTINCT_TOKEN
84 %token PARS_FROM_TOKEN
85 %token PARS_WHERE_TOKEN
86 %token PARS_FOR_TOKEN
87 %token PARS_DDOT_TOKEN
88 %token PARS_READ_TOKEN
89 %token PARS_ORDER_TOKEN
90 %token PARS_BY_TOKEN
91 %token PARS_ASC_TOKEN
92 %token PARS_DESC_TOKEN
93 %token PARS_INSERT_TOKEN
94 %token PARS_INTO_TOKEN
95 %token PARS_VALUES_TOKEN
96 %token PARS_UPDATE_TOKEN
97 %token PARS_SET_TOKEN
98 %token PARS_DELETE_TOKEN
99 %token PARS_CURRENT_TOKEN
100 %token PARS_OF_TOKEN
101 %token PARS_CREATE_TOKEN
102 %token PARS_TABLE_TOKEN
103 %token PARS_INDEX_TOKEN
104 %token PARS_UNIQUE_TOKEN
105 %token PARS_CLUSTERED_TOKEN
106 %token PARS_DOES_NOT_FIT_IN_MEM_TOKEN
107 %token PARS_ON_TOKEN
108 %token PARS_ASSIGN_TOKEN
109 %token PARS_DECLARE_TOKEN
110 %token PARS_CURSOR_TOKEN
111 %token PARS_SQL_TOKEN
112 %token PARS_OPEN_TOKEN
113 %token PARS_FETCH_TOKEN
114 %token PARS_CLOSE_TOKEN
115 %token PARS_NOTFOUND_TOKEN
116 %token PARS_TO_CHAR_TOKEN
117 %token PARS_TO_NUMBER_TOKEN
118 %token PARS_TO_BINARY_TOKEN
119 %token PARS_BINARY_TO_NUMBER_TOKEN
120 %token PARS_SUBSTR_TOKEN
121 %token PARS_REPLSTR_TOKEN
122 %token PARS_CONCAT_TOKEN
123 %token PARS_INSTR_TOKEN
124 %token PARS_LENGTH_TOKEN
125 %token PARS_SYSDATE_TOKEN
126 %token PARS_PRINTF_TOKEN
127 %token PARS_ASSERT_TOKEN
128 %token PARS_RND_TOKEN
129 %token PARS_RND_STR_TOKEN
130 %token PARS_ROW_PRINTF_TOKEN
131 %token PARS_COMMIT_TOKEN
132 %token PARS_ROLLBACK_TOKEN
133 %token PARS_WORK_TOKEN
134 %token PARS_UNSIGNED_TOKEN
135 %token PARS_EXIT_TOKEN
136 %token PARS_FUNCTION_TOKEN
137 %token PARS_LOCK_TOKEN
138 %token PARS_SHARE_TOKEN
139 %token PARS_MODE_TOKEN
141 %left PARS_AND_TOKEN PARS_OR_TOKEN
142 %left PARS_NOT_TOKEN
143 %left '=' '<' '>' PARS_GE_TOKEN PARS_LE_TOKEN
144 %left '-' '+'
145 %left '*' '/'
146 %left NEG /* negation--unary minus */
147 %left '%'
149 /* Grammar follows */
152 top_statement:
153 procedure_definition ';'
155 statement:
156 stored_procedure_call
157 | predefined_procedure_call ';'
158 | while_statement ';'
159 | for_statement ';'
160 | exit_statement ';'
161 | if_statement ';'
162 | return_statement ';'
163 | assignment_statement ';'
164 | select_statement ';'
165 | insert_statement ';'
166 | row_printf_statement ';'
167 | delete_statement_searched ';'
168 | delete_statement_positioned ';'
169 | update_statement_searched ';'
170 | update_statement_positioned ';'
171 | open_cursor_statement ';'
172 | fetch_statement ';'
173 | close_cursor_statement ';'
174 | commit_statement ';'
175 | rollback_statement ';'
176 | create_table ';'
177 | create_index ';'
180 statement_list:
181 statement { $$ = que_node_list_add_last(NULL, $1); }
182 | statement_list statement
183 { $$ = que_node_list_add_last($1, $2); }
186 exp:
187 PARS_ID_TOKEN { $$ = $1;}
188 | function_name '(' exp_list ')'
189 { $$ = pars_func($1, $3); }
190 | PARS_INT_LIT { $$ = $1;}
191 | PARS_FLOAT_LIT { $$ = $1;}
192 | PARS_STR_LIT { $$ = $1;}
193 | PARS_FIXBINARY_LIT { $$ = $1;}
194 | PARS_BLOB_LIT { $$ = $1;}
195 | PARS_NULL_LIT { $$ = $1;}
196 | PARS_SQL_TOKEN { $$ = $1;}
197 | exp '+' exp { $$ = pars_op('+', $1, $3); }
198 | exp '-' exp { $$ = pars_op('-', $1, $3); }
199 | exp '*' exp { $$ = pars_op('*', $1, $3); }
200 | exp '/' exp { $$ = pars_op('/', $1, $3); }
201 | '-' exp %prec NEG { $$ = pars_op('-', $2, NULL); }
202 | '(' exp ')' { $$ = $2; }
203 | exp '=' exp { $$ = pars_op('=', $1, $3); }
204 | exp '<' exp { $$ = pars_op('<', $1, $3); }
205 | exp '>' exp { $$ = pars_op('>', $1, $3); }
206 | exp PARS_GE_TOKEN exp { $$ = pars_op(PARS_GE_TOKEN, $1, $3); }
207 | exp PARS_LE_TOKEN exp { $$ = pars_op(PARS_LE_TOKEN, $1, $3); }
208 | exp PARS_NE_TOKEN exp { $$ = pars_op(PARS_NE_TOKEN, $1, $3); }
209 | exp PARS_AND_TOKEN exp{ $$ = pars_op(PARS_AND_TOKEN, $1, $3); }
210 | exp PARS_OR_TOKEN exp { $$ = pars_op(PARS_OR_TOKEN, $1, $3); }
211 | PARS_NOT_TOKEN exp { $$ = pars_op(PARS_NOT_TOKEN, $2, NULL); }
212 | PARS_ID_TOKEN '%' PARS_NOTFOUND_TOKEN
213 { $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
214 | PARS_SQL_TOKEN '%' PARS_NOTFOUND_TOKEN
215 { $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
218 function_name:
219 PARS_TO_CHAR_TOKEN { $$ = &pars_to_char_token; }
220 | PARS_TO_NUMBER_TOKEN { $$ = &pars_to_number_token; }
221 | PARS_TO_BINARY_TOKEN { $$ = &pars_to_binary_token; }
222 | PARS_BINARY_TO_NUMBER_TOKEN
223 { $$ = &pars_binary_to_number_token; }
224 | PARS_SUBSTR_TOKEN { $$ = &pars_substr_token; }
225 | PARS_CONCAT_TOKEN { $$ = &pars_concat_token; }
226 | PARS_INSTR_TOKEN { $$ = &pars_instr_token; }
227 | PARS_LENGTH_TOKEN { $$ = &pars_length_token; }
228 | PARS_SYSDATE_TOKEN { $$ = &pars_sysdate_token; }
229 | PARS_RND_TOKEN { $$ = &pars_rnd_token; }
230 | PARS_RND_STR_TOKEN { $$ = &pars_rnd_str_token; }
233 question_mark_list:
234 /* Nothing */
235 | '?'
236 | question_mark_list ',' '?'
239 stored_procedure_call:
240 '{' PARS_ID_TOKEN '(' question_mark_list ')' '}'
241 { $$ = pars_stored_procedure_call($2); }
244 predefined_procedure_call:
245 predefined_procedure_name '(' exp_list ')'
246 { $$ = pars_procedure_call($1, $3); }
249 predefined_procedure_name:
250 PARS_REPLSTR_TOKEN { $$ = &pars_replstr_token; }
251 | PARS_PRINTF_TOKEN { $$ = &pars_printf_token; }
252 | PARS_ASSERT_TOKEN { $$ = &pars_assert_token; }
255 user_function_call:
256 PARS_ID_TOKEN '(' ')' { $$ = $1; }
259 table_list:
260 PARS_ID_TOKEN { $$ = que_node_list_add_last(NULL, $1); }
261 | table_list ',' PARS_ID_TOKEN
262 { $$ = que_node_list_add_last($1, $3); }
265 variable_list:
266 /* Nothing */ { $$ = NULL; }
267 | PARS_ID_TOKEN { $$ = que_node_list_add_last(NULL, $1); }
268 | variable_list ',' PARS_ID_TOKEN
269 { $$ = que_node_list_add_last($1, $3); }
272 exp_list:
273 /* Nothing */ { $$ = NULL; }
274 | exp { $$ = que_node_list_add_last(NULL, $1);}
275 | exp_list ',' exp { $$ = que_node_list_add_last($1, $3); }
278 select_item:
279 exp { $$ = $1; }
280 | PARS_COUNT_TOKEN '(' '*' ')'
281 { $$ = pars_func(&pars_count_token,
282 que_node_list_add_last(NULL,
283 sym_tab_add_int_lit(
284 pars_sym_tab_global, 1))); }
285 | PARS_COUNT_TOKEN '(' PARS_DISTINCT_TOKEN PARS_ID_TOKEN ')'
286 { $$ = pars_func(&pars_count_token,
287 que_node_list_add_last(NULL,
288 pars_func(&pars_distinct_token,
289 que_node_list_add_last(
290 NULL, $4)))); }
291 | PARS_SUM_TOKEN '(' exp ')'
292 { $$ = pars_func(&pars_sum_token,
293 que_node_list_add_last(NULL,
294 $3)); }
297 select_item_list:
298 /* Nothing */ { $$ = NULL; }
299 | select_item { $$ = que_node_list_add_last(NULL, $1); }
300 | select_item_list ',' select_item
301 { $$ = que_node_list_add_last($1, $3); }
304 select_list:
305 '*' { $$ = pars_select_list(&pars_star_denoter,
306 NULL); }
307 | select_item_list PARS_INTO_TOKEN variable_list
308 { $$ = pars_select_list($1, $3); }
309 | select_item_list { $$ = pars_select_list($1, NULL); }
312 search_condition:
313 /* Nothing */ { $$ = NULL; }
314 | PARS_WHERE_TOKEN exp { $$ = $2; }
317 for_update_clause:
318 /* Nothing */ { $$ = NULL; }
319 | PARS_FOR_TOKEN PARS_UPDATE_TOKEN
320 { $$ = &pars_update_token; }
323 lock_shared_clause:
324 /* Nothing */ { $$ = NULL; }
325 | PARS_LOCK_TOKEN PARS_IN_TOKEN PARS_SHARE_TOKEN PARS_MODE_TOKEN
326 { $$ = &pars_share_token; }
329 order_direction:
330 /* Nothing */ { $$ = &pars_asc_token; }
331 | PARS_ASC_TOKEN { $$ = &pars_asc_token; }
332 | PARS_DESC_TOKEN { $$ = &pars_desc_token; }
335 order_by_clause:
336 /* Nothing */ { $$ = NULL; }
337 | PARS_ORDER_TOKEN PARS_BY_TOKEN PARS_ID_TOKEN order_direction
338 { $$ = pars_order_by($3, $4); }
341 select_statement:
342 PARS_SELECT_TOKEN select_list
343 PARS_FROM_TOKEN table_list
344 search_condition
345 for_update_clause
346 lock_shared_clause
347 order_by_clause { $$ = pars_select_statement($2, $4, $5,
348 $6, $7, $8); }
351 insert_statement_start:
352 PARS_INSERT_TOKEN PARS_INTO_TOKEN
353 PARS_ID_TOKEN { $$ = $3; }
356 insert_statement:
357 insert_statement_start PARS_VALUES_TOKEN '(' exp_list ')'
358 { $$ = pars_insert_statement($1, $4, NULL); }
359 | insert_statement_start select_statement
360 { $$ = pars_insert_statement($1, NULL, $2); }
363 column_assignment:
364 PARS_ID_TOKEN '=' exp { $$ = pars_column_assignment($1, $3); }
367 column_assignment_list:
368 column_assignment { $$ = que_node_list_add_last(NULL, $1); }
369 | column_assignment_list ',' column_assignment
370 { $$ = que_node_list_add_last($1, $3); }
373 cursor_positioned:
374 PARS_WHERE_TOKEN
375 PARS_CURRENT_TOKEN PARS_OF_TOKEN
376 PARS_ID_TOKEN { $$ = $4; }
379 update_statement_start:
380 PARS_UPDATE_TOKEN PARS_ID_TOKEN
381 PARS_SET_TOKEN
382 column_assignment_list { $$ = pars_update_statement_start(FALSE,
383 $2, $4); }
386 update_statement_searched:
387 update_statement_start
388 search_condition { $$ = pars_update_statement($1, NULL, $2); }
391 update_statement_positioned:
392 update_statement_start
393 cursor_positioned { $$ = pars_update_statement($1, $2, NULL); }
396 delete_statement_start:
397 PARS_DELETE_TOKEN PARS_FROM_TOKEN
398 PARS_ID_TOKEN { $$ = pars_update_statement_start(TRUE,
399 $3, NULL); }
402 delete_statement_searched:
403 delete_statement_start
404 search_condition { $$ = pars_update_statement($1, NULL, $2); }
407 delete_statement_positioned:
408 delete_statement_start
409 cursor_positioned { $$ = pars_update_statement($1, $2, NULL); }
412 row_printf_statement:
413 PARS_ROW_PRINTF_TOKEN select_statement
414 { $$ = pars_row_printf_statement($2); }
417 assignment_statement:
418 PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
419 { $$ = pars_assignment_statement($1, $3); }
422 elsif_element:
423 PARS_ELSIF_TOKEN
424 exp PARS_THEN_TOKEN statement_list
425 { $$ = pars_elsif_element($2, $4); }
428 elsif_list:
429 elsif_element { $$ = que_node_list_add_last(NULL, $1); }
430 | elsif_list elsif_element
431 { $$ = que_node_list_add_last($1, $2); }
434 else_part:
435 /* Nothing */ { $$ = NULL; }
436 | PARS_ELSE_TOKEN statement_list
437 { $$ = $2; }
438 | elsif_list { $$ = $1; }
441 if_statement:
442 PARS_IF_TOKEN exp PARS_THEN_TOKEN statement_list
443 else_part
444 PARS_END_TOKEN PARS_IF_TOKEN
445 { $$ = pars_if_statement($2, $4, $5); }
448 while_statement:
449 PARS_WHILE_TOKEN exp PARS_LOOP_TOKEN statement_list
450 PARS_END_TOKEN PARS_LOOP_TOKEN
451 { $$ = pars_while_statement($2, $4); }
454 for_statement:
455 PARS_FOR_TOKEN PARS_ID_TOKEN PARS_IN_TOKEN
456 exp PARS_DDOT_TOKEN exp
457 PARS_LOOP_TOKEN statement_list
458 PARS_END_TOKEN PARS_LOOP_TOKEN
459 { $$ = pars_for_statement($2, $4, $6, $8); }
462 exit_statement:
463 PARS_EXIT_TOKEN { $$ = pars_exit_statement(); }
466 return_statement:
467 PARS_RETURN_TOKEN { $$ = pars_return_statement(); }
470 open_cursor_statement:
471 PARS_OPEN_TOKEN PARS_ID_TOKEN
472 { $$ = pars_open_statement(
473 ROW_SEL_OPEN_CURSOR, $2); }
476 close_cursor_statement:
477 PARS_CLOSE_TOKEN PARS_ID_TOKEN
478 { $$ = pars_open_statement(
479 ROW_SEL_CLOSE_CURSOR, $2); }
482 fetch_statement:
483 PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN variable_list
484 { $$ = pars_fetch_statement($2, $4, NULL); }
485 | PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN user_function_call
486 { $$ = pars_fetch_statement($2, NULL, $4); }
489 column_def:
490 PARS_ID_TOKEN type_name opt_column_len opt_unsigned opt_not_null
491 { $$ = pars_column_def($1, $2, $3, $4, $5); }
494 column_def_list:
495 column_def { $$ = que_node_list_add_last(NULL, $1); }
496 | column_def_list ',' column_def
497 { $$ = que_node_list_add_last($1, $3); }
500 opt_column_len:
501 /* Nothing */ { $$ = NULL; }
502 | '(' PARS_INT_LIT ')'
503 { $$ = $2; }
506 opt_unsigned:
507 /* Nothing */ { $$ = NULL; }
508 | PARS_UNSIGNED_TOKEN
509 { $$ = &pars_int_token;
510 /* pass any non-NULL pointer */ }
513 opt_not_null:
514 /* Nothing */ { $$ = NULL; }
515 | PARS_NOT_TOKEN PARS_NULL_LIT
516 { $$ = &pars_int_token;
517 /* pass any non-NULL pointer */ }
520 not_fit_in_memory:
521 /* Nothing */ { $$ = NULL; }
522 | PARS_DOES_NOT_FIT_IN_MEM_TOKEN
523 { $$ = &pars_int_token;
524 /* pass any non-NULL pointer */ }
527 create_table:
528 PARS_CREATE_TOKEN PARS_TABLE_TOKEN
529 PARS_ID_TOKEN '(' column_def_list ')'
530 not_fit_in_memory { $$ = pars_create_table($3, $5, $7); }
533 column_list:
534 PARS_ID_TOKEN { $$ = que_node_list_add_last(NULL, $1); }
535 | column_list ',' PARS_ID_TOKEN
536 { $$ = que_node_list_add_last($1, $3); }
539 unique_def:
540 /* Nothing */ { $$ = NULL; }
541 | PARS_UNIQUE_TOKEN { $$ = &pars_unique_token; }
544 clustered_def:
545 /* Nothing */ { $$ = NULL; }
546 | PARS_CLUSTERED_TOKEN { $$ = &pars_clustered_token; }
549 create_index:
550 PARS_CREATE_TOKEN unique_def
551 clustered_def
552 PARS_INDEX_TOKEN
553 PARS_ID_TOKEN PARS_ON_TOKEN PARS_ID_TOKEN
554 '(' column_list ')' { $$ = pars_create_index($2, $3, $5, $7, $9); }
557 commit_statement:
558 PARS_COMMIT_TOKEN PARS_WORK_TOKEN
559 { $$ = pars_commit_statement(); }
562 rollback_statement:
563 PARS_ROLLBACK_TOKEN PARS_WORK_TOKEN
564 { $$ = pars_rollback_statement(); }
567 type_name:
568 PARS_INT_TOKEN { $$ = &pars_int_token; }
569 | PARS_INTEGER_TOKEN { $$ = &pars_int_token; }
570 | PARS_CHAR_TOKEN { $$ = &pars_char_token; }
571 | PARS_BINARY_TOKEN { $$ = &pars_binary_token; }
572 | PARS_BLOB_TOKEN { $$ = &pars_blob_token; }
575 parameter_declaration:
576 PARS_ID_TOKEN PARS_IN_TOKEN type_name
577 { $$ = pars_parameter_declaration($1,
578 PARS_INPUT, $3); }
579 | PARS_ID_TOKEN PARS_OUT_TOKEN type_name
580 { $$ = pars_parameter_declaration($1,
581 PARS_OUTPUT, $3); }
584 parameter_declaration_list:
585 /* Nothing */ { $$ = NULL; }
586 | parameter_declaration { $$ = que_node_list_add_last(NULL, $1); }
587 | parameter_declaration_list ',' parameter_declaration
588 { $$ = que_node_list_add_last($1, $3); }
591 variable_declaration:
592 PARS_ID_TOKEN type_name ';'
593 { $$ = pars_variable_declaration($1, $2); }
596 variable_declaration_list:
597 /* Nothing */
598 | variable_declaration
599 | variable_declaration_list variable_declaration
602 cursor_declaration:
603 PARS_DECLARE_TOKEN PARS_CURSOR_TOKEN PARS_ID_TOKEN
604 PARS_IS_TOKEN select_statement ';'
605 { $$ = pars_cursor_declaration($3, $5); }
608 function_declaration:
609 PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
610 { $$ = pars_function_declaration($3); }
613 declaration:
614 cursor_declaration
615 | function_declaration
618 declaration_list:
619 /* Nothing */
620 | declaration
621 | declaration_list declaration
624 procedure_definition:
625 PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' parameter_declaration_list ')'
626 PARS_IS_TOKEN
627 variable_declaration_list
628 declaration_list
629 PARS_BEGIN_TOKEN
630 statement_list
631 PARS_END_TOKEN { $$ = pars_procedure_definition($2, $4,
632 $10); }