diff options
Diffstat (limited to 'src/backend/parser/gram.y')
-rw-r--r-- | src/backend/parser/gram.y | 72 |
1 files changed, 50 insertions, 22 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index ab69eb4794f..c4d98d203ec 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.155 2000/03/12 20:09:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.156 2000/03/14 23:06:31 thomas Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -307,7 +307,7 @@ static void doNegateFloat(Value *v); ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL, MATCH, MINUTE_P, MONTH_P, NAMES, NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC, - OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, + OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, OVERLAPS, PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC, READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK, SCROLL, SECOND_P, SELECT, SESSION_USER, SET, SUBSTRING, @@ -363,6 +363,7 @@ static void doNegateFloat(Value *v); %right '=' %nonassoc '<' '>' %nonassoc LIKE +%nonassoc OVERLAPS %nonassoc BETWEEN %nonassoc IN %left Op /* multi-character ops and user-defined operators */ @@ -1903,7 +1904,7 @@ comment_text: Sconst { $$ = $1; } * *****************************************************************************/ -FetchStmt: FETCH direction fetch_how_many from_in name +FetchStmt: FETCH direction fetch_how_many from_in name { FetchStmt *n = makeNode(FetchStmt); if ($2 == RELATIVE) @@ -1923,7 +1924,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = false; $$ = (Node *)n; } - | FETCH fetch_how_many from_in name + | FETCH fetch_how_many from_in name { FetchStmt *n = makeNode(FetchStmt); if ($2 < 0) @@ -1940,7 +1941,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = false; $$ = (Node *)n; } - | FETCH direction from_in name + | FETCH direction from_in name { FetchStmt *n = makeNode(FetchStmt); if ($2 == RELATIVE) @@ -1953,7 +1954,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = false; $$ = (Node *)n; } - | FETCH from_in name + | FETCH from_in name { FetchStmt *n = makeNode(FetchStmt); n->direction = FORWARD; @@ -1962,7 +1963,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = false; $$ = (Node *)n; } - | FETCH name + | FETCH name { FetchStmt *n = makeNode(FetchStmt); n->direction = FORWARD; @@ -1972,7 +1973,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name $$ = (Node *)n; } - | MOVE direction fetch_how_many from_in name + | MOVE direction fetch_how_many from_in name { FetchStmt *n = makeNode(FetchStmt); if ($3 < 0) @@ -1986,7 +1987,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = TRUE; $$ = (Node *)n; } - | MOVE fetch_how_many from_in name + | MOVE fetch_how_many from_in name { FetchStmt *n = makeNode(FetchStmt); if ($2 < 0) @@ -2003,7 +2004,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = TRUE; $$ = (Node *)n; } - | MOVE direction from_in name + | MOVE direction from_in name { FetchStmt *n = makeNode(FetchStmt); n->direction = $2; @@ -2021,7 +2022,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name n->ismove = TRUE; $$ = (Node *)n; } - | MOVE name + | MOVE name { FetchStmt *n = makeNode(FetchStmt); n->direction = FORWARD; @@ -2659,11 +2660,12 @@ opt_trans: WORK { $$ = TRUE; } * *****************************************************************************/ -ViewStmt: CREATE VIEW name AS SelectStmt +ViewStmt: CREATE VIEW name opt_column_list AS SelectStmt { ViewStmt *n = makeNode(ViewStmt); n->viewname = $3; - n->query = (Query *)$5; + n->aliases = $4; + n->query = (Query *)$6; if (((SelectStmt *)n->query)->sortClause != NULL) elog(ERROR,"ORDER BY and DISTINCT on views are not implemented"); if (((SelectStmt *)n->query)->unionClause != NULL) @@ -2737,7 +2739,7 @@ createdb_opt_encoding: int i; i = pg_char_to_encoding($3); if (i == -1) - elog(ERROR, "%s is not a valid encoding name.", $3); + elog(ERROR, "%s is not a valid encoding name", $3); $$ = i; #else elog(ERROR, "Multi-byte support is not enabled"); @@ -2747,7 +2749,7 @@ createdb_opt_encoding: { #ifdef MULTIBYTE if (!pg_get_encent_by_encoding($3)) - elog(ERROR, "%d is not a valid encoding code.", $3); + elog(ERROR, "%d is not a valid encoding code", $3); $$ = $3; #else elog(ERROR, "Multi-byte support is not enabled"); @@ -3979,10 +3981,13 @@ Datetime: datetime $$->timezone = $2; $$->typmod = -1; } - | TIME + | TIME opt_timezone { $$ = makeNode(TypeName); - $$->name = xlateSqlType("time"); + if ($2) + $$->name = xlateSqlType("timetz"); + else + $$->name = xlateSqlType("time"); $$->typmod = -1; } | INTERVAL opt_interval @@ -4077,6 +4082,27 @@ row_expr: '(' row_descriptor ')' IN '(' SubSelect ')' { $$ = makeRowExpr($4, $2, $6); } + | '(' row_descriptor ')' OVERLAPS '(' row_descriptor ')' + { + FuncCall *n = makeNode(FuncCall); + List *largs = $2; + List *rargs = $6; + n->funcname = xlateSqlFunc("overlaps"); + if (length(largs) == 1) + largs = lappend(largs, $2); + else if (length(largs) != 2) + elog(ERROR, "Wrong number of parameters" + " on left side of OVERLAPS expression"); + if (length(rargs) == 1) + rargs = lappend(rargs, $6); + else if (length(rargs) != 2) + elog(ERROR, "Wrong number of parameters" + " on right side of OVERLAPS expression"); + n->args = nconc(largs, rargs); + n->agg_star = false; + n->agg_distinct = false; + $$ = (Node *)n; + } ; row_descriptor: row_list ',' a_expr @@ -4579,7 +4605,8 @@ c_expr: attr n->agg_distinct = false; if ($3 != 0) - elog(NOTICE,"CURRENT_TIME(%d) precision not implemented; zero used instead",$3); + elog(NOTICE,"CURRENT_TIME(%d) precision not implemented" + "; zero used instead",$3); $$ = (Node *)n; } @@ -4632,7 +4659,8 @@ c_expr: attr n->agg_distinct = false; if ($3 != 0) - elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented; zero used instead",$3); + elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented" + "; zero used instead",$3); $$ = (Node *)n; } @@ -5219,6 +5247,7 @@ ColId: IDENT { $$ = $1; } | ONLY { $$ = "only"; } | OPERATOR { $$ = "operator"; } | OPTION { $$ = "option"; } + | OVERLAPS { $$ = "overlaps"; } | PASSWORD { $$ = "password"; } | PENDANT { $$ = "pendant"; } | PRIOR { $$ = "prior"; } @@ -5454,9 +5483,8 @@ mapTargetColumns(List *src, List *dst) static char * xlateSqlFunc(char *name) { - if (!strcasecmp(name,"character_length") - || !strcasecmp(name,"char_length")) - return "length"; + if (!strcasecmp(name,"character_length")) + return "char_length"; else return name; } /* xlateSqlFunc() */ |