@@ -117,7 +117,6 @@ static void reduce_outer_joins_pass2(Node *jtnode,
117117 reduce_outer_joins_state * state ,
118118 PlannerInfo * root ,
119119 Relids nonnullable_rels ,
120- List * nonnullable_vars ,
121120 List * 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)
26932692 elog (ERROR , "so where are the outer joins?" );
26942693
26952694 reduce_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 ,
27782776 reduce_outer_joins_state * state ,
27792777 PlannerInfo * root ,
27802778 Relids nonnullable_rels ,
2781- List * nonnullable_vars ,
27822779 List * forced_null_vars )
27832780{
27842781 /*
@@ -2795,16 +2792,12 @@ reduce_outer_joins_pass2(Node *jtnode,
27952792 ListCell * l ;
27962793 ListCell * s ;
27972794 Relids pass_nonnullable_rels ;
2798- List * pass_nonnullable_vars ;
27992795 List * pass_forced_null_vars ;
28002796
28012797 /* Scan quals to see if we can add any constraints */
28022798 pass_nonnullable_rels = find_nonnullable_rels (f -> quals );
28032799 pass_nonnullable_rels = bms_add_members (pass_nonnullable_rels ,
28042800 nonnullable_rels );
2805- pass_nonnullable_vars = find_nonnullable_vars (f -> quals );
2806- pass_nonnullable_vars = list_concat (pass_nonnullable_vars ,
2807- nonnullable_vars );
28082801 pass_forced_null_vars = find_forced_null_vars (f -> quals );
28092802 pass_forced_null_vars = list_concat (pass_forced_null_vars ,
28102803 forced_null_vars );
@@ -2817,7 +2810,6 @@ reduce_outer_joins_pass2(Node *jtnode,
28172810 if (sub_state -> contains_outer )
28182811 reduce_outer_joins_pass2 (lfirst (l ), sub_state , root ,
28192812 pass_nonnullable_rels ,
2820- pass_nonnullable_vars ,
28212813 pass_forced_null_vars );
28222814 }
28232815 bms_free (pass_nonnullable_rels );
@@ -2830,8 +2822,6 @@ reduce_outer_joins_pass2(Node *jtnode,
28302822 JoinType jointype = j -> jointype ;
28312823 reduce_outer_joins_state * left_state = linitial (state -> sub_states );
28322824 reduce_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? */
28372827 switch (jointype )
@@ -2906,17 +2896,18 @@ reduce_outer_joins_pass2(Node *jtnode,
29062896 */
29072897 if (jointype == JOIN_LEFT )
29082898 {
2899+ List * nonnullable_vars ;
29092900 List * 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 whether local_nonnullable_vars and
2906+ * It's not sufficient to check whether nonnullable_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 ,
29202911 forced_null_vars );
29212912 if (overlap != NIL &&
29222913 bms_overlap (pull_varnos (root , (Node * ) overlap ),
@@ -2941,7 +2932,6 @@ reduce_outer_joins_pass2(Node *jtnode,
29412932 Relids local_nonnullable_rels ;
29422933 List * local_forced_null_vars ;
29432934 Relids pass_nonnullable_rels ;
2944- List * pass_nonnullable_vars ;
29452935 List * pass_forced_null_vars ;
29462936
29472937 /*
@@ -2968,16 +2958,12 @@ reduce_outer_joins_pass2(Node *jtnode,
29682958 if (jointype != JOIN_FULL )
29692959 {
29702960 local_nonnullable_rels = find_nonnullable_rels (j -> quals );
2971- if (!computed_local_nonnullable_vars )
2972- local_nonnullable_vars = find_nonnullable_vars (j -> quals );
29732961 local_forced_null_vars = find_forced_null_vars (j -> quals );
29742962 if (jointype == JOIN_INNER || jointype == JOIN_SEMI )
29752963 {
29762964 /* OK to merge upper and local constraints */
29772965 local_nonnullable_rels = bms_add_members (local_nonnullable_rels ,
29782966 nonnullable_rels );
2979- local_nonnullable_vars = list_concat (local_nonnullable_vars ,
2980- nonnullable_vars );
29812967 local_forced_null_vars = list_concat (local_forced_null_vars ,
29822968 forced_null_vars );
29832969 }
@@ -2995,26 +2981,22 @@ reduce_outer_joins_pass2(Node *jtnode,
29952981 {
29962982 /* pass union of local and upper constraints */
29972983 pass_nonnullable_rels = local_nonnullable_rels ;
2998- pass_nonnullable_vars = local_nonnullable_vars ;
29992984 pass_forced_null_vars = local_forced_null_vars ;
30002985 }
30012986 else if (jointype != JOIN_FULL ) /* ie, LEFT or ANTI */
30022987 {
30032988 /* can't pass local constraints to non-nullable side */
30042989 pass_nonnullable_rels = nonnullable_rels ;
3005- pass_nonnullable_vars = nonnullable_vars ;
30062990 pass_forced_null_vars = forced_null_vars ;
30072991 }
30082992 else
30092993 {
30102994 /* no constraints pass through JOIN_FULL */
30112995 pass_nonnullable_rels = NULL ;
3012- pass_nonnullable_vars = NIL ;
30132996 pass_forced_null_vars = NIL ;
30142997 }
30152998 reduce_outer_joins_pass2 (j -> larg , left_state , root ,
30162999 pass_nonnullable_rels ,
3017- pass_nonnullable_vars ,
30183000 pass_forced_null_vars );
30193001 }
30203002
@@ -3024,19 +3006,16 @@ reduce_outer_joins_pass2(Node *jtnode,
30243006 {
30253007 /* pass appropriate constraints, per comment above */
30263008 pass_nonnullable_rels = local_nonnullable_rels ;
3027- pass_nonnullable_vars = local_nonnullable_vars ;
30283009 pass_forced_null_vars = local_forced_null_vars ;
30293010 }
30303011 else
30313012 {
30323013 /* no constraints pass through JOIN_FULL */
30333014 pass_nonnullable_rels = NULL ;
3034- pass_nonnullable_vars = NIL ;
30353015 pass_forced_null_vars = NIL ;
30363016 }
30373017 reduce_outer_joins_pass2 (j -> rarg , right_state , root ,
30383018 pass_nonnullable_rels ,
3039- pass_nonnullable_vars ,
30403019 pass_forced_null_vars );
30413020 }
30423021 bms_free (local_nonnullable_rels );
0 commit comments