1 /*-------------------------------------------------------------------------
2  *
3  * heap.h
4  *	  prototypes for functions in backend/catalog/heap.c
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/heap.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef HEAP_H
15 #define HEAP_H
16 
17 #include "catalog/indexing.h"
18 #include "catalog/objectaddress.h"
19 #include "parser/parse_node.h"
20 
21 
22 /* flag bits for CheckAttributeType/CheckAttributeNamesTypes */
23 #define CHKATYPE_ANYARRAY		0x01	/* allow ANYARRAY */
24 #define CHKATYPE_ANYRECORD		0x02	/* allow RECORD and RECORD[] */
25 #define CHKATYPE_IS_PARTKEY		0x04	/* attname is part key # not column */
26 
27 typedef struct RawColumnDefault
28 {
29 	AttrNumber	attnum;			/* attribute to attach default to */
30 	Node	   *raw_default;	/* default value (untransformed parse tree) */
31 	bool		missingMode;	/* true if part of add column processing */
32 	char		generated;		/* attgenerated setting */
33 } RawColumnDefault;
34 
35 typedef struct CookedConstraint
36 {
37 	ConstrType	contype;		/* CONSTR_DEFAULT or CONSTR_CHECK */
38 	Oid			conoid;			/* constr OID if created, otherwise Invalid */
39 	char	   *name;			/* name, or NULL if none */
40 	AttrNumber	attnum;			/* which attr (only for DEFAULT) */
41 	Node	   *expr;			/* transformed default or check expr */
42 	bool		skip_validation;	/* skip validation? (only for CHECK) */
43 	bool		is_local;		/* constraint has local (non-inherited) def */
44 	int			inhcount;		/* number of times constraint is inherited */
45 	bool		is_no_inherit;	/* constraint has local def and cannot be
46 								 * inherited */
47 } CookedConstraint;
48 
49 extern Relation heap_create(const char *relname,
50 							Oid relnamespace,
51 							Oid reltablespace,
52 							Oid relid,
53 							Oid relfilenode,
54 							Oid accessmtd,
55 							TupleDesc tupDesc,
56 							char relkind,
57 							char relpersistence,
58 							bool shared_relation,
59 							bool mapped_relation,
60 							bool allow_system_table_mods,
61 							TransactionId *relfrozenxid,
62 							MultiXactId *relminmxid);
63 
64 extern Oid	heap_create_with_catalog(const char *relname,
65 									 Oid relnamespace,
66 									 Oid reltablespace,
67 									 Oid relid,
68 									 Oid reltypeid,
69 									 Oid reloftypeid,
70 									 Oid ownerid,
71 									 Oid accessmtd,
72 									 TupleDesc tupdesc,
73 									 List *cooked_constraints,
74 									 char relkind,
75 									 char relpersistence,
76 									 bool shared_relation,
77 									 bool mapped_relation,
78 									 OnCommitAction oncommit,
79 									 Datum reloptions,
80 									 bool use_user_acl,
81 									 bool allow_system_table_mods,
82 									 bool is_internal,
83 									 Oid relrewrite,
84 									 ObjectAddress *typaddress);
85 
86 extern void heap_drop_with_catalog(Oid relid);
87 
88 extern void heap_truncate(List *relids);
89 
90 extern void heap_truncate_one_rel(Relation rel);
91 
92 extern void heap_truncate_check_FKs(List *relations, bool tempTables);
93 
94 extern List *heap_truncate_find_FKs(List *relationIds);
95 
96 extern void InsertPgAttributeTuple(Relation pg_attribute_rel,
97 								   Form_pg_attribute new_attribute,
98 								   CatalogIndexState indstate);
99 
100 extern void InsertPgClassTuple(Relation pg_class_desc,
101 							   Relation new_rel_desc,
102 							   Oid new_rel_oid,
103 							   Datum relacl,
104 							   Datum reloptions);
105 
106 extern List *AddRelationNewConstraints(Relation rel,
107 									   List *newColDefaults,
108 									   List *newConstraints,
109 									   bool allow_merge,
110 									   bool is_local,
111 									   bool is_internal,
112 									   const char *queryString);
113 
114 extern void RelationClearMissing(Relation rel);
115 extern void SetAttrMissing(Oid relid, char *attname, char *value);
116 
117 extern Oid	StoreAttrDefault(Relation rel, AttrNumber attnum,
118 							 Node *expr, bool is_internal,
119 							 bool add_column_mode);
120 
121 extern Node *cookDefault(ParseState *pstate,
122 						 Node *raw_default,
123 						 Oid atttypid,
124 						 int32 atttypmod,
125 						 const char *attname,
126 						 char attgenerated);
127 
128 extern void DeleteRelationTuple(Oid relid);
129 extern void DeleteAttributeTuples(Oid relid);
130 extern void DeleteSystemAttributeTuples(Oid relid);
131 extern void RemoveAttributeById(Oid relid, AttrNumber attnum);
132 extern void RemoveAttrDefault(Oid relid, AttrNumber attnum,
133 							  DropBehavior behavior, bool complain, bool internal);
134 extern void RemoveAttrDefaultById(Oid attrdefId);
135 extern void CopyStatistics(Oid fromrelid, Oid torelid);
136 extern void RemoveStatistics(Oid relid, AttrNumber attnum);
137 
138 extern const FormData_pg_attribute *SystemAttributeDefinition(AttrNumber attno);
139 
140 extern const FormData_pg_attribute *SystemAttributeByName(const char *attname);
141 
142 extern void CheckAttributeNamesTypes(TupleDesc tupdesc, char relkind,
143 									 int flags);
144 
145 extern void CheckAttributeType(const char *attname,
146 							   Oid atttypid, Oid attcollation,
147 							   List *containing_rowtypes,
148 							   int flags);
149 
150 /* pg_partitioned_table catalog manipulation functions */
151 extern void StorePartitionKey(Relation rel,
152 							  char strategy,
153 							  int16 partnatts,
154 							  AttrNumber *partattrs,
155 							  List *partexprs,
156 							  Oid *partopclass,
157 							  Oid *partcollation);
158 extern void RemovePartitionKeyByRelId(Oid relid);
159 extern void StorePartitionBound(Relation rel, Relation parent,
160 								PartitionBoundSpec *bound);
161 
162 #endif							/* HEAP_H */
163