Please consider attached patch here as earlier attached wrong patch.

Sorry for the inconvenience.


On Mon, Jan 20, 2014 at 1:21 PM, Rushabh Lathia <rushabh.lat...@gmail.com>wrote:

> 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
>
>


-- 
Rushabh Lathia
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 6f0f47e..f745f5e 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,
@@ -641,6 +647,9 @@ ExecUpdate(ItemPointer tupleid,
 	}
 	else if (resultRelInfo->ri_FdwRoutine)
 	{
+		if (resultRelationDesc->rd_att->constr)
+			ExecConstraints(resultRelInfo, slot, estate);
+
 		/*
 		 * update in foreign table: let the FDW do it
 		 */
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to