summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y117
-rw-r--r--src/backend/parser/keywords.c3
2 files changed, 75 insertions, 45 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 1ab63847aff..e4f59bc605d 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.166 2000/03/31 02:11:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.167 2000/04/07 13:39:34 thomas Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -222,7 +222,9 @@ static void doNegateFloat(Value *v);
%type <list> OptSeqList
%type <defelt> OptSeqElem
+/*
%type <dstmt> def_rest
+*/
%type <astmt> insert_rest
%type <node> OptTableElement, ConstraintElem
@@ -249,7 +251,7 @@ static void doNegateFloat(Value *v);
%type <typnam> Typename, opt_type, SimpleTypename,
Generic, Numeric, Character, Datetime, Bit
-%type <str> generic, character, datetime, bit
+%type <str> typename, generic, numeric, character, datetime, bit
%type <str> extract_arg
%type <str> opt_charset, opt_collate
%type <str> opt_float
@@ -259,7 +261,7 @@ static void doNegateFloat(Value *v);
%type <ival> Iconst
%type <str> Sconst, comment_text
%type <str> UserId, var_value, zone_value
-%type <str> ColId, ColLabel
+%type <str> ColId, ColLabel, TokenId
%type <node> TableConstraint
%type <list> ColQualList
@@ -309,7 +311,7 @@ static void doNegateFloat(Value *v);
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,
+ SCROLL, SECOND_P, SELECT, SESSION_USER, SET, SOME, SUBSTRING,
TABLE, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR,
TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
UNION, UNIQUE, UPDATE, USER, USING,
@@ -765,6 +767,11 @@ var_value: Sconst
*(result+strlen(result)-1) = '\0';
$$ = result;
}
+ /* "OFF" is not a token, so it is handled by the name_list production */
+ | ON
+ {
+ $$ = "on";
+ }
| DEFAULT
{
$$ = NULL;
@@ -1738,13 +1745,17 @@ DropTrigStmt: DROP TRIGGER name ON relation_name
*
*****************************************************************************/
-DefineStmt: CREATE def_type def_rest
+DefineStmt: CREATE def_type def_name definition
{
- $3->defType = $2;
- $$ = (Node *)$3;
+ DefineStmt *n = makeNode(DefineStmt);
+ n->defType = $2;
+ n->defname = $3;
+ n->definition = $4;
+ $$ = (Node *)n;
}
;
+/*
def_rest: def_name definition
{
$$ = makeNode(DefineStmt);
@@ -1752,6 +1763,7 @@ def_rest: def_name definition
$$->definition = $2;
}
;
+*/
def_type: OPERATOR { $$ = OPERATOR; }
| TYPE_P { $$ = TYPE_P; }
@@ -1760,8 +1772,12 @@ def_type: OPERATOR { $$ = OPERATOR; }
def_name: PROCEDURE { $$ = "procedure"; }
| JOIN { $$ = "join"; }
- | ColId { $$ = $1; }
| all_Op { $$ = $1; }
+ | typename { $$ = $1; }
+ | TokenId { $$ = $1; }
+ | INTERVAL { $$ = "interval"; }
+ | TIME { $$ = "time"; }
+ | TIMESTAMP { $$ = "timestamp"; }
;
definition: '(' def_list ')' { $$ = $2; }
@@ -1791,19 +1807,11 @@ def_elem: def_name '=' def_arg
}
;
-def_arg: ColId { $$ = (Node *)makeString($1); }
+def_arg: func_return { $$ = (Node *)$1; }
+ | TokenId { $$ = (Node *)makeString($1); }
| all_Op { $$ = (Node *)makeString($1); }
| NumericOnly { $$ = (Node *)$1; }
| Sconst { $$ = (Node *)makeString($1); }
- | SETOF ColId
- {
- TypeName *n = makeNode(TypeName);
- n->name = $2;
- n->setof = TRUE;
- n->arrayBounds = NULL;
- n->typmod = -1;
- $$ = (Node *)n;
- }
;
@@ -3843,6 +3851,13 @@ SimpleTypename: Generic
| Datetime
;
+typename: generic { $$ = $1; }
+ | numeric { $$ = $1; }
+ | bit { $$ = $1; }
+ | character { $$ = $1; }
+ | datetime { $$ = $1; }
+ ;
+
Generic: generic
{
$$ = makeNode(TypeName);
@@ -3892,6 +3907,13 @@ Numeric: FLOAT opt_float
}
;
+numeric: FLOAT { $$ = xlateSqlType("float"); }
+ | DOUBLE PRECISION { $$ = xlateSqlType("float"); }
+ | DECIMAL { $$ = xlateSqlType("decimal"); }
+ | DEC { $$ = xlateSqlType("decimal"); }
+ | NUMERIC { $$ = xlateSqlType("numeric"); }
+ ;
+
opt_float: '(' Iconst ')'
{
if ($2 < 1)
@@ -4217,6 +4239,7 @@ row_list: row_list ',' a_expr
;
sub_type: ANY { $$ = ANY_SUBLINK; }
+ | SOME { $$ = ANY_SUBLINK; }
| ALL { $$ = ALL_SUBLINK; }
;
@@ -5291,19 +5314,25 @@ UserId: IDENT { $$ = $1; };
* some of these keywords will have to be removed from this
* list due to shift/reduce conflicts in yacc. If so, move
* down to the ColLabel entity. - thomas 1997-11-06
- * These show up as operators, and will screw up the parsing if
- * allowed as identifiers or labels.
+ * Any tokens which show up as operators will screw up the parsing if
+ * allowed as identifiers, but are acceptable as ColLabels:
+ * BETWEEN, IN, IS, ISNULL, NOTNULL, OVERLAPS
* Thanks to Tom Lane for pointing this out. - thomas 2000-03-29
- | BETWEEN { $$ = "between"; }
- | IN { $$ = "in"; }
- | IS { $$ = "is"; }
- | ISNULL { $$ = "isnull"; }
- | NOTNULL { $$ = "notnull"; }
- | OVERLAPS { $$ = "overlaps"; }
*/
ColId: IDENT { $$ = $1; }
+ | TokenId { $$ = $1; }
| datetime { $$ = $1; }
- | ABSOLUTE { $$ = "absolute"; }
+ | INTERVAL { $$ = "interval"; }
+ | TIME { $$ = "time"; }
+ | TIMESTAMP { $$ = "timestamp"; }
+ | TYPE_P { $$ = "type"; }
+ ;
+
+/* Parser tokens to be used as identifiers.
+ * Tokens involving data types should appear in ColId only,
+ * since they will conflict with real TypeName productions.
+ */
+TokenId: ABSOLUTE { $$ = "absolute"; }
| ACCESS { $$ = "access"; }
| ACTION { $$ = "action"; }
| ADD { $$ = "add"; }
@@ -5350,7 +5379,6 @@ ColId: IDENT { $$ = $1; }
| INSENSITIVE { $$ = "insensitive"; }
| INSERT { $$ = "insert"; }
| INSTEAD { $$ = "instead"; }
- | INTERVAL { $$ = "interval"; }
| ISOLATION { $$ = "isolation"; }
| KEY { $$ = "key"; }
| LANGUAGE { $$ = "language"; }
@@ -5403,14 +5431,11 @@ ColId: IDENT { $$ = $1; }
| SYSID { $$ = "sysid"; }
| TEMP { $$ = "temp"; }
| TEMPORARY { $$ = "temporary"; }
- | TIME { $$ = "time"; }
- | TIMESTAMP { $$ = "timestamp"; }
| TIMEZONE_HOUR { $$ = "timezone_hour"; }
| TIMEZONE_MINUTE { $$ = "timezone_minute"; }
| TRIGGER { $$ = "trigger"; }
| TRUNCATE { $$ = "truncate"; }
| TRUSTED { $$ = "trusted"; }
- | TYPE_P { $$ = "type"; }
| UNLISTEN { $$ = "unlisten"; }
| UNTIL { $$ = "until"; }
| UPDATE { $$ = "update"; }
@@ -5433,24 +5458,14 @@ ColId: IDENT { $$ = $1; }
* Add other keywords to this list. Note that they appear here
* rather than in ColId if there was a shift/reduce conflict
* when used as a full identifier. - thomas 1997-11-06
- * These show up as operators, and will screw up the parsing if
- * allowed as identifiers or labels.
- * Thanks to Tom Lane for pointing this out. - thomas 2000-03-29
- | ALL { $$ = "all"; }
- | ANY { $$ = "any"; }
- | EXCEPT { $$ = "except"; }
- | INTERSECT { $$ = "intersect"; }
- | LIKE { $$ = "like"; }
- | NOT { $$ = "not"; }
- | NULLIF { $$ = "nullif"; }
- | NULL_P { $$ = "null"; }
- | OR { $$ = "or"; }
- | UNION { $$ = "union"; }
*/
ColLabel: ColId { $$ = $1; }
| ABORT_TRANS { $$ = "abort"; }
+ | ALL { $$ = "all"; }
| ANALYZE { $$ = "analyze"; }
+ | ANY { $$ = "any"; }
| ASC { $$ = "asc"; }
+ | BETWEEN { $$ = "between"; }
| BINARY { $$ = "binary"; }
| BIT { $$ = "bit"; }
| BOTH { $$ = "both"; }
@@ -5480,6 +5495,7 @@ ColLabel: ColId { $$ = $1; }
| DO { $$ = "do"; }
| ELSE { $$ = "else"; }
| END_TRANS { $$ = "end"; }
+ | EXCEPT { $$ = "except"; }
| EXISTS { $$ = "exists"; }
| EXPLAIN { $$ = "explain"; }
| EXTEND { $$ = "extend"; }
@@ -5494,11 +5510,16 @@ ColLabel: ColId { $$ = $1; }
| GROUP { $$ = "group"; }
| HAVING { $$ = "having"; }
| INITIALLY { $$ = "initially"; }
+ | IN { $$ = "in"; }
| INNER_P { $$ = "inner"; }
+ | INTERSECT { $$ = "intersect"; }
| INTO { $$ = "into"; }
+ | IS { $$ = "is"; }
+ | ISNULL { $$ = "isnull"; }
| JOIN { $$ = "join"; }
| LEADING { $$ = "leading"; }
| LEFT { $$ = "left"; }
+ | LIKE { $$ = "like"; }
| LISTEN { $$ = "listen"; }
| LOAD { $$ = "load"; }
| LOCAL { $$ = "local"; }
@@ -5508,11 +5529,17 @@ ColLabel: ColId { $$ = $1; }
| NCHAR { $$ = "nchar"; }
| NEW { $$ = "new"; }
| NONE { $$ = "none"; }
+ | NOT { $$ = "not"; }
+ | NOTNULL { $$ = "notnull"; }
+ | NULLIF { $$ = "nullif"; }
+ | NULL_P { $$ = "null"; }
| NUMERIC { $$ = "numeric"; }
| OFFSET { $$ = "offset"; }
| ON { $$ = "on"; }
+ | OR { $$ = "or"; }
| ORDER { $$ = "order"; }
| OUTER_P { $$ = "outer"; }
+ | OVERLAPS { $$ = "overlaps"; }
| POSITION { $$ = "position"; }
| PRECISION { $$ = "precision"; }
| PRIMARY { $$ = "primary"; }
@@ -5525,6 +5552,7 @@ ColLabel: ColId { $$ = $1; }
| SESSION_USER { $$ = "session_user"; }
| SETOF { $$ = "setof"; }
| SHOW { $$ = "show"; }
+ | SOME { $$ = "some"; }
| SUBSTRING { $$ = "substring"; }
| TABLE { $$ = "table"; }
| THEN { $$ = "then"; }
@@ -5532,6 +5560,7 @@ ColLabel: ColId { $$ = $1; }
| TRANSACTION { $$ = "transaction"; }
| TRIM { $$ = "trim"; }
| TRUE_P { $$ = "true"; }
+ | UNION { $$ = "union"; }
| UNIQUE { $$ = "unique"; }
| USER { $$ = "user"; }
| USING { $$ = "using"; }
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index 470a6c95234..cd1b66a7f8e 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.69 2000/03/21 06:00:41 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.70 2000/04/07 13:39:34 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -221,6 +221,7 @@ static ScanKeyword ScanKeywords[] = {
{"setof", SETOF},
{"share", SHARE},
{"show", SHOW},
+ {"some", SOME},
{"start", START},
{"statement", STATEMENT},
{"stdin", STDIN},