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