Don't copy PartitionBoundInfo in set_relation_partition_info.
authorTom Lane <[email protected]>
Fri, 22 Mar 2019 18:16:50 +0000 (14:16 -0400)
committerTom Lane <[email protected]>
Fri, 22 Mar 2019 18:16:58 +0000 (14:16 -0400)
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

src/backend/optimizer/util/plancat.c

index 30f4dc151bc8e3efd476348f3aca9a428ea56cde..702c4f89b82aea43d22f9dcc74f307cc0b57d428 100644 (file)
@@ -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);