]> granicus.if.org Git - postgresql/commitdiff
Add missing optimizer hooks for function cost and number of rows.
authorSimon Riggs <simon@2ndQuadrant.com>
Fri, 23 Apr 2010 22:23:39 +0000 (22:23 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Fri, 23 Apr 2010 22:23:39 +0000 (22:23 +0000)
Closely follow design of other optimizer hooks: if hook exists
retrieve value from plugin; if still not set then get from cache.

src/backend/utils/cache/lsyscache.c
src/include/utils/lsyscache.h

index 63dde8f9cb9392ea108d820987b80b47249e18e6..891abf422bcc6c4587d6ad3dfb0da0d1c6245f42 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.168 2010/02/26 02:01:11 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.169 2010/04/23 22:23:39 sriggs Exp $
  *
  * NOTES
  *       Eventually, the index information should go through here, too.
@@ -38,6 +38,9 @@
 /* Hook for plugins to get control in get_attavgwidth() */
 get_attavgwidth_hook_type get_attavgwidth_hook = NULL;
 
+/* Hook for plugins to get control in get_func_cost and get_func_rows */
+get_func_cost_hook_type get_func_cost_hook = NULL;
+get_func_rows_hook_type get_func_rows_hook = NULL;
 
 /*                             ---------- AMOP CACHES ----------                                                */
 
@@ -1409,6 +1412,12 @@ get_func_cost(Oid funcid)
        HeapTuple       tp;
        float4          result;
 
+       if (get_func_cost_hook)
+       {
+               result = (*get_func_cost_hook) (funcid);
+               if (result > (float4) 0)
+                       return result;
+       }
        tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
        if (!HeapTupleIsValid(tp))
                elog(ERROR, "cache lookup failed for function %u", funcid);
@@ -1428,6 +1437,12 @@ get_func_rows(Oid funcid)
        HeapTuple       tp;
        float4          result;
 
+       if (get_func_rows_hook)
+       {
+               result = (*get_func_rows_hook) (funcid);
+               if (result > (float4) 0)
+                       return result;
+       }
        tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
        if (!HeapTupleIsValid(tp))
                elog(ERROR, "cache lookup failed for function %u", funcid);
index 429bcaa147743be208e71a1a5585fd559e1f2d1d..e25a4d9475a15696dc8132ad6ef1131eb6a7c982 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/lsyscache.h,v 1.131 2010/01/04 02:44:40 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/utils/lsyscache.h,v 1.132 2010/04/23 22:23:39 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,6 +30,12 @@ typedef enum IOFuncSelector
 typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);
 extern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;
 
+/* Hook for plugins to get control in get_func_cost and get_func_rows */
+typedef float4 (*get_func_cost_hook_type) (Oid funcid);
+extern PGDLLIMPORT get_func_cost_hook_type get_func_cost_hook;
+typedef float4 (*get_func_rows_hook_type) (Oid funcid);
+extern PGDLLIMPORT get_func_rows_hook_type get_func_rows_hook;
+
 extern bool op_in_opfamily(Oid opno, Oid opfamily);
 extern int     get_op_opfamily_strategy(Oid opno, Oid opfamily);
 extern void get_op_opfamily_properties(Oid opno, Oid opfamily,