@@ -117,7 +117,6 @@ static void reduce_outer_joins_pass2(Node *jtnode,
117117reduce_outer_joins_state * state ,
118118PlannerInfo * root ,
119119Relids nonnullable_rels ,
120- List * nonnullable_vars ,
121120List * forced_null_vars );
122121static Node * remove_useless_results_recurse (PlannerInfo * root ,Node * jtnode );
123122static int get_result_relid (PlannerInfo * root ,Node * jtnode );
@@ -2693,7 +2692,7 @@ reduce_outer_joins(PlannerInfo *root)
26932692elog (ERROR ,"so where are the outer joins?" );
26942693
26952694reduce_outer_joins_pass2 ((Node * )root -> parse -> jointree ,
2696- state ,root ,NULL ,NIL , NIL );
2695+ state ,root ,NULL ,NIL );
26972696}
26982697
26992698/*
@@ -2770,15 +2769,13 @@ reduce_outer_joins_pass1(Node *jtnode)
27702769 *state: state data collected by phase 1 for this node
27712770 *root: toplevel planner state
27722771 *nonnullable_rels: set of base relids forced non-null by upper quals
2773- *nonnullable_vars: list of Vars forced non-null by upper quals
27742772 *forced_null_vars: list of Vars forced null by upper quals
27752773 */
27762774static void
27772775reduce_outer_joins_pass2 (Node * jtnode ,
27782776reduce_outer_joins_state * state ,
27792777PlannerInfo * root ,
27802778Relids nonnullable_rels ,
2781- List * nonnullable_vars ,
27822779List * forced_null_vars )
27832780{
27842781/*
@@ -2795,16 +2792,12 @@ reduce_outer_joins_pass2(Node *jtnode,
27952792ListCell * l ;
27962793ListCell * s ;
27972794Relids pass_nonnullable_rels ;
2798- List * pass_nonnullable_vars ;
27992795List * pass_forced_null_vars ;
28002796
28012797/* Scan quals to see if we can add any constraints */
28022798pass_nonnullable_rels = find_nonnullable_rels (f -> quals );
28032799pass_nonnullable_rels = bms_add_members (pass_nonnullable_rels ,
28042800nonnullable_rels );
2805- pass_nonnullable_vars = find_nonnullable_vars (f -> quals );
2806- pass_nonnullable_vars = list_concat (pass_nonnullable_vars ,
2807- nonnullable_vars );
28082801pass_forced_null_vars = find_forced_null_vars (f -> quals );
28092802pass_forced_null_vars = list_concat (pass_forced_null_vars ,
28102803forced_null_vars );
@@ -2817,7 +2810,6 @@ reduce_outer_joins_pass2(Node *jtnode,
28172810if (sub_state -> contains_outer )
28182811reduce_outer_joins_pass2 (lfirst (l ),sub_state ,root ,
28192812pass_nonnullable_rels ,
2820- pass_nonnullable_vars ,
28212813pass_forced_null_vars );
28222814}
28232815bms_free (pass_nonnullable_rels );
@@ -2830,8 +2822,6 @@ reduce_outer_joins_pass2(Node *jtnode,
28302822JoinType jointype = j -> jointype ;
28312823reduce_outer_joins_state * left_state = linitial (state -> sub_states );
28322824reduce_outer_joins_state * right_state = lsecond (state -> sub_states );
2833- List * local_nonnullable_vars = NIL ;
2834- bool computed_local_nonnullable_vars = false;
28352825
28362826/* Can we simplify this join? */
28372827switch (jointype )
@@ -2906,17 +2896,18 @@ reduce_outer_joins_pass2(Node *jtnode,
29062896 */
29072897if (jointype == JOIN_LEFT )
29082898{
2899+ List * nonnullable_vars ;
29092900List * overlap ;
29102901
2911- local_nonnullable_vars = find_nonnullable_vars ( j -> quals );
2912- computed_local_nonnullable_vars = true ;
2902+ /* Find Vars in j->quals that must be non-null in joined rows */
2903+ nonnullable_vars = find_nonnullable_vars ( j -> quals ) ;
29132904
29142905/*
2915- * It's not sufficient to check whetherlocal_nonnullable_vars and
2906+ * It's not sufficient to check whethernonnullable_vars and
29162907 * forced_null_vars overlap: we need to know if the overlap
29172908 * includes any RHS variables.
29182909 */
2919- overlap = list_intersection (local_nonnullable_vars ,
2910+ overlap = list_intersection (nonnullable_vars ,
29202911forced_null_vars );
29212912if (overlap != NIL &&
29222913bms_overlap (pull_varnos (root , (Node * )overlap ),
@@ -2941,7 +2932,6 @@ reduce_outer_joins_pass2(Node *jtnode,
29412932Relids local_nonnullable_rels ;
29422933List * local_forced_null_vars ;
29432934Relids pass_nonnullable_rels ;
2944- List * pass_nonnullable_vars ;
29452935List * pass_forced_null_vars ;
29462936
29472937/*
@@ -2968,16 +2958,12 @@ reduce_outer_joins_pass2(Node *jtnode,
29682958if (jointype != JOIN_FULL )
29692959{
29702960local_nonnullable_rels = find_nonnullable_rels (j -> quals );
2971- if (!computed_local_nonnullable_vars )
2972- local_nonnullable_vars = find_nonnullable_vars (j -> quals );
29732961local_forced_null_vars = find_forced_null_vars (j -> quals );
29742962if (jointype == JOIN_INNER || jointype == JOIN_SEMI )
29752963{
29762964/* OK to merge upper and local constraints */
29772965local_nonnullable_rels = bms_add_members (local_nonnullable_rels ,
29782966nonnullable_rels );
2979- local_nonnullable_vars = list_concat (local_nonnullable_vars ,
2980- nonnullable_vars );
29812967local_forced_null_vars = list_concat (local_forced_null_vars ,
29822968forced_null_vars );
29832969}
@@ -2995,26 +2981,22 @@ reduce_outer_joins_pass2(Node *jtnode,
29952981{
29962982/* pass union of local and upper constraints */
29972983pass_nonnullable_rels = local_nonnullable_rels ;
2998- pass_nonnullable_vars = local_nonnullable_vars ;
29992984pass_forced_null_vars = local_forced_null_vars ;
30002985}
30012986else if (jointype != JOIN_FULL )/* ie, LEFT or ANTI */
30022987{
30032988/* can't pass local constraints to non-nullable side */
30042989pass_nonnullable_rels = nonnullable_rels ;
3005- pass_nonnullable_vars = nonnullable_vars ;
30062990pass_forced_null_vars = forced_null_vars ;
30072991}
30082992else
30092993{
30102994/* no constraints pass through JOIN_FULL */
30112995pass_nonnullable_rels = NULL ;
3012- pass_nonnullable_vars = NIL ;
30132996pass_forced_null_vars = NIL ;
30142997}
30152998reduce_outer_joins_pass2 (j -> larg ,left_state ,root ,
30162999pass_nonnullable_rels ,
3017- pass_nonnullable_vars ,
30183000pass_forced_null_vars );
30193001}
30203002
@@ -3024,19 +3006,16 @@ reduce_outer_joins_pass2(Node *jtnode,
30243006{
30253007/* pass appropriate constraints, per comment above */
30263008pass_nonnullable_rels = local_nonnullable_rels ;
3027- pass_nonnullable_vars = local_nonnullable_vars ;
30283009pass_forced_null_vars = local_forced_null_vars ;
30293010}
30303011else
30313012{
30323013/* no constraints pass through JOIN_FULL */
30333014pass_nonnullable_rels = NULL ;
3034- pass_nonnullable_vars = NIL ;
30353015pass_forced_null_vars = NIL ;
30363016}
30373017reduce_outer_joins_pass2 (j -> rarg ,right_state ,root ,
30383018pass_nonnullable_rels ,
3039- pass_nonnullable_vars ,
30403019pass_forced_null_vars );
30413020}
30423021bms_free (local_nonnullable_rels );