~ubuntu-branches/ubuntu/karmic/firebird2.1/karmic

« back to all changes in this revision

Viewing changes to src/dsql/parse.y

  • Committer: Bazaar Package Importer
  • Author(s): Damyan Ivanov
  • Date: 2008-05-26 23:59:25 UTC
  • Revision ID: james.westby@ubuntu.com-20080526235925-2pnqj6nxpppoeaer
Tags: upstream-2.1.0.17798-0.ds2
ImportĀ upstreamĀ versionĀ 2.1.0.17798-0.ds2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
%{
 
2
/* 
 
3
 *      PROGRAM:        Dynamic SQL runtime support
 
4
 *      MODULE:         parse.y
 
5
 *      DESCRIPTION:    Dynamic SQL parser
 
6
 *
 
7
 * The contents of this file are subject to the Interbase Public
 
8
 * License Version 1.0 (the "License"); you may not use this file
 
9
 * except in compliance with the License. You may obtain a copy
 
10
 * of the License at http://www.Inprise.com/IPL.html
 
11
 *
 
12
 * Software distributed under the License is distributed on an
 
13
 * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
 
14
 * or implied. See the License for the specific language governing
 
15
 * rights and limitations under the License.
 
16
 *
 
17
 * The Original Code was created by Inprise Corporation
 
18
 * and its predecessors. Portions created by Inprise Corporation are
 
19
 * Copyright (C) Inprise Corporation.
 
20
 *
 
21
 * All Rights Reserved.
 
22
 * Contributor(s): ______________________________________.
 
23
 *
 
24
 * 2002-02-24 Sean Leyne - Code Cleanup of old Win 3.1 port (WINDOWS_ONLY)
 
25
 * 2001.05.20 Neil McCalden: Allow a udf to be used in a 'group by' clause.
 
26
 * 2001.05.30 Claudio Valderrama: DROP TABLE and DROP VIEW lead now to two
 
27
 *   different node types so DDL can tell which is which.
 
28
 * 2001.06.13 Claudio Valderrama: SUBSTRING is being surfaced.
 
29
 * 2001.06.30 Claudio valderrama: Feed (line,column) for each node. See node.h.
 
30
 * 2001.07.10 Claudio Valderrama: Better (line,column) report and "--" for comments.
 
31
 * 2001.07.28 John Bellardo: Changes to support parsing LIMIT and FIRST
 
32
 * 2001.08.03 John Bellardo: Finalized syntax for LIMIT, change LIMIT to SKIP
 
33
 * 2001.08.05 Claudio Valderrama: closed Bug #448062 and other spaces that appear
 
34
 *   in rdb$*_source fields when altering domains plus one unexpected null pointer.
 
35
 * 2001.08.12 Claudio Valderrama: adjust SUBSTRING's starting pos argument here
 
36
 *   and not in gen.c; this closes Bug #450301.
 
37
 * 2001.10.01 Claudio Valderrama: enable explicit GRANT...to ROLE role_name.
 
38
 * 2001.10.06 Claudio Valderrama: Honor explicit USER keyword in GRANTs and REVOKEs.
 
39
 * 2002.07.05 Mark O'Donohue: change keyword DEBUG to KW_DEBUG to avoid
 
40
 *                      clashes with normal DEBUG macro.
 
41
 * 2002.07.30 Arno Brinkman:  
 
42
 * 2002.07.30   Let IN predicate handle value_expressions
 
43
 * 2002.07.30   tokens CASE, NULLIF, COALESCE added
 
44
 * 2002.07.30   See block < CASE expression > what is added to value as case_expression
 
45
 * 2002.07.30   function is split up into aggregate_function, numeric_value_function, string_value_function, generate_value_function
 
46
 * 2002.07.30   new group_by_function and added to grp_column_elem
 
47
 * 2002.07.30   cast removed from function and added as cast_specification to value
 
48
 * 2002.08.04 Claudio Valderrama: allow declaring and defining variables at the same time
 
49
 * 2002.08.04 Dmitry Yemanov: ALTER VIEW
 
50
 * 2002.08.06 Arno Brinkman: ordinal added to grp_column_elem for using positions in group by
 
51
 * 2002.08.07 Dmitry Yemanov: INT64/LARGEINT are replaced with BIGINT and available in dialect 3 only
 
52
 * 2002.08.31 Dmitry Yemanov: allowed user-defined index names for PK/FK/UK constraints
 
53
 * 2002.09.01 Dmitry Yemanov: RECREATE VIEW
 
54
 * 2002.09.28 Dmitry Yemanov: Reworked internal_info stuff, enhanced
 
55
 *                                                      exception handling in SPs/triggers,
 
56
 *                                                      implemented ROWS_AFFECTED system variable
 
57
 * 2002.10.21 Nickolay Samofatov: Added support for explicit pessimistic locks
 
58
 * 2002.10.29 Nickolay Samofatov: Added support for savepoints
 
59
 * 2002.12.03 Dmitry Yemanov: Implemented ORDER BY clause in subqueries.
 
60
 * 2002.12.18 Dmitry Yemanov: Added support for SQL-compliant labels and LEAVE statement
 
61
 * 2002.12.28 Dmitry Yemanov: Added support for parametrized events.
 
62
 * 2003.01.14 Dmitry Yemanov: Fixed bug with cursors in triggers.
 
63
 * 2003.01.15 Dmitry Yemanov: Added support for runtime trigger action checks.
 
64
 * 2003.02.10 Mike Nordell  : Undefined Microsoft introduced macros to get a clean compile.
 
65
 * 2003.05.24 Nickolay Samofatov: Make SKIP and FIRST non-reserved keywords
 
66
 * 2003.06.13 Nickolay Samofatov: Make INSERTING/UPDATING/DELETING non-reserved keywords
 
67
 * 2003.07.01 Blas Rodriguez Somoza: Change DEBUG and IN to avoid conflicts in win32 build/bison
 
68
 * 2003.08.11 Arno Brinkman: Changed GROUP BY to support all expressions and added "AS" support
 
69
 *                                                 with table alias. Also removed group_by_function and ordinal.
 
70
 * 2003.08.14 Arno Brinkman: Added support for derived tables.
 
71
 * 2003.10.05 Dmitry Yemanov: Added support for explicit cursors in PSQL.
 
72
 * 2004.01.16 Vlad Horsun: added support for default parameters and 
 
73
 *   EXECUTE BLOCK statement
 
74
 * Adriano dos Santos Fernandes
 
75
 */
 
76
 
 
77
#include "firebird.h"
 
78
#include <stdio.h>
 
79
#include <stdlib.h>
 
80
#include <string.h>
 
81
#include "../jrd/common.h"
 
82
#include <stdarg.h>
 
83
 
 
84
#include "gen/iberror.h"
 
85
#include "../dsql/dsql.h"
 
86
#include "../jrd/ibase.h"
 
87
#include "../jrd/flags.h"
 
88
#include "../dsql/errd_proto.h"
 
89
#include "../dsql/hsh_proto.h"
 
90
#include "../dsql/make_proto.h"
 
91
#include "../dsql/keywords.h"
 
92
#include "../dsql/misc_func.h"
 
93
#include "../jrd/gds_proto.h"
 
94
#include "../jrd/thd.h"
 
95
#include "../jrd/err_proto.h"
 
96
#include "../jrd/intlobj_new.h"
 
97
 
 
98
/* since UNIX isn't standard, we have to define
 
99
   stuff which is in <limits.h> (which isn't available
 
100
   on all UNIXes... */
 
101
 
 
102
const long SHRT_POS_MAX                 = 32767;
 
103
const long SHRT_UNSIGNED_MAX    = 65535;
 
104
const long SHRT_NEG_MAX                 = 32768;
 
105
const long LONG_POS_MAX                 = 2147483647;
 
106
const int POSITIVE      = 0;
 
107
const int NEGATIVE      = 1;
 
108
const int UNSIGNED      = 2;
 
109
 
 
110
//const int MIN_CACHE_BUFFERS   = 250;
 
111
//const int DEF_CACHE_BUFFERS   = 1000;
 
112
 
 
113
/* Fix 69th procedure problem - solution from Oleg Loa */
 
114
#define YYSTACKSIZE     2048
 
115
#define YYMAXDEPTH      2048
 
116
 
 
117
/* Make bison allocate static stack */
 
118
#define YYINITDEPTH 2048
 
119
 
 
120
// Using this option causes build problems on Win32 with bison 1.28
 
121
//#define YYSTACK_USE_ALLOCA 1
 
122
 
 
123
typedef dsql_nod* YYSTYPE;
 
124
#define YYSTYPE YYSTYPE
 
125
#if defined(DEBUG) || defined(DEV_BUILD)
 
126
#define YYDEBUG         1
 
127
#endif
 
128
 
 
129
#define YYMALLOC gds__alloc
 
130
#define YYFREE gds__free
 
131
 
 
132
static const char INTERNAL_FIELD_NAME[] = "DSQL internal"; /* NTX: placeholder */
 
133
 
 
134
inline SLONG trigger_type_suffix(const int slot1, const int slot2, const int slot3)
 
135
{
 
136
        return ((slot1 << 1) | (slot2 << 3) | (slot3 << 5));
 
137
}
 
138
 
 
139
 
 
140
dsql_nod* DSQL_parse;
 
141
 
 
142
 
 
143
#define YYPARSE_PARAM_TYPE
 
144
#define YYPARSE_PARAM USHORT client_dialect, USHORT db_dialect, USHORT parser_version, bool* stmt_ambiguous
 
145
 
 
146
#include "../dsql/chars.h"
 
147
 
 
148
const int MAX_TOKEN_LEN = 256;
 
149
 
 
150
static const TEXT* lex_position();
 
151
#ifdef NOT_USED_OR_REPLACED
 
152
static bool             long_int(dsql_nod*, SLONG*);
 
153
#endif
 
154
static dsql_fld*        make_field (dsql_nod*);
 
155
static dsql_fil*        make_file();
 
156
static dsql_nod*        make_list (dsql_nod*);
 
157
static dsql_nod*        make_node (NOD_TYPE, int, ...);
 
158
static dsql_nod*        make_parameter (void);
 
159
static dsql_nod*        make_flag_node (NOD_TYPE, SSHORT, int, ...);
 
160
static void     prepare_console_debug (int, int  *);
 
161
#ifdef NOT_USED_OR_REPLACED
 
162
static bool     short_int(dsql_nod*, SLONG*, SSHORT);
 
163
#endif
 
164
static void     stack_nodes (dsql_nod*, DsqlNodStack&);
 
165
inline static int       yylex (USHORT, USHORT, USHORT, bool*);
 
166
 
 
167
static void     yyerror(const TEXT*);
 
168
static void     yyabandon (SLONG, ISC_STATUS);
 
169
 
 
170
inline void check_bound(const char* const to, const char* const string)
 
171
{
 
172
        if ((to - string) >= MAX_TOKEN_LEN)
 
173
                yyabandon (-104, isc_token_too_long);
 
174
}
 
175
 
 
176
inline void check_copy_incr(char*& to, const char ch, const char* const string)
 
177
{
 
178
        check_bound(to, string); 
 
179
        *to++ = ch;
 
180
}
 
181
 
 
182
struct LexerState {
 
183
        /* This is, in fact, parser state. Not used in lexer itself */
 
184
        dsql_fld* g_field;
 
185
        dsql_fil* g_file;
 
186
        dsql_nod* g_field_name;
 
187
        int dsql_debug;
 
188
        
 
189
        /* Actual lexer state begins from here */
 
190
        const TEXT* beginning;
 
191
        const TEXT* ptr;
 
192
        const TEXT* end;
 
193
        const TEXT* last_token;
 
194
        const TEXT* line_start;
 
195
        const TEXT* last_token_bk;
 
196
        const TEXT* line_start_bk;
 
197
        SSHORT  lines, att_charset;
 
198
        SSHORT  lines_bk;
 
199
        int  prev_keyword;
 
200
        USHORT  param_number;
 
201
        
 
202
        int yylex (
 
203
                USHORT  client_dialect,
 
204
                USHORT  db_dialect,
 
205
                USHORT  parser_version,
 
206
                bool* stmt_ambiguous);
 
207
};
 
208
 
 
209
/* Get ready for thread-safety. Move this to BISON object pointer when we 
 
210
   switch to generating "pure" reenterant parser. */
 
211
static LexerState lex;
 
212
 
 
213
%}
 
214
 
 
215
 
 
216
/* token declarations */
 
217
 
 
218
/* Tokens are organized chronologically by date added.
 
219
   See dsql/keywords.cpp for a list organized alphabetically */
 
220
 
 
221
/* Tokens in v4.0 -- not separated into v3 and v4 tokens */
 
222
 
 
223
%token ACTIVE
 
224
%token ADD
 
225
%token AFTER
 
226
%token ALL
 
227
%token ALTER
 
228
%token AND
 
229
%token ANY
 
230
%token AS
 
231
%token ASC
 
232
%token AT
 
233
%token AVG
 
234
%token AUTO
 
235
%token BEFORE
 
236
%token BEGIN
 
237
%token BETWEEN
 
238
%token BLOB
 
239
%token BY
 
240
%token CAST
 
241
%token CHARACTER
 
242
%token CHECK
 
243
%token COLLATE
 
244
%token COMMA
 
245
%token COMMIT
 
246
%token COMMITTED
 
247
%token COMPUTED
 
248
%token CONCATENATE
 
249
%token CONDITIONAL
 
250
%token CONSTRAINT
 
251
%token CONTAINING
 
252
%token COUNT
 
253
%token CREATE
 
254
%token CSTRING
 
255
%token CURRENT
 
256
%token CURSOR
 
257
%token DATABASE
 
258
%token DATE
 
259
%token DB_KEY
 
260
%token KW_DEBUG
 
261
%token DECIMAL
 
262
%token DECLARE
 
263
%token DEFAULT
 
264
%token KW_DELETE
 
265
%token DESC
 
266
%token DISTINCT
 
267
%token DO
 
268
%token DOMAIN
 
269
%token DROP
 
270
%token ELSE
 
271
%token END
 
272
%token ENTRY_POINT
 
273
%token EQL
 
274
%token ESCAPE
 
275
%token EXCEPTION
 
276
%token EXECUTE
 
277
%token EXISTS
 
278
%token EXIT
 
279
%token EXTERNAL
 
280
%token FILTER
 
281
%token FOR
 
282
%token FOREIGN
 
283
%token FROM
 
284
%token FULL
 
285
%token FUNCTION
 
286
%token GDSCODE
 
287
%token GEQ
 
288
%token GENERATOR
 
289
%token GEN_ID
 
290
%token GRANT
 
291
%token GROUP
 
292
%token GTR
 
293
%token HAVING
 
294
%token IF
 
295
%token KW_IN
 
296
%token INACTIVE
 
297
%token INNER
 
298
%token INPUT_TYPE
 
299
%token INDEX
 
300
%token INSERT
 
301
%token INTEGER
 
302
%token INTO
 
303
%token IS
 
304
%token ISOLATION
 
305
%token JOIN
 
306
%token KEY
 
307
%token KW_CHAR
 
308
%token KW_DEC
 
309
%token KW_DOUBLE
 
310
%token KW_FILE
 
311
%token KW_FLOAT
 
312
%token KW_INT
 
313
%token KW_LONG
 
314
%token KW_NULL
 
315
%token KW_NUMERIC
 
316
%token KW_UPPER
 
317
%token KW_VALUE
 
318
%token LENGTH
 
319
%token LPAREN
 
320
%token LEFT
 
321
%token LEQ
 
322
%token LEVEL
 
323
%token LIKE
 
324
%token LSS
 
325
%token MANUAL
 
326
%token MAXIMUM
 
327
%token MAX_SEGMENT
 
328
%token MERGE
 
329
%token MINIMUM
 
330
%token MODULE_NAME
 
331
%token NAMES
 
332
%token NATIONAL
 
333
%token NATURAL
 
334
%token NCHAR
 
335
%token NEQ
 
336
%token NO
 
337
%token NOT
 
338
%token NOT_GTR
 
339
%token NOT_LSS
 
340
%token OF
 
341
%token ON
 
342
%token ONLY
 
343
%token OPTION
 
344
%token OR
 
345
%token ORDER
 
346
%token OUTER
 
347
%token OUTPUT_TYPE
 
348
%token OVERFLOW
 
349
%token PAGE
 
350
%token PAGES
 
351
%token KW_PAGE_SIZE
 
352
%token PARAMETER
 
353
%token PASSWORD
 
354
%token PLAN
 
355
%token POSITION
 
356
%token POST_EVENT
 
357
%token PRECISION
 
358
%token PRIMARY
 
359
%token PRIVILEGES
 
360
%token PROCEDURE
 
361
%token PROTECTED
 
362
%token READ
 
363
%token REAL
 
364
%token REFERENCES
 
365
%token RESERVING
 
366
%token RETAIN
 
367
%token RETURNING_VALUES
 
368
%token RETURNS
 
369
%token REVOKE
 
370
%token RIGHT
 
371
%token RPAREN
 
372
%token ROLLBACK
 
373
%token SEGMENT
 
374
%token SELECT
 
375
%token SET
 
376
%token SHADOW
 
377
%token KW_SHARED
 
378
%token SINGULAR
 
379
%token KW_SIZE
 
380
%token SMALLINT
 
381
%token SNAPSHOT
 
382
%token SOME
 
383
%token SORT
 
384
%token SQLCODE
 
385
%token STABILITY
 
386
%token STARTING
 
387
%token STATISTICS
 
388
%token SUB_TYPE
 
389
%token SUSPEND
 
390
%token SUM
 
391
%token TABLE
 
392
%token THEN
 
393
%token TO
 
394
%token TRANSACTION
 
395
%token TRIGGER
 
396
%token UNCOMMITTED
 
397
%token UNION
 
398
%token UNIQUE
 
399
%token UPDATE
 
400
%token USER
 
401
%token VALUES
 
402
%token VARCHAR
 
403
%token VARIABLE
 
404
%token VARYING
 
405
%token VERSION
 
406
%token VIEW
 
407
%token WAIT
 
408
%token WHEN
 
409
%token WHERE
 
410
%token WHILE
 
411
%token WITH
 
412
%token WORK
 
413
%token WRITE
 
414
 
 
415
%token FLOAT_NUMBER NUMBER NUMERIC SYMBOL STRING INTRODUCER 
 
416
 
 
417
/* New tokens added v5.0 */
 
418
 
 
419
%token ACTION
 
420
%token ADMIN
 
421
%token CASCADE
 
422
%token FREE_IT                  /* ISC SQL extension */
 
423
%token RESTRICT
 
424
%token ROLE
 
425
 
 
426
/* New tokens added v6.0 */
 
427
 
 
428
%token COLUMN
 
429
%token TYPE
 
430
%token EXTRACT
 
431
%token YEAR
 
432
%token MONTH
 
433
%token DAY
 
434
%token HOUR
 
435
%token MINUTE
 
436
%token SECOND
 
437
%token WEEKDAY                  /* ISC SQL extension */
 
438
%token YEARDAY                  /* ISC SQL extension */
 
439
%token TIME
 
440
%token TIMESTAMP
 
441
%token CURRENT_DATE
 
442
%token CURRENT_TIME
 
443
%token CURRENT_TIMESTAMP
 
444
 
 
445
/* special aggregate token types returned by lex in v6.0 */
 
446
 
 
447
%token NUMBER64BIT SCALEDINT
 
448
 
 
449
/* CVC: Special Firebird additions. */
 
450
 
 
451
%token CURRENT_USER
 
452
%token CURRENT_ROLE
 
453
%token KW_BREAK
 
454
%token SUBSTRING
 
455
%token RECREATE
 
456
%token KW_DESCRIPTOR
 
457
%token FIRST
 
458
%token SKIP
 
459
 
 
460
/* tokens added for Firebird 1.5 */
 
461
 
 
462
%token CURRENT_CONNECTION
 
463
%token CURRENT_TRANSACTION
 
464
%token BIGINT
 
465
%token CASE
 
466
%token NULLIF
 
467
%token COALESCE
 
468
%token USING
 
469
%token NULLS
 
470
%token LAST
 
471
%token ROW_COUNT
 
472
%token LOCK
 
473
%token SAVEPOINT
 
474
%token RELEASE
 
475
%token STATEMENT
 
476
%token LEAVE
 
477
%token INSERTING
 
478
%token UPDATING
 
479
%token DELETING
 
480
 
 
481
/* tokens added for Firebird 2.0 */
 
482
 
 
483
%token BACKUP
 
484
%token KW_DIFFERENCE
 
485
%token OPEN
 
486
%token CLOSE
 
487
%token FETCH
 
488
%token ROWS
 
489
%token BLOCK
 
490
%token IIF
 
491
%token SCALAR_ARRAY
 
492
%token CROSS
 
493
%token NEXT
 
494
%token SEQUENCE
 
495
%token RESTART
 
496
%token BOTH
 
497
%token COLLATION
 
498
%token COMMENT
 
499
%token BIT_LENGTH
 
500
%token CHAR_LENGTH
 
501
%token CHARACTER_LENGTH
 
502
%token LEADING
 
503
%token KW_LOWER
 
504
%token OCTET_LENGTH
 
505
%token TRAILING
 
506
%token TRIM
 
507
%token RETURNING
 
508
%token KW_IGNORE
 
509
%token LIMBO
 
510
%token UNDO
 
511
%token REQUESTS
 
512
%token TIMEOUT
 
513
 
 
514
/* tokens added for Firebird 2.1 */
 
515
 
 
516
%token ABS
 
517
%token ACCENT
 
518
%token ACOS
 
519
%token ALWAYS
 
520
%token ASCII_CHAR
 
521
%token ASCII_VAL
 
522
%token ASIN
 
523
%token ATAN
 
524
%token ATAN2
 
525
%token BIN_AND
 
526
%token BIN_OR
 
527
%token BIN_SHL
 
528
%token BIN_SHR
 
529
%token BIN_XOR
 
530
%token CEIL
 
531
%token CONNECT
 
532
%token COS
 
533
%token COSH
 
534
%token COT
 
535
%token DATEADD
 
536
%token DATEDIFF
 
537
%token DECODE
 
538
%token DISCONNECT
 
539
%token EXP
 
540
%token FLOOR
 
541
%token GEN_UUID
 
542
%token GENERATED
 
543
%token GLOBAL 
 
544
%token HASH
 
545
%token INSENSITIVE
 
546
%token LIST
 
547
%token LN
 
548
%token LOG
 
549
%token LOG10
 
550
%token LPAD
 
551
%token MATCHED
 
552
%token MATCHING
 
553
%token MAXVALUE
 
554
%token MILLISECOND
 
555
%token MINVALUE
 
556
%token MOD
 
557
%token OVERLAY
 
558
%token PAD
 
559
%token PI
 
560
%token PLACING
 
561
%token POWER
 
562
%token PRESERVE
 
563
%token RAND
 
564
%token RECURSIVE 
 
565
%token REPLACE
 
566
%token REVERSE
 
567
%token ROUND
 
568
%token RPAD
 
569
%token SENSITIVE
 
570
%token SIGN
 
571
%token SIN
 
572
%token SINH
 
573
%token SPACE
 
574
%token SQRT
 
575
%token START
 
576
%token TAN
 
577
%token TANH
 
578
%token TEMPORARY 
 
579
%token TRUNC
 
580
%token WEEK
 
581
 
 
582
/* precedence declarations for expression evaluation */
 
583
 
 
584
%left   OR
 
585
%left   AND
 
586
%left   NOT
 
587
%left   '=' '<' '>' LIKE EQL NEQ GTR LSS GEQ LEQ NOT_GTR NOT_LSS
 
588
%left   '+' '-'
 
589
%left   '*' '/'
 
590
%left   CONCATENATE
 
591
%left   COLLATE
 
592
 
 
593
/* Fix the dangling IF-THEN-ELSE problem */
 
594
%nonassoc THEN
 
595
%nonassoc ELSE
 
596
 
 
597
/* The same issue exists with ALTER COLUMN now that keywords can be used
 
598
   in order to change their names.  The syntax which shows the issue is:
 
599
         ALTER COLUMN where column is part of the alter statement
 
600
           or
 
601
         ALTER COLUMN where column is the name of the column in the relation
 
602
*/
 
603
%nonassoc ALTER
 
604
%nonassoc COLUMN
 
605
 
 
606
%%
 
607
 
 
608
/* list of possible statements */
 
609
 
 
610
top             : statement
 
611
                        { DSQL_parse = $1; }
 
612
                | statement ';'
 
613
                        { DSQL_parse = $1; }
 
614
                ;
 
615
 
 
616
statement       : alter
 
617
                | blob_io
 
618
                | comment
 
619
                | commit
 
620
                | create
 
621
                | create_or_alter
 
622
                | declare
 
623
                | delete
 
624
                | drop
 
625
                | grant
 
626
                | insert
 
627
                | merge
 
628
                | exec_procedure
 
629
                | exec_block
 
630
                | recreate
 
631
                | revoke
 
632
                | rollback
 
633
                | savepoint
 
634
                | select
 
635
                | set
 
636
                | update
 
637
                | update_or_insert
 
638
                | KW_DEBUG signed_short_integer
 
639
                        { prepare_console_debug ((IPTR) $2, &yydebug);
 
640
                          $$ = make_node (nod_null, (int) 0, NULL); }
 
641
                ;
 
642
 
 
643
 
 
644
/* GRANT statement */
 
645
 
 
646
grant   : GRANT privileges ON table_noise simple_table_name
 
647
                        TO non_role_grantee_list grant_option
 
648
                        { $$ = make_node (nod_grant, (int) e_grant_count, 
 
649
                                        $2, $5, make_list($7), $8); }
 
650
                | GRANT proc_privileges ON PROCEDURE simple_proc_name
 
651
                        TO non_role_grantee_list grant_option
 
652
                        { $$ = make_node (nod_grant, (int) e_grant_count, 
 
653
                                        $2, $5, make_list($7), $8); }
 
654
                | GRANT role_name_list TO role_grantee_list role_admin_option
 
655
                        { $$ = make_node (nod_grant, (int) e_grant_count, 
 
656
                                        make_list($2), make_list($4), NULL, $5); }
 
657
                ;
 
658
 
 
659
table_noise     : TABLE
 
660
                |
 
661
                ;
 
662
 
 
663
privileges      : ALL
 
664
                        { $$ = make_node (nod_all, (int) 0, NULL); }
 
665
                | ALL PRIVILEGES
 
666
                        { $$ = make_node (nod_all, (int) 0, NULL); }
 
667
                | privilege_list
 
668
                        { $$ = make_list ($1); }
 
669
                ;
 
670
 
 
671
privilege_list  : privilege
 
672
                | privilege_list ',' privilege
 
673
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
674
                ;
 
675
 
 
676
proc_privileges : EXECUTE
 
677
                        { $$ = make_list (make_node (nod_execute, (int) 0, NULL)); }
 
678
                ;
 
679
 
 
680
privilege       : SELECT
 
681
                        { $$ = make_node (nod_select, (int) 0, NULL); }
 
682
                | INSERT
 
683
                        { $$ = make_node (nod_insert, (int) 0, NULL); }
 
684
                | KW_DELETE
 
685
                        { $$ = make_node (nod_delete, (int) 0, NULL); }
 
686
                | UPDATE column_parens_opt
 
687
                        { $$ = make_node (nod_update, (int) 1, $2); }
 
688
                | REFERENCES column_parens_opt
 
689
                        { $$ = make_node (nod_references, (int) 1, $2); }
 
690
                ;
 
691
 
 
692
grant_option    : WITH GRANT OPTION
 
693
                        { $$ = make_node (nod_grant, (int) 0, NULL); }
 
694
                |
 
695
                        { $$ = NULL; }
 
696
                ;
 
697
 
 
698
role_admin_option   : WITH ADMIN OPTION
 
699
                        { $$ = make_node (nod_grant_admin, (int) 0, NULL); }
 
700
                |
 
701
                        { $$ = NULL; }
 
702
                ;
 
703
 
 
704
simple_proc_name: symbol_procedure_name
 
705
                        { $$ = make_node (nod_procedure_name, (int) 1, $1); }
 
706
                ;
 
707
 
 
708
 
 
709
/* REVOKE statement */
 
710
 
 
711
revoke  : REVOKE rev_grant_option privileges ON table_noise simple_table_name
 
712
                        FROM non_role_grantee_list
 
713
                        { $$ = make_node (nod_revoke, (int) e_grant_count,
 
714
                                        $3, $6, make_list($8), $2); }
 
715
                | REVOKE rev_grant_option proc_privileges ON PROCEDURE simple_proc_name
 
716
                        FROM non_role_grantee_list
 
717
                        { $$ = make_node (nod_revoke, (int) e_grant_count,
 
718
                                        $3, $6, make_list($8), $2); }
 
719
                | REVOKE rev_admin_option role_name_list FROM role_grantee_list
 
720
                        { $$ = make_node (nod_revoke, (int) e_grant_count,
 
721
                                        make_list($3), make_list($5), NULL, $2); }
 
722
                ; 
 
723
 
 
724
rev_grant_option : GRANT OPTION FOR
 
725
                        { $$ = make_node (nod_grant, (int) 0, NULL); }
 
726
                |
 
727
                        { $$ = NULL; }
 
728
                ;
 
729
 
 
730
rev_admin_option : ADMIN OPTION FOR
 
731
                        { $$ = make_node (nod_grant_admin, (int) 0, NULL); }
 
732
                |
 
733
                        { $$ = NULL; }
 
734
                ;
 
735
 
 
736
non_role_grantee_list   : grantee_list
 
737
                | user_grantee_list
 
738
                ;
 
739
 
 
740
grantee_list    : grantee
 
741
                | grantee_list ',' grantee
 
742
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
743
                | grantee_list ',' user_grantee
 
744
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
745
                | user_grantee_list ',' grantee
 
746
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
747
                ;
 
748
 
 
749
grantee : PROCEDURE symbol_procedure_name
 
750
                { $$ = make_node (nod_proc_obj, (int) 1, $2); }
 
751
        | TRIGGER symbol_trigger_name
 
752
                { $$ = make_node (nod_trig_obj, (int) 1, $2); }
 
753
        | VIEW symbol_view_name
 
754
                { $$ = make_node (nod_view_obj, (int) 1, $2); }
 
755
        | ROLE symbol_role_name
 
756
                        { $$ = make_node (nod_role_name, (int) 1, $2); }
 
757
        ;
 
758
 
 
759
user_grantee_list : user_grantee
 
760
                | user_grantee_list ',' user_grantee
 
761
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
762
                ;
 
763
 
 
764
/* CVC: In the future we can deprecate the first implicit form since we'll support
 
765
explicit grant/revoke for both USER and ROLE keywords & object types. */
 
766
 
 
767
user_grantee    : symbol_user_name
 
768
                { $$ = make_node (nod_user_name, (int) 1, $1); }
 
769
        | USER symbol_user_name
 
770
                { $$ = make_node (nod_user_name, (int) 2, $2, NULL); }
 
771
        | GROUP symbol_user_name
 
772
                { $$ = make_node (nod_user_group, (int) 1, $2); }
 
773
        ;
 
774
 
 
775
role_name_list  : role_name
 
776
                | role_name_list ',' role_name
 
777
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
778
                ;
 
779
 
 
780
role_name   : symbol_role_name
 
781
                { $$ = make_node (nod_role_name, (int) 1, $1); }
 
782
                ;
 
783
 
 
784
role_grantee_list  : role_grantee
 
785
                | role_grantee_list ',' role_grantee
 
786
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
787
                ;
 
788
 
 
789
role_grantee   : symbol_user_name
 
790
                { $$ = make_node (nod_user_name, (int) 1, $1); }
 
791
        | USER symbol_user_name
 
792
                { $$ = make_node (nod_user_name, (int) 1, $2); }
 
793
                ;
 
794
 
 
795
 
 
796
/* DECLARE operations */
 
797
 
 
798
declare         : DECLARE declare_clause
 
799
                        { $$ = $2;}
 
800
                ;
 
801
 
 
802
declare_clause  : FILTER filter_decl_clause
 
803
                        { $$ = $2; }
 
804
                | EXTERNAL FUNCTION udf_decl_clause
 
805
                        { $$ = $3; }
 
806
                ;
 
807
 
 
808
 
 
809
udf_decl_clause : symbol_UDF_name arg_desc_list1 RETURNS return_value1
 
810
                        ENTRY_POINT sql_string MODULE_NAME sql_string
 
811
                                { $$ = make_node (nod_def_udf, (int) e_udf_count, 
 
812
                                $1, $6, $8, make_list ($2), $4); }
 
813
                ;
 
814
 
 
815
udf_data_type   : simple_type
 
816
                | BLOB
 
817
                        { lex.g_field->fld_dtype = dtype_blob; }
 
818
                | CSTRING '(' pos_short_integer ')' charset_clause
 
819
                        { 
 
820
                        lex.g_field->fld_dtype = dtype_cstring; 
 
821
                        lex.g_field->fld_character_length = (USHORT)(IPTR) $3; }
 
822
                ;
 
823
 
 
824
arg_desc_list1  : 
 
825
                        { $$ = NULL; }
 
826
                | arg_desc_list 
 
827
                | '(' arg_desc_list ')' 
 
828
                        { $$ = $2; }
 
829
                ;
 
830
 
 
831
arg_desc_list   : arg_desc
 
832
                | arg_desc_list ',' arg_desc
 
833
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
834
                ;
 
835
 
 
836
/*arg_desc      : init_data_type udf_data_type
 
837
  { $$ = $1; } */
 
838
arg_desc        : init_data_type udf_data_type param_mechanism
 
839
                        { $$ = make_node (nod_udf_param, (int) e_udf_param_count,
 
840
                                                          $1, $3); }
 
841
                ;
 
842
 
 
843
param_mechanism :
 
844
                        { $$ = NULL; } /* Beware: ddl.cpp converts this to mean FUN_reference. */
 
845
                | BY KW_DESCRIPTOR
 
846
                        { $$ = MAKE_const_slong (Jrd::FUN_descriptor); }
 
847
                | BY SCALAR_ARRAY
 
848
                        { $$ = MAKE_const_slong (Jrd::FUN_scalar_array); }
 
849
                | KW_NULL
 
850
                        { $$ = MAKE_const_slong (Jrd::FUN_ref_with_null); }
 
851
                ;
 
852
 
 
853
return_value1   : return_value
 
854
                | '(' return_value ')'
 
855
                        { $$ = $2; }
 
856
                ;
 
857
                
 
858
return_value    : init_data_type udf_data_type return_mechanism
 
859
                        { $$ = make_node (nod_udf_return_value, (int) e_udf_param_count,
 
860
                                                          $1, $3); }
 
861
                | PARAMETER pos_short_integer
 
862
                        { $$ = make_node (nod_udf_return_value, (int) e_udf_param_count,
 
863
                                NULL, MAKE_const_slong ((IPTR) $2));}
 
864
                ;
 
865
 
 
866
return_mechanism :
 
867
                        { $$ = MAKE_const_slong (Jrd::FUN_reference); }
 
868
                | BY KW_VALUE
 
869
                        { $$ = MAKE_const_slong (Jrd::FUN_value); }
 
870
                | BY KW_DESCRIPTOR
 
871
                        { $$ = MAKE_const_slong (Jrd::FUN_descriptor); }
 
872
                | FREE_IT
 
873
                        { $$ = MAKE_const_slong (-1 * Jrd::FUN_reference); }
 
874
                                                                                 /* FUN_refrence with FREE_IT is -ve */
 
875
                | BY KW_DESCRIPTOR FREE_IT
 
876
                        { $$ = MAKE_const_slong (-1 * Jrd::FUN_descriptor); }
 
877
                ;
 
878
 
 
879
 
 
880
filter_decl_clause : symbol_filter_name INPUT_TYPE blob_filter_subtype OUTPUT_TYPE blob_filter_subtype
 
881
                        ENTRY_POINT sql_string MODULE_NAME sql_string
 
882
                                { $$ = make_node (nod_def_filter, (int) e_filter_count, 
 
883
                                                $1, $3, $5, $7, $9); }
 
884
                ;
 
885
 
 
886
blob_filter_subtype :   symbol_blob_subtype_name
 
887
                                { $$ = MAKE_constant ((dsql_str*) $1, CONSTANT_STRING); }
 
888
                |
 
889
                                                signed_short_integer
 
890
                                { $$ = MAKE_const_slong ((IPTR) $1); }
 
891
                ;
 
892
 
 
893
/* CREATE metadata operations */
 
894
 
 
895
create          : CREATE create_clause
 
896
                        { $$ = $2; }
 
897
                ;
 
898
 
 
899
create_clause   : EXCEPTION exception_clause
 
900
                        { $$ = $2; }
 
901
                | unique_opt order_direction INDEX symbol_index_name ON simple_table_name index_definition
 
902
                        { $$ = make_node (nod_def_index, (int) e_idx_count, 
 
903
                                        $1, $2, $4, $6, $7); }
 
904
                | PROCEDURE procedure_clause
 
905
                        { $$ = $2; }
 
906
                | TABLE table_clause
 
907
                        { $$ = $2; }
 
908
                | GLOBAL TEMPORARY TABLE gtt_table_clause
 
909
                        { $$ = $4; }
 
910
                | TRIGGER trigger_clause
 
911
                        { $$ = $2; }
 
912
                | VIEW view_clause
 
913
                        { $$ = $2; }
 
914
                | GENERATOR generator_clause
 
915
                        { $$ = $2; }
 
916
                | SEQUENCE generator_clause
 
917
                        { $$ = $2; }
 
918
                | DATABASE db_clause
 
919
                        { $$ = $2; }
 
920
                | DOMAIN domain_clause
 
921
                        { $$ = $2; }
 
922
                | SHADOW shadow_clause
 
923
                        { $$ = $2; }
 
924
                | ROLE role_clause
 
925
                        { $$ = $2; }
 
926
                | COLLATION collation_clause
 
927
                        { $$ = $2; }
 
928
                ;
 
929
 
 
930
 
 
931
recreate        : RECREATE recreate_clause
 
932
                        { $$ = $2; }
 
933
                ;
 
934
 
 
935
recreate_clause : PROCEDURE rprocedure_clause
 
936
                        { $$ = $2; }
 
937
                | TABLE rtable_clause
 
938
                        { $$ = $2; }
 
939
                | GLOBAL TEMPORARY TABLE gtt_recreate_clause
 
940
                        { $$ = $4; }
 
941
                | VIEW rview_clause
 
942
                        { $$ = $2; }
 
943
                | TRIGGER rtrigger_clause
 
944
                        { $$ = $2; }
 
945
/*
 
946
                | DOMAIN rdomain_clause
 
947
                        { $$ = $2; }
 
948
*/
 
949
                | EXCEPTION rexception_clause
 
950
                        { $$ = $2; }
 
951
                ;
 
952
 
 
953
create_or_alter : CREATE OR ALTER replace_clause
 
954
                        { $$ = $4; }
 
955
                ;
 
956
 
 
957
replace_clause  : PROCEDURE replace_procedure_clause
 
958
                        { $$ = $2; }
 
959
                | TRIGGER replace_trigger_clause
 
960
                        { $$ = $2; }
 
961
/*
 
962
                | VIEW replace_view_clause
 
963
                        { $$ = $2; }
 
964
*/
 
965
                | EXCEPTION replace_exception_clause
 
966
                        { $$ = $2; }
 
967
                ;
 
968
 
 
969
 
 
970
/* CREATE EXCEPTION */
 
971
 
 
972
exception_clause        : symbol_exception_name sql_string
 
973
                        { $$ = make_node (nod_def_exception, (int) e_xcp_count, 
 
974
                                                $1, $2); }
 
975
                ;
 
976
 
 
977
rexception_clause       : symbol_exception_name sql_string
 
978
                        { $$ = make_node (nod_redef_exception, (int) e_xcp_count, 
 
979
                                                $1, $2); }
 
980
                ;
 
981
 
 
982
replace_exception_clause        : symbol_exception_name sql_string
 
983
                        { $$ = make_node (nod_replace_exception, (int) e_xcp_count, 
 
984
                                                $1, $2); }
 
985
                ;
 
986
 
 
987
alter_exception_clause  : symbol_exception_name sql_string
 
988
                        { $$ = make_node (nod_mod_exception, (int) e_xcp_count, 
 
989
                                                $1, $2); }
 
990
                ;
 
991
 
 
992
 
 
993
/* CREATE INDEX */
 
994
 
 
995
unique_opt      : UNIQUE
 
996
                        { $$ = make_node (nod_unique, 0, NULL); }
 
997
                |
 
998
                        { $$ = NULL; }
 
999
                ;
 
1000
 
 
1001
index_definition : column_list 
 
1002
                        { $$ = make_list ($1); }
 
1003
                | column_parens 
 
1004
                | computed_by '(' begin_trigger value end_trigger ')'
 
1005
                        { $$ = make_node (nod_def_computed, 2, $4, $5); }
 
1006
                ;
 
1007
 
 
1008
 
 
1009
/* CREATE SHADOW */
 
1010
shadow_clause   : pos_short_integer manual_auto conditional sql_string
 
1011
                        first_file_length sec_shadow_files
 
1012
                        { $$ = make_node (nod_def_shadow, (int) e_shadow_count,
 
1013
                                 $1, $2, $3, $4, $5, make_list ($6)); }
 
1014
                ;
 
1015
 
 
1016
manual_auto     : MANUAL
 
1017
                        { $$ = MAKE_const_slong (1); }
 
1018
                | AUTO
 
1019
                        { $$ = MAKE_const_slong (0); }
 
1020
                | 
 
1021
                        { $$ = MAKE_const_slong (0); }
 
1022
                ;
 
1023
 
 
1024
conditional     : 
 
1025
                        { $$ = MAKE_const_slong (0); }
 
1026
                | CONDITIONAL
 
1027
                        { $$ = MAKE_const_slong (1); }
 
1028
                ;       
 
1029
 
 
1030
first_file_length : 
 
1031
                        { $$ = (dsql_nod*) 0;}
 
1032
                | LENGTH equals long_integer page_noise
 
1033
                        { $$ = $3; }
 
1034
                ;
 
1035
 
 
1036
sec_shadow_files :
 
1037
                        { $$ = NULL; }
 
1038
                | db_file_list
 
1039
                ;
 
1040
 
 
1041
db_file_list    : db_file
 
1042
                | db_file_list db_file
 
1043
                        { $$ = make_node (nod_list, (int) 2, $1, $2); }
 
1044
                ;
 
1045
 
 
1046
 
 
1047
/* CREATE DOMAIN */
 
1048
 
 
1049
domain_clause   : column_def_name
 
1050
                as_opt
 
1051
                data_type
 
1052
                begin_trigger
 
1053
                domain_default_opt
 
1054
                end_default_opt
 
1055
                domain_constraint_clause
 
1056
                collate_clause
 
1057
                        { $$ = make_node (nod_def_domain, (int) e_dom_count,
 
1058
                                                                                  $1, $5, $6, make_list ($7), $8); }
 
1059
                ;
 
1060
 
 
1061
/*
 
1062
rdomain_clause  : DOMAIN alter_column_name alter_domain_ops
 
1063
                        { $$ = make_node (nod_mod_domain, (int) e_alt_count,
 
1064
                                                          $2, make_list ($3)); }
 
1065
*/
 
1066
 
 
1067
as_opt  : AS
 
1068
                        { $$ = NULL; }
 
1069
                | 
 
1070
                        { $$ = NULL; }  
 
1071
                ;
 
1072
 
 
1073
domain_default  : DEFAULT begin_trigger default_value
 
1074
                        { $$ = $3; }
 
1075
                ;
 
1076
 
 
1077
domain_default_opt      : domain_default
 
1078
                |
 
1079
                        { $$ = NULL; }
 
1080
                ;
 
1081
 
 
1082
domain_constraint_clause        : domain_constraint_list
 
1083
                | 
 
1084
                        { $$ = NULL; }
 
1085
                ; 
 
1086
 
 
1087
domain_constraint_list  : domain_constraint_def
 
1088
                | domain_constraint_list domain_constraint_def
 
1089
                        { $$ = make_node (nod_list, (int) 2, $1, $2); }
 
1090
                ;
 
1091
 
 
1092
domain_constraint_def   : domain_constraint
 
1093
                        { $$ = make_node (nod_rel_constraint, (int) 2, NULL, $1);}
 
1094
                ;       
 
1095
 
 
1096
domain_constraint       : null_constraint
 
1097
                | check_constraint
 
1098
                ;
 
1099
                                
 
1100
null_constraint : NOT KW_NULL
 
1101
                        { $$ = make_node (nod_null, (int) 0, NULL); }
 
1102
                ;
 
1103
 
 
1104
check_constraint        : CHECK begin_trigger '(' search_condition ')' end_trigger
 
1105
                        { $$ = make_node (nod_def_constraint, (int) e_cnstr_count,
 
1106
                                        NULL, NULL, $4, NULL, $6); }
 
1107
                ;
 
1108
 
 
1109
 
 
1110
/* CREATE SEQUENCE/GENERATOR */
 
1111
 
 
1112
generator_clause : symbol_generator_name
 
1113
                        { $$ = make_node (nod_def_generator, (int) e_gen_count, $1); }
 
1114
                 ;
 
1115
 
 
1116
 
 
1117
/* CREATE ROLE */
 
1118
 
 
1119
role_clause : symbol_role_name
 
1120
                        { $$ = make_node (nod_def_role, (int) 1, $1); }
 
1121
                ;
 
1122
 
 
1123
 
 
1124
/* CREATE COLLATION */
 
1125
 
 
1126
collation_clause : symbol_collation_name FOR symbol_character_set_name
 
1127
                collation_sequence_definition
 
1128
                collation_attribute_list_opt collation_specific_attribute_opt
 
1129
                        { $$ = make_node (nod_def_collation, 
 
1130
                                                (int) e_def_coll_count, $1, $3, $4, make_list($5), $6); }
 
1131
                ;
 
1132
 
 
1133
collation_sequence_definition :
 
1134
                FROM symbol_collation_name
 
1135
                        { $$ = make_node(nod_collation_from, 1, $2); }
 
1136
                | FROM EXTERNAL '(' sql_string ')'
 
1137
                        { $$ = make_node(nod_collation_from_external, 1, $4); }
 
1138
                |
 
1139
                        { $$ = NULL; }
 
1140
                ;
 
1141
 
 
1142
collation_attribute_list_opt :
 
1143
                        { $$ = NULL; }
 
1144
                | collation_attribute_list
 
1145
                ;
 
1146
 
 
1147
collation_attribute_list : collation_attribute
 
1148
                | collation_attribute_list collation_attribute
 
1149
                        { $$ = make_node(nod_list, 2, $1, $2); }
 
1150
                ;
 
1151
 
 
1152
collation_attribute :
 
1153
                  collation_pad_attribute
 
1154
                | collation_case_attribute
 
1155
                | collation_accent_attribute
 
1156
                ;
 
1157
 
 
1158
collation_pad_attribute : NO PAD
 
1159
                        { $$ = make_node(nod_collation_attr, 1, -TEXTTYPE_ATTR_PAD_SPACE); }
 
1160
                | PAD SPACE
 
1161
                        { $$ = make_node(nod_collation_attr, 1, TEXTTYPE_ATTR_PAD_SPACE); }
 
1162
                ;
 
1163
 
 
1164
collation_case_attribute : CASE SENSITIVE
 
1165
                        { $$ = make_node(nod_collation_attr, 1, -TEXTTYPE_ATTR_CASE_INSENSITIVE); }
 
1166
                | CASE INSENSITIVE
 
1167
                        { $$ = make_node(nod_collation_attr, 1, TEXTTYPE_ATTR_CASE_INSENSITIVE); }
 
1168
                ;
 
1169
 
 
1170
collation_accent_attribute : ACCENT SENSITIVE
 
1171
                        { $$ = make_node(nod_collation_attr, 1, -TEXTTYPE_ATTR_ACCENT_INSENSITIVE); }
 
1172
                | ACCENT INSENSITIVE
 
1173
                        { $$ = make_node(nod_collation_attr, 1, TEXTTYPE_ATTR_ACCENT_INSENSITIVE); }
 
1174
                ;
 
1175
 
 
1176
collation_specific_attribute_opt :
 
1177
                        { $$ = NULL; }
 
1178
                | sql_string
 
1179
                        { $$ = make_node(nod_collation_specific_attr, 1,
 
1180
                                MAKE_constant((dsql_str*)$1, CONSTANT_STRING)); }
 
1181
                ;
 
1182
 
 
1183
 
 
1184
/* CREATE DATABASE */
 
1185
 
 
1186
db_clause       :  db_name db_initial_desc1 db_rem_desc1
 
1187
                        { $$ = make_node (nod_def_database, (int) e_cdb_count,
 
1188
                                 $1, make_list($2), make_list ($3));}
 
1189
                ;
 
1190
 
 
1191
equals          :
 
1192
                | '='
 
1193
                ;
 
1194
 
 
1195
db_name         : sql_string
 
1196
                        { $$ = (dsql_nod*) $1; }
 
1197
                ;
 
1198
 
 
1199
db_initial_desc1 :  
 
1200
                        {$$ = NULL;}
 
1201
                | db_initial_desc
 
1202
                ;
 
1203
 
 
1204
db_initial_desc : db_initial_option
 
1205
                | db_initial_desc db_initial_option
 
1206
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
1207
                ; 
 
1208
 
 
1209
db_initial_option: KW_PAGE_SIZE equals pos_short_integer 
 
1210
                        { $$ = make_node (nod_page_size, 1, $3);}
 
1211
                | LENGTH equals long_integer page_noise
 
1212
                        { $$ = make_node (nod_file_length, 1, $3);}
 
1213
                | USER sql_string
 
1214
                        { $$ = make_node (nod_user_name, 1, $2);} 
 
1215
                | PASSWORD sql_string   
 
1216
                        { $$ = make_node (nod_password, 1, $2);} 
 
1217
                | SET NAMES sql_string  
 
1218
                        { $$ = make_node (nod_lc_ctype, 1, $3);} 
 
1219
                ;
 
1220
 
 
1221
db_rem_desc1    :  
 
1222
                        {$$ = NULL;} 
 
1223
                | db_rem_desc
 
1224
                ;
 
1225
 
 
1226
db_rem_desc     : db_rem_option
 
1227
                | db_rem_desc db_rem_option
 
1228
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
1229
                ;
 
1230
 
 
1231
db_rem_option   : db_file  
 
1232
                | DEFAULT CHARACTER SET symbol_character_set_name
 
1233
                        { $$ = make_node (nod_dfl_charset, 1, $4);} 
 
1234
                | KW_DIFFERENCE KW_FILE sql_string
 
1235
                        { $$ = make_node (nod_difference_file, 1, $3); }
 
1236
                ;
 
1237
 
 
1238
db_file         : file1 sql_string file_desc1
 
1239
                        { lex.g_file->fil_name = (dsql_str*) $2;
 
1240
                          $$ = (dsql_nod*) make_node (nod_file_desc, (int) 1,
 
1241
                                                (dsql_nod*) lex.g_file); }
 
1242
                ;
 
1243
 
 
1244
file1           : KW_FILE
 
1245
                        { lex.g_file  = make_file();}
 
1246
                ;
 
1247
 
 
1248
file_desc1      :
 
1249
                | file_desc
 
1250
                ;
 
1251
 
 
1252
file_desc       : file_clause
 
1253
                | file_desc file_clause
 
1254
                ;
 
1255
 
 
1256
file_clause     : STARTING file_clause_noise long_integer
 
1257
                        { lex.g_file->fil_start = (IPTR) $3;}
 
1258
                | LENGTH equals long_integer page_noise
 
1259
                        { lex.g_file->fil_length = (IPTR) $3;}
 
1260
                ;
 
1261
 
 
1262
file_clause_noise :
 
1263
                | AT
 
1264
                | AT PAGE
 
1265
                ;
 
1266
 
 
1267
page_noise      :
 
1268
                | PAGE
 
1269
                | PAGES
 
1270
                ;
 
1271
 
 
1272
 
 
1273
/* CREATE TABLE */
 
1274
 
 
1275
table_clause    : simple_table_name external_file '(' table_elements ')'
 
1276
                        { $$ = make_flag_node (nod_def_relation, NOD_PERMANENT_TABLE,
 
1277
                                (int) e_drl_count, $1, make_list ($4), $2); }
 
1278
                ;
 
1279
 
 
1280
rtable_clause   : simple_table_name external_file '(' table_elements ')'
 
1281
                        { $$ = make_flag_node (nod_redef_relation, NOD_PERMANENT_TABLE,
 
1282
                                (int) e_drl_count, $1, make_list ($4), $2); }
 
1283
                ;
 
1284
 
 
1285
gtt_table_clause :      simple_table_name '(' table_elements ')' gtt_scope
 
1286
                        { $$ = make_flag_node (nod_def_relation, (SSHORT) (IPTR) ($5),
 
1287
                                (int) e_drl_count, $1, make_list ($3), NULL); }
 
1288
                ;
 
1289
 
 
1290
gtt_recreate_clause     :       simple_table_name '(' table_elements ')' gtt_scope
 
1291
                        { $$ = make_flag_node (nod_redef_relation, (SSHORT) (IPTR) ($5),
 
1292
                                (int) e_drl_count, $1, make_list ($3), NULL); }
 
1293
                ;
 
1294
 
 
1295
gtt_scope : ON COMMIT PRESERVE ROWS
 
1296
                        { $$ = (dsql_nod*) NOD_GLOBAL_TEMP_TABLE_PRESERVE_ROWS; }
 
1297
                |       ON COMMIT KW_DELETE ROWS
 
1298
                        { $$ = (dsql_nod*) NOD_GLOBAL_TEMP_TABLE_DELETE_ROWS; }
 
1299
                |
 
1300
                        { $$ = (dsql_nod*) NOD_GLOBAL_TEMP_TABLE_DELETE_ROWS; }
 
1301
                ;
 
1302
 
 
1303
external_file   : EXTERNAL KW_FILE sql_string
 
1304
                        { $$ = $3; }
 
1305
                | EXTERNAL sql_string
 
1306
                        { $$ = $2; }
 
1307
                |
 
1308
                        { $$ = NULL; }
 
1309
                ;
 
1310
 
 
1311
table_elements  : table_element
 
1312
                | table_elements ',' table_element
 
1313
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
1314
                ;
 
1315
 
 
1316
table_element   : column_def
 
1317
                | table_constraint_definition
 
1318
                ;
 
1319
 
 
1320
 
 
1321
 
 
1322
/* column definition */
 
1323
 
 
1324
column_def      : column_def_name data_type_or_domain domain_default_opt
 
1325
                        end_default_opt column_constraint_clause collate_clause
 
1326
                        { $$ = make_node (nod_def_field, (int) e_dfl_count, 
 
1327
                                        $1, $3, $4, make_list ($5), $6, $2, NULL); }   
 
1328
                | column_def_name non_array_type def_computed
 
1329
                        { $$ = make_node (nod_def_field, (int) e_dfl_count, 
 
1330
                                        $1, NULL, NULL, NULL, NULL, NULL, $3); }   
 
1331
                | column_def_name def_computed
 
1332
                        { $$ = make_node (nod_def_field, (int) e_dfl_count, 
 
1333
                                        $1, NULL, NULL, NULL, NULL, NULL, $2); }   
 
1334
                ;
 
1335
                                                                 
 
1336
/* value does allow parens around it, but there is a problem getting the
 
1337
 * source text
 
1338
 */
 
1339
 
 
1340
def_computed    : computed_clause '(' begin_trigger value end_trigger ')'
 
1341
                        { 
 
1342
                        lex.g_field->fld_flags |= FLD_computed;
 
1343
                        $$ = make_node (nod_def_computed, 2, $4, $5); }
 
1344
                ;
 
1345
 
 
1346
computed_clause : computed_by
 
1347
                | GENERATED ALWAYS AS
 
1348
                ;
 
1349
 
 
1350
computed_by     : COMPUTED BY
 
1351
                | COMPUTED
 
1352
                ;
 
1353
 
 
1354
data_type_or_domain     : data_type begin_trigger
 
1355
                                                  { $$ = NULL; }
 
1356
                        | simple_column_name begin_string
 
1357
                                                  { $$ = make_node (nod_def_domain, (int) e_dom_count,
 
1358
                                                                                        $1, NULL, NULL, NULL, NULL); }
 
1359
                                                ;
 
1360
 
 
1361
collate_clause  : COLLATE symbol_collation_name
 
1362
                        { $$ = $2; }
 
1363
                |
 
1364
                        { $$ = NULL; }
 
1365
                ;
 
1366
 
 
1367
 
 
1368
column_def_name : simple_column_name
 
1369
                        { lex.g_field_name = $1;
 
1370
                          lex.g_field = make_field ($1);
 
1371
                          $$ = (dsql_nod*) lex.g_field; }
 
1372
                ;
 
1373
 
 
1374
simple_column_def_name  : simple_column_name
 
1375
                                { lex.g_field = make_field ($1);
 
1376
                                  $$ = (dsql_nod*) lex.g_field; }
 
1377
                        ;
 
1378
 
 
1379
 
 
1380
data_type_descriptor :  init_data_type data_type
 
1381
                        { $$ = $1; }
 
1382
                | TYPE OF column_def_name
 
1383
                        {
 
1384
                                ((dsql_fld*) $3)->fld_type_of_name = ((dsql_fld*) $3)->fld_name;
 
1385
                                $$ = $3;
 
1386
                        }
 
1387
                | column_def_name
 
1388
                        {
 
1389
                                ((dsql_fld*) $1)->fld_type_of_name = ((dsql_fld*) $1)->fld_name;
 
1390
                                ((dsql_fld*) $1)->fld_full_domain = true;
 
1391
                                $$ = $1;
 
1392
                        }
 
1393
                ;
 
1394
 
 
1395
init_data_type :
 
1396
                        { lex.g_field = make_field (NULL);
 
1397
                          $$ = (dsql_nod*) lex.g_field; }
 
1398
                ;
 
1399
 
 
1400
 
 
1401
default_value   : constant
 
1402
                | current_user
 
1403
                | current_role
 
1404
                | internal_info
 
1405
                | null_value
 
1406
                | datetime_value_expression
 
1407
                ;
 
1408
                                   
 
1409
column_constraint_clause : 
 
1410
                                { $$ = NULL; }
 
1411
                        | column_constraint_list
 
1412
                        ;
 
1413
 
 
1414
column_constraint_list  : column_constraint_def
 
1415
                                | column_constraint_list column_constraint_def
 
1416
                        { $$ = make_node (nod_list, (int) 2, $1, $2); }
 
1417
                                ;
 
1418
 
 
1419
column_constraint_def : constraint_name_opt column_constraint
 
1420
                        { $$ = make_node (nod_rel_constraint, (int) 2, $1, $2);}
 
1421
                ;
 
1422
 
 
1423
 
 
1424
column_constraint : null_constraint
 
1425
                                  | check_constraint
 
1426
                                  | REFERENCES simple_table_name column_parens_opt
 
1427
                        referential_trigger_action constraint_index_opt
 
1428
                                                { $$ = make_node (nod_foreign, (int) e_for_count,
 
1429
                                                make_node (nod_list, (int) 1, lex.g_field_name), $2, $3, $4, $5); }
 
1430
 
 
1431
                                  | UNIQUE constraint_index_opt
 
1432
                                                { $$ = make_node (nod_unique, 2, NULL, $2); }
 
1433
                                  | PRIMARY KEY constraint_index_opt
 
1434
                                                { $$ = make_node (nod_primary, (int) e_pri_count, NULL, $3); }
 
1435
                ;
 
1436
                                        
 
1437
 
 
1438
 
 
1439
/* table constraints */
 
1440
 
 
1441
table_constraint_definition : constraint_name_opt table_constraint
 
1442
                   { $$ = make_node (nod_rel_constraint, (int) 2, $1, $2);}
 
1443
                ;
 
1444
 
 
1445
constraint_name_opt : CONSTRAINT symbol_constraint_name
 
1446
                        { $$ = $2; }
 
1447
                |
 
1448
                        { $$ = NULL ;}
 
1449
                ;
 
1450
 
 
1451
table_constraint : unique_constraint
 
1452
                        | primary_constraint
 
1453
                        | referential_constraint
 
1454
                        | check_constraint
 
1455
                ;
 
1456
 
 
1457
unique_constraint       : UNIQUE column_parens constraint_index_opt
 
1458
                        { $$ = make_node (nod_unique, 2, $2, $3); }
 
1459
                ;
 
1460
 
 
1461
primary_constraint      : PRIMARY KEY column_parens constraint_index_opt
 
1462
                        { $$ = make_node (nod_primary, (int) e_pri_count, $3, $4); }
 
1463
                ;
 
1464
 
 
1465
referential_constraint  : FOREIGN KEY column_parens REFERENCES 
 
1466
                          simple_table_name column_parens_opt 
 
1467
                          referential_trigger_action constraint_index_opt
 
1468
                        { $$ = make_node (nod_foreign, (int) e_for_count, $3, $5, 
 
1469
                                         $6, $7, $8); }
 
1470
                ;
 
1471
 
 
1472
constraint_index_opt    : USING order_direction INDEX symbol_index_name
 
1473
                        { $$ = make_node (nod_def_index, (int) e_idx_count, 
 
1474
                                        NULL, $2, $4, NULL, NULL); }
 
1475
/*
 
1476
                | NO INDEX
 
1477
                        { $$ = NULL; }
 
1478
*/
 
1479
                |
 
1480
                        { $$ = make_node (nod_def_index, (int) e_idx_count, 
 
1481
                                        NULL, NULL, NULL, NULL, NULL); }
 
1482
                ;
 
1483
 
 
1484
referential_trigger_action:     
 
1485
                  update_rule
 
1486
                  { $$ = make_node (nod_ref_upd_del, (int) e_ref_upd_del_count, $1, NULL);} 
 
1487
                | delete_rule
 
1488
                  { $$ = make_node (nod_ref_upd_del, (int) e_ref_upd_del_count, NULL, $1);}
 
1489
                | delete_rule update_rule
 
1490
                  { $$ = make_node (nod_ref_upd_del, (int) e_ref_upd_del_count, $2, $1); }
 
1491
                | update_rule delete_rule
 
1492
                  { $$ = make_node (nod_ref_upd_del, (int) e_ref_upd_del_count, $1, $2);}
 
1493
                | /* empty */
 
1494
                  { $$ = NULL;}
 
1495
                ;
 
1496
 
 
1497
update_rule     : ON UPDATE referential_action
 
1498
                  { $$ = $3;}
 
1499
                ;
 
1500
delete_rule     : ON KW_DELETE referential_action
 
1501
                  { $$ = $3;}
 
1502
                ;
 
1503
 
 
1504
referential_action: CASCADE
 
1505
                  { $$ = make_flag_node (nod_ref_trig_action, 
 
1506
                         REF_ACTION_CASCADE, (int) e_ref_trig_action_count, NULL);}
 
1507
                | SET DEFAULT
 
1508
                  { $$ = make_flag_node (nod_ref_trig_action, 
 
1509
                         REF_ACTION_SET_DEFAULT, (int) e_ref_trig_action_count, NULL);}
 
1510
                | SET KW_NULL
 
1511
                  { $$ = make_flag_node (nod_ref_trig_action, 
 
1512
                         REF_ACTION_SET_NULL, (int) e_ref_trig_action_count, NULL);}
 
1513
                | NO ACTION
 
1514
                  { $$ = make_flag_node (nod_ref_trig_action, 
 
1515
                         REF_ACTION_NONE, (int) e_ref_trig_action_count, NULL);}
 
1516
                ;
 
1517
 
 
1518
 
 
1519
/* PROCEDURE */
 
1520
 
 
1521
 
 
1522
procedure_clause        : symbol_procedure_name input_parameters
 
1523
                                  output_parameters
 
1524
                                  AS begin_string
 
1525
                          local_declaration_list
 
1526
                          full_proc_block
 
1527
                          end_trigger
 
1528
                                { $$ = make_node (nod_def_procedure,
 
1529
                                                (int) e_prc_count, $1, $2, $3, $6, $7, $8); } 
 
1530
                ;               
 
1531
 
 
1532
 
 
1533
rprocedure_clause       : symbol_procedure_name input_parameters
 
1534
                                  output_parameters
 
1535
                                  AS begin_string
 
1536
                          local_declaration_list
 
1537
                          full_proc_block
 
1538
                          end_trigger
 
1539
                                { $$ = make_node (nod_redef_procedure,
 
1540
                                                (int) e_prc_count, $1, $2, $3, $6, $7, $8); } 
 
1541
                ;               
 
1542
 
 
1543
replace_procedure_clause        : symbol_procedure_name input_parameters
 
1544
                                  output_parameters
 
1545
                                  AS begin_string
 
1546
                          local_declaration_list
 
1547
                          full_proc_block
 
1548
                          end_trigger
 
1549
                                { $$ = make_node (nod_replace_procedure,
 
1550
                                                (int) e_prc_count, $1, $2, $3, $6, $7, $8); } 
 
1551
                ;               
 
1552
 
 
1553
alter_procedure_clause  : symbol_procedure_name input_parameters
 
1554
                                  output_parameters
 
1555
                                  AS begin_string
 
1556
                          local_declaration_list
 
1557
                          full_proc_block
 
1558
                          end_trigger
 
1559
                                { $$ = make_node (nod_mod_procedure,
 
1560
                                                (int) e_prc_count, $1, $2, $3, $6, $7, $8); } 
 
1561
                ;               
 
1562
 
 
1563
input_parameters :      '(' input_proc_parameters ')'
 
1564
                        { $$ = make_list ($2); }
 
1565
                |
 
1566
                        { $$ = NULL; }
 
1567
                ;
 
1568
 
 
1569
output_parameters :     RETURNS '(' output_proc_parameters ')'
 
1570
                        { $$ = make_list ($3); }
 
1571
                |
 
1572
                        { $$ = NULL; }
 
1573
                ;
 
1574
 
 
1575
input_proc_parameters   : input_proc_parameter
 
1576
                | input_proc_parameters ',' input_proc_parameter
 
1577
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
1578
                ;
 
1579
 
 
1580
input_proc_parameter    : simple_column_def_name domain_or_non_array_type collate_clause
 
1581
                                begin_trigger default_par_opt end_default_opt
 
1582
                        { $$ = make_node (nod_def_field, (int) e_dfl_count, 
 
1583
                                $1, $5, $6, NULL, $3, NULL, NULL); }   
 
1584
                ;
 
1585
 
 
1586
output_proc_parameters  : proc_parameter
 
1587
                | output_proc_parameters ',' proc_parameter
 
1588
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
1589
                ;
 
1590
 
 
1591
proc_parameter  : simple_column_def_name domain_or_non_array_type collate_clause
 
1592
                        { $$ = make_node (nod_def_field, (int) e_dfl_count, 
 
1593
                                $1, NULL, NULL, NULL, $3, NULL, NULL); }   
 
1594
                ;
 
1595
 
 
1596
default_par_opt : DEFAULT begin_trigger default_value
 
1597
                        { $$ = $3; }
 
1598
                | '=' begin_trigger default_value
 
1599
                        { $$ = $3; }
 
1600
                |
 
1601
                        { $$ = NULL; }
 
1602
                ;
 
1603
 
 
1604
local_declaration_list  : local_declarations
 
1605
                        { $$ = make_list ($1); }
 
1606
                |
 
1607
                        { $$ = NULL; }
 
1608
                ;
 
1609
 
 
1610
local_declarations      : local_declaration
 
1611
                | local_declarations local_declaration
 
1612
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
1613
                ;
 
1614
 
 
1615
local_declaration : stmt_start_line stmt_start_column DECLARE var_decl_opt local_declaration_item ';'
 
1616
                        {
 
1617
                                $$ = $5;
 
1618
                                $$->nod_line = (IPTR) $1;
 
1619
                                $$->nod_column = (IPTR) $2;
 
1620
                        }
 
1621
                ;
 
1622
 
 
1623
local_declaration_item  : var_declaration_item
 
1624
                | cursor_declaration_item
 
1625
                ;
 
1626
 
 
1627
var_declaration_item    : column_def_name domain_or_non_array_type collate_clause var_init_opt
 
1628
                        { $$ = make_node (nod_def_field, (int) e_dfl_count, 
 
1629
                                $1, $4, NULL, NULL, $3, NULL, NULL); }
 
1630
                ;
 
1631
 
 
1632
var_decl_opt    : VARIABLE
 
1633
                        { $$ = NULL; }
 
1634
                |
 
1635
                        { $$ = NULL; }
 
1636
                ;
 
1637
 
 
1638
var_init_opt    : DEFAULT default_value
 
1639
                        { $$ = $2; }
 
1640
                | '=' default_value
 
1641
                        { $$ = $2; }
 
1642
                |
 
1643
                        { $$ = NULL; }
 
1644
                ;
 
1645
 
 
1646
cursor_declaration_item : symbol_cursor_name CURSOR FOR '(' select ')'
 
1647
                        { $$ = make_flag_node (nod_cursor, NOD_CURSOR_EXPLICIT,
 
1648
                                (int) e_cur_count, $1, $5, NULL, NULL); }
 
1649
                ;
 
1650
 
 
1651
proc_block      : proc_statement
 
1652
                | full_proc_block
 
1653
                ;
 
1654
 
 
1655
full_proc_block : stmt_start_line stmt_start_column BEGIN full_proc_block_body END
 
1656
                        { 
 
1657
                                $$ = make_node (nod_src_info, e_src_info_count, $1, $2, $4);
 
1658
                        }
 
1659
                ;
 
1660
 
 
1661
full_proc_block_body    : proc_statements
 
1662
                        { $$ = make_node (nod_block, (int) e_blk_count, make_list ($1), NULL); }
 
1663
                | proc_statements excp_hndl_statements
 
1664
                        { $$ = make_node (nod_block, (int) e_blk_count, make_list ($1), make_list ($2)); }
 
1665
                |
 
1666
                        { $$ = make_node (nod_block, (int) e_blk_count, NULL, NULL);}
 
1667
                ;                                                       
 
1668
 
 
1669
proc_statements : proc_block
 
1670
                | proc_statements proc_block
 
1671
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
1672
                ;
 
1673
 
 
1674
proc_statement  : stmt_start_line stmt_start_column simple_proc_statement ';'
 
1675
                        { 
 
1676
                                $$ = make_node (nod_src_info, e_src_info_count, $1, $2, $3);
 
1677
                        }
 
1678
                | stmt_start_line stmt_start_column complex_proc_statement
 
1679
                        { 
 
1680
                                $$ = make_node (nod_src_info, e_src_info_count, $1, $2, $3);
 
1681
                        }
 
1682
                ;
 
1683
 
 
1684
stmt_start_line :
 
1685
                { $$ = (dsql_nod*) (IPTR) lex.lines_bk; }
 
1686
 
 
1687
stmt_start_column :
 
1688
                { 
 
1689
                        const USHORT column = (lex.last_token_bk - lex.line_start_bk + 1);
 
1690
                        $$ = (dsql_nod*) (IPTR) column;
 
1691
                }
 
1692
                
 
1693
simple_proc_statement   : assignment
 
1694
                | insert
 
1695
                | merge
 
1696
                | update
 
1697
                | update_or_insert
 
1698
                | delete
 
1699
                | singleton_select
 
1700
                | exec_procedure
 
1701
                | exec_sql
 
1702
                | exec_into
 
1703
                | exec_function
 
1704
                | excp_statement
 
1705
                | raise_statement
 
1706
                | post_event
 
1707
                | cursor_statement
 
1708
                | breakleave
 
1709
                | SUSPEND
 
1710
                        { $$ = make_node (nod_return, (int) e_rtn_count, NULL); }
 
1711
                | EXIT
 
1712
                        { $$ = make_node (nod_exit, 0, NULL); }
 
1713
                ;
 
1714
 
 
1715
complex_proc_statement  : if_then_else
 
1716
                | while
 
1717
                | for_select
 
1718
                | for_exec_into
 
1719
                ;
 
1720
 
 
1721
excp_statement  : EXCEPTION symbol_exception_name
 
1722
                        { $$ = make_node (nod_exception_stmt, (int) e_xcp_count, $2, NULL); }
 
1723
                | EXCEPTION symbol_exception_name value
 
1724
                        { $$ = make_node (nod_exception_stmt, (int) e_xcp_count, $2, $3); }
 
1725
                ;
 
1726
 
 
1727
raise_statement : EXCEPTION
 
1728
                        { $$ = make_node (nod_exception_stmt, (int) e_xcp_count, NULL, NULL); }
 
1729
                ;
 
1730
 
 
1731
exec_sql        : EXECUTE STATEMENT value
 
1732
                        { $$ = make_node (nod_exec_sql, (int) e_exec_sql_count, $3); }
 
1733
                ;
 
1734
 
 
1735
for_select      : label_opt FOR select INTO variable_list cursor_def DO proc_block
 
1736
                        { $$ = make_node (nod_for_select, (int) e_flp_count, $3,
 
1737
                                          make_list ($5), $6, $8, $1); }
 
1738
                ;
 
1739
 
 
1740
for_exec_into   : label_opt FOR EXECUTE STATEMENT value INTO variable_list DO proc_block 
 
1741
                        { $$ = make_node (nod_exec_into, (int) e_exec_into_count, $5, $9, make_list ($7), $1); }
 
1742
                ;
 
1743
 
 
1744
exec_into       : EXECUTE STATEMENT value INTO variable_list
 
1745
                        { $$ = make_node (nod_exec_into, (int) e_exec_into_count, $3, 0, make_list ($5)); }
 
1746
                ;
 
1747
 
 
1748
if_then_else    : IF '(' search_condition ')' THEN proc_block ELSE proc_block
 
1749
                        { $$ = make_node (nod_if, (int) e_if_count, $3, $6, $8); }
 
1750
                | IF '(' search_condition ')' THEN proc_block 
 
1751
                        { $$ = make_node (nod_if, (int) e_if_count, $3, $6, NULL); }
 
1752
                ;
 
1753
 
 
1754
post_event      : POST_EVENT value event_argument_opt
 
1755
                        { $$ = make_node (nod_post, (int) e_pst_count, $2, $3); }
 
1756
                ;
 
1757
 
 
1758
event_argument_opt      : /*',' value
 
1759
                        { $$ = $2; }
 
1760
                |*/
 
1761
                        { $$ = NULL; }
 
1762
                ;
 
1763
 
 
1764
singleton_select        : select INTO variable_list
 
1765
                        { $$ = make_node (nod_for_select, (int) e_flp_count, $1,
 
1766
                                          make_list ($3), NULL, NULL, NULL); }
 
1767
                ;
 
1768
 
 
1769
variable        : ':' symbol_variable_name
 
1770
                        { $$ = make_node (nod_var_name, (int) e_vrn_count, 
 
1771
                                                        $2); }
 
1772
                ;
 
1773
 
 
1774
variable_list   : variable
 
1775
                | column_name
 
1776
                | variable_list ',' column_name
 
1777
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
1778
                | variable_list ',' variable
 
1779
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
1780
                ;
 
1781
 
 
1782
while           : label_opt WHILE '(' search_condition ')' DO proc_block
 
1783
                        { $$ = make_node (nod_while, (int) e_while_count, $4, $7, $1); }
 
1784
                ;
 
1785
 
 
1786
label_opt       : symbol_label_name ':'
 
1787
                        { $$ = make_node (nod_label, (int) e_label_count, $1, NULL); }
 
1788
                |
 
1789
                        { $$ = NULL; }
 
1790
                ;
 
1791
 
 
1792
breakleave      : KW_BREAK
 
1793
                        { $$ = make_node (nod_breakleave, (int) e_breakleave_count, NULL); }
 
1794
                | LEAVE
 
1795
                        { $$ = make_node (nod_breakleave, (int) e_breakleave_count, NULL); }
 
1796
                | LEAVE symbol_label_name
 
1797
                        { $$ = make_node (nod_breakleave, (int) e_breakleave_count,
 
1798
                                make_node (nod_label, (int) e_label_count, $2, NULL)); }
 
1799
                ;
 
1800
 
 
1801
cursor_def      : AS CURSOR symbol_cursor_name
 
1802
                        { $$ = make_flag_node (nod_cursor, NOD_CURSOR_FOR,
 
1803
                                (int) e_cur_count, $3, NULL, NULL, NULL); }
 
1804
                |
 
1805
                        { $$ = NULL; }
 
1806
                ;
 
1807
 
 
1808
excp_hndl_statements    : excp_hndl_statement
 
1809
                | excp_hndl_statements excp_hndl_statement
 
1810
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
1811
                ;
 
1812
 
 
1813
excp_hndl_statement     : WHEN errors DO proc_block
 
1814
                        { $$ = make_node (nod_on_error, (int) e_err_count,
 
1815
                                        make_list ($2), $4); }
 
1816
                ;
 
1817
 
 
1818
errors  : err
 
1819
        | errors ',' err
 
1820
                { $$ = make_node (nod_list, 2, $1, $3); }
 
1821
        ;
 
1822
 
 
1823
err     : SQLCODE signed_short_integer
 
1824
                { $$ = make_node (nod_sqlcode, 1, $2); }
 
1825
        | GDSCODE symbol_gdscode_name
 
1826
                { $$ = make_node (nod_gdscode, 1, $2); }
 
1827
        | EXCEPTION symbol_exception_name
 
1828
                { $$ = make_node (nod_exception, 1, $2); }
 
1829
        | ANY
 
1830
                { $$ = make_node (nod_default, 1, NULL); }
 
1831
        ;
 
1832
 
 
1833
cursor_statement        : open_cursor
 
1834
        | fetch_cursor
 
1835
        | close_cursor
 
1836
        ;
 
1837
 
 
1838
open_cursor     : OPEN symbol_cursor_name
 
1839
                { $$ = make_node (nod_cursor_open, (int) e_cur_stmt_count, $2, NULL, NULL); }
 
1840
        ;
 
1841
 
 
1842
close_cursor    : CLOSE symbol_cursor_name
 
1843
                { $$ = make_node (nod_cursor_close, (int) e_cur_stmt_count, $2, NULL, NULL); }
 
1844
        ;
 
1845
 
 
1846
fetch_cursor    : FETCH fetch_opt symbol_cursor_name INTO variable_list
 
1847
                { $$ = make_node (nod_cursor_fetch, (int) e_cur_stmt_count, $3, $2, make_list ($5)); }
 
1848
        ;
 
1849
 
 
1850
fetch_opt       :
 
1851
                { $$ = NULL; }
 
1852
        ;
 
1853
/*
 
1854
fetch_opt       : fetch_seek_opt FROM
 
1855
        ;
 
1856
 
 
1857
fetch_seek_opt  :
 
1858
        | FIRST
 
1859
                { $$ = make_node (nod_fetch_seek, 2,
 
1860
                                // corresponds to (blr_bof_forward, 0)
 
1861
                                MAKE_const_slong (3),
 
1862
                                MAKE_const_slong (0)); }
 
1863
        | LAST
 
1864
                { $$ = make_node (nod_fetch_seek, 2,
 
1865
                                // corresponds to (blr_eof_backward, 0)
 
1866
                                MAKE_const_slong (4),
 
1867
                                MAKE_const_slong (0)); }
 
1868
        | PRIOR
 
1869
                { $$ = make_node (nod_fetch_seek, 2,
 
1870
                                // corresponds to (blr_backward, 1)
 
1871
                                MAKE_const_slong (2),
 
1872
                                MAKE_const_slong (1)); }
 
1873
        | NEXT
 
1874
                { $$ = make_node (nod_fetch_seek, 2,
 
1875
                                // corresponds to (blr_forward, 1)
 
1876
                                MAKE_const_slong (1),
 
1877
                                MAKE_const_slong (1)); }
 
1878
        | ABSOLUTE value
 
1879
                { $$ = make_node (nod_fetch_seek, 2,
 
1880
                                // corresponds to (blr_bof_forward, value)
 
1881
                                MAKE_const_slong (3),
 
1882
                                $2); }
 
1883
        | RELATIVE value
 
1884
                { $$ = make_node (nod_fetch_seek, 2,
 
1885
                                // corresponds to (blr_forward, value)
 
1886
                                MAKE_const_slong (1),
 
1887
                                $2); }
 
1888
        ;
 
1889
*/
 
1890
 
 
1891
/* EXECUTE PROCEDURE */
 
1892
 
 
1893
exec_procedure  : EXECUTE PROCEDURE symbol_procedure_name proc_inputs proc_outputs_opt
 
1894
                        { $$ = make_node (nod_exec_procedure, (int) e_exe_count,
 
1895
                                        $3, $4, $5); }
 
1896
                ;
 
1897
 
 
1898
proc_inputs     : value_list
 
1899
                        { $$ = make_list ($1); }
 
1900
                | '(' value_list ')'
 
1901
                        { $$ = make_list ($2); }
 
1902
                |
 
1903
                        { $$ = NULL; }
 
1904
                ;
 
1905
 
 
1906
proc_outputs_opt        : RETURNING_VALUES variable_list
 
1907
                        { $$ = make_list ($2); }
 
1908
                | RETURNING_VALUES '(' variable_list  ')'
 
1909
                        { $$ = make_list ($3); }
 
1910
                |
 
1911
                        { $$ = NULL; }
 
1912
                ;
 
1913
 
 
1914
/* EXECUTE BLOCK */
 
1915
 
 
1916
exec_block : EXECUTE BLOCK block_input_params output_parameters AS 
 
1917
                        local_declaration_list
 
1918
                        full_proc_block
 
1919
                                { $$ = make_node (nod_exec_block,
 
1920
                                                  (int) e_exe_blk_count, 
 
1921
                                                  $3, $4, $6, $7, make_node (nod_all, (int) 0, NULL)); } 
 
1922
                ;
 
1923
 
 
1924
block_input_params :    '(' block_parameters ')'
 
1925
                                { $$ = make_list ($2); }
 
1926
                        |
 
1927
                                { $$ = NULL; }
 
1928
                        ;
 
1929
 
 
1930
block_parameters        : block_parameter
 
1931
                | block_parameters ',' block_parameter
 
1932
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
1933
                ;
 
1934
 
 
1935
block_parameter : proc_parameter '=' parameter
 
1936
                        { $$ = make_node (nod_param_val, e_prm_val_count, $1, $3); }   
 
1937
                ;
 
1938
 
 
1939
/* CREATE VIEW */
 
1940
 
 
1941
view_clause     : symbol_view_name column_parens_opt AS begin_string select_expr
 
1942
                                                                                                                        check_opt end_trigger
 
1943
                        { $$ = make_node (nod_def_view, (int) e_view_count, 
 
1944
                                          $1, $2, $5, $6, $7); }   
 
1945
                ;               
 
1946
 
 
1947
 
 
1948
rview_clause    : symbol_view_name column_parens_opt AS begin_string select_expr
 
1949
                                                                                                                        check_opt end_trigger
 
1950
                        { $$ = make_node (nod_redef_view, (int) e_view_count, 
 
1951
                                          $1, $2, $5, $6, $7); }   
 
1952
                ;               
 
1953
 
 
1954
/*
 
1955
replace_view_clause     : symbol_view_name column_parens_opt AS begin_string select_expr
 
1956
                                                                                                                        check_opt end_trigger
 
1957
                        { $$ = make_node (nod_replace_view, (int) e_view_count, 
 
1958
                                          $1, $2, $5, $6, $7); }   
 
1959
                ;               
 
1960
 
 
1961
alter_view_clause       : symbol_view_name column_parens_opt AS begin_string select_expr
 
1962
                                                                                                                        check_opt end_trigger
 
1963
                        { $$ = make_node (nod_mod_view, (int) e_view_count, 
 
1964
                                          $1, $2, $5, $6, $7); }   
 
1965
                ;               
 
1966
*/
 
1967
 
 
1968
 
 
1969
/* these rules will capture the input string for storage in metadata */
 
1970
 
 
1971
begin_string    : 
 
1972
                        { lex.beginning = lex_position(); }
 
1973
                ;
 
1974
/*
 
1975
end_string      :
 
1976
                        { $$ = (dsql_nod*) MAKE_string(lex.beginning,
 
1977
                                   (lex_position() == lex.end) ?
 
1978
                                   lex_position() - lex.beginning : lex.last_token - lex.beginning);}
 
1979
                ;
 
1980
*/
 
1981
begin_trigger   : 
 
1982
                        { lex.beginning = lex.last_token; }
 
1983
                ;
 
1984
 
 
1985
end_trigger     :
 
1986
                        { $$ = (dsql_nod*) MAKE_string(lex.beginning,
 
1987
                                        lex_position() - lex.beginning); }
 
1988
                ;
 
1989
 
 
1990
end_default_opt :
 
1991
                        { $$ = (dsql_nod*) MAKE_string(lex.beginning, 
 
1992
                                        (yychar <= 0 ? lex_position() : lex.last_token) - lex.beginning); 
 
1993
                        }
 
1994
                ;
 
1995
 
 
1996
 
 
1997
check_opt       : WITH CHECK OPTION
 
1998
                        { $$ = make_node (nod_def_constraint, (int) e_cnstr_count, 
 
1999
                                        NULL, NULL, NULL, NULL, NULL); }
 
2000
                |
 
2001
                        { $$ = 0; }
 
2002
                ;
 
2003
 
 
2004
 
 
2005
 
 
2006
/* CREATE TRIGGER */
 
2007
 
 
2008
trigger_clause
 
2009
        :       symbol_trigger_name
 
2010
                trigger_active
 
2011
                trigger_type
 
2012
                trigger_position
 
2013
                trigger_action
 
2014
                end_trigger
 
2015
                {
 
2016
                        $$ = make_node (nod_def_trigger, (int) e_trg_count,
 
2017
                                $1, NULL, $2, $3, $4, $5, $6);
 
2018
                }
 
2019
        |       symbol_trigger_name FOR simple_table_name
 
2020
                trigger_active
 
2021
                trigger_type
 
2022
                trigger_position
 
2023
                trigger_action
 
2024
                end_trigger
 
2025
                {
 
2026
                        $$ = make_node (nod_def_trigger, (int) e_trg_count,
 
2027
                                $1, $3, $4, $5, $6, $7, $8);
 
2028
                }
 
2029
        |       symbol_trigger_name
 
2030
                trigger_active
 
2031
                trigger_type
 
2032
                trigger_position
 
2033
                ON simple_table_name
 
2034
                trigger_action
 
2035
                end_trigger
 
2036
                {
 
2037
                        $$ = make_node (nod_def_trigger, (int) e_trg_count,
 
2038
                                $1, $6, $2, $3, $4, $7, $8);
 
2039
                }
 
2040
        ;
 
2041
 
 
2042
rtrigger_clause
 
2043
        :       symbol_trigger_name
 
2044
                trigger_active
 
2045
                trigger_type
 
2046
                trigger_position
 
2047
                trigger_action
 
2048
                end_trigger
 
2049
                {
 
2050
                        $$ = make_node (nod_redef_trigger, (int) e_trg_count,
 
2051
                                $1, NULL, $2, $3, $4, $5, $6);
 
2052
                }
 
2053
        |       symbol_trigger_name FOR simple_table_name
 
2054
                trigger_active
 
2055
                trigger_type
 
2056
                trigger_position
 
2057
                trigger_action
 
2058
                end_trigger
 
2059
                {
 
2060
                        $$ = make_node (nod_redef_trigger, (int) e_trg_count,
 
2061
                                $1, $3, $4, $5, $6, $7, $8);
 
2062
                }
 
2063
        |       symbol_trigger_name
 
2064
                trigger_active
 
2065
                trigger_type
 
2066
                trigger_position
 
2067
                ON simple_table_name
 
2068
                trigger_action
 
2069
                end_trigger
 
2070
                {
 
2071
                        $$ = make_node (nod_redef_trigger, (int) e_trg_count,
 
2072
                                $1, $6, $2, $3, $4, $7, $8);
 
2073
                }
 
2074
        ;
 
2075
 
 
2076
replace_trigger_clause
 
2077
        :       symbol_trigger_name
 
2078
                trigger_active
 
2079
                trigger_type
 
2080
                trigger_position
 
2081
                trigger_action
 
2082
                end_trigger
 
2083
                {
 
2084
                        $$ = make_node (nod_replace_trigger, (int) e_trg_count,
 
2085
                                $1, NULL, $2, $3, $4, $5, $6);
 
2086
                }
 
2087
        |       symbol_trigger_name FOR simple_table_name
 
2088
                trigger_active
 
2089
                trigger_type
 
2090
                trigger_position
 
2091
                trigger_action
 
2092
                end_trigger
 
2093
                {
 
2094
                        $$ = make_node (nod_replace_trigger, (int) e_trg_count,
 
2095
                                $1, $3, $4, $5, $6, $7, $8);
 
2096
                }
 
2097
        |       symbol_trigger_name
 
2098
                trigger_active
 
2099
                trigger_type
 
2100
                trigger_position
 
2101
                ON simple_table_name
 
2102
                trigger_action
 
2103
                end_trigger
 
2104
                {
 
2105
                        $$ = make_node (nod_replace_trigger, (int) e_trg_count,
 
2106
                                $1, $6, $2, $3, $4, $7, $8);
 
2107
                }
 
2108
        ;
 
2109
 
 
2110
trigger_active  : ACTIVE 
 
2111
                        { $$ = MAKE_const_slong (0); }
 
2112
                | INACTIVE
 
2113
                        { $$ = MAKE_const_slong (1); }
 
2114
                |
 
2115
                        { $$ = NULL; }
 
2116
                ;
 
2117
 
 
2118
trigger_type
 
2119
        :       trigger_type_prefix trigger_type_suffix
 
2120
                        { $$ = MAKE_trigger_type ($1, $2); }
 
2121
        |       ON trigger_db_type
 
2122
                        { $$ = $2; }
 
2123
        ;
 
2124
 
 
2125
trigger_db_type
 
2126
        :       CONNECT
 
2127
                        { $$ = MAKE_const_slong (TRIGGER_TYPE_DB | DB_TRIGGER_CONNECT); }
 
2128
        |       DISCONNECT
 
2129
                        { $$ = MAKE_const_slong (TRIGGER_TYPE_DB | DB_TRIGGER_DISCONNECT); }
 
2130
        |       TRANSACTION START
 
2131
                        { $$ = MAKE_const_slong (TRIGGER_TYPE_DB | DB_TRIGGER_TRANS_START); }
 
2132
        |       TRANSACTION COMMIT
 
2133
                        { $$ = MAKE_const_slong (TRIGGER_TYPE_DB | DB_TRIGGER_TRANS_COMMIT); }
 
2134
        |       TRANSACTION ROLLBACK
 
2135
                        { $$ = MAKE_const_slong (TRIGGER_TYPE_DB | DB_TRIGGER_TRANS_ROLLBACK); }
 
2136
        ;
 
2137
 
 
2138
trigger_type_prefix     : BEFORE
 
2139
                        { $$ = MAKE_const_slong (0); }
 
2140
                | AFTER
 
2141
                        { $$ = MAKE_const_slong (1); }
 
2142
                ;
 
2143
 
 
2144
trigger_type_suffix     : INSERT
 
2145
                        { $$ = MAKE_const_slong (trigger_type_suffix (1, 0, 0)); }
 
2146
                | UPDATE
 
2147
                        { $$ = MAKE_const_slong (trigger_type_suffix (2, 0, 0)); }
 
2148
                | KW_DELETE
 
2149
                        { $$ = MAKE_const_slong (trigger_type_suffix (3, 0, 0)); }
 
2150
                | INSERT OR UPDATE
 
2151
                        { $$ = MAKE_const_slong (trigger_type_suffix (1, 2, 0)); }
 
2152
                | INSERT OR KW_DELETE
 
2153
                        { $$ = MAKE_const_slong (trigger_type_suffix (1, 3, 0)); }
 
2154
                | UPDATE OR INSERT
 
2155
                        { $$ = MAKE_const_slong (trigger_type_suffix (2, 1, 0)); }
 
2156
                | UPDATE OR KW_DELETE
 
2157
                        { $$ = MAKE_const_slong (trigger_type_suffix (2, 3, 0)); }
 
2158
                | KW_DELETE OR INSERT
 
2159
                        { $$ = MAKE_const_slong (trigger_type_suffix (3, 1, 0)); }
 
2160
                | KW_DELETE OR UPDATE
 
2161
                        { $$ = MAKE_const_slong (trigger_type_suffix (3, 2, 0)); }
 
2162
                | INSERT OR UPDATE OR KW_DELETE
 
2163
                        { $$ = MAKE_const_slong (trigger_type_suffix (1, 2, 3)); }
 
2164
                | INSERT OR KW_DELETE OR UPDATE
 
2165
                        { $$ = MAKE_const_slong (trigger_type_suffix (1, 3, 2)); }
 
2166
                | UPDATE OR INSERT OR KW_DELETE
 
2167
                        { $$ = MAKE_const_slong (trigger_type_suffix (2, 1, 3)); }
 
2168
                | UPDATE OR KW_DELETE OR INSERT
 
2169
                        { $$ = MAKE_const_slong (trigger_type_suffix (2, 3, 1)); }
 
2170
                | KW_DELETE OR INSERT OR UPDATE
 
2171
                        { $$ = MAKE_const_slong (trigger_type_suffix (3, 1, 2)); }
 
2172
                | KW_DELETE OR UPDATE OR INSERT
 
2173
                        { $$ = MAKE_const_slong (trigger_type_suffix (3, 2, 1)); }
 
2174
                ;
 
2175
 
 
2176
trigger_position : POSITION nonneg_short_integer
 
2177
                        { $$ = MAKE_const_slong ((IPTR) $2); }
 
2178
                |
 
2179
                        { $$ = NULL; }
 
2180
                ;
 
2181
 
 
2182
trigger_action : AS begin_trigger local_declaration_list full_proc_block
 
2183
                        { $$ = make_node (nod_list, (int) e_trg_act_count, $3, $4); }
 
2184
                ;
 
2185
 
 
2186
/* ALTER statement */
 
2187
 
 
2188
alter   : ALTER alter_clause
 
2189
                        { $$ = $2; }
 
2190
                ; 
 
2191
 
 
2192
alter_clause    : EXCEPTION alter_exception_clause
 
2193
                        { $$ = $2; }
 
2194
                | TABLE simple_table_name alter_ops
 
2195
                        { $$ = make_node (nod_mod_relation, (int) e_alt_count, 
 
2196
                                                $2, make_list ($3)); }
 
2197
/*
 
2198
                | VIEW alter_view_clause
 
2199
                        { $$ = $2; }
 
2200
*/
 
2201
                | TRIGGER alter_trigger_clause
 
2202
                        { $$ = $2; }
 
2203
                | PROCEDURE alter_procedure_clause
 
2204
                        { $$ = $2; }
 
2205
                | DATABASE init_alter_db alter_db
 
2206
                        { $$ = make_node (nod_mod_database, (int) e_adb_count,
 
2207
                                make_list ($3)); }
 
2208
                | DOMAIN alter_column_name alter_domain_ops
 
2209
                        { $$ = make_node (nod_mod_domain, (int) e_alt_count,
 
2210
                                                                                  $2, make_list ($3)); }
 
2211
                | INDEX alter_index_clause
 
2212
                        { $$ = make_node (nod_mod_index, (int) e_mod_idx_count, $2); }
 
2213
                | SEQUENCE alter_sequence_clause
 
2214
                        { $$ = $2; }
 
2215
                | EXTERNAL FUNCTION alter_udf_clause
 
2216
                        { $$ = $3; }
 
2217
                ;
 
2218
 
 
2219
alter_domain_ops        : alter_domain_op
 
2220
                | alter_domain_ops alter_domain_op
 
2221
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
2222
                ;
 
2223
 
 
2224
alter_domain_op : SET domain_default end_trigger
 
2225
                        { $$ = make_node (nod_def_default, (int) e_dft_count, $2, $3); }                          
 
2226
                | ADD CONSTRAINT check_constraint
 
2227
                        { $$ = $3; } 
 
2228
                | ADD check_constraint
 
2229
                        { $$ = $2; } 
 
2230
                | DROP DEFAULT
 
2231
                        {$$ = make_node (nod_del_default, (int) 0, NULL); }
 
2232
                | DROP CONSTRAINT
 
2233
                        { $$ = make_node (nod_delete_rel_constraint, (int) 1, NULL); }
 
2234
                | TO simple_column_name
 
2235
                        { $$ = $2; }
 
2236
                | TYPE init_data_type non_array_type 
 
2237
                        { $$ = make_node (nod_mod_domain_type, 2, $2); }
 
2238
                ;
 
2239
 
 
2240
alter_ops       : alter_op
 
2241
                | alter_ops ',' alter_op
 
2242
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
2243
                ;
 
2244
 
 
2245
alter_op        : DROP simple_column_name drop_behaviour
 
2246
                        { $$ = make_node (nod_del_field, 2, $2, $3); }
 
2247
                | DROP CONSTRAINT symbol_constraint_name
 
2248
                        { $$ = make_node (nod_delete_rel_constraint, (int) 1, $3);}
 
2249
                | ADD column_def
 
2250
                        { $$ = $2; }
 
2251
                | ADD table_constraint_definition
 
2252
                        { $$ = $2; }
 
2253
/* CVC: From SQL, field positions start at 1, not zero. Think in ORDER BY, for example. 
 
2254
                | col_opt simple_column_name POSITION nonneg_short_integer 
 
2255
                        { $$ = make_node (nod_mod_field_pos, 2, $2,
 
2256
                        MAKE_const_slong ((IPTR) $4)); } */
 
2257
                | col_opt simple_column_name POSITION pos_short_integer
 
2258
                        { $$ = make_node(nod_mod_field_pos, 2, $2,
 
2259
                                MAKE_const_slong((IPTR) $4)); }
 
2260
                | col_opt alter_column_name TO simple_column_name
 
2261
                        { $$ = make_node(nod_mod_field_name, 2, $2, $4); }
 
2262
                | col_opt alter_col_name TYPE alter_data_type_or_domain
 
2263
                        { $$ = make_node(nod_mod_field_type, e_mod_fld_type_count, $2, $4, NULL); }
 
2264
                | col_opt alter_col_name SET domain_default end_trigger
 
2265
                        { $$ = make_node(nod_mod_field_type, e_mod_fld_type_count, $2, NULL,
 
2266
                                        make_node(nod_def_default, (int) e_dft_count, $4, $5)); }
 
2267
                | col_opt alter_col_name DROP DEFAULT
 
2268
                        { $$ = make_node(nod_mod_field_type, e_mod_fld_type_count, $2, NULL,
 
2269
                                        make_node(nod_del_default, (int) 0, NULL)); }
 
2270
                ;
 
2271
 
 
2272
alter_column_name  : keyword_or_column
 
2273
                   { $$ = make_node (nod_field_name, (int) e_fln_count,
 
2274
                                                NULL, $1); }
 
2275
           ;
 
2276
 
 
2277
/* below are reserved words that could be used as column identifiers
 
2278
   in the previous versions */
 
2279
 
 
2280
keyword_or_column       : valid_symbol_name
 
2281
                | ADMIN                                 /* added in IB 5.0 */
 
2282
                | COLUMN                                /* added in IB 6.0 */
 
2283
                | EXTRACT
 
2284
                | YEAR
 
2285
                | MONTH
 
2286
                | DAY
 
2287
                | HOUR
 
2288
                | MINUTE
 
2289
                | SECOND
 
2290
                | TIME
 
2291
                | TIMESTAMP
 
2292
                | CURRENT_DATE
 
2293
                | CURRENT_TIME
 
2294
                | CURRENT_TIMESTAMP
 
2295
                | CURRENT_USER                  /* added in FB 1.0 */
 
2296
                | CURRENT_ROLE
 
2297
                | RECREATE
 
2298
                | CURRENT_CONNECTION    /* added in FB 1.5 */
 
2299
                | CURRENT_TRANSACTION
 
2300
                | BIGINT
 
2301
                | CASE
 
2302
                | RELEASE
 
2303
                | ROW_COUNT
 
2304
                | SAVEPOINT
 
2305
                | OPEN                                  /* added in FB 2.0 */
 
2306
                | CLOSE
 
2307
                | FETCH
 
2308
                | ROWS
 
2309
                | USING
 
2310
                | CROSS
 
2311
                | BIT_LENGTH
 
2312
                | BOTH
 
2313
                | CHAR_LENGTH
 
2314
                | CHARACTER_LENGTH
 
2315
                | COMMENT
 
2316
                | LEADING
 
2317
                | KW_LOWER
 
2318
                | OCTET_LENGTH
 
2319
                | TRAILING
 
2320
                | TRIM
 
2321
                | CONNECT                               /* added in FB 2.1 */
 
2322
                | DISCONNECT
 
2323
                | GLOBAL
 
2324
                | INSENSITIVE
 
2325
                | RECURSIVE 
 
2326
                | SENSITIVE
 
2327
                | START
 
2328
                ;
 
2329
 
 
2330
col_opt : ALTER
 
2331
                        { $$ = NULL; }
 
2332
                | ALTER COLUMN
 
2333
                        { $$ = NULL; }
 
2334
                ;
 
2335
 
 
2336
alter_data_type_or_domain       : non_array_type
 
2337
                        { $$ = NULL; }
 
2338
                | simple_column_name
 
2339
                        { $$ = make_node (nod_def_domain, (int) e_dom_count,
 
2340
                                        $1, NULL, NULL, NULL, NULL); }
 
2341
                ;
 
2342
 
 
2343
alter_col_name  : simple_column_name
 
2344
                        { lex.g_field_name = $1;
 
2345
                          lex.g_field = make_field ($1);
 
2346
                          $$ = (dsql_nod*) lex.g_field; }
 
2347
                ;
 
2348
 
 
2349
drop_behaviour  : RESTRICT
 
2350
                        { $$ = make_node (nod_restrict, 0, NULL); }
 
2351
                | CASCADE
 
2352
                        { $$ = make_node (nod_cascade, 0, NULL); }
 
2353
                |
 
2354
                        { $$ = make_node (nod_restrict, 0, NULL); }
 
2355
                ;
 
2356
 
 
2357
alter_index_clause      : symbol_index_name ACTIVE
 
2358
                                { $$ = make_node (nod_idx_active, 1, $1); }
 
2359
                        | symbol_index_name INACTIVE
 
2360
                                { $$ = make_node (nod_idx_inactive, 1, $1); }
 
2361
                        ;
 
2362
 
 
2363
alter_sequence_clause   : symbol_generator_name RESTART WITH signed_long_integer
 
2364
                        { $$ = make_node (nod_set_generator2, e_gen_id_count, $1,
 
2365
                                MAKE_const_slong ((IPTR) $4)); }
 
2366
                | symbol_generator_name RESTART WITH NUMBER64BIT
 
2367
                        { $$ = make_node (nod_set_generator2, e_gen_id_count, $1,
 
2368
                                MAKE_constant((dsql_str*) $4, CONSTANT_SINT64)); }
 
2369
                | symbol_generator_name RESTART WITH '-' NUMBER64BIT
 
2370
                        { $$ = make_node (nod_set_generator2, e_gen_id_count, $1,
 
2371
                                make_node(nod_negate, 1, MAKE_constant((dsql_str*) $5, CONSTANT_SINT64))); }
 
2372
                ;
 
2373
                
 
2374
alter_udf_clause    : symbol_UDF_name entry_op module_op
 
2375
                        { $$ = make_node(nod_mod_udf, e_mod_udf_count, $1, $2, $3); }
 
2376
                        ;
 
2377
 
 
2378
entry_op        : ENTRY_POINT sql_string
 
2379
                        { $$ = $2; }
 
2380
                |
 
2381
                        { $$ = NULL; }
 
2382
                ;
 
2383
 
 
2384
module_op       : MODULE_NAME sql_string
 
2385
                        { $$ = $2; }
 
2386
                |
 
2387
                        { $$ = NULL; }
 
2388
                ;
 
2389
 
 
2390
 
 
2391
/* ALTER DATABASE */
 
2392
 
 
2393
init_alter_db   : 
 
2394
                        { $$ = NULL; }
 
2395
                ;
 
2396
 
 
2397
alter_db        : db_alter_clause
 
2398
                | alter_db db_alter_clause
 
2399
                                { $$ = make_node (nod_list, (int) 2, $1, $2); }
 
2400
                ;
 
2401
 
 
2402
db_alter_clause : ADD db_file_list
 
2403
                        { $$ = $2; }
 
2404
                | ADD KW_DIFFERENCE KW_FILE sql_string
 
2405
                        { $$ = make_node (nod_difference_file, (int) 1, $4); }
 
2406
                | DROP KW_DIFFERENCE KW_FILE
 
2407
                        { $$ = make_node (nod_drop_difference, (int) 0, NULL); }
 
2408
                | BEGIN BACKUP
 
2409
                        { $$ = make_node (nod_begin_backup, (int) 0, NULL); }
 
2410
                | END BACKUP
 
2411
                        { $$ = make_node (nod_end_backup, (int) 0, NULL); }
 
2412
                ;
 
2413
 
 
2414
 
 
2415
/* ALTER TRIGGER */
 
2416
 
 
2417
alter_trigger_clause : symbol_trigger_name trigger_active
 
2418
                new_trigger_type
 
2419
                trigger_position
 
2420
                begin_trigger
 
2421
                new_trigger_action
 
2422
                end_trigger
 
2423
                        { $$ = make_node (nod_mod_trigger, (int) e_trg_count,
 
2424
                                $1, NULL, $2, $3, $4, $6, $7); }
 
2425
                ;
 
2426
 
 
2427
new_trigger_type : trigger_type
 
2428
                |
 
2429
                        { $$ = NULL; }
 
2430
                ;
 
2431
 
 
2432
new_trigger_action : trigger_action
 
2433
                |
 
2434
                        { $$ = NULL; }
 
2435
                ;
 
2436
 
 
2437
/* DROP metadata operations */
 
2438
                                
 
2439
drop            : DROP drop_clause
 
2440
                        { $$ = $2; }
 
2441
                                ; 
 
2442
 
 
2443
drop_clause     : EXCEPTION symbol_exception_name
 
2444
                        { $$ = make_node (nod_del_exception, 1, $2); }
 
2445
                | INDEX symbol_index_name
 
2446
                        { $$ = make_node (nod_del_index, (int) 1, $2); }
 
2447
                | PROCEDURE symbol_procedure_name
 
2448
                        { $$ = make_node (nod_del_procedure, (int) 1, $2); }
 
2449
                | TABLE symbol_table_name
 
2450
                        { $$ = make_node (nod_del_relation, (int) 1, $2); }
 
2451
                | TRIGGER symbol_trigger_name
 
2452
                        { $$ = make_node (nod_del_trigger, (int) 1, $2); }
 
2453
                | VIEW symbol_view_name
 
2454
                        { $$ = make_node (nod_del_view, (int) 1, $2); }
 
2455
                | FILTER symbol_filter_name
 
2456
                        { $$ = make_node (nod_del_filter, (int) 1, $2); }
 
2457
                | DOMAIN symbol_domain_name
 
2458
                        { $$ = make_node (nod_del_domain, (int) 1, $2); }
 
2459
                | EXTERNAL FUNCTION symbol_UDF_name
 
2460
                        { $$ = make_node (nod_del_udf, (int) 1, $3); }
 
2461
                | SHADOW pos_short_integer
 
2462
                        { $$ = make_node (nod_del_shadow, (int) 1, $2); }
 
2463
                | ROLE symbol_role_name
 
2464
                        { $$ = make_node (nod_del_role, (int) 1, $2); }
 
2465
                | GENERATOR symbol_generator_name
 
2466
                        { $$ = make_node (nod_del_generator, (int) 1, $2); }
 
2467
                | SEQUENCE symbol_generator_name
 
2468
                        { $$ = make_node (nod_del_generator, (int) 1, $2); }
 
2469
                | COLLATION symbol_collation_name
 
2470
                        { $$ = make_node (nod_del_collation, (int) 1, $2); }
 
2471
                ;
 
2472
 
 
2473
 
 
2474
/* these are the allowable datatypes */
 
2475
 
 
2476
data_type       : non_array_type
 
2477
                | array_type
 
2478
                ;
 
2479
 
 
2480
domain_or_non_array_type
 
2481
        :       domain_or_non_array_type_name
 
2482
        |       domain_or_non_array_type_name NOT KW_NULL
 
2483
                        { lex.g_field->fld_not_nullable = true; }
 
2484
        ;
 
2485
 
 
2486
domain_or_non_array_type_name
 
2487
        :       non_array_type
 
2488
        |       domain_type
 
2489
        ;
 
2490
 
 
2491
domain_type
 
2492
        :       TYPE OF symbol_column_name
 
2493
                        { lex.g_field->fld_type_of_name = ((dsql_str*) $3)->str_data; }
 
2494
        |       symbol_column_name
 
2495
                        {
 
2496
                                lex.g_field->fld_type_of_name = ((dsql_str*) $1)->str_data;
 
2497
                                lex.g_field->fld_full_domain = true;
 
2498
                        }
 
2499
        ;
 
2500
 
 
2501
 
 
2502
non_array_type  : simple_type
 
2503
                | blob_type
 
2504
                ;
 
2505
 
 
2506
array_type      : non_charset_simple_type '[' array_spec ']'
 
2507
                        { lex.g_field->fld_ranges = make_list ($3);
 
2508
                          lex.g_field->fld_dimensions = lex.g_field->fld_ranges->nod_count / 2;
 
2509
                          lex.g_field->fld_element_dtype = lex.g_field->fld_dtype;
 
2510
                          $$ = $1; }
 
2511
                | character_type '[' array_spec ']' charset_clause
 
2512
                        { lex.g_field->fld_ranges = make_list ($3);
 
2513
                          lex.g_field->fld_dimensions = lex.g_field->fld_ranges->nod_count / 2;
 
2514
                          lex.g_field->fld_element_dtype = lex.g_field->fld_dtype;
 
2515
                          $$ = $1; }
 
2516
                ;
 
2517
 
 
2518
array_spec      : array_range 
 
2519
                | array_spec ',' array_range 
 
2520
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
2521
                ;
 
2522
 
 
2523
array_range     : signed_long_integer
 
2524
                                { if ((IPTR) $1 < 1)
 
2525
                                        $$ = make_node (nod_list, (int) 2, 
 
2526
                                        MAKE_const_slong ((IPTR) $1),
 
2527
                                        MAKE_const_slong (1));
 
2528
                                  else
 
2529
                                        $$ = make_node (nod_list, (int) 2, 
 
2530
                                        MAKE_const_slong (1),
 
2531
                                        MAKE_const_slong ((IPTR) $1) ); }
 
2532
                | signed_long_integer ':' signed_long_integer
 
2533
                                { $$ = make_node (nod_list, (int) 2, 
 
2534
                                MAKE_const_slong ((IPTR) $1),
 
2535
                                MAKE_const_slong ((IPTR) $3)); }
 
2536
                ;
 
2537
 
 
2538
simple_type     : non_charset_simple_type
 
2539
                | character_type charset_clause
 
2540
                ;
 
2541
 
 
2542
non_charset_simple_type : national_character_type
 
2543
                | numeric_type
 
2544
                | float_type
 
2545
                | BIGINT
 
2546
                        { 
 
2547
                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
2548
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
2549
                                        isc_arg_gds, isc_sql_dialect_datatype_unsupport,
 
2550
                                        isc_arg_number, (SLONG) client_dialect,
 
2551
                                        isc_arg_string, "BIGINT",
 
2552
                                        0);
 
2553
                        if (db_dialect < SQL_DIALECT_V6_TRANSITION)
 
2554
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
2555
                                        isc_arg_gds, isc_sql_db_dialect_dtype_unsupport,
 
2556
                                        isc_arg_number, (SLONG) db_dialect,
 
2557
                                        isc_arg_string, "BIGINT",
 
2558
                                        0);
 
2559
                        lex.g_field->fld_dtype = dtype_int64; 
 
2560
                        lex.g_field->fld_length = sizeof (SINT64); 
 
2561
                        }
 
2562
                | integer_keyword
 
2563
                        { 
 
2564
                        lex.g_field->fld_dtype = dtype_long; 
 
2565
                        lex.g_field->fld_length = sizeof (SLONG); 
 
2566
                        }
 
2567
                | SMALLINT
 
2568
                        { 
 
2569
                        lex.g_field->fld_dtype = dtype_short; 
 
2570
                        lex.g_field->fld_length = sizeof (SSHORT); 
 
2571
                        }
 
2572
                | DATE
 
2573
                        { 
 
2574
                        *stmt_ambiguous = true;
 
2575
                        if (client_dialect <= SQL_DIALECT_V5)
 
2576
                                {
 
2577
                                /* Post warning saying that DATE is equivalent to TIMESTAMP */
 
2578
                                        ERRD_post_warning (isc_sqlwarn, isc_arg_number, (SLONG) 301, 
 
2579
                                                                                           isc_arg_warning, isc_dtype_renamed, 0);
 
2580
                                lex.g_field->fld_dtype = dtype_timestamp; 
 
2581
                                lex.g_field->fld_length = sizeof (GDS_TIMESTAMP);
 
2582
                                }
 
2583
                        else if (client_dialect == SQL_DIALECT_V6_TRANSITION)
 
2584
                                yyabandon (-104, isc_transitional_date);
 
2585
                        else
 
2586
                                {
 
2587
                                lex.g_field->fld_dtype = dtype_sql_date; 
 
2588
                                lex.g_field->fld_length = sizeof (ULONG);
 
2589
                                }
 
2590
                        }
 
2591
                | TIME
 
2592
                        { 
 
2593
                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
2594
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
2595
                                        isc_arg_gds, isc_sql_dialect_datatype_unsupport,
 
2596
                                        isc_arg_number, (SLONG) client_dialect,
 
2597
                                        isc_arg_string, "TIME",
 
2598
                                        0);
 
2599
                        if (db_dialect < SQL_DIALECT_V6_TRANSITION)
 
2600
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
2601
                                        isc_arg_gds, isc_sql_db_dialect_dtype_unsupport,
 
2602
                                        isc_arg_number, (SLONG) db_dialect,
 
2603
                                        isc_arg_string, "TIME",
 
2604
                                        0);
 
2605
                        lex.g_field->fld_dtype = dtype_sql_time; 
 
2606
                        lex.g_field->fld_length = sizeof (SLONG);
 
2607
                        }
 
2608
                | TIMESTAMP
 
2609
                        { 
 
2610
                        lex.g_field->fld_dtype = dtype_timestamp; 
 
2611
                        lex.g_field->fld_length = sizeof (GDS_TIMESTAMP);
 
2612
                        }
 
2613
                ;
 
2614
 
 
2615
integer_keyword : INTEGER       
 
2616
                | KW_INT
 
2617
                ;
 
2618
 
 
2619
 
 
2620
/* allow a blob to be specified with any combination of 
 
2621
   segment length and subtype */
 
2622
 
 
2623
blob_type       : BLOB blob_subtype blob_segsize charset_clause
 
2624
                        { 
 
2625
                        lex.g_field->fld_dtype = dtype_blob; 
 
2626
                        lex.g_field->fld_length = sizeof(ISC_QUAD);
 
2627
                        }
 
2628
                | BLOB '(' unsigned_short_integer ')'
 
2629
                        { 
 
2630
                        lex.g_field->fld_dtype = dtype_blob; 
 
2631
                        lex.g_field->fld_length = sizeof(ISC_QUAD);
 
2632
                        lex.g_field->fld_seg_length = (USHORT)(IPTR) $3;
 
2633
                        lex.g_field->fld_sub_type = 0;
 
2634
                        }
 
2635
                | BLOB '(' unsigned_short_integer ',' signed_short_integer ')'
 
2636
                        { 
 
2637
                        lex.g_field->fld_dtype = dtype_blob; 
 
2638
                        lex.g_field->fld_length = sizeof(ISC_QUAD);
 
2639
                        lex.g_field->fld_seg_length = (USHORT)(IPTR) $3;
 
2640
                        lex.g_field->fld_sub_type = (USHORT)(IPTR) $5;
 
2641
                        }
 
2642
                | BLOB '(' ',' signed_short_integer ')'
 
2643
                        { 
 
2644
                        lex.g_field->fld_dtype = dtype_blob; 
 
2645
                        lex.g_field->fld_length = sizeof(ISC_QUAD);
 
2646
                        lex.g_field->fld_seg_length = 80;
 
2647
                        lex.g_field->fld_sub_type = (USHORT)(IPTR) $4;
 
2648
                        }
 
2649
                ;
 
2650
 
 
2651
blob_segsize    : SEGMENT KW_SIZE unsigned_short_integer
 
2652
                        {
 
2653
                        lex.g_field->fld_seg_length = (USHORT)(IPTR) $3;
 
2654
                        }
 
2655
                |
 
2656
                        {
 
2657
                        lex.g_field->fld_seg_length = (USHORT) 80;
 
2658
                        }
 
2659
                ;
 
2660
 
 
2661
blob_subtype    : SUB_TYPE signed_short_integer
 
2662
                        {
 
2663
                        lex.g_field->fld_sub_type = (USHORT)(IPTR) $2;
 
2664
                        }
 
2665
                | SUB_TYPE symbol_blob_subtype_name
 
2666
                        {
 
2667
                        lex.g_field->fld_sub_type_name = $2;
 
2668
                        }
 
2669
                |
 
2670
                        {
 
2671
                        lex.g_field->fld_sub_type = (USHORT) 0;
 
2672
                        }
 
2673
                ;
 
2674
 
 
2675
charset_clause  : CHARACTER SET symbol_character_set_name
 
2676
                        {
 
2677
                        lex.g_field->fld_character_set = $3;
 
2678
                        }
 
2679
                |
 
2680
                ;
 
2681
 
 
2682
 
 
2683
/* character type */
 
2684
 
 
2685
 
 
2686
national_character_type : national_character_keyword '(' pos_short_integer ')'
 
2687
                        { 
 
2688
                        lex.g_field->fld_dtype = dtype_text; 
 
2689
                        lex.g_field->fld_character_length = (USHORT)(IPTR) $3; 
 
2690
                        lex.g_field->fld_flags |= FLD_national;
 
2691
                        }
 
2692
                | national_character_keyword
 
2693
                        { 
 
2694
                        lex.g_field->fld_dtype = dtype_text; 
 
2695
                        lex.g_field->fld_character_length = 1; 
 
2696
                        lex.g_field->fld_flags |= FLD_national;
 
2697
                        }
 
2698
                | national_character_keyword VARYING '(' pos_short_integer ')'
 
2699
                        { 
 
2700
                        lex.g_field->fld_dtype = dtype_varying; 
 
2701
                        lex.g_field->fld_character_length = (USHORT)(IPTR) $4; 
 
2702
                        lex.g_field->fld_flags |= FLD_national;
 
2703
                        }
 
2704
                ;
 
2705
 
 
2706
character_type  : character_keyword '(' pos_short_integer ')'
 
2707
                        { 
 
2708
                        lex.g_field->fld_dtype = dtype_text; 
 
2709
                        lex.g_field->fld_character_length = (USHORT)(IPTR) $3; 
 
2710
                        }
 
2711
                | character_keyword
 
2712
                        { 
 
2713
                        lex.g_field->fld_dtype = dtype_text; 
 
2714
                        lex.g_field->fld_character_length = 1; 
 
2715
                        }
 
2716
                | varying_keyword '(' pos_short_integer ')'
 
2717
                        { 
 
2718
                        lex.g_field->fld_dtype = dtype_varying; 
 
2719
                        lex.g_field->fld_character_length = (USHORT)(IPTR) $3; 
 
2720
                        }
 
2721
                ;
 
2722
 
 
2723
varying_keyword            : VARCHAR
 
2724
                           | CHARACTER VARYING
 
2725
                           | KW_CHAR VARYING
 
2726
                           ;
 
2727
 
 
2728
character_keyword          : CHARACTER
 
2729
                           | KW_CHAR
 
2730
                           ;
 
2731
 
 
2732
national_character_keyword : NCHAR
 
2733
                           | NATIONAL CHARACTER
 
2734
                                   | NATIONAL KW_CHAR
 
2735
                                   ;
 
2736
 
 
2737
 
 
2738
 
 
2739
/* numeric type */
 
2740
 
 
2741
numeric_type    : KW_NUMERIC prec_scale
 
2742
                                                { 
 
2743
                          lex.g_field->fld_sub_type = dsc_num_type_numeric;
 
2744
                        }
 
2745
                | decimal_keyword prec_scale
 
2746
                        {  
 
2747
                           lex.g_field->fld_sub_type = dsc_num_type_decimal;
 
2748
                           if (lex.g_field->fld_dtype == dtype_short)
 
2749
                                {
 
2750
                                lex.g_field->fld_dtype = dtype_long;
 
2751
                                lex.g_field->fld_length = sizeof (SLONG);
 
2752
                                }
 
2753
                        }
 
2754
                ;
 
2755
 
 
2756
prec_scale      : 
 
2757
                        {
 
2758
                        lex.g_field->fld_dtype = dtype_long; 
 
2759
                                lex.g_field->fld_length = sizeof (SLONG); 
 
2760
                        lex.g_field->fld_precision = 9;
 
2761
                                }
 
2762
                | '(' signed_long_integer ')'
 
2763
                        {                
 
2764
                        if ( ((IPTR) $2 < 1) || ((IPTR) $2 > 18) )
 
2765
                                yyabandon (-842, isc_precision_err);
 
2766
                                /* Precision most be between 1 and 18. */ 
 
2767
                        if ((IPTR) $2 > 9)
 
2768
                                {
 
2769
                                if ( ( (client_dialect <= SQL_DIALECT_V5) &&
 
2770
                                   (db_dialect   >  SQL_DIALECT_V5) ) ||
 
2771
                                 ( (client_dialect >  SQL_DIALECT_V5) &&
 
2772
                                   (db_dialect   <= SQL_DIALECT_V5) ) )
 
2773
                                        ERRD_post (isc_sqlerr,
 
2774
                                           isc_arg_number, (SLONG) -817,
 
2775
                                           isc_arg_gds,
 
2776
                                           isc_ddl_not_allowed_by_db_sql_dial,
 
2777
                                           isc_arg_number, (SLONG) db_dialect,
 
2778
                                           0);
 
2779
                                if (client_dialect <= SQL_DIALECT_V5)
 
2780
                                        {
 
2781
                                lex.g_field->fld_dtype = dtype_double;
 
2782
                                lex.g_field->fld_length = sizeof (double);
 
2783
                                        }
 
2784
                                else
 
2785
                                        {
 
2786
                                if (client_dialect == SQL_DIALECT_V6_TRANSITION)
 
2787
                                        {
 
2788
                                        ERRD_post_warning (
 
2789
                                        isc_dsql_warn_precision_ambiguous,
 
2790
                                        isc_arg_end );
 
2791
                                        ERRD_post_warning (
 
2792
                                        isc_dsql_warn_precision_ambiguous1,
 
2793
                                        isc_arg_end );
 
2794
                                        ERRD_post_warning (
 
2795
                                        isc_dsql_warn_precision_ambiguous2,
 
2796
                                        isc_arg_end );
 
2797
 
 
2798
                                        }
 
2799
                                lex.g_field->fld_dtype = dtype_int64;
 
2800
                                lex.g_field->fld_length = sizeof (SINT64);
 
2801
                                        }
 
2802
                                }
 
2803
                        else 
 
2804
                                if ((IPTR) $2 < 5)
 
2805
                                        {
 
2806
                                        lex.g_field->fld_dtype = dtype_short; 
 
2807
                                        lex.g_field->fld_length = sizeof (SSHORT); 
 
2808
                                        }
 
2809
                                else
 
2810
                                        {
 
2811
                                        lex.g_field->fld_dtype = dtype_long; 
 
2812
                                        lex.g_field->fld_length = sizeof (SLONG); 
 
2813
                                        }
 
2814
                        lex.g_field->fld_precision = (USHORT)(IPTR) $2;
 
2815
                        }
 
2816
                | '(' signed_long_integer ',' signed_long_integer ')'
 
2817
                        { 
 
2818
                        if ( ((IPTR) $2 < 1) || ((IPTR) $2 > 18) )
 
2819
                                yyabandon (-842, isc_precision_err);
 
2820
                                /* Precision should be between 1 and 18 */ 
 
2821
                        if (((IPTR) $4 > (IPTR) $2) || ((IPTR) $4 < 0))
 
2822
                                yyabandon (-842, isc_scale_nogt);
 
2823
                                /* Scale must be between 0 and precision */
 
2824
                        if ((IPTR) $2 > 9)
 
2825
                                {
 
2826
                                if ( ( (client_dialect <= SQL_DIALECT_V5) &&
 
2827
                                   (db_dialect   >  SQL_DIALECT_V5) ) ||
 
2828
                                 ( (client_dialect >  SQL_DIALECT_V5) &&
 
2829
                                   (db_dialect   <= SQL_DIALECT_V5) ) )
 
2830
                                        ERRD_post (isc_sqlerr,
 
2831
                                           isc_arg_number, (SLONG) -817,
 
2832
                                           isc_arg_gds,
 
2833
                                           isc_ddl_not_allowed_by_db_sql_dial,
 
2834
                                           isc_arg_number, (SLONG) db_dialect,
 
2835
                                           0);
 
2836
                                if (client_dialect <= SQL_DIALECT_V5)
 
2837
                                        {
 
2838
                                lex.g_field->fld_dtype = dtype_double;
 
2839
                                lex.g_field->fld_length = sizeof (double); 
 
2840
                                        }
 
2841
                                else
 
2842
                                        {
 
2843
                                if (client_dialect == SQL_DIALECT_V6_TRANSITION)
 
2844
                                  {
 
2845
                                        ERRD_post_warning (
 
2846
                                        isc_dsql_warn_precision_ambiguous,
 
2847
                                        isc_arg_end );
 
2848
                                        ERRD_post_warning (
 
2849
                                        isc_dsql_warn_precision_ambiguous1,
 
2850
                                        isc_arg_end );
 
2851
                                        ERRD_post_warning (
 
2852
                                        isc_dsql_warn_precision_ambiguous2,
 
2853
                                        isc_arg_end );
 
2854
                                  }
 
2855
                                  /* client_dialect >= SQL_DIALECT_V6 */
 
2856
                                lex.g_field->fld_dtype = dtype_int64;
 
2857
                                lex.g_field->fld_length = sizeof (SINT64);
 
2858
                                        }
 
2859
                                }
 
2860
                        else
 
2861
                                {
 
2862
                                if ((IPTR) $2 < 5)
 
2863
                                        {
 
2864
                                        lex.g_field->fld_dtype = dtype_short; 
 
2865
                                        lex.g_field->fld_length = sizeof (SSHORT); 
 
2866
                                        }
 
2867
                                else
 
2868
                                        {
 
2869
                                        lex.g_field->fld_dtype = dtype_long; 
 
2870
                                        lex.g_field->fld_length = sizeof (SLONG); 
 
2871
                                        }
 
2872
                                }
 
2873
                        lex.g_field->fld_precision = (USHORT)(IPTR) $2;
 
2874
                        lex.g_field->fld_scale = - (SSHORT)(IPTR) $4;
 
2875
                        }
 
2876
                ;
 
2877
 
 
2878
decimal_keyword : DECIMAL       
 
2879
                | KW_DEC
 
2880
                ;
 
2881
 
 
2882
 
 
2883
 
 
2884
/* floating point type */
 
2885
 
 
2886
float_type      : KW_FLOAT precision_opt
 
2887
                        { 
 
2888
                        if ((IPTR) $2 > 7)
 
2889
                                {
 
2890
                                lex.g_field->fld_dtype = dtype_double;
 
2891
                                lex.g_field->fld_length = sizeof (double); 
 
2892
                                }
 
2893
                        else
 
2894
                                {
 
2895
                                lex.g_field->fld_dtype = dtype_real; 
 
2896
                                lex.g_field->fld_length = sizeof (float);
 
2897
                                }
 
2898
                        }
 
2899
                | KW_LONG KW_FLOAT precision_opt
 
2900
                        { 
 
2901
                        lex.g_field->fld_dtype = dtype_double; 
 
2902
                        lex.g_field->fld_length = sizeof (double); 
 
2903
                        }
 
2904
                | REAL
 
2905
                        { 
 
2906
                        lex.g_field->fld_dtype = dtype_real; 
 
2907
                        lex.g_field->fld_length = sizeof (float); 
 
2908
                        }
 
2909
                | KW_DOUBLE PRECISION
 
2910
                        { 
 
2911
                        lex.g_field->fld_dtype = dtype_double; 
 
2912
                        lex.g_field->fld_length = sizeof (double); 
 
2913
                        }
 
2914
                ;
 
2915
 
 
2916
precision_opt   : '(' nonneg_short_integer ')'
 
2917
                        { $$ = $2; }
 
2918
                |
 
2919
                        { $$ = 0; }
 
2920
                ;
 
2921
 
 
2922
 
 
2923
 
 
2924
/* SET statements */
 
2925
set             : set_transaction
 
2926
                | set_generator
 
2927
                | set_statistics
 
2928
                ;
 
2929
 
 
2930
 
 
2931
set_generator   : SET GENERATOR symbol_generator_name TO signed_long_integer
 
2932
                        { $$ = make_node (nod_set_generator2, e_gen_id_count, $3,
 
2933
                                MAKE_const_slong ((IPTR) $5)); }
 
2934
                | SET GENERATOR symbol_generator_name TO NUMBER64BIT
 
2935
                        { $$ = make_node (nod_set_generator2, e_gen_id_count, $3,
 
2936
                                MAKE_constant((dsql_str*) $5, CONSTANT_SINT64)); }
 
2937
                | SET GENERATOR symbol_generator_name TO '-' NUMBER64BIT
 
2938
                        { $$ = make_node (nod_set_generator2, e_gen_id_count, $3,
 
2939
                                make_node(nod_negate, 1, MAKE_constant((dsql_str*) $6, CONSTANT_SINT64))); }
 
2940
                ;
 
2941
 
 
2942
 
 
2943
/* transaction statements */
 
2944
 
 
2945
savepoint       : set_savepoint
 
2946
                | release_savepoint
 
2947
                | undo_savepoint
 
2948
                ;
 
2949
 
 
2950
set_savepoint : SAVEPOINT symbol_savepoint_name
 
2951
                        { $$ = make_node (nod_user_savepoint, 1, $2); }
 
2952
                ;
 
2953
 
 
2954
release_savepoint       : RELEASE SAVEPOINT symbol_savepoint_name release_only_opt
 
2955
                        { $$ = make_node (nod_release_savepoint, 2, $3, $4); }
 
2956
                ;
 
2957
 
 
2958
release_only_opt        : ONLY
 
2959
                        { $$ = make_node (nod_flag, 0, NULL); }
 
2960
                |
 
2961
                        { $$ = 0; }
 
2962
                ;
 
2963
 
 
2964
undo_savepoint : ROLLBACK optional_work TO optional_savepoint symbol_savepoint_name
 
2965
                        { $$ = make_node (nod_undo_savepoint, 1, $5); }
 
2966
                ;
 
2967
 
 
2968
optional_savepoint      : SAVEPOINT
 
2969
                |
 
2970
                ;
 
2971
 
 
2972
commit          : COMMIT optional_work optional_retain
 
2973
                        { $$ = make_node (nod_commit, e_commit_count, $3); }
 
2974
                ;
 
2975
 
 
2976
rollback        : ROLLBACK optional_work optional_retain
 
2977
                        { $$ = make_node (nod_rollback, e_rollback_count, $3); }
 
2978
                ;
 
2979
 
 
2980
optional_work   : WORK
 
2981
                |
 
2982
                ;
 
2983
 
 
2984
optional_retain : RETAIN opt_snapshot
 
2985
                        { $$ = make_node (nod_retain, 0, NULL); }
 
2986
                |
 
2987
                        { $$ = NULL; }
 
2988
                ;
 
2989
 
 
2990
opt_snapshot    : SNAPSHOT
 
2991
                |
 
2992
                        { $$ = NULL; }
 
2993
                ;
 
2994
 
 
2995
set_transaction : SET TRANSACTION tran_opt_list_m
 
2996
                        {$$ = make_node (nod_trans, 1, make_list ($3)); }
 
2997
                ;
 
2998
 
 
2999
tran_opt_list_m : tran_opt_list 
 
3000
                |
 
3001
                        { $$ = NULL; }
 
3002
                ;
 
3003
 
 
3004
tran_opt_list   : tran_opt
 
3005
                | tran_opt_list tran_opt
 
3006
                        { $$ = make_node (nod_list, (int) 2, $1, $2); }
 
3007
                ;
 
3008
 
 
3009
tran_opt        : access_mode 
 
3010
                | lock_wait 
 
3011
                | isolation_mode 
 
3012
                | tra_misc_options
 
3013
                | tra_timeout
 
3014
                | tbl_reserve_options 
 
3015
                ;
 
3016
 
 
3017
access_mode     : READ ONLY
 
3018
                        { $$ = make_flag_node (nod_access, NOD_READ_ONLY, (int) 0, NULL); }
 
3019
                | READ WRITE
 
3020
                        { $$ = make_flag_node (nod_access, NOD_READ_WRITE, (int) 0, NULL); }
 
3021
                ;
 
3022
 
 
3023
lock_wait       : WAIT
 
3024
                        { $$ = make_flag_node (nod_wait, NOD_WAIT, (int) 0, NULL); }
 
3025
                | NO WAIT
 
3026
                        { $$ = make_flag_node (nod_wait, NOD_NO_WAIT, (int) 0, NULL); }
 
3027
                ;
 
3028
 
 
3029
isolation_mode  : ISOLATION LEVEL iso_mode
 
3030
                        { $$ = $3;}
 
3031
                | iso_mode
 
3032
                ;
 
3033
 
 
3034
iso_mode        : snap_shot
 
3035
                        { $$ = $1;}
 
3036
                | READ UNCOMMITTED version_mode
 
3037
                        { $$ = make_flag_node (nod_isolation, NOD_READ_COMMITTED, 1, $3); }
 
3038
                | READ COMMITTED version_mode
 
3039
                        { $$ = make_flag_node (nod_isolation, NOD_READ_COMMITTED, 1, $3); }
 
3040
                ;
 
3041
 
 
3042
snap_shot       : SNAPSHOT
 
3043
                        { $$ = make_flag_node (nod_isolation, NOD_CONCURRENCY, 0, NULL); }
 
3044
                | SNAPSHOT TABLE 
 
3045
                        { $$ = make_flag_node (nod_isolation, NOD_CONSISTENCY, 0, NULL); }
 
3046
                | SNAPSHOT TABLE STABILITY
 
3047
                        { $$ = make_flag_node (nod_isolation, NOD_CONSISTENCY, 0, NULL); }
 
3048
                ;
 
3049
 
 
3050
version_mode    : VERSION
 
3051
                        { $$ = make_flag_node (nod_version, NOD_VERSION, 0, NULL); }
 
3052
                | NO VERSION
 
3053
                        { $$ = make_flag_node (nod_version, NOD_NO_VERSION, 0, NULL); }
 
3054
                |
 
3055
                        { $$ = 0; }
 
3056
                ;
 
3057
 
 
3058
tra_misc_options: NO AUTO UNDO
 
3059
                        { $$ = make_flag_node(nod_tra_misc, NOD_NO_AUTO_UNDO, 0, NULL); }
 
3060
                | KW_IGNORE LIMBO
 
3061
                        { $$ = make_flag_node(nod_tra_misc, NOD_IGNORE_LIMBO, 0, NULL); }
 
3062
                | RESTART REQUESTS
 
3063
                        { $$ = make_flag_node(nod_tra_misc, NOD_RESTART_REQUESTS, 0, NULL); }
 
3064
                ;
 
3065
                
 
3066
tra_timeout: LOCK TIMEOUT nonneg_short_integer
 
3067
                        { $$ = make_node(nod_lock_timeout, 1, MAKE_const_slong ((IPTR) $3)); }
 
3068
                ;
 
3069
 
 
3070
tbl_reserve_options: RESERVING restr_list
 
3071
                        { $$ = make_node (nod_reserve, 1, make_list ($2)); }
 
3072
                ;
 
3073
 
 
3074
lock_type       : KW_SHARED
 
3075
                        { $$ = (dsql_nod*) NOD_SHARED; }
 
3076
                | PROTECTED
 
3077
                        { $$ = (dsql_nod*) NOD_PROTECTED ; }
 
3078
                |
 
3079
                        { $$ = (dsql_nod*) 0; }
 
3080
                ;
 
3081
 
 
3082
lock_mode       : READ
 
3083
                        { $$ = (dsql_nod*) NOD_READ; }
 
3084
                | WRITE
 
3085
                        { $$ = (dsql_nod*) NOD_WRITE; }
 
3086
                ;
 
3087
 
 
3088
restr_list      : restr_option
 
3089
                | restr_list ',' restr_option
 
3090
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
3091
                ;
 
3092
 
 
3093
restr_option    : table_list table_lock
 
3094
                        { $$ = make_node (nod_table_lock, (int) 2, make_list ($1), $2); }
 
3095
                ;
 
3096
 
 
3097
table_lock      : FOR lock_type lock_mode
 
3098
                        { $$ = make_flag_node (nod_lock_mode, (SSHORT) ((SSHORT)(IPTR) $2 | (SSHORT)(IPTR) $3), (SSHORT) 0, NULL); }
 
3099
                |
 
3100
                        { $$ = 0; }
 
3101
                ;
 
3102
 
 
3103
table_list      : simple_table_name
 
3104
                | table_list ',' simple_table_name
 
3105
                        { $$ = make_node (nod_list, (int) 2, $1, $3); }
 
3106
                ;
 
3107
 
 
3108
 
 
3109
set_statistics  : SET STATISTICS INDEX symbol_index_name
 
3110
                                { $$ = make_node (nod_set_statistics, (int) e_stat_count, $4); }
 
3111
                        ;
 
3112
 
 
3113
comment         : COMMENT ON ddl_type0 IS ddl_desc
 
3114
                                { $$ = make_node(nod_comment, e_comment_count, $3, NULL, NULL, $5); }
 
3115
                        | COMMENT ON ddl_type1 symbol_ddl_name IS ddl_desc
 
3116
                                { $$ = make_node(nod_comment, e_comment_count, $3, $4, NULL, $6); }
 
3117
                        | COMMENT ON ddl_type2 symbol_ddl_name ddl_subname IS ddl_desc
 
3118
                                { $$ = make_node(nod_comment, e_comment_count, $3, $4, $5, $7); }
 
3119
                        ;
 
3120
 
 
3121
ddl_type0       : DATABASE
 
3122
                                { $$ = MAKE_const_slong(ddl_database); }
 
3123
                        ;
 
3124
 
 
3125
ddl_type1       : DOMAIN
 
3126
                                { $$ = MAKE_const_slong(ddl_domain); }
 
3127
                        | TABLE
 
3128
                                { $$ = MAKE_const_slong(ddl_relation); }
 
3129
                        | VIEW
 
3130
                                { $$ = MAKE_const_slong(ddl_view); }
 
3131
                        | PROCEDURE
 
3132
                                { $$ = MAKE_const_slong(ddl_procedure); }
 
3133
                        | TRIGGER
 
3134
                                { $$ = MAKE_const_slong(ddl_trigger); }
 
3135
                        | EXTERNAL FUNCTION
 
3136
                                { $$ = MAKE_const_slong(ddl_udf); }
 
3137
                        | FILTER
 
3138
                                { $$ = MAKE_const_slong(ddl_blob_filter); }
 
3139
                        | EXCEPTION
 
3140
                                { $$ = MAKE_const_slong(ddl_exception); }
 
3141
                        | GENERATOR
 
3142
                                { $$ = MAKE_const_slong(ddl_generator); }
 
3143
                        | SEQUENCE
 
3144
                                { $$ = MAKE_const_slong(ddl_generator); }
 
3145
                        | INDEX
 
3146
                                { $$ = MAKE_const_slong(ddl_index); }
 
3147
                        | ROLE
 
3148
                                { $$ = MAKE_const_slong(ddl_role); }
 
3149
                        | CHARACTER SET
 
3150
                                { $$ = MAKE_const_slong(ddl_charset); }
 
3151
                        | COLLATION
 
3152
                                { $$ = MAKE_const_slong(ddl_collation); }
 
3153
/*
 
3154
                        | SECURITY CLASS
 
3155
                                { $$ = MAKE_const_slong(ddl_sec_class); }
 
3156
*/
 
3157
                        ;
 
3158
 
 
3159
ddl_type2       : COLUMN
 
3160
                                { $$ = MAKE_const_slong(ddl_relation); }
 
3161
                        | PARAMETER
 
3162
                                { $$ = MAKE_const_slong(ddl_procedure); }
 
3163
                        ;
 
3164
 
 
3165
ddl_subname     : '.' symbol_ddl_name
 
3166
                                { $$ = $2; }
 
3167
                        ;
 
3168
                        
 
3169
ddl_desc    : sql_string
 
3170
                        | KW_NULL
 
3171
                            { $$ = NULL; }
 
3172
                        ;
 
3173
 
 
3174
 
 
3175
/* SELECT statement */
 
3176
 
 
3177
select          : select_expr for_update_clause lock_clause
 
3178
                        { $$ = make_node (nod_select, (int) e_select_count, $1, $2, $3); }
 
3179
                ;
 
3180
 
 
3181
for_update_clause : FOR UPDATE for_update_list
 
3182
                        { $$ = make_node (nod_for_update, (int) e_fpd_count, $3); }
 
3183
                |
 
3184
                        { $$ = NULL; }
 
3185
                ;
 
3186
 
 
3187
for_update_list : OF column_list
 
3188
                        { $$ = $2; }
 
3189
                |
 
3190
                        { $$ = make_node (nod_flag, 0, NULL); }
 
3191
                ;
 
3192
 
 
3193
lock_clause : WITH LOCK
 
3194
                        { $$ = make_node (nod_flag, 0, NULL); }
 
3195
                |
 
3196
                        { $$ = NULL; }
 
3197
                ;
 
3198
                
 
3199
 
 
3200
/* SELECT expression */
 
3201
 
 
3202
select_expr     : with_clause select_expr_body order_clause rows_clause
 
3203
                                { $$ = make_node (nod_select_expr, (int) e_sel_count, $2, $3, $4, $1); }
 
3204
                ;
 
3205
 
 
3206
with_clause     : WITH RECURSIVE with_list
 
3207
                                { $$ = make_flag_node (nod_with, NOD_UNION_RECURSIVE, 1, make_list($3)); }
 
3208
                        | WITH with_list
 
3209
                                { $$ = make_node (nod_with, 1, make_list($2)); }
 
3210
                    |
 
3211
                                { $$ = NULL; }
 
3212
                ;
 
3213
 
 
3214
with_list       : with_item 
 
3215
                        | with_item ',' with_list
 
3216
                                { $$ = make_node (nod_list, 2, $1, $3); }
 
3217
                ;
 
3218
 
 
3219
with_item       : symbol_table_alias_name derived_column_list AS '(' select_expr ')'
 
3220
                                { $$ = make_node (nod_derived_table, (int) e_derived_table_count, $5, $1, $2, NULL); }
 
3221
                ;
 
3222
 
 
3223
column_select   : with_clause select_expr_body order_clause rows_clause
 
3224
                        { $$ = make_flag_node (nod_select_expr, NOD_SELECT_EXPR_VALUE,
 
3225
                                        (int) e_sel_count, $2, $3, $4, $1); }
 
3226
                ;
 
3227
 
 
3228
column_singleton        : with_clause select_expr_body order_clause rows_clause
 
3229
                        { $$ = make_flag_node (nod_select_expr, NOD_SELECT_EXPR_VALUE | NOD_SELECT_EXPR_SINGLETON,
 
3230
                                        (int) e_sel_count, $2, $3, $4, $1); }
 
3231
                ;
 
3232
 
 
3233
select_expr_body        : query_term
 
3234
                | select_expr_body UNION distinct_noise query_term
 
3235
                        { $$ = make_node (nod_list, 2, $1, $4); }
 
3236
                | select_expr_body UNION ALL query_term
 
3237
                        { $$ = make_flag_node (nod_list, NOD_UNION_ALL, 2, $1, $4); }
 
3238
                ;
 
3239
 
 
3240
query_term      : query_spec
 
3241
                ;
 
3242
 
 
3243
query_spec      : SELECT limit_clause
 
3244
                         distinct_clause
 
3245
                         select_list 
 
3246
                         from_clause 
 
3247
                         where_clause 
 
3248
                         group_clause 
 
3249
                         having_clause
 
3250
                         plan_clause
 
3251
                        { $$ = make_node (nod_query_spec, (int) e_qry_count, 
 
3252
                                        $2, $3, $4, $5, $6, $7, $8, $9); }
 
3253
                ;                                                                                          
 
3254
 
 
3255
limit_clause    : first_clause skip_clause
 
3256
                        { $$ = make_node (nod_limit, (int) e_limit_count, $2, $1); }
 
3257
                |   first_clause
 
3258
                        { $$ = make_node (nod_limit, (int) e_limit_count, NULL, $1); }
 
3259
                |   skip_clause 
 
3260
                        { $$ = make_node (nod_limit, (int) e_limit_count, $1, NULL); }
 
3261
                | 
 
3262
                        { $$ = 0; }
 
3263
                ;
 
3264
 
 
3265
first_clause    : FIRST long_integer
 
3266
                        { $$ = MAKE_const_slong ((IPTR) $2); }
 
3267
                | FIRST '(' value ')'
 
3268
                        { $$ = $3; }
 
3269
                | FIRST parameter
 
3270
                        { $$ = $2; }
 
3271
                ;
 
3272
 
 
3273
skip_clause     : SKIP long_integer
 
3274
                        { $$ = MAKE_const_slong ((IPTR) $2); }
 
3275
                | SKIP '(' value ')'
 
3276
                        { $$ = $3; }
 
3277
                | SKIP parameter
 
3278
                        { $$ = $2; }
 
3279
                ;
 
3280
 
 
3281
distinct_clause : DISTINCT
 
3282
                        { $$ = make_node (nod_flag, 0, NULL); }
 
3283
                | all_noise 
 
3284
                        { $$ = 0; }
 
3285
                ;
 
3286
 
 
3287
select_list     : select_items
 
3288
                        { $$ = make_list ($1); }
 
3289
                | '*'
 
3290
                        { $$ = 0; }
 
3291
                ;
 
3292
 
 
3293
select_items    : select_item
 
3294
                | select_items ',' select_item
 
3295
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3296
                ;
 
3297
 
 
3298
select_item     : value
 
3299
                | value as_noise symbol_item_alias_name
 
3300
                        { $$ = make_node (nod_alias, 2, $1, $3); }
 
3301
                ;
 
3302
 
 
3303
as_noise : AS
 
3304
                |
 
3305
                ;
 
3306
 
 
3307
/* FROM clause */
 
3308
 
 
3309
from_clause     : FROM from_list
 
3310
                        { $$ = make_list ($2); }
 
3311
                ;
 
3312
 
 
3313
from_list       : table_reference
 
3314
                | from_list ',' table_reference
 
3315
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3316
                ;
 
3317
 
 
3318
table_reference : joined_table
 
3319
                | table_primary
 
3320
                ;
 
3321
 
 
3322
table_primary   : table_proc
 
3323
                | derived_table
 
3324
                | '(' joined_table ')'
 
3325
                        { $$ = $2; }
 
3326
                ;
 
3327
 
 
3328
// AB: derived table support
 
3329
// ASF: create derived table with nested union to fix CORE-1246
 
3330
derived_table :
 
3331
                '(' select_expr ')' as_noise correlation_name derived_column_list
 
3332
                        { $$ = make_node(nod_derived_table, (int) e_derived_table_count, $2, $5, $6, NULL); }
 
3333
                ;
 
3334
 
 
3335
correlation_name : symbol_table_alias_name
 
3336
                |
 
3337
                        { $$ = NULL; }
 
3338
                ;
 
3339
 
 
3340
derived_column_list : '(' alias_list ')'
 
3341
                        { $$ = make_list ($2); }
 
3342
                |
 
3343
                        { $$ = NULL; }
 
3344
                ;
 
3345
 
 
3346
alias_list : symbol_item_alias_name
 
3347
                | alias_list ',' symbol_item_alias_name
 
3348
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3349
                ;
 
3350
 
 
3351
joined_table    : cross_join
 
3352
                | natural_join
 
3353
                | qualified_join
 
3354
                ;
 
3355
 
 
3356
cross_join      : table_reference CROSS JOIN table_primary
 
3357
                        { $$ = make_node (nod_join, (int) e_join_count, $1,
 
3358
                                make_node (nod_join_inner, (int) 0, NULL), $4, NULL); }
 
3359
                ;
 
3360
 
 
3361
natural_join    : table_reference NATURAL join_type JOIN table_primary
 
3362
                        { $$ = make_node (nod_join, (int) e_join_count, $1, $3, $5,
 
3363
                                        make_node (nod_flag, 0, NULL)); }
 
3364
                ;
 
3365
 
 
3366
qualified_join  : table_reference join_type JOIN table_reference join_specification
 
3367
                        { $$ = make_node (nod_join, (int) e_join_count, $1, $2, $4, $5); }
 
3368
                ;
 
3369
 
 
3370
join_specification      : join_condition
 
3371
                | named_columns_join
 
3372
                ;
 
3373
 
 
3374
join_condition  : ON search_condition
 
3375
                        { $$ = $2; }
 
3376
                ;
 
3377
 
 
3378
named_columns_join      : USING '(' column_list ')'
 
3379
                        { $$ = make_list ($3); }
 
3380
                ;
 
3381
 
 
3382
table_proc      : symbol_procedure_name table_proc_inputs as_noise symbol_table_alias_name
 
3383
                        { $$ = make_node (nod_rel_proc_name, 
 
3384
                                        (int) e_rpn_count, $1, $4, $2); }
 
3385
                | symbol_procedure_name table_proc_inputs
 
3386
                        { $$ = make_node (nod_rel_proc_name, 
 
3387
                                        (int) e_rpn_count, $1, NULL, $2); }
 
3388
                ;
 
3389
 
 
3390
table_proc_inputs       : '(' value_list ')'
 
3391
                                { $$ = make_list ($2); }
 
3392
                        |
 
3393
                                { $$ = NULL; }
 
3394
                        ;
 
3395
 
 
3396
table_name      : simple_table_name
 
3397
                | symbol_table_name as_noise symbol_table_alias_name
 
3398
                        { $$ = make_node (nod_relation_name, 
 
3399
                                                (int) e_rln_count, $1, $3); }
 
3400
                ;                                                
 
3401
 
 
3402
simple_table_name: symbol_table_name
 
3403
                        { $$ = make_node (nod_relation_name, 
 
3404
                                                (int) e_rln_count, $1, NULL); }
 
3405
                ;
 
3406
 
 
3407
join_type       : INNER
 
3408
                        { $$ = make_node (nod_join_inner, (int) 0, NULL); }
 
3409
                | LEFT outer_noise
 
3410
                        { $$ = make_node (nod_join_left, (int) 0, NULL); }
 
3411
                | RIGHT outer_noise
 
3412
                        { $$ = make_node (nod_join_right, (int) 0, NULL); }
 
3413
                | FULL outer_noise
 
3414
                        { $$ = make_node (nod_join_full, (int) 0, NULL); }
 
3415
                |
 
3416
                        { $$ = make_node (nod_join_inner, (int) 0, NULL); }
 
3417
                ;
 
3418
 
 
3419
outer_noise     : OUTER
 
3420
                |
 
3421
                ;
 
3422
 
 
3423
 
 
3424
/* other clauses in the select expression */
 
3425
 
 
3426
group_clause    : GROUP BY group_by_list
 
3427
                        { $$ = make_list ($3); }
 
3428
                |
 
3429
                        { $$ = NULL; }
 
3430
                ;
 
3431
 
 
3432
group_by_list   : group_by_item
 
3433
                | group_by_list ',' group_by_item
 
3434
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3435
                ;
 
3436
 
 
3437
/* Except aggregate-functions are all expressions supported in group_by_item, 
 
3438
   they are caught inside pass1.cpp */
 
3439
group_by_item : value
 
3440
                ;
 
3441
 
 
3442
having_clause   : HAVING search_condition
 
3443
                        { $$ = $2; }
 
3444
                |
 
3445
                        { $$ = NULL; }
 
3446
                ;
 
3447
 
 
3448
where_clause    : WHERE search_condition
 
3449
                        { $$ = $2; }
 
3450
                | 
 
3451
                        { $$ = NULL; }
 
3452
                ;
 
3453
 
 
3454
 
 
3455
/* PLAN clause to specify an access plan for a query */
 
3456
 
 
3457
plan_clause     : PLAN plan_expression
 
3458
                        { $$ = $2; }
 
3459
                |
 
3460
                        { $$ = NULL; }
 
3461
                ;
 
3462
 
 
3463
plan_expression : plan_type '(' plan_item_list ')'
 
3464
                        { $$ = make_node (nod_plan_expr, 2, $1, make_list ($3)); }
 
3465
                ;
 
3466
 
 
3467
plan_type       : JOIN
 
3468
                        { $$ = 0; }
 
3469
                | SORT MERGE
 
3470
                        { $$ = make_node (nod_merge_plan, (int) 0, NULL); }
 
3471
                | MERGE
 
3472
                        { $$ = make_node (nod_merge_plan, (int) 0, NULL); }
 
3473
 
 
3474
                /* for now the SORT operator is a no-op; it does not 
 
3475
                   change the place where a sort happens, but is just intended 
 
3476
                   to read the output from a SET PLAN */
 
3477
                | SORT
 
3478
                        { $$ = 0; }
 
3479
                |
 
3480
                        { $$ = 0; }
 
3481
                ;
 
3482
 
 
3483
plan_item_list  : plan_item
 
3484
                | plan_item ',' plan_item_list
 
3485
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3486
                ;
 
3487
 
 
3488
plan_item       : table_or_alias_list access_type
 
3489
                        { $$ = make_node (nod_plan_item, 2, make_list ($1), $2); }
 
3490
                | plan_expression
 
3491
                ;
 
3492
 
 
3493
table_or_alias_list : symbol_table_name
 
3494
                | symbol_table_name table_or_alias_list
 
3495
                        { $$ = make_node (nod_list, 2, $1, $2); }
 
3496
                ;
 
3497
 
 
3498
access_type     : NATURAL
 
3499
                        { $$ = make_node (nod_natural, (int) 0, NULL); }
 
3500
                | INDEX '(' index_list ')'
 
3501
                        { $$ = make_node (nod_index, 1, make_list ($3)); }
 
3502
                | ORDER symbol_index_name extra_indices_opt
 
3503
                        { $$ = make_node (nod_index_order, 2, $2, $3); }
 
3504
                ;
 
3505
 
 
3506
index_list      : symbol_index_name
 
3507
                | symbol_index_name ',' index_list
 
3508
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3509
                ;
 
3510
 
 
3511
extra_indices_opt       : INDEX '(' index_list ')'
 
3512
                        { $$ = make_list ($3); }
 
3513
                |
 
3514
                        { $$ = 0; }
 
3515
                ;
 
3516
 
 
3517
/* ORDER BY clause */
 
3518
 
 
3519
order_clause    : ORDER BY order_list
 
3520
                        { $$ = make_list ($3); }
 
3521
                |
 
3522
                        { $$ = 0; }
 
3523
                ;
 
3524
 
 
3525
order_list      : order_item
 
3526
                | order_list ',' order_item
 
3527
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3528
                ;
 
3529
 
 
3530
order_item      : value order_direction nulls_clause
 
3531
                        { $$ = make_node (nod_order, (int) e_order_count, $1, $2, $3); }
 
3532
                ;
 
3533
 
 
3534
order_direction : ASC
 
3535
                        { $$ = 0; }
 
3536
                | DESC
 
3537
                        { $$ = make_node (nod_flag, 0, NULL); }
 
3538
                |
 
3539
                        { $$ = 0; }
 
3540
                ;
 
3541
 
 
3542
nulls_clause : NULLS nulls_placement
 
3543
                        { $$ = $2; }
 
3544
                |
 
3545
                        { $$ = 0; }
 
3546
                ;
 
3547
 
 
3548
nulls_placement : FIRST
 
3549
                        { $$ = MAKE_const_slong(NOD_NULLS_FIRST); }
 
3550
                | LAST
 
3551
                        { $$ = MAKE_const_slong(NOD_NULLS_LAST); }
 
3552
                ;
 
3553
 
 
3554
/* ROWS clause */
 
3555
 
 
3556
rows_clause     : ROWS value
 
3557
                        /* equivalent to FIRST value */
 
3558
                        { $$ = make_node (nod_rows, (int) e_rows_count, NULL, $2); }
 
3559
                | ROWS value TO value
 
3560
                        /* equivalent to FIRST (upper_value - lower_value + 1) SKIP (lower_value - 1) */
 
3561
                        { $$ = make_node (nod_rows, (int) e_rows_count,
 
3562
                                make_node (nod_subtract, 2, $2,
 
3563
                                        MAKE_const_slong (1)),
 
3564
                                make_node (nod_add, 2,
 
3565
                                        make_node (nod_subtract, 2, $4, $2),
 
3566
                                        MAKE_const_slong (1))); }
 
3567
                |
 
3568
                        { $$ = NULL; }
 
3569
                ;
 
3570
 
 
3571
 
 
3572
/* INSERT statement */
 
3573
/* IBO hack: replace column_parens_opt by ins_column_parens_opt. */
 
3574
insert          : INSERT INTO simple_table_name ins_column_parens_opt
 
3575
                                VALUES '(' value_list ')' returning_clause
 
3576
                        { $$ = make_node (nod_insert, (int) e_ins_count, 
 
3577
                                $3, $4, make_list ($7), NULL, $9); }
 
3578
                | INSERT INTO simple_table_name ins_column_parens_opt select_expr returning_clause
 
3579
                        { $$ = make_node (nod_insert, (int) e_ins_count,
 
3580
                                $3, $4, NULL, $5, $6); }
 
3581
                | INSERT INTO simple_table_name DEFAULT VALUES returning_clause
 
3582
                        { $$ = make_node (nod_insert, (int) e_ins_count,
 
3583
                                $3, NULL, NULL, NULL, $6); }
 
3584
                ;
 
3585
 
 
3586
 
 
3587
/* MERGE statement */
 
3588
merge
 
3589
        :       MERGE INTO table_name USING table_reference ON search_condition
 
3590
                        merge_when_clause
 
3591
                {
 
3592
                        $$ = make_node(nod_merge, e_mrg_count, $3, $5, $7, $8);
 
3593
                }
 
3594
        ;
 
3595
 
 
3596
merge_when_clause
 
3597
        :       merge_when_matched_clause merge_when_not_matched_clause
 
3598
                { $$ = make_node(nod_merge_when, e_mrg_when_count, $1, $2); }
 
3599
        |       merge_when_not_matched_clause merge_when_matched_clause
 
3600
                { $$ = make_node(nod_merge_when, e_mrg_when_count, $2, $1); }
 
3601
        |       merge_when_matched_clause
 
3602
                { $$ = make_node(nod_merge_when, e_mrg_when_count, $1, NULL); }
 
3603
        |       merge_when_not_matched_clause
 
3604
                { $$ = make_node(nod_merge_when, e_mrg_when_count, NULL, $1); }
 
3605
        ;
 
3606
 
 
3607
merge_when_matched_clause
 
3608
        :       WHEN MATCHED THEN merge_update_specification
 
3609
                { $$ = $4; }
 
3610
        ;
 
3611
 
 
3612
merge_when_not_matched_clause
 
3613
        :       WHEN NOT MATCHED THEN merge_insert_specification
 
3614
                { $$ = $5; }
 
3615
        ;
 
3616
 
 
3617
merge_update_specification
 
3618
        :       UPDATE SET assignments
 
3619
                { $$ = make_node(nod_merge_update, e_mrg_update_count, make_list($3)); }
 
3620
        ;
 
3621
 
 
3622
merge_insert_specification
 
3623
        :       INSERT ins_column_parens_opt VALUES '(' value_list ')'
 
3624
                { $$ = make_node(nod_merge_insert, e_mrg_insert_count, make_list($2), make_list($5)); }
 
3625
        ;
 
3626
 
 
3627
 
 
3628
/* DELETE statement */
 
3629
 
 
3630
delete          : delete_searched
 
3631
                | delete_positioned
 
3632
                ;
 
3633
 
 
3634
delete_searched : KW_DELETE FROM table_name where_clause
 
3635
                plan_clause order_clause rows_clause returning_clause
 
3636
                        { $$ = make_node (nod_delete, (int) e_del_count,
 
3637
                                $3, $4, $5, $6, $7, NULL, $8); }
 
3638
                ;
 
3639
 
 
3640
delete_positioned : KW_DELETE FROM table_name cursor_clause
 
3641
                        { $$ = make_node (nod_delete, (int) e_del_count,
 
3642
                                $3, NULL, NULL, NULL, NULL, $4, NULL); }
 
3643
                ;
 
3644
 
 
3645
 
 
3646
/* UPDATE statement */
 
3647
 
 
3648
update          : update_searched
 
3649
                | update_positioned
 
3650
                ;
 
3651
 
 
3652
update_searched : UPDATE table_name SET assignments where_clause
 
3653
                plan_clause order_clause rows_clause returning_clause
 
3654
                        { $$ = make_node (nod_update, (int) e_upd_count,
 
3655
                                $2, make_list ($4), $5, $6, $7, $8, NULL, $9, NULL); }
 
3656
                        ;
 
3657
 
 
3658
update_positioned : UPDATE table_name SET assignments cursor_clause
 
3659
                        { $$ = make_node (nod_update, (int) e_upd_count,
 
3660
                                $2, make_list ($4), NULL, NULL, NULL, NULL, $5, NULL, NULL); }
 
3661
                ;
 
3662
 
 
3663
 
 
3664
/* UPDATE OR INSERT statement */
 
3665
 
 
3666
update_or_insert
 
3667
        :       UPDATE OR INSERT INTO simple_table_name ins_column_parens_opt
 
3668
                        VALUES '(' value_list ')'
 
3669
                        update_or_insert_matching_opt
 
3670
                        returning_clause
 
3671
                {
 
3672
                        $$ = make_node (nod_update_or_insert, (int) e_upi_count,
 
3673
                                $5, make_list ($6), make_list ($9), $11, $12);
 
3674
                }
 
3675
        ;
 
3676
 
 
3677
update_or_insert_matching_opt
 
3678
        :       MATCHING ins_column_parens
 
3679
                { $$ = $2; }
 
3680
        |
 
3681
                { $$ = NULL; }
 
3682
        ;
 
3683
 
 
3684
 
 
3685
returning_clause        : RETURNING value_list
 
3686
                        { $$ = make_node (nod_returning, (int) e_ret_count,
 
3687
                                        make_list ($2), NULL); }
 
3688
                | RETURNING value_list INTO variable_list
 
3689
                        { $$ = make_node (nod_returning, (int) e_ret_count,
 
3690
                                        make_list ($2), make_list ($4)); }
 
3691
                |
 
3692
                        { $$ = NULL; }
 
3693
                ;
 
3694
 
 
3695
cursor_clause   : WHERE CURRENT OF symbol_cursor_name
 
3696
                        { $$ = make_node (nod_cursor, (int) e_cur_count, $4, NULL, NULL, NULL); }
 
3697
                ;
 
3698
 
 
3699
 
 
3700
/* Assignments */
 
3701
 
 
3702
assignments     : assignment
 
3703
                | assignments ',' assignment
 
3704
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3705
                ;
 
3706
 
 
3707
assignment      : update_column_name '=' value
 
3708
                        { $$ = make_node (nod_assign, e_asgn_count, $3, $1); }
 
3709
                ;
 
3710
 
 
3711
exec_function
 
3712
        : udf
 
3713
                { $$ = make_node (nod_assign, e_asgn_count, $1, make_node (nod_null, 0, NULL)); }
 
3714
        | non_aggregate_function
 
3715
                { $$ = make_node (nod_assign, e_asgn_count, $1, make_node (nod_null, 0, NULL)); }
 
3716
        ;
 
3717
 
 
3718
 
 
3719
/* BLOB get and put */
 
3720
 
 
3721
blob_io                 : READ BLOB simple_column_name FROM simple_table_name filter_clause_io segment_clause_io
 
3722
                        { $$ = make_node (nod_get_segment, (int) e_blb_count, $3, $5, $6, $7); }
 
3723
                                | INSERT BLOB simple_column_name INTO simple_table_name filter_clause_io segment_clause_io
 
3724
                        { $$ = make_node (nod_put_segment, (int) e_blb_count, $3, $5, $6, $7); }
 
3725
                ;
 
3726
 
 
3727
filter_clause_io        : FILTER FROM blob_subtype_value_io TO blob_subtype_value_io
 
3728
                        { $$ = make_node (nod_list, 2, $3, $5); }
 
3729
                | FILTER TO blob_subtype_value_io
 
3730
                        { $$ = make_node (nod_list, 2, NULL, $3); }
 
3731
                |
 
3732
                        { $$ = NULL; }
 
3733
                ;
 
3734
 
 
3735
blob_subtype_value_io : blob_subtype_io
 
3736
                | parameter
 
3737
                ;
 
3738
 
 
3739
blob_subtype_io : signed_short_integer
 
3740
                        { $$ = MAKE_const_slong ((IPTR) $1); }
 
3741
                ;
 
3742
 
 
3743
segment_clause_io       : MAX_SEGMENT segment_length_io
 
3744
                        { $$ = $2; }
 
3745
                |
 
3746
                        { $$ = NULL; }
 
3747
                ;
 
3748
 
 
3749
segment_length_io       : unsigned_short_integer
 
3750
                        { $$ = MAKE_const_slong ((IPTR) $1); }
 
3751
                | parameter
 
3752
                ;
 
3753
 
 
3754
 
 
3755
/* column specifications */
 
3756
 
 
3757
column_parens_opt : column_parens
 
3758
                |
 
3759
                        { $$ = NULL; }
 
3760
                ;
 
3761
 
 
3762
column_parens   : '(' column_list ')'
 
3763
                        { $$ = make_list ($2); }
 
3764
                ;
 
3765
 
 
3766
column_list     : simple_column_name
 
3767
                | column_list ',' simple_column_name
 
3768
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3769
                ;
 
3770
 
 
3771
/* begin IBO hack */
 
3772
ins_column_parens_opt : ins_column_parens
 
3773
                |
 
3774
                        { $$ = NULL; }
 
3775
                ;
 
3776
 
 
3777
ins_column_parens       : '(' ins_column_list ')'
 
3778
                        { $$ = make_list ($2); }
 
3779
                ;
 
3780
 
 
3781
ins_column_list : update_column_name
 
3782
                | ins_column_list ',' update_column_name
 
3783
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
3784
                ;
 
3785
/* end IBO hack */
 
3786
 
 
3787
column_name      : simple_column_name
 
3788
                | symbol_table_alias_name '.' symbol_column_name
 
3789
                        { $$ = make_node (nod_field_name, (int) e_fln_count, 
 
3790
                                                        $1, $3); }
 
3791
                | symbol_table_alias_name '.' '*'
 
3792
                        { $$ = make_node (nod_field_name, (int) e_fln_count, 
 
3793
                                                        $1, NULL); }
 
3794
                ;
 
3795
 
 
3796
simple_column_name : symbol_column_name
 
3797
                        { $$ = make_node (nod_field_name, (int) e_fln_count,
 
3798
                                                NULL, $1); }
 
3799
                ;
 
3800
 
 
3801
update_column_name : simple_column_name
 
3802
/* CVC: This option should be deprecated! The only allowed syntax should be
 
3803
Update...set column = expr, without qualifier for the column. */
 
3804
                | symbol_table_alias_name '.' symbol_column_name
 
3805
                        { $$ = make_node (nod_field_name, (int) e_fln_count, 
 
3806
                                                        $1, $3); }
 
3807
                ;
 
3808
 
 
3809
/* boolean expressions */
 
3810
 
 
3811
search_condition : predicate
 
3812
                | search_condition OR search_condition
 
3813
                        { $$ = make_node (nod_or, 2, $1, $3); }
 
3814
                | search_condition AND search_condition
 
3815
                        { $$ = make_node (nod_and, 2, $1, $3); }
 
3816
                | NOT search_condition
 
3817
                        { $$ = make_node (nod_not, 1, $2); }
 
3818
                ;
 
3819
 
 
3820
predicate : comparison_predicate
 
3821
                | distinct_predicate
 
3822
                | between_predicate
 
3823
                | like_predicate
 
3824
                | in_predicate
 
3825
                | null_predicate
 
3826
                | quantified_predicate
 
3827
                | exists_predicate
 
3828
                | containing_predicate
 
3829
                | starting_predicate
 
3830
                | singular_predicate
 
3831
                | trigger_action_predicate
 
3832
                | '(' search_condition ')'
 
3833
                        { $$ = $2; }
 
3834
                ;
 
3835
 
 
3836
 
 
3837
/* comparisons */
 
3838
 
 
3839
comparison_predicate : value '=' value
 
3840
                        { $$ = make_node (nod_eql, 2, $1, $3); }
 
3841
                | value '<' value
 
3842
                        { $$ = make_node (nod_lss, 2, $1, $3); }
 
3843
                | value '>' value
 
3844
                        { $$ = make_node (nod_gtr, 2, $1, $3); }
 
3845
                | value GEQ value
 
3846
                        { $$ = make_node (nod_geq, 2, $1, $3); }
 
3847
                | value LEQ value
 
3848
                        { $$ = make_node (nod_leq, 2, $1, $3); }
 
3849
                | value NOT_GTR value
 
3850
                        { $$ = make_node (nod_leq, 2, $1, $3); }
 
3851
                | value NOT_LSS value
 
3852
                        { $$ = make_node (nod_geq, 2, $1, $3); }
 
3853
                | value NEQ value
 
3854
                        { $$ = make_node (nod_neq, 2, $1, $3); }
 
3855
                ;
 
3856
 
 
3857
/* quantified comparisons */
 
3858
 
 
3859
quantified_predicate : value '=' ALL '(' column_select ')'
 
3860
                { $$ = make_node (nod_eql_all, 2, $1, $5); }
 
3861
        | value '<' ALL '(' column_select ')'
 
3862
                { $$ = make_node (nod_lss_all, 2, $1, $5); }
 
3863
        | value '>' ALL '(' column_select ')'
 
3864
                { $$ = make_node (nod_gtr_all, 2, $1, $5); }
 
3865
        | value GEQ ALL '(' column_select ')'
 
3866
                { $$ = make_node (nod_geq_all, 2, $1, $5); }
 
3867
        | value LEQ ALL '(' column_select ')'
 
3868
                { $$ = make_node (nod_leq_all, 2, $1, $5); }
 
3869
        | value NOT_GTR ALL '(' column_select ')'
 
3870
                { $$ = make_node (nod_leq_all, 2, $1, $5); }
 
3871
        | value NOT_LSS ALL '(' column_select ')'
 
3872
                { $$ = make_node (nod_geq_all, 2, $1, $5); }
 
3873
        | value NEQ ALL '(' column_select ')'
 
3874
                { $$ = make_node (nod_neq_all, 2, $1, $5); }
 
3875
        | value '=' some '(' column_select ')'
 
3876
                { $$ = make_node (nod_eql_any, 2, $1, $5); }
 
3877
        | value '<' some '(' column_select ')'
 
3878
                { $$ = make_node (nod_lss_any, 2, $1, $5); }
 
3879
        | value '>' some '(' column_select ')'
 
3880
                { $$ = make_node (nod_gtr_any, 2, $1, $5); }
 
3881
        | value GEQ some '(' column_select ')'
 
3882
                { $$ = make_node (nod_geq_any, 2, $1, $5); }
 
3883
        | value LEQ some '(' column_select ')'
 
3884
                { $$ = make_node (nod_leq_any, 2, $1, $5); }
 
3885
        | value NOT_GTR some '(' column_select ')'
 
3886
                { $$ = make_node (nod_leq_any, 2, $1, $5); }
 
3887
        | value NOT_LSS some '(' column_select ')'
 
3888
                { $$ = make_node (nod_geq_any, 2, $1, $5); }
 
3889
        | value NEQ some '(' column_select ')'
 
3890
                { $$ = make_node (nod_neq_any, 2, $1, $5); }
 
3891
        ;
 
3892
 
 
3893
some    : SOME
 
3894
        | ANY
 
3895
        ;
 
3896
 
 
3897
 
 
3898
/* other predicates */
 
3899
 
 
3900
distinct_predicate : value IS DISTINCT FROM value
 
3901
                { $$ = make_node (nod_not, 1, make_node (nod_equiv, 2, $1, $5)); }
 
3902
        | value IS NOT DISTINCT FROM value
 
3903
                { $$ = make_node (nod_equiv, 2, $1, $6); }
 
3904
        ;
 
3905
 
 
3906
between_predicate : value BETWEEN value AND value
 
3907
                { $$ = make_node (nod_between, 3, $1, $3, $5); }
 
3908
        | value NOT BETWEEN value AND value
 
3909
                { $$ = make_node (nod_not, 1, make_node (nod_between, 
 
3910
                                                3, $1, $4, $6)); }
 
3911
        ;
 
3912
 
 
3913
like_predicate  : value LIKE value
 
3914
                { $$ = make_node (nod_like, 2, $1, $3); }
 
3915
        | value NOT LIKE value
 
3916
                { $$ = make_node (nod_not, 1, make_node (nod_like, 2, $1, $4)); }
 
3917
        | value LIKE value ESCAPE value
 
3918
                { $$ = make_node (nod_like, 3, $1, $3, $5); }
 
3919
        | value NOT LIKE value ESCAPE value
 
3920
                { $$ = make_node (nod_not, 1, make_node (nod_like, 
 
3921
                                                3, $1, $4, $6)); }
 
3922
        ;
 
3923
 
 
3924
in_predicate    : value KW_IN in_predicate_value
 
3925
                { $$ = make_node (nod_eql_any, 2, $1, $3); }
 
3926
        | value NOT KW_IN in_predicate_value
 
3927
                { $$ = make_node (nod_not, 1, make_node (nod_eql_any, 2, $1, $4)); }
 
3928
        ;
 
3929
 
 
3930
containing_predicate    : value CONTAINING value
 
3931
                { $$ = make_node (nod_containing, 2, $1, $3); }
 
3932
        | value NOT CONTAINING value
 
3933
                { $$ = make_node (nod_not, 1, make_node (nod_containing, 2, $1, $4)); }
 
3934
        ;
 
3935
 
 
3936
starting_predicate      : value STARTING value
 
3937
                { $$ = make_node (nod_starting, 2, $1, $3); }
 
3938
        | value NOT STARTING value
 
3939
                { $$ = make_node (nod_not, 1, make_node (nod_starting, 2, $1, $4)); }
 
3940
        | value STARTING WITH value
 
3941
                { $$ = make_node (nod_starting, 2, $1, $4); }
 
3942
        | value NOT STARTING WITH value
 
3943
                { $$ = make_node (nod_not, 1, make_node (nod_starting, 2, $1, $5)); }
 
3944
        ;
 
3945
 
 
3946
exists_predicate : EXISTS '(' select_expr ')'
 
3947
                { $$ = make_node (nod_exists, 1, $3); }
 
3948
        ;
 
3949
 
 
3950
singular_predicate : SINGULAR '(' select_expr ')'
 
3951
                { $$ = make_node (nod_singular, 1, $3); }
 
3952
        ;
 
3953
 
 
3954
null_predicate  : value IS KW_NULL
 
3955
                { $$ = make_node (nod_missing, 1, $1); }
 
3956
        | value IS NOT KW_NULL
 
3957
                { $$ = make_node (nod_not, 1, make_node (nod_missing, 1, $1)); }
 
3958
        ;
 
3959
 
 
3960
trigger_action_predicate        : INSERTING
 
3961
                { $$ = make_node (nod_eql, 2,
 
3962
                                        make_node (nod_internal_info, (int) e_internal_info_count,
 
3963
                                                MAKE_const_slong (internal_trigger_action)),
 
3964
                                                MAKE_const_slong (1)); }
 
3965
        | UPDATING
 
3966
                { $$ = make_node (nod_eql, 2,
 
3967
                                        make_node (nod_internal_info, (int) e_internal_info_count,
 
3968
                                                MAKE_const_slong (internal_trigger_action)),
 
3969
                                                MAKE_const_slong (2)); }
 
3970
        | DELETING
 
3971
                { $$ = make_node (nod_eql, 2,
 
3972
                                        make_node (nod_internal_info, (int) e_internal_info_count,
 
3973
                                                MAKE_const_slong (internal_trigger_action)),
 
3974
                                                MAKE_const_slong (3)); }
 
3975
        ;
 
3976
 
 
3977
/* set values */
 
3978
 
 
3979
in_predicate_value      : table_subquery
 
3980
        | '(' value_list ')'
 
3981
                { $$ = make_list ($2); }
 
3982
        ;
 
3983
 
 
3984
table_subquery  : '(' column_select ')'
 
3985
                        { $$ = $2; } 
 
3986
                ;
 
3987
 
 
3988
 
 
3989
/* value types */
 
3990
 
 
3991
value   : column_name
 
3992
                | array_element
 
3993
                | function
 
3994
                | u_constant
 
3995
                | parameter
 
3996
                | variable
 
3997
                | cast_specification
 
3998
                | case_expression
 
3999
                | next_value_expression
 
4000
                | udf
 
4001
                | '-' value
 
4002
                        { $$ = make_node (nod_negate, 1, $2); }
 
4003
                                | '+' value
 
4004
                                                { $$ = $2; }
 
4005
                | value '+' value
 
4006
                        { 
 
4007
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4008
                                  $$ = make_node (nod_add2, 2, $1, $3);
 
4009
                          else
 
4010
                                  $$ = make_node (nod_add, 2, $1, $3);
 
4011
                        }
 
4012
                | value CONCATENATE value
 
4013
                        { $$ = make_node (nod_concatenate, 2, $1, $3); }
 
4014
                | value COLLATE symbol_collation_name
 
4015
                        { $$ = make_node (nod_collate, (int) e_coll_count, (dsql_nod*) $3, $1); }
 
4016
                | value '-' value
 
4017
                        { 
 
4018
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4019
                                  $$ = make_node (nod_subtract2, 2, $1, $3);
 
4020
                          else 
 
4021
                                  $$ = make_node (nod_subtract, 2, $1, $3);
 
4022
                        }
 
4023
                | value '*' value
 
4024
                        { 
 
4025
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4026
                                   $$ = make_node (nod_multiply2, 2, $1, $3);
 
4027
                          else
 
4028
                                   $$ = make_node (nod_multiply, 2, $1, $3);
 
4029
                        }
 
4030
                | value '/' value
 
4031
                        {
 
4032
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4033
                                  $$ = make_node (nod_divide2, 2, $1, $3);
 
4034
                          else
 
4035
                                  $$ = make_node (nod_divide, 2, $1, $3);
 
4036
                        }
 
4037
                | '(' value ')'
 
4038
                        { $$ = $2; }
 
4039
                | '(' column_singleton ')'
 
4040
                        { $$ = $2; }
 
4041
                | current_user
 
4042
                | current_role
 
4043
                | internal_info
 
4044
                | DB_KEY
 
4045
                        { $$ = make_node (nod_dbkey, 1, NULL); }
 
4046
                | symbol_table_alias_name '.' DB_KEY
 
4047
                        { $$ = make_node (nod_dbkey, 1, $1); }
 
4048
                                | KW_VALUE
 
4049
                                                { 
 
4050
                          $$ = make_node (nod_dom_value, 0, NULL);
 
4051
                                                }
 
4052
                | datetime_value_expression
 
4053
                | null_value
 
4054
                ;
 
4055
 
 
4056
datetime_value_expression : CURRENT_DATE
 
4057
                        { 
 
4058
                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
4059
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4060
                                        isc_arg_gds, isc_sql_dialect_datatype_unsupport,
 
4061
                                        isc_arg_number, (SLONG) client_dialect,
 
4062
                                        isc_arg_string, "DATE",
 
4063
                                        0);
 
4064
                        if (db_dialect < SQL_DIALECT_V6_TRANSITION)
 
4065
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4066
                                        isc_arg_gds, isc_sql_db_dialect_dtype_unsupport,
 
4067
                                        isc_arg_number, (SLONG) db_dialect,
 
4068
                                        isc_arg_string, "DATE",
 
4069
                                        0);
 
4070
                        $$ = make_node (nod_current_date, 0, NULL);
 
4071
                        }
 
4072
                | CURRENT_TIME sec_precision_opt
 
4073
                        { 
 
4074
                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
4075
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4076
                                        isc_arg_gds, isc_sql_dialect_datatype_unsupport,
 
4077
                                        isc_arg_number, (SLONG) client_dialect,
 
4078
                                        isc_arg_string, "TIME",
 
4079
                                        0);
 
4080
                        if (db_dialect < SQL_DIALECT_V6_TRANSITION)
 
4081
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4082
                                        isc_arg_gds, isc_sql_db_dialect_dtype_unsupport,
 
4083
                                        isc_arg_number, (SLONG) db_dialect,
 
4084
                                        isc_arg_string, "TIME",
 
4085
                                        0);
 
4086
                        $$ = make_node (nod_current_time, 1, $2);
 
4087
                        }
 
4088
                | CURRENT_TIMESTAMP sec_precision_opt
 
4089
                        { $$ = make_node (nod_current_timestamp, 1, $2); }
 
4090
                ;
 
4091
 
 
4092
sec_precision_opt       : '(' nonneg_short_integer ')'
 
4093
                        { $$ = MAKE_const_slong ((IPTR) $2); }
 
4094
                |
 
4095
                        { $$ = NULL; }
 
4096
                ;
 
4097
 
 
4098
array_element   : column_name '[' value_list ']'
 
4099
                        { $$ = make_node (nod_array, (int) e_ary_count, $1, make_list ($3)); }
 
4100
                ;
 
4101
 
 
4102
value_list_opt
 
4103
        :       value_list
 
4104
        |       // nothing
 
4105
                { $$ = NULL; }
 
4106
        ;
 
4107
 
 
4108
value_list      : value
 
4109
                | value_list ',' value
 
4110
                        { $$ = make_node (nod_list, 2, $1, $3); }
 
4111
                ;
 
4112
 
 
4113
constant        : u_constant
 
4114
                | '-' u_numeric_constant
 
4115
                        { $$ = make_node (nod_negate, 1, $2); }
 
4116
                ;
 
4117
 
 
4118
u_numeric_constant : NUMERIC
 
4119
                        { $$ = MAKE_constant ((dsql_str*) $1, CONSTANT_STRING); }
 
4120
                | NUMBER
 
4121
                        { $$ = MAKE_const_slong ((IPTR) $1); }
 
4122
                | FLOAT_NUMBER
 
4123
                        { $$ = MAKE_constant ((dsql_str*) $1, CONSTANT_DOUBLE); }
 
4124
                | NUMBER64BIT
 
4125
                        { $$ = MAKE_constant ((dsql_str*) $1, CONSTANT_SINT64); }
 
4126
                | SCALEDINT
 
4127
                        { $$ = MAKE_constant ((dsql_str*) $1, CONSTANT_SINT64); }
 
4128
                ;
 
4129
 
 
4130
u_constant      : u_numeric_constant
 
4131
                | sql_string
 
4132
                        { $$ = MAKE_str_constant ((dsql_str*) $1, lex.att_charset); }
 
4133
                | DATE STRING
 
4134
                        { 
 
4135
                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
4136
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4137
                                        isc_arg_gds, isc_sql_dialect_datatype_unsupport,
 
4138
                                        isc_arg_number, (SLONG) client_dialect,
 
4139
                                        isc_arg_string, "DATE",
 
4140
                                        0);
 
4141
                        if (db_dialect < SQL_DIALECT_V6_TRANSITION)
 
4142
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4143
                                        isc_arg_gds, isc_sql_db_dialect_dtype_unsupport,
 
4144
                                        isc_arg_number, (SLONG) db_dialect,
 
4145
                                        isc_arg_string, "DATE",
 
4146
                                        0);
 
4147
                        $$ = MAKE_constant ((dsql_str*) $2, CONSTANT_DATE);
 
4148
                        }
 
4149
                | TIME STRING
 
4150
                        {
 
4151
                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
4152
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4153
                                        isc_arg_gds, isc_sql_dialect_datatype_unsupport,
 
4154
                                        isc_arg_number, (SLONG) client_dialect,
 
4155
                                        isc_arg_string, "TIME",
 
4156
                                        0);
 
4157
                        if (db_dialect < SQL_DIALECT_V6_TRANSITION)
 
4158
                                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104, 
 
4159
                                        isc_arg_gds, isc_sql_db_dialect_dtype_unsupport,
 
4160
                                        isc_arg_number, (SLONG) db_dialect,
 
4161
                                        isc_arg_string, "TIME",
 
4162
                                        0);
 
4163
                        $$ = MAKE_constant ((dsql_str*) $2, CONSTANT_TIME);
 
4164
                        }
 
4165
                | TIMESTAMP STRING
 
4166
                        { $$ = MAKE_constant ((dsql_str*) $2, CONSTANT_TIMESTAMP); }
 
4167
                ;
 
4168
 
 
4169
parameter       : '?'
 
4170
                        { $$ = make_parameter (); }
 
4171
                ;
 
4172
 
 
4173
current_user    : USER
 
4174
                        { $$ = make_node (nod_user_name, 0, NULL); }
 
4175
                | CURRENT_USER
 
4176
                        { $$ = make_node (nod_user_name, 0, NULL); }
 
4177
                ;
 
4178
 
 
4179
current_role    : CURRENT_ROLE
 
4180
                        { $$ = make_node (nod_current_role, 0, NULL); }
 
4181
                ;
 
4182
 
 
4183
internal_info   : CURRENT_CONNECTION
 
4184
                        { $$ = make_node (nod_internal_info, (int) e_internal_info_count,
 
4185
                                                MAKE_const_slong (internal_connection_id)); }
 
4186
                | CURRENT_TRANSACTION
 
4187
                        { $$ = make_node (nod_internal_info, (int) e_internal_info_count,
 
4188
                                                MAKE_const_slong (internal_transaction_id)); }
 
4189
                | GDSCODE
 
4190
                        { $$ = make_node (nod_internal_info, (int) e_internal_info_count,
 
4191
                                                MAKE_const_slong (internal_gdscode)); }
 
4192
                | SQLCODE
 
4193
                        { $$ = make_node (nod_internal_info, (int) e_internal_info_count,
 
4194
                                                MAKE_const_slong (internal_sqlcode)); }
 
4195
                | ROW_COUNT
 
4196
                        { $$ = make_node (nod_internal_info, (int) e_internal_info_count,
 
4197
                                                MAKE_const_slong (internal_rows_affected)); }
 
4198
                ;
 
4199
 
 
4200
sql_string      : STRING                        /* string in current charset */
 
4201
                        { $$ = $1; }
 
4202
                | INTRODUCER STRING             /* string in specific charset */
 
4203
                        { ((dsql_str*) $2)->str_charset = (TEXT *) $1;
 
4204
                          $$ = $2; }
 
4205
                ;
 
4206
 
 
4207
signed_short_integer    :       nonneg_short_integer
 
4208
                | '-' neg_short_integer
 
4209
                        { $$ = (dsql_nod*) - (IPTR) $2; }
 
4210
                ;
 
4211
 
 
4212
nonneg_short_integer    : NUMBER
 
4213
                        { if ((IPTR) $1 > SHRT_POS_MAX)
 
4214
                                yyabandon (-842, isc_expec_short);
 
4215
                                /* Short integer expected */
 
4216
                          $$ = $1;}
 
4217
                ;
 
4218
 
 
4219
neg_short_integer : NUMBER
 
4220
                        { if ((IPTR) $1 > SHRT_NEG_MAX)
 
4221
                                yyabandon (-842, isc_expec_short);
 
4222
                                /* Short integer expected */
 
4223
                          $$ = $1;}
 
4224
                ;
 
4225
 
 
4226
pos_short_integer : nonneg_short_integer
 
4227
                        { if ((IPTR) $1 == 0)
 
4228
                                yyabandon (-842, isc_expec_positive);
 
4229
                                /* Positive number expected */
 
4230
                          $$ = $1;}
 
4231
                ;
 
4232
 
 
4233
unsigned_short_integer : NUMBER
 
4234
                        { if ((IPTR) $1 > SHRT_UNSIGNED_MAX)
 
4235
                                yyabandon (-842, isc_expec_ushort);
 
4236
                                /* Unsigned short integer expected */
 
4237
                          $$ = $1;}
 
4238
                ;
 
4239
 
 
4240
signed_long_integer     :       long_integer
 
4241
                | '-' long_integer
 
4242
                        { $$ = (dsql_nod*) - (IPTR) $2; }
 
4243
                ;
 
4244
 
 
4245
long_integer    : NUMBER
 
4246
                        { $$ = $1;}
 
4247
                ;
 
4248
 
 
4249
 
 
4250
/* functions */
 
4251
 
 
4252
function
 
4253
        : aggregate_function
 
4254
        | non_aggregate_function
 
4255
        ;
 
4256
 
 
4257
non_aggregate_function
 
4258
        : numeric_value_function
 
4259
        | string_value_function
 
4260
        | system_function_expression
 
4261
        ;
 
4262
        
 
4263
aggregate_function      : COUNT '(' '*' ')'
 
4264
                        { $$ = make_node (nod_agg_count, 0, NULL); }
 
4265
                | COUNT '(' all_noise value ')'
 
4266
                        { $$ = make_node (nod_agg_count, 1, $4); }
 
4267
                | COUNT '(' DISTINCT value ')'
 
4268
                        { $$ = make_flag_node (nod_agg_count,
 
4269
                                                                           NOD_AGG_DISTINCT, 1, $4); }
 
4270
                | SUM '(' all_noise value ')'
 
4271
                        { 
 
4272
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4273
                                  $$ = make_node (nod_agg_total2, 1, $4);
 
4274
                          else
 
4275
                                  $$ = make_node (nod_agg_total, 1, $4);
 
4276
                        }
 
4277
                | SUM '(' DISTINCT value ')'
 
4278
                        { 
 
4279
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4280
                                  $$ = make_flag_node (nod_agg_total2,
 
4281
                                                   NOD_AGG_DISTINCT, 1, $4);
 
4282
                          else
 
4283
                                  $$ = make_flag_node (nod_agg_total,
 
4284
                                                   NOD_AGG_DISTINCT, 1, $4);
 
4285
                        }
 
4286
                | AVG '(' all_noise value ')'
 
4287
                        { 
 
4288
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4289
                                  $$ = make_node (nod_agg_average2, 1, $4);
 
4290
                          else
 
4291
                                  $$ = make_node (nod_agg_average, 1, $4);
 
4292
                        }
 
4293
                | AVG '(' DISTINCT value ')'
 
4294
                        { 
 
4295
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4296
                                  $$ = make_flag_node (nod_agg_average2,
 
4297
                                                   NOD_AGG_DISTINCT, 1, $4);
 
4298
                          else
 
4299
                                  $$ = make_flag_node (nod_agg_average,
 
4300
                                                   NOD_AGG_DISTINCT, 1, $4);
 
4301
                        }
 
4302
                | MINIMUM '(' all_noise value ')'
 
4303
                        { $$ = make_node (nod_agg_min, 1, $4); }
 
4304
                | MINIMUM '(' DISTINCT value ')'
 
4305
                        { $$ = make_node (nod_agg_min, 1, $4); }
 
4306
                | MAXIMUM '(' all_noise value ')'
 
4307
                        { $$ = make_node (nod_agg_max, 1, $4); }
 
4308
                | MAXIMUM '(' DISTINCT value ')'
 
4309
                        { $$ = make_node (nod_agg_max, 1, $4); }
 
4310
                | LIST '(' all_noise value delimiter_opt ')'
 
4311
                        { $$ = make_node (nod_agg_list, 2, $4, $5); }
 
4312
                | LIST '(' DISTINCT value delimiter_opt ')'
 
4313
                        { $$ = make_flag_node (nod_agg_list, NOD_AGG_DISTINCT, 2, $4, $5); }
 
4314
                ;
 
4315
 
 
4316
delimiter_opt   : ',' delimiter_value
 
4317
                        { $$ = $2; }
 
4318
                |
 
4319
                        { $$ = MAKE_str_constant (MAKE_cstring(","), lex.att_charset); }
 
4320
                ;
 
4321
 
 
4322
delimiter_value : sql_string
 
4323
                        { $$ = MAKE_str_constant ((dsql_str*) $1, lex.att_charset); }
 
4324
                | parameter
 
4325
                | variable
 
4326
                ;
 
4327
 
 
4328
numeric_value_function
 
4329
        : extract_expression
 
4330
        | length_expression
 
4331
        ;
 
4332
 
 
4333
extract_expression      : EXTRACT '(' timestamp_part FROM value ')'
 
4334
                        { $$ = make_node (nod_extract, (int) e_extract_count, $3, $5); }
 
4335
                ;
 
4336
 
 
4337
length_expression       : bit_length_expression
 
4338
                | char_length_expression
 
4339
                | octet_length_expression
 
4340
                ;
 
4341
 
 
4342
bit_length_expression   : BIT_LENGTH '(' value ')'
 
4343
                        { $$ = make_node(nod_strlen, (int) e_strlen_count,
 
4344
                                        MAKE_const_slong(blr_strlen_bit), $3); }
 
4345
                ;
 
4346
 
 
4347
char_length_expression  : CHAR_LENGTH '(' value ')'
 
4348
                        { $$ = make_node(nod_strlen, (int) e_strlen_count,
 
4349
                                        MAKE_const_slong(blr_strlen_char), $3); }
 
4350
                | CHARACTER_LENGTH '(' value ')'
 
4351
                        { $$ = make_node(nod_strlen, (int) e_strlen_count,
 
4352
                                        MAKE_const_slong(blr_strlen_char), $3); }
 
4353
                ;
 
4354
 
 
4355
octet_length_expression : OCTET_LENGTH '(' value ')'
 
4356
                        { $$ = make_node(nod_strlen, (int) e_strlen_count,
 
4357
                                        MAKE_const_slong(blr_strlen_octet), $3); }
 
4358
                ;
 
4359
 
 
4360
system_function_expression
 
4361
        : system_function_std_syntax '(' value_list_opt ')'
 
4362
                { $$ = make_node(nod_sys_function, e_sysfunc_count, $1, make_list($3)); }
 
4363
        | system_function_special_syntax
 
4364
        ;
 
4365
 
 
4366
system_function_std_syntax
 
4367
        : ABS
 
4368
        | ACOS
 
4369
        | ASCII_CHAR
 
4370
        | ASCII_VAL
 
4371
        | ASIN
 
4372
        | ATAN
 
4373
        | ATAN2
 
4374
        | BIN_AND
 
4375
        | BIN_OR
 
4376
        | BIN_SHL
 
4377
        | BIN_SHR
 
4378
        | BIN_XOR
 
4379
        | CEIL
 
4380
        | COS
 
4381
        | COSH
 
4382
        | COT
 
4383
        | EXP
 
4384
        | FLOOR
 
4385
        | GEN_UUID
 
4386
        | HASH
 
4387
        | LEFT
 
4388
        | LN
 
4389
        | LOG
 
4390
        | LOG10
 
4391
        | LPAD
 
4392
        | MAXVALUE
 
4393
        | MINVALUE
 
4394
        | MOD
 
4395
        | PI
 
4396
        | POSITION
 
4397
        | POWER
 
4398
        | RAND
 
4399
        | REPLACE
 
4400
        | REVERSE
 
4401
        | RIGHT
 
4402
        | ROUND
 
4403
        | RPAD
 
4404
        | SIGN
 
4405
        | SIN
 
4406
        | SINH
 
4407
        | SQRT
 
4408
        | TAN
 
4409
        | TANH
 
4410
        | TRUNC
 
4411
        ;
 
4412
 
 
4413
system_function_special_syntax
 
4414
        : DATEADD '(' value timestamp_part TO value ')'
 
4415
                {
 
4416
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4417
                                $1, make_node(nod_list, 3, $3, $4, $6));
 
4418
                }
 
4419
        | DATEADD '(' timestamp_part ',' value ',' value ')'
 
4420
                {
 
4421
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4422
                                $1, make_node(nod_list, 3, $5, $3, $7));
 
4423
                }
 
4424
        | DATEDIFF '(' timestamp_part FROM value TO value ')'
 
4425
                {
 
4426
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4427
                                $1, make_node(nod_list, 3, $3, $5, $7));
 
4428
                }
 
4429
        | DATEDIFF '(' timestamp_part ',' value ',' value ')'
 
4430
                {
 
4431
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4432
                                $1, make_node(nod_list, 3, $3, $5, $7));
 
4433
                }
 
4434
        | OVERLAY '(' value PLACING value FROM value FOR value ')'
 
4435
                {
 
4436
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4437
                                $1, make_node(nod_list, 4, $3, $5, $7, $9));
 
4438
                }
 
4439
        | OVERLAY '(' value PLACING value FROM value ')'
 
4440
                {
 
4441
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4442
                                $1, make_node(nod_list, 3, $3, $5, $7));
 
4443
                }
 
4444
        | POSITION '(' value KW_IN value ')'
 
4445
                {
 
4446
                        $$ = make_flag_node(nod_sys_function, NOD_SPECIAL_SYNTAX, e_sysfunc_count,
 
4447
                                $1, make_node(nod_list, 2, $3, $5));
 
4448
                }
 
4449
        ;
 
4450
 
 
4451
string_value_function   :  substring_function
 
4452
                | trim_function
 
4453
                | KW_UPPER '(' value ')'
 
4454
                        { $$ = make_node (nod_upcase, 1, $3); }
 
4455
                | KW_LOWER '(' value ')'
 
4456
                        { $$ = make_node (nod_lowcase, 1, $3); }
 
4457
                ;
 
4458
 
 
4459
substring_function      : SUBSTRING '(' value FROM value string_length_opt ')'
 
4460
                        /* SQL spec requires numbering to start with 1,
 
4461
                           hence we decrement the first parameter to make it
 
4462
                           compatible with the engine's implementation */
 
4463
                        { $$ = make_node (nod_substr, (int) e_substr_count, $3,
 
4464
                                make_node (nod_subtract, 2, $5,
 
4465
                                        MAKE_const_slong (1)), $6); }
 
4466
                ;
 
4467
 
 
4468
string_length_opt       : FOR value
 
4469
                        { $$ = $2; }
 
4470
                |
 
4471
                        { $$ = MAKE_const_slong (SHRT_POS_MAX); }
 
4472
                ;
 
4473
 
 
4474
trim_function   : TRIM '(' trim_specification value FROM value ')'
 
4475
                        { $$ = make_node (nod_trim, (int) e_trim_count, $3, $4, $6); }
 
4476
                | TRIM '(' value FROM value ')'
 
4477
                        { $$ = make_node (nod_trim, (int) e_trim_count, 
 
4478
                                MAKE_const_slong (blr_trim_both), $3, $5); }
 
4479
                | TRIM '(' trim_specification FROM value ')'
 
4480
                        { $$ = make_node (nod_trim, (int) e_trim_count, $3, NULL, $5); }
 
4481
                | TRIM '(' value ')'
 
4482
                        { $$ = make_node (nod_trim, (int) e_trim_count,
 
4483
                                MAKE_const_slong (blr_trim_both), NULL, $3); }
 
4484
                ;
 
4485
 
 
4486
trim_specification      : BOTH
 
4487
                        { $$ = MAKE_const_slong (blr_trim_both); }
 
4488
                | TRAILING
 
4489
                        { $$ = MAKE_const_slong (blr_trim_trailing); }
 
4490
                | LEADING
 
4491
                        { $$ = MAKE_const_slong (blr_trim_leading); }
 
4492
                ;
 
4493
                
 
4494
udf             : symbol_UDF_name '(' value_list ')'
 
4495
                        { $$ = make_node (nod_udf, 2, $1, $3); }
 
4496
                | symbol_UDF_name '(' ')'
 
4497
                        { $$ = make_node (nod_udf, 1, $1); }
 
4498
                ;
 
4499
 
 
4500
cast_specification      : CAST '(' value AS data_type_descriptor ')'
 
4501
                        { $$ = make_node (nod_cast, (int) e_cast_count, $5, $3); }
 
4502
                ;
 
4503
 
 
4504
/* case expressions */
 
4505
 
 
4506
case_expression : case_abbreviation
 
4507
                | case_specification
 
4508
                ;
 
4509
 
 
4510
case_abbreviation       : NULLIF '(' value ',' value ')'
 
4511
                        { $$ = make_node (nod_searched_case, 2, 
 
4512
                                make_node (nod_list, 2, make_node (nod_eql, 2, $3, $5), 
 
4513
                                make_node (nod_null, 0, NULL)), $3); }
 
4514
                | IIF '(' search_condition ',' value ',' value ')'
 
4515
                        { $$ = make_node (nod_searched_case, 2, 
 
4516
                                make_node (nod_list, 2, $3, $5), $7); }
 
4517
                | COALESCE '(' value ',' value_list ')'
 
4518
                        { $$ = make_node (nod_coalesce, 2, $3, $5); }
 
4519
                | DECODE '(' value ',' decode_pairs ')'
 
4520
                        { $$ = make_node(nod_simple_case, 3, $3, make_list($5), make_node(nod_null, 0, NULL)); }
 
4521
                | DECODE '(' value ',' decode_pairs ',' value ')'
 
4522
                        { $$ = make_node(nod_simple_case, 3, $3, make_list($5), $7); }
 
4523
                ;
 
4524
 
 
4525
case_specification      : simple_case
 
4526
                | searched_case
 
4527
                ;
 
4528
 
 
4529
simple_case     : CASE case_operand simple_when_clause END
 
4530
                        { $$ = make_node (nod_simple_case, 3, $2, make_list($3), make_node (nod_null, 0, NULL)); }
 
4531
                | CASE case_operand simple_when_clause ELSE case_result END
 
4532
                        { $$ = make_node (nod_simple_case, 3, $2, make_list($3), $5); }
 
4533
                ;
 
4534
 
 
4535
simple_when_clause      : WHEN when_operand THEN case_result
 
4536
                                { $$ = make_node (nod_list, 2, $2, $4); }
 
4537
                        | simple_when_clause WHEN when_operand THEN case_result
 
4538
                                { $$ = make_node (nod_list, 2, $1, make_node (nod_list, 2, $3, $5)); }
 
4539
                        ;
 
4540
 
 
4541
searched_case   : CASE searched_when_clause END
 
4542
                        { $$ = make_node (nod_searched_case, 2, make_list($2), make_node (nod_null, 0, NULL)); }
 
4543
                | CASE searched_when_clause ELSE case_result END
 
4544
                        { $$ = make_node (nod_searched_case, 2, make_list($2), $4); }
 
4545
                ;
 
4546
 
 
4547
searched_when_clause    : WHEN search_condition THEN case_result
 
4548
                        { $$ = make_node (nod_list, 2, $2, $4); }
 
4549
                | searched_when_clause WHEN search_condition THEN case_result
 
4550
                        { $$ = make_node (nod_list, 2, $1, make_node (nod_list, 2, $3, $5)); }
 
4551
                ;
 
4552
 
 
4553
when_operand    : value
 
4554
                ;
 
4555
 
 
4556
case_operand    : value
 
4557
                ;
 
4558
 
 
4559
case_result     : value
 
4560
                ;
 
4561
 
 
4562
decode_pairs
 
4563
        : value ',' value
 
4564
                { $$ = make_node(nod_list, 2, $1, $3); }
 
4565
        | decode_pairs ',' value ',' value
 
4566
                { $$ = make_node(nod_list, 2, $1, make_node(nod_list, 2, $3, $5)); }
 
4567
        ;
 
4568
 
 
4569
/* next value expression */
 
4570
 
 
4571
next_value_expression   : NEXT KW_VALUE FOR symbol_generator_name
 
4572
                        { 
 
4573
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4574
                                  $$ = make_node (nod_gen_id2, 2, $4,
 
4575
                                                MAKE_const_slong(1));
 
4576
                          else
 
4577
                                  $$ = make_node (nod_gen_id, 2, $4,
 
4578
                                                MAKE_const_slong(1));
 
4579
                        }
 
4580
                | GEN_ID '(' symbol_generator_name ',' value ')'
 
4581
                        { 
 
4582
                          if (client_dialect >= SQL_DIALECT_V6_TRANSITION)
 
4583
                                  $$ = make_node (nod_gen_id2, 2, $3, $5);
 
4584
                          else
 
4585
                                  $$ = make_node (nod_gen_id, 2, $3, $5);
 
4586
                        }
 
4587
                ;
 
4588
 
 
4589
 
 
4590
timestamp_part  : YEAR
 
4591
                        { $$ = MAKE_const_slong (blr_extract_year); }
 
4592
                | MONTH
 
4593
                        { $$ = MAKE_const_slong (blr_extract_month); }
 
4594
                | DAY
 
4595
                        { $$ = MAKE_const_slong (blr_extract_day); }
 
4596
                | HOUR
 
4597
                        { $$ = MAKE_const_slong (blr_extract_hour); }
 
4598
                | MINUTE
 
4599
                        { $$ = MAKE_const_slong (blr_extract_minute); }
 
4600
                | SECOND
 
4601
                        { $$ = MAKE_const_slong (blr_extract_second); }
 
4602
                | MILLISECOND
 
4603
                        { $$ = MAKE_const_slong (blr_extract_millisecond); }
 
4604
                | WEEK
 
4605
                        { $$ = MAKE_const_slong (blr_extract_week); }
 
4606
                | WEEKDAY
 
4607
                        { $$ = MAKE_const_slong (blr_extract_weekday); }
 
4608
                | YEARDAY
 
4609
                        { $$ = MAKE_const_slong (blr_extract_yearday); }
 
4610
                ;
 
4611
 
 
4612
all_noise       : ALL
 
4613
                |
 
4614
                ;
 
4615
 
 
4616
distinct_noise  : DISTINCT
 
4617
                |
 
4618
                ;
 
4619
 
 
4620
null_value      : KW_NULL
 
4621
                        { $$ = make_node (nod_null, 0, NULL); }
 
4622
                ;
 
4623
 
 
4624
 
 
4625
 
 
4626
/* Performs special mapping of keywords into symbols */
 
4627
 
 
4628
symbol_UDF_name : SYMBOL
 
4629
        ;
 
4630
 
 
4631
symbol_blob_subtype_name        : valid_symbol_name
 
4632
        ;
 
4633
 
 
4634
symbol_character_set_name       : valid_symbol_name
 
4635
        ;
 
4636
 
 
4637
symbol_collation_name   : valid_symbol_name
 
4638
        ;
 
4639
 
 
4640
symbol_column_name      : valid_symbol_name
 
4641
        ;
 
4642
 
 
4643
symbol_constraint_name  : valid_symbol_name
 
4644
        ;
 
4645
 
 
4646
symbol_cursor_name      : valid_symbol_name
 
4647
        ;
 
4648
 
 
4649
symbol_domain_name      : valid_symbol_name
 
4650
        ;
 
4651
 
 
4652
symbol_exception_name   : valid_symbol_name
 
4653
        ;
 
4654
 
 
4655
symbol_filter_name      : valid_symbol_name
 
4656
        ;
 
4657
 
 
4658
symbol_gdscode_name     : valid_symbol_name
 
4659
        ;
 
4660
 
 
4661
symbol_generator_name   : valid_symbol_name
 
4662
        ;
 
4663
 
 
4664
symbol_index_name       : valid_symbol_name
 
4665
        ;
 
4666
 
 
4667
symbol_item_alias_name  : valid_symbol_name
 
4668
        ;
 
4669
 
 
4670
symbol_label_name       : valid_symbol_name
 
4671
        ;
 
4672
 
 
4673
symbol_ddl_name : valid_symbol_name
 
4674
        ;
 
4675
 
 
4676
symbol_procedure_name   : valid_symbol_name
 
4677
        ;
 
4678
 
 
4679
symbol_role_name        : valid_symbol_name
 
4680
        ;
 
4681
 
 
4682
symbol_table_alias_name : valid_symbol_name
 
4683
        ;
 
4684
 
 
4685
symbol_table_name       : valid_symbol_name
 
4686
        ;
 
4687
 
 
4688
symbol_trigger_name     : valid_symbol_name
 
4689
        ;
 
4690
 
 
4691
symbol_user_name        : valid_symbol_name
 
4692
        ;
 
4693
 
 
4694
symbol_variable_name    : valid_symbol_name
 
4695
        ;
 
4696
 
 
4697
symbol_view_name        : valid_symbol_name
 
4698
        ;
 
4699
 
 
4700
symbol_savepoint_name   : valid_symbol_name
 
4701
        ;
 
4702
 
 
4703
/* symbols */
 
4704
 
 
4705
valid_symbol_name       : SYMBOL
 
4706
        | non_reserved_word
 
4707
        ;
 
4708
 
 
4709
/* list of non-reserved words */
 
4710
 
 
4711
non_reserved_word :
 
4712
        ACTION                                  /* added in IB 5.0 */
 
4713
        | CASCADE
 
4714
        | FREE_IT
 
4715
        | RESTRICT
 
4716
        | ROLE
 
4717
        | TYPE                                  /* added in IB 6.0 */
 
4718
        | KW_BREAK                              /* added in FB 1.0 */
 
4719
        | KW_DESCRIPTOR
 
4720
        | SUBSTRING
 
4721
        | COALESCE                              /* added in FB 1.5 */
 
4722
        | LAST
 
4723
        | LEAVE
 
4724
        | LOCK
 
4725
        | NULLIF
 
4726
        | NULLS
 
4727
        | STATEMENT
 
4728
        | INSERTING
 
4729
        | UPDATING
 
4730
        | DELETING
 
4731
        | FIRST
 
4732
        | SKIP
 
4733
        | BLOCK                                 /* added in FB 2.0 */
 
4734
        | BACKUP
 
4735
        | KW_DIFFERENCE
 
4736
        | IIF
 
4737
        | SCALAR_ARRAY
 
4738
        | WEEKDAY
 
4739
        | YEARDAY
 
4740
        | SEQUENCE
 
4741
        | NEXT
 
4742
        | RESTART
 
4743
        | COLLATION
 
4744
        | RETURNING
 
4745
        | KW_IGNORE
 
4746
        | LIMBO
 
4747
        | UNDO
 
4748
        | REQUESTS
 
4749
        | TIMEOUT
 
4750
        | ABS                                   /* added in FB 2.1 */
 
4751
        | ACCENT
 
4752
        | ACOS
 
4753
        | ALWAYS
 
4754
        | ASCII_CHAR
 
4755
        | ASCII_VAL
 
4756
        | ASIN
 
4757
        | ATAN
 
4758
        | ATAN2
 
4759
        | BIN_AND
 
4760
        | BIN_OR
 
4761
        | BIN_SHL
 
4762
        | BIN_SHR
 
4763
        | BIN_XOR
 
4764
        | CEIL
 
4765
        | COS
 
4766
        | COSH
 
4767
        | COT
 
4768
        | DATEADD
 
4769
        | DATEDIFF
 
4770
        | DECODE
 
4771
        | EXP
 
4772
        | FLOOR
 
4773
        | GEN_UUID
 
4774
        | GENERATED
 
4775
        | HASH
 
4776
        | LIST
 
4777
        | LN
 
4778
        | LOG
 
4779
        | LOG10
 
4780
        | LPAD
 
4781
        | MATCHED
 
4782
        | MATCHING
 
4783
        | MAXVALUE
 
4784
        | MILLISECOND
 
4785
        | MINVALUE
 
4786
        | MOD
 
4787
        | OVERLAY
 
4788
        | PAD
 
4789
        | PI
 
4790
        | PLACING
 
4791
        | POWER
 
4792
        | PRESERVE
 
4793
        | RAND
 
4794
        | REPLACE
 
4795
        | REVERSE
 
4796
        | ROUND
 
4797
        | RPAD
 
4798
        | SIGN
 
4799
        | SIN
 
4800
        | SINH
 
4801
        | SPACE
 
4802
        | SQRT
 
4803
        | TAN
 
4804
        | TANH
 
4805
        | TEMPORARY
 
4806
        | TRUNC
 
4807
        | WEEK
 
4808
        ;
 
4809
 
 
4810
%%
 
4811
 
 
4812
 
 
4813
/*
 
4814
 *      PROGRAM:        Dynamic SQL runtime support
 
4815
 *      MODULE:         lex.c
 
4816
 *      DESCRIPTION:    Lexical routine
 
4817
 *
 
4818
 */
 
4819
 
 
4820
 
 
4821
void LEX_dsql_init (void)
 
4822
{
 
4823
/**************************************
 
4824
 *
 
4825
 *      L E X _ d s q l _ i n i t
 
4826
 *
 
4827
 **************************************
 
4828
 *
 
4829
 * Functional description
 
4830
 *      Initialize LEX for processing.  This is called only once
 
4831
 *      per session.
 
4832
 *
 
4833
 **************************************/
 
4834
        for (const TOK* token = KEYWORD_getTokens(); token->tok_string; ++token)
 
4835
        {
 
4836
                DSQL_SYM symbol = FB_NEW_RPT(*DSQL_permanent_pool, 0) dsql_sym;
 
4837
                symbol->sym_string = (TEXT *) token->tok_string;
 
4838
                symbol->sym_length = strlen(token->tok_string);
 
4839
                symbol->sym_type = SYM_keyword;
 
4840
                symbol->sym_keyword = token->tok_ident;
 
4841
                symbol->sym_version = token->tok_version;
 
4842
                dsql_str* str = FB_NEW_RPT(*DSQL_permanent_pool, symbol->sym_length) dsql_str;
 
4843
                str->str_length = symbol->sym_length;
 
4844
                strncpy((char*)str->str_data, (char*)symbol->sym_string, symbol->sym_length);
 
4845
                symbol->sym_object = (void *) str;
 
4846
                HSHD_insert(symbol);
 
4847
        }
 
4848
}
 
4849
 
 
4850
 
 
4851
void LEX_string (
 
4852
        const TEXT* string,
 
4853
        USHORT  length,
 
4854
        SSHORT  character_set)
 
4855
{
 
4856
/**************************************
 
4857
 *
 
4858
 *      L E X _ s t r i n g
 
4859
 *
 
4860
 **************************************
 
4861
 *
 
4862
 * Functional description
 
4863
 *      Initialize LEX to process a string.
 
4864
 *
 
4865
 **************************************/
 
4866
 
 
4867
        lex.line_start = lex.ptr = string;
 
4868
        lex.end = string + length;
 
4869
        lex.lines = 1;
 
4870
        lex.att_charset = character_set;
 
4871
        lex.line_start_bk = lex.line_start;
 
4872
        lex.lines_bk = lex.lines;
 
4873
        lex.param_number = 1;
 
4874
        lex.prev_keyword = -1;
 
4875
#ifdef DSQL_DEBUG
 
4876
        if (DSQL_debug & 32)
 
4877
                dsql_trace("Source DSQL string:\n%.*s", (int)length, string);
 
4878
#endif
 
4879
}
 
4880
 
 
4881
 
 
4882
static const TEXT* lex_position (void)
 
4883
{
 
4884
/**************************************
 
4885
 *
 
4886
 *      l e x _ p o s i t i o n
 
4887
 *
 
4888
 **************************************
 
4889
 *
 
4890
 * Functional description
 
4891
 *      Return the current position of LEX 
 
4892
 *      in the input string.
 
4893
 *
 
4894
 **************************************/
 
4895
 
 
4896
        return lex.ptr;
 
4897
}
 
4898
 
 
4899
 
 
4900
#ifdef NOT_USED_OR_REPLACED
 
4901
static bool long_int(dsql_nod* string,
 
4902
                                         SLONG *long_value)
 
4903
{
 
4904
/*************************************
 
4905
 *
 
4906
 *      l o n g _ i n t
 
4907
 * 
 
4908
 *************************************
 
4909
 *
 
4910
 * Functional description
 
4911
 *      checks for all digits in the
 
4912
 *      number and return an atol().
 
4913
 *
 
4914
 *************************************/
 
4915
 
 
4916
        for (const UCHAR* p = (UCHAR*)((dsql_str*) string)->str_data; 
 
4917
                 classes(*p) & CHR_DIGIT; p++)
 
4918
        {
 
4919
                if (!(classes(*p) & CHR_DIGIT)) {
 
4920
                        return false;
 
4921
                }
 
4922
        }
 
4923
 
 
4924
        *long_value = atol(((dsql_str*) string)->str_data);
 
4925
 
 
4926
        return true;
 
4927
}
 
4928
#endif
 
4929
 
 
4930
static dsql_fld* make_field (dsql_nod* field_name)
 
4931
{
 
4932
/**************************************
 
4933
 *
 
4934
 *      m a k e _ f i e l d
 
4935
 *
 
4936
 **************************************
 
4937
 *
 
4938
 * Functional description
 
4939
 *      Make a field block of given name.
 
4940
 *
 
4941
 **************************************/
 
4942
        tsql* tdsql = DSQL_get_thread_data();
 
4943
 
 
4944
        if (field_name == NULL)
 
4945
        {
 
4946
                dsql_fld* field =
 
4947
                        FB_NEW_RPT(*tdsql->getDefaultPool(), sizeof (INTERNAL_FIELD_NAME)) dsql_fld;
 
4948
                strcpy (field->fld_name, INTERNAL_FIELD_NAME);
 
4949
                return field;
 
4950
        }
 
4951
        const dsql_str* string = (dsql_str*) field_name->nod_arg[1];
 
4952
        dsql_fld* field =
 
4953
                FB_NEW_RPT(*tdsql->getDefaultPool(), strlen ((SCHAR*) string->str_data)) dsql_fld;
 
4954
        strcpy (field->fld_name, (TEXT*) string->str_data);
 
4955
        field->fld_type_of_name = NULL;
 
4956
        field->fld_explicit_collation = false;
 
4957
        field->fld_not_nullable = false;
 
4958
        field->fld_full_domain = false;
 
4959
 
 
4960
        return field;
 
4961
}
 
4962
 
 
4963
 
 
4964
static dsql_fil* make_file()
 
4965
{
 
4966
/**************************************
 
4967
 *
 
4968
 *      m a k e _ f i l e 
 
4969
 *
 
4970
 **************************************
 
4971
 *
 
4972
 * Functional description
 
4973
 *      Make a file block
 
4974
 *
 
4975
 **************************************/
 
4976
        tsql* tdsql = DSQL_get_thread_data();
 
4977
                   
 
4978
        dsql_fil* temp_file = FB_NEW(*tdsql->getDefaultPool()) dsql_fil;
 
4979
 
 
4980
        return temp_file;
 
4981
}
 
4982
 
 
4983
 
 
4984
static dsql_nod* make_list (dsql_nod* node)
 
4985
{
 
4986
/**************************************
 
4987
 *
 
4988
 *      m a k e _ l i s t
 
4989
 *
 
4990
 **************************************
 
4991
 *
 
4992
 * Functional description
 
4993
 *      Collapse nested list nodes into single list.
 
4994
 *
 
4995
 **************************************/
 
4996
        tsql* tdsql = DSQL_get_thread_data();
 
4997
 
 
4998
        if (node)
 
4999
        {
 
5000
                DsqlNodStack stack;
 
5001
                stack_nodes(node, stack);
 
5002
                USHORT l = stack.getCount();
 
5003
 
 
5004
                const dsql_nod* old = node;
 
5005
                node = FB_NEW_RPT(*tdsql->getDefaultPool(), l) dsql_nod;
 
5006
                node->nod_count = l;
 
5007
                node->nod_type = nod_list;
 
5008
                node->nod_line = (USHORT) lex.lines_bk;
 
5009
                node->nod_column = (USHORT) (lex.last_token_bk - lex.line_start_bk + 1);
 
5010
                if (MemoryPool::blk_type(old) == dsql_type_nod)
 
5011
                {
 
5012
                        node->nod_flags = old->nod_flags;
 
5013
                }
 
5014
                dsql_nod** ptr = node->nod_arg + node->nod_count;
 
5015
 
 
5016
                while (stack.hasData())
 
5017
                        *--ptr = stack.pop();
 
5018
        }
 
5019
 
 
5020
        return node;
 
5021
}
 
5022
 
 
5023
 
 
5024
static dsql_nod* make_parameter (void)
 
5025
{
 
5026
/**************************************
 
5027
 *
 
5028
 *      m a k e _ p a r a m e t e r
 
5029
 *
 
5030
 **************************************
 
5031
 *
 
5032
 * Functional description
 
5033
 *      Make parameter node
 
5034
 *      Any change should also be made to function below
 
5035
 *
 
5036
 **************************************/
 
5037
        tsql* tdsql = DSQL_get_thread_data();
 
5038
 
 
5039
        dsql_nod* node = FB_NEW_RPT(*tdsql->getDefaultPool(), e_par_count) dsql_nod;
 
5040
        node->nod_type = nod_parameter;
 
5041
        node->nod_line = (USHORT) lex.lines_bk;
 
5042
        node->nod_column = (USHORT) (lex.last_token_bk - lex.line_start_bk + 1);
 
5043
        node->nod_count = e_par_count;
 
5044
        node->nod_arg[e_par_index] = (dsql_nod*)(IPTR) lex.param_number++;
 
5045
 
 
5046
        return node;
 
5047
}
 
5048
 
 
5049
 
 
5050
static dsql_nod* make_node (NOD_TYPE    type,
 
5051
                                                   int count,
 
5052
                                                   ...)
 
5053
{
 
5054
/**************************************
 
5055
 *
 
5056
 *      m a k e _ n o d e
 
5057
 *
 
5058
 **************************************
 
5059
 *
 
5060
 * Functional description
 
5061
 *      Make a node of given type.
 
5062
 *      Any change should also be made to function below
 
5063
 *
 
5064
 **************************************/
 
5065
        tsql* tdsql = DSQL_get_thread_data();
 
5066
 
 
5067
        dsql_nod* node = FB_NEW_RPT(*tdsql->getDefaultPool(), count) dsql_nod;
 
5068
        node->nod_type = type;
 
5069
        node->nod_line = (USHORT) lex.lines_bk;
 
5070
        node->nod_column = (USHORT) (lex.last_token_bk - lex.line_start_bk + 1);
 
5071
        node->nod_count = count;
 
5072
        dsql_nod** p = node->nod_arg;
 
5073
        va_list ptr;
 
5074
        va_start (ptr, count);
 
5075
 
 
5076
        while (--count >= 0)
 
5077
                *p++ = va_arg (ptr, dsql_nod*);
 
5078
 
 
5079
        va_end(ptr);
 
5080
        return node;
 
5081
}
 
5082
 
 
5083
 
 
5084
static dsql_nod* make_flag_node (NOD_TYPE       type,
 
5085
                                                                SSHORT  flag,
 
5086
                                                                int             count,
 
5087
                                                                ...)
 
5088
{
 
5089
/**************************************
 
5090
 *
 
5091
 *      m a k e _ f l a g _ n o d e
 
5092
 *
 
5093
 **************************************
 
5094
 *
 
5095
 * Functional description
 
5096
 *      Make a node of given type. Set flag field
 
5097
 *
 
5098
 **************************************/
 
5099
        tsql* tdsql = DSQL_get_thread_data();
 
5100
 
 
5101
        dsql_nod* node = FB_NEW_RPT(*tdsql->getDefaultPool(), count) dsql_nod;
 
5102
        node->nod_type = type;
 
5103
        node->nod_flags = flag;
 
5104
        node->nod_line = (USHORT) lex.lines_bk;
 
5105
        node->nod_column = (USHORT) (lex.last_token_bk - lex.line_start_bk + 1);
 
5106
        node->nod_count = count;
 
5107
        dsql_nod** p = node->nod_arg;
 
5108
        va_list ptr;
 
5109
        va_start (ptr, count);
 
5110
 
 
5111
        while (--count >= 0)
 
5112
                *p++ = va_arg (ptr, dsql_nod*);
 
5113
 
 
5114
        va_end(ptr);
 
5115
        return node;
 
5116
}
 
5117
 
 
5118
 
 
5119
static void prepare_console_debug (int level, int *yydeb)
 
5120
{
 
5121
/*************************************
 
5122
 *
 
5123
 *      p r e p a r e _ c o n s o l e _ d e b u g
 
5124
 * 
 
5125
 *************************************
 
5126
 *
 
5127
 * Functional description
 
5128
 *      Activate debug info. In WinNT, redirect the standard
 
5129
 *      output so one can see the generated information.
 
5130
 *      Feel free to add your platform specific code.
 
5131
 *
 
5132
 *************************************/
 
5133
#ifdef DSQL_DEBUG
 
5134
        DSQL_debug = level;
 
5135
#endif
 
5136
        if (level >> 8)
 
5137
                *yydeb = level >> 8;
 
5138
}
 
5139
 
 
5140
#ifdef NOT_USED_OR_REPLACED
 
5141
static bool short_int(dsql_nod* string,
 
5142
                                          SLONG *long_value,
 
5143
                                          SSHORT range)
 
5144
{
 
5145
/*************************************
 
5146
 *
 
5147
 *      s h o r t _ i n t
 
5148
 * 
 
5149
 *************************************
 
5150
 *
 
5151
 * Functional description
 
5152
 *      is the string a valid representation 
 
5153
 *      of a positive short int?
 
5154
 *
 
5155
 *************************************/
 
5156
 
 
5157
        if (((dsql_str*) string)->str_length > 5) {
 
5158
                return false;
 
5159
        }
 
5160
 
 
5161
        for (UCHAR* p = (UCHAR*)((dsql_str*) string)->str_data; 
 
5162
                classes(*p) & CHR_DIGIT; p++)
 
5163
        {
 
5164
                if (!(classes(*p) & CHR_DIGIT)) {
 
5165
                        return false;
 
5166
                }
 
5167
        }
 
5168
 
 
5169
        /* there are 5 or fewer digits, it's value may still be greater
 
5170
         * than 32767... */
 
5171
 
 
5172
        SCHAR buf[10];  
 
5173
        buf[0] = ((dsql_str*) string)->str_data[0];
 
5174
        buf[1] = ((dsql_str*) string)->str_data[1];
 
5175
        buf[2] = ((dsql_str*) string)->str_data[2];
 
5176
        buf[3] = ((dsql_str*) string)->str_data[3];
 
5177
        buf[4] = ((dsql_str*) string)->str_data[4];
 
5178
        buf[5] = '\0';
 
5179
 
 
5180
        *long_value = atoi (buf);
 
5181
 
 
5182
        bool return_value;
 
5183
 
 
5184
        switch (range) 
 
5185
        {
 
5186
                case POSITIVE:
 
5187
                        return_value = *long_value > SHRT_POS_MAX;
 
5188
                        break;
 
5189
                case NEGATIVE:
 
5190
                        return_value = *long_value > SHRT_NEG_MAX;
 
5191
                        break;
 
5192
                case UNSIGNED:
 
5193
                        return_value = *long_value > SHRT_UNSIGNED_MAX;
 
5194
                        break;
 
5195
        }
 
5196
        return !return_value;
 
5197
}
 
5198
#endif
 
5199
 
 
5200
static void stack_nodes (dsql_nod*      node,
 
5201
                                                 DsqlNodStack& stack)
 
5202
{
 
5203
/**************************************
 
5204
 *
 
5205
 *      s t a c k _ n o d e s
 
5206
 *
 
5207
 **************************************
 
5208
 *
 
5209
 * Functional description
 
5210
 *      Assist in turning a tree of misc nodes into a clean list.
 
5211
 *
 
5212
 **************************************/
 
5213
        if (node->nod_type != nod_list)
 
5214
        {
 
5215
                stack.push(node);
 
5216
                return;
 
5217
        }
 
5218
 
 
5219
        /* To take care of cases where long lists of nodes are in a chain
 
5220
           of list nodes with exactly one entry, this algorithm will look
 
5221
           for a pattern of repeated list nodes with two entries, the first
 
5222
           being a list node and the second being a non-list node.   Such
 
5223
           a list will be reverse linked, and then re-reversed, stacking the
 
5224
           non-list nodes in the process.   The purpose of this is to avoid
 
5225
           massive recursion of this function. */
 
5226
 
 
5227
        dsql_nod* start_chain = node;
 
5228
        dsql_nod* end_chain = NULL;
 
5229
        dsql_nod* curr_node = node;
 
5230
        dsql_nod* next_node = node->nod_arg[0];
 
5231
        while ( curr_node->nod_count == 2 &&
 
5232
                        curr_node->nod_arg[0]->nod_type == nod_list &&
 
5233
                        curr_node->nod_arg[1]->nod_type != nod_list &&
 
5234
                        next_node->nod_arg[0]->nod_type == nod_list &&
 
5235
                        next_node->nod_arg[1]->nod_type != nod_list)
 
5236
        {
 
5237
 
 
5238
                /* pattern was found so reverse the links and go to next node */
 
5239
 
 
5240
                dsql_nod* save_link = next_node->nod_arg[0];
 
5241
                next_node->nod_arg[0] = curr_node;
 
5242
                curr_node = next_node;
 
5243
                next_node = save_link;
 
5244
                end_chain = curr_node;
 
5245
        }
 
5246
 
 
5247
        /* see if any chain was found */
 
5248
 
 
5249
        if (end_chain)
 
5250
        {
 
5251
 
 
5252
                /* first, handle the rest of the nodes */
 
5253
                /* note that next_node still points to the first non-pattern node */
 
5254
 
 
5255
                stack_nodes (next_node, stack);
 
5256
 
 
5257
                /* stack the non-list nodes and reverse the chain on the way back */
 
5258
                
 
5259
                curr_node = end_chain;
 
5260
                while (true)
 
5261
                {
 
5262
                        stack.push(curr_node->nod_arg[1]);
 
5263
                        if ( curr_node == start_chain)
 
5264
                                break;
 
5265
                        dsql_nod* save_link = curr_node->nod_arg[0];
 
5266
                        curr_node->nod_arg[0] = next_node;
 
5267
                        next_node = curr_node;
 
5268
                        curr_node = save_link;
 
5269
                }
 
5270
                return;
 
5271
        }
 
5272
 
 
5273
        dsql_nod** ptr = node->nod_arg;
 
5274
        for (const dsql_nod* const* const end = ptr + node->nod_count; ptr < end; ptr++)
 
5275
                stack_nodes (*ptr, stack);
 
5276
}
 
5277
 
 
5278
inline static int yylex (
 
5279
        USHORT  client_dialect,
 
5280
        USHORT  db_dialect,
 
5281
        USHORT  parser_version,
 
5282
        bool* stmt_ambiguous)
 
5283
{
 
5284
        lex.prev_keyword =
 
5285
                lex.yylex(client_dialect, db_dialect, parser_version, stmt_ambiguous);
 
5286
        return lex.prev_keyword;
 
5287
}
 
5288
 
 
5289
int LexerState::yylex (
 
5290
        USHORT  client_dialect,
 
5291
        USHORT  db_dialect,
 
5292
        USHORT  parser_version,
 
5293
        bool* stmt_ambiguous)
 
5294
{
 
5295
/**************************************
 
5296
 *
 
5297
 *      y y l e x
 
5298
 *
 
5299
 **************************************
 
5300
 *
 
5301
 * Functional description: lexer.
 
5302
 *
 
5303
 **************************************/
 
5304
        UCHAR   tok_class;
 
5305
        char  string[MAX_TOKEN_LEN];
 
5306
        SSHORT  c;
 
5307
 
 
5308
        /* Find end of white space and skip comments */
 
5309
 
 
5310
        for (;;)
 
5311
        {
 
5312
                if (ptr >= end)
 
5313
                        return -1;
 
5314
 
 
5315
                c = *ptr++;
 
5316
 
 
5317
                /* Process comments */
 
5318
 
 
5319
                if (c == '\n') {
 
5320
                        lines++;
 
5321
                        line_start = ptr;
 
5322
                        continue;
 
5323
                }
 
5324
 
 
5325
                if ((c == '-') && (*ptr == '-'))
 
5326
                {
 
5327
                        
 
5328
                        /* single-line */
 
5329
                        
 
5330
                        ptr++;
 
5331
                        while (ptr < end) {
 
5332
                                if ((c = *ptr++) == '\n') {
 
5333
                                        lines++;
 
5334
                                        line_start = ptr /* + 1*/; /* CVC: +1 left out. */
 
5335
                                        break;
 
5336
                                }
 
5337
                        }
 
5338
                        if (ptr >= end)
 
5339
                                return -1;
 
5340
                        continue;
 
5341
                }
 
5342
                else if ((c == '/') && (*ptr == '*'))
 
5343
                {
 
5344
                        
 
5345
                        /* multi-line */
 
5346
                        
 
5347
                        const TEXT& start_block = ptr[-1];
 
5348
                        ptr++;
 
5349
                        while (ptr < end) {
 
5350
                                if ((c = *ptr++) == '*') {
 
5351
                                        if (*ptr == '/')
 
5352
                                                break;
 
5353
                                }
 
5354
                                if (c == '\n') {
 
5355
                                        lines++;
 
5356
                                        line_start = ptr /* + 1*/; /* CVC: +1 left out. */
 
5357
 
 
5358
                                }
 
5359
                        }
 
5360
                        if (ptr >= end)
 
5361
                        {
 
5362
                                // I need this to report the correct beginning of the block,
 
5363
                                // since it's not a token really.
 
5364
                                last_token = &start_block;
 
5365
                                yyerror("unterminated block comment");
 
5366
                                return -1;
 
5367
                        }
 
5368
                        ptr++;
 
5369
                        continue;
 
5370
                }
 
5371
 
 
5372
                tok_class = classes(c);
 
5373
 
 
5374
                if (!(tok_class & CHR_WHITE))
 
5375
                        break;
 
5376
        }
 
5377
 
 
5378
        /* Depending on tok_class of token, parse token */
 
5379
 
 
5380
        last_token = ptr - 1;
 
5381
 
 
5382
        if (tok_class & CHR_INTRODUCER)
 
5383
        {
 
5384
                /* The Introducer (_) is skipped, all other idents are copied
 
5385
                 * to become the name of the character set
 
5386
                 */
 
5387
                char* p = string;
 
5388
                for (; ptr < end && classes(*ptr) & CHR_IDENT; ptr++)
 
5389
                {
 
5390
                        if (ptr >= end)
 
5391
                                return -1;
 
5392
                        check_copy_incr(p, UPPER7(*ptr), string);
 
5393
                }
 
5394
                
 
5395
                check_bound(p, string);
 
5396
                *p = 0;
 
5397
 
 
5398
                /* make a string value to hold the name, the name 
 
5399
                 * is resolved in pass1_constant */
 
5400
 
 
5401
                yylval = (dsql_nod*) (MAKE_string(string, p - string))->str_data;
 
5402
 
 
5403
                return INTRODUCER;
 
5404
        }
 
5405
 
 
5406
        /* parse a quoted string, being sure to look for double quotes */
 
5407
 
 
5408
        if (tok_class & CHR_QUOTE)
 
5409
        {
 
5410
                char* buffer = string;
 
5411
                size_t buffer_len = sizeof (string);
 
5412
                const char* buffer_end = buffer + buffer_len - 1;
 
5413
                char* p;
 
5414
                for (p = buffer; ; ++p)
 
5415
                {
 
5416
                        if (ptr >= end)
 
5417
                        {
 
5418
                                if (buffer != string)
 
5419
                                        gds__free (buffer);
 
5420
                                yyerror("unterminated string");
 
5421
                                return -1;
 
5422
                        }
 
5423
                        // Care about multi-line constants and identifiers
 
5424
                        if (*ptr == '\n') {
 
5425
                                lines++;
 
5426
                                line_start = ptr + 1;
 
5427
                        }
 
5428
                        /* *ptr is quote - if next != quote we're at the end */
 
5429
                        if ((*ptr == c) && ((++ptr == end) || (*ptr != c)))
 
5430
                                break;
 
5431
                        if (p > buffer_end)
 
5432
                        {
 
5433
                                char* const new_buffer = (char*) gds__alloc (2 * buffer_len);
 
5434
                        /* FREE: at outer block */
 
5435
                                if (!new_buffer)                /* NOMEM: */
 
5436
                                {
 
5437
                                        if (buffer != string)
 
5438
                                                gds__free (buffer);
 
5439
                                        return -1;
 
5440
                                }
 
5441
                                memcpy (new_buffer, buffer, buffer_len);
 
5442
                                if (buffer != string)
 
5443
                                        gds__free (buffer);
 
5444
                                buffer = new_buffer;
 
5445
                                p = buffer + buffer_len;
 
5446
                                buffer_len = 2 * buffer_len;
 
5447
                                buffer_end = buffer + buffer_len - 1;
 
5448
                        }
 
5449
                        *p = *ptr++;
 
5450
                }
 
5451
                if (c == '"')
 
5452
                {
 
5453
                        *stmt_ambiguous = true; /* string delimited by double quotes could be
 
5454
                                        **   either a string constant or a SQL delimited
 
5455
                                        **   identifier, therefore marks the SQL
 
5456
                                        **   statement as ambiguous  */
 
5457
                        if (client_dialect == SQL_DIALECT_V6_TRANSITION)
 
5458
                        {
 
5459
                                if (buffer != string)
 
5460
                                        gds__free (buffer);
 
5461
                                yyabandon (-104, isc_invalid_string_constant);
 
5462
                        }
 
5463
                        else if (client_dialect >= SQL_DIALECT_V6)
 
5464
                        {
 
5465
                                if ((p - buffer) >= MAX_TOKEN_LEN)
 
5466
                                {
 
5467
                                        if (buffer != string)
 
5468
                                                gds__free (buffer);
 
5469
                                        yyabandon (-104, isc_token_too_long);
 
5470
                                }
 
5471
                                yylval = (dsql_nod*) MAKE_string(buffer, p - buffer);
 
5472
                                dsql_str* delimited_id_str = (dsql_str*) yylval;
 
5473
                                delimited_id_str->str_flags |= STR_delimited_id;
 
5474
                                if (buffer != string)
 
5475
                                        gds__free (buffer);
 
5476
                                return SYMBOL;
 
5477
                        }
 
5478
                }
 
5479
                yylval = (dsql_nod*) MAKE_string(buffer, p - buffer);
 
5480
                if (buffer != string)
 
5481
                        gds__free (buffer);
 
5482
                return STRING;
 
5483
        }
 
5484
                                                                                                 
 
5485
/* 
 
5486
 * Check for a numeric constant, which starts either with a digit or with
 
5487
 * a decimal point followed by a digit.
 
5488
 * 
 
5489
 * This code recognizes the following token types:
 
5490
 * 
 
5491
 * NUMBER: string of digits which fits into a 32-bit integer
 
5492
 * 
 
5493
 * NUMBER64BIT: string of digits whose value might fit into an SINT64,
 
5494
 *   depending on whether or not there is a preceding '-', which is to
 
5495
 *   say that "9223372036854775808" is accepted here.
 
5496
 *
 
5497
 * SCALEDINT: string of digits and a single '.', where the digits
 
5498
 *   represent a value which might fit into an SINT64, depending on
 
5499
 *   whether or not there is a preceding '-'.
 
5500
 *
 
5501
 * FLOAT: string of digits with an optional '.', and followed by an "e"
 
5502
 *   or "E" and an optionally-signed exponent.
 
5503
 *
 
5504
 * NOTE: we swallow leading or trailing blanks, but we do NOT accept
 
5505
 *   embedded blanks:
 
5506
 *
 
5507
 * Another note: c is the first character which need to be considered,
 
5508
 *   ptr points to the next character.
 
5509
 */
 
5510
 
 
5511
        fb_assert(ptr <= end);
 
5512
 
 
5513
        if ((tok_class & CHR_DIGIT) ||
 
5514
                ((c == '.') && (ptr < end) && (classes(*ptr) & CHR_DIGIT)))
 
5515
        {
 
5516
                /* The following variables are used to recognize kinds of numbers. */
 
5517
 
 
5518
                bool have_error  = false;       /* syntax error or value too large */
 
5519
                bool have_digit  = false;       /* we've seen a digit                     */
 
5520
                bool have_decimal   = false;    /* we've seen a '.'                             */
 
5521
                bool have_exp      = false;     /* digit ... [eE]                                 */
 
5522
                bool have_exp_sign  = false; /* digit ... [eE] {+-]                      */
 
5523
                bool have_exp_digit = false; /* digit ... [eE] ... digit                */
 
5524
                FB_UINT64 number                = 0;
 
5525
                FB_UINT64 limit_by_10   = MAX_SINT64 / 10;
 
5526
 
 
5527
                for (--ptr ; ptr < end ; ptr++)
 
5528
                {
 
5529
                        c = *ptr;
 
5530
                        if (have_exp_digit && (! (classes(c) & CHR_DIGIT)))
 
5531
                                /* First non-digit after exponent and digit terminates
 
5532
                                 the token. */
 
5533
                                break;
 
5534
                        else if (have_exp_sign && (! (classes(c) & CHR_DIGIT)))
 
5535
                        {
 
5536
                                /* only digits can be accepted after "1E-" */
 
5537
                                have_error = true;
 
5538
                                break;
 
5539
                        }
 
5540
                        else if (have_exp)
 
5541
                        {
 
5542
                                /* We've seen e or E, but nothing beyond that. */
 
5543
                                if ( ('-' == c) || ('+' == c) )
 
5544
                                        have_exp_sign = true;
 
5545
                                else if ( classes(c) & CHR_DIGIT )
 
5546
                                        /* We have a digit: we haven't seen a sign yet,
 
5547
                                        but it's too late now. */
 
5548
                                        have_exp_digit = have_exp_sign  = true;
 
5549
                                else
 
5550
                                {
 
5551
                                        /* end of the token */
 
5552
                                        have_error = true;
 
5553
                                        break;
 
5554
                                }
 
5555
                        }
 
5556
                        else if ('.' == c)
 
5557
                        {
 
5558
                                if (!have_decimal)
 
5559
                                        have_decimal = true;
 
5560
                                else
 
5561
                                {
 
5562
                                        have_error = true;
 
5563
                                        break;
 
5564
                                }
 
5565
                        }
 
5566
                        else if (classes(c) & CHR_DIGIT)
 
5567
                        {
 
5568
                                /* Before computing the next value, make sure there will be
 
5569
                                   no overflow.  */
 
5570
 
 
5571
                                have_digit = true;
 
5572
 
 
5573
                                if (number >= limit_by_10)
 
5574
                                {
 
5575
                                /* possibility of an overflow */
 
5576
                                        if ((number > limit_by_10) || (c > '8'))
 
5577
                                        {
 
5578
                                                have_error = true;
 
5579
                                                break;
 
5580
                                        }
 
5581
                                }
 
5582
                                number = number * 10 + (c - '0');
 
5583
                        }
 
5584
                        else if ( (('E' == c) || ('e' == c)) && have_digit )
 
5585
                                have_exp = true;
 
5586
                        else
 
5587
                                /* Unexpected character: this is the end of the number. */
 
5588
                                break;
 
5589
                }
 
5590
 
 
5591
                /* We're done scanning the characters: now return the right kind
 
5592
                   of number token, if any fits the bill. */
 
5593
 
 
5594
                if (!have_error)
 
5595
                {
 
5596
                        fb_assert(have_digit);
 
5597
 
 
5598
                        if (have_exp_digit)
 
5599
                        {
 
5600
                                yylval = (dsql_nod*) MAKE_string(last_token, ptr - last_token);
 
5601
                                last_token_bk = last_token;
 
5602
                                line_start_bk = line_start;
 
5603
                                lines_bk = lines;
 
5604
 
 
5605
                                return FLOAT_NUMBER;
 
5606
                        }
 
5607
                        else if (!have_exp)
 
5608
                        {
 
5609
 
 
5610
                                /* We should return some kind (scaled-) integer type
 
5611
                                   except perhaps in dialect 1. */
 
5612
 
 
5613
                                if (!have_decimal && (number <= MAX_SLONG))
 
5614
                                {
 
5615
                                        yylval = (dsql_nod*) (IPTR) number;
 
5616
                                        //printf ("parse.y %p %d\n", yylval, number);
 
5617
                                        return NUMBER;
 
5618
                                }
 
5619
                                else
 
5620
                                {
 
5621
                                        /* We have either a decimal point with no exponent
 
5622
                                           or a string of digits whose value exceeds MAX_SLONG:
 
5623
                                           the returned type depends on the client dialect,
 
5624
                                           so warn of the difference if the client dialect is
 
5625
                                           SQL_DIALECT_V6_TRANSITION.
 
5626
                                        */
 
5627
 
 
5628
                                        if (SQL_DIALECT_V6_TRANSITION == client_dialect)
 
5629
                                        {
 
5630
                                                /* Issue a warning about the ambiguity of the numeric
 
5631
                                                 * numeric literal.  There are multiple calls because
 
5632
                                                 * the message text exceeds the 119-character limit
 
5633
                                                 * of our message database.
 
5634
                                                 */
 
5635
                                                ERRD_post_warning( isc_dsql_warning_number_ambiguous,
 
5636
                                                           isc_arg_string,
 
5637
                                                           ERR_string( last_token, ptr - last_token ),
 
5638
                                                           isc_arg_end );
 
5639
                                                ERRD_post_warning( isc_dsql_warning_number_ambiguous1,
 
5640
                                                           isc_arg_end );
 
5641
                                        }
 
5642
 
 
5643
                                        yylval = (dsql_nod*) MAKE_string(last_token, ptr - last_token);
 
5644
 
 
5645
                                        last_token_bk = last_token;
 
5646
                                        line_start_bk = line_start;
 
5647
                                        lines_bk = lines;
 
5648
 
 
5649
                                        if (client_dialect < SQL_DIALECT_V6_TRANSITION)
 
5650
                                                return FLOAT_NUMBER;
 
5651
                                        else if (have_decimal)
 
5652
                                                return SCALEDINT;
 
5653
                                        else
 
5654
                                                return NUMBER64BIT;
 
5655
                                }
 
5656
                        } /* else if (!have_exp) */
 
5657
                } /* if (!have_error) */
 
5658
 
 
5659
                /* we got some kind of error or overflow, so don't recognize this
 
5660
                 * as a number: just pass it through to the next part of the lexer.
 
5661
                 */
 
5662
        }
 
5663
 
 
5664
        /* Restore the status quo ante, before we started our unsuccessful
 
5665
           attempt to recognize a number. */
 
5666
        ptr = last_token;
 
5667
        c   = *ptr++;
 
5668
        /* We never touched tok_class, so it doesn't need to be restored. */
 
5669
 
 
5670
        /* end of number-recognition code */
 
5671
 
 
5672
 
 
5673
        if (tok_class & CHR_LETTER)
 
5674
        {
 
5675
                char* p = string;
 
5676
                check_copy_incr(p, UPPER (c), string);
 
5677
                for (; ptr < end && classes(*ptr) & CHR_IDENT; ptr++)
 
5678
                {
 
5679
                        if (ptr >= end)
 
5680
                                return -1;
 
5681
                        check_copy_incr(p, UPPER (*ptr), string);
 
5682
                }
 
5683
 
 
5684
                check_bound(p, string);
 
5685
                *p = 0;
 
5686
                dsql_sym* sym =
 
5687
                        HSHD_lookup (NULL, (TEXT *) string, (SSHORT)(p - string), SYM_keyword, parser_version);
 
5688
                if (sym && (sym->sym_keyword != COMMENT || prev_keyword == -1))
 
5689
                {
 
5690
                        yylval = (dsql_nod*) sym->sym_object;
 
5691
                        last_token_bk = last_token;
 
5692
                        line_start_bk = line_start;
 
5693
                        lines_bk = lines;
 
5694
                        return sym->sym_keyword;
 
5695
                }
 
5696
                yylval = (dsql_nod*) MAKE_string(string, p - string);
 
5697
                last_token_bk = last_token;
 
5698
                line_start_bk = line_start;
 
5699
                lines_bk = lines;
 
5700
                return SYMBOL;
 
5701
        }
 
5702
 
 
5703
        /* Must be punctuation -- test for double character punctuation */
 
5704
 
 
5705
        if (last_token + 1 < end)
 
5706
        {
 
5707
                dsql_sym* sym =
 
5708
                        HSHD_lookup (NULL, last_token, (SSHORT) 2, SYM_keyword, (USHORT) parser_version);
 
5709
                if (sym)
 
5710
                {
 
5711
                        ++ptr;
 
5712
                        return sym->sym_keyword;
 
5713
                }
 
5714
        }
 
5715
                
 
5716
        /* Single character punctuation are simply passed on */
 
5717
 
 
5718
        return (UCHAR) c;
 
5719
}
 
5720
 
 
5721
 
 
5722
static void yyerror_detailed(const TEXT* error_string, int yychar, YYSTYPE&, YYPOSN&)
 
5723
{
 
5724
/**************************************
 
5725
 *
 
5726
 *      y y e r r o r _ d e t a i l e d
 
5727
 *
 
5728
 **************************************
 
5729
 *
 
5730
 * Functional description
 
5731
 *      Print a syntax error.
 
5732
 *
 
5733
 **************************************/
 
5734
        const TEXT* line_start = lex.line_start;
 
5735
        SLONG lines = lex.lines;
 
5736
        if (lex.last_token < lex.line_start)
 
5737
        {
 
5738
                line_start = lex.line_start_bk;
 
5739
                lines--;
 
5740
        }
 
5741
 
 
5742
        if (yychar < 1)
 
5743
                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104,
 
5744
                        isc_arg_gds, isc_command_end_err2,      /* Unexpected end of command */
 
5745
                        isc_arg_number, lines,
 
5746
                        isc_arg_number, (SLONG) (lex.last_token - line_start + 1),
 
5747
                        0);
 
5748
        else
 
5749
        {
 
5750
                ERRD_post (isc_sqlerr, isc_arg_number, (SLONG) -104,
 
5751
                        /* Token unknown - line %d, column %d */
 
5752
                        isc_arg_gds, isc_dsql_token_unk_err,
 
5753
                        isc_arg_number, (SLONG) lines,
 
5754
                        isc_arg_number, (SLONG) (lex.last_token - line_start + 1), /*CVC: +1*/
 
5755
                        /* Show the token */
 
5756
                        isc_arg_gds, isc_random,
 
5757
                        isc_arg_cstring, (int) (lex.ptr - lex.last_token), lex.last_token,
 
5758
                        0);
 
5759
        }
 
5760
}
 
5761
 
 
5762
 
 
5763
// The argument passed to this function is ignored. Therefore, messages like
 
5764
// "syntax error" and "yacc stack overflow" are never seen.
 
5765
static void yyerror(const TEXT* error_string)
 
5766
{
 
5767
        YYSTYPE errt_value =  0;
 
5768
        YYPOSN errt_posn = -1;
 
5769
        yyerror_detailed(error_string, -1, errt_value, errt_posn);
 
5770
}
 
5771
 
 
5772
 
 
5773
static void yyabandon (SLONG            sql_code,
 
5774
                                           ISC_STATUS   error_symbol)
 
5775
{
 
5776
/**************************************
 
5777
 *
 
5778
 *      y y a b a n d o n
 
5779
 *
 
5780
 **************************************
 
5781
 *
 
5782
 * Functional description
 
5783
 *      Abandon the parsing outputting the supplied string
 
5784
 *
 
5785
 **************************************/
 
5786
 
 
5787
        ERRD_post (isc_sqlerr, isc_arg_number, sql_code,
 
5788
                isc_arg_gds, error_symbol, 0);
 
5789
}