*
* fdwapi.h
* API for foreign-data wrappers
*
* Copyright (c) 2010-2012, PostgreSQL Global Development Group
*
* src/include/foreign/fdwapi.h
*
* -------------------------------------------------------------------------
*/
#ifndef FDWAPI_H
#define FDWAPI_H
#include "nodes/execnodes.h"
#include "nodes/relation.h"
#include "vecexecutor/vectorbatch.h"
#include "vecexecutor/vecnodes.h"
#include "pgstat.h"
struct ExplainState;
* Callback function signatures --- see fdwhandler.sgml for more info.
*/
typedef void (*GetForeignRelSize_function)(PlannerInfo* root, RelOptInfo* baserel, Oid foreigntableid);
typedef void (*GetForeignPaths_function)(PlannerInfo* root, RelOptInfo* baserel, Oid foreigntableid);
typedef ForeignScan* (*GetForeignPlan_function)(PlannerInfo* root, RelOptInfo* baserel, Oid foreigntableid,
ForeignPath* best_path, List* tlist, List* scan_clauses, Plan *outer_plan);
typedef void (*BeginForeignScan_function)(ForeignScanState* node, int eflags);
typedef TupleTableSlot* (*IterateForeignScan_function)(ForeignScanState* node);
typedef void (*ReScanForeignScan_function)(ForeignScanState* node);
typedef void (*EndForeignScan_function)(ForeignScanState* node);
typedef void (*GetForeignJoinPaths_function)(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel,
RelOptInfo *innerrel, JoinType jointype, SpecialJoinInfo* sjinfo, List* restrictlist);
typedef void (*GetForeignUpperPaths_function)(FDWUpperRelCxt* ufdwCxt, UpperRelationKind stage, Plan* mainPlan);
typedef void (*AddForeignUpdateTargets_function)(Query* parsetree, RangeTblEntry* target_rte, Relation target_relation);
typedef List* (*PlanForeignModify_function)(
PlannerInfo* root, ModifyTable* plan, Index resultRelation, int subplan_index);
typedef void (*BeginForeignModify_function)(
ModifyTableState* mtstate, ResultRelInfo* rinfo, List* fdw_private, int subplan_index, int eflags);
typedef TupleTableSlot* (*ExecForeignInsert_function)(
EState* estate, ResultRelInfo* rinfo, TupleTableSlot* slot, TupleTableSlot* planSlot);
typedef TupleTableSlot* (*ExecForeignUpdate_function)(
EState* estate, ResultRelInfo* rinfo, TupleTableSlot* slot, TupleTableSlot* planSlot);
typedef TupleTableSlot* (*ExecForeignDelete_function)(
EState* estate, ResultRelInfo* rinfo, TupleTableSlot* slot, TupleTableSlot* planSlot);
typedef void (*EndForeignModify_function)(EState* estate, ResultRelInfo* rinfo);
typedef int (*IsForeignRelUpdatable_function)(Relation rel);
typedef void (*ExplainForeignScan_function)(ForeignScanState* node, struct ExplainState* es);
typedef void (*ExplainForeignScanRemote_function)(ForeignScanState* node, struct ExplainState* es);
typedef void (*ExplainForeignModify_function)(
ModifyTableState* mtstate, ResultRelInfo* rinfo, List* fdw_private, int subplan_index, struct ExplainState* es);
typedef int (*AcquireSampleRowsFunc)(Relation relation,
int elevel,
HeapTuple* rows,
int targrows,
double* totalrows,
double* totaldeadrows,
void* additionalData,
bool estimate_table_rownum);
typedef bool (*AnalyzeForeignTable_function)(Relation relation,
AcquireSampleRowsFunc* func,
BlockNumber* totalpages,
void* additionalData,
bool estimate_table_rownum);
typedef VectorBatch* (*VecIterateForeignScan_function)(VecForeignScanState* node);
* @hdfs
*
* GetFdwType_function
* This function is used to return the type of FDW.
* Return value "hdfs_orc" for hdfs orc file.
*/
typedef int (*GetFdwType_function)();
typedef void (*ValidateTableDef_function)(Node* Obj);
typedef void (*TruncateForeignTable_function)(TruncateStmt* stmt, Relation rel);
typedef void (*VacuumForeignTable_function)(VacuumStmt* stmt, Relation rel);
typedef uint64_t (*GetForeignRelationMemSize_function)(Oid reloid, Oid ixoid);
typedef MotMemoryDetail* (*GetForeignMemSize_function)(uint32* nodeCount, bool isGlobal);
typedef MotSessionMemoryDetail* (*GetForeignSessionMemSize_function)(uint32* sessionCount);
typedef void (*NotifyForeignConfigChange_function)();
typedef enum {
HDFS_DROP_PARTITIONED_FOREIGNTBL,
HDFS_CREATE_PARTITIONED_FOREIGNTBL,
HDFS_ALTER_PARTITIONED_FOREIGNTBL
} HDFS_PARTTBL_OPERATOR;
typedef void (*PartitionTblProcess_function)(Node* Obj, Oid relid, HDFS_PARTTBL_OPERATOR op);
typedef enum {
HDFS_BLOOM_FILTER
} HDFS_RUNTIME_PREDICATE;
typedef void (*BuildRuntimePredicate_function)(
ForeignScanState* node, void* value, int colIdx, HDFS_RUNTIME_PREDICATE type);
* FdwRoutine is the struct returned by a foreign-data wrapper's handler
* function. It provides pointers to the callback functions needed by the
* planner and executor.
*
* More function pointers are likely to be added in the future. Therefore
* it's recommended that the handler initialize the struct with
* makeNode(FdwRoutine) so that all fields are set to NULL. This will
* ensure that no fields are accidentally left undefined.
*/
typedef struct FdwRoutine {
NodeTag type;
GetForeignRelSize_function GetForeignRelSize;
GetForeignPaths_function GetForeignPaths;
GetForeignPlan_function GetForeignPlan;
BeginForeignScan_function BeginForeignScan;
IterateForeignScan_function IterateForeignScan;
ReScanForeignScan_function ReScanForeignScan;
EndForeignScan_function EndForeignScan;
* These functions are optional. Set the pointer to NULL for any that are
* not provided.
*/
GetForeignJoinPaths_function GetForeignJoinPaths;
GetForeignUpperPaths_function GetForeignUpperPaths;
AddForeignUpdateTargets_function AddForeignUpdateTargets;
PlanForeignModify_function PlanForeignModify;
BeginForeignModify_function BeginForeignModify;
ExecForeignInsert_function ExecForeignInsert;
ExecForeignUpdate_function ExecForeignUpdate;
ExecForeignDelete_function ExecForeignDelete;
EndForeignModify_function EndForeignModify;
IsForeignRelUpdatable_function IsForeignRelUpdatable;
ExplainForeignScan_function ExplainForeignScan;
ExplainForeignModify_function ExplainForeignModify;
ExplainForeignScanRemote_function ExplainForeignScanRemote;
AnalyzeForeignTable_function AnalyzeForeignTable;
AcquireSampleRowsFunc AcquireSampleRows;
VecIterateForeignScan_function VecIterateForeignScan;
GetFdwType_function GetFdwType;
ValidateTableDef_function ValidateTableDef;
* Partition foreign table process: create/drop
*/
PartitionTblProcess_function PartitionTblProcess;
BuildRuntimePredicate_function BuildRuntimePredicate;
TruncateForeignTable_function TruncateForeignTable;
VacuumForeignTable_function VacuumForeignTable;
GetForeignRelationMemSize_function GetForeignRelationMemSize;
GetForeignMemSize_function GetForeignMemSize;
GetForeignSessionMemSize_function GetForeignSessionMemSize;
NotifyForeignConfigChange_function NotifyForeignConfigChange;
} FdwRoutine;
extern FdwRoutine* GetFdwRoutine(Oid fdwhandler);
extern FdwRoutine* GetFdwRoutineByRelId(Oid relid, bool missHandlerOk = false);
extern FdwRoutine* GetFdwRoutineByServerId(Oid serverid);
extern FdwRoutine* GetFdwRoutineForRelation(Relation relation, bool makecopy);
extern Oid GetForeignServerIdByRelId(Oid relid);
#endif