multi-level-inh-lateral-join-info.patch
text/x-diff
Filename: multi-level-inh-lateral-join-info.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/initsplan.c | 13 | 1 |
commit d69aeabcfcb58f349602a1b7392c611045c37465
Author: amit <amitlangote09@gmail.com>
Date: Tue Sep 27 20:01:44 2016 +0900
Consider multi-level partitioned tables in create_lateral_join_info().
diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c
index 84ce6b3..74734f2 100644
--- a/src/backend/optimizer/plan/initsplan.c
+++ b/src/backend/optimizer/plan/initsplan.c
@@ -14,6 +14,7 @@
*/
#include "postgres.h"
+#include "catalog/pg_class.h"
#include "catalog/pg_type.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/clauses.h"
@@ -623,8 +624,19 @@ create_lateral_join_info(PlannerInfo *root)
for (rti = 1; rti < root->simple_rel_array_size; rti++)
{
RelOptInfo *brel = root->simple_rel_array[rti];
+ RangeTblEntry *rte = root->simple_rte_array[rti];
- if (brel == NULL || brel->reloptkind != RELOPT_BASEREL)
+ if (brel == NULL)
+ continue;
+
+ /*
+ * If an "other rel" RTE is a "partitioned table", we must propagate
+ * the lateral info inherited from the parent to its children. That's
+ * because they are not linked directly with the parent via
+ * AppendRelInfo's (see expand_inherited_rte_internal()).
+ */
+ if (brel->reloptkind != RELOPT_BASEREL &&
+ rte->relkind != RELKIND_PARTITIONED_TABLE)
continue;
if (root->simple_rte_array[rti]->inh)