@@ -72,7 +72,7 @@ static PlannedStmt * pathman_planner_hook(Query *parse, int cursorOptions, Param
72
72
73
73
/* Utility functions */
74
74
static void handle_modification_query (Query * parse );
75
- static void append_child_relation (PlannerInfo * root ,RelOptInfo * rel ,Index rti ,
75
+ static int append_child_relation (PlannerInfo * root ,RelOptInfo * rel ,Index rti ,
76
76
RangeTblEntry * rte ,int index ,Oid childOID ,List * wrappers );
77
77
static Node * wrapper_make_expression (WrapperNode * wrap ,int index ,bool * alwaysTrue );
78
78
static void disable_inheritance (Query * parse );
@@ -391,6 +391,7 @@ pathman_set_rel_pathlist_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, Ran
391
391
RangeTblEntry * * new_rte_array ;
392
392
int len ;
393
393
bool found ;
394
+ int first_child_relid = 0 ;
394
395
395
396
/* This works only for SELECT queries */
396
397
if (root -> parse -> commandType != CMD_SELECT || !inheritance_disabled )
@@ -467,36 +468,26 @@ pathman_set_rel_pathlist_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, Ran
467
468
468
469
for (i = irange_lower (irange );i <=irange_upper (irange );i ++ )
469
470
{
471
+ int idx ;
472
+
470
473
childOid = dsm_arr [i ];
471
- append_child_relation (root ,rel ,rti ,rte ,i ,childOid ,wrappers );
474
+ idx = append_child_relation (root ,rel ,rti ,rte ,i ,childOid ,wrappers );
475
+
476
+ if (!first_child_relid )
477
+ first_child_relid = idx ;
472
478
}
473
479
}
474
480
475
481
/* Clear old path list */
476
482
list_free (rel -> pathlist );
477
483
478
484
/* Set apropriate varnos */
479
- if (root -> simple_rel_array_size > 2 )
485
+ if (first_child_relid )
480
486
{
481
- foreach (lc ,root -> eq_classes )
482
- {
483
- EquivalenceClass * cur_ec = (EquivalenceClass * )lfirst (lc );
484
-
485
- if (list_length (cur_ec -> ec_members )> 1 )
486
- {
487
- EquivalenceMember * orig_em = (EquivalenceMember * )linitial (cur_ec -> ec_members );
488
-
489
- change_varnos ((Node * )orig_em -> em_expr ,rti ,root -> simple_rel_array [2 ]-> relid );
490
- }
491
- }
492
-
493
- foreach (lc ,root -> parse -> targetList )
494
- {
495
- TargetEntry * t = (TargetEntry * )lfirst (lc );
496
-
497
- change_varnos ((Node * )t -> expr ,rti ,root -> simple_rel_array [2 ]-> relid );
498
- }
499
- change_varnos ((Node * )rel -> reltargetlist ,rti ,root -> simple_rel_array [2 ]-> relid );
487
+ change_varnos ((Node * )root -> canon_pathkeys ,rti ,first_child_relid );
488
+ change_varnos ((Node * )root -> eq_classes ,rti ,first_child_relid );
489
+ change_varnos ((Node * )root -> parse -> targetList ,rti ,first_child_relid );
490
+ change_varnos ((Node * )rel -> reltargetlist ,rti ,first_child_relid );
500
491
}
501
492
502
493
rel -> pathlist = NIL ;
@@ -553,7 +544,11 @@ set_append_rel_size(PlannerInfo *root, RelOptInfo *rel,
553
544
rel -> tuples = parent_rows ;
554
545
}
555
546
556
- static void
547
+ /*
548
+ * Creates child relation and adds it to root.
549
+ * Returns child index in simple_rel_array
550
+ */
551
+ static int
557
552
append_child_relation (PlannerInfo * root ,RelOptInfo * rel ,Index rti ,
558
553
RangeTblEntry * rte ,int index ,Oid childOid ,List * wrappers )
559
554
{
@@ -664,6 +659,8 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
664
659
rel -> tuples += childrel -> tuples ;
665
660
666
661
heap_close (newrelation ,NoLock );
662
+
663
+ return childRTindex ;
667
664
}
668
665
669
666
/* Convert wrapper into expression for given index */
@@ -742,7 +739,7 @@ wrapper_make_expression(WrapperNode *wrap, int index, bool *alwaysTrue)
742
739
}
743
740
744
741
/*
745
- * Changes varno attribute inRestrictInfo objects
742
+ * Changes varno attribute inall variables nested in the node
746
743
*/
747
744
static void
748
745
change_varnos (Node * node ,Oid old_varno ,Oid new_varno )
@@ -757,31 +754,56 @@ change_varnos(Node *node, Oid old_varno, Oid new_varno)
757
754
static bool
758
755
change_varno_walker (Node * node ,change_varno_context * context )
759
756
{
757
+ ListCell * lc ;
758
+ Var * var ;
759
+ EquivalenceClass * ec ;
760
+
760
761
if (node == NULL )
761
762
return false;
762
- if (IsA (node ,Var ))
763
- {
764
- Var * var = (Var * )node ;
765
763
766
- if (var -> varno == context -> old_varno )
767
- {
768
- var -> varno = context -> new_varno ;
769
- var -> varnoold = context -> new_varno ;
770
- }
771
- return false;
772
- }
773
- if (IsA (node ,RestrictInfo ))
774
- {
775
- change_varnos_in_restrinct_info ((RestrictInfo * )node ,context );
776
- return false;
777
- }
778
- if (IsA (node ,List ))
764
+ switch (node -> type )
779
765
{
780
- ListCell * lc ;
766
+ case T_Var :
767
+ var = (Var * )node ;
768
+ if (var -> varno == context -> old_varno )
769
+ {
770
+ var -> varno = context -> new_varno ;
771
+ var -> varnoold = context -> new_varno ;
772
+ }
773
+ return false;
781
774
782
- foreach (lc , (List * )node )
783
- change_varno_walker ((Node * )lfirst (lc ),context );
784
- return false;
775
+ case T_RestrictInfo :
776
+ change_varnos_in_restrinct_info ((RestrictInfo * )node ,context );
777
+ return false;
778
+
779
+ case T_PathKey :
780
+ change_varno_walker ((Node * ) ((PathKey * )node )-> pk_eclass ,context );
781
+ return false;
782
+
783
+ case T_EquivalenceClass :
784
+ ec = (EquivalenceClass * )node ;
785
+
786
+ foreach (lc ,ec -> ec_members )
787
+ change_varno_walker ((Node * )lfirst (lc ),context );
788
+ foreach (lc ,ec -> ec_derives )
789
+ change_varno_walker ((Node * )lfirst (lc ),context );
790
+ return false;
791
+
792
+ case T_EquivalenceMember :
793
+ change_varno_walker ((Node * ) ((EquivalenceMember * )node )-> em_expr ,context );
794
+ return false;
795
+
796
+ case T_TargetEntry :
797
+ change_varno_walker ((Node * ) ((TargetEntry * )node )-> expr ,context );
798
+ return false;
799
+
800
+ case T_List :
801
+ foreach (lc , (List * )node )
802
+ change_varno_walker ((Node * )lfirst (lc ),context );
803
+ return false;
804
+
805
+ default :
806
+ break ;
785
807
}
786
808
787
809
/* Should not find an unplanned subquery */
@@ -797,13 +819,11 @@ change_varnos_in_restrinct_info(RestrictInfo *rinfo, change_varno_context *conte
797
819
798
820
change_varno_walker ((Node * )rinfo -> clause ,context );
799
821
if (rinfo -> left_em )
800
- {
801
822
change_varno_walker ((Node * )rinfo -> left_em -> em_expr ,context );
802
- }
823
+
803
824
if (rinfo -> right_em )
804
- {
805
825
change_varno_walker ((Node * )rinfo -> right_em -> em_expr ,context );
806
- }
826
+
807
827
if (rinfo -> orclause )
808
828
foreach (lc , ((BoolExpr * )rinfo -> orclause )-> args )
809
829
{