PostgreSQL Source Code git master
table.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * table.c
4 * Generic routines for table related code.
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/access/table/table.c
12 *
13 *
14 * NOTES
15 * This file contains table_ routines that implement access to tables (in
16 * contrast to other relation types like indexes) that are independent of
17 * individual table access methods.
18 *
19 *-------------------------------------------------------------------------
20 */
21
22#include "postgres.h"
23
24#include "access/relation.h"
25#include "access/table.h"
26#include "utils/rel.h"
27
28static inline void validate_relation_kind(Relation r);
29
30/* ----------------
31 * table_open - open a table relation by relation OID
32 *
33 * This is essentially relation_open plus check that the relation
34 * is not an index nor a composite type. (The caller should also
35 * check that it's not a view or foreign table before assuming it has
36 * storage.)
37 * ----------------
38 */
40table_open(Oid relationId, LOCKMODE lockmode)
41{
42 Relation r;
43
44 r = relation_open(relationId, lockmode);
45
47
48 return r;
49}
50
51
52/* ----------------
53 * try_table_open - open a table relation by relation OID
54 *
55 * Same as table_open, except return NULL instead of failing
56 * if the relation does not exist.
57 * ----------------
58 */
60try_table_open(Oid relationId, LOCKMODE lockmode)
61{
62 Relation r;
63
64 r = try_relation_open(relationId, lockmode);
65
66 /* leave if table does not exist */
67 if (!r)
68 return NULL;
69
71
72 return r;
73}
74
75/* ----------------
76 * table_openrv - open a table relation specified
77 * by a RangeVar node
78 *
79 * As above, but relation is specified by a RangeVar.
80 * ----------------
81 */
83table_openrv(const RangeVar *relation, LOCKMODE lockmode)
84{
85 Relation r;
86
87 r = relation_openrv(relation, lockmode);
88
90
91 return r;
92}
93
94/* ----------------
95 * table_openrv_extended - open a table relation specified
96 * by a RangeVar node
97 *
98 * As above, but optionally return NULL instead of failing for
99 * relation-not-found.
100 * ----------------
101 */
103table_openrv_extended(const RangeVar *relation, LOCKMODE lockmode,
104 bool missing_ok)
105{
106 Relation r;
107
108 r = relation_openrv_extended(relation, lockmode, missing_ok);
109
110 if (r)
112
113 return r;
114}
115
116/* ----------------
117 * table_close - close a table
118 *
119 * If lockmode is not "NoLock", we then release the specified lock.
120 *
121 * Note that it is often sensible to hold a lock beyond relation_close;
122 * in that case, the lock is released automatically at xact end.
123 * ----------------
124 */
125void
126table_close(Relation relation, LOCKMODE lockmode)
127{
128 relation_close(relation, lockmode);
129}
130
131/* ----------------
132 * validate_relation_kind - check the relation's kind
133 *
134 * Make sure relkind is not index or composite type
135 * ----------------
136 */
137static inline void
139{
140 if (r->rd_rel->relkind == RELKIND_INDEX ||
141 r->rd_rel->relkind == RELKIND_PARTITIONED_INDEX ||
142 r->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
144 (errcode(ERRCODE_WRONG_OBJECT_TYPE),
145 errmsg("cannot open relation \"%s\"",
148}
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149
int LOCKMODE
Definition: lockdefs.h:26
int errdetail_relkind_not_supported(char relkind)
Definition: pg_class.c:24
unsigned int Oid
Definition: postgres_ext.h:32
#define RelationGetRelationName(relation)
Definition: rel.h:539
Relation relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: relation.c:172
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: relation.c:205
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
Definition: relation.c:88
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition: relation.c:137
Relation relation_open(Oid relationId, LOCKMODE lockmode)
Definition: relation.c:47
Form_pg_class rd_rel
Definition: rel.h:111
Relation try_table_open(Oid relationId, LOCKMODE lockmode)
Definition: table.c:60
static void validate_relation_kind(Relation r)
Definition: table.c:138
void table_close(Relation relation, LOCKMODE lockmode)
Definition: table.c:126
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition: table.c:40
Relation table_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition: table.c:83
Relation table_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: table.c:103