From: Tom Lane Date: Fri, 22 Mar 2019 18:16:50 +0000 (-0400) Subject: Don't copy PartitionBoundInfo in set_relation_partition_info. X-Git-Tag: REL_12_BETA1~461 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c8151e642368599dc77c4448e6bdc34cc8810475;p=thirdparty%2Fpostgresql.git 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 --- diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 30f4dc151bc..702c4f89b82 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -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);