Commit cd35e9d7 authored by Tom Lane's avatar Tom Lane

Some infrastructure changes for the upcoming auto-explain contrib module:

* Refactor explain.c slightly to export a convenient-to-use subroutine
for printing EXPLAIN results.

* Provide hooks for plugins to get control at ExecutorStart and ExecutorEnd
as well as ExecutorRun.

* Add some minimal support for tracking the total runtime of ExecutorRun.
This code won't actually do anything unless a plugin prods it to.

* Change the API of the DefineCustomXXXVariable functions to allow nonzero
"flags" to be specified for a custom GUC variable.  While at it, also make
the "bootstrap" default value for custom GUCs be explicitly specified as a
parameter to these functions.  This is to eliminate confusion over where the
default comes from, as has been expressed in the past by some users of the
custom-variable facility.

* Refactor GUC code a bit to ensure that a custom variable gets initialized to
something valid (like its default value) even if the placeholder value was
invalid.
parent 667685ca
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994-5, Regents of the University of California * Portions Copyright (c) 1994-5, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.180 2008/10/06 20:29:38 tgl Exp $ * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.181 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -224,7 +224,6 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, ...@@ -224,7 +224,6 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params,
QueryDesc *queryDesc; QueryDesc *queryDesc;
instr_time starttime; instr_time starttime;
double totaltime = 0; double totaltime = 0;
ExplainState *es;
StringInfoData buf; StringInfoData buf;
int eflags; int eflags;
...@@ -265,17 +264,9 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, ...@@ -265,17 +264,9 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params,
totaltime += elapsed_time(&starttime); totaltime += elapsed_time(&starttime);
} }
es = (ExplainState *) palloc0(sizeof(ExplainState)); /* Create textual dump of plan tree */
es->printTList = stmt->verbose;
es->printAnalyze = stmt->analyze;
es->pstmt = queryDesc->plannedstmt;
es->rtable = queryDesc->plannedstmt->rtable;
initStringInfo(&buf); initStringInfo(&buf);
explain_outNode(&buf, ExplainPrintPlan(&buf, queryDesc, stmt->analyze, stmt->verbose);
queryDesc->plannedstmt->planTree, queryDesc->planstate,
NULL, 0, es);
/* /*
* If we ran the command, run any AFTER triggers it queued. (Note this * If we ran the command, run any AFTER triggers it queued. (Note this
...@@ -290,7 +281,7 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, ...@@ -290,7 +281,7 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params,
} }
/* Print info about runtime of triggers */ /* Print info about runtime of triggers */
if (es->printAnalyze) if (stmt->analyze)
{ {
ResultRelInfo *rInfo; ResultRelInfo *rInfo;
bool show_relname; bool show_relname;
...@@ -335,7 +326,34 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, ...@@ -335,7 +326,34 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params,
do_text_output_multiline(tstate, buf.data); do_text_output_multiline(tstate, buf.data);
pfree(buf.data); pfree(buf.data);
pfree(es); }
/*
* ExplainPrintPlan -
* convert a QueryDesc's plan tree to text and append it to 'str'
*
* 'analyze' means to include runtime instrumentation results
* 'verbose' means a verbose printout (currently, it shows targetlists)
*
* NB: will not work on utility statements
*/
void
ExplainPrintPlan(StringInfo str, QueryDesc *queryDesc,
bool analyze, bool verbose)
{
ExplainState es;
Assert(queryDesc->plannedstmt != NULL);
memset(&es, 0, sizeof(es));
es.printTList = verbose;
es.printAnalyze = analyze;
es.pstmt = queryDesc->plannedstmt;
es.rtable = queryDesc->plannedstmt->rtable;
explain_outNode(str,
queryDesc->plannedstmt->planTree, queryDesc->planstate,
NULL, 0, &es);
} }
/* /*
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.317 2008/11/16 17:34:28 tgl Exp $ * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.318 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -60,8 +60,10 @@ ...@@ -60,8 +60,10 @@
#include "utils/tqual.h" #include "utils/tqual.h"
/* Hook for plugins to get control in ExecutorRun() */ /* Hooks for plugins to get control in ExecutorStart/Run/End() */
ExecutorRun_hook_type ExecutorRun_hook = NULL; ExecutorStart_hook_type ExecutorStart_hook = NULL;
ExecutorRun_hook_type ExecutorRun_hook = NULL;
ExecutorEnd_hook_type ExecutorEnd_hook = NULL;
typedef struct evalPlanQual typedef struct evalPlanQual
{ {
...@@ -129,10 +131,24 @@ static void intorel_destroy(DestReceiver *self); ...@@ -129,10 +131,24 @@ static void intorel_destroy(DestReceiver *self);
* *
* NB: the CurrentMemoryContext when this is called will become the parent * NB: the CurrentMemoryContext when this is called will become the parent
* of the per-query context used for this Executor invocation. * of the per-query context used for this Executor invocation.
*
* We provide a function hook variable that lets loadable plugins
* get control when ExecutorStart is called. Such a plugin would
* normally call standard_ExecutorStart().
*
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
void void
ExecutorStart(QueryDesc *queryDesc, int eflags) ExecutorStart(QueryDesc *queryDesc, int eflags)
{
if (ExecutorStart_hook)
(*ExecutorStart_hook) (queryDesc, eflags);
else
standard_ExecutorStart(queryDesc, eflags);
}
void
standard_ExecutorStart(QueryDesc *queryDesc, int eflags)
{ {
EState *estate; EState *estate;
MemoryContext oldcontext; MemoryContext oldcontext;
...@@ -263,6 +279,10 @@ standard_ExecutorRun(QueryDesc *queryDesc, ...@@ -263,6 +279,10 @@ standard_ExecutorRun(QueryDesc *queryDesc,
*/ */
oldcontext = MemoryContextSwitchTo(estate->es_query_cxt); oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
/* Allow instrumentation of ExecutorRun overall runtime */
if (queryDesc->totaltime)
InstrStartNode(queryDesc->totaltime);
/* /*
* extract information from the query descriptor and the query feature. * extract information from the query descriptor and the query feature.
*/ */
...@@ -298,6 +318,9 @@ standard_ExecutorRun(QueryDesc *queryDesc, ...@@ -298,6 +318,9 @@ standard_ExecutorRun(QueryDesc *queryDesc,
if (sendTuples) if (sendTuples)
(*dest->rShutdown) (dest); (*dest->rShutdown) (dest);
if (queryDesc->totaltime)
InstrStopNode(queryDesc->totaltime, estate->es_processed);
MemoryContextSwitchTo(oldcontext); MemoryContextSwitchTo(oldcontext);
} }
...@@ -306,10 +329,24 @@ standard_ExecutorRun(QueryDesc *queryDesc, ...@@ -306,10 +329,24 @@ standard_ExecutorRun(QueryDesc *queryDesc,
* *
* This routine must be called at the end of execution of any * This routine must be called at the end of execution of any
* query plan * query plan
*
* We provide a function hook variable that lets loadable plugins
* get control when ExecutorEnd is called. Such a plugin would
* normally call standard_ExecutorEnd().
*
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
void void
ExecutorEnd(QueryDesc *queryDesc) ExecutorEnd(QueryDesc *queryDesc)
{
if (ExecutorEnd_hook)
(*ExecutorEnd_hook) (queryDesc);
else
standard_ExecutorEnd(queryDesc);
}
void
standard_ExecutorEnd(QueryDesc *queryDesc)
{ {
EState *estate; EState *estate;
MemoryContext oldcontext; MemoryContext oldcontext;
...@@ -353,6 +390,7 @@ ExecutorEnd(QueryDesc *queryDesc) ...@@ -353,6 +390,7 @@ ExecutorEnd(QueryDesc *queryDesc)
queryDesc->tupDesc = NULL; queryDesc->tupDesc = NULL;
queryDesc->estate = NULL; queryDesc->estate = NULL;
queryDesc->planstate = NULL; queryDesc->planstate = NULL;
queryDesc->totaltime = NULL;
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.124 2008/08/01 13:16:09 alvherre Exp $ * $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.125 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -82,6 +82,7 @@ CreateQueryDesc(PlannedStmt *plannedstmt, ...@@ -82,6 +82,7 @@ CreateQueryDesc(PlannedStmt *plannedstmt,
qd->tupDesc = NULL; qd->tupDesc = NULL;
qd->estate = NULL; qd->estate = NULL;
qd->planstate = NULL; qd->planstate = NULL;
qd->totaltime = NULL;
return qd; return qd;
} }
...@@ -110,6 +111,7 @@ CreateUtilityQueryDesc(Node *utilitystmt, ...@@ -110,6 +111,7 @@ CreateUtilityQueryDesc(Node *utilitystmt,
qd->tupDesc = NULL; qd->tupDesc = NULL;
qd->estate = NULL; qd->estate = NULL;
qd->planstate = NULL; qd->planstate = NULL;
qd->totaltime = NULL;
return qd; return qd;
} }
......
This diff is collapsed.
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California * Portions Copyright (c) 1994-5, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/explain.h,v 1.35 2008/01/01 19:45:57 momjian Exp $ * $PostgreSQL: pgsql/src/include/commands/explain.h,v 1.36 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -41,4 +41,7 @@ extern void ExplainOneUtility(Node *utilityStmt, ExplainStmt *stmt, ...@@ -41,4 +41,7 @@ extern void ExplainOneUtility(Node *utilityStmt, ExplainStmt *stmt,
extern void ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, extern void ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params,
ExplainStmt *stmt, TupOutputState *tstate); ExplainStmt *stmt, TupOutputState *tstate);
extern void ExplainPrintPlan(StringInfo str, QueryDesc *queryDesc,
bool analyze, bool verbose);
#endif /* EXPLAIN_H */ #endif /* EXPLAIN_H */
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/executor/execdesc.h,v 1.37 2008/01/01 19:45:57 momjian Exp $ * $PostgreSQL: pgsql/src/include/executor/execdesc.h,v 1.38 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -47,6 +47,9 @@ typedef struct QueryDesc ...@@ -47,6 +47,9 @@ typedef struct QueryDesc
TupleDesc tupDesc; /* descriptor for result tuples */ TupleDesc tupDesc; /* descriptor for result tuples */
EState *estate; /* executor's query-wide state */ EState *estate; /* executor's query-wide state */
PlanState *planstate; /* tree of per-plan-node state */ PlanState *planstate; /* tree of per-plan-node state */
/* This is always set NULL by the core system, but plugins can change it */
struct Instrumentation *totaltime; /* total time spent in ExecutorRun */
} QueryDesc; } QueryDesc;
/* in pquery.c */ /* in pquery.c */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.152 2008/10/31 21:07:55 tgl Exp $ * $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.153 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -60,12 +60,20 @@ ...@@ -60,12 +60,20 @@
((*(expr)->evalfunc) (expr, econtext, isNull, isDone)) ((*(expr)->evalfunc) (expr, econtext, isNull, isDone))
/* Hook for plugins to get control in ExecutorStart() */
typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);
extern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;
/* Hook for plugins to get control in ExecutorRun() */ /* Hook for plugins to get control in ExecutorRun() */
typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc,
ScanDirection direction, ScanDirection direction,
long count); long count);
extern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook; extern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;
/* Hook for plugins to get control in ExecutorEnd() */
typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);
extern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;
/* /*
* prototypes from functions in execAmi.c * prototypes from functions in execAmi.c
...@@ -140,11 +148,13 @@ extern HeapTuple ExecRemoveJunk(JunkFilter *junkfilter, TupleTableSlot *slot); ...@@ -140,11 +148,13 @@ extern HeapTuple ExecRemoveJunk(JunkFilter *junkfilter, TupleTableSlot *slot);
* prototypes from functions in execMain.c * prototypes from functions in execMain.c
*/ */
extern void ExecutorStart(QueryDesc *queryDesc, int eflags); extern void ExecutorStart(QueryDesc *queryDesc, int eflags);
extern void standard_ExecutorStart(QueryDesc *queryDesc, int eflags);
extern void ExecutorRun(QueryDesc *queryDesc, extern void ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, long count); ScanDirection direction, long count);
extern void standard_ExecutorRun(QueryDesc *queryDesc, extern void standard_ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, long count); ScanDirection direction, long count);
extern void ExecutorEnd(QueryDesc *queryDesc); extern void ExecutorEnd(QueryDesc *queryDesc);
extern void standard_ExecutorEnd(QueryDesc *queryDesc);
extern void ExecutorRewind(QueryDesc *queryDesc); extern void ExecutorRewind(QueryDesc *queryDesc);
extern void InitResultRelInfo(ResultRelInfo *resultRelInfo, extern void InitResultRelInfo(ResultRelInfo *resultRelInfo,
Relation resultRelationDesc, Relation resultRelationDesc,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Copyright (c) 2000-2008, PostgreSQL Global Development Group * Copyright (c) 2000-2008, PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>. * Written by Peter Eisentraut <peter_e@gmx.net>.
* *
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.98 2008/07/23 17:29:53 tgl Exp $ * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.99 2008/11/19 01:10:23 tgl Exp $
*-------------------------------------------------------------------- *--------------------------------------------------------------------
*/ */
#ifndef GUC_H #ifndef GUC_H
...@@ -122,6 +122,30 @@ typedef enum ...@@ -122,6 +122,30 @@ typedef enum
#define GUC_QUALIFIER_SEPARATOR '.' #define GUC_QUALIFIER_SEPARATOR '.'
/*
* bit values in "flags" of a GUC variable
*/
#define GUC_LIST_INPUT 0x0001 /* input can be list format */
#define GUC_LIST_QUOTE 0x0002 /* double-quote list elements */
#define GUC_NO_SHOW_ALL 0x0004 /* exclude from SHOW ALL */
#define GUC_NO_RESET_ALL 0x0008 /* exclude from RESET ALL */
#define GUC_REPORT 0x0010 /* auto-report changes to client */
#define GUC_NOT_IN_SAMPLE 0x0020 /* not in postgresql.conf.sample */
#define GUC_DISALLOW_IN_FILE 0x0040 /* can't set in postgresql.conf */
#define GUC_CUSTOM_PLACEHOLDER 0x0080 /* placeholder for custom variable */
#define GUC_SUPERUSER_ONLY 0x0100 /* show only to superusers */
#define GUC_IS_NAME 0x0200 /* limit string to NAMEDATALEN-1 */
#define GUC_UNIT_KB 0x0400 /* value is in kilobytes */
#define GUC_UNIT_BLOCKS 0x0800 /* value is in blocks */
#define GUC_UNIT_XBLOCKS 0x0C00 /* value is in xlog blocks */
#define GUC_UNIT_MEMORY 0x0C00 /* mask for KB, BLOCKS, XBLOCKS */
#define GUC_UNIT_MS 0x1000 /* value is in milliseconds */
#define GUC_UNIT_S 0x2000 /* value is in seconds */
#define GUC_UNIT_MIN 0x4000 /* value is in minutes */
#define GUC_UNIT_TIME 0x7000 /* mask for MS, S, MIN */
/* GUC vars that are actually declared in guc.c, rather than elsewhere */ /* GUC vars that are actually declared in guc.c, rather than elsewhere */
extern bool log_duration; extern bool log_duration;
extern bool Debug_print_plan; extern bool Debug_print_plan;
...@@ -164,7 +188,9 @@ extern void DefineCustomBoolVariable( ...@@ -164,7 +188,9 @@ extern void DefineCustomBoolVariable(
const char *short_desc, const char *short_desc,
const char *long_desc, const char *long_desc,
bool *valueAddr, bool *valueAddr,
bool bootValue,
GucContext context, GucContext context,
int flags,
GucBoolAssignHook assign_hook, GucBoolAssignHook assign_hook,
GucShowHook show_hook); GucShowHook show_hook);
...@@ -173,9 +199,11 @@ extern void DefineCustomIntVariable( ...@@ -173,9 +199,11 @@ extern void DefineCustomIntVariable(
const char *short_desc, const char *short_desc,
const char *long_desc, const char *long_desc,
int *valueAddr, int *valueAddr,
int bootValue,
int minValue, int minValue,
int maxValue, int maxValue,
GucContext context, GucContext context,
int flags,
GucIntAssignHook assign_hook, GucIntAssignHook assign_hook,
GucShowHook show_hook); GucShowHook show_hook);
...@@ -184,9 +212,11 @@ extern void DefineCustomRealVariable( ...@@ -184,9 +212,11 @@ extern void DefineCustomRealVariable(
const char *short_desc, const char *short_desc,
const char *long_desc, const char *long_desc,
double *valueAddr, double *valueAddr,
double bootValue,
double minValue, double minValue,
double maxValue, double maxValue,
GucContext context, GucContext context,
int flags,
GucRealAssignHook assign_hook, GucRealAssignHook assign_hook,
GucShowHook show_hook); GucShowHook show_hook);
...@@ -195,7 +225,9 @@ extern void DefineCustomStringVariable( ...@@ -195,7 +225,9 @@ extern void DefineCustomStringVariable(
const char *short_desc, const char *short_desc,
const char *long_desc, const char *long_desc,
char **valueAddr, char **valueAddr,
const char *bootValue,
GucContext context, GucContext context,
int flags,
GucStringAssignHook assign_hook, GucStringAssignHook assign_hook,
GucShowHook show_hook); GucShowHook show_hook);
...@@ -204,8 +236,10 @@ extern void DefineCustomEnumVariable( ...@@ -204,8 +236,10 @@ extern void DefineCustomEnumVariable(
const char *short_desc, const char *short_desc,
const char *long_desc, const char *long_desc,
int *valueAddr, int *valueAddr,
int bootValue,
const struct config_enum_entry *options, const struct config_enum_entry *options,
GucContext context, GucContext context,
int flags,
GucEnumAssignHook assign_hook, GucEnumAssignHook assign_hook,
GucShowHook show_hook); GucShowHook show_hook);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.43 2008/09/30 10:52:14 heikki Exp $ * $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.44 2008/11/19 01:10:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -129,27 +129,7 @@ struct config_generic ...@@ -129,27 +129,7 @@ struct config_generic
int sourceline; /* line in source file */ int sourceline; /* line in source file */
}; };
/* bit values in flags field */ /* bit values in flags field are defined in guc.h */
#define GUC_LIST_INPUT 0x0001 /* input can be list format */
#define GUC_LIST_QUOTE 0x0002 /* double-quote list elements */
#define GUC_NO_SHOW_ALL 0x0004 /* exclude from SHOW ALL */
#define GUC_NO_RESET_ALL 0x0008 /* exclude from RESET ALL */
#define GUC_REPORT 0x0010 /* auto-report changes to client */
#define GUC_NOT_IN_SAMPLE 0x0020 /* not in postgresql.conf.sample */
#define GUC_DISALLOW_IN_FILE 0x0040 /* can't set in postgresql.conf */
#define GUC_CUSTOM_PLACEHOLDER 0x0080 /* placeholder for custom variable */
#define GUC_SUPERUSER_ONLY 0x0100 /* show only to superusers */
#define GUC_IS_NAME 0x0200 /* limit string to NAMEDATALEN-1 */
#define GUC_UNIT_KB 0x0400 /* value is in kilobytes */
#define GUC_UNIT_BLOCKS 0x0800 /* value is in blocks */
#define GUC_UNIT_XBLOCKS 0x0C00 /* value is in xlog blocks */
#define GUC_UNIT_MEMORY 0x0C00 /* mask for KB, BLOCKS, XBLOCKS */
#define GUC_UNIT_MS 0x1000 /* value is in milliseconds */
#define GUC_UNIT_S 0x2000 /* value is in seconds */
#define GUC_UNIT_MIN 0x4000 /* value is in minutes */
#define GUC_UNIT_TIME 0x7000 /* mask for MS, S, MIN */
/* bit values in status field */ /* bit values in status field */
#define GUC_IS_IN_FILE 0x0001 /* found it in config file */ #define GUC_IS_IN_FILE 0x0001 /* found it in config file */
......
/********************************************************************** /**********************************************************************
* plperl.c - perl as a procedural language for PostgreSQL * plperl.c - perl as a procedural language for PostgreSQL
* *
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.141 2008/10/29 00:00:39 tgl Exp $ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.142 2008/11/19 01:10:24 tgl Exp $
* *
**********************************************************************/ **********************************************************************/
...@@ -196,7 +196,8 @@ _PG_init(void) ...@@ -196,7 +196,8 @@ _PG_init(void)
gettext_noop("If true, will compile trusted and untrusted perl code in strict mode"), gettext_noop("If true, will compile trusted and untrusted perl code in strict mode"),
NULL, NULL,
&plperl_use_strict, &plperl_use_strict,
PGC_USERSET, false,
PGC_USERSET, 0,
NULL, NULL); NULL, NULL);
EmitWarningsOnPlaceholders("plperl"); EmitWarningsOnPlaceholders("plperl");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment