init
This commit is contained in:
149
pg_include/executor/execdebug.h
Executable file
149
pg_include/executor/execdebug.h
Executable file
@@ -0,0 +1,149 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* execdebug.h
|
||||
* #defines governing debugging behaviour in the executor
|
||||
*
|
||||
* XXX this is all pretty old and crufty. Newer code tends to use elog()
|
||||
* for debug printouts, because that's more flexible than printf().
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/execdebug.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef EXECDEBUG_H
|
||||
#define EXECDEBUG_H
|
||||
|
||||
#include "executor/executor.h"
|
||||
#include "nodes/print.h"
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* debugging defines.
|
||||
*
|
||||
* If you want certain debugging behaviour, then #define
|
||||
* the variable to 1. No need to explicitly #undef by default,
|
||||
* since we can use -D compiler options to enable features.
|
||||
* - thomas 1999-02-20
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* EXEC_NESTLOOPDEBUG is a flag which turns on debugging of the
|
||||
* nest loop node by NL_printf() and ENL_printf() in nodeNestloop.c
|
||||
* ----------------
|
||||
#undef EXEC_NESTLOOPDEBUG
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* EXEC_EVALDEBUG is a flag which turns on debugging of
|
||||
* ExecEval and ExecTargetList() stuff by EV_printf() in execQual.c
|
||||
* ----------------
|
||||
#undef EXEC_EVALDEBUG
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* EXEC_SORTDEBUG is a flag which turns on debugging of
|
||||
* the ExecSort() stuff by SO_printf() in nodeSort.c
|
||||
* ----------------
|
||||
#undef EXEC_SORTDEBUG
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* EXEC_MERGEJOINDEBUG is a flag which turns on debugging of
|
||||
* the ExecMergeJoin() stuff by MJ_printf() in nodeMergejoin.c
|
||||
* ----------------
|
||||
#undef EXEC_MERGEJOINDEBUG
|
||||
*/
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* #defines controlled by above definitions
|
||||
*
|
||||
* Note: most of these are "incomplete" because I didn't
|
||||
* need the ones not defined. More should be added
|
||||
* only as necessary -cim 10/26/89
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
#define T_OR_F(b) ((b) ? "true" : "false")
|
||||
#define NULL_OR_TUPLE(slot) (TupIsNull(slot) ? "null" : "a tuple")
|
||||
|
||||
/* ----------------
|
||||
* nest loop debugging defines
|
||||
* ----------------
|
||||
*/
|
||||
#ifdef EXEC_NESTLOOPDEBUG
|
||||
#define NL_nodeDisplay(l) nodeDisplay(l)
|
||||
#define NL_printf(s) printf(s)
|
||||
#define NL1_printf(s, a) printf(s, a)
|
||||
#define ENL1_printf(message) printf("ExecNestLoop: %s\n", message)
|
||||
#else
|
||||
#define NL_nodeDisplay(l)
|
||||
#define NL_printf(s)
|
||||
#define NL1_printf(s, a)
|
||||
#define ENL1_printf(message)
|
||||
#endif /* EXEC_NESTLOOPDEBUG */
|
||||
|
||||
/* ----------------
|
||||
* exec eval / target list debugging defines
|
||||
* ----------------
|
||||
*/
|
||||
#ifdef EXEC_EVALDEBUG
|
||||
#define EV_nodeDisplay(l) nodeDisplay(l)
|
||||
#define EV_printf(s) printf(s)
|
||||
#define EV1_printf(s, a) printf(s, a)
|
||||
#else
|
||||
#define EV_nodeDisplay(l)
|
||||
#define EV_printf(s)
|
||||
#define EV1_printf(s, a)
|
||||
#endif /* EXEC_EVALDEBUG */
|
||||
|
||||
/* ----------------
|
||||
* sort node debugging defines
|
||||
* ----------------
|
||||
*/
|
||||
#ifdef EXEC_SORTDEBUG
|
||||
#define SO_nodeDisplay(l) nodeDisplay(l)
|
||||
#define SO_printf(s) printf(s)
|
||||
#define SO1_printf(s, p) printf(s, p)
|
||||
#else
|
||||
#define SO_nodeDisplay(l)
|
||||
#define SO_printf(s)
|
||||
#define SO1_printf(s, p)
|
||||
#endif /* EXEC_SORTDEBUG */
|
||||
|
||||
/* ----------------
|
||||
* merge join debugging defines
|
||||
* ----------------
|
||||
*/
|
||||
#ifdef EXEC_MERGEJOINDEBUG
|
||||
|
||||
#define MJ_nodeDisplay(l) nodeDisplay(l)
|
||||
#define MJ_printf(s) printf(s)
|
||||
#define MJ1_printf(s, p) printf(s, p)
|
||||
#define MJ2_printf(s, p1, p2) printf(s, p1, p2)
|
||||
#define MJ_debugtup(slot) debugtup(slot, NULL)
|
||||
#define MJ_dump(state) ExecMergeTupleDump(state)
|
||||
#define MJ_DEBUG_COMPARE(res) \
|
||||
MJ1_printf(" MJCompare() returns %d\n", (res))
|
||||
#define MJ_DEBUG_QUAL(clause, res) \
|
||||
MJ2_printf(" ExecQual(%s, econtext) returns %s\n", \
|
||||
CppAsString(clause), T_OR_F(res))
|
||||
#define MJ_DEBUG_PROC_NODE(slot) \
|
||||
MJ2_printf(" %s = ExecProcNode(...) returns %s\n", \
|
||||
CppAsString(slot), NULL_OR_TUPLE(slot))
|
||||
#else
|
||||
|
||||
#define MJ_nodeDisplay(l)
|
||||
#define MJ_printf(s)
|
||||
#define MJ1_printf(s, p)
|
||||
#define MJ2_printf(s, p1, p2)
|
||||
#define MJ_debugtup(slot)
|
||||
#define MJ_dump(state)
|
||||
#define MJ_DEBUG_COMPARE(res)
|
||||
#define MJ_DEBUG_QUAL(clause, res)
|
||||
#define MJ_DEBUG_PROC_NODE(slot)
|
||||
#endif /* EXEC_MERGEJOINDEBUG */
|
||||
|
||||
#endif /* ExecDebugIncluded */
|
||||
72
pg_include/executor/execdesc.h
Executable file
72
pg_include/executor/execdesc.h
Executable file
@@ -0,0 +1,72 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* execdesc.h
|
||||
* plan and query descriptor accessor macros used by the executor
|
||||
* and related modules.
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/execdesc.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef EXECDESC_H
|
||||
#define EXECDESC_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
#include "tcop/dest.h"
|
||||
|
||||
|
||||
/* ----------------
|
||||
* query descriptor:
|
||||
*
|
||||
* a QueryDesc encapsulates everything that the executor
|
||||
* needs to execute the query.
|
||||
*
|
||||
* For the convenience of SQL-language functions, we also support QueryDescs
|
||||
* containing utility statements; these must not be passed to the executor
|
||||
* however.
|
||||
* ---------------------
|
||||
*/
|
||||
typedef struct QueryDesc
|
||||
{
|
||||
/* These fields are provided by CreateQueryDesc */
|
||||
CmdType operation; /* CMD_SELECT, CMD_UPDATE, etc. */
|
||||
PlannedStmt *plannedstmt; /* planner's output, or null if utility */
|
||||
Node *utilitystmt; /* utility statement, or null */
|
||||
const char *sourceText; /* source text of the query */
|
||||
Snapshot snapshot; /* snapshot to use for query */
|
||||
Snapshot crosscheck_snapshot; /* crosscheck for RI update/delete */
|
||||
DestReceiver *dest; /* the destination for tuple output */
|
||||
ParamListInfo params; /* param values being passed in */
|
||||
int instrument_options; /* OR of InstrumentOption flags */
|
||||
|
||||
/* These fields are set by ExecutorStart */
|
||||
TupleDesc tupDesc; /* descriptor for result tuples */
|
||||
EState *estate; /* executor's query-wide 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;
|
||||
|
||||
/* in pquery.c */
|
||||
extern QueryDesc *CreateQueryDesc(PlannedStmt *plannedstmt,
|
||||
const char *sourceText,
|
||||
Snapshot snapshot,
|
||||
Snapshot crosscheck_snapshot,
|
||||
DestReceiver *dest,
|
||||
ParamListInfo params,
|
||||
int instrument_options);
|
||||
|
||||
extern QueryDesc *CreateUtilityQueryDesc(Node *utilitystmt,
|
||||
const char *sourceText,
|
||||
Snapshot snapshot,
|
||||
DestReceiver *dest,
|
||||
ParamListInfo params);
|
||||
|
||||
extern void FreeQueryDesc(QueryDesc *qdesc);
|
||||
|
||||
#endif /* EXECDESC_H */
|
||||
364
pg_include/executor/executor.h
Executable file
364
pg_include/executor/executor.h
Executable file
@@ -0,0 +1,364 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* executor.h
|
||||
* support for the POSTGRES executor module
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/executor.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef EXECUTOR_H
|
||||
#define EXECUTOR_H
|
||||
|
||||
#include "executor/execdesc.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
|
||||
|
||||
/*
|
||||
* The "eflags" argument to ExecutorStart and the various ExecInitNode
|
||||
* routines is a bitwise OR of the following flag bits, which tell the
|
||||
* called plan node what to expect. Note that the flags will get modified
|
||||
* as they are passed down the plan tree, since an upper node may require
|
||||
* functionality in its subnode not demanded of the plan as a whole
|
||||
* (example: MergeJoin requires mark/restore capability in its inner input),
|
||||
* or an upper node may shield its input from some functionality requirement
|
||||
* (example: Materialize shields its input from needing to do backward scan).
|
||||
*
|
||||
* EXPLAIN_ONLY indicates that the plan tree is being initialized just so
|
||||
* EXPLAIN can print it out; it will not be run. Hence, no side-effects
|
||||
* of startup should occur. However, error checks (such as permission checks)
|
||||
* should be performed.
|
||||
*
|
||||
* REWIND indicates that the plan node should try to efficiently support
|
||||
* rescans without parameter changes. (Nodes must support ExecReScan calls
|
||||
* in any case, but if this flag was not given, they are at liberty to do it
|
||||
* through complete recalculation. Note that a parameter change forces a
|
||||
* full recalculation in any case.)
|
||||
*
|
||||
* BACKWARD indicates that the plan node must respect the es_direction flag.
|
||||
* When this is not passed, the plan node will only be run forwards.
|
||||
*
|
||||
* MARK indicates that the plan node must support Mark/Restore calls.
|
||||
* When this is not passed, no Mark/Restore will occur.
|
||||
*
|
||||
* SKIP_TRIGGERS tells ExecutorStart/ExecutorFinish to skip calling
|
||||
* AfterTriggerBeginQuery/AfterTriggerEndQuery. This does not necessarily
|
||||
* mean that the plan can't queue any AFTER triggers; just that the caller
|
||||
* is responsible for there being a trigger context for them to be queued in.
|
||||
*
|
||||
* WITH/WITHOUT_OIDS tell the executor to emit tuples with or without space
|
||||
* for OIDs, respectively. These are currently used only for CREATE TABLE AS.
|
||||
* If neither is set, the plan may or may not produce tuples including OIDs.
|
||||
*/
|
||||
#define EXEC_FLAG_EXPLAIN_ONLY 0x0001 /* EXPLAIN, no ANALYZE */
|
||||
#define EXEC_FLAG_REWIND 0x0002 /* need efficient rescan */
|
||||
#define EXEC_FLAG_BACKWARD 0x0004 /* need backward scan */
|
||||
#define EXEC_FLAG_MARK 0x0008 /* need mark/restore */
|
||||
#define EXEC_FLAG_SKIP_TRIGGERS 0x0010 /* skip AfterTrigger calls */
|
||||
#define EXEC_FLAG_WITH_OIDS 0x0020 /* force OIDs in returned tuples */
|
||||
#define EXEC_FLAG_WITHOUT_OIDS 0x0040 /* force no OIDs in returned tuples */
|
||||
|
||||
|
||||
/*
|
||||
* ExecEvalExpr was formerly a function containing a switch statement;
|
||||
* now it's just a macro invoking the function pointed to by an ExprState
|
||||
* node. Beware of double evaluation of the ExprState argument!
|
||||
*/
|
||||
#define ExecEvalExpr(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() */
|
||||
typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc,
|
||||
ScanDirection direction,
|
||||
long count);
|
||||
extern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;
|
||||
|
||||
/* Hook for plugins to get control in ExecutorFinish() */
|
||||
typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);
|
||||
extern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;
|
||||
|
||||
/* Hook for plugins to get control in ExecutorEnd() */
|
||||
typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);
|
||||
extern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;
|
||||
|
||||
/* Hook for plugins to get control in ExecCheckRTPerms() */
|
||||
typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);
|
||||
extern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;
|
||||
|
||||
|
||||
/*
|
||||
* prototypes from functions in execAmi.c
|
||||
*/
|
||||
extern void ExecReScan(PlanState *node);
|
||||
extern void ExecMarkPos(PlanState *node);
|
||||
extern void ExecRestrPos(PlanState *node);
|
||||
extern bool ExecSupportsMarkRestore(NodeTag plantype);
|
||||
extern bool ExecSupportsBackwardScan(Plan *node);
|
||||
extern bool ExecMaterializesOutput(NodeTag plantype);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execCurrent.c
|
||||
*/
|
||||
extern bool execCurrentOf(CurrentOfExpr *cexpr,
|
||||
ExprContext *econtext,
|
||||
Oid table_oid,
|
||||
ItemPointer current_tid);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execGrouping.c
|
||||
*/
|
||||
extern bool execTuplesMatch(TupleTableSlot *slot1,
|
||||
TupleTableSlot *slot2,
|
||||
int numCols,
|
||||
AttrNumber *matchColIdx,
|
||||
FmgrInfo *eqfunctions,
|
||||
MemoryContext evalContext);
|
||||
extern bool execTuplesUnequal(TupleTableSlot *slot1,
|
||||
TupleTableSlot *slot2,
|
||||
int numCols,
|
||||
AttrNumber *matchColIdx,
|
||||
FmgrInfo *eqfunctions,
|
||||
MemoryContext evalContext);
|
||||
extern FmgrInfo *execTuplesMatchPrepare(int numCols,
|
||||
Oid *eqOperators);
|
||||
extern void execTuplesHashPrepare(int numCols,
|
||||
Oid *eqOperators,
|
||||
FmgrInfo **eqFunctions,
|
||||
FmgrInfo **hashFunctions);
|
||||
extern TupleHashTable BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,
|
||||
FmgrInfo *eqfunctions,
|
||||
FmgrInfo *hashfunctions,
|
||||
long nbuckets, Size entrysize,
|
||||
MemoryContext tablecxt,
|
||||
MemoryContext tempcxt);
|
||||
extern TupleHashEntry LookupTupleHashEntry(TupleHashTable hashtable,
|
||||
TupleTableSlot *slot,
|
||||
bool *isnew);
|
||||
extern TupleHashEntry FindTupleHashEntry(TupleHashTable hashtable,
|
||||
TupleTableSlot *slot,
|
||||
FmgrInfo *eqfunctions,
|
||||
FmgrInfo *hashfunctions);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execJunk.c
|
||||
*/
|
||||
extern JunkFilter *ExecInitJunkFilter(List *targetList, bool hasoid,
|
||||
TupleTableSlot *slot);
|
||||
extern JunkFilter *ExecInitJunkFilterConversion(List *targetList,
|
||||
TupleDesc cleanTupType,
|
||||
TupleTableSlot *slot);
|
||||
extern AttrNumber ExecFindJunkAttribute(JunkFilter *junkfilter,
|
||||
const char *attrName);
|
||||
extern AttrNumber ExecFindJunkAttributeInTlist(List *targetlist,
|
||||
const char *attrName);
|
||||
extern Datum ExecGetJunkAttribute(TupleTableSlot *slot, AttrNumber attno,
|
||||
bool *isNull);
|
||||
extern TupleTableSlot *ExecFilterJunk(JunkFilter *junkfilter,
|
||||
TupleTableSlot *slot);
|
||||
|
||||
|
||||
/*
|
||||
* prototypes from functions in execMain.c
|
||||
*/
|
||||
extern void ExecutorStart(QueryDesc *queryDesc, int eflags);
|
||||
extern void standard_ExecutorStart(QueryDesc *queryDesc, int eflags);
|
||||
extern void ExecutorRun(QueryDesc *queryDesc,
|
||||
ScanDirection direction, long count);
|
||||
extern void standard_ExecutorRun(QueryDesc *queryDesc,
|
||||
ScanDirection direction, long count);
|
||||
extern void ExecutorFinish(QueryDesc *queryDesc);
|
||||
extern void standard_ExecutorFinish(QueryDesc *queryDesc);
|
||||
extern void ExecutorEnd(QueryDesc *queryDesc);
|
||||
extern void standard_ExecutorEnd(QueryDesc *queryDesc);
|
||||
extern void ExecutorRewind(QueryDesc *queryDesc);
|
||||
extern bool ExecCheckRTPerms(List *rangeTable, bool ereport_on_violation);
|
||||
extern void CheckValidResultRel(Relation resultRel, CmdType operation);
|
||||
extern void InitResultRelInfo(ResultRelInfo *resultRelInfo,
|
||||
Relation resultRelationDesc,
|
||||
Index resultRelationIndex,
|
||||
int instrument_options);
|
||||
extern ResultRelInfo *ExecGetTriggerResultRel(EState *estate, Oid relid);
|
||||
extern bool ExecContextForcesOids(PlanState *planstate, bool *hasoids);
|
||||
extern void ExecConstraints(ResultRelInfo *resultRelInfo,
|
||||
TupleTableSlot *slot, EState *estate);
|
||||
extern ExecRowMark *ExecFindRowMark(EState *estate, Index rti);
|
||||
extern ExecAuxRowMark *ExecBuildAuxRowMark(ExecRowMark *erm, List *targetlist);
|
||||
extern TupleTableSlot *EvalPlanQual(EState *estate, EPQState *epqstate,
|
||||
Relation relation, Index rti,
|
||||
ItemPointer tid, TransactionId priorXmax);
|
||||
extern HeapTuple EvalPlanQualFetch(EState *estate, Relation relation,
|
||||
int lockmode, ItemPointer tid, TransactionId priorXmax);
|
||||
extern void EvalPlanQualInit(EPQState *epqstate, EState *estate,
|
||||
Plan *subplan, List *auxrowmarks, int epqParam);
|
||||
extern void EvalPlanQualSetPlan(EPQState *epqstate,
|
||||
Plan *subplan, List *auxrowmarks);
|
||||
extern void EvalPlanQualSetTuple(EPQState *epqstate, Index rti,
|
||||
HeapTuple tuple);
|
||||
extern HeapTuple EvalPlanQualGetTuple(EPQState *epqstate, Index rti);
|
||||
|
||||
#define EvalPlanQualSetSlot(epqstate, slot) ((epqstate)->origslot = (slot))
|
||||
extern void EvalPlanQualFetchRowMarks(EPQState *epqstate);
|
||||
extern TupleTableSlot *EvalPlanQualNext(EPQState *epqstate);
|
||||
extern void EvalPlanQualBegin(EPQState *epqstate, EState *parentestate);
|
||||
extern void EvalPlanQualEnd(EPQState *epqstate);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execProcnode.c
|
||||
*/
|
||||
extern PlanState *ExecInitNode(Plan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecProcNode(PlanState *node);
|
||||
extern Node *MultiExecProcNode(PlanState *node);
|
||||
extern void ExecEndNode(PlanState *node);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execQual.c
|
||||
*/
|
||||
extern Datum GetAttributeByNum(HeapTupleHeader tuple, AttrNumber attrno,
|
||||
bool *isNull);
|
||||
extern Datum GetAttributeByName(HeapTupleHeader tuple, const char *attname,
|
||||
bool *isNull);
|
||||
extern Tuplestorestate *ExecMakeTableFunctionResult(ExprState *funcexpr,
|
||||
ExprContext *econtext,
|
||||
TupleDesc expectedDesc,
|
||||
bool randomAccess);
|
||||
extern Datum ExecEvalExprSwitchContext(ExprState *expression, ExprContext *econtext,
|
||||
bool *isNull, ExprDoneCond *isDone);
|
||||
extern ExprState *ExecInitExpr(Expr *node, PlanState *parent);
|
||||
extern ExprState *ExecPrepareExpr(Expr *node, EState *estate);
|
||||
extern bool ExecQual(List *qual, ExprContext *econtext, bool resultForNull);
|
||||
extern int ExecTargetListLength(List *targetlist);
|
||||
extern int ExecCleanTargetListLength(List *targetlist);
|
||||
extern TupleTableSlot *ExecProject(ProjectionInfo *projInfo,
|
||||
ExprDoneCond *isDone);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execScan.c
|
||||
*/
|
||||
typedef TupleTableSlot *(*ExecScanAccessMtd) (ScanState *node);
|
||||
typedef bool (*ExecScanRecheckMtd) (ScanState *node, TupleTableSlot *slot);
|
||||
|
||||
extern TupleTableSlot *ExecScan(ScanState *node, ExecScanAccessMtd accessMtd,
|
||||
ExecScanRecheckMtd recheckMtd);
|
||||
extern void ExecAssignScanProjectionInfo(ScanState *node);
|
||||
extern void ExecScanReScan(ScanState *node);
|
||||
|
||||
/*
|
||||
* prototypes from functions in execTuples.c
|
||||
*/
|
||||
extern void ExecInitResultTupleSlot(EState *estate, PlanState *planstate);
|
||||
extern void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate);
|
||||
extern TupleTableSlot *ExecInitExtraTupleSlot(EState *estate);
|
||||
extern TupleTableSlot *ExecInitNullTupleSlot(EState *estate,
|
||||
TupleDesc tupType);
|
||||
extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);
|
||||
extern TupleDesc ExecCleanTypeFromTL(List *targetList, bool hasoid);
|
||||
extern TupleDesc ExecTypeFromExprList(List *exprList, List *namesList);
|
||||
extern void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg);
|
||||
|
||||
typedef struct TupOutputState
|
||||
{
|
||||
TupleTableSlot *slot;
|
||||
DestReceiver *dest;
|
||||
} TupOutputState;
|
||||
|
||||
extern TupOutputState *begin_tup_output_tupdesc(DestReceiver *dest,
|
||||
TupleDesc tupdesc);
|
||||
extern void do_tup_output(TupOutputState *tstate, Datum *values, bool *isnull);
|
||||
extern void do_text_output_multiline(TupOutputState *tstate, char *text);
|
||||
extern void end_tup_output(TupOutputState *tstate);
|
||||
|
||||
/*
|
||||
* Write a single line of text given as a C string.
|
||||
*
|
||||
* Should only be used with a single-TEXT-attribute tupdesc.
|
||||
*/
|
||||
#define do_text_output_oneline(tstate, str_to_emit) \
|
||||
do { \
|
||||
Datum values_[1]; \
|
||||
bool isnull_[1]; \
|
||||
values_[0] = PointerGetDatum(cstring_to_text(str_to_emit)); \
|
||||
isnull_[0] = false; \
|
||||
do_tup_output(tstate, values_, isnull_); \
|
||||
pfree(DatumGetPointer(values_[0])); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*
|
||||
* prototypes from functions in execUtils.c
|
||||
*/
|
||||
extern EState *CreateExecutorState(void);
|
||||
extern void FreeExecutorState(EState *estate);
|
||||
extern ExprContext *CreateExprContext(EState *estate);
|
||||
extern ExprContext *CreateStandaloneExprContext(void);
|
||||
extern void FreeExprContext(ExprContext *econtext, bool isCommit);
|
||||
extern void ReScanExprContext(ExprContext *econtext);
|
||||
|
||||
#define ResetExprContext(econtext) \
|
||||
MemoryContextReset((econtext)->ecxt_per_tuple_memory)
|
||||
|
||||
extern ExprContext *MakePerTupleExprContext(EState *estate);
|
||||
|
||||
/* Get an EState's per-output-tuple exprcontext, making it if first use */
|
||||
#define GetPerTupleExprContext(estate) \
|
||||
((estate)->es_per_tuple_exprcontext ? \
|
||||
(estate)->es_per_tuple_exprcontext : \
|
||||
MakePerTupleExprContext(estate))
|
||||
|
||||
#define GetPerTupleMemoryContext(estate) \
|
||||
(GetPerTupleExprContext(estate)->ecxt_per_tuple_memory)
|
||||
|
||||
/* Reset an EState's per-output-tuple exprcontext, if one's been created */
|
||||
#define ResetPerTupleExprContext(estate) \
|
||||
do { \
|
||||
if ((estate)->es_per_tuple_exprcontext) \
|
||||
ResetExprContext((estate)->es_per_tuple_exprcontext); \
|
||||
} while (0)
|
||||
|
||||
extern void ExecAssignExprContext(EState *estate, PlanState *planstate);
|
||||
extern void ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc);
|
||||
extern void ExecAssignResultTypeFromTL(PlanState *planstate);
|
||||
extern TupleDesc ExecGetResultType(PlanState *planstate);
|
||||
extern ProjectionInfo *ExecBuildProjectionInfo(List *targetList,
|
||||
ExprContext *econtext,
|
||||
TupleTableSlot *slot,
|
||||
TupleDesc inputDesc);
|
||||
extern void ExecAssignProjectionInfo(PlanState *planstate,
|
||||
TupleDesc inputDesc);
|
||||
extern void ExecFreeExprContext(PlanState *planstate);
|
||||
extern TupleDesc ExecGetScanType(ScanState *scanstate);
|
||||
extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc);
|
||||
extern void ExecAssignScanTypeFromOuterPlan(ScanState *scanstate);
|
||||
|
||||
extern bool ExecRelationIsTargetRelation(EState *estate, Index scanrelid);
|
||||
|
||||
extern Relation ExecOpenScanRelation(EState *estate, Index scanrelid);
|
||||
extern void ExecCloseScanRelation(Relation scanrel);
|
||||
|
||||
extern void ExecOpenIndices(ResultRelInfo *resultRelInfo);
|
||||
extern void ExecCloseIndices(ResultRelInfo *resultRelInfo);
|
||||
extern List *ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid,
|
||||
EState *estate);
|
||||
extern bool check_exclusion_constraint(Relation heap, Relation index,
|
||||
IndexInfo *indexInfo,
|
||||
ItemPointer tupleid,
|
||||
Datum *values, bool *isnull,
|
||||
EState *estate,
|
||||
bool newIndex, bool errorOK);
|
||||
|
||||
extern void RegisterExprContextCallback(ExprContext *econtext,
|
||||
ExprContextCallbackFunction function,
|
||||
Datum arg);
|
||||
extern void UnregisterExprContextCallback(ExprContext *econtext,
|
||||
ExprContextCallbackFunction function,
|
||||
Datum arg);
|
||||
|
||||
#endif /* EXECUTOR_H */
|
||||
39
pg_include/executor/functions.h
Executable file
39
pg_include/executor/functions.h
Executable file
@@ -0,0 +1,39 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* functions.h
|
||||
* Declarations for execution of SQL-language functions.
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/functions.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef FUNCTIONS_H
|
||||
#define FUNCTIONS_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
#include "tcop/dest.h"
|
||||
|
||||
/* This struct is known only within executor/functions.c */
|
||||
typedef struct SQLFunctionParseInfo *SQLFunctionParseInfoPtr;
|
||||
|
||||
extern Datum fmgr_sql(PG_FUNCTION_ARGS);
|
||||
|
||||
extern SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple,
|
||||
Node *call_expr,
|
||||
Oid inputCollation);
|
||||
|
||||
extern void sql_fn_parser_setup(struct ParseState *pstate,
|
||||
SQLFunctionParseInfoPtr pinfo);
|
||||
|
||||
extern bool check_sql_fn_retval(Oid func_id, Oid rettype,
|
||||
List *queryTreeList,
|
||||
bool *modifyTargetList,
|
||||
JunkFilter **junkFilter);
|
||||
|
||||
extern DestReceiver *CreateSQLFunctionDestReceiver(void);
|
||||
|
||||
#endif /* FUNCTIONS_H */
|
||||
162
pg_include/executor/hashjoin.h
Executable file
162
pg_include/executor/hashjoin.h
Executable file
@@ -0,0 +1,162 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* hashjoin.h
|
||||
* internal structures for hash joins
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/hashjoin.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef HASHJOIN_H
|
||||
#define HASHJOIN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
#include "storage/buffile.h"
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* hash-join hash table structures
|
||||
*
|
||||
* Each active hashjoin has a HashJoinTable control block, which is
|
||||
* palloc'd in the executor's per-query context. All other storage needed
|
||||
* for the hashjoin is kept in private memory contexts, two for each hashjoin.
|
||||
* This makes it easy and fast to release the storage when we don't need it
|
||||
* anymore. (Exception: data associated with the temp files lives in the
|
||||
* per-query context too, since we always call buffile.c in that context.)
|
||||
*
|
||||
* The hashtable contexts are made children of the per-query context, ensuring
|
||||
* that they will be discarded at end of statement even if the join is
|
||||
* aborted early by an error. (Likewise, any temporary files we make will
|
||||
* be cleaned up by the virtual file manager in event of an error.)
|
||||
*
|
||||
* Storage that should live through the entire join is allocated from the
|
||||
* "hashCxt", while storage that is only wanted for the current batch is
|
||||
* allocated in the "batchCxt". By resetting the batchCxt at the end of
|
||||
* each batch, we free all the per-batch storage reliably and without tedium.
|
||||
*
|
||||
* During first scan of inner relation, we get its tuples from executor.
|
||||
* If nbatch > 1 then tuples that don't belong in first batch get saved
|
||||
* into inner-batch temp files. The same statements apply for the
|
||||
* first scan of the outer relation, except we write tuples to outer-batch
|
||||
* temp files. After finishing the first scan, we do the following for
|
||||
* each remaining batch:
|
||||
* 1. Read tuples from inner batch file, load into hash buckets.
|
||||
* 2. Read tuples from outer batch file, match to hash buckets and output.
|
||||
*
|
||||
* It is possible to increase nbatch on the fly if the in-memory hash table
|
||||
* gets too big. The hash-value-to-batch computation is arranged so that this
|
||||
* can only cause a tuple to go into a later batch than previously thought,
|
||||
* never into an earlier batch. When we increase nbatch, we rescan the hash
|
||||
* table and dump out any tuples that are now of a later batch to the correct
|
||||
* inner batch file. Subsequently, while reading either inner or outer batch
|
||||
* files, we might find tuples that no longer belong to the current batch;
|
||||
* if so, we just dump them out to the correct batch file.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* these are in nodes/execnodes.h: */
|
||||
/* typedef struct HashJoinTupleData *HashJoinTuple; */
|
||||
/* typedef struct HashJoinTableData *HashJoinTable; */
|
||||
|
||||
typedef struct HashJoinTupleData
|
||||
{
|
||||
struct HashJoinTupleData *next; /* link to next tuple in same bucket */
|
||||
uint32 hashvalue; /* tuple's hash code */
|
||||
/* Tuple data, in MinimalTuple format, follows on a MAXALIGN boundary */
|
||||
} HashJoinTupleData;
|
||||
|
||||
#define HJTUPLE_OVERHEAD MAXALIGN(sizeof(HashJoinTupleData))
|
||||
#define HJTUPLE_MINTUPLE(hjtup) \
|
||||
((MinimalTuple) ((char *) (hjtup) + HJTUPLE_OVERHEAD))
|
||||
|
||||
/*
|
||||
* If the outer relation's distribution is sufficiently nonuniform, we attempt
|
||||
* to optimize the join by treating the hash values corresponding to the outer
|
||||
* relation's MCVs specially. Inner relation tuples matching these hash
|
||||
* values go into the "skew" hashtable instead of the main hashtable, and
|
||||
* outer relation tuples with these hash values are matched against that
|
||||
* table instead of the main one. Thus, tuples with these hash values are
|
||||
* effectively handled as part of the first batch and will never go to disk.
|
||||
* The skew hashtable is limited to SKEW_WORK_MEM_PERCENT of the total memory
|
||||
* allowed for the join; while building the hashtables, we decrease the number
|
||||
* of MCVs being specially treated if needed to stay under this limit.
|
||||
*
|
||||
* Note: you might wonder why we look at the outer relation stats for this,
|
||||
* rather than the inner. One reason is that the outer relation is typically
|
||||
* bigger, so we get more I/O savings by optimizing for its most common values.
|
||||
* Also, for similarly-sized relations, the planner prefers to put the more
|
||||
* uniformly distributed relation on the inside, so we're more likely to find
|
||||
* interesting skew in the outer relation.
|
||||
*/
|
||||
typedef struct HashSkewBucket
|
||||
{
|
||||
uint32 hashvalue; /* common hash value */
|
||||
HashJoinTuple tuples; /* linked list of inner-relation tuples */
|
||||
} HashSkewBucket;
|
||||
|
||||
#define SKEW_BUCKET_OVERHEAD MAXALIGN(sizeof(HashSkewBucket))
|
||||
#define INVALID_SKEW_BUCKET_NO (-1)
|
||||
#define SKEW_WORK_MEM_PERCENT 2
|
||||
#define SKEW_MIN_OUTER_FRACTION 0.01
|
||||
|
||||
|
||||
typedef struct HashJoinTableData
|
||||
{
|
||||
int nbuckets; /* # buckets in the in-memory hash table */
|
||||
int log2_nbuckets; /* its log2 (nbuckets must be a power of 2) */
|
||||
|
||||
/* buckets[i] is head of list of tuples in i'th in-memory bucket */
|
||||
struct HashJoinTupleData **buckets;
|
||||
/* buckets array is per-batch storage, as are all the tuples */
|
||||
|
||||
bool keepNulls; /* true to store unmatchable NULL tuples */
|
||||
|
||||
bool skewEnabled; /* are we using skew optimization? */
|
||||
HashSkewBucket **skewBucket; /* hashtable of skew buckets */
|
||||
int skewBucketLen; /* size of skewBucket array (a power of 2!) */
|
||||
int nSkewBuckets; /* number of active skew buckets */
|
||||
int *skewBucketNums; /* array indexes of active skew buckets */
|
||||
|
||||
int nbatch; /* number of batches */
|
||||
int curbatch; /* current batch #; 0 during 1st pass */
|
||||
|
||||
int nbatch_original; /* nbatch when we started inner scan */
|
||||
int nbatch_outstart; /* nbatch when we started outer scan */
|
||||
|
||||
bool growEnabled; /* flag to shut off nbatch increases */
|
||||
|
||||
double totalTuples; /* # tuples obtained from inner plan */
|
||||
|
||||
/*
|
||||
* These arrays are allocated for the life of the hash join, but only if
|
||||
* nbatch > 1. A file is opened only when we first write a tuple into it
|
||||
* (otherwise its pointer remains NULL). Note that the zero'th array
|
||||
* elements never get used, since we will process rather than dump out any
|
||||
* tuples of batch zero.
|
||||
*/
|
||||
BufFile **innerBatchFile; /* buffered virtual temp file per batch */
|
||||
BufFile **outerBatchFile; /* buffered virtual temp file per batch */
|
||||
|
||||
/*
|
||||
* Info about the datatype-specific hash functions for the datatypes being
|
||||
* hashed. These are arrays of the same length as the number of hash join
|
||||
* clauses (hash keys).
|
||||
*/
|
||||
FmgrInfo *outer_hashfunctions; /* lookup data for hash functions */
|
||||
FmgrInfo *inner_hashfunctions; /* lookup data for hash functions */
|
||||
bool *hashStrict; /* is each hash join operator strict? */
|
||||
|
||||
Size spaceUsed; /* memory space currently used by tuples */
|
||||
Size spaceAllowed; /* upper limit for space used */
|
||||
Size spacePeak; /* peak space used */
|
||||
Size spaceUsedSkew; /* skew hash table's current space usage */
|
||||
Size spaceAllowedSkew; /* upper limit for skew hashtable */
|
||||
|
||||
MemoryContext hashCxt; /* context for whole-hash-join storage */
|
||||
MemoryContext batchCxt; /* context for this-batch-only storage */
|
||||
} HashJoinTableData;
|
||||
|
||||
#endif /* HASHJOIN_H */
|
||||
73
pg_include/executor/instrument.h
Executable file
73
pg_include/executor/instrument.h
Executable file
@@ -0,0 +1,73 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* instrument.h
|
||||
* definitions for run-time statistics collection
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2001-2012, PostgreSQL Global Development Group
|
||||
*
|
||||
* src/include/executor/instrument.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef INSTRUMENT_H
|
||||
#define INSTRUMENT_H
|
||||
|
||||
#include "portability/instr_time.h"
|
||||
|
||||
|
||||
typedef struct BufferUsage
|
||||
{
|
||||
long shared_blks_hit; /* # of shared buffer hits */
|
||||
long shared_blks_read; /* # of shared disk blocks read */
|
||||
long shared_blks_dirtied; /* # of shared blocks dirtied */
|
||||
long shared_blks_written; /* # of shared disk blocks written */
|
||||
long local_blks_hit; /* # of local buffer hits */
|
||||
long local_blks_read; /* # of local disk blocks read */
|
||||
long local_blks_dirtied; /* # of shared blocks dirtied */
|
||||
long local_blks_written; /* # of local disk blocks written */
|
||||
long temp_blks_read; /* # of temp blocks read */
|
||||
long temp_blks_written; /* # of temp blocks written */
|
||||
instr_time blk_read_time; /* time spent reading */
|
||||
instr_time blk_write_time; /* time spent writing */
|
||||
} BufferUsage;
|
||||
|
||||
/* Flag bits included in InstrAlloc's instrument_options bitmask */
|
||||
typedef enum InstrumentOption
|
||||
{
|
||||
INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */
|
||||
INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */
|
||||
INSTRUMENT_ROWS = 1 << 2, /* needs row count */
|
||||
INSTRUMENT_ALL = 0x7FFFFFFF
|
||||
} InstrumentOption;
|
||||
|
||||
typedef struct Instrumentation
|
||||
{
|
||||
/* Parameters set at node creation: */
|
||||
bool need_timer; /* TRUE if we need timer data */
|
||||
bool need_bufusage; /* TRUE if we need buffer usage data */
|
||||
/* Info about current plan cycle: */
|
||||
bool running; /* TRUE if we've completed first tuple */
|
||||
instr_time starttime; /* Start time of current iteration of node */
|
||||
instr_time counter; /* Accumulated runtime for this node */
|
||||
double firsttuple; /* Time for first tuple of this cycle */
|
||||
double tuplecount; /* Tuples emitted so far this cycle */
|
||||
BufferUsage bufusage_start; /* Buffer usage at start */
|
||||
/* Accumulated statistics across all completed cycles: */
|
||||
double startup; /* Total startup time (in seconds) */
|
||||
double total; /* Total total time (in seconds) */
|
||||
double ntuples; /* Total tuples produced */
|
||||
double nloops; /* # of run cycles for this node */
|
||||
double nfiltered1; /* # tuples removed by scanqual or joinqual */
|
||||
double nfiltered2; /* # tuples removed by "other" quals */
|
||||
BufferUsage bufusage; /* Total buffer usage */
|
||||
} Instrumentation;
|
||||
|
||||
extern PGDLLIMPORT BufferUsage pgBufferUsage;
|
||||
|
||||
extern Instrumentation *InstrAlloc(int n, int instrument_options);
|
||||
extern void InstrStartNode(Instrumentation *instr);
|
||||
extern void InstrStopNode(Instrumentation *instr, double nTuples);
|
||||
extern void InstrEndLoop(Instrumentation *instr);
|
||||
|
||||
#endif /* INSTRUMENT_H */
|
||||
28
pg_include/executor/nodeAgg.h
Executable file
28
pg_include/executor/nodeAgg.h
Executable file
@@ -0,0 +1,28 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeAgg.h
|
||||
* prototypes for nodeAgg.c
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeAgg.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEAGG_H
|
||||
#define NODEAGG_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern AggState *ExecInitAgg(Agg *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecAgg(AggState *node);
|
||||
extern void ExecEndAgg(AggState *node);
|
||||
extern void ExecReScanAgg(AggState *node);
|
||||
|
||||
extern Size hash_agg_entry_size(int numAggs);
|
||||
|
||||
extern Datum aggregate_dummy(PG_FUNCTION_ARGS);
|
||||
|
||||
#endif /* NODEAGG_H */
|
||||
24
pg_include/executor/nodeAppend.h
Executable file
24
pg_include/executor/nodeAppend.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeAppend.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeAppend.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEAPPEND_H
|
||||
#define NODEAPPEND_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern AppendState *ExecInitAppend(Append *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecAppend(AppendState *node);
|
||||
extern void ExecEndAppend(AppendState *node);
|
||||
extern void ExecReScanAppend(AppendState *node);
|
||||
|
||||
#endif /* NODEAPPEND_H */
|
||||
24
pg_include/executor/nodeBitmapAnd.h
Executable file
24
pg_include/executor/nodeBitmapAnd.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeBitmapAnd.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeBitmapAnd.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEBITMAPAND_H
|
||||
#define NODEBITMAPAND_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern BitmapAndState *ExecInitBitmapAnd(BitmapAnd *node, EState *estate, int eflags);
|
||||
extern Node *MultiExecBitmapAnd(BitmapAndState *node);
|
||||
extern void ExecEndBitmapAnd(BitmapAndState *node);
|
||||
extern void ExecReScanBitmapAnd(BitmapAndState *node);
|
||||
|
||||
#endif /* NODEBITMAPAND_H */
|
||||
24
pg_include/executor/nodeBitmapHeapscan.h
Executable file
24
pg_include/executor/nodeBitmapHeapscan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeBitmapHeapscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeBitmapHeapscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEBITMAPHEAPSCAN_H
|
||||
#define NODEBITMAPHEAPSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern BitmapHeapScanState *ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecBitmapHeapScan(BitmapHeapScanState *node);
|
||||
extern void ExecEndBitmapHeapScan(BitmapHeapScanState *node);
|
||||
extern void ExecReScanBitmapHeapScan(BitmapHeapScanState *node);
|
||||
|
||||
#endif /* NODEBITMAPHEAPSCAN_H */
|
||||
24
pg_include/executor/nodeBitmapIndexscan.h
Executable file
24
pg_include/executor/nodeBitmapIndexscan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeBitmapIndexscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeBitmapIndexscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEBITMAPINDEXSCAN_H
|
||||
#define NODEBITMAPINDEXSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern BitmapIndexScanState *ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags);
|
||||
extern Node *MultiExecBitmapIndexScan(BitmapIndexScanState *node);
|
||||
extern void ExecEndBitmapIndexScan(BitmapIndexScanState *node);
|
||||
extern void ExecReScanBitmapIndexScan(BitmapIndexScanState *node);
|
||||
|
||||
#endif /* NODEBITMAPINDEXSCAN_H */
|
||||
24
pg_include/executor/nodeBitmapOr.h
Executable file
24
pg_include/executor/nodeBitmapOr.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeBitmapOr.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeBitmapOr.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEBITMAPOR_H
|
||||
#define NODEBITMAPOR_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern BitmapOrState *ExecInitBitmapOr(BitmapOr *node, EState *estate, int eflags);
|
||||
extern Node *MultiExecBitmapOr(BitmapOrState *node);
|
||||
extern void ExecEndBitmapOr(BitmapOrState *node);
|
||||
extern void ExecReScanBitmapOr(BitmapOrState *node);
|
||||
|
||||
#endif /* NODEBITMAPOR_H */
|
||||
24
pg_include/executor/nodeCtescan.h
Executable file
24
pg_include/executor/nodeCtescan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeCtescan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeCtescan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODECTESCAN_H
|
||||
#define NODECTESCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern CteScanState *ExecInitCteScan(CteScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecCteScan(CteScanState *node);
|
||||
extern void ExecEndCteScan(CteScanState *node);
|
||||
extern void ExecReScanCteScan(CteScanState *node);
|
||||
|
||||
#endif /* NODECTESCAN_H */
|
||||
24
pg_include/executor/nodeForeignscan.h
Executable file
24
pg_include/executor/nodeForeignscan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeForeignscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeForeignscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEFOREIGNSCAN_H
|
||||
#define NODEFOREIGNSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern ForeignScanState *ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecForeignScan(ForeignScanState *node);
|
||||
extern void ExecEndForeignScan(ForeignScanState *node);
|
||||
extern void ExecReScanForeignScan(ForeignScanState *node);
|
||||
|
||||
#endif /* NODEFOREIGNSCAN_H */
|
||||
24
pg_include/executor/nodeFunctionscan.h
Executable file
24
pg_include/executor/nodeFunctionscan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeFunctionscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeFunctionscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEFUNCTIONSCAN_H
|
||||
#define NODEFUNCTIONSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern FunctionScanState *ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecFunctionScan(FunctionScanState *node);
|
||||
extern void ExecEndFunctionScan(FunctionScanState *node);
|
||||
extern void ExecReScanFunctionScan(FunctionScanState *node);
|
||||
|
||||
#endif /* NODEFUNCTIONSCAN_H */
|
||||
24
pg_include/executor/nodeGroup.h
Executable file
24
pg_include/executor/nodeGroup.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeGroup.h
|
||||
* prototypes for nodeGroup.c
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeGroup.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEGROUP_H
|
||||
#define NODEGROUP_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern GroupState *ExecInitGroup(Group *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecGroup(GroupState *node);
|
||||
extern void ExecEndGroup(GroupState *node);
|
||||
extern void ExecReScanGroup(GroupState *node);
|
||||
|
||||
#endif /* NODEGROUP_H */
|
||||
53
pg_include/executor/nodeHash.h
Executable file
53
pg_include/executor/nodeHash.h
Executable file
@@ -0,0 +1,53 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeHash.h
|
||||
* prototypes for nodeHash.c
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeHash.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEHASH_H
|
||||
#define NODEHASH_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern HashState *ExecInitHash(Hash *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecHash(HashState *node);
|
||||
extern Node *MultiExecHash(HashState *node);
|
||||
extern void ExecEndHash(HashState *node);
|
||||
extern void ExecReScanHash(HashState *node);
|
||||
|
||||
extern HashJoinTable ExecHashTableCreate(Hash *node, List *hashOperators,
|
||||
bool keepNulls);
|
||||
extern void ExecHashTableDestroy(HashJoinTable hashtable);
|
||||
extern void ExecHashTableInsert(HashJoinTable hashtable,
|
||||
TupleTableSlot *slot,
|
||||
uint32 hashvalue);
|
||||
extern bool ExecHashGetHashValue(HashJoinTable hashtable,
|
||||
ExprContext *econtext,
|
||||
List *hashkeys,
|
||||
bool outer_tuple,
|
||||
bool keep_nulls,
|
||||
uint32 *hashvalue);
|
||||
extern void ExecHashGetBucketAndBatch(HashJoinTable hashtable,
|
||||
uint32 hashvalue,
|
||||
int *bucketno,
|
||||
int *batchno);
|
||||
extern bool ExecScanHashBucket(HashJoinState *hjstate, ExprContext *econtext);
|
||||
extern void ExecPrepHashTableForUnmatched(HashJoinState *hjstate);
|
||||
extern bool ExecScanHashTableForUnmatched(HashJoinState *hjstate,
|
||||
ExprContext *econtext);
|
||||
extern void ExecHashTableReset(HashJoinTable hashtable);
|
||||
extern void ExecHashTableResetMatchFlags(HashJoinTable hashtable);
|
||||
extern void ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew,
|
||||
int *numbuckets,
|
||||
int *numbatches,
|
||||
int *num_skew_mcvs);
|
||||
extern int ExecHashGetSkewBucket(HashJoinTable hashtable, uint32 hashvalue);
|
||||
|
||||
#endif /* NODEHASH_H */
|
||||
28
pg_include/executor/nodeHashjoin.h
Executable file
28
pg_include/executor/nodeHashjoin.h
Executable file
@@ -0,0 +1,28 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeHashjoin.h
|
||||
* prototypes for nodeHashjoin.c
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeHashjoin.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEHASHJOIN_H
|
||||
#define NODEHASHJOIN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
#include "storage/buffile.h"
|
||||
|
||||
extern HashJoinState *ExecInitHashJoin(HashJoin *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecHashJoin(HashJoinState *node);
|
||||
extern void ExecEndHashJoin(HashJoinState *node);
|
||||
extern void ExecReScanHashJoin(HashJoinState *node);
|
||||
|
||||
extern void ExecHashJoinSaveTuple(MinimalTuple tuple, uint32 hashvalue,
|
||||
BufFile **fileptr);
|
||||
|
||||
#endif /* NODEHASHJOIN_H */
|
||||
26
pg_include/executor/nodeIndexonlyscan.h
Executable file
26
pg_include/executor/nodeIndexonlyscan.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeIndexonlyscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeIndexonlyscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEINDEXONLYSCAN_H
|
||||
#define NODEINDEXONLYSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern IndexOnlyScanState *ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecIndexOnlyScan(IndexOnlyScanState *node);
|
||||
extern void ExecEndIndexOnlyScan(IndexOnlyScanState *node);
|
||||
extern void ExecIndexOnlyMarkPos(IndexOnlyScanState *node);
|
||||
extern void ExecIndexOnlyRestrPos(IndexOnlyScanState *node);
|
||||
extern void ExecReScanIndexOnlyScan(IndexOnlyScanState *node);
|
||||
|
||||
#endif /* NODEINDEXONLYSCAN_H */
|
||||
41
pg_include/executor/nodeIndexscan.h
Executable file
41
pg_include/executor/nodeIndexscan.h
Executable file
@@ -0,0 +1,41 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeIndexscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeIndexscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEINDEXSCAN_H
|
||||
#define NODEINDEXSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern IndexScanState *ExecInitIndexScan(IndexScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecIndexScan(IndexScanState *node);
|
||||
extern void ExecEndIndexScan(IndexScanState *node);
|
||||
extern void ExecIndexMarkPos(IndexScanState *node);
|
||||
extern void ExecIndexRestrPos(IndexScanState *node);
|
||||
extern void ExecReScanIndexScan(IndexScanState *node);
|
||||
|
||||
/*
|
||||
* These routines are exported to share code with nodeIndexonlyscan.c and
|
||||
* nodeBitmapIndexscan.c
|
||||
*/
|
||||
extern void ExecIndexBuildScanKeys(PlanState *planstate, Relation index,
|
||||
List *quals, bool isorderby,
|
||||
ScanKey *scanKeys, int *numScanKeys,
|
||||
IndexRuntimeKeyInfo **runtimeKeys, int *numRuntimeKeys,
|
||||
IndexArrayKeyInfo **arrayKeys, int *numArrayKeys);
|
||||
extern void ExecIndexEvalRuntimeKeys(ExprContext *econtext,
|
||||
IndexRuntimeKeyInfo *runtimeKeys, int numRuntimeKeys);
|
||||
extern bool ExecIndexEvalArrayKeys(ExprContext *econtext,
|
||||
IndexArrayKeyInfo *arrayKeys, int numArrayKeys);
|
||||
extern bool ExecIndexAdvanceArrayKeys(IndexArrayKeyInfo *arrayKeys, int numArrayKeys);
|
||||
|
||||
#endif /* NODEINDEXSCAN_H */
|
||||
24
pg_include/executor/nodeLimit.h
Executable file
24
pg_include/executor/nodeLimit.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeLimit.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeLimit.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODELIMIT_H
|
||||
#define NODELIMIT_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern LimitState *ExecInitLimit(Limit *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecLimit(LimitState *node);
|
||||
extern void ExecEndLimit(LimitState *node);
|
||||
extern void ExecReScanLimit(LimitState *node);
|
||||
|
||||
#endif /* NODELIMIT_H */
|
||||
24
pg_include/executor/nodeLockRows.h
Executable file
24
pg_include/executor/nodeLockRows.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeLockRows.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeLockRows.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODELOCKROWS_H
|
||||
#define NODELOCKROWS_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern LockRowsState *ExecInitLockRows(LockRows *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecLockRows(LockRowsState *node);
|
||||
extern void ExecEndLockRows(LockRowsState *node);
|
||||
extern void ExecReScanLockRows(LockRowsState *node);
|
||||
|
||||
#endif /* NODELOCKROWS_H */
|
||||
26
pg_include/executor/nodeMaterial.h
Executable file
26
pg_include/executor/nodeMaterial.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeMaterial.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeMaterial.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEMATERIAL_H
|
||||
#define NODEMATERIAL_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern MaterialState *ExecInitMaterial(Material *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecMaterial(MaterialState *node);
|
||||
extern void ExecEndMaterial(MaterialState *node);
|
||||
extern void ExecMaterialMarkPos(MaterialState *node);
|
||||
extern void ExecMaterialRestrPos(MaterialState *node);
|
||||
extern void ExecReScanMaterial(MaterialState *node);
|
||||
|
||||
#endif /* NODEMATERIAL_H */
|
||||
24
pg_include/executor/nodeMergeAppend.h
Executable file
24
pg_include/executor/nodeMergeAppend.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeMergeAppend.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeMergeAppend.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEMERGEAPPEND_H
|
||||
#define NODEMERGEAPPEND_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern MergeAppendState *ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecMergeAppend(MergeAppendState *node);
|
||||
extern void ExecEndMergeAppend(MergeAppendState *node);
|
||||
extern void ExecReScanMergeAppend(MergeAppendState *node);
|
||||
|
||||
#endif /* NODEMERGEAPPEND_H */
|
||||
24
pg_include/executor/nodeMergejoin.h
Executable file
24
pg_include/executor/nodeMergejoin.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeMergejoin.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeMergejoin.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEMERGEJOIN_H
|
||||
#define NODEMERGEJOIN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern MergeJoinState *ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecMergeJoin(MergeJoinState *node);
|
||||
extern void ExecEndMergeJoin(MergeJoinState *node);
|
||||
extern void ExecReScanMergeJoin(MergeJoinState *node);
|
||||
|
||||
#endif /* NODEMERGEJOIN_H */
|
||||
23
pg_include/executor/nodeModifyTable.h
Executable file
23
pg_include/executor/nodeModifyTable.h
Executable file
@@ -0,0 +1,23 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeModifyTable.h
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeModifyTable.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEMODIFYTABLE_H
|
||||
#define NODEMODIFYTABLE_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern ModifyTableState *ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecModifyTable(ModifyTableState *node);
|
||||
extern void ExecEndModifyTable(ModifyTableState *node);
|
||||
extern void ExecReScanModifyTable(ModifyTableState *node);
|
||||
|
||||
#endif /* NODEMODIFYTABLE_H */
|
||||
24
pg_include/executor/nodeNestloop.h
Executable file
24
pg_include/executor/nodeNestloop.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeNestloop.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeNestloop.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODENESTLOOP_H
|
||||
#define NODENESTLOOP_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern NestLoopState *ExecInitNestLoop(NestLoop *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecNestLoop(NestLoopState *node);
|
||||
extern void ExecEndNestLoop(NestLoopState *node);
|
||||
extern void ExecReScanNestLoop(NestLoopState *node);
|
||||
|
||||
#endif /* NODENESTLOOP_H */
|
||||
24
pg_include/executor/nodeRecursiveunion.h
Executable file
24
pg_include/executor/nodeRecursiveunion.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeRecursiveunion.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeRecursiveunion.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODERECURSIVEUNION_H
|
||||
#define NODERECURSIVEUNION_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern RecursiveUnionState *ExecInitRecursiveUnion(RecursiveUnion *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecRecursiveUnion(RecursiveUnionState *node);
|
||||
extern void ExecEndRecursiveUnion(RecursiveUnionState *node);
|
||||
extern void ExecReScanRecursiveUnion(RecursiveUnionState *node);
|
||||
|
||||
#endif /* NODERECURSIVEUNION_H */
|
||||
26
pg_include/executor/nodeResult.h
Executable file
26
pg_include/executor/nodeResult.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeResult.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeResult.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODERESULT_H
|
||||
#define NODERESULT_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern ResultState *ExecInitResult(Result *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecResult(ResultState *node);
|
||||
extern void ExecEndResult(ResultState *node);
|
||||
extern void ExecResultMarkPos(ResultState *node);
|
||||
extern void ExecResultRestrPos(ResultState *node);
|
||||
extern void ExecReScanResult(ResultState *node);
|
||||
|
||||
#endif /* NODERESULT_H */
|
||||
26
pg_include/executor/nodeSeqscan.h
Executable file
26
pg_include/executor/nodeSeqscan.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeSeqscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeSeqscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODESEQSCAN_H
|
||||
#define NODESEQSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern SeqScanState *ExecInitSeqScan(SeqScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecSeqScan(SeqScanState *node);
|
||||
extern void ExecEndSeqScan(SeqScanState *node);
|
||||
extern void ExecSeqMarkPos(SeqScanState *node);
|
||||
extern void ExecSeqRestrPos(SeqScanState *node);
|
||||
extern void ExecReScanSeqScan(SeqScanState *node);
|
||||
|
||||
#endif /* NODESEQSCAN_H */
|
||||
24
pg_include/executor/nodeSetOp.h
Executable file
24
pg_include/executor/nodeSetOp.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeSetOp.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeSetOp.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODESETOP_H
|
||||
#define NODESETOP_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern SetOpState *ExecInitSetOp(SetOp *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecSetOp(SetOpState *node);
|
||||
extern void ExecEndSetOp(SetOpState *node);
|
||||
extern void ExecReScanSetOp(SetOpState *node);
|
||||
|
||||
#endif /* NODESETOP_H */
|
||||
26
pg_include/executor/nodeSort.h
Executable file
26
pg_include/executor/nodeSort.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeSort.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeSort.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODESORT_H
|
||||
#define NODESORT_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern SortState *ExecInitSort(Sort *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecSort(SortState *node);
|
||||
extern void ExecEndSort(SortState *node);
|
||||
extern void ExecSortMarkPos(SortState *node);
|
||||
extern void ExecSortRestrPos(SortState *node);
|
||||
extern void ExecReScanSort(SortState *node);
|
||||
|
||||
#endif /* NODESORT_H */
|
||||
27
pg_include/executor/nodeSubplan.h
Executable file
27
pg_include/executor/nodeSubplan.h
Executable file
@@ -0,0 +1,27 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeSubplan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeSubplan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODESUBPLAN_H
|
||||
#define NODESUBPLAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern SubPlanState *ExecInitSubPlan(SubPlan *subplan, PlanState *parent);
|
||||
|
||||
extern AlternativeSubPlanState *ExecInitAlternativeSubPlan(AlternativeSubPlan *asplan, PlanState *parent);
|
||||
|
||||
extern void ExecReScanSetParamPlan(SubPlanState *node, PlanState *parent);
|
||||
|
||||
extern void ExecSetParamPlan(SubPlanState *node, ExprContext *econtext);
|
||||
|
||||
#endif /* NODESUBPLAN_H */
|
||||
24
pg_include/executor/nodeSubqueryscan.h
Executable file
24
pg_include/executor/nodeSubqueryscan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeSubqueryscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeSubqueryscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODESUBQUERYSCAN_H
|
||||
#define NODESUBQUERYSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern SubqueryScanState *ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecSubqueryScan(SubqueryScanState *node);
|
||||
extern void ExecEndSubqueryScan(SubqueryScanState *node);
|
||||
extern void ExecReScanSubqueryScan(SubqueryScanState *node);
|
||||
|
||||
#endif /* NODESUBQUERYSCAN_H */
|
||||
26
pg_include/executor/nodeTidscan.h
Executable file
26
pg_include/executor/nodeTidscan.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeTidscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeTidscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODETIDSCAN_H
|
||||
#define NODETIDSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern TidScanState *ExecInitTidScan(TidScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecTidScan(TidScanState *node);
|
||||
extern void ExecEndTidScan(TidScanState *node);
|
||||
extern void ExecTidMarkPos(TidScanState *node);
|
||||
extern void ExecTidRestrPos(TidScanState *node);
|
||||
extern void ExecReScanTidScan(TidScanState *node);
|
||||
|
||||
#endif /* NODETIDSCAN_H */
|
||||
24
pg_include/executor/nodeUnique.h
Executable file
24
pg_include/executor/nodeUnique.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeUnique.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeUnique.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEUNIQUE_H
|
||||
#define NODEUNIQUE_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern UniqueState *ExecInitUnique(Unique *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecUnique(UniqueState *node);
|
||||
extern void ExecEndUnique(UniqueState *node);
|
||||
extern void ExecReScanUnique(UniqueState *node);
|
||||
|
||||
#endif /* NODEUNIQUE_H */
|
||||
26
pg_include/executor/nodeValuesscan.h
Executable file
26
pg_include/executor/nodeValuesscan.h
Executable file
@@ -0,0 +1,26 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeValuesscan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeValuesscan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEVALUESSCAN_H
|
||||
#define NODEVALUESSCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern ValuesScanState *ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecValuesScan(ValuesScanState *node);
|
||||
extern void ExecEndValuesScan(ValuesScanState *node);
|
||||
extern void ExecValuesMarkPos(ValuesScanState *node);
|
||||
extern void ExecValuesRestrPos(ValuesScanState *node);
|
||||
extern void ExecReScanValuesScan(ValuesScanState *node);
|
||||
|
||||
#endif /* NODEVALUESSCAN_H */
|
||||
24
pg_include/executor/nodeWindowAgg.h
Executable file
24
pg_include/executor/nodeWindowAgg.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeWindowAgg.h
|
||||
* prototypes for nodeWindowAgg.c
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeWindowAgg.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEWINDOWAGG_H
|
||||
#define NODEWINDOWAGG_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern WindowAggState *ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecWindowAgg(WindowAggState *node);
|
||||
extern void ExecEndWindowAgg(WindowAggState *node);
|
||||
extern void ExecReScanWindowAgg(WindowAggState *node);
|
||||
|
||||
#endif /* NODEWINDOWAGG_H */
|
||||
24
pg_include/executor/nodeWorktablescan.h
Executable file
24
pg_include/executor/nodeWorktablescan.h
Executable file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* nodeWorktablescan.h
|
||||
*
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/nodeWorktablescan.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef NODEWORKTABLESCAN_H
|
||||
#define NODEWORKTABLESCAN_H
|
||||
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern WorkTableScanState *ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags);
|
||||
extern TupleTableSlot *ExecWorkTableScan(WorkTableScanState *node);
|
||||
extern void ExecEndWorkTableScan(WorkTableScanState *node);
|
||||
extern void ExecReScanWorkTableScan(WorkTableScanState *node);
|
||||
|
||||
#endif /* NODEWORKTABLESCAN_H */
|
||||
146
pg_include/executor/spi.h
Executable file
146
pg_include/executor/spi.h
Executable file
@@ -0,0 +1,146 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* spi.h
|
||||
* Server Programming Interface public declarations
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/spi.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef SPI_H
|
||||
#define SPI_H
|
||||
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "utils/portal.h"
|
||||
|
||||
|
||||
typedef struct SPITupleTable
|
||||
{
|
||||
MemoryContext tuptabcxt; /* memory context of result table */
|
||||
uint32 alloced; /* # of alloced vals */
|
||||
uint32 free; /* # of free vals */
|
||||
TupleDesc tupdesc; /* tuple descriptor */
|
||||
HeapTuple *vals; /* tuples */
|
||||
} SPITupleTable;
|
||||
|
||||
/* Plans are opaque structs for standard users of SPI */
|
||||
typedef struct _SPI_plan *SPIPlanPtr;
|
||||
|
||||
#define SPI_ERROR_CONNECT (-1)
|
||||
#define SPI_ERROR_COPY (-2)
|
||||
#define SPI_ERROR_OPUNKNOWN (-3)
|
||||
#define SPI_ERROR_UNCONNECTED (-4)
|
||||
#define SPI_ERROR_CURSOR (-5) /* not used anymore */
|
||||
#define SPI_ERROR_ARGUMENT (-6)
|
||||
#define SPI_ERROR_PARAM (-7)
|
||||
#define SPI_ERROR_TRANSACTION (-8)
|
||||
#define SPI_ERROR_NOATTRIBUTE (-9)
|
||||
#define SPI_ERROR_NOOUTFUNC (-10)
|
||||
#define SPI_ERROR_TYPUNKNOWN (-11)
|
||||
|
||||
#define SPI_OK_CONNECT 1
|
||||
#define SPI_OK_FINISH 2
|
||||
#define SPI_OK_FETCH 3
|
||||
#define SPI_OK_UTILITY 4
|
||||
#define SPI_OK_SELECT 5
|
||||
#define SPI_OK_SELINTO 6
|
||||
#define SPI_OK_INSERT 7
|
||||
#define SPI_OK_DELETE 8
|
||||
#define SPI_OK_UPDATE 9
|
||||
#define SPI_OK_CURSOR 10
|
||||
#define SPI_OK_INSERT_RETURNING 11
|
||||
#define SPI_OK_DELETE_RETURNING 12
|
||||
#define SPI_OK_UPDATE_RETURNING 13
|
||||
#define SPI_OK_REWRITTEN 14
|
||||
|
||||
extern PGDLLIMPORT uint32 SPI_processed;
|
||||
extern PGDLLIMPORT Oid SPI_lastoid;
|
||||
extern PGDLLIMPORT SPITupleTable *SPI_tuptable;
|
||||
extern PGDLLIMPORT int SPI_result;
|
||||
|
||||
extern int SPI_connect(void);
|
||||
extern int SPI_finish(void);
|
||||
extern void SPI_push(void);
|
||||
extern void SPI_pop(void);
|
||||
extern bool SPI_push_conditional(void);
|
||||
extern void SPI_pop_conditional(bool pushed);
|
||||
extern void SPI_restore_connection(void);
|
||||
extern int SPI_execute(const char *src, bool read_only, long tcount);
|
||||
extern int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,
|
||||
bool read_only, long tcount);
|
||||
extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan,
|
||||
ParamListInfo params,
|
||||
bool read_only, long tcount);
|
||||
extern int SPI_exec(const char *src, long tcount);
|
||||
extern int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls,
|
||||
long tcount);
|
||||
extern int SPI_execute_snapshot(SPIPlanPtr plan,
|
||||
Datum *Values, const char *Nulls,
|
||||
Snapshot snapshot,
|
||||
Snapshot crosscheck_snapshot,
|
||||
bool read_only, bool fire_triggers, long tcount);
|
||||
extern int SPI_execute_with_args(const char *src,
|
||||
int nargs, Oid *argtypes,
|
||||
Datum *Values, const char *Nulls,
|
||||
bool read_only, long tcount);
|
||||
extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);
|
||||
extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,
|
||||
int cursorOptions);
|
||||
extern SPIPlanPtr SPI_prepare_params(const char *src,
|
||||
ParserSetupHook parserSetup,
|
||||
void *parserSetupArg,
|
||||
int cursorOptions);
|
||||
extern int SPI_keepplan(SPIPlanPtr plan);
|
||||
extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan);
|
||||
extern int SPI_freeplan(SPIPlanPtr plan);
|
||||
|
||||
extern Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex);
|
||||
extern int SPI_getargcount(SPIPlanPtr plan);
|
||||
extern bool SPI_is_cursor_plan(SPIPlanPtr plan);
|
||||
extern bool SPI_plan_is_valid(SPIPlanPtr plan);
|
||||
extern const char *SPI_result_code_string(int code);
|
||||
|
||||
extern List *SPI_plan_get_plan_sources(SPIPlanPtr plan);
|
||||
extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan);
|
||||
|
||||
extern HeapTuple SPI_copytuple(HeapTuple tuple);
|
||||
extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc);
|
||||
extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,
|
||||
int *attnum, Datum *Values, const char *Nulls);
|
||||
extern int SPI_fnumber(TupleDesc tupdesc, const char *fname);
|
||||
extern char *SPI_fname(TupleDesc tupdesc, int fnumber);
|
||||
extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);
|
||||
extern Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull);
|
||||
extern char *SPI_gettype(TupleDesc tupdesc, int fnumber);
|
||||
extern Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber);
|
||||
extern char *SPI_getrelname(Relation rel);
|
||||
extern char *SPI_getnspname(Relation rel);
|
||||
extern void *SPI_palloc(Size size);
|
||||
extern void *SPI_repalloc(void *pointer, Size size);
|
||||
extern void SPI_pfree(void *pointer);
|
||||
extern void SPI_freetuple(HeapTuple pointer);
|
||||
extern void SPI_freetuptable(SPITupleTable *tuptable);
|
||||
|
||||
extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,
|
||||
Datum *Values, const char *Nulls, bool read_only);
|
||||
extern Portal SPI_cursor_open_with_args(const char *name,
|
||||
const char *src,
|
||||
int nargs, Oid *argtypes,
|
||||
Datum *Values, const char *Nulls,
|
||||
bool read_only, int cursorOptions);
|
||||
extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan,
|
||||
ParamListInfo params, bool read_only);
|
||||
extern Portal SPI_cursor_find(const char *name);
|
||||
extern void SPI_cursor_fetch(Portal portal, bool forward, long count);
|
||||
extern void SPI_cursor_move(Portal portal, bool forward, long count);
|
||||
extern void SPI_scroll_cursor_fetch(Portal, FetchDirection direction, long count);
|
||||
extern void SPI_scroll_cursor_move(Portal, FetchDirection direction, long count);
|
||||
extern void SPI_cursor_close(Portal portal);
|
||||
|
||||
extern void AtEOXact_SPI(bool isCommit);
|
||||
extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid);
|
||||
|
||||
#endif /* SPI_H */
|
||||
87
pg_include/executor/spi_priv.h
Executable file
87
pg_include/executor/spi_priv.h
Executable file
@@ -0,0 +1,87 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* spi_priv.h
|
||||
* Server Programming Interface private declarations
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/spi_priv.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef SPI_PRIV_H
|
||||
#define SPI_PRIV_H
|
||||
|
||||
#include "executor/spi.h"
|
||||
|
||||
|
||||
#define _SPI_PLAN_MAGIC 569278163
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* current results */
|
||||
uint32 processed; /* by Executor */
|
||||
Oid lastoid;
|
||||
SPITupleTable *tuptable;
|
||||
|
||||
MemoryContext procCxt; /* procedure context */
|
||||
MemoryContext execCxt; /* executor context */
|
||||
MemoryContext savedcxt; /* context of SPI_connect's caller */
|
||||
SubTransactionId connectSubid; /* ID of connecting subtransaction */
|
||||
} _SPI_connection;
|
||||
|
||||
/*
|
||||
* SPI plans have three states: saved, unsaved, or temporary.
|
||||
*
|
||||
* Ordinarily, the _SPI_plan struct itself as well as the argtypes array
|
||||
* are in a dedicated memory context identified by plancxt (which can be
|
||||
* really small). All the other subsidiary state is in plancache entries
|
||||
* identified by plancache_list (note: the list cells themselves are in
|
||||
* plancxt).
|
||||
*
|
||||
* In an unsaved plan, the plancxt as well as the plancache entries' contexts
|
||||
* are children of the SPI procedure context, so they'll all disappear at
|
||||
* function exit. plancache.c also knows that the plancache entries are
|
||||
* "unsaved", so it doesn't link them into its global list; hence they do
|
||||
* not respond to inval events. This is OK since we are presumably holding
|
||||
* adequate locks to prevent other backends from messing with the tables.
|
||||
*
|
||||
* For a saved plan, the plancxt is made a child of CacheMemoryContext
|
||||
* since it should persist until explicitly destroyed. Likewise, the
|
||||
* plancache entries will be under CacheMemoryContext since we tell
|
||||
* plancache.c to save them. We rely on plancache.c to keep the cache
|
||||
* entries up-to-date as needed in the face of invalidation events.
|
||||
*
|
||||
* There are also "temporary" SPI plans, in which the _SPI_plan struct is
|
||||
* not even palloc'd but just exists in some function's local variable.
|
||||
* The plancache entries are unsaved and exist under the SPI executor context,
|
||||
* while additional data such as argtypes and list cells is loose in the SPI
|
||||
* executor context. Such plans can be identified by having plancxt == NULL.
|
||||
*
|
||||
* We can also have "one-shot" SPI plans (which are typically temporary,
|
||||
* as described above). These are meant to be executed once and discarded,
|
||||
* and various optimizations are made on the assumption of single use.
|
||||
* Note in particular that the CachedPlanSources within such an SPI plan
|
||||
* are not "complete" until execution.
|
||||
*
|
||||
* Note: if the original query string contained only whitespace and comments,
|
||||
* the plancache_list will be NIL and so there is no place to store the
|
||||
* query string. We don't care about that, but we do care about the
|
||||
* argument type array, which is why it's seemingly-redundantly stored.
|
||||
*/
|
||||
typedef struct _SPI_plan
|
||||
{
|
||||
int magic; /* should equal _SPI_PLAN_MAGIC */
|
||||
bool saved; /* saved or unsaved plan? */
|
||||
bool oneshot; /* one-shot plan? */
|
||||
List *plancache_list; /* one CachedPlanSource per parsetree */
|
||||
MemoryContext plancxt; /* Context containing _SPI_plan and data */
|
||||
int cursor_options; /* Cursor options used for planning */
|
||||
int nargs; /* number of plan arguments */
|
||||
Oid *argtypes; /* Argument types (NULL if nargs is 0) */
|
||||
ParserSetupHook parserSetup; /* alternative parameter spec method */
|
||||
void *parserSetupArg;
|
||||
} _SPI_plan;
|
||||
|
||||
#endif /* SPI_PRIV_H */
|
||||
29
pg_include/executor/tstoreReceiver.h
Executable file
29
pg_include/executor/tstoreReceiver.h
Executable file
@@ -0,0 +1,29 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* tstoreReceiver.h
|
||||
* prototypes for tstoreReceiver.c
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/tstoreReceiver.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef TSTORE_RECEIVER_H
|
||||
#define TSTORE_RECEIVER_H
|
||||
|
||||
#include "tcop/dest.h"
|
||||
#include "utils/tuplestore.h"
|
||||
|
||||
|
||||
extern DestReceiver *CreateTuplestoreDestReceiver(void);
|
||||
|
||||
extern void SetTuplestoreDestReceiverParams(DestReceiver *self,
|
||||
Tuplestorestate *tStore,
|
||||
MemoryContext tContext,
|
||||
bool detoast);
|
||||
|
||||
#endif /* TSTORE_RECEIVER_H */
|
||||
172
pg_include/executor/tuptable.h
Executable file
172
pg_include/executor/tuptable.h
Executable file
@@ -0,0 +1,172 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* tuptable.h
|
||||
* tuple table support stuff
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/executor/tuptable.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef TUPTABLE_H
|
||||
#define TUPTABLE_H
|
||||
|
||||
#include "access/htup.h"
|
||||
#include "storage/buf.h"
|
||||
|
||||
/*----------
|
||||
* The executor stores tuples in a "tuple table" which is a List of
|
||||
* independent TupleTableSlots. There are several cases we need to handle:
|
||||
* 1. physical tuple in a disk buffer page
|
||||
* 2. physical tuple constructed in palloc'ed memory
|
||||
* 3. "minimal" physical tuple constructed in palloc'ed memory
|
||||
* 4. "virtual" tuple consisting of Datum/isnull arrays
|
||||
*
|
||||
* The first two cases are similar in that they both deal with "materialized"
|
||||
* tuples, but resource management is different. For a tuple in a disk page
|
||||
* we need to hold a pin on the buffer until the TupleTableSlot's reference
|
||||
* to the tuple is dropped; while for a palloc'd tuple we usually want the
|
||||
* tuple pfree'd when the TupleTableSlot's reference is dropped.
|
||||
*
|
||||
* A "minimal" tuple is handled similarly to a palloc'd regular tuple.
|
||||
* At present, minimal tuples never are stored in buffers, so there is no
|
||||
* parallel to case 1. Note that a minimal tuple has no "system columns".
|
||||
* (Actually, it could have an OID, but we have no need to access the OID.)
|
||||
*
|
||||
* A "virtual" tuple is an optimization used to minimize physical data
|
||||
* copying in a nest of plan nodes. Any pass-by-reference Datums in the
|
||||
* tuple point to storage that is not directly associated with the
|
||||
* TupleTableSlot; generally they will point to part of a tuple stored in
|
||||
* a lower plan node's output TupleTableSlot, or to a function result
|
||||
* constructed in a plan node's per-tuple econtext. It is the responsibility
|
||||
* of the generating plan node to be sure these resources are not released
|
||||
* for as long as the virtual tuple needs to be valid. We only use virtual
|
||||
* tuples in the result slots of plan nodes --- tuples to be copied anywhere
|
||||
* else need to be "materialized" into physical tuples. Note also that a
|
||||
* virtual tuple does not have any "system columns".
|
||||
*
|
||||
* It is also possible for a TupleTableSlot to hold both physical and minimal
|
||||
* copies of a tuple. This is done when the slot is requested to provide
|
||||
* the format other than the one it currently holds. (Originally we attempted
|
||||
* to handle such requests by replacing one format with the other, but that
|
||||
* had the fatal defect of invalidating any pass-by-reference Datums pointing
|
||||
* into the existing slot contents.) Both copies must contain identical data
|
||||
* payloads when this is the case.
|
||||
*
|
||||
* The Datum/isnull arrays of a TupleTableSlot serve double duty. When the
|
||||
* slot contains a virtual tuple, they are the authoritative data. When the
|
||||
* slot contains a physical tuple, the arrays contain data extracted from
|
||||
* the tuple. (In this state, any pass-by-reference Datums point into
|
||||
* the physical tuple.) The extracted information is built "lazily",
|
||||
* ie, only as needed. This serves to avoid repeated extraction of data
|
||||
* from the physical tuple.
|
||||
*
|
||||
* A TupleTableSlot can also be "empty", holding no valid data. This is
|
||||
* the only valid state for a freshly-created slot that has not yet had a
|
||||
* tuple descriptor assigned to it. In this state, tts_isempty must be
|
||||
* TRUE, tts_shouldFree FALSE, tts_tuple NULL, tts_buffer InvalidBuffer,
|
||||
* and tts_nvalid zero.
|
||||
*
|
||||
* The tupleDescriptor is simply referenced, not copied, by the TupleTableSlot
|
||||
* code. The caller of ExecSetSlotDescriptor() is responsible for providing
|
||||
* a descriptor that will live as long as the slot does. (Typically, both
|
||||
* slots and descriptors are in per-query memory and are freed by memory
|
||||
* context deallocation at query end; so it's not worth providing any extra
|
||||
* mechanism to do more. However, the slot will increment the tupdesc
|
||||
* reference count if a reference-counted tupdesc is supplied.)
|
||||
*
|
||||
* When tts_shouldFree is true, the physical tuple is "owned" by the slot
|
||||
* and should be freed when the slot's reference to the tuple is dropped.
|
||||
*
|
||||
* If tts_buffer is not InvalidBuffer, then the slot is holding a pin
|
||||
* on the indicated buffer page; drop the pin when we release the
|
||||
* slot's reference to that buffer. (tts_shouldFree should always be
|
||||
* false in such a case, since presumably tts_tuple is pointing at the
|
||||
* buffer page.)
|
||||
*
|
||||
* tts_nvalid indicates the number of valid columns in the tts_values/isnull
|
||||
* arrays. When the slot is holding a "virtual" tuple this must be equal
|
||||
* to the descriptor's natts. When the slot is holding a physical tuple
|
||||
* this is equal to the number of columns we have extracted (we always
|
||||
* extract columns from left to right, so there are no holes).
|
||||
*
|
||||
* tts_values/tts_isnull are allocated when a descriptor is assigned to the
|
||||
* slot; they are of length equal to the descriptor's natts.
|
||||
*
|
||||
* tts_mintuple must always be NULL if the slot does not hold a "minimal"
|
||||
* tuple. When it does, tts_mintuple points to the actual MinimalTupleData
|
||||
* object (the thing to be pfree'd if tts_shouldFreeMin is true). If the slot
|
||||
* has only a minimal and not also a regular physical tuple, then tts_tuple
|
||||
* points at tts_minhdr and the fields of that struct are set correctly
|
||||
* for access to the minimal tuple; in particular, tts_minhdr.t_data points
|
||||
* MINIMAL_TUPLE_OFFSET bytes before tts_mintuple. This allows column
|
||||
* extraction to treat the case identically to regular physical tuples.
|
||||
*
|
||||
* tts_slow/tts_off are saved state for slot_deform_tuple, and should not
|
||||
* be touched by any other code.
|
||||
*----------
|
||||
*/
|
||||
typedef struct TupleTableSlot
|
||||
{
|
||||
NodeTag type;
|
||||
bool tts_isempty; /* true = slot is empty */
|
||||
bool tts_shouldFree; /* should pfree tts_tuple? */
|
||||
bool tts_shouldFreeMin; /* should pfree tts_mintuple? */
|
||||
bool tts_slow; /* saved state for slot_deform_tuple */
|
||||
HeapTuple tts_tuple; /* physical tuple, or NULL if virtual */
|
||||
TupleDesc tts_tupleDescriptor; /* slot's tuple descriptor */
|
||||
MemoryContext tts_mcxt; /* slot itself is in this context */
|
||||
Buffer tts_buffer; /* tuple's buffer, or InvalidBuffer */
|
||||
int tts_nvalid; /* # of valid values in tts_values */
|
||||
Datum *tts_values; /* current per-attribute values */
|
||||
bool *tts_isnull; /* current per-attribute isnull flags */
|
||||
MinimalTuple tts_mintuple; /* minimal tuple, or NULL if none */
|
||||
HeapTupleData tts_minhdr; /* workspace for minimal-tuple-only case */
|
||||
long tts_off; /* saved state for slot_deform_tuple */
|
||||
} TupleTableSlot;
|
||||
|
||||
#define TTS_HAS_PHYSICAL_TUPLE(slot) \
|
||||
((slot)->tts_tuple != NULL && (slot)->tts_tuple != &((slot)->tts_minhdr))
|
||||
|
||||
/*
|
||||
* TupIsNull -- is a TupleTableSlot empty?
|
||||
*/
|
||||
#define TupIsNull(slot) \
|
||||
((slot) == NULL || (slot)->tts_isempty)
|
||||
|
||||
/* in executor/execTuples.c */
|
||||
extern TupleTableSlot *MakeTupleTableSlot(void);
|
||||
extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable);
|
||||
extern void ExecResetTupleTable(List *tupleTable, bool shouldFree);
|
||||
extern TupleTableSlot *MakeSingleTupleTableSlot(TupleDesc tupdesc);
|
||||
extern void ExecDropSingleTupleTableSlot(TupleTableSlot *slot);
|
||||
extern void ExecSetSlotDescriptor(TupleTableSlot *slot, TupleDesc tupdesc);
|
||||
extern TupleTableSlot *ExecStoreTuple(HeapTuple tuple,
|
||||
TupleTableSlot *slot,
|
||||
Buffer buffer,
|
||||
bool shouldFree);
|
||||
extern TupleTableSlot *ExecStoreMinimalTuple(MinimalTuple mtup,
|
||||
TupleTableSlot *slot,
|
||||
bool shouldFree);
|
||||
extern TupleTableSlot *ExecClearTuple(TupleTableSlot *slot);
|
||||
extern TupleTableSlot *ExecStoreVirtualTuple(TupleTableSlot *slot);
|
||||
extern TupleTableSlot *ExecStoreAllNullTuple(TupleTableSlot *slot);
|
||||
extern HeapTuple ExecCopySlotTuple(TupleTableSlot *slot);
|
||||
extern MinimalTuple ExecCopySlotMinimalTuple(TupleTableSlot *slot);
|
||||
extern HeapTuple ExecFetchSlotTuple(TupleTableSlot *slot);
|
||||
extern MinimalTuple ExecFetchSlotMinimalTuple(TupleTableSlot *slot);
|
||||
extern Datum ExecFetchSlotTupleDatum(TupleTableSlot *slot);
|
||||
extern HeapTuple ExecMaterializeSlot(TupleTableSlot *slot);
|
||||
extern TupleTableSlot *ExecCopySlot(TupleTableSlot *dstslot,
|
||||
TupleTableSlot *srcslot);
|
||||
|
||||
/* in access/common/heaptuple.c */
|
||||
extern Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull);
|
||||
extern void slot_getallattrs(TupleTableSlot *slot);
|
||||
extern void slot_getsomeattrs(TupleTableSlot *slot, int attnum);
|
||||
extern bool slot_attisnull(TupleTableSlot *slot, int attnum);
|
||||
|
||||
#endif /* TUPTABLE_H */
|
||||
Reference in New Issue
Block a user