/src/postgres/src/include/utils/rel.h
Line | Count | Source (jump to first uncovered line) |
1 | | /*------------------------------------------------------------------------- |
2 | | * |
3 | | * rel.h |
4 | | * POSTGRES relation descriptor (a/k/a relcache entry) definitions. |
5 | | * |
6 | | * |
7 | | * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group |
8 | | * Portions Copyright (c) 1994, Regents of the University of California |
9 | | * |
10 | | * src/include/utils/rel.h |
11 | | * |
12 | | *------------------------------------------------------------------------- |
13 | | */ |
14 | | #ifndef REL_H |
15 | | #define REL_H |
16 | | |
17 | | #include "access/tupdesc.h" |
18 | | #include "access/xlog.h" |
19 | | #include "catalog/catalog.h" |
20 | | #include "catalog/pg_class.h" |
21 | | #include "catalog/pg_index.h" |
22 | | #include "catalog/pg_publication.h" |
23 | | #include "nodes/bitmapset.h" |
24 | | #include "partitioning/partdefs.h" |
25 | | #include "rewrite/prs2lock.h" |
26 | | #include "storage/block.h" |
27 | | #include "storage/relfilelocator.h" |
28 | | #include "storage/smgr.h" |
29 | | #include "utils/relcache.h" |
30 | | #include "utils/reltrigger.h" |
31 | | |
32 | | |
33 | | /* |
34 | | * LockRelId and LockInfo really belong to lmgr.h, but it's more convenient |
35 | | * to declare them here so we can have a LockInfoData field in a Relation. |
36 | | */ |
37 | | |
38 | | typedef struct LockRelId |
39 | | { |
40 | | Oid relId; /* a relation identifier */ |
41 | | Oid dbId; /* a database identifier */ |
42 | | } LockRelId; |
43 | | |
44 | | typedef struct LockInfoData |
45 | | { |
46 | | LockRelId lockRelId; |
47 | | } LockInfoData; |
48 | | |
49 | | typedef LockInfoData *LockInfo; |
50 | | |
51 | | /* |
52 | | * Here are the contents of a relation cache entry. |
53 | | */ |
54 | | |
55 | | typedef struct RelationData |
56 | | { |
57 | | RelFileLocator rd_locator; /* relation physical identifier */ |
58 | | SMgrRelation rd_smgr; /* cached file handle, or NULL */ |
59 | | int rd_refcnt; /* reference count */ |
60 | | ProcNumber rd_backend; /* owning backend's proc number, if temp rel */ |
61 | | bool rd_islocaltemp; /* rel is a temp rel of this session */ |
62 | | bool rd_isnailed; /* rel is nailed in cache */ |
63 | | bool rd_isvalid; /* relcache entry is valid */ |
64 | | bool rd_indexvalid; /* is rd_indexlist valid? (also rd_pkindex and |
65 | | * rd_replidindex) */ |
66 | | bool rd_statvalid; /* is rd_statlist valid? */ |
67 | | |
68 | | /*---------- |
69 | | * rd_createSubid is the ID of the highest subtransaction the rel has |
70 | | * survived into or zero if the rel or its storage was created before the |
71 | | * current top transaction. (IndexStmt.oldNumber leads to the case of a new |
72 | | * rel with an old rd_locator.) rd_firstRelfilelocatorSubid is the ID of the |
73 | | * highest subtransaction an rd_locator change has survived into or zero if |
74 | | * rd_locator matches the value it had at the start of the current top |
75 | | * transaction. (Rolling back the subtransaction that |
76 | | * rd_firstRelfilelocatorSubid denotes would restore rd_locator to the value it |
77 | | * had at the start of the current top transaction. Rolling back any |
78 | | * lower subtransaction would not.) Their accuracy is critical to |
79 | | * RelationNeedsWAL(). |
80 | | * |
81 | | * rd_newRelfilelocatorSubid is the ID of the highest subtransaction the |
82 | | * most-recent relfilenumber change has survived into or zero if not changed |
83 | | * in the current transaction (or we have forgotten changing it). This |
84 | | * field is accurate when non-zero, but it can be zero when a relation has |
85 | | * multiple new relfilenumbers within a single transaction, with one of them |
86 | | * occurring in a subsequently aborted subtransaction, e.g. |
87 | | * BEGIN; |
88 | | * TRUNCATE t; |
89 | | * SAVEPOINT save; |
90 | | * TRUNCATE t; |
91 | | * ROLLBACK TO save; |
92 | | * -- rd_newRelfilelocatorSubid is now forgotten |
93 | | * |
94 | | * If every rd_*Subid field is zero, they are read-only outside |
95 | | * relcache.c. Files that trigger rd_locator changes by updating |
96 | | * pg_class.reltablespace and/or pg_class.relfilenode call |
97 | | * RelationAssumeNewRelfilelocator() to update rd_*Subid. |
98 | | * |
99 | | * rd_droppedSubid is the ID of the highest subtransaction that a drop of |
100 | | * the rel has survived into. In entries visible outside relcache.c, this |
101 | | * is always zero. |
102 | | */ |
103 | | SubTransactionId rd_createSubid; /* rel was created in current xact */ |
104 | | SubTransactionId rd_newRelfilelocatorSubid; /* highest subxact changing |
105 | | * rd_locator to current value */ |
106 | | SubTransactionId rd_firstRelfilelocatorSubid; /* highest subxact |
107 | | * changing rd_locator to |
108 | | * any value */ |
109 | | SubTransactionId rd_droppedSubid; /* dropped with another Subid set */ |
110 | | |
111 | | Form_pg_class rd_rel; /* RELATION tuple */ |
112 | | TupleDesc rd_att; /* tuple descriptor */ |
113 | | Oid rd_id; /* relation's object id */ |
114 | | LockInfoData rd_lockInfo; /* lock mgr's info for locking relation */ |
115 | | RuleLock *rd_rules; /* rewrite rules */ |
116 | | MemoryContext rd_rulescxt; /* private memory cxt for rd_rules, if any */ |
117 | | TriggerDesc *trigdesc; /* Trigger info, or NULL if rel has none */ |
118 | | /* use "struct" here to avoid needing to include rowsecurity.h: */ |
119 | | struct RowSecurityDesc *rd_rsdesc; /* row security policies, or NULL */ |
120 | | |
121 | | /* data managed by RelationGetFKeyList: */ |
122 | | List *rd_fkeylist; /* list of ForeignKeyCacheInfo (see below) */ |
123 | | bool rd_fkeyvalid; /* true if list has been computed */ |
124 | | |
125 | | /* data managed by RelationGetPartitionKey: */ |
126 | | PartitionKey rd_partkey; /* partition key, or NULL */ |
127 | | MemoryContext rd_partkeycxt; /* private context for rd_partkey, if any */ |
128 | | |
129 | | /* data managed by RelationGetPartitionDesc: */ |
130 | | PartitionDesc rd_partdesc; /* partition descriptor, or NULL */ |
131 | | MemoryContext rd_pdcxt; /* private context for rd_partdesc, if any */ |
132 | | |
133 | | /* Same as above, for partdescs that omit detached partitions */ |
134 | | PartitionDesc rd_partdesc_nodetached; /* partdesc w/o detached parts */ |
135 | | MemoryContext rd_pddcxt; /* for rd_partdesc_nodetached, if any */ |
136 | | |
137 | | /* |
138 | | * pg_inherits.xmin of the partition that was excluded in |
139 | | * rd_partdesc_nodetached. This informs a future user of that partdesc: |
140 | | * if this value is not in progress for the active snapshot, then the |
141 | | * partdesc can be used, otherwise they have to build a new one. (This |
142 | | * matches what find_inheritance_children_extended would do). |
143 | | */ |
144 | | TransactionId rd_partdesc_nodetached_xmin; |
145 | | |
146 | | /* data managed by RelationGetPartitionQual: */ |
147 | | List *rd_partcheck; /* partition CHECK quals */ |
148 | | bool rd_partcheckvalid; /* true if list has been computed */ |
149 | | MemoryContext rd_partcheckcxt; /* private cxt for rd_partcheck, if any */ |
150 | | |
151 | | /* data managed by RelationGetIndexList: */ |
152 | | List *rd_indexlist; /* list of OIDs of indexes on relation */ |
153 | | Oid rd_pkindex; /* OID of (deferrable?) primary key, if any */ |
154 | | bool rd_ispkdeferrable; /* is rd_pkindex a deferrable PK? */ |
155 | | Oid rd_replidindex; /* OID of replica identity index, if any */ |
156 | | |
157 | | /* data managed by RelationGetStatExtList: */ |
158 | | List *rd_statlist; /* list of OIDs of extended stats */ |
159 | | |
160 | | /* data managed by RelationGetIndexAttrBitmap: */ |
161 | | bool rd_attrsvalid; /* are bitmaps of attrs valid? */ |
162 | | Bitmapset *rd_keyattr; /* cols that can be ref'd by foreign keys */ |
163 | | Bitmapset *rd_pkattr; /* cols included in primary key */ |
164 | | Bitmapset *rd_idattr; /* included in replica identity index */ |
165 | | Bitmapset *rd_hotblockingattr; /* cols blocking HOT update */ |
166 | | Bitmapset *rd_summarizedattr; /* cols indexed by summarizing indexes */ |
167 | | |
168 | | PublicationDesc *rd_pubdesc; /* publication descriptor, or NULL */ |
169 | | |
170 | | /* |
171 | | * rd_options is set whenever rd_rel is loaded into the relcache entry. |
172 | | * Note that you can NOT look into rd_rel for this data. NULL means "use |
173 | | * defaults". |
174 | | */ |
175 | | bytea *rd_options; /* parsed pg_class.reloptions */ |
176 | | |
177 | | /* |
178 | | * Oid of the handler for this relation. For an index this is a function |
179 | | * returning IndexAmRoutine, for table like relations a function returning |
180 | | * TableAmRoutine. This is stored separately from rd_indam, rd_tableam as |
181 | | * its lookup requires syscache access, but during relcache bootstrap we |
182 | | * need to be able to initialize rd_tableam without syscache lookups. |
183 | | */ |
184 | | Oid rd_amhandler; /* OID of index AM's handler function */ |
185 | | |
186 | | /* |
187 | | * Table access method. |
188 | | */ |
189 | | const struct TableAmRoutine *rd_tableam; |
190 | | |
191 | | /* These are non-NULL only for an index relation: */ |
192 | | Form_pg_index rd_index; /* pg_index tuple describing this index */ |
193 | | /* use "struct" here to avoid needing to include htup.h: */ |
194 | | struct HeapTupleData *rd_indextuple; /* all of pg_index tuple */ |
195 | | |
196 | | /* |
197 | | * index access support info (used only for an index relation) |
198 | | * |
199 | | * Note: only default support procs for each opclass are cached, namely |
200 | | * those with lefttype and righttype equal to the opclass's opcintype. The |
201 | | * arrays are indexed by support function number, which is a sufficient |
202 | | * identifier given that restriction. |
203 | | */ |
204 | | MemoryContext rd_indexcxt; /* private memory cxt for this stuff */ |
205 | | /* use "struct" here to avoid needing to include amapi.h: */ |
206 | | struct IndexAmRoutine *rd_indam; /* index AM's API struct */ |
207 | | Oid *rd_opfamily; /* OIDs of op families for each index col */ |
208 | | Oid *rd_opcintype; /* OIDs of opclass declared input data types */ |
209 | | RegProcedure *rd_support; /* OIDs of support procedures */ |
210 | | struct FmgrInfo *rd_supportinfo; /* lookup info for support procedures */ |
211 | | int16 *rd_indoption; /* per-column AM-specific flags */ |
212 | | List *rd_indexprs; /* index expression trees, if any */ |
213 | | List *rd_indpred; /* index predicate tree, if any */ |
214 | | Oid *rd_exclops; /* OIDs of exclusion operators, if any */ |
215 | | Oid *rd_exclprocs; /* OIDs of exclusion ops' procs, if any */ |
216 | | uint16 *rd_exclstrats; /* exclusion ops' strategy numbers, if any */ |
217 | | Oid *rd_indcollation; /* OIDs of index collations */ |
218 | | bytea **rd_opcoptions; /* parsed opclass-specific options */ |
219 | | |
220 | | /* |
221 | | * rd_amcache is available for index and table AMs to cache private data |
222 | | * about the relation. This must be just a cache since it may get reset |
223 | | * at any time (in particular, it will get reset by a relcache inval |
224 | | * message for the relation). If used, it must point to a single memory |
225 | | * chunk palloc'd in CacheMemoryContext, or in rd_indexcxt for an index |
226 | | * relation. A relcache reset will include freeing that chunk and setting |
227 | | * rd_amcache = NULL. |
228 | | */ |
229 | | void *rd_amcache; /* available for use by index/table AM */ |
230 | | |
231 | | /* |
232 | | * foreign-table support |
233 | | * |
234 | | * rd_fdwroutine must point to a single memory chunk palloc'd in |
235 | | * CacheMemoryContext. It will be freed and reset to NULL on a relcache |
236 | | * reset. |
237 | | */ |
238 | | |
239 | | /* use "struct" here to avoid needing to include fdwapi.h: */ |
240 | | struct FdwRoutine *rd_fdwroutine; /* cached function pointers, or NULL */ |
241 | | |
242 | | /* |
243 | | * Hack for CLUSTER, rewriting ALTER TABLE, etc: when writing a new |
244 | | * version of a table, we need to make any toast pointers inserted into it |
245 | | * have the existing toast table's OID, not the OID of the transient toast |
246 | | * table. If rd_toastoid isn't InvalidOid, it is the OID to place in |
247 | | * toast pointers inserted into this rel. (Note it's set on the new |
248 | | * version of the main heap, not the toast table itself.) This also |
249 | | * causes toast_save_datum() to try to preserve toast value OIDs. |
250 | | */ |
251 | | Oid rd_toastoid; /* Real TOAST table's OID, or InvalidOid */ |
252 | | |
253 | | bool pgstat_enabled; /* should relation stats be counted */ |
254 | | /* use "struct" here to avoid needing to include pgstat.h: */ |
255 | | struct PgStat_TableStatus *pgstat_info; /* statistics collection area */ |
256 | | } RelationData; |
257 | | |
258 | | |
259 | | /* |
260 | | * ForeignKeyCacheInfo |
261 | | * Information the relcache can cache about foreign key constraints |
262 | | * |
263 | | * This is basically just an image of relevant columns from pg_constraint. |
264 | | * We make it a subclass of Node so that copyObject() can be used on a list |
265 | | * of these, but we also ensure it is a "flat" object without substructure, |
266 | | * so that list_free_deep() is sufficient to free such a list. |
267 | | * The per-FK-column arrays can be fixed-size because we allow at most |
268 | | * INDEX_MAX_KEYS columns in a foreign key constraint. |
269 | | * |
270 | | * Currently, we mostly cache fields of interest to the planner, but the set |
271 | | * of fields has already grown the constraint OID for other uses. |
272 | | */ |
273 | | typedef struct ForeignKeyCacheInfo |
274 | | { |
275 | | pg_node_attr(no_equal, no_read, no_query_jumble) |
276 | | |
277 | | NodeTag type; |
278 | | /* oid of the constraint itself */ |
279 | | Oid conoid; |
280 | | /* relation constrained by the foreign key */ |
281 | | Oid conrelid; |
282 | | /* relation referenced by the foreign key */ |
283 | | Oid confrelid; |
284 | | /* number of columns in the foreign key */ |
285 | | int nkeys; |
286 | | |
287 | | /* Is enforced ? */ |
288 | | bool conenforced; |
289 | | |
290 | | /* |
291 | | * these arrays each have nkeys valid entries: |
292 | | */ |
293 | | /* cols in referencing table */ |
294 | | AttrNumber conkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys)); |
295 | | /* cols in referenced table */ |
296 | | AttrNumber confkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys)); |
297 | | /* PK = FK operator OIDs */ |
298 | | Oid conpfeqop[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys)); |
299 | | } ForeignKeyCacheInfo; |
300 | | |
301 | | |
302 | | /* |
303 | | * StdRdOptions |
304 | | * Standard contents of rd_options for heaps. |
305 | | * |
306 | | * RelationGetFillFactor() and RelationGetTargetPageFreeSpace() can only |
307 | | * be applied to relations that use this format or a superset for |
308 | | * private options data. |
309 | | */ |
310 | | /* autovacuum-related reloptions. */ |
311 | | typedef struct AutoVacOpts |
312 | | { |
313 | | bool enabled; |
314 | | int vacuum_threshold; |
315 | | int vacuum_max_threshold; |
316 | | int vacuum_ins_threshold; |
317 | | int analyze_threshold; |
318 | | int vacuum_cost_limit; |
319 | | int freeze_min_age; |
320 | | int freeze_max_age; |
321 | | int freeze_table_age; |
322 | | int multixact_freeze_min_age; |
323 | | int multixact_freeze_max_age; |
324 | | int multixact_freeze_table_age; |
325 | | int log_min_duration; |
326 | | float8 vacuum_cost_delay; |
327 | | float8 vacuum_scale_factor; |
328 | | float8 vacuum_ins_scale_factor; |
329 | | float8 analyze_scale_factor; |
330 | | } AutoVacOpts; |
331 | | |
332 | | /* StdRdOptions->vacuum_index_cleanup values */ |
333 | | typedef enum StdRdOptIndexCleanup |
334 | | { |
335 | | STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO = 0, |
336 | | STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF, |
337 | | STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON, |
338 | | } StdRdOptIndexCleanup; |
339 | | |
340 | | typedef struct StdRdOptions |
341 | | { |
342 | | int32 vl_len_; /* varlena header (do not touch directly!) */ |
343 | | int fillfactor; /* page fill factor in percent (0..100) */ |
344 | | int toast_tuple_target; /* target for tuple toasting */ |
345 | | AutoVacOpts autovacuum; /* autovacuum-related options */ |
346 | | bool user_catalog_table; /* use as an additional catalog relation */ |
347 | | int parallel_workers; /* max number of parallel workers */ |
348 | | StdRdOptIndexCleanup vacuum_index_cleanup; /* controls index vacuuming */ |
349 | | bool vacuum_truncate; /* enables vacuum to truncate a relation */ |
350 | | bool vacuum_truncate_set; /* whether vacuum_truncate is set */ |
351 | | |
352 | | /* |
353 | | * Fraction of pages in a relation that vacuum can eagerly scan and fail |
354 | | * to freeze. 0 if disabled, -1 if unspecified. |
355 | | */ |
356 | | double vacuum_max_eager_freeze_failure_rate; |
357 | | } StdRdOptions; |
358 | | |
359 | | #define HEAP_MIN_FILLFACTOR 10 |
360 | | #define HEAP_DEFAULT_FILLFACTOR 100 |
361 | | |
362 | | /* |
363 | | * RelationGetToastTupleTarget |
364 | | * Returns the relation's toast_tuple_target. Note multiple eval of argument! |
365 | | */ |
366 | | #define RelationGetToastTupleTarget(relation, defaulttarg) \ |
367 | 0 | ((relation)->rd_options ? \ |
368 | 0 | ((StdRdOptions *) (relation)->rd_options)->toast_tuple_target : (defaulttarg)) |
369 | | |
370 | | /* |
371 | | * RelationGetFillFactor |
372 | | * Returns the relation's fillfactor. Note multiple eval of argument! |
373 | | */ |
374 | | #define RelationGetFillFactor(relation, defaultff) \ |
375 | 0 | ((relation)->rd_options ? \ |
376 | 0 | ((StdRdOptions *) (relation)->rd_options)->fillfactor : (defaultff)) |
377 | | |
378 | | /* |
379 | | * RelationGetTargetPageUsage |
380 | | * Returns the relation's desired space usage per page in bytes. |
381 | | */ |
382 | | #define RelationGetTargetPageUsage(relation, defaultff) \ |
383 | | (BLCKSZ * RelationGetFillFactor(relation, defaultff) / 100) |
384 | | |
385 | | /* |
386 | | * RelationGetTargetPageFreeSpace |
387 | | * Returns the relation's desired freespace per page in bytes. |
388 | | */ |
389 | | #define RelationGetTargetPageFreeSpace(relation, defaultff) \ |
390 | 0 | (BLCKSZ * (100 - RelationGetFillFactor(relation, defaultff)) / 100) |
391 | | |
392 | | /* |
393 | | * RelationIsUsedAsCatalogTable |
394 | | * Returns whether the relation should be treated as a catalog table |
395 | | * from the pov of logical decoding. Note multiple eval of argument! |
396 | | */ |
397 | | #define RelationIsUsedAsCatalogTable(relation) \ |
398 | 0 | ((relation)->rd_options && \ |
399 | 0 | ((relation)->rd_rel->relkind == RELKIND_RELATION || \ |
400 | 0 | (relation)->rd_rel->relkind == RELKIND_MATVIEW) ? \ |
401 | 0 | ((StdRdOptions *) (relation)->rd_options)->user_catalog_table : false) |
402 | | |
403 | | /* |
404 | | * RelationGetParallelWorkers |
405 | | * Returns the relation's parallel_workers reloption setting. |
406 | | * Note multiple eval of argument! |
407 | | */ |
408 | | #define RelationGetParallelWorkers(relation, defaultpw) \ |
409 | 0 | ((relation)->rd_options ? \ |
410 | 0 | ((StdRdOptions *) (relation)->rd_options)->parallel_workers : (defaultpw)) |
411 | | |
412 | | /* ViewOptions->check_option values */ |
413 | | typedef enum ViewOptCheckOption |
414 | | { |
415 | | VIEW_OPTION_CHECK_OPTION_NOT_SET, |
416 | | VIEW_OPTION_CHECK_OPTION_LOCAL, |
417 | | VIEW_OPTION_CHECK_OPTION_CASCADED, |
418 | | } ViewOptCheckOption; |
419 | | |
420 | | /* |
421 | | * ViewOptions |
422 | | * Contents of rd_options for views |
423 | | */ |
424 | | typedef struct ViewOptions |
425 | | { |
426 | | int32 vl_len_; /* varlena header (do not touch directly!) */ |
427 | | bool security_barrier; |
428 | | bool security_invoker; |
429 | | ViewOptCheckOption check_option; |
430 | | } ViewOptions; |
431 | | |
432 | | /* |
433 | | * RelationIsSecurityView |
434 | | * Returns whether the relation is security view, or not. Note multiple |
435 | | * eval of argument! |
436 | | */ |
437 | | #define RelationIsSecurityView(relation) \ |
438 | 0 | (AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \ |
439 | 0 | (relation)->rd_options ? \ |
440 | 0 | ((ViewOptions *) (relation)->rd_options)->security_barrier : false) |
441 | | |
442 | | /* |
443 | | * RelationHasSecurityInvoker |
444 | | * Returns true if the relation has the security_invoker property set. |
445 | | * Note multiple eval of argument! |
446 | | */ |
447 | | #define RelationHasSecurityInvoker(relation) \ |
448 | 0 | (AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \ |
449 | 0 | (relation)->rd_options ? \ |
450 | 0 | ((ViewOptions *) (relation)->rd_options)->security_invoker : false) |
451 | | |
452 | | /* |
453 | | * RelationHasCheckOption |
454 | | * Returns true if the relation is a view defined with either the local |
455 | | * or the cascaded check option. Note multiple eval of argument! |
456 | | */ |
457 | | #define RelationHasCheckOption(relation) \ |
458 | 0 | (AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \ |
459 | 0 | (relation)->rd_options && \ |
460 | 0 | ((ViewOptions *) (relation)->rd_options)->check_option != \ |
461 | 0 | VIEW_OPTION_CHECK_OPTION_NOT_SET) |
462 | | |
463 | | /* |
464 | | * RelationHasLocalCheckOption |
465 | | * Returns true if the relation is a view defined with the local check |
466 | | * option. Note multiple eval of argument! |
467 | | */ |
468 | | #define RelationHasLocalCheckOption(relation) \ |
469 | | (AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \ |
470 | | (relation)->rd_options && \ |
471 | | ((ViewOptions *) (relation)->rd_options)->check_option == \ |
472 | | VIEW_OPTION_CHECK_OPTION_LOCAL) |
473 | | |
474 | | /* |
475 | | * RelationHasCascadedCheckOption |
476 | | * Returns true if the relation is a view defined with the cascaded check |
477 | | * option. Note multiple eval of argument! |
478 | | */ |
479 | | #define RelationHasCascadedCheckOption(relation) \ |
480 | 0 | (AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \ |
481 | 0 | (relation)->rd_options && \ |
482 | 0 | ((ViewOptions *) (relation)->rd_options)->check_option == \ |
483 | 0 | VIEW_OPTION_CHECK_OPTION_CASCADED) |
484 | | |
485 | | /* |
486 | | * RelationIsValid |
487 | | * True iff relation descriptor is valid. |
488 | | */ |
489 | 0 | #define RelationIsValid(relation) PointerIsValid(relation) |
490 | | |
491 | | #define InvalidRelation ((Relation) NULL) |
492 | | |
493 | | /* |
494 | | * RelationHasReferenceCountZero |
495 | | * True iff relation reference count is zero. |
496 | | * |
497 | | * Note: |
498 | | * Assumes relation descriptor is valid. |
499 | | */ |
500 | | #define RelationHasReferenceCountZero(relation) \ |
501 | 0 | ((bool)((relation)->rd_refcnt == 0)) |
502 | | |
503 | | /* |
504 | | * RelationGetForm |
505 | | * Returns pg_class tuple for a relation. |
506 | | * |
507 | | * Note: |
508 | | * Assumes relation descriptor is valid. |
509 | | */ |
510 | 0 | #define RelationGetForm(relation) ((relation)->rd_rel) |
511 | | |
512 | | /* |
513 | | * RelationGetRelid |
514 | | * Returns the OID of the relation |
515 | | */ |
516 | 0 | #define RelationGetRelid(relation) ((relation)->rd_id) |
517 | | |
518 | | /* |
519 | | * RelationGetNumberOfAttributes |
520 | | * Returns the total number of attributes in a relation. |
521 | | */ |
522 | 0 | #define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts) |
523 | | |
524 | | /* |
525 | | * IndexRelationGetNumberOfAttributes |
526 | | * Returns the number of attributes in an index. |
527 | | */ |
528 | | #define IndexRelationGetNumberOfAttributes(relation) \ |
529 | 0 | ((relation)->rd_index->indnatts) |
530 | | |
531 | | /* |
532 | | * IndexRelationGetNumberOfKeyAttributes |
533 | | * Returns the number of key attributes in an index. |
534 | | */ |
535 | | #define IndexRelationGetNumberOfKeyAttributes(relation) \ |
536 | 0 | ((relation)->rd_index->indnkeyatts) |
537 | | |
538 | | /* |
539 | | * RelationGetDescr |
540 | | * Returns tuple descriptor for a relation. |
541 | | */ |
542 | 0 | #define RelationGetDescr(relation) ((relation)->rd_att) |
543 | | |
544 | | /* |
545 | | * RelationGetRelationName |
546 | | * Returns the rel's name. |
547 | | * |
548 | | * Note that the name is only unique within the containing namespace. |
549 | | */ |
550 | | #define RelationGetRelationName(relation) \ |
551 | 0 | (NameStr((relation)->rd_rel->relname)) |
552 | | |
553 | | /* |
554 | | * RelationGetNamespace |
555 | | * Returns the rel's namespace OID. |
556 | | */ |
557 | | #define RelationGetNamespace(relation) \ |
558 | 0 | ((relation)->rd_rel->relnamespace) |
559 | | |
560 | | /* |
561 | | * RelationIsMapped |
562 | | * True if the relation uses the relfilenumber map. Note multiple eval |
563 | | * of argument! |
564 | | */ |
565 | | #define RelationIsMapped(relation) \ |
566 | 0 | (RELKIND_HAS_STORAGE((relation)->rd_rel->relkind) && \ |
567 | 0 | ((relation)->rd_rel->relfilenode == InvalidRelFileNumber)) |
568 | | |
569 | | #ifndef FRONTEND |
570 | | /* |
571 | | * RelationGetSmgr |
572 | | * Returns smgr file handle for a relation, opening it if needed. |
573 | | * |
574 | | * Very little code is authorized to touch rel->rd_smgr directly. Instead |
575 | | * use this function to fetch its value. |
576 | | */ |
577 | | static inline SMgrRelation |
578 | | RelationGetSmgr(Relation rel) |
579 | 0 | { |
580 | 0 | if (unlikely(rel->rd_smgr == NULL)) |
581 | 0 | { |
582 | 0 | rel->rd_smgr = smgropen(rel->rd_locator, rel->rd_backend); |
583 | 0 | smgrpin(rel->rd_smgr); |
584 | 0 | } |
585 | 0 | return rel->rd_smgr; |
586 | 0 | } Unexecuted instantiation: fuzzer_initialize.c:RelationGetSmgr Unexecuted instantiation: brin.c:RelationGetSmgr Unexecuted instantiation: brin_bloom.c:RelationGetSmgr Unexecuted instantiation: brin_inclusion.c:RelationGetSmgr Unexecuted instantiation: brin_minmax.c:RelationGetSmgr Unexecuted instantiation: brin_minmax_multi.c:RelationGetSmgr Unexecuted instantiation: brin_pageops.c:RelationGetSmgr Unexecuted instantiation: brin_revmap.c:RelationGetSmgr Unexecuted instantiation: detoast.c:RelationGetSmgr Unexecuted instantiation: relation.c:RelationGetSmgr Unexecuted instantiation: reloptions.c:RelationGetSmgr Unexecuted instantiation: syncscan.c:RelationGetSmgr Unexecuted instantiation: toast_internals.c:RelationGetSmgr Unexecuted instantiation: ginbtree.c:RelationGetSmgr Unexecuted instantiation: gindatapage.c:RelationGetSmgr Unexecuted instantiation: ginentrypage.c:RelationGetSmgr Unexecuted instantiation: ginfast.c:RelationGetSmgr Unexecuted instantiation: ginget.c:RelationGetSmgr Unexecuted instantiation: gininsert.c:RelationGetSmgr Unexecuted instantiation: ginscan.c:RelationGetSmgr Unexecuted instantiation: ginutil.c:RelationGetSmgr Unexecuted instantiation: ginvacuum.c:RelationGetSmgr Unexecuted instantiation: gist.c:RelationGetSmgr Unexecuted instantiation: gistbuild.c:RelationGetSmgr Unexecuted instantiation: gistbuildbuffers.c:RelationGetSmgr Unexecuted instantiation: gistget.c:RelationGetSmgr Unexecuted instantiation: gistscan.c:RelationGetSmgr Unexecuted instantiation: gistsplit.c:RelationGetSmgr Unexecuted instantiation: gistutil.c:RelationGetSmgr Unexecuted instantiation: gistvacuum.c:RelationGetSmgr Unexecuted instantiation: gistxlog.c:RelationGetSmgr Unexecuted instantiation: hash.c:RelationGetSmgr Unexecuted instantiation: hashinsert.c:RelationGetSmgr Unexecuted instantiation: hashovfl.c:RelationGetSmgr Unexecuted instantiation: hashpage.c:RelationGetSmgr Unexecuted instantiation: hashsearch.c:RelationGetSmgr Unexecuted instantiation: hashutil.c:RelationGetSmgr Unexecuted instantiation: heapam.c:RelationGetSmgr Unexecuted instantiation: heapam_handler.c:RelationGetSmgr Unexecuted instantiation: heapam_visibility.c:RelationGetSmgr Unexecuted instantiation: heapam_xlog.c:RelationGetSmgr Unexecuted instantiation: heaptoast.c:RelationGetSmgr Unexecuted instantiation: hio.c:RelationGetSmgr Unexecuted instantiation: pruneheap.c:RelationGetSmgr Unexecuted instantiation: rewriteheap.c:RelationGetSmgr Unexecuted instantiation: vacuumlazy.c:RelationGetSmgr Unexecuted instantiation: visibilitymap.c:RelationGetSmgr Unexecuted instantiation: genam.c:RelationGetSmgr Unexecuted instantiation: indexam.c:RelationGetSmgr Unexecuted instantiation: nbtdedup.c:RelationGetSmgr Unexecuted instantiation: nbtinsert.c:RelationGetSmgr Unexecuted instantiation: nbtpage.c:RelationGetSmgr Unexecuted instantiation: nbtpreprocesskeys.c:RelationGetSmgr Unexecuted instantiation: nbtree.c:RelationGetSmgr Unexecuted instantiation: nbtsearch.c:RelationGetSmgr Unexecuted instantiation: nbtsort.c:RelationGetSmgr Unexecuted instantiation: nbtsplitloc.c:RelationGetSmgr Unexecuted instantiation: nbtutils.c:RelationGetSmgr Unexecuted instantiation: nbtvalidate.c:RelationGetSmgr Unexecuted instantiation: nbtxlog.c:RelationGetSmgr Unexecuted instantiation: genericdesc.c:RelationGetSmgr Unexecuted instantiation: spgdoinsert.c:RelationGetSmgr Unexecuted instantiation: spginsert.c:RelationGetSmgr Unexecuted instantiation: spgscan.c:RelationGetSmgr Unexecuted instantiation: spgutils.c:RelationGetSmgr Unexecuted instantiation: spgvacuum.c:RelationGetSmgr Unexecuted instantiation: sequence.c:RelationGetSmgr Unexecuted instantiation: table.c:RelationGetSmgr Unexecuted instantiation: tableam.c:RelationGetSmgr Unexecuted instantiation: tableamapi.c:RelationGetSmgr Unexecuted instantiation: toast_helper.c:RelationGetSmgr Unexecuted instantiation: generic_xlog.c:RelationGetSmgr Unexecuted instantiation: parallel.c:RelationGetSmgr Unexecuted instantiation: rmgr.c:RelationGetSmgr Unexecuted instantiation: xact.c:RelationGetSmgr Unexecuted instantiation: xlog.c:RelationGetSmgr Unexecuted instantiation: xlogfuncs.c:RelationGetSmgr Unexecuted instantiation: xlogrecovery.c:RelationGetSmgr Unexecuted instantiation: xlogutils.c:RelationGetSmgr Unexecuted instantiation: bootstrap.c:RelationGetSmgr Unexecuted instantiation: aclchk.c:RelationGetSmgr Unexecuted instantiation: catalog.c:RelationGetSmgr Unexecuted instantiation: dependency.c:RelationGetSmgr Unexecuted instantiation: heap.c:RelationGetSmgr Unexecuted instantiation: index.c:RelationGetSmgr Unexecuted instantiation: indexing.c:RelationGetSmgr Unexecuted instantiation: namespace.c:RelationGetSmgr Unexecuted instantiation: objectaddress.c:RelationGetSmgr Unexecuted instantiation: partition.c:RelationGetSmgr Unexecuted instantiation: pg_aggregate.c:RelationGetSmgr Unexecuted instantiation: pg_attrdef.c:RelationGetSmgr Unexecuted instantiation: pg_cast.c:RelationGetSmgr Unexecuted instantiation: pg_collation.c:RelationGetSmgr Unexecuted instantiation: pg_constraint.c:RelationGetSmgr Unexecuted instantiation: pg_conversion.c:RelationGetSmgr Unexecuted instantiation: pg_db_role_setting.c:RelationGetSmgr Unexecuted instantiation: pg_depend.c:RelationGetSmgr Unexecuted instantiation: pg_enum.c:RelationGetSmgr Unexecuted instantiation: pg_inherits.c:RelationGetSmgr Unexecuted instantiation: pg_largeobject.c:RelationGetSmgr Unexecuted instantiation: pg_namespace.c:RelationGetSmgr Unexecuted instantiation: pg_operator.c:RelationGetSmgr Unexecuted instantiation: pg_parameter_acl.c:RelationGetSmgr Unexecuted instantiation: pg_proc.c:RelationGetSmgr Unexecuted instantiation: pg_publication.c:RelationGetSmgr Unexecuted instantiation: pg_range.c:RelationGetSmgr Unexecuted instantiation: pg_shdepend.c:RelationGetSmgr Unexecuted instantiation: pg_subscription.c:RelationGetSmgr Unexecuted instantiation: pg_type.c:RelationGetSmgr Unexecuted instantiation: storage.c:RelationGetSmgr Unexecuted instantiation: toasting.c:RelationGetSmgr Unexecuted instantiation: analyze.c:RelationGetSmgr Unexecuted instantiation: gram.c:RelationGetSmgr Unexecuted instantiation: parse_clause.c:RelationGetSmgr Unexecuted instantiation: parse_merge.c:RelationGetSmgr Unexecuted instantiation: parse_relation.c:RelationGetSmgr Unexecuted instantiation: parse_target.c:RelationGetSmgr Unexecuted instantiation: parse_utilcmd.c:RelationGetSmgr Unexecuted instantiation: alter.c:RelationGetSmgr Unexecuted instantiation: amcmds.c:RelationGetSmgr Unexecuted instantiation: async.c:RelationGetSmgr Unexecuted instantiation: cluster.c:RelationGetSmgr Unexecuted instantiation: collationcmds.c:RelationGetSmgr Unexecuted instantiation: comment.c:RelationGetSmgr Unexecuted instantiation: constraint.c:RelationGetSmgr Unexecuted instantiation: copy.c:RelationGetSmgr Unexecuted instantiation: copyfrom.c:RelationGetSmgr Unexecuted instantiation: copyfromparse.c:RelationGetSmgr Unexecuted instantiation: copyto.c:RelationGetSmgr Unexecuted instantiation: createas.c:RelationGetSmgr Unexecuted instantiation: dbcommands.c:RelationGetSmgr Unexecuted instantiation: event_trigger.c:RelationGetSmgr Unexecuted instantiation: explain.c:RelationGetSmgr Unexecuted instantiation: extension.c:RelationGetSmgr Unexecuted instantiation: foreigncmds.c:RelationGetSmgr Unexecuted instantiation: functioncmds.c:RelationGetSmgr Unexecuted instantiation: indexcmds.c:RelationGetSmgr Unexecuted instantiation: lockcmds.c:RelationGetSmgr Unexecuted instantiation: matview.c:RelationGetSmgr Unexecuted instantiation: opclasscmds.c:RelationGetSmgr Unexecuted instantiation: operatorcmds.c:RelationGetSmgr Unexecuted instantiation: policy.c:RelationGetSmgr Unexecuted instantiation: proclang.c:RelationGetSmgr Unexecuted instantiation: publicationcmds.c:RelationGetSmgr Unexecuted instantiation: schemacmds.c:RelationGetSmgr Unexecuted instantiation: seclabel.c:RelationGetSmgr Unexecuted instantiation: statscmds.c:RelationGetSmgr Unexecuted instantiation: subscriptioncmds.c:RelationGetSmgr Unexecuted instantiation: tablecmds.c:RelationGetSmgr Unexecuted instantiation: tablespace.c:RelationGetSmgr Unexecuted instantiation: trigger.c:RelationGetSmgr Unexecuted instantiation: tsearchcmds.c:RelationGetSmgr Unexecuted instantiation: typecmds.c:RelationGetSmgr Unexecuted instantiation: user.c:RelationGetSmgr Unexecuted instantiation: vacuum.c:RelationGetSmgr Unexecuted instantiation: vacuumparallel.c:RelationGetSmgr Unexecuted instantiation: view.c:RelationGetSmgr Unexecuted instantiation: execCurrent.c:RelationGetSmgr Unexecuted instantiation: execExpr.c:RelationGetSmgr Unexecuted instantiation: execIndexing.c:RelationGetSmgr Unexecuted instantiation: execMain.c:RelationGetSmgr Unexecuted instantiation: execPartition.c:RelationGetSmgr Unexecuted instantiation: execReplication.c:RelationGetSmgr Unexecuted instantiation: execUtils.c:RelationGetSmgr Unexecuted instantiation: nodeBitmapHeapscan.c:RelationGetSmgr Unexecuted instantiation: nodeCustom.c:RelationGetSmgr Unexecuted instantiation: nodeForeignscan.c:RelationGetSmgr Unexecuted instantiation: nodeIndexonlyscan.c:RelationGetSmgr Unexecuted instantiation: nodeIndexscan.c:RelationGetSmgr Unexecuted instantiation: nodeLockRows.c:RelationGetSmgr Unexecuted instantiation: nodeMergejoin.c:RelationGetSmgr Unexecuted instantiation: nodeModifyTable.c:RelationGetSmgr Unexecuted instantiation: nodeSamplescan.c:RelationGetSmgr Unexecuted instantiation: nodeSeqscan.c:RelationGetSmgr Unexecuted instantiation: nodeTidrangescan.c:RelationGetSmgr Unexecuted instantiation: nodeTidscan.c:RelationGetSmgr Unexecuted instantiation: spi.c:RelationGetSmgr Unexecuted instantiation: foreign.c:RelationGetSmgr Unexecuted instantiation: copyfuncs.c:RelationGetSmgr Unexecuted instantiation: equalfuncs.c:RelationGetSmgr Unexecuted instantiation: outfuncs.c:RelationGetSmgr Unexecuted instantiation: queryjumblefuncs.c:RelationGetSmgr Unexecuted instantiation: readfuncs.c:RelationGetSmgr Unexecuted instantiation: initsplan.c:RelationGetSmgr Unexecuted instantiation: planner.c:RelationGetSmgr Unexecuted instantiation: prepjointree.c:RelationGetSmgr Unexecuted instantiation: preptlist.c:RelationGetSmgr Unexecuted instantiation: appendinfo.c:RelationGetSmgr Unexecuted instantiation: inherit.c:RelationGetSmgr Unexecuted instantiation: plancat.c:RelationGetSmgr Unexecuted instantiation: partbounds.c:RelationGetSmgr Unexecuted instantiation: partdesc.c:RelationGetSmgr Unexecuted instantiation: partprune.c:RelationGetSmgr Unexecuted instantiation: autovacuum.c:RelationGetSmgr Unexecuted instantiation: launch_backend.c:RelationGetSmgr Unexecuted instantiation: postmaster.c:RelationGetSmgr Unexecuted instantiation: walsummarizer.c:RelationGetSmgr Unexecuted instantiation: applyparallelworker.c:RelationGetSmgr Unexecuted instantiation: conflict.c:RelationGetSmgr Unexecuted instantiation: decode.c:RelationGetSmgr Unexecuted instantiation: launcher.c:RelationGetSmgr Unexecuted instantiation: logical.c:RelationGetSmgr Unexecuted instantiation: logicalfuncs.c:RelationGetSmgr Unexecuted instantiation: origin.c:RelationGetSmgr Unexecuted instantiation: proto.c:RelationGetSmgr Unexecuted instantiation: reorderbuffer.c:RelationGetSmgr Unexecuted instantiation: slotsync.c:RelationGetSmgr Unexecuted instantiation: snapbuild.c:RelationGetSmgr Unexecuted instantiation: tablesync.c:RelationGetSmgr Unexecuted instantiation: worker.c:RelationGetSmgr Unexecuted instantiation: slot.c:RelationGetSmgr Unexecuted instantiation: slotfuncs.c:RelationGetSmgr Unexecuted instantiation: walreceiver.c:RelationGetSmgr Unexecuted instantiation: walreceiverfuncs.c:RelationGetSmgr Unexecuted instantiation: walsender.c:RelationGetSmgr Unexecuted instantiation: rewriteDefine.c:RelationGetSmgr Unexecuted instantiation: rewriteHandler.c:RelationGetSmgr Unexecuted instantiation: rewriteRemove.c:RelationGetSmgr Unexecuted instantiation: rowsecurity.c:RelationGetSmgr Unexecuted instantiation: basebackup.c:RelationGetSmgr Unexecuted instantiation: attribute_stats.c:RelationGetSmgr Unexecuted instantiation: extended_stats.c:RelationGetSmgr Unexecuted instantiation: relation_stats.c:RelationGetSmgr Unexecuted instantiation: stat_utils.c:RelationGetSmgr Unexecuted instantiation: read_stream.c:RelationGetSmgr Unexecuted instantiation: bufmgr.c:RelationGetSmgr Unexecuted instantiation: freespace.c:RelationGetSmgr Unexecuted instantiation: ipci.c:RelationGetSmgr Unexecuted instantiation: procarray.c:RelationGetSmgr Unexecuted instantiation: standby.c:RelationGetSmgr Unexecuted instantiation: inv_api.c:RelationGetSmgr Unexecuted instantiation: deadlock.c:RelationGetSmgr Unexecuted instantiation: lmgr.c:RelationGetSmgr Unexecuted instantiation: lock.c:RelationGetSmgr Unexecuted instantiation: predicate.c:RelationGetSmgr Unexecuted instantiation: proc.c:RelationGetSmgr Unexecuted instantiation: bulk_write.c:RelationGetSmgr Unexecuted instantiation: postgres.c:RelationGetSmgr Unexecuted instantiation: utility.c:RelationGetSmgr Unexecuted instantiation: pgstat_relation.c:RelationGetSmgr Unexecuted instantiation: pgstat_replslot.c:RelationGetSmgr Unexecuted instantiation: wait_event.c:RelationGetSmgr Unexecuted instantiation: dbsize.c:RelationGetSmgr Unexecuted instantiation: genfile.c:RelationGetSmgr Unexecuted instantiation: pg_upgrade_support.c:RelationGetSmgr Unexecuted instantiation: ri_triggers.c:RelationGetSmgr Unexecuted instantiation: ruleutils.c:RelationGetSmgr Unexecuted instantiation: selfuncs.c:RelationGetSmgr Unexecuted instantiation: skipsupport.c:RelationGetSmgr Unexecuted instantiation: tid.c:RelationGetSmgr Unexecuted instantiation: trigfuncs.c:RelationGetSmgr Unexecuted instantiation: tsquery_rewrite.c:RelationGetSmgr Unexecuted instantiation: tsvector_op.c:RelationGetSmgr Unexecuted instantiation: xml.c:RelationGetSmgr Unexecuted instantiation: catcache.c:RelationGetSmgr Unexecuted instantiation: evtcache.c:RelationGetSmgr Unexecuted instantiation: funccache.c:RelationGetSmgr Unexecuted instantiation: inval.c:RelationGetSmgr Unexecuted instantiation: partcache.c:RelationGetSmgr Unexecuted instantiation: plancache.c:RelationGetSmgr Unexecuted instantiation: relcache.c:RelationGetSmgr Unexecuted instantiation: syscache.c:RelationGetSmgr Unexecuted instantiation: typcache.c:RelationGetSmgr Unexecuted instantiation: funcapi.c:RelationGetSmgr Unexecuted instantiation: miscinit.c:RelationGetSmgr Unexecuted instantiation: postinit.c:RelationGetSmgr Unexecuted instantiation: guc_tables.c:RelationGetSmgr Unexecuted instantiation: queryenvironment.c:RelationGetSmgr Unexecuted instantiation: sortsupport.c:RelationGetSmgr Unexecuted instantiation: tuplesortvariants.c:RelationGetSmgr Unexecuted instantiation: simple_query_fuzzer.c:RelationGetSmgr |
587 | | |
588 | | /* |
589 | | * RelationCloseSmgr |
590 | | * Close the relation at the smgr level, if not already done. |
591 | | */ |
592 | | static inline void |
593 | | RelationCloseSmgr(Relation relation) |
594 | 0 | { |
595 | 0 | if (relation->rd_smgr != NULL) |
596 | 0 | { |
597 | 0 | smgrunpin(relation->rd_smgr); |
598 | 0 | smgrclose(relation->rd_smgr); |
599 | 0 | relation->rd_smgr = NULL; |
600 | 0 | } |
601 | 0 | } Unexecuted instantiation: fuzzer_initialize.c:RelationCloseSmgr Unexecuted instantiation: brin.c:RelationCloseSmgr Unexecuted instantiation: brin_bloom.c:RelationCloseSmgr Unexecuted instantiation: brin_inclusion.c:RelationCloseSmgr Unexecuted instantiation: brin_minmax.c:RelationCloseSmgr Unexecuted instantiation: brin_minmax_multi.c:RelationCloseSmgr Unexecuted instantiation: brin_pageops.c:RelationCloseSmgr Unexecuted instantiation: brin_revmap.c:RelationCloseSmgr Unexecuted instantiation: detoast.c:RelationCloseSmgr Unexecuted instantiation: relation.c:RelationCloseSmgr Unexecuted instantiation: reloptions.c:RelationCloseSmgr Unexecuted instantiation: syncscan.c:RelationCloseSmgr Unexecuted instantiation: toast_internals.c:RelationCloseSmgr Unexecuted instantiation: ginbtree.c:RelationCloseSmgr Unexecuted instantiation: gindatapage.c:RelationCloseSmgr Unexecuted instantiation: ginentrypage.c:RelationCloseSmgr Unexecuted instantiation: ginfast.c:RelationCloseSmgr Unexecuted instantiation: ginget.c:RelationCloseSmgr Unexecuted instantiation: gininsert.c:RelationCloseSmgr Unexecuted instantiation: ginscan.c:RelationCloseSmgr Unexecuted instantiation: ginutil.c:RelationCloseSmgr Unexecuted instantiation: ginvacuum.c:RelationCloseSmgr Unexecuted instantiation: gist.c:RelationCloseSmgr Unexecuted instantiation: gistbuild.c:RelationCloseSmgr Unexecuted instantiation: gistbuildbuffers.c:RelationCloseSmgr Unexecuted instantiation: gistget.c:RelationCloseSmgr Unexecuted instantiation: gistscan.c:RelationCloseSmgr Unexecuted instantiation: gistsplit.c:RelationCloseSmgr Unexecuted instantiation: gistutil.c:RelationCloseSmgr Unexecuted instantiation: gistvacuum.c:RelationCloseSmgr Unexecuted instantiation: gistxlog.c:RelationCloseSmgr Unexecuted instantiation: hash.c:RelationCloseSmgr Unexecuted instantiation: hashinsert.c:RelationCloseSmgr Unexecuted instantiation: hashovfl.c:RelationCloseSmgr Unexecuted instantiation: hashpage.c:RelationCloseSmgr Unexecuted instantiation: hashsearch.c:RelationCloseSmgr Unexecuted instantiation: hashutil.c:RelationCloseSmgr Unexecuted instantiation: heapam.c:RelationCloseSmgr Unexecuted instantiation: heapam_handler.c:RelationCloseSmgr Unexecuted instantiation: heapam_visibility.c:RelationCloseSmgr Unexecuted instantiation: heapam_xlog.c:RelationCloseSmgr Unexecuted instantiation: heaptoast.c:RelationCloseSmgr Unexecuted instantiation: hio.c:RelationCloseSmgr Unexecuted instantiation: pruneheap.c:RelationCloseSmgr Unexecuted instantiation: rewriteheap.c:RelationCloseSmgr Unexecuted instantiation: vacuumlazy.c:RelationCloseSmgr Unexecuted instantiation: visibilitymap.c:RelationCloseSmgr Unexecuted instantiation: genam.c:RelationCloseSmgr Unexecuted instantiation: indexam.c:RelationCloseSmgr Unexecuted instantiation: nbtdedup.c:RelationCloseSmgr Unexecuted instantiation: nbtinsert.c:RelationCloseSmgr Unexecuted instantiation: nbtpage.c:RelationCloseSmgr Unexecuted instantiation: nbtpreprocesskeys.c:RelationCloseSmgr Unexecuted instantiation: nbtree.c:RelationCloseSmgr Unexecuted instantiation: nbtsearch.c:RelationCloseSmgr Unexecuted instantiation: nbtsort.c:RelationCloseSmgr Unexecuted instantiation: nbtsplitloc.c:RelationCloseSmgr Unexecuted instantiation: nbtutils.c:RelationCloseSmgr Unexecuted instantiation: nbtvalidate.c:RelationCloseSmgr Unexecuted instantiation: nbtxlog.c:RelationCloseSmgr Unexecuted instantiation: genericdesc.c:RelationCloseSmgr Unexecuted instantiation: spgdoinsert.c:RelationCloseSmgr Unexecuted instantiation: spginsert.c:RelationCloseSmgr Unexecuted instantiation: spgscan.c:RelationCloseSmgr Unexecuted instantiation: spgutils.c:RelationCloseSmgr Unexecuted instantiation: spgvacuum.c:RelationCloseSmgr Unexecuted instantiation: sequence.c:RelationCloseSmgr Unexecuted instantiation: table.c:RelationCloseSmgr Unexecuted instantiation: tableam.c:RelationCloseSmgr Unexecuted instantiation: tableamapi.c:RelationCloseSmgr Unexecuted instantiation: toast_helper.c:RelationCloseSmgr Unexecuted instantiation: generic_xlog.c:RelationCloseSmgr Unexecuted instantiation: parallel.c:RelationCloseSmgr Unexecuted instantiation: rmgr.c:RelationCloseSmgr Unexecuted instantiation: xact.c:RelationCloseSmgr Unexecuted instantiation: xlog.c:RelationCloseSmgr Unexecuted instantiation: xlogfuncs.c:RelationCloseSmgr Unexecuted instantiation: xlogrecovery.c:RelationCloseSmgr Unexecuted instantiation: xlogutils.c:RelationCloseSmgr Unexecuted instantiation: bootstrap.c:RelationCloseSmgr Unexecuted instantiation: aclchk.c:RelationCloseSmgr Unexecuted instantiation: catalog.c:RelationCloseSmgr Unexecuted instantiation: dependency.c:RelationCloseSmgr Unexecuted instantiation: heap.c:RelationCloseSmgr Unexecuted instantiation: index.c:RelationCloseSmgr Unexecuted instantiation: indexing.c:RelationCloseSmgr Unexecuted instantiation: namespace.c:RelationCloseSmgr Unexecuted instantiation: objectaddress.c:RelationCloseSmgr Unexecuted instantiation: partition.c:RelationCloseSmgr Unexecuted instantiation: pg_aggregate.c:RelationCloseSmgr Unexecuted instantiation: pg_attrdef.c:RelationCloseSmgr Unexecuted instantiation: pg_cast.c:RelationCloseSmgr Unexecuted instantiation: pg_collation.c:RelationCloseSmgr Unexecuted instantiation: pg_constraint.c:RelationCloseSmgr Unexecuted instantiation: pg_conversion.c:RelationCloseSmgr Unexecuted instantiation: pg_db_role_setting.c:RelationCloseSmgr Unexecuted instantiation: pg_depend.c:RelationCloseSmgr Unexecuted instantiation: pg_enum.c:RelationCloseSmgr Unexecuted instantiation: pg_inherits.c:RelationCloseSmgr Unexecuted instantiation: pg_largeobject.c:RelationCloseSmgr Unexecuted instantiation: pg_namespace.c:RelationCloseSmgr Unexecuted instantiation: pg_operator.c:RelationCloseSmgr Unexecuted instantiation: pg_parameter_acl.c:RelationCloseSmgr Unexecuted instantiation: pg_proc.c:RelationCloseSmgr Unexecuted instantiation: pg_publication.c:RelationCloseSmgr Unexecuted instantiation: pg_range.c:RelationCloseSmgr Unexecuted instantiation: pg_shdepend.c:RelationCloseSmgr Unexecuted instantiation: pg_subscription.c:RelationCloseSmgr Unexecuted instantiation: pg_type.c:RelationCloseSmgr Unexecuted instantiation: storage.c:RelationCloseSmgr Unexecuted instantiation: toasting.c:RelationCloseSmgr Unexecuted instantiation: analyze.c:RelationCloseSmgr Unexecuted instantiation: gram.c:RelationCloseSmgr Unexecuted instantiation: parse_clause.c:RelationCloseSmgr Unexecuted instantiation: parse_merge.c:RelationCloseSmgr Unexecuted instantiation: parse_relation.c:RelationCloseSmgr Unexecuted instantiation: parse_target.c:RelationCloseSmgr Unexecuted instantiation: parse_utilcmd.c:RelationCloseSmgr Unexecuted instantiation: alter.c:RelationCloseSmgr Unexecuted instantiation: amcmds.c:RelationCloseSmgr Unexecuted instantiation: async.c:RelationCloseSmgr Unexecuted instantiation: cluster.c:RelationCloseSmgr Unexecuted instantiation: collationcmds.c:RelationCloseSmgr Unexecuted instantiation: comment.c:RelationCloseSmgr Unexecuted instantiation: constraint.c:RelationCloseSmgr Unexecuted instantiation: copy.c:RelationCloseSmgr Unexecuted instantiation: copyfrom.c:RelationCloseSmgr Unexecuted instantiation: copyfromparse.c:RelationCloseSmgr Unexecuted instantiation: copyto.c:RelationCloseSmgr Unexecuted instantiation: createas.c:RelationCloseSmgr Unexecuted instantiation: dbcommands.c:RelationCloseSmgr Unexecuted instantiation: event_trigger.c:RelationCloseSmgr Unexecuted instantiation: explain.c:RelationCloseSmgr Unexecuted instantiation: extension.c:RelationCloseSmgr Unexecuted instantiation: foreigncmds.c:RelationCloseSmgr Unexecuted instantiation: functioncmds.c:RelationCloseSmgr Unexecuted instantiation: indexcmds.c:RelationCloseSmgr Unexecuted instantiation: lockcmds.c:RelationCloseSmgr Unexecuted instantiation: matview.c:RelationCloseSmgr Unexecuted instantiation: opclasscmds.c:RelationCloseSmgr Unexecuted instantiation: operatorcmds.c:RelationCloseSmgr Unexecuted instantiation: policy.c:RelationCloseSmgr Unexecuted instantiation: proclang.c:RelationCloseSmgr Unexecuted instantiation: publicationcmds.c:RelationCloseSmgr Unexecuted instantiation: schemacmds.c:RelationCloseSmgr Unexecuted instantiation: seclabel.c:RelationCloseSmgr Unexecuted instantiation: statscmds.c:RelationCloseSmgr Unexecuted instantiation: subscriptioncmds.c:RelationCloseSmgr Unexecuted instantiation: tablecmds.c:RelationCloseSmgr Unexecuted instantiation: tablespace.c:RelationCloseSmgr Unexecuted instantiation: trigger.c:RelationCloseSmgr Unexecuted instantiation: tsearchcmds.c:RelationCloseSmgr Unexecuted instantiation: typecmds.c:RelationCloseSmgr Unexecuted instantiation: user.c:RelationCloseSmgr Unexecuted instantiation: vacuum.c:RelationCloseSmgr Unexecuted instantiation: vacuumparallel.c:RelationCloseSmgr Unexecuted instantiation: view.c:RelationCloseSmgr Unexecuted instantiation: execCurrent.c:RelationCloseSmgr Unexecuted instantiation: execExpr.c:RelationCloseSmgr Unexecuted instantiation: execIndexing.c:RelationCloseSmgr Unexecuted instantiation: execMain.c:RelationCloseSmgr Unexecuted instantiation: execPartition.c:RelationCloseSmgr Unexecuted instantiation: execReplication.c:RelationCloseSmgr Unexecuted instantiation: execUtils.c:RelationCloseSmgr Unexecuted instantiation: nodeBitmapHeapscan.c:RelationCloseSmgr Unexecuted instantiation: nodeCustom.c:RelationCloseSmgr Unexecuted instantiation: nodeForeignscan.c:RelationCloseSmgr Unexecuted instantiation: nodeIndexonlyscan.c:RelationCloseSmgr Unexecuted instantiation: nodeIndexscan.c:RelationCloseSmgr Unexecuted instantiation: nodeLockRows.c:RelationCloseSmgr Unexecuted instantiation: nodeMergejoin.c:RelationCloseSmgr Unexecuted instantiation: nodeModifyTable.c:RelationCloseSmgr Unexecuted instantiation: nodeSamplescan.c:RelationCloseSmgr Unexecuted instantiation: nodeSeqscan.c:RelationCloseSmgr Unexecuted instantiation: nodeTidrangescan.c:RelationCloseSmgr Unexecuted instantiation: nodeTidscan.c:RelationCloseSmgr Unexecuted instantiation: spi.c:RelationCloseSmgr Unexecuted instantiation: foreign.c:RelationCloseSmgr Unexecuted instantiation: copyfuncs.c:RelationCloseSmgr Unexecuted instantiation: equalfuncs.c:RelationCloseSmgr Unexecuted instantiation: outfuncs.c:RelationCloseSmgr Unexecuted instantiation: queryjumblefuncs.c:RelationCloseSmgr Unexecuted instantiation: readfuncs.c:RelationCloseSmgr Unexecuted instantiation: initsplan.c:RelationCloseSmgr Unexecuted instantiation: planner.c:RelationCloseSmgr Unexecuted instantiation: prepjointree.c:RelationCloseSmgr Unexecuted instantiation: preptlist.c:RelationCloseSmgr Unexecuted instantiation: appendinfo.c:RelationCloseSmgr Unexecuted instantiation: inherit.c:RelationCloseSmgr Unexecuted instantiation: plancat.c:RelationCloseSmgr Unexecuted instantiation: partbounds.c:RelationCloseSmgr Unexecuted instantiation: partdesc.c:RelationCloseSmgr Unexecuted instantiation: partprune.c:RelationCloseSmgr Unexecuted instantiation: autovacuum.c:RelationCloseSmgr Unexecuted instantiation: launch_backend.c:RelationCloseSmgr Unexecuted instantiation: postmaster.c:RelationCloseSmgr Unexecuted instantiation: walsummarizer.c:RelationCloseSmgr Unexecuted instantiation: applyparallelworker.c:RelationCloseSmgr Unexecuted instantiation: conflict.c:RelationCloseSmgr Unexecuted instantiation: decode.c:RelationCloseSmgr Unexecuted instantiation: launcher.c:RelationCloseSmgr Unexecuted instantiation: logical.c:RelationCloseSmgr Unexecuted instantiation: logicalfuncs.c:RelationCloseSmgr Unexecuted instantiation: origin.c:RelationCloseSmgr Unexecuted instantiation: proto.c:RelationCloseSmgr Unexecuted instantiation: reorderbuffer.c:RelationCloseSmgr Unexecuted instantiation: slotsync.c:RelationCloseSmgr Unexecuted instantiation: snapbuild.c:RelationCloseSmgr Unexecuted instantiation: tablesync.c:RelationCloseSmgr Unexecuted instantiation: worker.c:RelationCloseSmgr Unexecuted instantiation: slot.c:RelationCloseSmgr Unexecuted instantiation: slotfuncs.c:RelationCloseSmgr Unexecuted instantiation: walreceiver.c:RelationCloseSmgr Unexecuted instantiation: walreceiverfuncs.c:RelationCloseSmgr Unexecuted instantiation: walsender.c:RelationCloseSmgr Unexecuted instantiation: rewriteDefine.c:RelationCloseSmgr Unexecuted instantiation: rewriteHandler.c:RelationCloseSmgr Unexecuted instantiation: rewriteRemove.c:RelationCloseSmgr Unexecuted instantiation: rowsecurity.c:RelationCloseSmgr Unexecuted instantiation: basebackup.c:RelationCloseSmgr Unexecuted instantiation: attribute_stats.c:RelationCloseSmgr Unexecuted instantiation: extended_stats.c:RelationCloseSmgr Unexecuted instantiation: relation_stats.c:RelationCloseSmgr Unexecuted instantiation: stat_utils.c:RelationCloseSmgr Unexecuted instantiation: read_stream.c:RelationCloseSmgr Unexecuted instantiation: bufmgr.c:RelationCloseSmgr Unexecuted instantiation: freespace.c:RelationCloseSmgr Unexecuted instantiation: ipci.c:RelationCloseSmgr Unexecuted instantiation: procarray.c:RelationCloseSmgr Unexecuted instantiation: standby.c:RelationCloseSmgr Unexecuted instantiation: inv_api.c:RelationCloseSmgr Unexecuted instantiation: deadlock.c:RelationCloseSmgr Unexecuted instantiation: lmgr.c:RelationCloseSmgr Unexecuted instantiation: lock.c:RelationCloseSmgr Unexecuted instantiation: predicate.c:RelationCloseSmgr Unexecuted instantiation: proc.c:RelationCloseSmgr Unexecuted instantiation: bulk_write.c:RelationCloseSmgr Unexecuted instantiation: postgres.c:RelationCloseSmgr Unexecuted instantiation: utility.c:RelationCloseSmgr Unexecuted instantiation: pgstat_relation.c:RelationCloseSmgr Unexecuted instantiation: pgstat_replslot.c:RelationCloseSmgr Unexecuted instantiation: wait_event.c:RelationCloseSmgr Unexecuted instantiation: dbsize.c:RelationCloseSmgr Unexecuted instantiation: genfile.c:RelationCloseSmgr Unexecuted instantiation: pg_upgrade_support.c:RelationCloseSmgr Unexecuted instantiation: ri_triggers.c:RelationCloseSmgr Unexecuted instantiation: ruleutils.c:RelationCloseSmgr Unexecuted instantiation: selfuncs.c:RelationCloseSmgr Unexecuted instantiation: skipsupport.c:RelationCloseSmgr Unexecuted instantiation: tid.c:RelationCloseSmgr Unexecuted instantiation: trigfuncs.c:RelationCloseSmgr Unexecuted instantiation: tsquery_rewrite.c:RelationCloseSmgr Unexecuted instantiation: tsvector_op.c:RelationCloseSmgr Unexecuted instantiation: xml.c:RelationCloseSmgr Unexecuted instantiation: catcache.c:RelationCloseSmgr Unexecuted instantiation: evtcache.c:RelationCloseSmgr Unexecuted instantiation: funccache.c:RelationCloseSmgr Unexecuted instantiation: inval.c:RelationCloseSmgr Unexecuted instantiation: partcache.c:RelationCloseSmgr Unexecuted instantiation: plancache.c:RelationCloseSmgr Unexecuted instantiation: relcache.c:RelationCloseSmgr Unexecuted instantiation: syscache.c:RelationCloseSmgr Unexecuted instantiation: typcache.c:RelationCloseSmgr Unexecuted instantiation: funcapi.c:RelationCloseSmgr Unexecuted instantiation: miscinit.c:RelationCloseSmgr Unexecuted instantiation: postinit.c:RelationCloseSmgr Unexecuted instantiation: guc_tables.c:RelationCloseSmgr Unexecuted instantiation: queryenvironment.c:RelationCloseSmgr Unexecuted instantiation: sortsupport.c:RelationCloseSmgr Unexecuted instantiation: tuplesortvariants.c:RelationCloseSmgr Unexecuted instantiation: simple_query_fuzzer.c:RelationCloseSmgr |
602 | | #endif /* !FRONTEND */ |
603 | | |
604 | | /* |
605 | | * RelationGetTargetBlock |
606 | | * Fetch relation's current insertion target block. |
607 | | * |
608 | | * Returns InvalidBlockNumber if there is no current target block. Note |
609 | | * that the target block status is discarded on any smgr-level invalidation, |
610 | | * so there's no need to re-open the smgr handle if it's not currently open. |
611 | | */ |
612 | | #define RelationGetTargetBlock(relation) \ |
613 | 0 | ( (relation)->rd_smgr != NULL ? (relation)->rd_smgr->smgr_targblock : InvalidBlockNumber ) |
614 | | |
615 | | /* |
616 | | * RelationSetTargetBlock |
617 | | * Set relation's current insertion target block. |
618 | | */ |
619 | | #define RelationSetTargetBlock(relation, targblock) \ |
620 | 0 | do { \ |
621 | 0 | RelationGetSmgr(relation)->smgr_targblock = (targblock); \ |
622 | 0 | } while (0) |
623 | | |
624 | | /* |
625 | | * RelationIsPermanent |
626 | | * True if relation is permanent. |
627 | | */ |
628 | | #define RelationIsPermanent(relation) \ |
629 | 0 | ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) |
630 | | |
631 | | /* |
632 | | * RelationNeedsWAL |
633 | | * True if relation needs WAL. |
634 | | * |
635 | | * Returns false if wal_level = minimal and this relation is created or |
636 | | * truncated in the current transaction. See "Skipping WAL for New |
637 | | * RelFileLocator" in src/backend/access/transam/README. |
638 | | */ |
639 | | #define RelationNeedsWAL(relation) \ |
640 | 0 | (RelationIsPermanent(relation) && (XLogIsNeeded() || \ |
641 | 0 | (relation->rd_createSubid == InvalidSubTransactionId && \ |
642 | 0 | relation->rd_firstRelfilelocatorSubid == InvalidSubTransactionId))) |
643 | | |
644 | | /* |
645 | | * RelationUsesLocalBuffers |
646 | | * True if relation's pages are stored in local buffers. |
647 | | */ |
648 | | #define RelationUsesLocalBuffers(relation) \ |
649 | 0 | ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP) |
650 | | |
651 | | /* |
652 | | * RELATION_IS_LOCAL |
653 | | * If a rel is either temp or newly created in the current transaction, |
654 | | * it can be assumed to be accessible only to the current backend. |
655 | | * This is typically used to decide that we can skip acquiring locks. |
656 | | * |
657 | | * Beware of multiple eval of argument |
658 | | */ |
659 | | #define RELATION_IS_LOCAL(relation) \ |
660 | 0 | ((relation)->rd_islocaltemp || \ |
661 | 0 | (relation)->rd_createSubid != InvalidSubTransactionId) |
662 | | |
663 | | /* |
664 | | * RELATION_IS_OTHER_TEMP |
665 | | * Test for a temporary relation that belongs to some other session. |
666 | | * |
667 | | * Beware of multiple eval of argument |
668 | | */ |
669 | | #define RELATION_IS_OTHER_TEMP(relation) \ |
670 | 0 | ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP && \ |
671 | 0 | !(relation)->rd_islocaltemp) |
672 | | |
673 | | |
674 | | /* |
675 | | * RelationIsScannable |
676 | | * Currently can only be false for a materialized view which has not been |
677 | | * populated by its query. This is likely to get more complicated later, |
678 | | * so use a macro which looks like a function. |
679 | | */ |
680 | 0 | #define RelationIsScannable(relation) ((relation)->rd_rel->relispopulated) |
681 | | |
682 | | /* |
683 | | * RelationIsPopulated |
684 | | * Currently, we don't physically distinguish the "populated" and |
685 | | * "scannable" properties of matviews, but that may change later. |
686 | | * Hence, use the appropriate one of these macros in code tests. |
687 | | */ |
688 | 0 | #define RelationIsPopulated(relation) ((relation)->rd_rel->relispopulated) |
689 | | |
690 | | /* |
691 | | * RelationIsAccessibleInLogicalDecoding |
692 | | * True if we need to log enough information to have access via |
693 | | * decoding snapshot. |
694 | | */ |
695 | | #define RelationIsAccessibleInLogicalDecoding(relation) \ |
696 | 0 | (XLogLogicalInfoActive() && \ |
697 | 0 | RelationNeedsWAL(relation) && \ |
698 | 0 | (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) |
699 | | |
700 | | /* |
701 | | * RelationIsLogicallyLogged |
702 | | * True if we need to log enough information to extract the data from the |
703 | | * WAL stream. |
704 | | * |
705 | | * We don't log information for unlogged tables (since they don't WAL log |
706 | | * anyway), for foreign tables (since they don't WAL log, either), |
707 | | * and for system tables (their content is hard to make sense of, and |
708 | | * it would complicate decoding slightly for little gain). Note that we *do* |
709 | | * log information for user defined catalog tables since they presumably are |
710 | | * interesting to the user... |
711 | | */ |
712 | | #define RelationIsLogicallyLogged(relation) \ |
713 | 0 | (XLogLogicalInfoActive() && \ |
714 | 0 | RelationNeedsWAL(relation) && \ |
715 | 0 | (relation)->rd_rel->relkind != RELKIND_FOREIGN_TABLE && \ |
716 | 0 | !IsCatalogRelation(relation)) |
717 | | |
718 | | /* routines in utils/cache/relcache.c */ |
719 | | extern void RelationIncrementReferenceCount(Relation rel); |
720 | | extern void RelationDecrementReferenceCount(Relation rel); |
721 | | |
722 | | #endif /* REL_H */ |