1 /*-------------------------------------------------------------------------
2  *
3  * partcache.h
4  *
5  * Copyright (c) 1996-2021, 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 
50 extern PartitionKey RelationGetPartitionKey(Relation rel);
51 extern List *RelationGetPartitionQual(Relation rel);
52 extern Expr *get_partition_qual_relid(Oid relid);
53 
54 /*
55  * PartitionKey inquiry functions
56  */
57 static inline int
get_partition_strategy(PartitionKey key)58 get_partition_strategy(PartitionKey key)
59 {
60 	return key->strategy;
61 }
62 
63 static inline int
get_partition_natts(PartitionKey key)64 get_partition_natts(PartitionKey key)
65 {
66 	return key->partnatts;
67 }
68 
69 static inline List *
get_partition_exprs(PartitionKey key)70 get_partition_exprs(PartitionKey key)
71 {
72 	return key->partexprs;
73 }
74 
75 /*
76  * PartitionKey inquiry functions - one column
77  */
78 static inline int16
get_partition_col_attnum(PartitionKey key,int col)79 get_partition_col_attnum(PartitionKey key, int col)
80 {
81 	return key->partattrs[col];
82 }
83 
84 static inline Oid
get_partition_col_typid(PartitionKey key,int col)85 get_partition_col_typid(PartitionKey key, int col)
86 {
87 	return key->parttypid[col];
88 }
89 
90 static inline int32
get_partition_col_typmod(PartitionKey key,int col)91 get_partition_col_typmod(PartitionKey key, int col)
92 {
93 	return key->parttypmod[col];
94 }
95 
96 static inline Oid
get_partition_col_collation(PartitionKey key,int col)97 get_partition_col_collation(PartitionKey key, int col)
98 {
99 	return key->partcollation[col];
100 }
101 
102 #endif							/* PARTCACHE_H */
103