aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/analyze.c8
-rw-r--r--src/backend/parser/gram.y94
-rw-r--r--src/backend/parser/keywords.c7
-rw-r--r--src/backend/parser/parse_clause.c6
4 files changed, 76 insertions, 39 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 5eef60918cc..5de51410fe8 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: analyze.c,v 1.145 2000/05/30 00:49:50 momjian Exp $
+ * $Id: analyze.c,v 1.146 2000/06/09 01:44:18 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -270,7 +270,7 @@ transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt)
/* set up a range table */
makeRangeTable(pstate, NULL);
- setTargetTable(pstate, stmt->relname);
+ setTargetTable(pstate, stmt->relname, stmt->inh);
qry->distinctClause = NIL;
@@ -368,7 +368,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
* (We didn't want it there until now since it shouldn't be visible in
* the SELECT part.)
*/
- setTargetTable(pstate, stmt->relname);
+ setTargetTable(pstate, stmt->relname, FALSE);
/* now the range table will not change */
qry->rtable = pstate->p_rtable;
@@ -1489,7 +1489,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
* do this with REPLACE in POSTQUEL so we keep the feature.
*/
makeRangeTable(pstate, stmt->fromClause);
- setTargetTable(pstate, stmt->relname);
+ setTargetTable(pstate, stmt->relname, stmt->inh);
qry->targetList = transformTargetList(pstate, stmt->targetList);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index d19edf96947..38539964f5b 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.169 2000/05/31 00:28:24 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.170 2000/06/09 01:44:18 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -49,6 +49,7 @@
#include "storage/lmgr.h"
#include "utils/acl.h"
#include "utils/numeric.h"
+#include "commands/variable.h"
#ifdef MULTIBYTE
#include "miscadmin.h"
@@ -170,7 +171,7 @@ static void doNegateFloat(Value *v);
%type <list> stmtblock, stmtmulti,
result, OptTempTableName, relation_name_list, OptTableElementList,
- OptInherit, definition, opt_distinct,
+ OptUnder, OptInherit, definition, opt_distinct,
opt_with, func_args, func_args_list, func_as,
oper_argtypes, RuleActionList, RuleActionMulti,
opt_column_list, columnList, opt_va_list, va_list,
@@ -207,7 +208,7 @@ static void doNegateFloat(Value *v);
%type <list> substr_list, substr_from, substr_for, trim_list
%type <list> opt_interval
-%type <boolean> opt_inh_star, opt_binary, opt_using, opt_instead,
+%type <boolean> opt_inh_star, opt_binary, opt_using, opt_instead, opt_only
opt_with_copy, index_opt_unique, opt_verbose, opt_analyze
%type <boolean> opt_cursor
@@ -323,7 +324,8 @@ static void doNegateFloat(Value *v);
IMMEDIATE, INITIALLY,
PENDANT,
RESTRICT,
- TRIGGER,
+ TRIGGER,
+ UNDER,
OFF
/* Keywords (in SQL92 non-reserved words) */
@@ -882,7 +884,7 @@ AlterTableStmt:
AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'A';
n->relname = $3;
- n->inh = $4;
+ n->inh = $4 || examine_subclass;
n->def = $7;
$$ = (Node *)n;
}
@@ -892,7 +894,7 @@ AlterTableStmt:
AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'T';
n->relname = $3;
- n->inh = $4;
+ n->inh = $4 || examine_subclass;
n->name = $7;
n->def = $8;
$$ = (Node *)n;
@@ -903,7 +905,7 @@ AlterTableStmt:
AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'D';
n->relname = $3;
- n->inh = $4;
+ n->inh = $4 || examine_subclass;
n->name = $7;
n->behavior = $8;
$$ = (Node *)n;
@@ -914,7 +916,7 @@ AlterTableStmt:
AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'C';
n->relname = $3;
- n->inh = $4;
+ n->inh = $4 || examine_subclass;
n->def = $6;
$$ = (Node *)n;
}
@@ -924,7 +926,7 @@ AlterTableStmt:
AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'X';
n->relname = $3;
- n->inh = $4;
+ n->inh = $4 || examine_subclass;
n->name = $7;
n->behavior = $8;
$$ = (Node *)n;
@@ -1036,14 +1038,22 @@ copy_null: WITH NULL_P AS Sconst { $$ = $4; }
*
*****************************************************************************/
-CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
- OptInherit
+CreateStmt: CREATE OptTemp TABLE relation_name OptUnder '(' OptTableElementList ')' OptInherit
{
CreateStmt *n = makeNode(CreateStmt);
n->istemp = $2;
n->relname = $4;
- n->tableElts = $6;
- n->inhRelnames = $8;
+ n->tableElts = $7;
+ n->inhRelnames = nconc($5, $9);
+/* if ($5 != NIL)
+ {
+ n->inhRelnames = $5;
+ }
+ else
+ { */
+ /* INHERITS is deprecated */
+ /* n->inhRelnames = $9;
+ } */
n->constraints = NIL;
$$ = (Node *)n;
}
@@ -1400,8 +1410,17 @@ key_reference: NO ACTION { $$ = FKCONSTR_ON_KEY_NOACTION; }
| SET DEFAULT { $$ = FKCONSTR_ON_KEY_SETDEFAULT; }
;
+OptUnder: UNDER relation_name_list { $$ = $2; }
+ | /*EMPTY*/ { $$ = NIL; }
+ ;
+
+opt_only: ONLY { $$ = FALSE; }
+ | /*EMPTY*/ { $$ = TRUE; }
+ ;
+
+/* INHERITS is Deprecated */
OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
- | /*EMPTY*/ { $$ = NIL; }
+ | /*EMPTY*/ { $$ = NIL; }
;
/*
@@ -1409,11 +1428,13 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
* SELECT ... INTO.
*/
-CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SelectStmt
+CreateAsStmt: CREATE OptTemp TABLE relation_name OptUnder OptCreateAs AS SelectStmt
{
- SelectStmt *n = (SelectStmt *)$7;
- if ($5 != NIL)
- mapTargetColumns($5, n->targetList);
+ SelectStmt *n = (SelectStmt *)$8;
+ if ($5 != NIL)
+ yyerror("CREATE TABLE/AS SELECT does not support UNDER");
+ if ($6 != NIL)
+ mapTargetColumns($6, n->targetList);
if (n->into != NULL)
elog(ERROR,"CREATE TABLE/AS SELECT may not specify INTO");
n->istemp = $2;
@@ -2536,11 +2557,12 @@ opt_force: FORCE { $$ = TRUE; }
*****************************************************************************/
RenameStmt: ALTER TABLE relation_name opt_inh_star
+ /* "*" deprecated */
RENAME opt_column opt_name TO name
{
RenameStmt *n = makeNode(RenameStmt);
n->relname = $3;
- n->inh = $4;
+ n->inh = $4 || examine_subclass;
n->column = $7;
n->newname = $9;
$$ = (Node *)n;
@@ -3094,12 +3116,12 @@ columnElem: ColId opt_indirection
*
*****************************************************************************/
-DeleteStmt: DELETE FROM relation_name
- where_clause
+DeleteStmt: DELETE FROM opt_only relation_name where_clause
{
DeleteStmt *n = makeNode(DeleteStmt);
- n->relname = $3;
- n->whereClause = $4;
+ n->inh = $3;
+ n->relname = $4;
+ n->whereClause = $5;
$$ = (Node *)n;
}
;
@@ -3136,16 +3158,17 @@ opt_lmode: SHARE { $$ = TRUE; }
*
*****************************************************************************/
-UpdateStmt: UPDATE relation_name
+UpdateStmt: UPDATE opt_only relation_name
SET update_target_list
from_clause
where_clause
{
UpdateStmt *n = makeNode(UpdateStmt);
- n->relname = $2;
- n->targetList = $4;
- n->fromClause = $5;
- n->whereClause = $6;
+ n->inh = $2;
+ n->relname = $3;
+ n->targetList = $5;
+ n->fromClause = $6;
+ n->whereClause = $7;
$$ = (Node *)n;
}
;
@@ -3780,10 +3803,10 @@ where_clause: WHERE a_expr { $$ = $2; }
relation_expr: relation_name
{
- /* normal relations */
+ /* default inheritance */
$$ = makeNode(RelExpr);
$$->relname = $1;
- $$->inh = FALSE;
+ $$->inh = examine_subclass;
}
| relation_name '*' %prec '='
{
@@ -3792,6 +3815,14 @@ relation_expr: relation_name
$$->relname = $1;
$$->inh = TRUE;
}
+ | ONLY relation_name %prec '='
+ {
+ /* no inheritance */
+ $$ = makeNode(RelExpr);
+ $$->relname = $2;
+ $$->inh = FALSE;
+ }
+ ;
opt_array_bounds: '[' ']' opt_array_bounds
{ $$ = lcons(makeInteger(-1), $3); }
@@ -5396,7 +5427,6 @@ TokenId: ABSOLUTE { $$ = "absolute"; }
| NOTIFY { $$ = "notify"; }
| OF { $$ = "of"; }
| OIDS { $$ = "oids"; }
- | ONLY { $$ = "only"; }
| OPERATOR { $$ = "operator"; }
| OPTION { $$ = "option"; }
| PARTIAL { $$ = "partial"; }
@@ -5433,6 +5463,7 @@ TokenId: ABSOLUTE { $$ = "absolute"; }
| TRIGGER { $$ = "trigger"; }
| TRUNCATE { $$ = "truncate"; }
| TRUSTED { $$ = "trusted"; }
+ | UNDER { $$ = "under"; }
| UNLISTEN { $$ = "unlisten"; }
| UNTIL { $$ = "until"; }
| UPDATE { $$ = "update"; }
@@ -5534,6 +5565,7 @@ ColLabel: ColId { $$ = $1; }
| OFF { $$ = "off"; }
| OFFSET { $$ = "offset"; }
| ON { $$ = "on"; }
+ | ONLY { $$ = "only"; }
| OR { $$ = "or"; }
| ORDER { $$ = "order"; }
| OUTER_P { $$ = "outer"; }
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index d5ebdbb0918..c6cc5ad9e93 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -8,7 +8,11 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.73 2000/05/31 00:28:24 petere Exp $
+<<<<<<< keywords.c
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.74 2000/06/09 01:44:18 momjian Exp $
+=======
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.74 2000/06/09 01:44:18 momjian Exp $
+>>>>>>> 1.73
*
*-------------------------------------------------------------------------
*/
@@ -247,6 +251,7 @@ static ScanKeyword ScanKeywords[] = {
{"truncate", TRUNCATE},
{"trusted", TRUSTED},
{"type", TYPE_P},
+ {"under", UNDER},
{"union", UNION},
{"unique", UNIQUE},
{"unlisten", UNLISTEN},
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 34f67fb4a16..53fa819d069 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.63 2000/06/08 22:37:18 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.64 2000/06/09 01:44:18 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -72,7 +72,7 @@ makeRangeTable(ParseState *pstate, List *frmList)
* there is no other use of any of its attributes. Tricky, eh?
*/
void
-setTargetTable(ParseState *pstate, char *relname)
+setTargetTable(ParseState *pstate, char *relname, bool inh)
{
RangeTblEntry *rte;
@@ -80,7 +80,7 @@ setTargetTable(ParseState *pstate, char *relname)
if (refnameRangeTablePosn(pstate, relname, NULL) == 0)
rte = addRangeTableEntry(pstate, relname,
makeAttr(relname, NULL),
- FALSE, FALSE, FALSE);
+ inh, FALSE, FALSE);
else
rte = refnameRangeTableEntry(pstate, relname);