diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2015-12-11 15:52:16 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2015-12-11 15:52:38 -0500 |
commit | 4fcf48450d38e28e69e629c779a7866183d8ea41 (patch) | |
tree | add52b723925917f78354df86efba391351638b4 /src/backend/nodes/outfuncs.c | |
parent | ed8bec915ec570bd90d86710392fe0c181fd08fe (diff) | |
download | postgresql-4fcf48450d38e28e69e629c779a7866183d8ea41.tar.gz postgresql-4fcf48450d38e28e69e629c779a7866183d8ea41.zip |
Get rid of the planner's LateralJoinInfo data structure.
I originally modeled this data structure on SpecialJoinInfo, but after
commit acfcd45cacb6df23 that looks like a pretty poor decision.
All we really need is relid sets identifying laterally-referenced rels;
and most of the time, what we want to know about includes indirect lateral
references, a case the LateralJoinInfo data was unsuited to compute with
any efficiency. The previous commit redefined RelOptInfo.lateral_relids
as the transitive closure of lateral references, so that it easily supports
checking indirect references. For the places where we really do want just
direct references, add a new RelOptInfo field direct_lateral_relids, which
is easily set up as a copy of lateral_relids before we perform the
transitive closure calculation. Then we can just drop lateral_info_list
and LateralJoinInfo and the supporting code. This makes the planner's
handling of lateral references noticeably more efficient, and shorter too.
Such a change can't be back-patched into stable branches for fear of
breaking extensions that might be looking at the planner's data structures;
but it seems not too late to push it into 9.5, so I've done so.
Diffstat (limited to 'src/backend/nodes/outfuncs.c')
-rw-r--r-- | src/backend/nodes/outfuncs.c | 14 |
1 files changed, 1 insertions, 13 deletions
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index f07c7933b14..63fae82aba0 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1847,7 +1847,6 @@ _outPlannerInfo(StringInfo str, const PlannerInfo *node) WRITE_NODE_FIELD(right_join_clauses); WRITE_NODE_FIELD(full_join_clauses); WRITE_NODE_FIELD(join_info_list); - WRITE_NODE_FIELD(lateral_info_list); WRITE_NODE_FIELD(append_rel_list); WRITE_NODE_FIELD(rowMarks); WRITE_NODE_FIELD(placeholder_list); @@ -1892,6 +1891,7 @@ _outRelOptInfo(StringInfo str, const RelOptInfo *node) WRITE_NODE_FIELD(cheapest_total_path); WRITE_NODE_FIELD(cheapest_unique_path); WRITE_NODE_FIELD(cheapest_parameterized_paths); + WRITE_BITMAPSET_FIELD(direct_lateral_relids); WRITE_BITMAPSET_FIELD(lateral_relids); WRITE_UINT_FIELD(relid); WRITE_OID_FIELD(reltablespace); @@ -2057,15 +2057,6 @@ _outSpecialJoinInfo(StringInfo str, const SpecialJoinInfo *node) } static void -_outLateralJoinInfo(StringInfo str, const LateralJoinInfo *node) -{ - WRITE_NODE_TYPE("LATERALJOININFO"); - - WRITE_BITMAPSET_FIELD(lateral_lhs); - WRITE_BITMAPSET_FIELD(lateral_rhs); -} - -static void _outAppendRelInfo(StringInfo str, const AppendRelInfo *node) { WRITE_NODE_TYPE("APPENDRELINFO"); @@ -3355,9 +3346,6 @@ _outNode(StringInfo str, const void *obj) case T_SpecialJoinInfo: _outSpecialJoinInfo(str, obj); break; - case T_LateralJoinInfo: - _outLateralJoinInfo(str, obj); - break; case T_AppendRelInfo: _outAppendRelInfo(str, obj); break; |