Hello, Please consider the following test:
create database foo; \c foo create table foo_test ( a int ); \c postgres create extension if not exists postgres_fdw; create server foo_server foreign data wrapper postgres_fdw options ( dbname 'foo' ); create user mapping for current_user server foo_server; create foreign table foo_test ( a int not null) server foo_server; -- insert should return error for because NOT NULL constraint on column a postgres=# insert into foo_test values ( null ); INSERT 0 1 postgres=# select * from foo_test; a --- (1 row) -- clean up drop foreign table foo_test; drop server foo_server cascade; \c postgres drop database foo; Analysis: As per the PG documentation it says that foreign table do support the NOT NULL, NULL and DEFAULT. http://www.postgresql.org/docs/devel/static/sql-createforeigntable.html But when I tried the NOT NULL constraint, its not working for the foreign tables. Looking at the code into ExecInsert(), for the foreign table missed to call ExecConstraints(). I am not sure whether it is intentional that we not calling ExecConstraints() in case of foreign server or its missed. Do share your thought on this. I quickly fix the issue by adding ExecConstraints() call for foreign table and now test behaving as expected. PFA patch for the same. Regards, Rushabh Lathia www.EnterpriseDB.com
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 6f0f47e..240126c 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -229,6 +229,12 @@ ExecInsert(TupleTableSlot *slot, else if (resultRelInfo->ri_FdwRoutine) { /* + * Check the constraints of the tuple + */ + if (resultRelationDesc->rd_att->constr) + ExecConstraints(resultRelInfo, slot, estate); + + /* * insert into foreign table: let the FDW do it */ slot = resultRelInfo->ri_FdwRoutine->ExecForeignInsert(estate,
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers