mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
Provide a function hook to let plug-ins get control around ExecutorRun.
ITAGAKI Takahiro
This commit is contained in:
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.309 2008/05/12 20:02:00 alvherre Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.310 2008/07/18 18:23:46 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -58,6 +58,9 @@
|
|||||||
#include "utils/tqual.h"
|
#include "utils/tqual.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Hook for plugins to get control in ExecutorRun() */
|
||||||
|
ExecutorRun_hook_type ExecutorRun_hook = NULL;
|
||||||
|
|
||||||
typedef struct evalPlanQual
|
typedef struct evalPlanQual
|
||||||
{
|
{
|
||||||
Index rti;
|
Index rti;
|
||||||
@ -214,11 +217,28 @@ ExecutorStart(QueryDesc *queryDesc, int eflags)
|
|||||||
* Note: count = 0 is interpreted as no portal limit, i.e., run to
|
* Note: count = 0 is interpreted as no portal limit, i.e., run to
|
||||||
* completion.
|
* completion.
|
||||||
*
|
*
|
||||||
|
* We provide a function hook variable that lets loadable plugins
|
||||||
|
* get control when ExecutorRun is called. Such a plugin would
|
||||||
|
* normally call standard_ExecutorRun().
|
||||||
|
*
|
||||||
* ----------------------------------------------------------------
|
* ----------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
TupleTableSlot *
|
TupleTableSlot *
|
||||||
ExecutorRun(QueryDesc *queryDesc,
|
ExecutorRun(QueryDesc *queryDesc,
|
||||||
ScanDirection direction, long count)
|
ScanDirection direction, long count)
|
||||||
|
{
|
||||||
|
TupleTableSlot *result;
|
||||||
|
|
||||||
|
if (ExecutorRun_hook)
|
||||||
|
result = (*ExecutorRun_hook) (queryDesc, direction, count);
|
||||||
|
else
|
||||||
|
result = standard_ExecutorRun(queryDesc, direction, count);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
TupleTableSlot *
|
||||||
|
standard_ExecutorRun(QueryDesc *queryDesc,
|
||||||
|
ScanDirection direction, long count)
|
||||||
{
|
{
|
||||||
EState *estate;
|
EState *estate;
|
||||||
CmdType operation;
|
CmdType operation;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.147 2008/03/28 00:21:56 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.148 2008/07/18 18:23:47 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -60,6 +60,13 @@
|
|||||||
((*(expr)->evalfunc) (expr, econtext, isNull, isDone))
|
((*(expr)->evalfunc) (expr, econtext, isNull, isDone))
|
||||||
|
|
||||||
|
|
||||||
|
/* Hook for plugins to get control in ExecutorRun() */
|
||||||
|
typedef TupleTableSlot *(*ExecutorRun_hook_type) (QueryDesc *queryDesc,
|
||||||
|
ScanDirection direction,
|
||||||
|
long count);
|
||||||
|
extern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* prototypes from functions in execAmi.c
|
* prototypes from functions in execAmi.c
|
||||||
*/
|
*/
|
||||||
@ -136,6 +143,8 @@ extern HeapTuple ExecRemoveJunk(JunkFilter *junkfilter, TupleTableSlot *slot);
|
|||||||
extern void ExecutorStart(QueryDesc *queryDesc, int eflags);
|
extern void ExecutorStart(QueryDesc *queryDesc, int eflags);
|
||||||
extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc,
|
extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc,
|
||||||
ScanDirection direction, long count);
|
ScanDirection direction, long count);
|
||||||
|
extern TupleTableSlot *standard_ExecutorRun(QueryDesc *queryDesc,
|
||||||
|
ScanDirection direction, long count);
|
||||||
extern void ExecutorEnd(QueryDesc *queryDesc);
|
extern void ExecutorEnd(QueryDesc *queryDesc);
|
||||||
extern void ExecutorRewind(QueryDesc *queryDesc);
|
extern void ExecutorRewind(QueryDesc *queryDesc);
|
||||||
extern void InitResultRelInfo(ResultRelInfo *resultRelInfo,
|
extern void InitResultRelInfo(ResultRelInfo *resultRelInfo,
|
||||||
|
Reference in New Issue
Block a user