~drizzle-trunk/drizzle/development

« back to all changes in this revision

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

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************
 
2
SQL parser: input file for the GNU Bison parser generator
 
3
 
 
4
(c) 1997 Innobase Oy
 
5
 
 
6
Created 12/14/1997 Heikki Tuuri
 
7
Published under the GPL version 2
 
8
 
 
9
Look from pars0lex.l for instructions how to generate the C files for
 
10
the InnoDB parser.
 
11
*******************************************************/
 
12
 
 
13
%{
 
14
/* The value of the semantic attribute is a pointer to a query tree node
 
15
que_node_t */
 
16
 
 
17
#include "univ.i"
 
18
#include <math.h>                               /* Can't be before univ.i */
 
19
#include "pars0pars.h"
 
20
#include "mem0mem.h"
 
21
#include "que0types.h"
 
22
#include "que0que.h"
 
23
#include "row0sel.h"
 
24
 
 
25
#define YYSTYPE que_node_t*
 
26
 
 
27
/* #define __STDC__ */
 
28
 
 
29
int
 
30
yylex(void);
 
31
%}
 
32
 
 
33
%token PARS_INT_LIT
 
34
%token PARS_FLOAT_LIT
 
35
%token PARS_STR_LIT
 
36
%token PARS_FIXBINARY_LIT
 
37
%token PARS_BLOB_LIT
 
38
%token PARS_NULL_LIT
 
39
%token PARS_ID_TOKEN
 
40
%token PARS_AND_TOKEN
 
41
%token PARS_OR_TOKEN
 
42
%token PARS_NOT_TOKEN
 
43
%token PARS_GE_TOKEN
 
44
%token PARS_LE_TOKEN
 
45
%token PARS_NE_TOKEN
 
46
%token PARS_PROCEDURE_TOKEN
 
47
%token PARS_IN_TOKEN
 
48
%token PARS_OUT_TOKEN
 
49
%token PARS_BINARY_TOKEN
 
50
%token PARS_BLOB_TOKEN
 
51
%token PARS_INT_TOKEN
 
52
%token PARS_INTEGER_TOKEN
 
53
%token PARS_FLOAT_TOKEN
 
54
%token PARS_CHAR_TOKEN
 
55
%token PARS_IS_TOKEN
 
56
%token PARS_BEGIN_TOKEN
 
57
%token PARS_END_TOKEN
 
58
%token PARS_IF_TOKEN
 
59
%token PARS_THEN_TOKEN
 
60
%token PARS_ELSE_TOKEN
 
61
%token PARS_ELSIF_TOKEN
 
62
%token PARS_LOOP_TOKEN
 
63
%token PARS_WHILE_TOKEN
 
64
%token PARS_RETURN_TOKEN
 
65
%token PARS_SELECT_TOKEN
 
66
%token PARS_SUM_TOKEN
 
67
%token PARS_COUNT_TOKEN
 
68
%token PARS_DISTINCT_TOKEN
 
69
%token PARS_FROM_TOKEN
 
70
%token PARS_WHERE_TOKEN
 
71
%token PARS_FOR_TOKEN
 
72
%token PARS_DDOT_TOKEN
 
73
%token PARS_READ_TOKEN
 
74
%token PARS_ORDER_TOKEN
 
75
%token PARS_BY_TOKEN
 
76
%token PARS_ASC_TOKEN
 
77
%token PARS_DESC_TOKEN
 
78
%token PARS_INSERT_TOKEN
 
79
%token PARS_INTO_TOKEN
 
80
%token PARS_VALUES_TOKEN
 
81
%token PARS_UPDATE_TOKEN
 
82
%token PARS_SET_TOKEN
 
83
%token PARS_DELETE_TOKEN
 
84
%token PARS_CURRENT_TOKEN
 
85
%token PARS_OF_TOKEN
 
86
%token PARS_CREATE_TOKEN
 
87
%token PARS_TABLE_TOKEN
 
88
%token PARS_INDEX_TOKEN
 
89
%token PARS_UNIQUE_TOKEN
 
90
%token PARS_CLUSTERED_TOKEN
 
91
%token PARS_DOES_NOT_FIT_IN_MEM_TOKEN
 
92
%token PARS_ON_TOKEN
 
93
%token PARS_ASSIGN_TOKEN
 
94
%token PARS_DECLARE_TOKEN
 
95
%token PARS_CURSOR_TOKEN
 
96
%token PARS_SQL_TOKEN
 
97
%token PARS_OPEN_TOKEN
 
98
%token PARS_FETCH_TOKEN
 
99
%token PARS_CLOSE_TOKEN
 
100
%token PARS_NOTFOUND_TOKEN
 
101
%token PARS_TO_CHAR_TOKEN
 
102
%token PARS_TO_NUMBER_TOKEN
 
103
%token PARS_TO_BINARY_TOKEN
 
104
%token PARS_BINARY_TO_NUMBER_TOKEN
 
105
%token PARS_SUBSTR_TOKEN
 
106
%token PARS_REPLSTR_TOKEN
 
107
%token PARS_CONCAT_TOKEN
 
108
%token PARS_INSTR_TOKEN
 
109
%token PARS_LENGTH_TOKEN
 
110
%token PARS_SYSDATE_TOKEN
 
111
%token PARS_PRINTF_TOKEN
 
112
%token PARS_ASSERT_TOKEN
 
113
%token PARS_RND_TOKEN
 
114
%token PARS_RND_STR_TOKEN
 
115
%token PARS_ROW_PRINTF_TOKEN
 
116
%token PARS_COMMIT_TOKEN
 
117
%token PARS_ROLLBACK_TOKEN
 
118
%token PARS_WORK_TOKEN
 
119
%token PARS_UNSIGNED_TOKEN
 
120
%token PARS_EXIT_TOKEN
 
121
%token PARS_FUNCTION_TOKEN
 
122
%token PARS_LOCK_TOKEN
 
123
%token PARS_SHARE_TOKEN
 
124
%token PARS_MODE_TOKEN
 
125
 
 
126
%left PARS_AND_TOKEN PARS_OR_TOKEN
 
127
%left PARS_NOT_TOKEN
 
128
%left '=' '<' '>' PARS_GE_TOKEN PARS_LE_TOKEN
 
129
%left '-' '+'
 
130
%left '*' '/'
 
131
%left NEG     /* negation--unary minus */
 
132
%left '%'
 
133
 
 
134
/* Grammar follows */
 
135
%%
 
136
 
 
137
top_statement:
 
138
        procedure_definition ';'
 
139
 
 
140
statement:
 
141
        stored_procedure_call
 
142
        | predefined_procedure_call ';'
 
143
        | while_statement ';'
 
144
        | for_statement ';'
 
145
        | exit_statement ';'
 
146
        | if_statement ';'
 
147
        | return_statement ';'
 
148
        | assignment_statement ';'
 
149
        | select_statement ';'
 
150
        | insert_statement ';'
 
151
        | row_printf_statement ';'
 
152
        | delete_statement_searched ';'
 
153
        | delete_statement_positioned ';'
 
154
        | update_statement_searched ';'
 
155
        | update_statement_positioned ';'
 
156
        | open_cursor_statement ';'
 
157
        | fetch_statement ';'
 
158
        | close_cursor_statement ';'
 
159
        | commit_statement ';'
 
160
        | rollback_statement ';'
 
161
        | create_table ';'
 
162
        | create_index ';'
 
163
;
 
164
 
 
165
statement_list:
 
166
        statement               { $$ = que_node_list_add_last(NULL, $1); }
 
167
        | statement_list statement
 
168
                                { $$ = que_node_list_add_last($1, $2); }
 
169
;
 
170
 
 
171
exp:
 
172
        PARS_ID_TOKEN           { $$ = $1;}
 
173
        | function_name '(' exp_list ')'
 
174
                                { $$ = pars_func($1, $3); }
 
175
        | PARS_INT_LIT          { $$ = $1;}
 
176
        | PARS_FLOAT_LIT        { $$ = $1;}
 
177
        | PARS_STR_LIT          { $$ = $1;}
 
178
        | PARS_FIXBINARY_LIT    { $$ = $1;}
 
179
        | PARS_BLOB_LIT         { $$ = $1;}
 
180
        | PARS_NULL_LIT         { $$ = $1;}
 
181
        | PARS_SQL_TOKEN        { $$ = $1;}
 
182
        | exp '+' exp           { $$ = pars_op('+', $1, $3); }
 
183
        | exp '-' exp           { $$ = pars_op('-', $1, $3); }
 
184
        | exp '*' exp           { $$ = pars_op('*', $1, $3); }
 
185
        | exp '/' exp           { $$ = pars_op('/', $1, $3); }
 
186
        | '-' exp %prec NEG     { $$ = pars_op('-', $2, NULL); }
 
187
        | '(' exp ')'           { $$ = $2; }
 
188
        | exp '=' exp           { $$ = pars_op('=', $1, $3); }
 
189
        | exp '<' exp           { $$ = pars_op('<', $1, $3); }
 
190
        | exp '>' exp           { $$ = pars_op('>', $1, $3); }
 
191
        | exp PARS_GE_TOKEN exp { $$ = pars_op(PARS_GE_TOKEN, $1, $3); }
 
192
        | exp PARS_LE_TOKEN exp { $$ = pars_op(PARS_LE_TOKEN, $1, $3); }
 
193
        | exp PARS_NE_TOKEN exp { $$ = pars_op(PARS_NE_TOKEN, $1, $3); }
 
194
        | exp PARS_AND_TOKEN exp{ $$ = pars_op(PARS_AND_TOKEN, $1, $3); }
 
195
        | exp PARS_OR_TOKEN exp { $$ = pars_op(PARS_OR_TOKEN, $1, $3); }
 
196
        | PARS_NOT_TOKEN exp    { $$ = pars_op(PARS_NOT_TOKEN, $2, NULL); }
 
197
        | PARS_ID_TOKEN '%' PARS_NOTFOUND_TOKEN
 
198
                                { $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
 
199
        | PARS_SQL_TOKEN '%' PARS_NOTFOUND_TOKEN
 
200
                                { $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
 
201
;
 
202
 
 
203
function_name:
 
204
        PARS_TO_CHAR_TOKEN      { $$ = &pars_to_char_token; }
 
205
        | PARS_TO_NUMBER_TOKEN  { $$ = &pars_to_number_token; }
 
206
        | PARS_TO_BINARY_TOKEN  { $$ = &pars_to_binary_token; }
 
207
        | PARS_BINARY_TO_NUMBER_TOKEN
 
208
                                { $$ = &pars_binary_to_number_token; }
 
209
        | PARS_SUBSTR_TOKEN     { $$ = &pars_substr_token; }
 
210
        | PARS_CONCAT_TOKEN     { $$ = &pars_concat_token; }
 
211
        | PARS_INSTR_TOKEN      { $$ = &pars_instr_token; }
 
212
        | PARS_LENGTH_TOKEN     { $$ = &pars_length_token; }
 
213
        | PARS_SYSDATE_TOKEN    { $$ = &pars_sysdate_token; }
 
214
        | PARS_RND_TOKEN        { $$ = &pars_rnd_token; }
 
215
        | PARS_RND_STR_TOKEN    { $$ = &pars_rnd_str_token; }
 
216
;
 
217
 
 
218
question_mark_list:
 
219
        /* Nothing */
 
220
        | '?'
 
221
        | question_mark_list ',' '?'
 
222
;
 
223
 
 
224
stored_procedure_call:
 
225
        '{' PARS_ID_TOKEN '(' question_mark_list ')' '}'
 
226
                                { $$ = pars_stored_procedure_call($2); }
 
227
;
 
228
 
 
229
predefined_procedure_call:
 
230
        predefined_procedure_name '(' exp_list ')'
 
231
                                { $$ = pars_procedure_call($1, $3); }
 
232
;
 
233
 
 
234
predefined_procedure_name:
 
235
        PARS_REPLSTR_TOKEN      { $$ = &pars_replstr_token; }
 
236
        | PARS_PRINTF_TOKEN     { $$ = &pars_printf_token; }
 
237
        | PARS_ASSERT_TOKEN     { $$ = &pars_assert_token; }
 
238
;
 
239
 
 
240
user_function_call:
 
241
        PARS_ID_TOKEN '(' ')'   { $$ = $1; }
 
242
;
 
243
 
 
244
table_list:
 
245
        PARS_ID_TOKEN           { $$ = que_node_list_add_last(NULL, $1); }
 
246
        | table_list ',' PARS_ID_TOKEN
 
247
                                { $$ = que_node_list_add_last($1, $3); }
 
248
;
 
249
 
 
250
variable_list:
 
251
        /* Nothing */           { $$ = NULL; }
 
252
        | PARS_ID_TOKEN         { $$ = que_node_list_add_last(NULL, $1); }
 
253
        | variable_list ',' PARS_ID_TOKEN
 
254
                                { $$ = que_node_list_add_last($1, $3); }
 
255
;
 
256
 
 
257
exp_list:
 
258
        /* Nothing */           { $$ = NULL; }
 
259
        | exp                   { $$ = que_node_list_add_last(NULL, $1);}
 
260
        | exp_list ',' exp      { $$ = que_node_list_add_last($1, $3); }
 
261
;
 
262
 
 
263
select_item:
 
264
        exp                     { $$ = $1; }
 
265
        | PARS_COUNT_TOKEN '(' '*' ')'
 
266
                                { $$ = pars_func(&pars_count_token,
 
267
                                          que_node_list_add_last(NULL,
 
268
                                            sym_tab_add_int_lit(
 
269
                                                pars_sym_tab_global, 1))); }
 
270
        | PARS_COUNT_TOKEN '(' PARS_DISTINCT_TOKEN PARS_ID_TOKEN ')'
 
271
                                { $$ = pars_func(&pars_count_token,
 
272
                                            que_node_list_add_last(NULL,
 
273
                                                pars_func(&pars_distinct_token,
 
274
                                                     que_node_list_add_last(
 
275
                                                                NULL, $4)))); }
 
276
        | PARS_SUM_TOKEN '(' exp ')'
 
277
                                { $$ = pars_func(&pars_sum_token,
 
278
                                                que_node_list_add_last(NULL,
 
279
                                                                        $3)); }
 
280
;
 
281
 
 
282
select_item_list:
 
283
        /* Nothing */           { $$ = NULL; }
 
284
        | select_item           { $$ = que_node_list_add_last(NULL, $1); }
 
285
        | select_item_list ',' select_item
 
286
                                { $$ = que_node_list_add_last($1, $3); }
 
287
;
 
288
 
 
289
select_list:
 
290
        '*'                     { $$ = pars_select_list(&pars_star_denoter,
 
291
                                                                NULL); }
 
292
        | select_item_list PARS_INTO_TOKEN variable_list
 
293
                                { $$ = pars_select_list($1, $3); }
 
294
        | select_item_list      { $$ = pars_select_list($1, NULL); }
 
295
;
 
296
 
 
297
search_condition:
 
298
        /* Nothing */           { $$ = NULL; }
 
299
        | PARS_WHERE_TOKEN exp  { $$ = $2; }
 
300
;
 
301
 
 
302
for_update_clause:
 
303
        /* Nothing */           { $$ = NULL; }
 
304
        | PARS_FOR_TOKEN PARS_UPDATE_TOKEN
 
305
                                { $$ = &pars_update_token; }
 
306
;
 
307
 
 
308
lock_shared_clause:
 
309
        /* Nothing */           { $$ = NULL; }
 
310
        | PARS_LOCK_TOKEN PARS_IN_TOKEN PARS_SHARE_TOKEN PARS_MODE_TOKEN
 
311
                                { $$ = &pars_share_token; }
 
312
;
 
313
 
 
314
order_direction:
 
315
        /* Nothing */           { $$ = &pars_asc_token; }
 
316
        | PARS_ASC_TOKEN        { $$ = &pars_asc_token; }
 
317
        | PARS_DESC_TOKEN       { $$ = &pars_desc_token; }
 
318
;
 
319
 
 
320
order_by_clause:
 
321
        /* Nothing */           { $$ = NULL; }
 
322
        | PARS_ORDER_TOKEN PARS_BY_TOKEN PARS_ID_TOKEN order_direction
 
323
                                { $$ = pars_order_by($3, $4); }
 
324
;
 
325
 
 
326
select_statement:
 
327
        PARS_SELECT_TOKEN select_list
 
328
        PARS_FROM_TOKEN table_list
 
329
        search_condition
 
330
        for_update_clause
 
331
        lock_shared_clause
 
332
        order_by_clause         { $$ = pars_select_statement($2, $4, $5,
 
333
                                                                $6, $7, $8); }
 
334
;
 
335
 
 
336
insert_statement_start:
 
337
        PARS_INSERT_TOKEN PARS_INTO_TOKEN
 
338
        PARS_ID_TOKEN           { $$ = $3; }
 
339
;
 
340
 
 
341
insert_statement:
 
342
        insert_statement_start PARS_VALUES_TOKEN '(' exp_list ')'
 
343
                                { $$ = pars_insert_statement($1, $4, NULL); }
 
344
        | insert_statement_start select_statement
 
345
                                { $$ = pars_insert_statement($1, NULL, $2); }
 
346
;
 
347
 
 
348
column_assignment:
 
349
        PARS_ID_TOKEN '=' exp   { $$ = pars_column_assignment($1, $3); }
 
350
;
 
351
 
 
352
column_assignment_list:
 
353
        column_assignment       { $$ = que_node_list_add_last(NULL, $1); }
 
354
        | column_assignment_list ',' column_assignment
 
355
                                { $$ = que_node_list_add_last($1, $3); }
 
356
;
 
357
 
 
358
cursor_positioned:
 
359
        PARS_WHERE_TOKEN
 
360
        PARS_CURRENT_TOKEN PARS_OF_TOKEN
 
361
        PARS_ID_TOKEN           { $$ = $4; }
 
362
;
 
363
 
 
364
update_statement_start:
 
365
        PARS_UPDATE_TOKEN PARS_ID_TOKEN
 
366
        PARS_SET_TOKEN
 
367
        column_assignment_list  { $$ = pars_update_statement_start(FALSE,
 
368
                                                                $2, $4); }
 
369
;
 
370
 
 
371
update_statement_searched:
 
372
        update_statement_start
 
373
        search_condition        { $$ = pars_update_statement($1, NULL, $2); }
 
374
;
 
375
 
 
376
update_statement_positioned:
 
377
        update_statement_start
 
378
        cursor_positioned       { $$ = pars_update_statement($1, $2, NULL); }
 
379
;
 
380
 
 
381
delete_statement_start:
 
382
        PARS_DELETE_TOKEN PARS_FROM_TOKEN
 
383
        PARS_ID_TOKEN           { $$ = pars_update_statement_start(TRUE,
 
384
                                                                $3, NULL); }
 
385
;
 
386
 
 
387
delete_statement_searched:
 
388
        delete_statement_start
 
389
        search_condition        { $$ = pars_update_statement($1, NULL, $2); }
 
390
;
 
391
 
 
392
delete_statement_positioned:
 
393
        delete_statement_start
 
394
        cursor_positioned       { $$ = pars_update_statement($1, $2, NULL); }
 
395
;
 
396
 
 
397
row_printf_statement:
 
398
        PARS_ROW_PRINTF_TOKEN select_statement
 
399
                                { $$ = pars_row_printf_statement($2); }
 
400
;
 
401
 
 
402
assignment_statement:
 
403
        PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
 
404
                                { $$ = pars_assignment_statement($1, $3); }
 
405
;
 
406
 
 
407
elsif_element:
 
408
        PARS_ELSIF_TOKEN
 
409
        exp PARS_THEN_TOKEN statement_list
 
410
                                { $$ = pars_elsif_element($2, $4); }
 
411
;
 
412
 
 
413
elsif_list:
 
414
        elsif_element           { $$ = que_node_list_add_last(NULL, $1); }
 
415
        | elsif_list elsif_element
 
416
                                { $$ = que_node_list_add_last($1, $2); }
 
417
;
 
418
 
 
419
else_part:
 
420
        /* Nothing */           { $$ = NULL; }
 
421
        | PARS_ELSE_TOKEN statement_list
 
422
                                { $$ = $2; }
 
423
        | elsif_list            { $$ = $1; }
 
424
;
 
425
 
 
426
if_statement:
 
427
        PARS_IF_TOKEN exp PARS_THEN_TOKEN statement_list
 
428
        else_part
 
429
        PARS_END_TOKEN PARS_IF_TOKEN
 
430
                                { $$ = pars_if_statement($2, $4, $5); }
 
431
;
 
432
 
 
433
while_statement:
 
434
        PARS_WHILE_TOKEN exp PARS_LOOP_TOKEN statement_list
 
435
        PARS_END_TOKEN PARS_LOOP_TOKEN
 
436
                                { $$ = pars_while_statement($2, $4); }
 
437
;
 
438
 
 
439
for_statement:
 
440
        PARS_FOR_TOKEN PARS_ID_TOKEN PARS_IN_TOKEN
 
441
        exp PARS_DDOT_TOKEN exp
 
442
        PARS_LOOP_TOKEN statement_list
 
443
        PARS_END_TOKEN PARS_LOOP_TOKEN
 
444
                                { $$ = pars_for_statement($2, $4, $6, $8); }
 
445
;
 
446
 
 
447
exit_statement:
 
448
        PARS_EXIT_TOKEN         { $$ = pars_exit_statement(); }
 
449
;
 
450
 
 
451
return_statement:
 
452
        PARS_RETURN_TOKEN       { $$ = pars_return_statement(); }
 
453
;
 
454
 
 
455
open_cursor_statement:
 
456
        PARS_OPEN_TOKEN PARS_ID_TOKEN
 
457
                                { $$ = pars_open_statement(
 
458
                                                ROW_SEL_OPEN_CURSOR, $2); }
 
459
;
 
460
 
 
461
close_cursor_statement:
 
462
        PARS_CLOSE_TOKEN PARS_ID_TOKEN
 
463
                                { $$ = pars_open_statement(
 
464
                                                ROW_SEL_CLOSE_CURSOR, $2); }
 
465
;
 
466
 
 
467
fetch_statement:
 
468
        PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN variable_list
 
469
                                { $$ = pars_fetch_statement($2, $4, NULL); }
 
470
        | PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN user_function_call
 
471
                                { $$ = pars_fetch_statement($2, NULL, $4); }
 
472
;
 
473
 
 
474
column_def:
 
475
        PARS_ID_TOKEN type_name opt_column_len opt_unsigned opt_not_null
 
476
                                { $$ = pars_column_def($1, $2, $3, $4, $5); }
 
477
;
 
478
 
 
479
column_def_list:
 
480
        column_def              { $$ = que_node_list_add_last(NULL, $1); }
 
481
        | column_def_list ',' column_def
 
482
                                { $$ = que_node_list_add_last($1, $3); }
 
483
;
 
484
 
 
485
opt_column_len:
 
486
        /* Nothing */           { $$ = NULL; }
 
487
        | '(' PARS_INT_LIT ')'
 
488
                                { $$ = $2; }
 
489
;
 
490
 
 
491
opt_unsigned:
 
492
        /* Nothing */           { $$ = NULL; }
 
493
        | PARS_UNSIGNED_TOKEN
 
494
                                { $$ = &pars_int_token;
 
495
                                        /* pass any non-NULL pointer */ }
 
496
;
 
497
 
 
498
opt_not_null:
 
499
        /* Nothing */           { $$ = NULL; }
 
500
        | PARS_NOT_TOKEN PARS_NULL_LIT
 
501
                                { $$ = &pars_int_token;
 
502
                                        /* pass any non-NULL pointer */ }
 
503
;
 
504
 
 
505
not_fit_in_memory:
 
506
        /* Nothing */           { $$ = NULL; }
 
507
        | PARS_DOES_NOT_FIT_IN_MEM_TOKEN
 
508
                                { $$ = &pars_int_token;
 
509
                                        /* pass any non-NULL pointer */ }
 
510
;
 
511
 
 
512
create_table:
 
513
        PARS_CREATE_TOKEN PARS_TABLE_TOKEN
 
514
        PARS_ID_TOKEN '(' column_def_list ')'
 
515
        not_fit_in_memory       { $$ = pars_create_table($3, $5, $7); }
 
516
;
 
517
 
 
518
column_list:
 
519
        PARS_ID_TOKEN           { $$ = que_node_list_add_last(NULL, $1); }
 
520
        | column_list ',' PARS_ID_TOKEN
 
521
                                { $$ = que_node_list_add_last($1, $3); }
 
522
;
 
523
 
 
524
unique_def:
 
525
        /* Nothing */           { $$ = NULL; }
 
526
        | PARS_UNIQUE_TOKEN     { $$ = &pars_unique_token; }
 
527
;
 
528
 
 
529
clustered_def:
 
530
        /* Nothing */           { $$ = NULL; }
 
531
        | PARS_CLUSTERED_TOKEN  { $$ = &pars_clustered_token; }
 
532
;
 
533
 
 
534
create_index:
 
535
        PARS_CREATE_TOKEN unique_def
 
536
        clustered_def
 
537
        PARS_INDEX_TOKEN
 
538
        PARS_ID_TOKEN PARS_ON_TOKEN PARS_ID_TOKEN
 
539
        '(' column_list ')'     { $$ = pars_create_index($2, $3, $5, $7, $9); }
 
540
;
 
541
 
 
542
commit_statement:
 
543
        PARS_COMMIT_TOKEN PARS_WORK_TOKEN
 
544
                                { $$ = pars_commit_statement(); }
 
545
;
 
546
 
 
547
rollback_statement:
 
548
        PARS_ROLLBACK_TOKEN PARS_WORK_TOKEN
 
549
                                { $$ = pars_rollback_statement(); }
 
550
;
 
551
 
 
552
type_name:
 
553
        PARS_INT_TOKEN          { $$ = &pars_int_token; }
 
554
        | PARS_INTEGER_TOKEN    { $$ = &pars_int_token; }
 
555
        | PARS_CHAR_TOKEN       { $$ = &pars_char_token; }
 
556
        | PARS_BINARY_TOKEN     { $$ = &pars_binary_token; }
 
557
        | PARS_BLOB_TOKEN       { $$ = &pars_blob_token; }
 
558
;
 
559
 
 
560
parameter_declaration:
 
561
        PARS_ID_TOKEN PARS_IN_TOKEN type_name
 
562
                                { $$ = pars_parameter_declaration($1,
 
563
                                                        PARS_INPUT, $3); }
 
564
        | PARS_ID_TOKEN PARS_OUT_TOKEN type_name
 
565
                                { $$ = pars_parameter_declaration($1,
 
566
                                                        PARS_OUTPUT, $3); }
 
567
;
 
568
 
 
569
parameter_declaration_list:
 
570
        /* Nothing */           { $$ = NULL; }
 
571
        | parameter_declaration { $$ = que_node_list_add_last(NULL, $1); }
 
572
        | parameter_declaration_list ',' parameter_declaration
 
573
                                { $$ = que_node_list_add_last($1, $3); }
 
574
;
 
575
 
 
576
variable_declaration:
 
577
        PARS_ID_TOKEN type_name ';'
 
578
                                { $$ = pars_variable_declaration($1, $2); }
 
579
;
 
580
 
 
581
variable_declaration_list:
 
582
        /* Nothing */
 
583
        | variable_declaration
 
584
        | variable_declaration_list variable_declaration
 
585
;
 
586
 
 
587
cursor_declaration:
 
588
        PARS_DECLARE_TOKEN PARS_CURSOR_TOKEN PARS_ID_TOKEN
 
589
        PARS_IS_TOKEN select_statement ';'
 
590
                                { $$ = pars_cursor_declaration($3, $5); }
 
591
;
 
592
 
 
593
function_declaration:
 
594
        PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
 
595
                                { $$ = pars_function_declaration($3); }
 
596
;
 
597
 
 
598
declaration:
 
599
        cursor_declaration
 
600
        | function_declaration
 
601
;
 
602
 
 
603
declaration_list:
 
604
        /* Nothing */
 
605
        | declaration
 
606
        | declaration_list declaration
 
607
;
 
608
 
 
609
procedure_definition:
 
610
        PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' parameter_declaration_list ')'
 
611
        PARS_IS_TOKEN
 
612
        variable_declaration_list
 
613
        declaration_list
 
614
        PARS_BEGIN_TOKEN
 
615
        statement_list
 
616
        PARS_END_TOKEN          { $$ = pars_procedure_definition($2, $4,
 
617
                                                                $10); }
 
618
;
 
619
 
 
620
%%