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