| /*------------------------------------------------------------------------- |
| * |
| * partdesc.h |
| * |
| * Copyright (c) 1996-2023, PostgreSQL Global Development Group |
| * |
| * src/include/partitioning/partdesc.h |
| * |
| *------------------------------------------------------------------------- |
| */ |
| |
| #ifndef PARTDESC_H |
| #define PARTDESC_H |
| |
| #include "partitioning/partdefs.h" |
| #include "utils/relcache.h" |
| |
| /* |
| * Information about partitions of a partitioned table. |
| * |
| * For partitioned tables where detached partitions exist, we only cache |
| * descriptors that include all partitions, including detached; when we're |
| * requested a descriptor without the detached partitions, we create one |
| * afresh each time. (The reason for this is that the set of detached |
| * partitions that are visible to each caller depends on the snapshot it has, |
| * so it's pretty much impossible to evict a descriptor from cache at the |
| * right time.) |
| */ |
| typedef struct PartitionDescData |
| { |
| int nparts; /* Number of partitions */ |
| bool detached_exist; /* Are there any detached partitions? */ |
| Oid *oids; /* Array of 'nparts' elements containing |
| * partition OIDs in order of their bounds */ |
| bool *is_leaf; /* Array of 'nparts' elements storing whether |
| * the corresponding 'oids' element belongs to |
| * a leaf partition or not */ |
| PartitionBoundInfo boundinfo; /* collection of partition bounds */ |
| |
| /* Caching fields to cache lookups in get_partition_for_tuple() */ |
| |
| /* |
| * Index into the PartitionBoundInfo's datum array for the last found |
| * partition or -1 if none. |
| */ |
| int last_found_datum_index; |
| |
| /* |
| * Partition index of the last found partition or -1 if none has been |
| * found yet. |
| */ |
| int last_found_part_index; |
| |
| /* |
| * For LIST partitioning, this is the number of times in a row that the |
| * datum we're looking for a partition for matches the datum in the |
| * last_found_datum_index index of the boundinfo->datums array. For RANGE |
| * partitioning, this is the number of times in a row we've found that the |
| * datum we're looking for a partition for falls into the range of the |
| * partition corresponding to the last_found_datum_index index of the |
| * boundinfo->datums array. |
| */ |
| int last_found_count; |
| } PartitionDescData; |
| |
| |
| extern PartitionDesc RelationGetPartitionDesc(Relation rel, bool omit_detached); |
| |
| extern PartitionDirectory CreatePartitionDirectory(MemoryContext mcxt, bool omit_detached); |
| extern PartitionDesc PartitionDirectoryLookup(PartitionDirectory, Relation); |
| extern void DestroyPartitionDirectory(PartitionDirectory pdir); |
| |
| extern Oid get_default_oid_from_partdesc(PartitionDesc partdesc); |
| |
| #endif /* PARTCACHE_H */ |