Don't copy PartitionBoundInfo in set_relation_partition_info.
I (tgl) remain dubious that it's a good idea for PartitionDirectory to hold a pin on a relcache entry throughout planning, rather than copying the data or using some kind of refcount scheme. However, it's certainly the responsibility of the PartitionDirectory code to ensure that what it's handing back is a stable data structure, not that of its caller. So this is a pretty clear oversight in commit 898e5e329, and one that can cost a lot of performance when there are many partitions. Amit Langote (extracted from a much larger patch set) Discussion: https://postgr.es/m/CA+TgmoY3bRmGB6-DUnoVy5fJoreiBJ43rwMrQRCdPXuKt4Ykaw@mail.gmail.com Discussion: https://postgr.es/m/9d7c5112-cb99-6a47-d3be-cf1ee6862a1d@lab.ntt.co.jp
This commit is contained in:
parent
b5fd4972a3
commit
c8151e6423
@ -39,7 +39,6 @@
|
||||
#include "optimizer/optimizer.h"
|
||||
#include "optimizer/plancat.h"
|
||||
#include "optimizer/prep.h"
|
||||
#include "partitioning/partbounds.h"
|
||||
#include "partitioning/partdesc.h"
|
||||
#include "parser/parse_relation.h"
|
||||
#include "parser/parsetree.h"
|
||||
@ -2082,16 +2081,14 @@ set_relation_partition_info(PlannerInfo *root, RelOptInfo *rel,
|
||||
Relation relation)
|
||||
{
|
||||
PartitionDesc partdesc;
|
||||
PartitionKey partkey;
|
||||
|
||||
Assert(relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
|
||||
|
||||
partdesc = PartitionDirectoryLookup(root->glob->partition_directory,
|
||||
relation);
|
||||
partkey = RelationGetPartitionKey(relation);
|
||||
rel->part_scheme = find_partition_scheme(root, relation);
|
||||
Assert(partdesc != NULL && rel->part_scheme != NULL);
|
||||
rel->boundinfo = partition_bounds_copy(partdesc->boundinfo, partkey);
|
||||
rel->boundinfo = partdesc->boundinfo;
|
||||
rel->nparts = partdesc->nparts;
|
||||
set_baserel_partition_key_exprs(relation, rel);
|
||||
rel->partition_qual = RelationGetPartitionQual(relation);
|
||||
|
Loading…
x
Reference in New Issue
Block a user