@@ -117,7 +117,6 @@ static void reduce_outer_joins_pass2(Node *jtnode,
117
117
reduce_outer_joins_state * state ,
118
118
PlannerInfo * root ,
119
119
Relids nonnullable_rels ,
120
- List * nonnullable_vars ,
121
120
List * forced_null_vars );
122
121
static Node * remove_useless_results_recurse (PlannerInfo * root ,Node * jtnode );
123
122
static int get_result_relid (PlannerInfo * root ,Node * jtnode );
@@ -2693,7 +2692,7 @@ reduce_outer_joins(PlannerInfo *root)
2693
2692
elog (ERROR ,"so where are the outer joins?" );
2694
2693
2695
2694
reduce_outer_joins_pass2 ((Node * )root -> parse -> jointree ,
2696
- state ,root ,NULL ,NIL , NIL );
2695
+ state ,root ,NULL ,NIL );
2697
2696
}
2698
2697
2699
2698
/*
@@ -2770,15 +2769,13 @@ reduce_outer_joins_pass1(Node *jtnode)
2770
2769
*state: state data collected by phase 1 for this node
2771
2770
*root: toplevel planner state
2772
2771
*nonnullable_rels: set of base relids forced non-null by upper quals
2773
- *nonnullable_vars: list of Vars forced non-null by upper quals
2774
2772
*forced_null_vars: list of Vars forced null by upper quals
2775
2773
*/
2776
2774
static void
2777
2775
reduce_outer_joins_pass2 (Node * jtnode ,
2778
2776
reduce_outer_joins_state * state ,
2779
2777
PlannerInfo * root ,
2780
2778
Relids nonnullable_rels ,
2781
- List * nonnullable_vars ,
2782
2779
List * forced_null_vars )
2783
2780
{
2784
2781
/*
@@ -2795,16 +2792,12 @@ reduce_outer_joins_pass2(Node *jtnode,
2795
2792
ListCell * l ;
2796
2793
ListCell * s ;
2797
2794
Relids pass_nonnullable_rels ;
2798
- List * pass_nonnullable_vars ;
2799
2795
List * pass_forced_null_vars ;
2800
2796
2801
2797
/* Scan quals to see if we can add any constraints */
2802
2798
pass_nonnullable_rels = find_nonnullable_rels (f -> quals );
2803
2799
pass_nonnullable_rels = bms_add_members (pass_nonnullable_rels ,
2804
2800
nonnullable_rels );
2805
- pass_nonnullable_vars = find_nonnullable_vars (f -> quals );
2806
- pass_nonnullable_vars = list_concat (pass_nonnullable_vars ,
2807
- nonnullable_vars );
2808
2801
pass_forced_null_vars = find_forced_null_vars (f -> quals );
2809
2802
pass_forced_null_vars = list_concat (pass_forced_null_vars ,
2810
2803
forced_null_vars );
@@ -2817,7 +2810,6 @@ reduce_outer_joins_pass2(Node *jtnode,
2817
2810
if (sub_state -> contains_outer )
2818
2811
reduce_outer_joins_pass2 (lfirst (l ),sub_state ,root ,
2819
2812
pass_nonnullable_rels ,
2820
- pass_nonnullable_vars ,
2821
2813
pass_forced_null_vars );
2822
2814
}
2823
2815
bms_free (pass_nonnullable_rels );
@@ -2830,8 +2822,6 @@ reduce_outer_joins_pass2(Node *jtnode,
2830
2822
JoinType jointype = j -> jointype ;
2831
2823
reduce_outer_joins_state * left_state = linitial (state -> sub_states );
2832
2824
reduce_outer_joins_state * right_state = lsecond (state -> sub_states );
2833
- List * local_nonnullable_vars = NIL ;
2834
- bool computed_local_nonnullable_vars = false;
2835
2825
2836
2826
/* Can we simplify this join? */
2837
2827
switch (jointype )
@@ -2906,17 +2896,18 @@ reduce_outer_joins_pass2(Node *jtnode,
2906
2896
*/
2907
2897
if (jointype == JOIN_LEFT )
2908
2898
{
2899
+ List * nonnullable_vars ;
2909
2900
List * overlap ;
2910
2901
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 ) ;
2913
2904
2914
2905
/*
2915
- * It's not sufficient to check whetherlocal_nonnullable_vars and
2906
+ * It's not sufficient to check whethernonnullable_vars and
2916
2907
* forced_null_vars overlap: we need to know if the overlap
2917
2908
* includes any RHS variables.
2918
2909
*/
2919
- overlap = list_intersection (local_nonnullable_vars ,
2910
+ overlap = list_intersection (nonnullable_vars ,
2920
2911
forced_null_vars );
2921
2912
if (overlap != NIL &&
2922
2913
bms_overlap (pull_varnos (root , (Node * )overlap ),
@@ -2941,7 +2932,6 @@ reduce_outer_joins_pass2(Node *jtnode,
2941
2932
Relids local_nonnullable_rels ;
2942
2933
List * local_forced_null_vars ;
2943
2934
Relids pass_nonnullable_rels ;
2944
- List * pass_nonnullable_vars ;
2945
2935
List * pass_forced_null_vars ;
2946
2936
2947
2937
/*
@@ -2968,16 +2958,12 @@ reduce_outer_joins_pass2(Node *jtnode,
2968
2958
if (jointype != JOIN_FULL )
2969
2959
{
2970
2960
local_nonnullable_rels = find_nonnullable_rels (j -> quals );
2971
- if (!computed_local_nonnullable_vars )
2972
- local_nonnullable_vars = find_nonnullable_vars (j -> quals );
2973
2961
local_forced_null_vars = find_forced_null_vars (j -> quals );
2974
2962
if (jointype == JOIN_INNER || jointype == JOIN_SEMI )
2975
2963
{
2976
2964
/* OK to merge upper and local constraints */
2977
2965
local_nonnullable_rels = bms_add_members (local_nonnullable_rels ,
2978
2966
nonnullable_rels );
2979
- local_nonnullable_vars = list_concat (local_nonnullable_vars ,
2980
- nonnullable_vars );
2981
2967
local_forced_null_vars = list_concat (local_forced_null_vars ,
2982
2968
forced_null_vars );
2983
2969
}
@@ -2995,26 +2981,22 @@ reduce_outer_joins_pass2(Node *jtnode,
2995
2981
{
2996
2982
/* pass union of local and upper constraints */
2997
2983
pass_nonnullable_rels = local_nonnullable_rels ;
2998
- pass_nonnullable_vars = local_nonnullable_vars ;
2999
2984
pass_forced_null_vars = local_forced_null_vars ;
3000
2985
}
3001
2986
else if (jointype != JOIN_FULL )/* ie, LEFT or ANTI */
3002
2987
{
3003
2988
/* can't pass local constraints to non-nullable side */
3004
2989
pass_nonnullable_rels = nonnullable_rels ;
3005
- pass_nonnullable_vars = nonnullable_vars ;
3006
2990
pass_forced_null_vars = forced_null_vars ;
3007
2991
}
3008
2992
else
3009
2993
{
3010
2994
/* no constraints pass through JOIN_FULL */
3011
2995
pass_nonnullable_rels = NULL ;
3012
- pass_nonnullable_vars = NIL ;
3013
2996
pass_forced_null_vars = NIL ;
3014
2997
}
3015
2998
reduce_outer_joins_pass2 (j -> larg ,left_state ,root ,
3016
2999
pass_nonnullable_rels ,
3017
- pass_nonnullable_vars ,
3018
3000
pass_forced_null_vars );
3019
3001
}
3020
3002
@@ -3024,19 +3006,16 @@ reduce_outer_joins_pass2(Node *jtnode,
3024
3006
{
3025
3007
/* pass appropriate constraints, per comment above */
3026
3008
pass_nonnullable_rels = local_nonnullable_rels ;
3027
- pass_nonnullable_vars = local_nonnullable_vars ;
3028
3009
pass_forced_null_vars = local_forced_null_vars ;
3029
3010
}
3030
3011
else
3031
3012
{
3032
3013
/* no constraints pass through JOIN_FULL */
3033
3014
pass_nonnullable_rels = NULL ;
3034
- pass_nonnullable_vars = NIL ;
3035
3015
pass_forced_null_vars = NIL ;
3036
3016
}
3037
3017
reduce_outer_joins_pass2 (j -> rarg ,right_state ,root ,
3038
3018
pass_nonnullable_rels ,
3039
- pass_nonnullable_vars ,
3040
3019
pass_forced_null_vars );
3041
3020
}
3042
3021
bms_free (local_nonnullable_rels );