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., 59 Temple
15
Place, Suite 330, Boston, MA 02110-1301 USA
17
*****************************************************************************/
19
/******************************************************
20
SQL parser: input file for the GNU Bison parser generator
22
Created 12/14/1997 Heikki Tuuri
23
*******************************************************/
26
/* The value of the semantic attribute is a pointer to a query tree node
30
#include <math.h> /* Can't be before univ.i */
31
#include "pars0pars.h"
33
#include "que0types.h"
37
#define YYSTYPE que_node_t*
38
#define YYENABLE_NLS 0
39
#define YYLTYPE_IS_TRIVIAL 0
41
/* #define __STDC__ */
43
extern "C" int yylex(void);
51
%token PARS_FIXBINARY_LIT
61
%token PARS_PROCEDURE_TOKEN
64
%token PARS_BINARY_TOKEN
65
%token PARS_BLOB_TOKEN
67
%token PARS_INTEGER_TOKEN
68
%token PARS_FLOAT_TOKEN
69
%token PARS_CHAR_TOKEN
71
%token PARS_BEGIN_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
82
%token PARS_COUNT_TOKEN
83
%token PARS_DISTINCT_TOKEN
84
%token PARS_FROM_TOKEN
85
%token PARS_WHERE_TOKEN
87
%token PARS_DDOT_TOKEN
88
%token PARS_READ_TOKEN
89
%token PARS_ORDER_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
98
%token PARS_DELETE_TOKEN
99
%token PARS_CURRENT_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
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
143
%left '=' '<' '>' PARS_GE_TOKEN PARS_LE_TOKEN
146
%left NEG /* negation--unary minus */
149
/* Grammar follows */
153
procedure_definition ';'
156
stored_procedure_call
157
| predefined_procedure_call ';'
158
| while_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 ';'
181
statement { $$ = que_node_list_add_last(NULL, $1); }
182
| statement_list statement
183
{ $$ = que_node_list_add_last($1, $2); }
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); }
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; }
236
| question_mark_list ',' '?'
239
stored_procedure_call:
240
'{' PARS_ID_TOKEN '(' question_mark_list ')' '}'
241
{ $$ = pars_stored_procedure_call(static_cast<sym_node_t *>($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; }
256
PARS_ID_TOKEN '(' ')' { $$ = $1; }
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); }
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); }
273
/* Nothing */ { $$ = NULL; }
274
| exp { $$ = que_node_list_add_last(NULL, $1);}
275
| exp_list ',' exp { $$ = que_node_list_add_last($1, $3); }
280
| PARS_COUNT_TOKEN '(' '*' ')'
281
{ $$ = pars_func(&pars_count_token,
282
que_node_list_add_last(NULL,
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(
291
| PARS_SUM_TOKEN '(' exp ')'
292
{ $$ = pars_func(&pars_sum_token,
293
que_node_list_add_last(NULL,
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); }
305
'*' { $$ = pars_select_list(&pars_star_denoter,
307
| select_item_list PARS_INTO_TOKEN variable_list
308
{ $$ = pars_select_list(static_cast<sym_node_t *>($1), static_cast<sym_node_t *>($3)); }
309
| select_item_list { $$ = pars_select_list($1, NULL); }
313
/* Nothing */ { $$ = NULL; }
314
| PARS_WHERE_TOKEN exp { $$ = $2; }
318
/* Nothing */ { $$ = NULL; }
319
| PARS_FOR_TOKEN PARS_UPDATE_TOKEN
320
{ $$ = &pars_update_token; }
324
/* Nothing */ { $$ = NULL; }
325
| PARS_LOCK_TOKEN PARS_IN_TOKEN PARS_SHARE_TOKEN PARS_MODE_TOKEN
326
{ $$ = &pars_share_token; }
330
/* Nothing */ { $$ = &pars_asc_token; }
331
| PARS_ASC_TOKEN { $$ = &pars_asc_token; }
332
| PARS_DESC_TOKEN { $$ = &pars_desc_token; }
336
/* Nothing */ { $$ = NULL; }
337
| PARS_ORDER_TOKEN PARS_BY_TOKEN PARS_ID_TOKEN order_direction
338
{ $$ = pars_order_by(static_cast<sym_node_t *>($3), static_cast<pars_res_word_t *>($4)); }
342
PARS_SELECT_TOKEN select_list
343
PARS_FROM_TOKEN table_list
347
order_by_clause { $$ = pars_select_statement(static_cast<sel_node_t *>($2), static_cast<sym_node_t *>($4), $5,
348
static_cast<pars_res_word_t *>($6), static_cast<pars_res_word_t *>($7), static_cast<order_node_t *>($8)); }
351
insert_statement_start:
352
PARS_INSERT_TOKEN PARS_INTO_TOKEN
353
PARS_ID_TOKEN { $$ = $3; }
357
insert_statement_start PARS_VALUES_TOKEN '(' exp_list ')'
358
{ $$ = pars_insert_statement(static_cast<sym_node_t *>($1), $4, NULL); }
359
| insert_statement_start select_statement
360
{ $$ = pars_insert_statement(static_cast<sym_node_t *>($1), NULL, static_cast<sel_node_t *>($2)); }
364
PARS_ID_TOKEN '=' exp { $$ = pars_column_assignment(static_cast<sym_node_t *>($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); }
375
PARS_CURRENT_TOKEN PARS_OF_TOKEN
376
PARS_ID_TOKEN { $$ = $4; }
379
update_statement_start:
380
PARS_UPDATE_TOKEN PARS_ID_TOKEN
382
column_assignment_list { $$ = pars_update_statement_start(FALSE,
383
static_cast<sym_node_t *>($2), static_cast<col_assign_node_t *>($4)); }
386
update_statement_searched:
387
update_statement_start
388
search_condition { $$ = pars_update_statement(static_cast<upd_node_t *>($1), NULL, $2); }
391
update_statement_positioned:
392
update_statement_start
393
cursor_positioned { $$ = pars_update_statement(static_cast<upd_node_t *>($1), static_cast<sym_node_t *>($2), NULL); }
396
delete_statement_start:
397
PARS_DELETE_TOKEN PARS_FROM_TOKEN
398
PARS_ID_TOKEN { $$ = pars_update_statement_start(TRUE,
399
static_cast<sym_node_t *>($3), NULL); }
402
delete_statement_searched:
403
delete_statement_start
404
search_condition { $$ = pars_update_statement(static_cast<upd_node_t *>($1), NULL, $2); }
407
delete_statement_positioned:
408
delete_statement_start
409
cursor_positioned { $$ = pars_update_statement(static_cast<upd_node_t *>($1), static_cast<sym_node_t *>($2), NULL); }
412
row_printf_statement:
413
PARS_ROW_PRINTF_TOKEN select_statement
414
{ $$ = pars_row_printf_statement(static_cast<sel_node_t *>($2)); }
417
assignment_statement:
418
PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
419
{ $$ = pars_assignment_statement(static_cast<sym_node_t *>($1), $3); }
424
exp PARS_THEN_TOKEN statement_list
425
{ $$ = pars_elsif_element($2, $4); }
429
elsif_element { $$ = que_node_list_add_last(NULL, $1); }
430
| elsif_list elsif_element
431
{ $$ = que_node_list_add_last($1, $2); }
435
/* Nothing */ { $$ = NULL; }
436
| PARS_ELSE_TOKEN statement_list
438
| elsif_list { $$ = $1; }
442
PARS_IF_TOKEN exp PARS_THEN_TOKEN statement_list
444
PARS_END_TOKEN PARS_IF_TOKEN
445
{ $$ = pars_if_statement($2, $4, $5); }
449
PARS_WHILE_TOKEN exp PARS_LOOP_TOKEN statement_list
450
PARS_END_TOKEN PARS_LOOP_TOKEN
451
{ $$ = pars_while_statement($2, $4); }
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(static_cast<sym_node_t *>($2), $4, $6, $8); }
463
PARS_EXIT_TOKEN { $$ = pars_exit_statement(); }
467
PARS_RETURN_TOKEN { $$ = pars_return_statement(); }
470
open_cursor_statement:
471
PARS_OPEN_TOKEN PARS_ID_TOKEN
472
{ $$ = pars_open_statement(ROW_SEL_OPEN_CURSOR,
473
static_cast<sym_node_t *>($2)); }
476
close_cursor_statement:
477
PARS_CLOSE_TOKEN PARS_ID_TOKEN
478
{ $$ = pars_open_statement(ROW_SEL_CLOSE_CURSOR,
479
static_cast<sym_node_t *>($2)); }
483
PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN variable_list
484
{ $$ = pars_fetch_statement(static_cast<sym_node_t *>($2), static_cast<sym_node_t *>($4), NULL); }
485
| PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN user_function_call
486
{ $$ = pars_fetch_statement(static_cast<sym_node_t *>($2), NULL, static_cast<sym_node_t *>($4)); }
490
PARS_ID_TOKEN type_name opt_column_len opt_unsigned opt_not_null
491
{ $$ = pars_column_def(static_cast<sym_node_t *>($1), static_cast<pars_res_word_t *>($2), static_cast<sym_node_t *>($3), $4, $5); }
495
column_def { $$ = que_node_list_add_last(NULL, $1); }
496
| column_def_list ',' column_def
497
{ $$ = que_node_list_add_last($1, $3); }
501
/* Nothing */ { $$ = NULL; }
502
| '(' PARS_INT_LIT ')'
507
/* Nothing */ { $$ = NULL; }
508
| PARS_UNSIGNED_TOKEN
509
{ $$ = &pars_int_token;
510
/* pass any non-NULL pointer */ }
514
/* Nothing */ { $$ = NULL; }
515
| PARS_NOT_TOKEN PARS_NULL_LIT
516
{ $$ = &pars_int_token;
517
/* pass any non-NULL pointer */ }
521
/* Nothing */ { $$ = NULL; }
522
| PARS_DOES_NOT_FIT_IN_MEM_TOKEN
523
{ $$ = &pars_int_token;
524
/* pass any non-NULL pointer */ }
528
PARS_CREATE_TOKEN PARS_TABLE_TOKEN
529
PARS_ID_TOKEN '(' column_def_list ')'
530
not_fit_in_memory { $$ = pars_create_table(static_cast<sym_node_t *>($3), static_cast<sym_node_t *>($5), $7); }
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); }
540
/* Nothing */ { $$ = NULL; }
541
| PARS_UNIQUE_TOKEN { $$ = &pars_unique_token; }
545
/* Nothing */ { $$ = NULL; }
546
| PARS_CLUSTERED_TOKEN { $$ = &pars_clustered_token; }
550
PARS_CREATE_TOKEN unique_def
553
PARS_ID_TOKEN PARS_ON_TOKEN PARS_ID_TOKEN
554
'(' column_list ')' { $$ = pars_create_index(static_cast<pars_res_word_t *>($2), static_cast<pars_res_word_t *>($3), static_cast<sym_node_t *>($5), static_cast<sym_node_t *>($7), static_cast<sym_node_t *>($9)); }
558
PARS_COMMIT_TOKEN PARS_WORK_TOKEN
559
{ $$ = pars_commit_statement(); }
563
PARS_ROLLBACK_TOKEN PARS_WORK_TOKEN
564
{ $$ = pars_rollback_statement(); }
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(static_cast<sym_node_t *>($1),
578
PARS_INPUT, static_cast<pars_res_word_t *>($3)); }
579
| PARS_ID_TOKEN PARS_OUT_TOKEN type_name
580
{ $$ = pars_parameter_declaration(static_cast<sym_node_t *>($1),
581
PARS_OUTPUT, static_cast<pars_res_word_t *>($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(static_cast<sym_node_t *>($1), static_cast<pars_res_word_t *>($2)); }
596
variable_declaration_list:
598
| variable_declaration
599
| variable_declaration_list variable_declaration
603
PARS_DECLARE_TOKEN PARS_CURSOR_TOKEN PARS_ID_TOKEN
604
PARS_IS_TOKEN select_statement ';'
605
{ $$ = pars_cursor_declaration(static_cast<sym_node_t *>($3), static_cast<sel_node_t *>($5)); }
608
function_declaration:
609
PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
610
{ $$ = pars_function_declaration(static_cast<sym_node_t *>($3)); }
615
| function_declaration
621
| declaration_list declaration
624
procedure_definition:
625
PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' parameter_declaration_list ')'
627
variable_declaration_list
631
PARS_END_TOKEN { $$ = pars_procedure_definition(static_cast<sym_node_t *>($2), static_cast<sym_node_t *>($4),