summaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteDefine.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-10-24 13:39:37 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-10-24 13:39:37 -0400
commita4e8680a6c337955c021177457147f4b4d9a5df5 (patch)
treedc8d6dbb7a9ddaa04c300043483e62e8e9d4cd92 /src/backend/rewrite/rewriteDefine.c
parentf4c4335a4aaf5f2ee6e741cdf4f5c8e338d86a2f (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.c11
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);