1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * pg_attribute.h |
4 | * definition of the "attribute" system catalog (pg_attribute) |
5 | * |
6 | * The initial contents of pg_attribute are generated at compile time by |
7 | * genbki.pl, so there is no pg_attribute.dat file. Only "bootstrapped" |
8 | * relations need be included. |
9 | * |
10 | * |
11 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
12 | * Portions Copyright (c) 1994, Regents of the University of California |
13 | * |
14 | * src/include/catalog/pg_attribute.h |
15 | * |
16 | * NOTES |
17 | * The Catalog.pm module reads this file and derives schema |
18 | * information. |
19 | * |
20 | *------------------------------------------------------------------------- |
21 | */ |
22 | #ifndef PG_ATTRIBUTE_H |
23 | #define PG_ATTRIBUTE_H |
24 | |
25 | #include "catalog/genbki.h" |
26 | #include "catalog/pg_attribute_d.h" |
27 | |
28 | /* ---------------- |
29 | * pg_attribute definition. cpp turns this into |
30 | * typedef struct FormData_pg_attribute |
31 | * |
32 | * If you change the following, make sure you change the structs for |
33 | * system attributes in catalog/heap.c also. |
34 | * You may need to change catalog/genbki.pl as well. |
35 | * ---------------- |
36 | */ |
37 | CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,AttributeRelation_Rowtype_Id) BKI_SCHEMA_MACRO |
38 | { |
39 | Oid attrelid; /* OID of relation containing this attribute */ |
40 | NameData attname; /* name of attribute */ |
41 | |
42 | /* |
43 | * atttypid is the OID of the instance in Catalog Class pg_type that |
44 | * defines the data type of this attribute (e.g. int4). Information in |
45 | * that instance is redundant with the attlen, attbyval, and attalign |
46 | * attributes of this instance, so they had better match or Postgres will |
47 | * fail. |
48 | */ |
49 | Oid atttypid; |
50 | |
51 | /* |
52 | * attstattarget is the target number of statistics datapoints to collect |
53 | * during VACUUM ANALYZE of this column. A zero here indicates that we do |
54 | * not wish to collect any stats about this column. A "-1" here indicates |
55 | * that no value has been explicitly set for this column, so ANALYZE |
56 | * should use the default setting. |
57 | */ |
58 | int32 attstattarget BKI_DEFAULT(-1); |
59 | |
60 | /* |
61 | * attlen is a copy of the typlen field from pg_type for this attribute. |
62 | * See atttypid comments above. |
63 | */ |
64 | int16 attlen; |
65 | |
66 | /* |
67 | * attnum is the "attribute number" for the attribute: A value that |
68 | * uniquely identifies this attribute within its class. For user |
69 | * attributes, Attribute numbers are greater than 0 and not greater than |
70 | * the number of attributes in the class. I.e. if the Class pg_class says |
71 | * that Class XYZ has 10 attributes, then the user attribute numbers in |
72 | * Class pg_attribute must be 1-10. |
73 | * |
74 | * System attributes have attribute numbers less than 0 that are unique |
75 | * within the class, but not constrained to any particular range. |
76 | * |
77 | * Note that (attnum - 1) is often used as the index to an array. |
78 | */ |
79 | int16 attnum; |
80 | |
81 | /* |
82 | * attndims is the declared number of dimensions, if an array type, |
83 | * otherwise zero. |
84 | */ |
85 | int32 attndims; |
86 | |
87 | /* |
88 | * fastgetattr() uses attcacheoff to cache byte offsets of attributes in |
89 | * heap tuples. The value actually stored in pg_attribute (-1) indicates |
90 | * no cached value. But when we copy these tuples into a tuple |
91 | * descriptor, we may then update attcacheoff in the copies. This speeds |
92 | * up the attribute walking process. |
93 | */ |
94 | int32 attcacheoff BKI_DEFAULT(-1); |
95 | |
96 | /* |
97 | * atttypmod records type-specific data supplied at table creation time |
98 | * (for example, the max length of a varchar field). It is passed to |
99 | * type-specific input and output functions as the third argument. The |
100 | * value will generally be -1 for types that do not need typmod. |
101 | */ |
102 | int32 atttypmod BKI_DEFAULT(-1); |
103 | |
104 | /* |
105 | * attbyval is a copy of the typbyval field from pg_type for this |
106 | * attribute. See atttypid comments above. |
107 | */ |
108 | bool attbyval; |
109 | |
110 | /*---------- |
111 | * attstorage tells for VARLENA attributes, what the heap access |
112 | * methods can do to it if a given tuple doesn't fit into a page. |
113 | * Possible values are |
114 | * 'p': Value must be stored plain always |
115 | * 'e': Value can be stored in "secondary" relation (if relation |
116 | * has one, see pg_class.reltoastrelid) |
117 | * 'm': Value can be stored compressed inline |
118 | * 'x': Value can be stored compressed inline or in "secondary" |
119 | * Note that 'm' fields can also be moved out to secondary storage, |
120 | * but only as a last resort ('e' and 'x' fields are moved first). |
121 | *---------- |
122 | */ |
123 | char attstorage; |
124 | |
125 | /* |
126 | * attalign is a copy of the typalign field from pg_type for this |
127 | * attribute. See atttypid comments above. |
128 | */ |
129 | char attalign; |
130 | |
131 | /* This flag represents the "NOT NULL" constraint */ |
132 | bool attnotnull; |
133 | |
134 | /* Has DEFAULT value or not */ |
135 | bool atthasdef BKI_DEFAULT(f); |
136 | |
137 | /* Has a missing value or not */ |
138 | bool atthasmissing BKI_DEFAULT(f); |
139 | |
140 | /* One of the ATTRIBUTE_IDENTITY_* constants below, or '\0' */ |
141 | char attidentity BKI_DEFAULT('\0'); |
142 | |
143 | /* One of the ATTRIBUTE_GENERATED_* constants below, or '\0' */ |
144 | char attgenerated BKI_DEFAULT('\0'); |
145 | |
146 | /* Is dropped (ie, logically invisible) or not */ |
147 | bool attisdropped BKI_DEFAULT(f); |
148 | |
149 | /* |
150 | * This flag specifies whether this column has ever had a local |
151 | * definition. It is set for normal non-inherited columns, but also for |
152 | * columns that are inherited from parents if also explicitly listed in |
153 | * CREATE TABLE INHERITS. It is also set when inheritance is removed from |
154 | * a table with ALTER TABLE NO INHERIT. If the flag is set, the column is |
155 | * not dropped by a parent's DROP COLUMN even if this causes the column's |
156 | * attinhcount to become zero. |
157 | */ |
158 | bool attislocal BKI_DEFAULT(t); |
159 | |
160 | /* Number of times inherited from direct parent relation(s) */ |
161 | int32 attinhcount BKI_DEFAULT(0); |
162 | |
163 | /* attribute's collation */ |
164 | Oid attcollation; |
165 | |
166 | #ifdef CATALOG_VARLEN /* variable-length fields start here */ |
167 | /* NOTE: The following fields are not present in tuple descriptors. */ |
168 | |
169 | /* Column-level access permissions */ |
170 | aclitem attacl[1] BKI_DEFAULT(_null_); |
171 | |
172 | /* Column-level options */ |
173 | text attoptions[1] BKI_DEFAULT(_null_); |
174 | |
175 | /* Column-level FDW options */ |
176 | text attfdwoptions[1] BKI_DEFAULT(_null_); |
177 | |
178 | /* |
179 | * Missing value for added columns. This is a one element array which lets |
180 | * us store a value of the attribute type here. |
181 | */ |
182 | anyarray attmissingval BKI_DEFAULT(_null_); |
183 | #endif |
184 | } FormData_pg_attribute; |
185 | |
186 | /* |
187 | * ATTRIBUTE_FIXED_PART_SIZE is the size of the fixed-layout, |
188 | * guaranteed-not-null part of a pg_attribute row. This is in fact as much |
189 | * of the row as gets copied into tuple descriptors, so don't expect you |
190 | * can access fields beyond attcollation except in a real tuple! |
191 | */ |
192 | #define ATTRIBUTE_FIXED_PART_SIZE \ |
193 | (offsetof(FormData_pg_attribute,attcollation) + sizeof(Oid)) |
194 | |
195 | /* ---------------- |
196 | * Form_pg_attribute corresponds to a pointer to a tuple with |
197 | * the format of pg_attribute relation. |
198 | * ---------------- |
199 | */ |
200 | typedef FormData_pg_attribute *Form_pg_attribute; |
201 | |
202 | #ifdef EXPOSE_TO_CLIENT_CODE |
203 | |
204 | #define ATTRIBUTE_IDENTITY_ALWAYS 'a' |
205 | #define ATTRIBUTE_IDENTITY_BY_DEFAULT 'd' |
206 | |
207 | #define ATTRIBUTE_GENERATED_STORED 's' |
208 | |
209 | #endif /* EXPOSE_TO_CLIENT_CODE */ |
210 | |
211 | #endif /* PG_ATTRIBUTE_H */ |
212 | |