| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * relfilenode.h |
| 4 | * Physical access information for relations. |
| 5 | * |
| 6 | * |
| 7 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 8 | * Portions Copyright (c) 1994, Regents of the University of California |
| 9 | * |
| 10 | * src/include/storage/relfilenode.h |
| 11 | * |
| 12 | *------------------------------------------------------------------------- |
| 13 | */ |
| 14 | #ifndef RELFILENODE_H |
| 15 | #define RELFILENODE_H |
| 16 | |
| 17 | #include "common/relpath.h" |
| 18 | #include "storage/backendid.h" |
| 19 | |
| 20 | /* |
| 21 | * RelFileNode must provide all that we need to know to physically access |
| 22 | * a relation, with the exception of the backend ID, which can be provided |
| 23 | * separately. Note, however, that a "physical" relation is comprised of |
| 24 | * multiple files on the filesystem, as each fork is stored as a separate |
| 25 | * file, and each fork can be divided into multiple segments. See md.c. |
| 26 | * |
| 27 | * spcNode identifies the tablespace of the relation. It corresponds to |
| 28 | * pg_tablespace.oid. |
| 29 | * |
| 30 | * dbNode identifies the database of the relation. It is zero for |
| 31 | * "shared" relations (those common to all databases of a cluster). |
| 32 | * Nonzero dbNode values correspond to pg_database.oid. |
| 33 | * |
| 34 | * relNode identifies the specific relation. relNode corresponds to |
| 35 | * pg_class.relfilenode (NOT pg_class.oid, because we need to be able |
| 36 | * to assign new physical files to relations in some situations). |
| 37 | * Notice that relNode is only unique within a database in a particular |
| 38 | * tablespace. |
| 39 | * |
| 40 | * Note: spcNode must be GLOBALTABLESPACE_OID if and only if dbNode is |
| 41 | * zero. We support shared relations only in the "global" tablespace. |
| 42 | * |
| 43 | * Note: in pg_class we allow reltablespace == 0 to denote that the |
| 44 | * relation is stored in its database's "default" tablespace (as |
| 45 | * identified by pg_database.dattablespace). However this shorthand |
| 46 | * is NOT allowed in RelFileNode structs --- the real tablespace ID |
| 47 | * must be supplied when setting spcNode. |
| 48 | * |
| 49 | * Note: in pg_class, relfilenode can be zero to denote that the relation |
| 50 | * is a "mapped" relation, whose current true filenode number is available |
| 51 | * from relmapper.c. Again, this case is NOT allowed in RelFileNodes. |
| 52 | * |
| 53 | * Note: various places use RelFileNode in hashtable keys. Therefore, |
| 54 | * there *must not* be any unused padding bytes in this struct. That |
| 55 | * should be safe as long as all the fields are of type Oid. |
| 56 | */ |
| 57 | typedef struct RelFileNode |
| 58 | { |
| 59 | Oid spcNode; /* tablespace */ |
| 60 | Oid dbNode; /* database */ |
| 61 | Oid relNode; /* relation */ |
| 62 | } RelFileNode; |
| 63 | |
| 64 | /* |
| 65 | * Augmenting a relfilenode with the backend ID provides all the information |
| 66 | * we need to locate the physical storage. The backend ID is InvalidBackendId |
| 67 | * for regular relations (those accessible to more than one backend), or the |
| 68 | * owning backend's ID for backend-local relations. Backend-local relations |
| 69 | * are always transient and removed in case of a database crash; they are |
| 70 | * never WAL-logged or fsync'd. |
| 71 | */ |
| 72 | typedef struct RelFileNodeBackend |
| 73 | { |
| 74 | RelFileNode node; |
| 75 | BackendId backend; |
| 76 | } RelFileNodeBackend; |
| 77 | |
| 78 | #define RelFileNodeBackendIsTemp(rnode) \ |
| 79 | ((rnode).backend != InvalidBackendId) |
| 80 | |
| 81 | /* |
| 82 | * Note: RelFileNodeEquals and RelFileNodeBackendEquals compare relNode first |
| 83 | * since that is most likely to be different in two unequal RelFileNodes. It |
| 84 | * is probably redundant to compare spcNode if the other fields are found equal, |
| 85 | * but do it anyway to be sure. Likewise for checking the backend ID in |
| 86 | * RelFileNodeBackendEquals. |
| 87 | */ |
| 88 | #define RelFileNodeEquals(node1, node2) \ |
| 89 | ((node1).relNode == (node2).relNode && \ |
| 90 | (node1).dbNode == (node2).dbNode && \ |
| 91 | (node1).spcNode == (node2).spcNode) |
| 92 | |
| 93 | #define RelFileNodeBackendEquals(node1, node2) \ |
| 94 | ((node1).node.relNode == (node2).node.relNode && \ |
| 95 | (node1).node.dbNode == (node2).node.dbNode && \ |
| 96 | (node1).backend == (node2).backend && \ |
| 97 | (node1).node.spcNode == (node2).node.spcNode) |
| 98 | |
| 99 | #endif /* RELFILENODE_H */ |
| 100 | |