~drizzle-trunk/drizzle/development

« back to all changes in this revision

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

  • Committer: lbieber
  • Date: 2010-10-01 13:06:31 UTC
  • mfrom: (1802.2.2 drizzle-bug-651948)
  • mto: This revision was merged to the branch mainline in revision 1805.
  • Revision ID: lbieber@orisndriz08-20101001130631-xubscnhmj7r5dn6g
Merge Andrew - Fix bug 651948 - Index lengths not retrieved using drizzledump

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 02110-1301 USA
16
 
 
17
 
*****************************************************************************/
18
 
 
19
 
/******************************************************
20
 
SQL parser: input file for the GNU Bison parser generator
21
 
 
22
 
Created 12/14/1997 Heikki Tuuri
23
 
*******************************************************/
24
 
 
25
 
%{
26
 
/* The value of the semantic attribute is a pointer to a query tree node
27
 
que_node_t */
28
 
 
29
 
#include "univ.i"
30
 
#include <math.h>                               /* Can't be before univ.i */
31
 
#include "pars0pars.h"
32
 
#include "mem0mem.h"
33
 
#include "que0types.h"
34
 
#include "que0que.h"
35
 
#include "row0sel.h"
36
 
 
37
 
#define YYSTYPE que_node_t*
38
 
#define YYENABLE_NLS 0
39
 
#define YYLTYPE_IS_TRIVIAL 0
40
 
 
41
 
/* #define __STDC__ */
42
 
 
43
 
extern "C" int yylex(void);
44
 
%}
45
 
 
46
 
%expect 27
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(static_cast<sym_node_t *>($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(static_cast<sym_node_t *>($1), static_cast<sym_node_t *>($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(static_cast<sym_node_t *>($3), static_cast<pars_res_word_t *>($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(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)); }
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(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)); }
361
 
;
362
 
 
363
 
column_assignment:
364
 
PARS_ID_TOKEN '=' exp   { $$ = pars_column_assignment(static_cast<sym_node_t *>($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
 
                                                                   static_cast<sym_node_t *>($2), static_cast<col_assign_node_t *>($4)); }
384
 
;
385
 
 
386
 
update_statement_searched:
387
 
        update_statement_start
388
 
        search_condition        { $$ = pars_update_statement(static_cast<upd_node_t *>($1), NULL, $2); }
389
 
;
390
 
 
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); }
394
 
;
395
 
 
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); }
400
 
;
401
 
 
402
 
delete_statement_searched:
403
 
        delete_statement_start
404
 
        search_condition        { $$ = pars_update_statement(static_cast<upd_node_t *>($1), NULL, $2); }
405
 
;
406
 
 
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); }
410
 
;
411
 
 
412
 
row_printf_statement:
413
 
        PARS_ROW_PRINTF_TOKEN select_statement
414
 
        { $$ = pars_row_printf_statement(static_cast<sel_node_t *>($2)); }
415
 
;
416
 
 
417
 
assignment_statement:
418
 
        PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
419
 
        { $$ = pars_assignment_statement(static_cast<sym_node_t *>($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(static_cast<sym_node_t *>($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(ROW_SEL_OPEN_CURSOR,
473
 
                                   static_cast<sym_node_t *>($2)); }
474
 
;
475
 
 
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)); }
480
 
;
481
 
 
482
 
fetch_statement:
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)); }
487
 
;
488
 
 
489
 
column_def:
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); }
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(static_cast<sym_node_t *>($3), static_cast<sym_node_t *>($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(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)); }
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(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)); }
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(static_cast<sym_node_t *>($1), static_cast<pars_res_word_t *>($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(static_cast<sym_node_t *>($3), static_cast<sel_node_t *>($5)); }
606
 
;
607
 
 
608
 
function_declaration:
609
 
        PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
610
 
        { $$ = pars_function_declaration(static_cast<sym_node_t *>($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(static_cast<sym_node_t *>($2), static_cast<sym_node_t *>($4),
632
 
                                                                $10); }
633
 
;
634
 
 
635
 
%%