mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Improve updatability checking for views and foreign tables.
Extend the FDW API (which we already changed for 9.3) so that an FDW can report whether specific foreign tables are insertable/updatable/deletable. The default assumption continues to be that they're updatable if the relevant executor callback function is supplied by the FDW, but finer granularity is now possible. As a test case, add an "updatable" option to contrib/postgres_fdw. This patch also fixes the information_schema views, which previously did not think that foreign tables were ever updatable, and fixes view_is_auto_updatable() so that a view on a foreign table can be auto-updatable. initdb forced due to changes in information_schema views and the functions they rely on. This is a bit unfortunate to do post-beta1, but if we don't change this now then we'll have another API break for FDWs when we do change it. Dean Rasheed, somewhat editorialized on by Tom Lane
This commit is contained in:
@@ -53,6 +53,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 201305061
|
||||
#define CATALOG_VERSION_NO 201306121
|
||||
|
||||
#endif
|
||||
|
@@ -1976,10 +1976,10 @@ DESCR("type of the argument");
|
||||
DATA(insert OID = 3162 ( pg_collation_for PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 25 "2276" _null_ _null_ _null_ _null_ pg_collation_for _null_ _null_ _null_ ));
|
||||
DESCR("collation of the argument; implementation of the COLLATION FOR expression");
|
||||
|
||||
DATA(insert OID = 3842 ( pg_view_is_insertable PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_view_is_insertable _null_ _null_ _null_ ));
|
||||
DESCR("is a view insertable-into");
|
||||
DATA(insert OID = 3843 ( pg_view_is_updatable PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_view_is_updatable _null_ _null_ _null_ ));
|
||||
DESCR("is a view updatable");
|
||||
DATA(insert OID = 3842 ( pg_relation_is_updatable PGNSP PGUID 12 10 0 0 0 f f f f t f s 2 0 23 "2205 16" _null_ _null_ _null_ _null_ pg_relation_is_updatable _null_ _null_ _null_ ));
|
||||
DESCR("is a relation insertable/updatable/deletable");
|
||||
DATA(insert OID = 3843 ( pg_column_is_updatable PGNSP PGUID 12 10 0 0 0 f f f f t f s 3 0 16 "2205 21 16" _null_ _null_ _null_ _null_ pg_column_is_updatable _null_ _null_ _null_ ));
|
||||
DESCR("is a column updatable");
|
||||
|
||||
/* Deferrable unique constraint trigger */
|
||||
DATA(insert OID = 1250 ( unique_key_recheck PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ unique_key_recheck _null_ _null_ _null_ ));
|
||||
|
@@ -80,6 +80,8 @@ typedef TupleTableSlot *(*ExecForeignDelete_function) (EState *estate,
|
||||
typedef void (*EndForeignModify_function) (EState *estate,
|
||||
ResultRelInfo *rinfo);
|
||||
|
||||
typedef int (*IsForeignRelUpdatable_function) (Relation rel);
|
||||
|
||||
typedef void (*ExplainForeignScan_function) (ForeignScanState *node,
|
||||
struct ExplainState *es);
|
||||
|
||||
@@ -134,6 +136,7 @@ typedef struct FdwRoutine
|
||||
ExecForeignUpdate_function ExecForeignUpdate;
|
||||
ExecForeignDelete_function ExecForeignDelete;
|
||||
EndForeignModify_function EndForeignModify;
|
||||
IsForeignRelUpdatable_function IsForeignRelUpdatable;
|
||||
|
||||
/* Support functions for EXPLAIN */
|
||||
ExplainForeignScan_function ExplainForeignScan;
|
||||
|
@@ -21,6 +21,6 @@ extern List *QueryRewrite(Query *parsetree);
|
||||
extern void AcquireRewriteLocks(Query *parsetree, bool forUpdatePushedDown);
|
||||
|
||||
extern Node *build_column_default(Relation rel, int attrno);
|
||||
extern bool relation_is_updatable(Oid reloid, int req_events);
|
||||
extern int relation_is_updatable(Oid reloid, bool include_triggers);
|
||||
|
||||
#endif /* REWRITEHANDLER_H */
|
||||
|
@@ -485,8 +485,8 @@ extern Datum pg_sleep(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_get_keywords(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_typeof(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_collation_for(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_view_is_insertable(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_view_is_updatable(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_relation_is_updatable(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_column_is_updatable(PG_FUNCTION_ARGS);
|
||||
|
||||
/* oid.c */
|
||||
extern Datum oidin(PG_FUNCTION_ARGS);
|
||||
|
Reference in New Issue
Block a user