123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- /*-------------------------------------------------------------------------
- *
- * fdwapi.h
- * API for foreign-data wrappers
- *
- * Copyright (c) 2010-2022, PostgreSQL Global Development Group
- *
- * src/include/foreign/fdwapi.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef FDWAPI_H
- #define FDWAPI_H
- #include "access/parallel.h"
- #include "nodes/execnodes.h"
- #include "nodes/pathnodes.h"
- /* To avoid including explain.h here, reference ExplainState thus: */
- 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 bool (*RecheckForeignScan_function) (ForeignScanState *node,
- TupleTableSlot *slot);
- 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,
- JoinPathExtraData *extra);
- typedef void (*GetForeignUpperPaths_function) (PlannerInfo *root,
- UpperRelationKind stage,
- RelOptInfo *input_rel,
- RelOptInfo *output_rel,
- void *extra);
- typedef void (*AddForeignUpdateTargets_function) (PlannerInfo *root,
- Index rtindex,
- 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 **(*ExecForeignBatchInsert_function) (EState *estate,
- ResultRelInfo *rinfo,
- TupleTableSlot **slots,
- TupleTableSlot **planSlots,
- int *numSlots);
- typedef int (*GetForeignModifyBatchSize_function) (ResultRelInfo *rinfo);
- 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 void (*BeginForeignInsert_function) (ModifyTableState *mtstate,
- ResultRelInfo *rinfo);
- typedef void (*EndForeignInsert_function) (EState *estate,
- ResultRelInfo *rinfo);
- typedef int (*IsForeignRelUpdatable_function) (Relation rel);
- typedef bool (*PlanDirectModify_function) (PlannerInfo *root,
- ModifyTable *plan,
- Index resultRelation,
- int subplan_index);
- typedef void (*BeginDirectModify_function) (ForeignScanState *node,
- int eflags);
- typedef TupleTableSlot *(*IterateDirectModify_function) (ForeignScanState *node);
- typedef void (*EndDirectModify_function) (ForeignScanState *node);
- typedef RowMarkType (*GetForeignRowMarkType_function) (RangeTblEntry *rte,
- LockClauseStrength strength);
- typedef void (*RefetchForeignRow_function) (EState *estate,
- ExecRowMark *erm,
- Datum rowid,
- TupleTableSlot *slot,
- bool *updated);
- typedef void (*ExplainForeignScan_function) (ForeignScanState *node,
- struct ExplainState *es);
- typedef void (*ExplainForeignModify_function) (ModifyTableState *mtstate,
- ResultRelInfo *rinfo,
- List *fdw_private,
- int subplan_index,
- struct ExplainState *es);
- typedef void (*ExplainDirectModify_function) (ForeignScanState *node,
- struct ExplainState *es);
- typedef int (*AcquireSampleRowsFunc) (Relation relation, int elevel,
- HeapTuple *rows, int targrows,
- double *totalrows,
- double *totaldeadrows);
- typedef bool (*AnalyzeForeignTable_function) (Relation relation,
- AcquireSampleRowsFunc *func,
- BlockNumber *totalpages);
- typedef List *(*ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt,
- Oid serverOid);
- typedef void (*ExecForeignTruncate_function) (List *rels,
- DropBehavior behavior,
- bool restart_seqs);
- typedef Size (*EstimateDSMForeignScan_function) (ForeignScanState *node,
- ParallelContext *pcxt);
- typedef void (*InitializeDSMForeignScan_function) (ForeignScanState *node,
- ParallelContext *pcxt,
- void *coordinate);
- typedef void (*ReInitializeDSMForeignScan_function) (ForeignScanState *node,
- ParallelContext *pcxt,
- void *coordinate);
- typedef void (*InitializeWorkerForeignScan_function) (ForeignScanState *node,
- shm_toc *toc,
- void *coordinate);
- typedef void (*ShutdownForeignScan_function) (ForeignScanState *node);
- typedef bool (*IsForeignScanParallelSafe_function) (PlannerInfo *root,
- RelOptInfo *rel,
- RangeTblEntry *rte);
- typedef List *(*ReparameterizeForeignPathByChild_function) (PlannerInfo *root,
- List *fdw_private,
- RelOptInfo *child_rel);
- typedef bool (*IsForeignPathAsyncCapable_function) (ForeignPath *path);
- typedef void (*ForeignAsyncRequest_function) (AsyncRequest *areq);
- typedef void (*ForeignAsyncConfigureWait_function) (AsyncRequest *areq);
- typedef void (*ForeignAsyncNotify_function) (AsyncRequest *areq);
- /*
- * 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;
- /* Functions for scanning foreign tables */
- GetForeignRelSize_function GetForeignRelSize;
- GetForeignPaths_function GetForeignPaths;
- GetForeignPlan_function GetForeignPlan;
- BeginForeignScan_function BeginForeignScan;
- IterateForeignScan_function IterateForeignScan;
- ReScanForeignScan_function ReScanForeignScan;
- EndForeignScan_function EndForeignScan;
- /*
- * Remaining functions are optional. Set the pointer to NULL for any that
- * are not provided.
- */
- /* Functions for remote-join planning */
- GetForeignJoinPaths_function GetForeignJoinPaths;
- /* Functions for remote upper-relation (post scan/join) planning */
- GetForeignUpperPaths_function GetForeignUpperPaths;
- /* Functions for updating foreign tables */
- AddForeignUpdateTargets_function AddForeignUpdateTargets;
- PlanForeignModify_function PlanForeignModify;
- BeginForeignModify_function BeginForeignModify;
- ExecForeignInsert_function ExecForeignInsert;
- ExecForeignBatchInsert_function ExecForeignBatchInsert;
- GetForeignModifyBatchSize_function GetForeignModifyBatchSize;
- ExecForeignUpdate_function ExecForeignUpdate;
- ExecForeignDelete_function ExecForeignDelete;
- EndForeignModify_function EndForeignModify;
- BeginForeignInsert_function BeginForeignInsert;
- EndForeignInsert_function EndForeignInsert;
- IsForeignRelUpdatable_function IsForeignRelUpdatable;
- PlanDirectModify_function PlanDirectModify;
- BeginDirectModify_function BeginDirectModify;
- IterateDirectModify_function IterateDirectModify;
- EndDirectModify_function EndDirectModify;
- /* Functions for SELECT FOR UPDATE/SHARE row locking */
- GetForeignRowMarkType_function GetForeignRowMarkType;
- RefetchForeignRow_function RefetchForeignRow;
- RecheckForeignScan_function RecheckForeignScan;
- /* Support functions for EXPLAIN */
- ExplainForeignScan_function ExplainForeignScan;
- ExplainForeignModify_function ExplainForeignModify;
- ExplainDirectModify_function ExplainDirectModify;
- /* Support functions for ANALYZE */
- AnalyzeForeignTable_function AnalyzeForeignTable;
- /* Support functions for IMPORT FOREIGN SCHEMA */
- ImportForeignSchema_function ImportForeignSchema;
- /* Support functions for TRUNCATE */
- ExecForeignTruncate_function ExecForeignTruncate;
- /* Support functions for parallelism under Gather node */
- IsForeignScanParallelSafe_function IsForeignScanParallelSafe;
- EstimateDSMForeignScan_function EstimateDSMForeignScan;
- InitializeDSMForeignScan_function InitializeDSMForeignScan;
- ReInitializeDSMForeignScan_function ReInitializeDSMForeignScan;
- InitializeWorkerForeignScan_function InitializeWorkerForeignScan;
- ShutdownForeignScan_function ShutdownForeignScan;
- /* Support functions for path reparameterization. */
- ReparameterizeForeignPathByChild_function ReparameterizeForeignPathByChild;
- /* Support functions for asynchronous execution */
- IsForeignPathAsyncCapable_function IsForeignPathAsyncCapable;
- ForeignAsyncRequest_function ForeignAsyncRequest;
- ForeignAsyncConfigureWait_function ForeignAsyncConfigureWait;
- ForeignAsyncNotify_function ForeignAsyncNotify;
- } FdwRoutine;
- /* Functions in foreign/foreign.c */
- extern FdwRoutine *GetFdwRoutine(Oid fdwhandler);
- extern Oid GetForeignServerIdByRelId(Oid relid);
- extern FdwRoutine *GetFdwRoutineByServerId(Oid serverid);
- extern FdwRoutine *GetFdwRoutineByRelId(Oid relid);
- extern FdwRoutine *GetFdwRoutineForRelation(Relation relation, bool makecopy);
- extern bool IsImportableForeignTable(const char *tablename,
- ImportForeignSchemaStmt *stmt);
- extern Path *GetExistingLocalJoinPath(RelOptInfo *joinrel);
- #endif /* FDWAPI_H */
|