From e3b9852728902bc816bf02574a87eda9a0ca91a1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 20 Dec 2005 02:30:36 +0000 Subject: 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. --- src/include/optimizer/clauses.h | 3 ++- src/include/optimizer/paths.h | 9 +++------ src/include/optimizer/planmain.h | 8 +++++--- src/include/optimizer/prep.h | 6 +----- 4 files changed, 11 insertions(+), 15 deletions(-) (limited to 'src/include/optimizer') diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index bf00f2cc97..0d3770dc5c 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.80 2005/10/15 02:49:45 momjian Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.81 2005/12/20 02:30:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -57,6 +57,7 @@ extern bool contain_subplans(Node *clause); extern bool contain_mutable_functions(Node *clause); extern bool contain_volatile_functions(Node *clause); extern bool contain_nonstrict_functions(Node *clause); +extern Relids find_nonnullable_rels(Node *clause); extern bool is_pseudo_constant_clause(Node *clause); extern bool is_pseudo_constant_clause_relids(Node *clause, Relids relids); diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index eba65c699c..afe3a70d71 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.89 2005/11/25 19:47:50 tgl Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.90 2005/12/20 02:30:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,8 +23,7 @@ extern bool enable_geqo; extern int geqo_threshold; -extern RelOptInfo *make_one_rel(PlannerInfo *root); -extern RelOptInfo *make_fromexpr_rel(PlannerInfo *root, FromExpr *from); +extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist); #ifdef OPTIMIZER_DEBUG extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel); @@ -88,10 +87,8 @@ extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, * routines to determine which relations to join */ extern List *make_rels_by_joins(PlannerInfo *root, int level, List **joinrels); -extern RelOptInfo *make_jointree_rel(PlannerInfo *root, Node *jtnode); extern RelOptInfo *make_join_rel(PlannerInfo *root, - RelOptInfo *rel1, RelOptInfo *rel2, - JoinType jointype); + RelOptInfo *rel1, RelOptInfo *rel2); /* * pathkeys.c diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index 0e78933f79..97d2287b5c 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.90 2005/10/15 02:49:45 momjian Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.91 2005/12/20 02:30:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -65,10 +65,12 @@ extern bool is_projection_capable_plan(Plan *plan); /* * prototypes for plan/initsplan.c */ +extern int from_collapse_limit; +extern int join_collapse_limit; + extern void add_base_rels_to_query(PlannerInfo *root, Node *jtnode); extern void build_base_rel_tlists(PlannerInfo *root, List *final_tlist); -extern Relids distribute_quals_to_rels(PlannerInfo *root, Node *jtnode, - bool below_outer_join); +extern List *deconstruct_jointree(PlannerInfo *root); extern void process_implied_equality(PlannerInfo *root, Node *item1, Node *item2, Oid sortop1, Oid sortop2, diff --git a/src/include/optimizer/prep.h b/src/include/optimizer/prep.h index c26e6491f3..ce89771b17 100644 --- a/src/include/optimizer/prep.h +++ b/src/include/optimizer/prep.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/prep.h,v 1.52 2005/10/15 02:49:45 momjian Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/prep.h,v 1.53 2005/12/20 02:30:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -21,14 +21,10 @@ /* * prototypes for prepjointree.c */ -extern int from_collapse_limit; -extern int join_collapse_limit; - extern Node *pull_up_IN_clauses(PlannerInfo *root, Node *node); extern Node *pull_up_subqueries(PlannerInfo *root, Node *jtnode, bool below_outer_join); extern void reduce_outer_joins(PlannerInfo *root); -extern Node *simplify_jointree(PlannerInfo *root, Node *jtnode); extern Relids get_relids_in_jointree(Node *jtnode); extern Relids get_relids_for_join(PlannerInfo *root, int joinrelid); -- cgit v1.2.1