#include "utils/tqual.h"
+/* Hook for plugins to get control in ExecutorRun() */
+ExecutorRun_hook_type ExecutorRun_hook = NULL;
+
typedef struct evalPlanQual
{
Index rti;
* Note: count = 0 is interpreted as no portal limit, i.e., run to
* 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 *
ExecutorRun(QueryDesc *queryDesc,
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;
CmdType operation;
((*(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
*/
extern void ExecutorStart(QueryDesc *queryDesc, int eflags);
extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, long count);
+extern TupleTableSlot *standard_ExecutorRun(QueryDesc *queryDesc,
+ ScanDirection direction, long count);
extern void ExecutorEnd(QueryDesc *queryDesc);
extern void ExecutorRewind(QueryDesc *queryDesc);
extern void InitResultRelInfo(ResultRelInfo *resultRelInfo,