mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	postgres_fdw can now sent an UPDATE or DELETE statement directly to the foreign server in simple cases, rather than sending a SELECT FOR UPDATE statement and then updating or deleting rows one-by-one. Etsuro Fujita, reviewed by Rushabh Lathia, Shigeru Hanada, Kyotaro Horiguchi, Albe Laurenz, Thom Brown, and me.
		
			
				
	
	
		
			168 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*-------------------------------------------------------------------------
 | |
|  *
 | |
|  * postgres_fdw.h
 | |
|  *		  Foreign-data wrapper for remote PostgreSQL servers
 | |
|  *
 | |
|  * Portions Copyright (c) 2012-2016, PostgreSQL Global Development Group
 | |
|  *
 | |
|  * IDENTIFICATION
 | |
|  *		  contrib/postgres_fdw/postgres_fdw.h
 | |
|  *
 | |
|  *-------------------------------------------------------------------------
 | |
|  */
 | |
| #ifndef POSTGRES_FDW_H
 | |
| #define POSTGRES_FDW_H
 | |
| 
 | |
| #include "foreign/foreign.h"
 | |
| #include "lib/stringinfo.h"
 | |
| #include "nodes/relation.h"
 | |
| #include "utils/relcache.h"
 | |
| 
 | |
| #include "libpq-fe.h"
 | |
| 
 | |
| /*
 | |
|  * FDW-specific planner information kept in RelOptInfo.fdw_private for a
 | |
|  * foreign table.  This information is collected by postgresGetForeignRelSize.
 | |
|  */
 | |
| typedef struct PgFdwRelationInfo
 | |
| {
 | |
| 	/*
 | |
| 	 * True means that the relation can be pushed down. Always true for simple
 | |
| 	 * foreign scan.
 | |
| 	 */
 | |
| 	bool		pushdown_safe;
 | |
| 
 | |
| 	/*
 | |
| 	 * Restriction clauses, divided into safe and unsafe to pushdown subsets.
 | |
| 	 *
 | |
| 	 * For a base foreign relation this is a list of clauses along-with
 | |
| 	 * RestrictInfo wrapper. Keeping RestrictInfo wrapper helps while dividing
 | |
| 	 * scan_clauses in postgresGetForeignPlan into safe and unsafe subsets.
 | |
| 	 * Also it helps in estimating costs since RestrictInfo caches the
 | |
| 	 * selectivity and qual cost for the clause in it.
 | |
| 	 *
 | |
| 	 * For a join relation, however, they are part of otherclause list
 | |
| 	 * obtained from extract_actual_join_clauses, which strips RestrictInfo
 | |
| 	 * construct. So, for a join relation they are list of bare clauses.
 | |
| 	 */
 | |
| 	List	   *remote_conds;
 | |
| 	List	   *local_conds;
 | |
| 
 | |
| 	/* Bitmap of attr numbers we need to fetch from the remote server. */
 | |
| 	Bitmapset  *attrs_used;
 | |
| 
 | |
| 	/* Cost and selectivity of local_conds. */
 | |
| 	QualCost	local_conds_cost;
 | |
| 	Selectivity local_conds_sel;
 | |
| 
 | |
| 	/* Selectivity of join conditions */
 | |
| 	Selectivity joinclause_sel;
 | |
| 
 | |
| 	/* Estimated size and cost for a scan or join. */
 | |
| 	double		rows;
 | |
| 	int			width;
 | |
| 	Cost		startup_cost;
 | |
| 	Cost		total_cost;
 | |
| 	/* Costs excluding costs for transferring data from the foreign server */
 | |
| 	Cost		rel_startup_cost;
 | |
| 	Cost		rel_total_cost;
 | |
| 
 | |
| 	/* Options extracted from catalogs. */
 | |
| 	bool		use_remote_estimate;
 | |
| 	Cost		fdw_startup_cost;
 | |
| 	Cost		fdw_tuple_cost;
 | |
| 	List	   *shippable_extensions;	/* OIDs of whitelisted extensions */
 | |
| 
 | |
| 	/* Cached catalog information. */
 | |
| 	ForeignTable *table;
 | |
| 	ForeignServer *server;
 | |
| 	UserMapping *user;			/* only set in use_remote_estimate mode */
 | |
| 
 | |
| 	int			fetch_size;      /* fetch size for this remote table */
 | |
| 
 | |
| 	/*
 | |
| 	 * Name of the relation while EXPLAINing ForeignScan. It is used for join
 | |
| 	 * relations but is set for all relations. For join relation, the name
 | |
| 	 * indicates which foreign tables are being joined and the join type used.
 | |
| 	 */
 | |
| 	StringInfo	relation_name;
 | |
| 
 | |
| 	/* Join information */
 | |
| 	RelOptInfo *outerrel;
 | |
| 	RelOptInfo *innerrel;
 | |
| 	JoinType	jointype;
 | |
| 	List	   *joinclauses;
 | |
| } PgFdwRelationInfo;
 | |
| 
 | |
| /* in postgres_fdw.c */
 | |
| extern int	set_transmission_modes(void);
 | |
| extern void reset_transmission_modes(int nestlevel);
 | |
| 
 | |
| /* in connection.c */
 | |
| extern PGconn *GetConnection(UserMapping *user, bool will_prep_stmt);
 | |
| extern void ReleaseConnection(PGconn *conn);
 | |
| extern unsigned int GetCursorNumber(PGconn *conn);
 | |
| extern unsigned int GetPrepStmtNumber(PGconn *conn);
 | |
| extern void pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
 | |
| 				   bool clear, const char *sql);
 | |
| 
 | |
| /* in option.c */
 | |
| extern int ExtractConnectionOptions(List *defelems,
 | |
| 						 const char **keywords,
 | |
| 						 const char **values);
 | |
| extern List *ExtractExtensionList(const char *extensionsString,
 | |
| 					 bool warnOnMissing);
 | |
| 
 | |
| /* in deparse.c */
 | |
| extern void classifyConditions(PlannerInfo *root,
 | |
| 				   RelOptInfo *baserel,
 | |
| 				   List *input_conds,
 | |
| 				   List **remote_conds,
 | |
| 				   List **local_conds);
 | |
| extern bool is_foreign_expr(PlannerInfo *root,
 | |
| 				RelOptInfo *baserel,
 | |
| 				Expr *expr);
 | |
| extern void deparseInsertSql(StringInfo buf, PlannerInfo *root,
 | |
| 				 Index rtindex, Relation rel,
 | |
| 				 List *targetAttrs, bool doNothing, List *returningList,
 | |
| 				 List **retrieved_attrs);
 | |
| extern void deparseUpdateSql(StringInfo buf, PlannerInfo *root,
 | |
| 				 Index rtindex, Relation rel,
 | |
| 				 List *targetAttrs, List *returningList,
 | |
| 				 List **retrieved_attrs);
 | |
| extern void deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root,
 | |
| 								   Index rtindex, Relation rel,
 | |
| 								   List *targetlist,
 | |
| 								   List *targetAttrs,
 | |
| 								   List *remote_conds,
 | |
| 								   List **params_list,
 | |
| 								   List *returningList,
 | |
| 								   List **retrieved_attrs);
 | |
| extern void deparseDeleteSql(StringInfo buf, PlannerInfo *root,
 | |
| 				 Index rtindex, Relation rel,
 | |
| 				 List *returningList,
 | |
| 				 List **retrieved_attrs);
 | |
| extern void deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root,
 | |
| 								   Index rtindex, Relation rel,
 | |
| 								   List *remote_conds,
 | |
| 								   List **params_list,
 | |
| 								   List *returningList,
 | |
| 								   List **retrieved_attrs);
 | |
| extern void deparseAnalyzeSizeSql(StringInfo buf, Relation rel);
 | |
| extern void deparseAnalyzeSql(StringInfo buf, Relation rel,
 | |
| 				  List **retrieved_attrs);
 | |
| extern void deparseStringLiteral(StringInfo buf, const char *val);
 | |
| extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel);
 | |
| extern List *build_tlist_to_deparse(RelOptInfo *foreign_rel);
 | |
| extern void deparseSelectStmtForRel(StringInfo buf, PlannerInfo *root,
 | |
| 						RelOptInfo *foreignrel, List *tlist,
 | |
| 						List *remote_conds, List *pathkeys,
 | |
| 						List **retrieved_attrs, List **params_list);
 | |
| 
 | |
| /* in shippable.c */
 | |
| extern bool is_builtin(Oid objectId);
 | |
| extern bool is_shippable(Oid objectId, Oid classId, PgFdwRelationInfo *fpinfo);
 | |
| extern const char *get_jointype_name(JoinType jointype);
 | |
| 
 | |
| #endif   /* POSTGRES_FDW_H */
 |