1 /*------------------------------------------------------------------------- 2 * 3 * pg_class.h 4 * definition of the "relation" system catalog (pg_class) 5 * 6 * 7 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/catalog/pg_class.h 11 * 12 * NOTES 13 * The Catalog.pm module reads this file and derives schema 14 * information. 15 * 16 *------------------------------------------------------------------------- 17 */ 18 #ifndef PG_CLASS_H 19 #define PG_CLASS_H 20 21 #include "catalog/genbki.h" 22 #include "catalog/pg_class_d.h" 23 24 /* ---------------- 25 * pg_class definition. cpp turns this into 26 * typedef struct FormData_pg_class 27 * 28 * Note that the BKI_DEFAULT values below are only used for rows describing 29 * BKI_BOOTSTRAP catalogs, since only those rows appear in pg_class.dat. 30 * ---------------- 31 */ 32 CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,RelationRelation_Rowtype_Id) BKI_SCHEMA_MACRO 33 { 34 /* oid */ 35 Oid oid; 36 37 /* class name */ 38 NameData relname; 39 40 /* OID of namespace containing this class */ 41 Oid relnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); 42 43 /* OID of entry in pg_type for relation's implicit row type, if any */ 44 Oid reltype BKI_LOOKUP_OPT(pg_type); 45 46 /* OID of entry in pg_type for underlying composite type, if any */ 47 Oid reloftype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type); 48 49 /* class owner */ 50 Oid relowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); 51 52 /* access method; 0 if not a table / index */ 53 Oid relam BKI_DEFAULT(heap) BKI_LOOKUP_OPT(pg_am); 54 55 /* identifier of physical storage file */ 56 /* relfilenode == 0 means it is a "mapped" relation, see relmapper.c */ 57 Oid relfilenode BKI_DEFAULT(0); 58 59 /* identifier of table space for relation (0 means default for database) */ 60 Oid reltablespace BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_tablespace); 61 62 /* # of blocks (not always up-to-date) */ 63 int32 relpages BKI_DEFAULT(0); 64 65 /* # of tuples (not always up-to-date; -1 means "unknown") */ 66 float4 reltuples BKI_DEFAULT(-1); 67 68 /* # of all-visible blocks (not always up-to-date) */ 69 int32 relallvisible BKI_DEFAULT(0); 70 71 /* OID of toast table; 0 if none */ 72 Oid reltoastrelid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class); 73 74 /* T if has (or has had) any indexes */ 75 bool relhasindex BKI_DEFAULT(f); 76 77 /* T if shared across databases */ 78 bool relisshared BKI_DEFAULT(f); 79 80 /* see RELPERSISTENCE_xxx constants below */ 81 char relpersistence BKI_DEFAULT(p); 82 83 /* see RELKIND_xxx constants below */ 84 char relkind BKI_DEFAULT(r); 85 86 /* number of user attributes */ 87 int16 relnatts BKI_DEFAULT(0); /* genbki.pl will fill this in */ 88 89 /* 90 * Class pg_attribute must contain exactly "relnatts" user attributes 91 * (with attnums ranging from 1 to relnatts) for this class. It may also 92 * contain entries with negative attnums for system attributes. 93 */ 94 95 /* # of CHECK constraints for class */ 96 int16 relchecks BKI_DEFAULT(0); 97 98 /* has (or has had) any rules */ 99 bool relhasrules BKI_DEFAULT(f); 100 101 /* has (or has had) any TRIGGERs */ 102 bool relhastriggers BKI_DEFAULT(f); 103 104 /* has (or has had) child tables or indexes */ 105 bool relhassubclass BKI_DEFAULT(f); 106 107 /* row security is enabled or not */ 108 bool relrowsecurity BKI_DEFAULT(f); 109 110 /* row security forced for owners or not */ 111 bool relforcerowsecurity BKI_DEFAULT(f); 112 113 /* matview currently holds query results */ 114 bool relispopulated BKI_DEFAULT(t); 115 116 /* see REPLICA_IDENTITY_xxx constants */ 117 char relreplident BKI_DEFAULT(n); 118 119 /* is relation a partition? */ 120 bool relispartition BKI_DEFAULT(f); 121 122 /* link to original rel during table rewrite; otherwise 0 */ 123 Oid relrewrite BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class); 124 125 /* all Xids < this are frozen in this rel */ 126 TransactionId relfrozenxid BKI_DEFAULT(3); /* FirstNormalTransactionId */ 127 128 /* all multixacts in this rel are >= this; it is really a MultiXactId */ 129 TransactionId relminmxid BKI_DEFAULT(1); /* FirstMultiXactId */ 130 131 #ifdef CATALOG_VARLEN /* variable-length fields start here */ 132 /* NOTE: These fields are not present in a relcache entry's rd_rel field. */ 133 /* access permissions */ 134 aclitem relacl[1] BKI_DEFAULT(_null_); 135 136 /* access-method-specific options */ 137 text reloptions[1] BKI_DEFAULT(_null_); 138 139 /* partition bound node tree */ 140 pg_node_tree relpartbound BKI_DEFAULT(_null_); 141 #endif 142 } FormData_pg_class; 143 144 /* Size of fixed part of pg_class tuples, not counting var-length fields */ 145 #define CLASS_TUPLE_SIZE \ 146 (offsetof(FormData_pg_class,relminmxid) + sizeof(TransactionId)) 147 148 /* ---------------- 149 * Form_pg_class corresponds to a pointer to a tuple with 150 * the format of pg_class relation. 151 * ---------------- 152 */ 153 typedef FormData_pg_class *Form_pg_class; 154 155 DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, on pg_class using btree(oid oid_ops)); 156 #define ClassOidIndexId 2662 157 DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, on pg_class using btree(relname name_ops, relnamespace oid_ops)); 158 #define ClassNameNspIndexId 2663 159 DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops)); 160 #define ClassTblspcRelfilenodeIndexId 3455 161 162 #ifdef EXPOSE_TO_CLIENT_CODE 163 164 #define RELKIND_RELATION 'r' /* ordinary table */ 165 #define RELKIND_INDEX 'i' /* secondary index */ 166 #define RELKIND_SEQUENCE 'S' /* sequence object */ 167 #define RELKIND_TOASTVALUE 't' /* for out-of-line values */ 168 #define RELKIND_VIEW 'v' /* view */ 169 #define RELKIND_MATVIEW 'm' /* materialized view */ 170 #define RELKIND_COMPOSITE_TYPE 'c' /* composite type */ 171 #define RELKIND_FOREIGN_TABLE 'f' /* foreign table */ 172 #define RELKIND_PARTITIONED_TABLE 'p' /* partitioned table */ 173 #define RELKIND_PARTITIONED_INDEX 'I' /* partitioned index */ 174 175 #define RELPERSISTENCE_PERMANENT 'p' /* regular table */ 176 #define RELPERSISTENCE_UNLOGGED 'u' /* unlogged permanent table */ 177 #define RELPERSISTENCE_TEMP 't' /* temporary table */ 178 179 /* default selection for replica identity (primary key or nothing) */ 180 #define REPLICA_IDENTITY_DEFAULT 'd' 181 /* no replica identity is logged for this relation */ 182 #define REPLICA_IDENTITY_NOTHING 'n' 183 /* all columns are logged as replica identity */ 184 #define REPLICA_IDENTITY_FULL 'f' 185 /* 186 * an explicitly chosen candidate key's columns are used as replica identity. 187 * Note this will still be set if the index has been dropped; in that case it 188 * has the same meaning as 'd'. 189 */ 190 #define REPLICA_IDENTITY_INDEX 'i' 191 192 /* 193 * Relation kinds that have physical storage. These relations normally have 194 * relfilenode set to non-zero, but it can also be zero if the relation is 195 * mapped. 196 */ 197 #define RELKIND_HAS_STORAGE(relkind) \ 198 ((relkind) == RELKIND_RELATION || \ 199 (relkind) == RELKIND_INDEX || \ 200 (relkind) == RELKIND_SEQUENCE || \ 201 (relkind) == RELKIND_TOASTVALUE || \ 202 (relkind) == RELKIND_MATVIEW) 203 204 205 #endif /* EXPOSE_TO_CLIENT_CODE */ 206 207 #endif /* PG_CLASS_H */ 208