diff options
Diffstat (limited to 'src/backend/parser/gram.y')
| -rw-r--r-- | src/backend/parser/gram.y | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 69e7a20142..d84f4034ab 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.544 2006/04/30 18:30:39 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.545 2006/05/27 17:38:45 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -70,6 +70,12 @@ (Current) = (Rhs)[0]; \ } while (0) +/* + * The %name-prefix option below will make bison call base_yylex, but we + * really want it to call filtered_base_yylex (see parser.c). + */ +#define base_yylex filtered_base_yylex + extern List *parsetree; /* final parse result is delivered here */ static bool QueryIsRule = FALSE; @@ -339,6 +345,7 @@ static void doNegateFloat(Value *v); %type <list> constraints_set_list %type <boolean> constraints_set_mode %type <str> OptTableSpace OptConsTableSpace OptTableSpaceOwner +%type <list> opt_check_option /* @@ -356,7 +363,7 @@ static void doNegateFloat(Value *v); BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT BOOLEAN_P BOTH BY - CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P + CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT COMMITTED CONNECTION CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB @@ -431,6 +438,12 @@ static void doNegateFloat(Value *v); ZONE +/* The grammar thinks these are keywords, but they are not in the keywords.c + * list and so can never be entered directly. The filter in parser.c + * creates these tokens when required. + */ +%token WITH_CASCADED WITH_LOCAL WITH_CHECK + /* Special token types, not actually keywords - see the "lex" file */ %token <str> IDENT FCONST SCONST BCONST XCONST Op %token <ival> ICONST PARAM @@ -4618,12 +4631,13 @@ transaction_mode_list_or_empty: /***************************************************************************** * * QUERY: - * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')' AS <query> + * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')' + * AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] * *****************************************************************************/ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list - AS SelectStmt + AS SelectStmt opt_check_option { ViewStmt *n = makeNode(ViewStmt); n->replace = false; @@ -4634,7 +4648,7 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list $$ = (Node *) n; } | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list - AS SelectStmt + AS SelectStmt opt_check_option { ViewStmt *n = makeNode(ViewStmt); n->replace = true; @@ -4646,6 +4660,32 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list } ; +/* + * We use merged tokens here to avoid creating shift/reduce conflicts against + * a whole lot of other uses of WITH. + */ +opt_check_option: + WITH_CHECK OPTION + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("WITH CHECK OPTION is not implemented"))); + } + | WITH_CASCADED CHECK OPTION + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("WITH CHECK OPTION is not implemented"))); + } + | WITH_LOCAL CHECK OPTION + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("WITH CHECK OPTION is not implemented"))); + } + | /* EMPTY */ { $$ = NIL; } + ; + /***************************************************************************** * * QUERY: @@ -8319,6 +8359,7 @@ unreserved_keyword: | CACHE | CALLED | CASCADE + | CASCADED | CHAIN | CHARACTERISTICS | CHECKPOINT @@ -9139,4 +9180,10 @@ doNegateFloat(Value *v) } } +/* + * Must undefine base_yylex before including scan.c, since we want it + * to create the function base_yylex not filtered_base_yylex. + */ +#undef base_yylex + #include "scan.c" |
