~ubuntu-branches/ubuntu/trusty/drizzle/trusty

« back to all changes in this revision

Viewing changes to plugin/innobase/pars/pars0grm.y

  • Committer: Bazaar Package Importer
  • Author(s): Monty Taylor
  • Date: 2010-03-18 12:12:31 UTC
  • Revision ID: james.westby@ubuntu.com-20100318121231-k6g1xe6cshbwa0f8
Tags: upstream-2010.03.1347
ImportĀ upstreamĀ versionĀ 2010.03.1347

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*****************************************************************************
 
2
 
 
3
Copyright (c) 1997, 2009, Innobase Oy. All Rights Reserved.
 
4
 
 
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.
 
8
 
 
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.
 
12
 
 
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 02111-1307 USA
 
16
 
 
17
*****************************************************************************/
 
18
 
 
19
/******************************************************
 
20
SQL parser: input file for the GNU Bison parser generator
 
21
 
 
22
Look from pars0lex.l for instructions how to generate the C files for
 
23
the InnoDB parser.
 
24
 
 
25
Created 12/14/1997 Heikki Tuuri
 
26
*******************************************************/
 
27
 
 
28
%{
 
29
/* The value of the semantic attribute is a pointer to a query tree node
 
30
que_node_t */
 
31
 
 
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"
 
39
 
 
40
#define YYSTYPE que_node_t*
 
41
 
 
42
/* #define __STDC__ */
 
43
 
 
44
int
 
45
yylex(void);
 
46
%}
 
47
 
 
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
 
140
 
 
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 '%'
 
148
 
 
149
/* Grammar follows */
 
150
%%
 
151
 
 
152
top_statement:
 
153
        procedure_definition ';'
 
154
 
 
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 ';'
 
178
;
 
179
 
 
180
statement_list:
 
181
        statement               { $$ = que_node_list_add_last(NULL, $1); }
 
182
        | statement_list statement
 
183
                                { $$ = que_node_list_add_last($1, $2); }
 
184
;
 
185
 
 
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); }
 
216
;
 
217
 
 
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; }
 
231
;
 
232
 
 
233
question_mark_list:
 
234
        /* Nothing */
 
235
        | '?'
 
236
        | question_mark_list ',' '?'
 
237
;
 
238
 
 
239
stored_procedure_call:
 
240
        '{' PARS_ID_TOKEN '(' question_mark_list ')' '}'
 
241
                                { $$ = pars_stored_procedure_call($2); }
 
242
;
 
243
 
 
244
predefined_procedure_call:
 
245
        predefined_procedure_name '(' exp_list ')'
 
246
                                { $$ = pars_procedure_call($1, $3); }
 
247
;
 
248
 
 
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; }
 
253
;
 
254
 
 
255
user_function_call:
 
256
        PARS_ID_TOKEN '(' ')'   { $$ = $1; }
 
257
;
 
258
 
 
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); }
 
263
;
 
264
 
 
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); }
 
270
;
 
271
 
 
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); }
 
276
;
 
277
 
 
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)); }
 
295
;
 
296
 
 
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); }
 
302
;
 
303
 
 
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); }
 
310
;
 
311
 
 
312
search_condition:
 
313
        /* Nothing */           { $$ = NULL; }
 
314
        | PARS_WHERE_TOKEN exp  { $$ = $2; }
 
315
;
 
316
 
 
317
for_update_clause:
 
318
        /* Nothing */           { $$ = NULL; }
 
319
        | PARS_FOR_TOKEN PARS_UPDATE_TOKEN
 
320
                                { $$ = &pars_update_token; }
 
321
;
 
322
 
 
323
lock_shared_clause:
 
324
        /* Nothing */           { $$ = NULL; }
 
325
        | PARS_LOCK_TOKEN PARS_IN_TOKEN PARS_SHARE_TOKEN PARS_MODE_TOKEN
 
326
                                { $$ = &pars_share_token; }
 
327
;
 
328
 
 
329
order_direction:
 
330
        /* Nothing */           { $$ = &pars_asc_token; }
 
331
        | PARS_ASC_TOKEN        { $$ = &pars_asc_token; }
 
332
        | PARS_DESC_TOKEN       { $$ = &pars_desc_token; }
 
333
;
 
334
 
 
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); }
 
339
;
 
340
 
 
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); }
 
349
;
 
350
 
 
351
insert_statement_start:
 
352
        PARS_INSERT_TOKEN PARS_INTO_TOKEN
 
353
        PARS_ID_TOKEN           { $$ = $3; }
 
354
;
 
355
 
 
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); }
 
361
;
 
362
 
 
363
column_assignment:
 
364
        PARS_ID_TOKEN '=' exp   { $$ = pars_column_assignment($1, $3); }
 
365
;
 
366
 
 
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); }
 
371
;
 
372
 
 
373
cursor_positioned:
 
374
        PARS_WHERE_TOKEN
 
375
        PARS_CURRENT_TOKEN PARS_OF_TOKEN
 
376
        PARS_ID_TOKEN           { $$ = $4; }
 
377
;
 
378
 
 
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); }
 
384
;
 
385
 
 
386
update_statement_searched:
 
387
        update_statement_start
 
388
        search_condition        { $$ = pars_update_statement($1, NULL, $2); }
 
389
;
 
390
 
 
391
update_statement_positioned:
 
392
        update_statement_start
 
393
        cursor_positioned       { $$ = pars_update_statement($1, $2, NULL); }
 
394
;
 
395
 
 
396
delete_statement_start:
 
397
        PARS_DELETE_TOKEN PARS_FROM_TOKEN
 
398
        PARS_ID_TOKEN           { $$ = pars_update_statement_start(TRUE,
 
399
                                                                $3, NULL); }
 
400
;
 
401
 
 
402
delete_statement_searched:
 
403
        delete_statement_start
 
404
        search_condition        { $$ = pars_update_statement($1, NULL, $2); }
 
405
;
 
406
 
 
407
delete_statement_positioned:
 
408
        delete_statement_start
 
409
        cursor_positioned       { $$ = pars_update_statement($1, $2, NULL); }
 
410
;
 
411
 
 
412
row_printf_statement:
 
413
        PARS_ROW_PRINTF_TOKEN select_statement
 
414
                                { $$ = pars_row_printf_statement($2); }
 
415
;
 
416
 
 
417
assignment_statement:
 
418
        PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
 
419
                                { $$ = pars_assignment_statement($1, $3); }
 
420
;
 
421
 
 
422
elsif_element:
 
423
        PARS_ELSIF_TOKEN
 
424
        exp PARS_THEN_TOKEN statement_list
 
425
                                { $$ = pars_elsif_element($2, $4); }
 
426
;
 
427
 
 
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); }
 
432
;
 
433
 
 
434
else_part:
 
435
        /* Nothing */           { $$ = NULL; }
 
436
        | PARS_ELSE_TOKEN statement_list
 
437
                                { $$ = $2; }
 
438
        | elsif_list            { $$ = $1; }
 
439
;
 
440
 
 
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); }
 
446
;
 
447
 
 
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); }
 
452
;
 
453
 
 
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); }
 
460
;
 
461
 
 
462
exit_statement:
 
463
        PARS_EXIT_TOKEN         { $$ = pars_exit_statement(); }
 
464
;
 
465
 
 
466
return_statement:
 
467
        PARS_RETURN_TOKEN       { $$ = pars_return_statement(); }
 
468
;
 
469
 
 
470
open_cursor_statement:
 
471
        PARS_OPEN_TOKEN PARS_ID_TOKEN
 
472
                                { $$ = pars_open_statement(
 
473
                                                ROW_SEL_OPEN_CURSOR, $2); }
 
474
;
 
475
 
 
476
close_cursor_statement:
 
477
        PARS_CLOSE_TOKEN PARS_ID_TOKEN
 
478
                                { $$ = pars_open_statement(
 
479
                                                ROW_SEL_CLOSE_CURSOR, $2); }
 
480
;
 
481
 
 
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); }
 
487
;
 
488
 
 
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); }
 
492
;
 
493
 
 
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); }
 
498
;
 
499
 
 
500
opt_column_len:
 
501
        /* Nothing */           { $$ = NULL; }
 
502
        | '(' PARS_INT_LIT ')'
 
503
                                { $$ = $2; }
 
504
;
 
505
 
 
506
opt_unsigned:
 
507
        /* Nothing */           { $$ = NULL; }
 
508
        | PARS_UNSIGNED_TOKEN
 
509
                                { $$ = &pars_int_token;
 
510
                                        /* pass any non-NULL pointer */ }
 
511
;
 
512
 
 
513
opt_not_null:
 
514
        /* Nothing */           { $$ = NULL; }
 
515
        | PARS_NOT_TOKEN PARS_NULL_LIT
 
516
                                { $$ = &pars_int_token;
 
517
                                        /* pass any non-NULL pointer */ }
 
518
;
 
519
 
 
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 */ }
 
525
;
 
526
 
 
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); }
 
531
;
 
532
 
 
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); }
 
537
;
 
538
 
 
539
unique_def:
 
540
        /* Nothing */           { $$ = NULL; }
 
541
        | PARS_UNIQUE_TOKEN     { $$ = &pars_unique_token; }
 
542
;
 
543
 
 
544
clustered_def:
 
545
        /* Nothing */           { $$ = NULL; }
 
546
        | PARS_CLUSTERED_TOKEN  { $$ = &pars_clustered_token; }
 
547
;
 
548
 
 
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); }
 
555
;
 
556
 
 
557
commit_statement:
 
558
        PARS_COMMIT_TOKEN PARS_WORK_TOKEN
 
559
                                { $$ = pars_commit_statement(); }
 
560
;
 
561
 
 
562
rollback_statement:
 
563
        PARS_ROLLBACK_TOKEN PARS_WORK_TOKEN
 
564
                                { $$ = pars_rollback_statement(); }
 
565
;
 
566
 
 
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; }
 
573
;
 
574
 
 
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); }
 
582
;
 
583
 
 
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); }
 
589
;
 
590
 
 
591
variable_declaration:
 
592
        PARS_ID_TOKEN type_name ';'
 
593
                                { $$ = pars_variable_declaration($1, $2); }
 
594
;
 
595
 
 
596
variable_declaration_list:
 
597
        /* Nothing */
 
598
        | variable_declaration
 
599
        | variable_declaration_list variable_declaration
 
600
;
 
601
 
 
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); }
 
606
;
 
607
 
 
608
function_declaration:
 
609
        PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
 
610
                                { $$ = pars_function_declaration($3); }
 
611
;
 
612
 
 
613
declaration:
 
614
        cursor_declaration
 
615
        | function_declaration
 
616
;
 
617
 
 
618
declaration_list:
 
619
        /* Nothing */
 
620
        | declaration
 
621
        | declaration_list declaration
 
622
;
 
623
 
 
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); }
 
633
;
 
634
 
 
635
%%