#include <postgres.h>
#include <fmgr.h>
+#include <miscadmin.h>
#include <access/heapam.h>
+#include <access/xact.h>
#include <catalog/namespace.h>
#include <catalog/pg_class.h>
#include <nodes/pg_list.h>
#include <utils/guc.h>
#include <utils/lsyscache.h>
#include <utils/rel.h>
+#if PG_VERSION_NUM >= 100000
+#include <utils/regproc.h>
+#include <utils/varlena.h>
+#endif
PG_MODULE_MAGIC;
get_relation_info_hook_type prevHook = NULL;
static bool fix_empty_table = false;
+static bool plantuner_enable_inited = false;
+static bool plantuner_disable_inited = false;
static const char *
indexesAssign(const char * newval, bool doit, GucSource source, bool isDisable)
if (!SplitIdentifierString(rawname, ',', &namelist))
goto cleanup;
+ /*
+ * follow work could be done only in normal processing because of
+ * accsess to system catalog
+ */
+ if (MyBackendId == InvalidBackendId || !IsUnderPostmaster ||
+ !IsNormalProcessingMode() || MyAuxProcType != NotAnAuxProcess ||
+ !IsTransactionState())
+ {
+ /* reset init state */
+ if (isDisable)
+ plantuner_disable_inited = false;
+ else
+ plantuner_enable_inited = false;
+
+ return newval;
+ }
+
if (doit)
{
nOids = list_length(namelist);
(int)(sizeof(Oid) * (nOids+1)));
}
+ if (isDisable)
+ plantuner_disable_inited = true;
+ else
+ plantuner_enable_inited = true;
+
foreach(l, namelist)
{
char *curname = (char *) lfirst(l);
{
if (isDisable)
{
- nDisabledIndexes = nOids;
+ nDisabledIndexes = i;
+ if (disabledIndexes)
+ free(disabledIndexes);
disabledIndexes = newOids;
}
else
{
- nEnabledIndexes = nOids;
+ nEnabledIndexes = i;
+ if (enabledIndexes)
+ free(enabledIndexes);
enabledIndexes = newOids;
}
}
return indexesAssign(newval, doit, source, false);
}
+static void
+lateInit()
+{
+ if (!plantuner_enable_inited)
+ indexesAssign(enableIndexesOutStr, true, PGC_S_USER, false);
+ if (!plantuner_disable_inited)
+ indexesAssign(disableIndexesOutStr, true, PGC_S_USER, true);
+}
+
#if PG_VERSION_NUM >= 90100
static bool
{
int i;
+ lateInit();
+
for(i=0;i<nDisabledIndexes;i++)
{
ListCell *l;
int i,
len;
+ lateInit();
+
len = 1 /* \0 */ + nIndexes * (2 * NAMEDATALEN + 2 /* ', ' */ + 1 /* . */);
ptr = val = palloc(len);