1 /*****************************************************************************
2 
3 Copyright (c) 1997, 2021, Oracle and/or its affiliates.
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License, version 2.0,
7 as published by the Free Software Foundation.
8 
9 This program is also distributed with certain software (including
10 but not limited to OpenSSL) that is licensed under separate terms,
11 as designated in a particular file or component or in included license
12 documentation.  The authors of MySQL hereby grant you an additional
13 permission to link the program and your derivative works with the
14 separately licensed software that they have included with MySQL.
15 
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 GNU General Public License, version 2.0, for more details.
20 
21 You should have received a copy of the GNU General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc.,
23 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
24 
25 *****************************************************************************/
26 
27 /******************************************************
28 SQL parser: input file for the GNU Bison parser generator
29 
30 Look from pars0lex.l for instructions how to generate the C files for
31 the InnoDB parser.
32 
33 Created 12/14/1997 Heikki Tuuri
34 *******************************************************/
35 
36 %{
37 /* The value of the semantic attribute is a pointer to a query tree node
38 que_node_t */
39 
40 #include "univ.i"
41 #include <math.h>
42 #include "pars0pars.h"
43 #include "mem0mem.h"
44 #include "que0types.h"
45 #include "que0que.h"
46 #include "row0sel.h"
47 
48 #define YYSTYPE que_node_t*
49 
50 /* #define __STDC__ */
51 int
52 yylex(void);
53 %}
54 
55 %token PARS_INT_LIT
56 %token PARS_FLOAT_LIT
57 %token PARS_STR_LIT
58 %token PARS_FIXBINARY_LIT
59 %token PARS_BLOB_LIT
60 %token PARS_NULL_LIT
61 %token PARS_ID_TOKEN
62 %token PARS_AND_TOKEN
63 %token PARS_OR_TOKEN
64 %token PARS_NOT_TOKEN
65 %token PARS_GE_TOKEN
66 %token PARS_LE_TOKEN
67 %token PARS_NE_TOKEN
68 %token PARS_PROCEDURE_TOKEN
69 %token PARS_IN_TOKEN
70 %token PARS_OUT_TOKEN
71 %token PARS_BINARY_TOKEN
72 %token PARS_BLOB_TOKEN
73 %token PARS_INT_TOKEN
74 %token PARS_INTEGER_TOKEN
75 %token PARS_FLOAT_TOKEN
76 %token PARS_CHAR_TOKEN
77 %token PARS_IS_TOKEN
78 %token PARS_BEGIN_TOKEN
79 %token PARS_END_TOKEN
80 %token PARS_IF_TOKEN
81 %token PARS_THEN_TOKEN
82 %token PARS_ELSE_TOKEN
83 %token PARS_ELSIF_TOKEN
84 %token PARS_LOOP_TOKEN
85 %token PARS_WHILE_TOKEN
86 %token PARS_RETURN_TOKEN
87 %token PARS_SELECT_TOKEN
88 %token PARS_SUM_TOKEN
89 %token PARS_COUNT_TOKEN
90 %token PARS_DISTINCT_TOKEN
91 %token PARS_FROM_TOKEN
92 %token PARS_WHERE_TOKEN
93 %token PARS_FOR_TOKEN
94 %token PARS_DDOT_TOKEN
95 %token PARS_READ_TOKEN
96 %token PARS_ORDER_TOKEN
97 %token PARS_BY_TOKEN
98 %token PARS_ASC_TOKEN
99 %token PARS_DESC_TOKEN
100 %token PARS_INSERT_TOKEN
101 %token PARS_INTO_TOKEN
102 %token PARS_VALUES_TOKEN
103 %token PARS_UPDATE_TOKEN
104 %token PARS_SET_TOKEN
105 %token PARS_DELETE_TOKEN
106 %token PARS_CURRENT_TOKEN
107 %token PARS_OF_TOKEN
108 %token PARS_CREATE_TOKEN
109 %token PARS_TABLE_TOKEN
110 %token PARS_INDEX_TOKEN
111 %token PARS_UNIQUE_TOKEN
112 %token PARS_CLUSTERED_TOKEN
113 %token PARS_DOES_NOT_FIT_IN_MEM_TOKEN
114 %token PARS_ON_TOKEN
115 %token PARS_ASSIGN_TOKEN
116 %token PARS_DECLARE_TOKEN
117 %token PARS_CURSOR_TOKEN
118 %token PARS_SQL_TOKEN
119 %token PARS_OPEN_TOKEN
120 %token PARS_FETCH_TOKEN
121 %token PARS_CLOSE_TOKEN
122 %token PARS_NOTFOUND_TOKEN
123 %token PARS_TO_CHAR_TOKEN
124 %token PARS_TO_NUMBER_TOKEN
125 %token PARS_TO_BINARY_TOKEN
126 %token PARS_BINARY_TO_NUMBER_TOKEN
127 %token PARS_SUBSTR_TOKEN
128 %token PARS_REPLSTR_TOKEN
129 %token PARS_CONCAT_TOKEN
130 %token PARS_INSTR_TOKEN
131 %token PARS_LENGTH_TOKEN
132 %token PARS_SYSDATE_TOKEN
133 %token PARS_PRINTF_TOKEN
134 %token PARS_ASSERT_TOKEN
135 %token PARS_RND_TOKEN
136 %token PARS_RND_STR_TOKEN
137 %token PARS_ROW_PRINTF_TOKEN
138 %token PARS_COMMIT_TOKEN
139 %token PARS_ROLLBACK_TOKEN
140 %token PARS_WORK_TOKEN
141 %token PARS_UNSIGNED_TOKEN
142 %token PARS_EXIT_TOKEN
143 %token PARS_FUNCTION_TOKEN
144 %token PARS_LOCK_TOKEN
145 %token PARS_SHARE_TOKEN
146 %token PARS_MODE_TOKEN
147 %token PARS_LIKE_TOKEN
148 %token PARS_LIKE_TOKEN_EXACT
149 %token PARS_LIKE_TOKEN_PREFIX
150 %token PARS_LIKE_TOKEN_SUFFIX
151 %token PARS_LIKE_TOKEN_SUBSTR
152 %token PARS_TABLE_NAME_TOKEN
153 %token PARS_COMPACT_TOKEN
154 %token PARS_BLOCK_SIZE_TOKEN
155 %token PARS_BIGINT_TOKEN
156 
157 %left PARS_AND_TOKEN PARS_OR_TOKEN
158 %left PARS_NOT_TOKEN
159 %left '=' '<' '>' PARS_GE_TOKEN PARS_LE_TOKEN
160 %left '-' '+'
161 %left '*' '/'
162 %left NEG     /* negation--unary minus */
163 %left '%'
164 
165 /* Grammar follows */
166 %%
167 
168 top_statement:
169         procedure_definition ';'
170 
171 statement:
172 	stored_procedure_call
173 	| predefined_procedure_call ';'
174 	| while_statement ';'
175 	| for_statement ';'
176 	| exit_statement ';'
177 	| if_statement ';'
178 	| return_statement ';'
179 	| assignment_statement ';'
180 	| select_statement ';'
181 	| insert_statement ';'
182 	| row_printf_statement ';'
183 	| delete_statement_searched ';'
184 	| delete_statement_positioned ';'
185 	| update_statement_searched ';'
186 	| update_statement_positioned ';'
187 	| open_cursor_statement ';'
188 	| fetch_statement ';'
189 	| close_cursor_statement ';'
190 	| commit_statement ';'
191 	| rollback_statement ';'
192 	| create_table ';'
193 	| create_index ';'
194 ;
195 
196 statement_list:
197 	statement		{ $$ = que_node_list_add_last(NULL, $1); }
198 	| statement_list statement
199 				{ $$ = que_node_list_add_last($1, $2); }
200 ;
201 
202 exp:
203 	PARS_ID_TOKEN		{ $$ = $1;}
204 	| function_name '(' exp_list ')'
205 				{ $$ = pars_func($1, $3); }
206 	| PARS_INT_LIT		{ $$ = $1;}
207 	| PARS_FLOAT_LIT	{ $$ = $1;}
208 	| PARS_STR_LIT		{ $$ = $1;}
209 	| PARS_FIXBINARY_LIT	{ $$ = $1;}
210 	| PARS_BLOB_LIT		{ $$ = $1;}
211 	| PARS_NULL_LIT		{ $$ = $1;}
212 	| PARS_SQL_TOKEN	{ $$ = $1;}
213 	| exp '+' exp        	{ $$ = pars_op('+', $1, $3); }
214 	| exp '-' exp        	{ $$ = pars_op('-', $1, $3); }
215 	| exp '*' exp        	{ $$ = pars_op('*', $1, $3); }
216 	| exp '/' exp        	{ $$ = pars_op('/', $1, $3); }
217 	| '-' exp %prec NEG 	{ $$ = pars_op('-', $2, NULL); }
218 	| '(' exp ')'        	{ $$ = $2; }
219 	| exp '=' exp		{ $$ = pars_op('=', $1, $3); }
220 	| exp PARS_LIKE_TOKEN PARS_STR_LIT
221 				{ $$ = pars_op(PARS_LIKE_TOKEN, $1, $3); }
222 	| exp '<' exp           { $$ = pars_op('<', $1, $3); }
223 	| exp '>' exp           { $$ = pars_op('>', $1, $3); }
224 	| exp PARS_GE_TOKEN exp	{ $$ = pars_op(PARS_GE_TOKEN, $1, $3); }
225 	| exp PARS_LE_TOKEN exp	{ $$ = pars_op(PARS_LE_TOKEN, $1, $3); }
226 	| exp PARS_NE_TOKEN exp	{ $$ = pars_op(PARS_NE_TOKEN, $1, $3); }
227 	| exp PARS_AND_TOKEN exp{ $$ = pars_op(PARS_AND_TOKEN, $1, $3); }
228 	| exp PARS_OR_TOKEN exp	{ $$ = pars_op(PARS_OR_TOKEN, $1, $3); }
229 	| PARS_NOT_TOKEN exp	{ $$ = pars_op(PARS_NOT_TOKEN, $2, NULL); }
230 	| PARS_ID_TOKEN '%' PARS_NOTFOUND_TOKEN
231 				{ $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
232 	| PARS_SQL_TOKEN '%' PARS_NOTFOUND_TOKEN
233 				{ $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
234 ;
235 
236 function_name:
237 	PARS_TO_CHAR_TOKEN	{ $$ = &pars_to_char_token; }
238 	| PARS_TO_NUMBER_TOKEN	{ $$ = &pars_to_number_token; }
239 	| PARS_TO_BINARY_TOKEN	{ $$ = &pars_to_binary_token; }
240 	| PARS_BINARY_TO_NUMBER_TOKEN
241 				{ $$ = &pars_binary_to_number_token; }
242 	| PARS_SUBSTR_TOKEN	{ $$ = &pars_substr_token; }
243 	| PARS_CONCAT_TOKEN	{ $$ = &pars_concat_token; }
244 	| PARS_INSTR_TOKEN	{ $$ = &pars_instr_token; }
245 	| PARS_LENGTH_TOKEN	{ $$ = &pars_length_token; }
246 	| PARS_SYSDATE_TOKEN	{ $$ = &pars_sysdate_token; }
247 	| PARS_RND_TOKEN	{ $$ = &pars_rnd_token; }
248 	| PARS_RND_STR_TOKEN	{ $$ = &pars_rnd_str_token; }
249 ;
250 
251 question_mark_list:
252 	/* Nothing */
253 	| '?'
254 	| question_mark_list ',' '?'
255 ;
256 
257 stored_procedure_call:
258 	'{' PARS_ID_TOKEN '(' question_mark_list ')' '}'
259 				{ $$ = pars_stored_procedure_call(
260 					static_cast<sym_node_t*>($2)); }
261 ;
262 
263 predefined_procedure_call:
264 	predefined_procedure_name '(' exp_list ')'
265 				{ $$ = pars_procedure_call($1, $3); }
266 ;
267 
268 predefined_procedure_name:
269 	PARS_REPLSTR_TOKEN	{ $$ = &pars_replstr_token; }
270 	| PARS_PRINTF_TOKEN	{ $$ = &pars_printf_token; }
271 	| PARS_ASSERT_TOKEN	{ $$ = &pars_assert_token; }
272 ;
273 
274 user_function_call:
275 	PARS_ID_TOKEN '(' ')'	{ $$ = $1; }
276 ;
277 
278 table_list:
279 	table_name		{ $$ = que_node_list_add_last(NULL, $1); }
280 	| table_list ',' table_name
281 				{ $$ = que_node_list_add_last($1, $3); }
282 ;
283 
284 variable_list:
285 	/* Nothing */		{ $$ = NULL; }
286 	| PARS_ID_TOKEN		{ $$ = que_node_list_add_last(NULL, $1); }
287 	| variable_list ',' PARS_ID_TOKEN
288 				{ $$ = que_node_list_add_last($1, $3); }
289 ;
290 
291 exp_list:
292 	/* Nothing */		{ $$ = NULL; }
293 	| exp			{ $$ = que_node_list_add_last(NULL, $1);}
294 	| exp_list ',' exp	{ $$ = que_node_list_add_last($1, $3); }
295 ;
296 
297 select_item:
298 	exp			{ $$ = $1; }
299 	| PARS_COUNT_TOKEN '(' '*' ')'
300 				{ $$ = pars_func(&pars_count_token,
301 				          que_node_list_add_last(NULL,
302 					    sym_tab_add_int_lit(
303 						pars_sym_tab_global, 1))); }
304 	| PARS_COUNT_TOKEN '(' PARS_DISTINCT_TOKEN PARS_ID_TOKEN ')'
305 				{ $$ = pars_func(&pars_count_token,
306 					    que_node_list_add_last(NULL,
307 						pars_func(&pars_distinct_token,
308 						     que_node_list_add_last(
309 								NULL, $4)))); }
310 	| PARS_SUM_TOKEN '(' exp ')'
311 				{ $$ = pars_func(&pars_sum_token,
312 						que_node_list_add_last(NULL,
313 									$3)); }
314 ;
315 
316 select_item_list:
317 	/* Nothing */		{ $$ = NULL; }
318 	| select_item		{ $$ = que_node_list_add_last(NULL, $1); }
319 	| select_item_list ',' select_item
320 				{ $$ = que_node_list_add_last($1, $3); }
321 ;
322 
323 select_list:
324 	'*'			{ $$ = pars_select_list(&pars_star_denoter,
325 								NULL); }
326 	| select_item_list PARS_INTO_TOKEN variable_list
327 				{ $$ = pars_select_list(
328 					$1, static_cast<sym_node_t*>($3)); }
329 	| select_item_list	{ $$ = pars_select_list($1, NULL); }
330 ;
331 
332 search_condition:
333 	/* Nothing */		{ $$ = NULL; }
334 	| PARS_WHERE_TOKEN exp	{ $$ = $2; }
335 ;
336 
337 for_update_clause:
338 	/* Nothing */		{ $$ = NULL; }
339 	| PARS_FOR_TOKEN PARS_UPDATE_TOKEN
340 				{ $$ = &pars_update_token; }
341 ;
342 
343 lock_shared_clause:
344 	/* Nothing */		{ $$ = NULL; }
345 	| PARS_LOCK_TOKEN PARS_IN_TOKEN PARS_SHARE_TOKEN PARS_MODE_TOKEN
346 				{ $$ = &pars_share_token; }
347 ;
348 
349 order_direction:
350 	/* Nothing */		{ $$ = &pars_asc_token; }
351 	| PARS_ASC_TOKEN	{ $$ = &pars_asc_token; }
352 	| PARS_DESC_TOKEN	{ $$ = &pars_desc_token; }
353 ;
354 
355 order_by_clause:
356 	/* Nothing */		{ $$ = NULL; }
357 	| PARS_ORDER_TOKEN PARS_BY_TOKEN PARS_ID_TOKEN order_direction
358 				{ $$ = pars_order_by(
359 					static_cast<sym_node_t*>($3),
360 					static_cast<pars_res_word_t*>($4)); }
361 ;
362 
363 select_statement:
364 	PARS_SELECT_TOKEN select_list
365 	PARS_FROM_TOKEN table_list
366 	search_condition
367 	for_update_clause
368 	lock_shared_clause
369 	order_by_clause		{ $$ = pars_select_statement(
370 					static_cast<sel_node_t*>($2),
371 					static_cast<sym_node_t*>($4),
372 					static_cast<que_node_t*>($5),
373 					static_cast<pars_res_word_t*>($6),
374 					static_cast<pars_res_word_t*>($7),
375 					static_cast<order_node_t*>($8)); }
376 ;
377 
378 insert_statement_start:
379 	PARS_INSERT_TOKEN PARS_INTO_TOKEN
380 	table_name		{ $$ = $3; }
381 ;
382 
383 insert_statement:
384 	insert_statement_start PARS_VALUES_TOKEN '(' exp_list ')'
385 				{ $$ = pars_insert_statement(
386 					static_cast<sym_node_t*>($1), $4, NULL); }
387 	| insert_statement_start select_statement
388 				{ $$ = pars_insert_statement(
389 					static_cast<sym_node_t*>($1),
390 					NULL,
391 					static_cast<sel_node_t*>($2)); }
392 ;
393 
394 column_assignment:
395 	PARS_ID_TOKEN '=' exp	{ $$ = pars_column_assignment(
396 					static_cast<sym_node_t*>($1),
397 					static_cast<que_node_t*>($3)); }
398 ;
399 
400 column_assignment_list:
401 	column_assignment	{ $$ = que_node_list_add_last(NULL, $1); }
402 	| column_assignment_list ',' column_assignment
403 				{ $$ = que_node_list_add_last($1, $3); }
404 ;
405 
406 cursor_positioned:
407 	PARS_WHERE_TOKEN
408 	PARS_CURRENT_TOKEN PARS_OF_TOKEN
409 	PARS_ID_TOKEN 		{ $$ = $4; }
410 ;
411 
412 update_statement_start:
413 	PARS_UPDATE_TOKEN table_name
414 	PARS_SET_TOKEN
415 	column_assignment_list	{ $$ = pars_update_statement_start(
416 					FALSE,
417 					static_cast<sym_node_t*>($2),
418 					static_cast<col_assign_node_t*>($4)); }
419 ;
420 
421 update_statement_searched:
422 	update_statement_start
423 	search_condition	{ $$ = pars_update_statement(
424 					static_cast<upd_node_t*>($1),
425 					NULL,
426 					static_cast<que_node_t*>($2)); }
427 ;
428 
429 update_statement_positioned:
430 	update_statement_start
431 	cursor_positioned	{ $$ = pars_update_statement(
432 					static_cast<upd_node_t*>($1),
433 					static_cast<sym_node_t*>($2),
434 					NULL); }
435 ;
436 
437 delete_statement_start:
438 	PARS_DELETE_TOKEN PARS_FROM_TOKEN
439 	table_name		{ $$ = pars_update_statement_start(
440 					TRUE,
441 					static_cast<sym_node_t*>($3), NULL); }
442 ;
443 
444 delete_statement_searched:
445 	delete_statement_start
446 	search_condition	{ $$ = pars_update_statement(
447 					static_cast<upd_node_t*>($1),
448 					NULL,
449 					static_cast<que_node_t*>($2)); }
450 ;
451 
452 delete_statement_positioned:
453 	delete_statement_start
454 	cursor_positioned	{ $$ = pars_update_statement(
455 					static_cast<upd_node_t*>($1),
456 					static_cast<sym_node_t*>($2),
457 					NULL); }
458 ;
459 
460 row_printf_statement:
461 	PARS_ROW_PRINTF_TOKEN select_statement
462 				{ $$ = pars_row_printf_statement(
463 					static_cast<sel_node_t*>($2)); }
464 ;
465 
466 assignment_statement:
467 	PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
468 				{ $$ = pars_assignment_statement(
469 					static_cast<sym_node_t*>($1),
470 					static_cast<que_node_t*>($3)); }
471 ;
472 
473 elsif_element:
474 	PARS_ELSIF_TOKEN
475 	exp PARS_THEN_TOKEN statement_list
476 				{ $$ = pars_elsif_element($2, $4); }
477 ;
478 
479 elsif_list:
480 	elsif_element		{ $$ = que_node_list_add_last(NULL, $1); }
481 	| elsif_list elsif_element
482 				{ $$ = que_node_list_add_last($1, $2); }
483 ;
484 
485 else_part:
486 	/* Nothing */		{ $$ = NULL; }
487 	| PARS_ELSE_TOKEN statement_list
488 				{ $$ = $2; }
489 	| elsif_list		{ $$ = $1; }
490 ;
491 
492 if_statement:
493 	PARS_IF_TOKEN exp PARS_THEN_TOKEN statement_list
494 	else_part
495 	PARS_END_TOKEN PARS_IF_TOKEN
496 				{ $$ = pars_if_statement($2, $4, $5); }
497 ;
498 
499 while_statement:
500 	PARS_WHILE_TOKEN exp PARS_LOOP_TOKEN statement_list
501 	PARS_END_TOKEN PARS_LOOP_TOKEN
502 				{ $$ = pars_while_statement($2, $4); }
503 ;
504 
505 for_statement:
506 	PARS_FOR_TOKEN PARS_ID_TOKEN PARS_IN_TOKEN
507 	exp PARS_DDOT_TOKEN exp
508 	PARS_LOOP_TOKEN statement_list
509 	PARS_END_TOKEN PARS_LOOP_TOKEN
510 				{ $$ = pars_for_statement(
511 					static_cast<sym_node_t*>($2),
512 					$4, $6, $8); }
513 ;
514 
515 exit_statement:
516 	PARS_EXIT_TOKEN		{ $$ = pars_exit_statement(); }
517 ;
518 
519 return_statement:
520 	PARS_RETURN_TOKEN	{ $$ = pars_return_statement(); }
521 ;
522 
523 open_cursor_statement:
524 	PARS_OPEN_TOKEN PARS_ID_TOKEN
525 				{ $$ = pars_open_statement(
526 						ROW_SEL_OPEN_CURSOR,
527 						static_cast<sym_node_t*>($2)); }
528 ;
529 
530 close_cursor_statement:
531 	PARS_CLOSE_TOKEN PARS_ID_TOKEN
532 				{ $$ = pars_open_statement(
533 						ROW_SEL_CLOSE_CURSOR,
534 						static_cast<sym_node_t*>($2)); }
535 ;
536 
537 fetch_statement:
538 	PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN variable_list
539 				{ $$ = pars_fetch_statement(
540 					static_cast<sym_node_t*>($2),
541 					static_cast<sym_node_t*>($4), NULL); }
542 	| PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN user_function_call
543 				{ $$ = pars_fetch_statement(
544 					static_cast<sym_node_t*>($2),
545 					NULL,
546 					static_cast<sym_node_t*>($4)); }
547 ;
548 
549 column_def:
550 	PARS_ID_TOKEN type_name	opt_column_len opt_unsigned opt_not_null
551 				{ $$ = pars_column_def(
552 					static_cast<sym_node_t*>($1),
553 					static_cast<pars_res_word_t*>($2),
554 					static_cast<sym_node_t*>($3),
555 					$4, $5); }
556 ;
557 
558 column_def_list:
559 	column_def		{ $$ = que_node_list_add_last(NULL, $1); }
560 	| column_def_list ',' column_def
561 				{ $$ = que_node_list_add_last($1, $3); }
562 ;
563 
564 opt_column_len:
565 	/* Nothing */		{ $$ = NULL; }
566 	| '(' PARS_INT_LIT ')'
567 				{ $$ = $2; }
568 ;
569 
570 opt_unsigned:
571 	/* Nothing */		{ $$ = NULL; }
572 	| PARS_UNSIGNED_TOKEN
573 				{ $$ = &pars_int_token;
574 					/* pass any non-NULL pointer */ }
575 ;
576 
577 opt_not_null:
578 	/* Nothing */		{ $$ = NULL; }
579 	| PARS_NOT_TOKEN PARS_NULL_LIT
580 				{ $$ = &pars_int_token;
581 					/* pass any non-NULL pointer */ }
582 ;
583 
584 not_fit_in_memory:
585 	/* Nothing */		{ $$ = NULL; }
586 	| PARS_DOES_NOT_FIT_IN_MEM_TOKEN
587 				{ $$ = &pars_int_token;
588 					/* pass any non-NULL pointer */ }
589 ;
590 
591 compact:
592 	/* Nothing */		{ $$ = NULL; }
593 	| PARS_COMPACT_TOKEN	{ $$ = &pars_int_token;
594 					/* pass any non-NULL pointer */ }
595 ;
596 
597 block_size:
598 	/* Nothing */		{ $$ = NULL; }
599 	| PARS_BLOCK_SIZE_TOKEN	'=' PARS_INT_LIT
600 			{ $$ = $3; }
601 ;
602 
603 create_table:
604 	PARS_CREATE_TOKEN PARS_TABLE_TOKEN
605 	table_name '(' column_def_list ')'
606 	not_fit_in_memory compact block_size
607 				{ $$ = pars_create_table(
608 					static_cast<sym_node_t*>($3),
609 					static_cast<sym_node_t*>($5),
610 					static_cast<sym_node_t*>($8),
611 					static_cast<sym_node_t*>($9), $7); }
612 ;
613 
614 column_list:
615 	PARS_ID_TOKEN		{ $$ = que_node_list_add_last(NULL, $1); }
616 	| column_list ',' PARS_ID_TOKEN
617 				{ $$ = que_node_list_add_last($1, $3); }
618 ;
619 
620 unique_def:
621 	/* Nothing */		{ $$ = NULL; }
622 	| PARS_UNIQUE_TOKEN	{ $$ = &pars_unique_token; }
623 ;
624 
625 clustered_def:
626 	/* Nothing */		{ $$ = NULL; }
627 	| PARS_CLUSTERED_TOKEN	{ $$ = &pars_clustered_token; }
628 ;
629 
630 create_index:
631 	PARS_CREATE_TOKEN unique_def
632 	clustered_def
633 	PARS_INDEX_TOKEN
634 	PARS_ID_TOKEN PARS_ON_TOKEN
635 	table_name
636 	'(' column_list ')'	{ $$ = pars_create_index(
637 					static_cast<pars_res_word_t*>($2),
638 					static_cast<pars_res_word_t*>($3),
639 					static_cast<sym_node_t*>($5),
640 					static_cast<sym_node_t*>($7),
641 					static_cast<sym_node_t*>($9)); }
642 ;
643 
644 table_name:
645 	PARS_ID_TOKEN		{ $$ = $1; }
646 	| PARS_TABLE_NAME_TOKEN	{ $$ = $1; }
647 ;
648 
649 commit_statement:
650 	PARS_COMMIT_TOKEN PARS_WORK_TOKEN
651 				{ $$ = pars_commit_statement(); }
652 ;
653 
654 rollback_statement:
655 	PARS_ROLLBACK_TOKEN PARS_WORK_TOKEN
656 				{ $$ = pars_rollback_statement(); }
657 ;
658 
659 type_name:
660 	PARS_INT_TOKEN		{ $$ = &pars_int_token; }
661 	| PARS_INTEGER_TOKEN	{ $$ = &pars_int_token; }
662 	| PARS_BIGINT_TOKEN	{ $$ = &pars_bigint_token; }
663 	| PARS_CHAR_TOKEN	{ $$ = &pars_char_token; }
664 	| PARS_BINARY_TOKEN	{ $$ = &pars_binary_token; }
665 	| PARS_BLOB_TOKEN	{ $$ = &pars_blob_token; }
666 ;
667 
668 parameter_declaration:
669 	PARS_ID_TOKEN PARS_IN_TOKEN type_name
670 				{ $$ = pars_parameter_declaration(
671 					static_cast<sym_node_t*>($1),
672 					PARS_INPUT,
673 					static_cast<pars_res_word_t*>($3)); }
674 	| PARS_ID_TOKEN PARS_OUT_TOKEN type_name
675 				{ $$ = pars_parameter_declaration(
676 					static_cast<sym_node_t*>($1),
677 					PARS_OUTPUT,
678 					static_cast<pars_res_word_t*>($3)); }
679 ;
680 
681 parameter_declaration_list:
682 	/* Nothing */		{ $$ = NULL; }
683 	| parameter_declaration	{ $$ = que_node_list_add_last(NULL, $1); }
684 	| parameter_declaration_list ',' parameter_declaration
685 				{ $$ = que_node_list_add_last($1, $3); }
686 ;
687 
688 variable_declaration:
689 	PARS_ID_TOKEN type_name ';'
690 				{ $$ = pars_variable_declaration(
691 					static_cast<sym_node_t*>($1),
692 					static_cast<pars_res_word_t*>($2)); }
693 ;
694 
695 variable_declaration_list:
696 	/* Nothing */
697 	| variable_declaration
698 	| variable_declaration_list variable_declaration
699 ;
700 
701 cursor_declaration:
702 	PARS_DECLARE_TOKEN PARS_CURSOR_TOKEN PARS_ID_TOKEN
703 	PARS_IS_TOKEN select_statement ';'
704 				{ $$ = pars_cursor_declaration(
705 					static_cast<sym_node_t*>($3),
706 					static_cast<sel_node_t*>($5)); }
707 ;
708 
709 function_declaration:
710 	PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
711 				{ $$ = pars_function_declaration(
712 					static_cast<sym_node_t*>($3)); }
713 ;
714 
715 declaration:
716 	cursor_declaration
717 	| function_declaration
718 ;
719 
720 declaration_list:
721 	/* Nothing */
722 	| declaration
723 	| declaration_list declaration
724 ;
725 
726 procedure_definition:
727 	PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' parameter_declaration_list ')'
728 	PARS_IS_TOKEN
729 	variable_declaration_list
730 	declaration_list
731 	PARS_BEGIN_TOKEN
732 	statement_list
733 	PARS_END_TOKEN		{ $$ = pars_procedure_definition(
734 					static_cast<sym_node_t*>($2),
735 					static_cast<sym_node_t*>($4),
736 					$10); }
737 ;
738 
739 %%
740