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-2022, 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 "storage/lmgr.h"
27 
28 static 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  */
40 table_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  */
60 try_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  */
83 table_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  */
102 Relation
103 table_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  */
125 void
126 table_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  */
137 static 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)
143  ereport(ERROR,
144  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
145  errmsg("cannot open relation \"%s\"",
148 }
int errcode(int sqlerrcode)
Definition: elog.c:858
int errmsg(const char *fmt,...)
Definition: elog.c:1069
#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:31
#define RelationGetRelationName(relation)
Definition: rel.h:535
Relation relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: relation.c:173
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: relation.c:206
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
Definition: relation.c:89
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition: relation.c:138
Relation relation_open(Oid relationId, LOCKMODE lockmode)
Definition: relation.c:48
Form_pg_class rd_rel
Definition: rel.h:110
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