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