diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2012-10-24 13:39:37 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2012-10-24 13:39:37 -0400 |
commit | a4e8680a6c337955c021177457147f4b4d9a5df5 (patch) | |
tree | dc8d6dbb7a9ddaa04c300043483e62e8e9d4cd92 /src/backend/rewrite/rewriteDefine.c | |
parent | f4c4335a4aaf5f2ee6e741cdf4f5c8e338d86a2f (diff) |
When converting a table to a view, remove its system columns.
Views should not have any pg_attribute entries for system columns.
However, we forgot to remove such entries when converting a table to a
view. This could lead to crashes later on, if someone attempted to
reference such a column, as reported by Kohei KaiGai.
Patch in HEAD only. This bug has been there forever, but in the back
branches we will have to defend against existing mis-converted views,
so it doesn't seem worthwhile to change the conversion code too.
Diffstat (limited to 'src/backend/rewrite/rewriteDefine.c')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 8efc9fc9d52..55b0fed5f79 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -18,6 +18,7 @@ #include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/dependency.h" +#include "catalog/heap.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" @@ -510,13 +511,19 @@ DefineQueryRewrite(char *rulename, } /* - * IF the relation is becoming a view, delete the storage files associated - * with it. NB: we had better have AccessExclusiveLock to do this ... + * If the relation is becoming a view, delete the storage files associated + * with it. Also, get rid of any system attribute entries in pg_attribute, + * because a view shouldn't have any of those. + * + * 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) + { RelationDropStorage(event_relation); + DeleteSystemAttributeTuples(event_relid); + } /* Close rel, but keep lock till commit... */ heap_close(event_relation, NoLock); |