Commit 8c611602 authored by Tom Lane's avatar Tom Lane

Guard against table-AM-less relations in planner.

The executor will dump core if it's asked to execute a seqscan on
a relation having no table AM, such as a view.  While that shouldn't
really happen, it's possible to get there via catalog corruption,
such as a missing ON SELECT rule.  It seems worth installing a defense
against that.  There are multiple plausible places for such a defense,
but I picked the planner's get_relation_info().

Per discussion of bug #17646 from Kui Liu.  Back-patch to v12 where
the tableam APIs were introduced; in older versions you won't get a
SIGSEGV, so it seems less pressing.

Discussion: https://postgr.es/m/17646-70c93cfa40365776@postgresql.org
parent 8122160f
...@@ -125,6 +125,22 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, ...@@ -125,6 +125,22 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
*/ */
relation = table_open(relationObjectId, NoLock); relation = table_open(relationObjectId, NoLock);
/*
* Relations without a table AM can be used in a query only if they are of
* special-cased relkinds. This check prevents us from crashing later if,
* for example, a view's ON SELECT rule has gone missing. Note that
* table_open() already rejected indexes and composite types.
*/
if (!relation->rd_tableam)
{
if (!(relation->rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("cannot open relation \"%s\"",
RelationGetRelationName(relation))));
}
/* Temporary and unlogged relations are inaccessible during recovery. */ /* Temporary and unlogged relations are inaccessible during recovery. */
if (!RelationIsPermanent(relation) && RecoveryInProgress()) if (!RelationIsPermanent(relation) && RecoveryInProgress())
ereport(ERROR, ereport(ERROR,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment