diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-09-17 17:19:17 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-09-17 17:19:17 +0000 |
commit | 6b73da67b2db6e6a4a1a0113d00e749698125a07 (patch) | |
tree | 65a1651c7576e4175670bb60492a0a44891729b9 /src/backend/rewrite/rewriteDefine.c | |
parent | e8839c2b6c00bac6d8119ec0cc27a5e77169c8a0 (diff) | |
download | postgresql-6b73da67b2db6e6a4a1a0113d00e749698125a07.tar.gz postgresql-6b73da67b2db6e6a4a1a0113d00e749698125a07.zip |
Disallow converting a table to a view if it has triggers, indexes, or
child tables --- all cases that will trip various sanity checks elsewhere
in the system, as well as cases that should not occur in the only intended
use of this feature, namely coping with ancient pg_dump representation
of views. Per bug report from Chris Pizzi.
Diffstat (limited to 'src/backend/rewrite/rewriteDefine.c')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 6a0dd04568d..8abdd1bcb58 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.86 2003/08/04 02:40:03 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.87 2003/09/17 17:19:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -392,7 +392,8 @@ DefineQueryRewrite(RuleStmt *stmt) * Are we converting a relation to a view? * * If so, check that the relation is empty because the storage for - * the relation is going to be deleted. + * the relation is going to be deleted. Also insist that the rel + * not have any triggers, indexes, or child tables. */ if (event_relation->rd_rel->relkind != RELKIND_VIEW) { @@ -402,10 +403,29 @@ DefineQueryRewrite(RuleStmt *stmt) if (heap_getnext(scanDesc, ForwardScanDirection) != NULL) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot convert non-empty table \"%s\" to a view", + errmsg("could not convert table \"%s\" to a view because it is not empty", event_obj->relname))); heap_endscan(scanDesc); + if (event_relation->rd_rel->reltriggers != 0) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("could not convert table \"%s\" to a view because it has triggers", + event_obj->relname), + errhint("In particular, the table may not be involved in any foreign key relationships."))); + + if (event_relation->rd_rel->relhasindex) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("could not convert table \"%s\" to a view because it has indexes", + event_obj->relname))); + + if (event_relation->rd_rel->relhassubclass) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("could not convert table \"%s\" to a view because it has child tables", + event_obj->relname))); + RelisBecomingView = true; } } @@ -456,6 +476,8 @@ DefineQueryRewrite(RuleStmt *stmt) * IF the relation is becoming a view, delete the storage files * associated with it. NB: we had better have AccessExclusiveLock to * do this ... + * + * XXX what about getting rid of its TOAST table? For now, we don't. */ if (RelisBecomingView) smgrunlink(DEFAULT_SMGR, event_relation); |