Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit b0b72c6

Browse files
committed
Don't pass down nonnullable_vars while reducing outer joins.
We weren't actually using the passed-down list for anything, other than computing the new value to be passed down further. I (tgl) probably had the idea that we'd need this data eventually; but no use-case has emerged in a good long while, so let's just stop expending useless cycles here. Richard Guo Discussion: https://postgr.es/m/CAMbWs48KLy9aBb=sZ5MoNmnqAcGHaW_JTGWLCgoE_uMW7S6C-A@mail.gmail.com
1 parent ff8fa0b commit b0b72c6

File tree

1 file changed

+6
-27
lines changed

1 file changed

+6
-27
lines changed

src/backend/optimizer/prep/prepjointree.c

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
122121
static Node *remove_useless_results_recurse(PlannerInfo *root, Node *jtnode);
123122
static 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
*/
27762774
static void
27772775
reduce_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

Comments
 (0)