| 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 | |