PostgreSQL Source Code: src/backend/commands/lockcmds.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
16
29
35 List *ancestor_views);
36
37
38
39
40void
42{
44
45
46
47
49 {
51 bool recurse = rv->inh;
52 Oid reloid;
53
57 &lockstmt->mode);
58
61 else if (recurse)
63 }
64}
65
66
67
68
69
70static void
72 void *arg)
73{
75 char relkind;
76 char relpersistence;
78
80 return;
82 if (!relkind)
83 return;
84
85
86
87 if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE &&
88 relkind != RELKIND_VIEW)
90 (errcode(ERRCODE_WRONG_OBJECT_TYPE),
91 errmsg("cannot lock relation \"%s\"",
94
95
96
97
98
100 if (relpersistence == RELPERSISTENCE_TEMP)
102
103
107}
108
109
110
111
112
113
114
115
116static void
118{
119 List *children;
121
123
124 foreach(lc, children)
125 {
127
128
129 if (childreloid == reloid)
130 continue;
131
132 if (!nowait)
135 {
136
138
140 continue;
142 (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
143 errmsg("could not obtain lock on relation \"%s\"",
145 }
146
147
148
149
150
152 {
153
155 continue;
156 }
157 }
158}
159
160
161
162
163
164
165
166
167typedef struct
168{
175
176static bool
178{
179 if (node == NULL)
180 return false;
181
183 {
186
187 foreach(rtable, query->rtable)
188 {
191
192 Oid relid = rte->relid;
193 char relkind = rte->relkind;
195
196
197 if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE &&
198 relkind != RELKIND_VIEW)
199 continue;
200
201
202
203
204
206 continue;
207
208
209
210
211
216
217
218 if (!context->nowait)
222 (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
223 errmsg("could not obtain lock on relation \"%s\"",
225
226 if (relkind == RELKIND_VIEW)
229 else if (rte->inh)
231 }
232
235 context,
237 }
238
241 context);
242}
243
244static void
246 List *ancestor_views)
247{
250 Query *viewquery;
251
252
255
256
257
258
259
261 context.nowait = nowait;
264 else
266 context.viewoid = reloid;
268
270
272
274}
275
276
277
278
281{
284
285
287
288
291
292
295
297
298 return aclresult;
299}
AclMode aclmask(const Acl *acl, Oid roleid, Oid ownerId, AclMode mask, AclMaskHow how)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
#define OidIsValid(objectId)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
List * lappend_oid(List *list, Oid datum)
List * list_delete_last(List *list)
bool list_member_oid(const List *list, Oid datum)
bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
static AclResult LockTableAclCheck(Oid reloid, LOCKMODE lockmode, Oid userid)
static void RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
void LockTableCommand(LockStmt *lockstmt)
static void LockViewRecurse(Oid reloid, LOCKMODE lockmode, bool nowait, List *ancestor_views)
static bool LockViewRecurse_walker(Node *node, LockViewRecurse_context *context)
static void LockTableRecurse(Oid reloid, LOCKMODE lockmode, bool nowait)
char * get_rel_name(Oid relid)
char get_rel_persistence(Oid relid)
char get_rel_relkind(Oid relid)
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
#define query_tree_walker(q, w, c, f)
#define expression_tree_walker(n, w, c)
#define QTW_IGNORE_JOINALIASES
#define IsA(nodeptr, _type_)
ObjectType get_relkind_objtype(char relkind)
int errdetail_relkind_not_supported(char relkind)
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)
static Datum ObjectIdGetDatum(Oid X)
#define RelationHasSecurityInvoker(relation)
Query * get_view_query(Relation view)
#define SearchSysCacheExists1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
#define XACT_FLAGS_ACCESSEDTEMPNAMESPACE