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)