aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/alter.c6
-rw-r--r--src/backend/commands/tablecmds.c73
-rw-r--r--src/backend/parser/gram.y102
-rw-r--r--src/backend/tcop/utility.c31
-rw-r--r--src/include/commands/tablecmds.h5
5 files changed, 156 insertions, 61 deletions
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c
index 63acefa527d..fce328bcc40 100644
--- a/src/backend/commands/alter.c
+++ b/src/backend/commands/alter.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.28 2008/03/19 18:38:30 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.29 2008/06/15 01:25:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -185,8 +185,10 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt)
case OBJECT_SEQUENCE:
case OBJECT_TABLE:
+ case OBJECT_VIEW:
CheckRelationOwnership(stmt->relation, true);
- AlterTableNamespace(stmt->relation, stmt->newschema);
+ AlterTableNamespace(stmt->relation, stmt->newschema,
+ stmt->objectType);
break;
case OBJECT_TYPE:
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 7f7102858b1..b3d21875b25 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.256 2008/06/14 18:04:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.257 2008/06/15 01:25:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2175,6 +2175,44 @@ AlterTable(AlterTableStmt *stmt)
CheckTableNotInUse(rel, "ALTER TABLE");
+ /* Check relation type against type specified in the ALTER command */
+ switch (stmt->relkind)
+ {
+ case OBJECT_TABLE:
+ /*
+ * For mostly-historical reasons, we allow ALTER TABLE to apply
+ * to all relation types.
+ */
+ break;
+
+ case OBJECT_INDEX:
+ if (rel->rd_rel->relkind != RELKIND_INDEX)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not an index",
+ RelationGetRelationName(rel))));
+ break;
+
+ case OBJECT_SEQUENCE:
+ if (rel->rd_rel->relkind != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ RelationGetRelationName(rel))));
+ break;
+
+ case OBJECT_VIEW:
+ if (rel->rd_rel->relkind != RELKIND_VIEW)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a view",
+ RelationGetRelationName(rel))));
+ break;
+
+ default:
+ elog(ERROR, "unrecognized object type: %d", (int) stmt->relkind);
+ }
+
ATController(rel, stmt->cmds, interpretInhOption(stmt->relation->inhOpt));
}
@@ -7191,7 +7229,8 @@ ATExecDropInherit(Relation rel, RangeVar *parent)
* Note: caller must have checked ownership of the relation already
*/
void
-AlterTableNamespace(RangeVar *relation, const char *newschema)
+AlterTableNamespace(RangeVar *relation, const char *newschema,
+ ObjectType stmttype)
{
Relation rel;
Oid relid;
@@ -7204,6 +7243,36 @@ AlterTableNamespace(RangeVar *relation, const char *newschema)
relid = RelationGetRelid(rel);
oldNspOid = RelationGetNamespace(rel);
+ /* Check relation type against type specified in the ALTER command */
+ switch (stmttype)
+ {
+ case OBJECT_TABLE:
+ /*
+ * For mostly-historical reasons, we allow ALTER TABLE to apply
+ * to all relation types.
+ */
+ break;
+
+ case OBJECT_SEQUENCE:
+ if (rel->rd_rel->relkind != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ RelationGetRelationName(rel))));
+ break;
+
+ case OBJECT_VIEW:
+ if (rel->rd_rel->relkind != RELKIND_VIEW)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a view",
+ RelationGetRelationName(rel))));
+ break;
+
+ default:
+ elog(ERROR, "unrecognized object type: %d", (int) stmttype);
+ }
+
/* Can we change the schema of this tuple? */
switch (rel->rd_rel->relkind)
{
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 591920d6f68..4e59e37da91 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.615 2008/05/16 23:36:05 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.616 2008/06/15 01:25:54 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -185,8 +185,8 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
%type <node> alter_column_default opclass_item opclass_drop alter_using
%type <ival> add_drop opt_asc_desc opt_nulls_order
-%type <node> alter_table_cmd alter_rel_cmd
-%type <list> alter_table_cmds alter_rel_cmds
+%type <node> alter_table_cmd
+%type <list> alter_table_cmds
%type <dbehavior> opt_drop_behavior
@@ -291,8 +291,8 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
%type <node> fetch_direction select_limit_value select_offset_value
-%type <list> OptSeqList
-%type <defelt> OptSeqElem
+%type <list> OptSeqOptList SeqOptList
+%type <defelt> SeqOptElem
%type <istmt> insert_rest
@@ -1391,8 +1391,10 @@ DiscardStmt:
/*****************************************************************************
*
- * ALTER [ TABLE | INDEX ] variations
+ * ALTER [ TABLE | INDEX | SEQUENCE | VIEW ] variations
*
+ * Note: we accept all subcommands for each of the four variants, and sort
+ * out what's really legal at execution time.
*****************************************************************************/
AlterTableStmt:
@@ -1404,7 +1406,7 @@ AlterTableStmt:
n->relkind = OBJECT_TABLE;
$$ = (Node *)n;
}
- | ALTER INDEX relation_expr alter_rel_cmds
+ | ALTER INDEX relation_expr alter_table_cmds
{
AlterTableStmt *n = makeNode(AlterTableStmt);
n->relation = $3;
@@ -1412,6 +1414,22 @@ AlterTableStmt:
n->relkind = OBJECT_INDEX;
$$ = (Node *)n;
}
+ | ALTER SEQUENCE relation_expr alter_table_cmds
+ {
+ AlterTableStmt *n = makeNode(AlterTableStmt);
+ n->relation = $3;
+ n->cmds = $4;
+ n->relkind = OBJECT_SEQUENCE;
+ $$ = (Node *)n;
+ }
+ | ALTER VIEW relation_expr alter_table_cmds
+ {
+ AlterTableStmt *n = makeNode(AlterTableStmt);
+ n->relation = $3;
+ n->cmds = $4;
+ n->relkind = OBJECT_VIEW;
+ $$ = (Node *)n;
+ }
;
alter_table_cmds:
@@ -1419,9 +1437,8 @@ alter_table_cmds:
| alter_table_cmds ',' alter_table_cmd { $$ = lappend($1, $3); }
;
-/* Subcommands that are for ALTER TABLE only */
alter_table_cmd:
- /* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
+ /* ALTER TABLE <name> ADD [COLUMN] <coldef> */
ADD_P opt_column columnDef
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1429,7 +1446,7 @@ alter_table_cmd:
n->def = $3;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
+ /* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
| ALTER opt_column ColId alter_column_default
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1438,7 +1455,7 @@ alter_table_cmd:
n->def = $4;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
+ /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
| ALTER opt_column ColId DROP NOT NULL_P
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1446,7 +1463,7 @@ alter_table_cmd:
n->name = $3;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
+ /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
| ALTER opt_column ColId SET NOT NULL_P
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1454,7 +1471,7 @@ alter_table_cmd:
n->name = $3;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
+ /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
| ALTER opt_column ColId SET STATISTICS IntegerOnly
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1463,7 +1480,7 @@ alter_table_cmd:
n->def = (Node *) $6;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
+ /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
| ALTER opt_column ColId SET STORAGE ColId
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1472,7 +1489,7 @@ alter_table_cmd:
n->def = (Node *) makeString($6);
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
+ /* ALTER TABLE <name> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
| DROP opt_column ColId opt_drop_behavior
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1482,7 +1499,7 @@ alter_table_cmd:
$$ = (Node *)n;
}
/*
- * ALTER TABLE <relation> ALTER [COLUMN] <colname> TYPE <typename>
+ * ALTER TABLE <name> ALTER [COLUMN] <colname> TYPE <typename>
* [ USING <expression> ]
*/
| ALTER opt_column ColId TYPE_P Typename alter_using
@@ -1494,7 +1511,7 @@ alter_table_cmd:
n->transform = $6;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> ADD CONSTRAINT ... */
+ /* ALTER TABLE <name> ADD CONSTRAINT ... */
| ADD_P TableConstraint
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1502,7 +1519,7 @@ alter_table_cmd:
n->def = $2;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
+ /* ALTER TABLE <name> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
| DROP CONSTRAINT name opt_drop_behavior
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1511,7 +1528,7 @@ alter_table_cmd:
n->behavior = $4;
$$ = (Node *)n;
}
- /* ALTER TABLE <relation> SET WITHOUT OIDS */
+ /* ALTER TABLE <name> SET WITHOUT OIDS */
| SET WITHOUT OIDS
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1642,28 +1659,15 @@ alter_table_cmd:
n->def = (Node *) $3;
$$ = (Node *)n;
}
- | alter_rel_cmd
- {
- $$ = $1;
- }
- ;
-
-alter_rel_cmds:
- alter_rel_cmd { $$ = list_make1($1); }
- | alter_rel_cmds ',' alter_rel_cmd { $$ = lappend($1, $3); }
- ;
-
-/* Subcommands that are for ALTER TABLE or ALTER INDEX */
-alter_rel_cmd:
- /* ALTER [TABLE|INDEX] <name> OWNER TO RoleId */
- OWNER TO RoleId
+ /* ALTER TABLE <name> OWNER TO RoleId */
+ | OWNER TO RoleId
{
AlterTableCmd *n = makeNode(AlterTableCmd);
n->subtype = AT_ChangeOwner;
n->name = $3;
$$ = (Node *)n;
}
- /* ALTER [TABLE|INDEX] <name> SET TABLESPACE <tablespacename> */
+ /* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
| SET TABLESPACE name
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1671,7 +1675,7 @@ alter_rel_cmd:
n->name = $3;
$$ = (Node *)n;
}
- /* ALTER [TABLE|INDEX] <name> SET (...) */
+ /* ALTER TABLE <name> SET (...) */
| SET definition
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -1679,7 +1683,7 @@ alter_rel_cmd:
n->def = (Node *)$2;
$$ = (Node *)n;
}
- /* ALTER [TABLE|INDEX] <name> RESET (...) */
+ /* ALTER TABLE <name> RESET (...) */
| RESET definition
{
AlterTableCmd *n = makeNode(AlterTableCmd);
@@ -2425,7 +2429,7 @@ CreateAsElement:
*****************************************************************************/
CreateSeqStmt:
- CREATE OptTemp SEQUENCE qualified_name OptSeqList
+ CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
{
CreateSeqStmt *n = makeNode(CreateSeqStmt);
$4->istemp = $2;
@@ -2436,7 +2440,7 @@ CreateSeqStmt:
;
AlterSeqStmt:
- ALTER SEQUENCE qualified_name OptSeqList
+ ALTER SEQUENCE relation_expr SeqOptList
{
AlterSeqStmt *n = makeNode(AlterSeqStmt);
n->sequence = $3;
@@ -2445,11 +2449,15 @@ AlterSeqStmt:
}
;
-OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
+OptSeqOptList: SeqOptList { $$ = $1; }
| /*EMPTY*/ { $$ = NIL; }
;
-OptSeqElem: CACHE NumericOnly
+SeqOptList: SeqOptElem { $$ = list_make1($1); }
+ | SeqOptList SeqOptElem { $$ = lappend($1, $2); }
+ ;
+
+SeqOptElem: CACHE NumericOnly
{
$$ = makeDefElem("cache", (Node *)$2);
}
@@ -4802,6 +4810,14 @@ AlterObjectSchemaStmt:
n->newschema = $6;
$$ = (Node *)n;
}
+ | ALTER TABLE relation_expr SET SCHEMA name
+ {
+ AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
+ n->objectType = OBJECT_TABLE;
+ n->relation = $3;
+ n->newschema = $6;
+ $$ = (Node *)n;
+ }
| ALTER SEQUENCE relation_expr SET SCHEMA name
{
AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
@@ -4810,10 +4826,10 @@ AlterObjectSchemaStmt:
n->newschema = $6;
$$ = (Node *)n;
}
- | ALTER TABLE relation_expr SET SCHEMA name
+ | ALTER VIEW relation_expr SET SCHEMA name
{
AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
- n->objectType = OBJECT_TABLE;
+ n->objectType = OBJECT_VIEW;
n->relation = $3;
n->newschema = $6;
$$ = (Node *)n;
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 6c839650b43..1922ffc960d 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.293 2008/06/14 18:04:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.294 2008/06/15 01:25:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1454,6 +1454,9 @@ CreateCommandTag(Node *parsetree)
case OBJECT_TSCONFIGURATION:
tag = "ALTER TEXT SEARCH CONFIGURATION";
break;
+ case OBJECT_VIEW:
+ tag = "ALTER VIEW";
+ break;
default:
tag = "???";
break;
@@ -1512,19 +1515,23 @@ CreateCommandTag(Node *parsetree)
break;
case T_AlterTableStmt:
+ switch (((AlterTableStmt *) parsetree)->relkind)
{
- AlterTableStmt *stmt = (AlterTableStmt *) parsetree;
-
- /*
- * We might be supporting ALTER INDEX here, so set the
- * completion tag appropriately. Catch all other possibilities
- * with ALTER TABLE
- */
-
- if (stmt->relkind == OBJECT_INDEX)
- tag = "ALTER INDEX";
- else
+ case OBJECT_TABLE:
tag = "ALTER TABLE";
+ break;
+ case OBJECT_INDEX:
+ tag = "ALTER INDEX";
+ break;
+ case OBJECT_SEQUENCE:
+ tag = "ALTER SEQUENCE";
+ break;
+ case OBJECT_VIEW:
+ tag = "ALTER VIEW";
+ break;
+ default:
+ tag = "???";
+ break;
}
break;
diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h
index cdb80240169..d9e1a563728 100644
--- a/src/include/commands/tablecmds.h
+++ b/src/include/commands/tablecmds.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/commands/tablecmds.h,v 1.39 2008/06/14 18:04:34 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/commands/tablecmds.h,v 1.40 2008/06/15 01:25:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -28,7 +28,8 @@ extern void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing);
extern void AlterTableInternal(Oid relid, List *cmds, bool recurse);
-extern void AlterTableNamespace(RangeVar *relation, const char *newschema);
+extern void AlterTableNamespace(RangeVar *relation, const char *newschema,
+ ObjectType stmttype);
extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid,
Oid oldNspOid, Oid newNspOid,