#include "utils/guc.h"
#if PG_VERSION_NUM >= 90200
#include "catalog/pg_class.h"
+#include "nodes/primnodes.h"
+#include "tcop/utility.h"
#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/timestamp.h"
static int online_analyze_threshold = 50;
static double online_analyze_min_interval = 10000;
+static ExecutorEnd_hook_type oldExecutorEndHook = NULL;
+#if PG_VERSION_NUM >= 90200
+static ProcessUtility_hook_type oldProcessUtilityHook = NULL;
+#endif
+
typedef enum
{
OATT_ALL = 0x03,
return false;
}
-static ExecutorEnd_hook_type oldhook = NULL;
-
static void
makeAnalyze(Oid relOid, CmdType operation, uint32 naffected)
{
}
}
- if (oldhook)
- (*oldhook)(queryDesc);
+ if (oldExecutorEndHook)
+ oldExecutorEndHook(queryDesc);
else
standard_ExecutorEnd(queryDesc);
}
+#if PG_VERSION_NUM >= 90200
+static void
+onlineAnalyzeHookerUtility(Node *parsetree, const char *queryString,
+ ParamListInfo params, bool isTopLevel,
+ DestReceiver *dest, char *completionTag) {
+ RangeVar *tblname = NULL;
+
+ if (IsA(parsetree, CreateTableAsStmt) && ((CreateTableAsStmt*)parsetree)->into)
+ tblname = (RangeVar*)copyObject(((CreateTableAsStmt*)parsetree)->into->rel);
+
+ if (oldProcessUtilityHook)
+ oldProcessUtilityHook(parsetree, queryString, params, isTopLevel, dest, completionTag);
+ else
+ standard_ProcessUtility(parsetree, queryString, params, isTopLevel, dest, completionTag);
+
+ if (tblname) {
+ Oid tblOid = RangeVarGetRelid(tblname, NoLock, true);
+
+ makeAnalyze(tblOid, CMD_INSERT, 0);
+ }
+}
+#endif
+
void _PG_init(void);
void
_PG_init(void)
{
- oldhook = ExecutorEnd_hook;
+ oldExecutorEndHook = ExecutorEnd_hook;
ExecutorEnd_hook = onlineAnalyzeHooker;
+#if PG_VERSION_NUM >= 90200
+ oldProcessUtilityHook = ProcessUtility_hook;
+
+ ProcessUtility_hook = onlineAnalyzeHookerUtility;
+#endif
+
+
DefineCustomBoolVariable(
"online_analyze.enable",
"Enable on-line analyze",
NULL
);
-DefineCustomEnumVariable(
+ DefineCustomEnumVariable(
"online_analyze.table_type",
"Type(s) of table for online analyze: all(default), persistent, temporary, none",
NULL,
void
_PG_fini(void)
{
- ExecutorEnd_hook = oldhook;
+ ExecutorEnd_hook = oldExecutorEndHook;
+#if PG_VERSION_NUM >= 90200
+ ProcessUtility_hook = oldProcessUtilityHook;
+#endif
if (excludeTables.tables)
free(excludeTables.tables);