Attached is the patch for the optimizer hook as discussed in
http://archives.postgresql.org/pgsql-hackers/2007-08/msg00362.php

The hook declaration and definition to the same places as the planner_hook
is located since the optimizer_hook relates to the part of the planner and
I find it good to have the planner related hooks on one place.

The optimizer_hook is called in make_one_rel and the plugin replaces
the function 'make_rel_from_joinlist'. I have created a macro
standard_optimizer just for better readability of the code in plugins
and I did not want to change function names.

I also tried to dig out the dynamic programming optimizer and to compile
it and use it as a plugin just to be sure that all the functions necessary
to write the optimizer as a plugin are non-static. I placed all the code
in joinrels.c, make_one_rel_by_joins and make_rel_from_joinlist functions.
Of cause, I renamed all non-static symbols.

Sure, I ran 'make check' without failures.

Is there anything else I should take care? Thanks.

Regards

Julo Stroffek

*** ./src/backend/optimizer/path/allpaths.c.orig	Sat May 26 20:23:01 2007
--- ./src/backend/optimizer/path/allpaths.c	Tue Aug 14 17:26:39 2007
***************
*** 52,58 ****
  					  RangeTblEntry *rte);
  static void set_values_pathlist(PlannerInfo *root, RelOptInfo *rel,
  					RangeTblEntry *rte);
! static RelOptInfo *make_rel_from_joinlist(PlannerInfo *root, List *joinlist);
  static RelOptInfo *make_one_rel_by_joins(PlannerInfo *root, int levels_needed,
  					  List *initial_rels);
  static bool subquery_is_pushdown_safe(Query *subquery, Query *topquery,
--- 52,58 ----
  					  RangeTblEntry *rte);
  static void set_values_pathlist(PlannerInfo *root, RelOptInfo *rel,
  					RangeTblEntry *rte);
! RelOptInfo *make_rel_from_joinlist(PlannerInfo *root, List *joinlist);
  static RelOptInfo *make_one_rel_by_joins(PlannerInfo *root, int levels_needed,
  					  List *initial_rels);
  static bool subquery_is_pushdown_safe(Query *subquery, Query *topquery,
***************
*** 87,93 ****
  	/*
  	 * Generate access paths for the entire join tree.
  	 */
! 	rel = make_rel_from_joinlist(root, joinlist);
  
  	/*
  	 * The result should join all and only the query's base rels.
--- 87,96 ----
  	/*
  	 * Generate access paths for the entire join tree.
  	 */
! 	if (optimizer_hook)
! 		rel = optimizer_hook(root, joinlist);
! 	else
! 		rel = make_rel_from_joinlist(root, joinlist);
  
  	/*
  	 * The result should join all and only the query's base rels.
***************
*** 612,618 ****
   * See comments for deconstruct_jointree() for definition of the joinlist
   * data structure.
   */
! static RelOptInfo *
  make_rel_from_joinlist(PlannerInfo *root, List *joinlist)
  {
  	int			levels_needed;
--- 615,621 ----
   * See comments for deconstruct_jointree() for definition of the joinlist
   * data structure.
   */
! RelOptInfo *
  make_rel_from_joinlist(PlannerInfo *root, List *joinlist)
  {
  	int			levels_needed;
*** ./src/backend/optimizer/plan/planner.c.orig	Sat May 26 20:23:01 2007
--- ./src/backend/optimizer/plan/planner.c	Wed Aug 15 15:31:21 2007
***************
*** 45,50 ****
--- 45,52 ----
  /* Hook for plugins to get control in planner() */
  planner_hook_type planner_hook = NULL;
  
+ /* Hook for plugins to get control in make_one_rel() */
+ optimizer_hook_type optimizer_hook = NULL;
  
  /* Expression kind codes for preprocess_expression */
  #define EXPRKIND_QUAL		0
*** ./src/include/optimizer/planner.h.orig	Wed Jul 25 14:22:53 2007
--- ./src/include/optimizer/planner.h	Wed Aug 15 11:17:00 2007
***************
*** 17,22 ****
--- 17,24 ----
  #include "nodes/plannodes.h"
  #include "nodes/relation.h"
  
+ /* A macro pointing to the standard optimizer function. */
+ #define standard_optimizer make_rel_from_joinlist
  
  /* Hook for plugins to get control in planner() */
  typedef PlannedStmt * (*planner_hook_type) (Query *parse,
***************
*** 24,29 ****
--- 26,35 ----
  											ParamListInfo boundParams);
  extern PGDLLIMPORT planner_hook_type planner_hook;
  
+ /* Hook for plugins to get control in make_one_rel() */
+ typedef RelOptInfo * (*optimizer_hook_type) (PlannerInfo * root,
+ 											 List * joinlist);
+ extern PGDLLIMPORT optimizer_hook_type optimizer_hook;
  
  extern PlannedStmt *planner(Query *parse, int cursorOptions,
  		ParamListInfo boundParams);

---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to