#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/timestamp.h"
+#if PG_VERSION_NUM >= 90500
+#include "nodes/makefuncs.h"
+#endif
#endif
#ifdef PG_MODULE_MAGIC
static ProcessUtility_hook_type oldProcessUtilityHook = NULL;
#endif
-typedef enum
+typedef enum
{
OATT_ALL = 0x03,
OATT_PERSISTENT = 0x01,
return false;
}
+#if PG_VERSION_NUM >= 90500
+static RangeVar*
+makeRangeVarFromOid(Oid relOid)
+{
+ return makeRangeVar(
+ get_namespace_name(get_rel_namespace(relOid)),
+ get_rel_name(relOid),
+ -1
+ );
+
+}
+#endif
+
static void
-makeAnalyze(Oid relOid, CmdType operation, uint32 naffected)
+makeAnalyze(Oid relOid, CmdType operation, int32 naffected)
{
PgStat_StatTabEntry *tabentry;
TimestampTz now = GetCurrentTimestamp();
if (relOid == InvalidOid)
return;
+ if (naffected == 0)
+ /* return if there is not changes */
+ return;
+ else if (naffected < 0)
+ /* number if affected rows is unknown */
+ naffected = 0;
+
if (get_rel_relkind(relOid) != RELKIND_RELATION)
return;
#define changes_since_analyze(t) ((t)->n_live_tuples + (t)->n_dead_tuples - (t)->last_anl_tuples)
#endif
- if (
+ if (
tabentry == NULL /* a new table */ ||
(
/* do not analyze too often, if both stamps are exceeded the go */
)
)
{
+#if PG_VERSION_NUM < 90500
VacuumStmt vacstmt;
+#else
+ VacuumParams vacstmt;
+#endif
TimestampTz startStamp, endStamp;
memset(&startStamp, 0, sizeof(startStamp)); /* keep compiler quiet */
break;
}
- vacstmt.type = T_VacuumStmt;
+ memset(&vacstmt, 0, sizeof(vacstmt));
+
vacstmt.freeze_min_age = -1;
vacstmt.freeze_table_age = -1; /* ??? */
+
+#if PG_VERSION_NUM < 90500
+ vacstmt.type = T_VacuumStmt;
vacstmt.relation = NULL;
vacstmt.va_cols = NIL;
-
#if PG_VERSION_NUM >= 90000
vacstmt.options = VACOPT_ANALYZE;
if (online_analyze_verbose)
vacstmt.analyze = true;
vacstmt.verbose = online_analyze_verbose;
#endif
+#else
+ vacstmt.multixact_freeze_min_age = -1;
+ vacstmt.multixact_freeze_table_age = -1;
+ vacstmt.log_min_duration = -1;
+#endif
if (online_analyze_verbose)
startStamp = GetCurrentTimestamp();
- analyze_rel(relOid, &vacstmt, GetAccessStrategy(BAS_VACUUM)
-#if (PG_VERSION_NUM < 90004) && (PG_VERSION_NUM >= 90000)
+ analyze_rel(relOid,
+#if PG_VERSION_NUM < 90500
+ &vacstmt
+#if PG_VERSION_NUM >= 90018
+ , true
+#endif
+ , GetAccessStrategy(BAS_VACUUM)
+#if (PG_VERSION_NUM >= 90000) && (PG_VERSION_NUM < 90004)
, true
+#endif
+#else
+ makeRangeVarFromOid(relOid), VACOPT_ANALYZE | ((online_analyze_verbose) ? VACOPT_VERBOSE : 0),
+ &vacstmt, NULL, true, GetAccessStrategy(BAS_VACUUM)
#endif
);
extern PGDLLIMPORT void onlineAnalyzeHooker(QueryDesc *queryDesc);
void
-onlineAnalyzeHooker(QueryDesc *queryDesc)
+onlineAnalyzeHooker(QueryDesc *queryDesc)
{
- uint32 naffected = 0;
+ uint32 naffected = -1;
if (queryDesc->estate)
- naffected = queryDesc->estate->es_processed;
+ naffected = queryDesc->estate->es_processed;
if (online_analyze_enable && queryDesc->plannedstmt &&
- (queryDesc->operation == CMD_INSERT ||
+ (queryDesc->operation == CMD_INSERT ||
queryDesc->operation == CMD_UPDATE ||
queryDesc->operation == CMD_DELETE
#if PG_VERSION_NUM < 90200
makeAnalyze(relOid, queryDesc->operation, naffected);
}
- else
+ else
#endif
if (queryDesc->plannedstmt->resultRelations &&
queryDesc->plannedstmt->rtable)
{
int n = lfirst_int(l);
RangeTblEntry *rte = list_nth(queryDesc->plannedstmt->rtable, n-1);
-
+
if (rte->rtekind == RTE_RELATION)
makeAnalyze(rte->relid, queryDesc->operation, naffected);
}
#if PG_VERSION_NUM >= 90200
static void
-onlineAnalyzeHookerUtility(Node *parsetree, const char *queryString,
+onlineAnalyzeHookerUtility(Node *parsetree, const char *queryString,
+#if PG_VERSION_NUM >= 90300
+ ProcessUtilityContext context, ParamListInfo params,
+#else
ParamListInfo params, bool isTopLevel,
+#endif
DestReceiver *dest, char *completionTag) {
RangeVar *tblname = NULL;
tblname = (RangeVar*)copyObject(((CreateTableAsStmt*)parsetree)->into->rel);
if (oldProcessUtilityHook)
- oldProcessUtilityHook(parsetree, queryString, params, isTopLevel, dest, completionTag);
+ oldProcessUtilityHook(parsetree, queryString,
+#if PG_VERSION_NUM >= 90300
+ context, params,
+#else
+ params, isTopLevel,
+#endif
+ dest, completionTag);
else
- standard_ProcessUtility(parsetree, queryString, params, isTopLevel, dest, completionTag);
+ standard_ProcessUtility(parsetree, queryString,
+#if PG_VERSION_NUM >= 90300
+ context, params,
+#else
+ params, isTopLevel,
+#endif
+ dest, completionTag);
if (tblname) {
Oid tblOid = RangeVarGetRelid(tblname, NoLock, true);
- makeAnalyze(tblOid, CMD_INSERT, 0);
+ makeAnalyze(tblOid, CMD_INSERT, -1);
}
}
#endif