mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-03 00:06:52 +02:00
137 lines
3.5 KiB
C
137 lines
3.5 KiB
C
|
/*-------------------------------------------------------------------------
|
||
|
*
|
||
|
* table.c
|
||
|
* Generic routines for table related code.
|
||
|
*
|
||
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
||
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||
|
*
|
||
|
*
|
||
|
* IDENTIFICATION
|
||
|
* src/backend/access/table/table.c
|
||
|
*
|
||
|
*
|
||
|
* NOTES
|
||
|
* This file contains table_ routines that implement access to tables (in
|
||
|
* contrast to other relation types like indexes) that are independent of
|
||
|
* individual table access methods.
|
||
|
*
|
||
|
*-------------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
#include "postgres.h"
|
||
|
|
||
|
#include "access/relation.h"
|
||
|
#include "access/table.h"
|
||
|
#include "storage/lmgr.h"
|
||
|
|
||
|
|
||
|
/* ----------------
|
||
|
* table_open - open a table relation by relation OID
|
||
|
*
|
||
|
* This is essentially relation_open plus check that the relation
|
||
|
* is not an index nor a composite type. (The caller should also
|
||
|
* check that it's not a view or foreign table before assuming it has
|
||
|
* storage.)
|
||
|
* ----------------
|
||
|
*/
|
||
|
Relation
|
||
|
table_open(Oid relationId, LOCKMODE lockmode)
|
||
|
{
|
||
|
Relation r;
|
||
|
|
||
|
r = relation_open(relationId, lockmode);
|
||
|
|
||
|
if (r->rd_rel->relkind == RELKIND_INDEX ||
|
||
|
r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
|
||
|
ereport(ERROR,
|
||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||
|
errmsg("\"%s\" is an index",
|
||
|
RelationGetRelationName(r))));
|
||
|
else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
|
||
|
ereport(ERROR,
|
||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||
|
errmsg("\"%s\" is a composite type",
|
||
|
RelationGetRelationName(r))));
|
||
|
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/* ----------------
|
||
|
* table_openrv - open a table relation specified
|
||
|
* by a RangeVar node
|
||
|
*
|
||
|
* As above, but relation is specified by a RangeVar.
|
||
|
* ----------------
|
||
|
*/
|
||
|
Relation
|
||
|
table_openrv(const RangeVar *relation, LOCKMODE lockmode)
|
||
|
{
|
||
|
Relation r;
|
||
|
|
||
|
r = relation_openrv(relation, lockmode);
|
||
|
|
||
|
if (r->rd_rel->relkind == RELKIND_INDEX ||
|
||
|
r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
|
||
|
ereport(ERROR,
|
||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||
|
errmsg("\"%s\" is an index",
|
||
|
RelationGetRelationName(r))));
|
||
|
else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
|
||
|
ereport(ERROR,
|
||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||
|
errmsg("\"%s\" is a composite type",
|
||
|
RelationGetRelationName(r))));
|
||
|
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/* ----------------
|
||
|
* table_openrv_extended - open a table relation specified
|
||
|
* by a RangeVar node
|
||
|
*
|
||
|
* As above, but optionally return NULL instead of failing for
|
||
|
* relation-not-found.
|
||
|
* ----------------
|
||
|
*/
|
||
|
Relation
|
||
|
table_openrv_extended(const RangeVar *relation, LOCKMODE lockmode,
|
||
|
bool missing_ok)
|
||
|
{
|
||
|
Relation r;
|
||
|
|
||
|
r = relation_openrv_extended(relation, lockmode, missing_ok);
|
||
|
|
||
|
if (r)
|
||
|
{
|
||
|
if (r->rd_rel->relkind == RELKIND_INDEX ||
|
||
|
r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
|
||
|
ereport(ERROR,
|
||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||
|
errmsg("\"%s\" is an index",
|
||
|
RelationGetRelationName(r))));
|
||
|
else if (r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
|
||
|
ereport(ERROR,
|
||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||
|
errmsg("\"%s\" is a composite type",
|
||
|
RelationGetRelationName(r))));
|
||
|
}
|
||
|
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/* ----------------
|
||
|
* table_close - close a table
|
||
|
*
|
||
|
* If lockmode is not "NoLock", we then release the specified lock.
|
||
|
*
|
||
|
* Note that it is often sensible to hold a lock beyond relation_close;
|
||
|
* in that case, the lock is released automatically at xact end.
|
||
|
* ----------------
|
||
|
*/
|
||
|
void
|
||
|
table_close(Relation relation, LOCKMODE lockmode)
|
||
|
{
|
||
|
relation_close(relation, lockmode);
|
||
|
}
|