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