Department of second thoughts: further experimentation with CREATE OR REPLACE

VIEW suggests that it'd be worth spelling the error messages out in a little
more detail.  This seems to help with localizing the problem.
This commit is contained in:
Tom Lane 2008-12-16 00:56:12 +00:00
parent 1b92aeb93e
commit 794ec7b063
2 changed files with 14 additions and 8 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.109 2008/12/15 21:35:31 tgl Exp $ * $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.110 2008/12/16 00:56:12 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -29,6 +29,7 @@
#include "rewrite/rewriteManip.h" #include "rewrite/rewriteManip.h"
#include "rewrite/rewriteSupport.h" #include "rewrite/rewriteSupport.h"
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/rel.h" #include "utils/rel.h"
@ -263,7 +264,7 @@ checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc)
Form_pg_attribute newattr = newdesc->attrs[i]; Form_pg_attribute newattr = newdesc->attrs[i];
Form_pg_attribute oldattr = olddesc->attrs[i]; Form_pg_attribute oldattr = olddesc->attrs[i];
/* XXX not right, but we don't support DROP COL on view anyway */ /* XXX msg not right, but we don't support DROP COL on view anyway */
if (newattr->attisdropped != oldattr->attisdropped) if (newattr->attisdropped != oldattr->attisdropped)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_TABLE_DEFINITION), (errcode(ERRCODE_INVALID_TABLE_DEFINITION),
@ -272,15 +273,20 @@ checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc)
if (strcmp(NameStr(newattr->attname), NameStr(oldattr->attname)) != 0) if (strcmp(NameStr(newattr->attname), NameStr(oldattr->attname)) != 0)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_TABLE_DEFINITION), (errcode(ERRCODE_INVALID_TABLE_DEFINITION),
errmsg("cannot change name of view column \"%s\"", errmsg("cannot change name of view column \"%s\" to \"%s\"",
NameStr(oldattr->attname)))); NameStr(oldattr->attname),
NameStr(newattr->attname))));
/* XXX would it be safe to allow atttypmod to change? Not sure */ /* XXX would it be safe to allow atttypmod to change? Not sure */
if (newattr->atttypid != oldattr->atttypid || if (newattr->atttypid != oldattr->atttypid ||
newattr->atttypmod != oldattr->atttypmod) newattr->atttypmod != oldattr->atttypmod)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_TABLE_DEFINITION), (errcode(ERRCODE_INVALID_TABLE_DEFINITION),
errmsg("cannot change data type of view column \"%s\"", errmsg("cannot change data type of view column \"%s\" from %s to %s",
NameStr(oldattr->attname)))); NameStr(oldattr->attname),
format_type_with_typemod(oldattr->atttypid,
oldattr->atttypmod),
format_type_with_typemod(newattr->atttypid,
newattr->atttypmod))));
/* We can ignore the remaining attributes of an attribute... */ /* We can ignore the remaining attributes of an attribute... */
} }

View File

@ -53,11 +53,11 @@ ERROR: cannot drop columns from view
-- should fail -- should fail
CREATE OR REPLACE VIEW viewtest AS CREATE OR REPLACE VIEW viewtest AS
SELECT 1, * FROM viewtest_tbl; SELECT 1, * FROM viewtest_tbl;
ERROR: cannot change name of view column "a" ERROR: cannot change name of view column "a" to "?column?"
-- should fail -- should fail
CREATE OR REPLACE VIEW viewtest AS CREATE OR REPLACE VIEW viewtest AS
SELECT a, b::numeric FROM viewtest_tbl; SELECT a, b::numeric FROM viewtest_tbl;
ERROR: cannot change data type of view column "b" ERROR: cannot change data type of view column "b" from integer to numeric
-- should work -- should work
CREATE OR REPLACE VIEW viewtest AS CREATE OR REPLACE VIEW viewtest AS
SELECT a, b, 0 AS c FROM viewtest_tbl; SELECT a, b, 0 AS c FROM viewtest_tbl;