diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 39c83a605ca..357847f1f01 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -671,17 +671,29 @@ checkRuleResultList(List *targetList, TupleDesc resultDesc, bool isSelect, attname = NameStr(attr->attname); /* - * Disallow dropped columns in the relation. This won't happen in the - * cases we actually care about (namely creating a view via CREATE - * TABLE then CREATE RULE, or adding a RETURNING rule to a view). - * Trying to cope with it is much more trouble than it's worth, - * because we'd have to modify the rule to insert dummy NULLs at the - * right positions. + * Disallow dropped columns in the relation. This is not really + * expected to happen when creating an ON SELECT rule. It'd be + * possible if someone tried to convert a relation with dropped + * columns to a view, but the only case we care about supporting + * table-to-view conversion for is pg_dump, and pg_dump won't do that. + * + * Unfortunately, the situation is also possible when adding a rule + * with RETURNING to a regular table, and rejecting that case is + * altogether more annoying. In principle we could support it by + * modifying the targetlist to include dummy NULL columns + * corresponding to the dropped columns in the tupdesc. However, + * places like ruleutils.c would have to be fixed to not process such + * entries, and that would take an uncertain and possibly rather large + * amount of work. (Note we could not dodge that by marking the dummy + * columns resjunk, since it's precisely the non-resjunk tlist columns + * that are expected to correspond to table columns.) */ if (attr->attisdropped) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot convert relation containing dropped columns to view"))); + isSelect ? + errmsg("cannot convert relation containing dropped columns to view") : + errmsg("cannot create a RETURNING list for a relation containing dropped columns"))); /* Check name match if required; no need for two error texts here */ if (requireColumnNameMatch && strcmp(tle->resname, attname) != 0) |