diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-12-20 02:30:36 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-12-20 02:30:36 +0000 |
commit | e3b9852728902bc816bf02574a87eda9a0ca91a1 (patch) | |
tree | edc438fa4598528935afbca3724d24e7afb2efd7 /src/backend/nodes/outfuncs.c | |
parent | 1a6aaaa6c485101f8fdec7e79787610dc0f4a5c7 (diff) | |
download | postgresql-e3b9852728902bc816bf02574a87eda9a0ca91a1.tar.gz postgresql-e3b9852728902bc816bf02574a87eda9a0ca91a1.zip |
Teach planner how to rearrange join order for some classes of OUTER JOIN.
Per my recent proposal. I ended up basing the implementation on the
existing mechanism for enforcing valid join orders of IN joins --- the
rules for valid outer-join orders are somewhat similar.
Diffstat (limited to 'src/backend/nodes/outfuncs.c')
-rw-r--r-- | src/backend/nodes/outfuncs.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 646ac6daabf..aa5fd99db86 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.264 2005/11/28 04:35:30 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.265 2005/12/20 02:30:35 tgl Exp $ * * NOTES * Every node type that can appear in stored rules' parsetrees *must* @@ -1167,6 +1167,7 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node) WRITE_NODE_FIELD(left_join_clauses); WRITE_NODE_FIELD(right_join_clauses); WRITE_NODE_FIELD(full_join_clauses); + WRITE_NODE_FIELD(oj_info_list); WRITE_NODE_FIELD(in_info_list); WRITE_NODE_FIELD(query_pathkeys); WRITE_NODE_FIELD(group_pathkeys); @@ -1201,7 +1202,6 @@ _outRelOptInfo(StringInfo str, RelOptInfo *node) WRITE_FLOAT_FIELD(tuples, "%.0f"); WRITE_NODE_FIELD(subplan); WRITE_NODE_FIELD(baserestrictinfo); - WRITE_BITMAPSET_FIELD(outerjoinset); WRITE_NODE_FIELD(joininfo); WRITE_BITMAPSET_FIELD(index_outer_relids); WRITE_NODE_FIELD(index_inner_paths); @@ -1266,6 +1266,17 @@ _outInnerIndexscanInfo(StringInfo str, InnerIndexscanInfo *node) } static void +_outOuterJoinInfo(StringInfo str, OuterJoinInfo *node) +{ + WRITE_NODE_TYPE("OUTERJOININFO"); + + WRITE_BITMAPSET_FIELD(min_lefthand); + WRITE_BITMAPSET_FIELD(min_righthand); + WRITE_BOOL_FIELD(is_full_join); + WRITE_BOOL_FIELD(lhs_strict); +} + +static void _outInClauseInfo(StringInfo str, InClauseInfo *node) { WRITE_NODE_TYPE("INCLAUSEINFO"); @@ -2019,6 +2030,9 @@ _outNode(StringInfo str, void *obj) case T_InnerIndexscanInfo: _outInnerIndexscanInfo(str, obj); break; + case T_OuterJoinInfo: + _outOuterJoinInfo(str, obj); + break; case T_InClauseInfo: _outInClauseInfo(str, obj); break; |