11
11
*
12
12
*
13
13
* IDENTIFICATION
14
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.544 2006/04/30 18:30:39 tgl Exp $
14
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.545 2006/05/27 17:38:45 tgl Exp $
15
15
*
16
16
* HISTORY
17
17
* AUTHOR DATE MAJOR EVENT
70
70
(Current) = (Rhs)[0 ]; \
71
71
} while (0 )
72
72
73
+ /*
74
+ * The %name-prefix option below will make bison call base_yylex, but we
75
+ * really want it to call filtered_base_yylex (see parser.c).
76
+ */
77
+ #define base_yylex filtered_base_yylex
78
+
73
79
extern List *parsetree; /* final parse result is delivered here */
74
80
75
81
static bool QueryIsRule = FALSE ;
@@ -339,6 +345,7 @@ static void doNegateFloat(Value *v);
339
345
%type <list> constraints_set_list
340
346
%type <boolean> constraints_set_mode
341
347
%type <str> OptTableSpace OptConsTableSpace OptTableSpaceOwner
348
+ %type <list> opt_check_option
342
349
343
350
344
351
/*
@@ -356,7 +363,7 @@ static void doNegateFloat(Value *v);
356
363
BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
357
364
BOOLEAN_P BOTH BY
358
365
359
- CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
366
+ CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P
360
367
CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
361
368
CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
362
369
COMMITTED CONNECTION CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB
@@ -431,6 +438,12 @@ static void doNegateFloat(Value *v);
431
438
432
439
ZONE
433
440
441
+ /* The grammar thinks these are keywords, but they are not in the keywords.c
442
+ * list and so can never be entered directly. The filter in parser.c
443
+ * creates these tokens when required.
444
+ */
445
+ %token WITH_CASCADED WITH_LOCAL WITH_CHECK
446
+
434
447
/* Special token types, not actually keywords - see the "lex" file */
435
448
%token <str> IDENT FCONST SCONST BCONST XCONST Op
436
449
%token <ival> ICONST PARAM
@@ -4618,12 +4631,13 @@ transaction_mode_list_or_empty:
4618
4631
/* ****************************************************************************
4619
4632
*
4620
4633
* QUERY:
4621
- * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')' AS <query>
4634
+ * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
4635
+ * AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
4622
4636
*
4623
4637
*****************************************************************************/
4624
4638
4625
4639
ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list
4626
- AS SelectStmt
4640
+ AS SelectStmt opt_check_option
4627
4641
{
4628
4642
ViewStmt *n = makeNode(ViewStmt);
4629
4643
n->replace = false ;
@@ -4634,7 +4648,7 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list
4634
4648
$$ = (Node *) n;
4635
4649
}
4636
4650
| CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list
4637
- AS SelectStmt
4651
+ AS SelectStmt opt_check_option
4638
4652
{
4639
4653
ViewStmt *n = makeNode(ViewStmt);
4640
4654
n->replace = true ;
@@ -4646,6 +4660,32 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list
4646
4660
}
4647
4661
;
4648
4662
4663
+ /*
4664
+ * We use merged tokens here to avoid creating shift/reduce conflicts against
4665
+ * a whole lot of other uses of WITH.
4666
+ */
4667
+ opt_check_option:
4668
+ WITH_CHECK OPTION
4669
+ {
4670
+ ereport (ERROR,
4671
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4672
+ errmsg(" WITH CHECK OPTION is not implemented" )));
4673
+ }
4674
+ | WITH_CASCADED CHECK OPTION
4675
+ {
4676
+ ereport (ERROR,
4677
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4678
+ errmsg(" WITH CHECK OPTION is not implemented" )));
4679
+ }
4680
+ | WITH_LOCAL CHECK OPTION
4681
+ {
4682
+ ereport (ERROR,
4683
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4684
+ errmsg(" WITH CHECK OPTION is not implemented" )));
4685
+ }
4686
+ | /* EMPTY */ { $$ = NIL; }
4687
+ ;
4688
+
4649
4689
/* ****************************************************************************
4650
4690
*
4651
4691
* QUERY:
@@ -8319,6 +8359,7 @@ unreserved_keyword:
8319
8359
| CACHE
8320
8360
| CALLED
8321
8361
| CASCADE
8362
+ | CASCADED
8322
8363
| CHAIN
8323
8364
| CHARACTERISTICS
8324
8365
| CHECKPOINT
@@ -9139,4 +9180,10 @@ doNegateFloat(Value *v)
9139
9180
}
9140
9181
}
9141
9182
9183
+ /*
9184
+ * Must undefine base_yylex before including scan.c, since we want it
9185
+ * to create the function base_yylex not filtered_base_yylex.
9186
+ */
9187
+ #undef base_yylex
9188
+
9142
9189
#include "scan.c"
0 commit comments