1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * partprune.h |
4 | * prototypes for partprune.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/partitioning/partprune.h |
11 | * |
12 | *------------------------------------------------------------------------- |
13 | */ |
14 | #ifndef PARTPRUNE_H |
15 | #define PARTPRUNE_H |
16 | |
17 | #include "nodes/execnodes.h" |
18 | #include "partitioning/partdefs.h" |
19 | |
20 | struct PlannerInfo; /* avoid including pathnodes.h here */ |
21 | struct RelOptInfo; |
22 | |
23 | |
24 | /* |
25 | * PartitionPruneContext |
26 | * Stores information needed at runtime for pruning computations |
27 | * related to a single partitioned table. |
28 | * |
29 | * strategy Partition strategy, e.g. LIST, RANGE, HASH. |
30 | * partnatts Number of columns in the partition key. |
31 | * nparts Number of partitions in this partitioned table. |
32 | * boundinfo Partition boundary info for the partitioned table. |
33 | * partcollation Array of partnatts elements, storing the collations of the |
34 | * partition key columns. |
35 | * partsupfunc Array of FmgrInfos for the comparison or hashing functions |
36 | * associated with the partition keys (partnatts elements). |
37 | * (This points into the partrel's partition key, typically.) |
38 | * stepcmpfuncs Array of FmgrInfos for the comparison or hashing function |
39 | * for each pruning step and partition key. |
40 | * ppccontext Memory context holding this PartitionPruneContext's |
41 | * subsidiary data, such as the FmgrInfos. |
42 | * planstate Points to the parent plan node's PlanState when called |
43 | * during execution; NULL when called from the planner. |
44 | * exprstates Array of ExprStates, indexed as per PruneCxtStateIdx; one |
45 | * for each partition key in each pruning step. Allocated if |
46 | * planstate is non-NULL, otherwise NULL. |
47 | */ |
48 | typedef struct PartitionPruneContext |
49 | { |
50 | char strategy; |
51 | int partnatts; |
52 | int nparts; |
53 | PartitionBoundInfo boundinfo; |
54 | Oid *partcollation; |
55 | FmgrInfo *partsupfunc; |
56 | FmgrInfo *stepcmpfuncs; |
57 | MemoryContext ppccontext; |
58 | PlanState *planstate; |
59 | ExprState **exprstates; |
60 | } PartitionPruneContext; |
61 | |
62 | /* |
63 | * PruneCxtStateIdx() computes the correct index into the stepcmpfuncs[], |
64 | * exprstates[] and exprhasexecparam[] arrays for step step_id and |
65 | * partition key column keyno. (Note: there is code that assumes the |
66 | * entries for a given step are sequential, so this is not chosen freely.) |
67 | */ |
68 | #define PruneCxtStateIdx(partnatts, step_id, keyno) \ |
69 | ((partnatts) * (step_id) + (keyno)) |
70 | |
71 | extern PartitionPruneInfo *make_partition_pruneinfo(struct PlannerInfo *root, |
72 | struct RelOptInfo *parentrel, |
73 | List *subpaths, |
74 | List *partitioned_rels, |
75 | List *prunequal); |
76 | extern Bitmapset *prune_append_rel_partitions(struct RelOptInfo *rel); |
77 | extern Bitmapset *get_matching_partitions(PartitionPruneContext *context, |
78 | List *pruning_steps); |
79 | |
80 | #endif /* PARTPRUNE_H */ |
81 | |