1 /*------------------------------------------------------------------------- 2 * 3 * pg_class.h 4 * definition of the system "relation" relation (pg_class) 5 * along with the relation's initial contents. 6 * 7 * 8 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group 9 * Portions Copyright (c) 1994, Regents of the University of California 10 * 11 * src/include/catalog/pg_class.h 12 * 13 * NOTES 14 * the genbki.pl script reads this file and generates .bki 15 * information from the DATA() statements. 16 * 17 *------------------------------------------------------------------------- 18 */ 19 #ifndef PG_CLASS_H 20 #define PG_CLASS_H 21 22 #include "catalog/genbki.h" 23 24 /* ---------------- 25 * pg_class definition. cpp turns this into 26 * typedef struct FormData_pg_class 27 * ---------------- 28 */ 29 #define RelationRelationId 1259 30 #define RelationRelation_Rowtype_Id 83 31 32 CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO 33 { 34 NameData relname; /* class name */ 35 Oid relnamespace; /* OID of namespace containing this class */ 36 Oid reltype; /* OID of entry in pg_type for table's 37 * implicit row type */ 38 Oid reloftype; /* OID of entry in pg_type for underlying 39 * composite type */ 40 Oid relowner; /* class owner */ 41 Oid relam; /* index access method; 0 if not an index */ 42 Oid relfilenode; /* identifier of physical storage file */ 43 44 /* relfilenode == 0 means it is a "mapped" relation, see relmapper.c */ 45 Oid reltablespace; /* identifier of table space for relation */ 46 int32 relpages; /* # of blocks (not always up-to-date) */ 47 float4 reltuples; /* # of tuples (not always up-to-date) */ 48 int32 relallvisible; /* # of all-visible blocks (not always 49 * up-to-date) */ 50 Oid reltoastrelid; /* OID of toast table; 0 if none */ 51 bool relhasindex; /* T if has (or has had) any indexes */ 52 bool relisshared; /* T if shared across databases */ 53 char relpersistence; /* see RELPERSISTENCE_xxx constants below */ 54 char relkind; /* see RELKIND_xxx constants below */ 55 int16 relnatts; /* number of user attributes */ 56 57 /* 58 * Class pg_attribute must contain exactly "relnatts" user attributes 59 * (with attnums ranging from 1 to relnatts) for this class. It may also 60 * contain entries with negative attnums for system attributes. 61 */ 62 int16 relchecks; /* # of CHECK constraints for class */ 63 bool relhasoids; /* T if we generate OIDs for rows of rel */ 64 bool relhaspkey; /* has (or has had) PRIMARY KEY index */ 65 bool relhasrules; /* has (or has had) any rules */ 66 bool relhastriggers; /* has (or has had) any TRIGGERs */ 67 bool relhassubclass; /* has (or has had) derived classes */ 68 bool relrowsecurity; /* row security is enabled or not */ 69 bool relforcerowsecurity; /* row security forced for owners or 70 * not */ 71 bool relispopulated; /* matview currently holds query results */ 72 char relreplident; /* see REPLICA_IDENTITY_xxx constants */ 73 bool relispartition; /* is relation a partition? */ 74 TransactionId relfrozenxid; /* all Xids < this are frozen in this rel */ 75 TransactionId relminmxid; /* all multixacts in this rel are >= this. 76 * this is really a MultiXactId */ 77 78 #ifdef CATALOG_VARLEN /* variable-length fields start here */ 79 /* NOTE: These fields are not present in a relcache entry's rd_rel field. */ 80 aclitem relacl[1]; /* access permissions */ 81 text reloptions[1]; /* access-method-specific options */ 82 pg_node_tree relpartbound; /* partition bound node tree */ 83 #endif 84 } FormData_pg_class; 85 86 /* Size of fixed part of pg_class tuples, not counting var-length fields */ 87 #define CLASS_TUPLE_SIZE \ 88 (offsetof(FormData_pg_class,relminmxid) + sizeof(TransactionId)) 89 90 /* ---------------- 91 * Form_pg_class corresponds to a pointer to a tuple with 92 * the format of pg_class relation. 93 * ---------------- 94 */ 95 typedef FormData_pg_class *Form_pg_class; 96 97 /* ---------------- 98 * compiler constants for pg_class 99 * ---------------- 100 */ 101 102 #define Natts_pg_class 33 103 #define Anum_pg_class_relname 1 104 #define Anum_pg_class_relnamespace 2 105 #define Anum_pg_class_reltype 3 106 #define Anum_pg_class_reloftype 4 107 #define Anum_pg_class_relowner 5 108 #define Anum_pg_class_relam 6 109 #define Anum_pg_class_relfilenode 7 110 #define Anum_pg_class_reltablespace 8 111 #define Anum_pg_class_relpages 9 112 #define Anum_pg_class_reltuples 10 113 #define Anum_pg_class_relallvisible 11 114 #define Anum_pg_class_reltoastrelid 12 115 #define Anum_pg_class_relhasindex 13 116 #define Anum_pg_class_relisshared 14 117 #define Anum_pg_class_relpersistence 15 118 #define Anum_pg_class_relkind 16 119 #define Anum_pg_class_relnatts 17 120 #define Anum_pg_class_relchecks 18 121 #define Anum_pg_class_relhasoids 19 122 #define Anum_pg_class_relhaspkey 20 123 #define Anum_pg_class_relhasrules 21 124 #define Anum_pg_class_relhastriggers 22 125 #define Anum_pg_class_relhassubclass 23 126 #define Anum_pg_class_relrowsecurity 24 127 #define Anum_pg_class_relforcerowsecurity 25 128 #define Anum_pg_class_relispopulated 26 129 #define Anum_pg_class_relreplident 27 130 #define Anum_pg_class_relispartition 28 131 #define Anum_pg_class_relfrozenxid 29 132 #define Anum_pg_class_relminmxid 30 133 #define Anum_pg_class_relacl 31 134 #define Anum_pg_class_reloptions 32 135 #define Anum_pg_class_relpartbound 33 136 137 /* ---------------- 138 * initial contents of pg_class 139 * 140 * NOTE: only "bootstrapped" relations need to be declared here. Be sure that 141 * the OIDs listed here match those given in their CATALOG macros, and that 142 * the relnatts values are correct. 143 * ---------------- 144 */ 145 146 /* 147 * Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId; 148 * similarly, "1" in relminmxid stands for FirstMultiXactId 149 */ 150 DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 30 0 t f f f f f f t n f 3 1 _null_ _null_ _null_)); 151 DESCR(""); 152 DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 22 0 f f f f f f f t n f 3 1 _null_ _null_ _null_)); 153 DESCR(""); 154 DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 29 0 t f f f f f f t n f 3 1 _null_ _null_ _null_)); 155 DESCR(""); 156 DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 33 0 t f f f f f f t n f 3 1 _null_ _null_ _null_)); 157 DESCR(""); 158 159 160 #define RELKIND_RELATION 'r' /* ordinary table */ 161 #define RELKIND_INDEX 'i' /* secondary index */ 162 #define RELKIND_SEQUENCE 'S' /* sequence object */ 163 #define RELKIND_TOASTVALUE 't' /* for out-of-line values */ 164 #define RELKIND_VIEW 'v' /* view */ 165 #define RELKIND_MATVIEW 'm' /* materialized view */ 166 #define RELKIND_COMPOSITE_TYPE 'c' /* composite type */ 167 #define RELKIND_FOREIGN_TABLE 'f' /* foreign table */ 168 #define RELKIND_PARTITIONED_TABLE 'p' /* partitioned table */ 169 170 #define RELPERSISTENCE_PERMANENT 'p' /* regular table */ 171 #define RELPERSISTENCE_UNLOGGED 'u' /* unlogged permanent table */ 172 #define RELPERSISTENCE_TEMP 't' /* temporary table */ 173 174 /* default selection for replica identity (primary key or nothing) */ 175 #define REPLICA_IDENTITY_DEFAULT 'd' 176 /* no replica identity is logged for this relation */ 177 #define REPLICA_IDENTITY_NOTHING 'n' 178 /* all columns are logged as replica identity */ 179 #define REPLICA_IDENTITY_FULL 'f' 180 /* 181 * an explicitly chosen candidate key's columns are used as replica identity. 182 * Note this will still be set if the index has been dropped; in that case it 183 * has the same meaning as 'd'. 184 */ 185 #define REPLICA_IDENTITY_INDEX 'i' 186 187 #endif /* PG_CLASS_H */ 188