diff options
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r-- | src/backend/executor/execMain.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 945dbd8f3c6..d69ca83187b 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -741,6 +741,43 @@ InitPlan(QueryDesc *queryDesc, int eflags) relid = getrelid(rc->rti, rangeTable); relation = heap_open(relid, RowShareLock); + + /* + * Check that relation is a legal target for marking. + * + * In most cases parser and/or planner should have noticed this + * already, but they don't cover all cases. + */ + switch (relation->rd_rel->relkind) + { + case RELKIND_RELATION: + /* OK */ + break; + case RELKIND_SEQUENCE: + /* Must disallow this because we don't vacuum sequences */ + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot lock rows in sequence \"%s\"", + RelationGetRelationName(relation)))); + break; + case RELKIND_TOASTVALUE: + /* This will be disallowed in 9.1, but for now OK */ + break; + case RELKIND_VIEW: + /* Should not get here */ + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot lock rows in view \"%s\"", + RelationGetRelationName(relation)))); + break; + default: + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot lock rows in relation \"%s\"", + RelationGetRelationName(relation)))); + break; + } + erm = (ExecRowMark *) palloc(sizeof(ExecRowMark)); erm->relation = relation; erm->rti = rc->rti; |