1 /*-------------------------------------------------------------------------
2  *
3  * partcache.h
4  *
5  * Copyright (c) 1996-2019, PostgreSQL Global Development Group
6  *
7  * src/include/utils/partcache.h
8  *
9  *-------------------------------------------------------------------------
10  */
11 #ifndef PARTCACHE_H
12 #define PARTCACHE_H
13 
14 #include "access/attnum.h"
15 #include "fmgr.h"
16 #include "nodes/pg_list.h"
17 #include "nodes/primnodes.h"
18 #include "partitioning/partdefs.h"
19 #include "utils/relcache.h"
20 
21 /*
22  * Information about the partition key of a relation
23  */
24 typedef struct PartitionKeyData
25 {
26 	char		strategy;		/* partitioning strategy */
27 	int16		partnatts;		/* number of columns in the partition key */
28 	AttrNumber *partattrs;		/* attribute numbers of columns in the
29 								 * partition key or 0 if it's an expr */
30 	List	   *partexprs;		/* list of expressions in the partitioning
31 								 * key, one for each zero-valued partattrs */
32 
33 	Oid		   *partopfamily;	/* OIDs of operator families */
34 	Oid		   *partopcintype;	/* OIDs of opclass declared input data types */
35 	FmgrInfo   *partsupfunc;	/* lookup info for support funcs */
36 
37 	/* Partitioning collation per attribute */
38 	Oid		   *partcollation;
39 
40 	/* Type information per attribute */
41 	Oid		   *parttypid;
42 	int32	   *parttypmod;
43 	int16	   *parttyplen;
44 	bool	   *parttypbyval;
45 	char	   *parttypalign;
46 	Oid		   *parttypcoll;
47 }			PartitionKeyData;
48 
49 extern void RelationBuildPartitionKey(Relation relation);
50 extern List *RelationGetPartitionQual(Relation rel);
51 extern Expr *get_partition_qual_relid(Oid relid);
52 
53 /*
54  * PartitionKey inquiry functions
55  */
56 static inline int
57 get_partition_strategy(PartitionKey key)
58 {
59 	return key->strategy;
60 }
61 
62 static inline int
63 get_partition_natts(PartitionKey key)
64 {
65 	return key->partnatts;
66 }
67 
68 static inline List *
69 get_partition_exprs(PartitionKey key)
70 {
71 	return key->partexprs;
72 }
73 
74 /*
75  * PartitionKey inquiry functions - one column
76  */
77 static inline int16
78 get_partition_col_attnum(PartitionKey key, int col)
79 {
80 	return key->partattrs[col];
81 }
82 
83 static inline Oid
84 get_partition_col_typid(PartitionKey key, int col)
85 {
86 	return key->parttypid[col];
87 }
88 
89 static inline int32
90 get_partition_col_typmod(PartitionKey key, int col)
91 {
92 	return key->parttypmod[col];
93 }
94 
95 static inline Oid
96 get_partition_col_collation(PartitionKey key, int col)
97 {
98 	return key->partcollation[col];
99 }
100 
101 #endif							/* PARTCACHE_H */
102