Skip to content

Commit 38e936a

Browse files
author
Commitfest Bot
committed
[CF 3701] v42 - Reducing planning time when tables have many partitions
This branch was automatically generated by a robot using patches from an email thread registered at: https://commitfest.postgresql.org/patch/3701 The branch will be overwritten each time a new patch version is posted to the thread, and also periodically to check for bitrot caused by changes on the master branch. Patch(es): https://www.postgresql.org/message-id/CAApHDvpf+2rUi3rOepS9jMjiS3ezH9VcZisS+A+Ob5G5YpBZxg@mail.gmail.com Author(s): Yuya Watari
2 parents 46b4ba5 + 1d7f52c commit 38e936a

File tree

9 files changed

+446
-120
lines changed

9 files changed

+446
-120
lines changed

contrib/postgres_fdw/postgres_fdw.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7847,14 +7847,13 @@ conversion_error_callback(void *arg)
78477847
EquivalenceMember *
78487848
find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel)
78497849
{
7850-
ListCell *lc;
7851-
78527850
PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) rel->fdw_private;
7851+
EquivalenceMemberIterator it;
7852+
EquivalenceMember *em;
78537853

7854-
foreach(lc, ec->ec_members)
7854+
setup_eclass_member_iterator(&it, ec, rel->relids);
7855+
while ((em = eclass_member_iterator_next(&it)) != NULL)
78557856
{
7856-
EquivalenceMember *em = (EquivalenceMember *) lfirst(lc);
7857-
78587857
/*
78597858
* Note we require !bms_is_empty, else we'd accept constant
78607859
* expressions which are not suitable for the purpose.
@@ -7908,7 +7907,10 @@ find_em_for_rel_target(PlannerInfo *root, EquivalenceClass *ec,
79087907
while (expr && IsA(expr, RelabelType))
79097908
expr = ((RelabelType *) expr)->arg;
79107909

7911-
/* Locate an EquivalenceClass member matching this expr, if any */
7910+
/*
7911+
* Locate an EquivalenceClass member matching this expr, if any.
7912+
* Ignore child members.
7913+
*/
79127914
foreach(lc2, ec->ec_members)
79137915
{
79147916
EquivalenceMember *em = (EquivalenceMember *) lfirst(lc2);
@@ -7918,9 +7920,8 @@ find_em_for_rel_target(PlannerInfo *root, EquivalenceClass *ec,
79187920
if (em->em_is_const)
79197921
continue;
79207922

7921-
/* Ignore child members */
7922-
if (em->em_is_child)
7923-
continue;
7923+
/* Child members should not exist in ec_members */
7924+
Assert(!em->em_is_child);
79247925

79257926
/* Match if same expression (after stripping relabel) */
79267927
em_expr = em->em_expr;

src/backend/nodes/outfuncs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,9 @@ _outEquivalenceClass(StringInfo str, const EquivalenceClass *node)
465465

466466
WRITE_NODE_FIELD(ec_opfamilies);
467467
WRITE_OID_FIELD(ec_collation);
468+
WRITE_INT_FIELD(ec_childmembers_size);
468469
WRITE_NODE_FIELD(ec_members);
470+
WRITE_NODE_ARRAY(ec_childmembers, node->ec_childmembers_size);
469471
WRITE_NODE_FIELD(ec_sources);
470472
/* Only ec_derives_list is written; hash is not serialized. */
471473
WRITE_NODE_FIELD(ec_derives_list);

0 commit comments

Comments
 (0)