Thanks Fujita-san for bug report and the fix. Sorry for bug.

Here's patch with better way to fix it. I think while concatenating the
lists, we need to copy the lists being appended and in all the cases. If we
don't copy, a change in those lists can cause changes in the upward
linkages and thus lists of any higher level joins.

On Mon, Feb 15, 2016 at 1:10 PM, Etsuro Fujita <fujita.ets...@lab.ntt.co.jp>
wrote:

> On 2016/02/10 4:16, Robert Haas wrote:
>
>> On Tue, Feb 9, 2016 at 8:39 AM, Ashutosh Bapat
>> <ashutosh.ba...@enterprisedb.com> wrote:
>>
>>> Thanks Jeevan for your review and comments. PFA the patch which fixes
>>> those.
>>>
>>
> Committed with a couple more small adjustments.
>>
>
> Thanks for working on this, Robert, Ashutosh, and everyone involved!
>
> I happened to notice that this code in foreign_join_ok():
>
>     switch (jointype)
>     {
>         case JOIN_INNER:
>             fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
>                                                fpinfo_i->remote_conds);
>             fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
>                                                fpinfo_o->remote_conds);
>             break;
>
>         case JOIN_LEFT:
>             fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
>                                               fpinfo_i->remote_conds);
>             fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
>                                                fpinfo_o->remote_conds);
>             break;
>
>         case JOIN_RIGHT:
>             fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
>                                               fpinfo_o->remote_conds);
>             fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
>                                                fpinfo_i->remote_conds);
>             break;
>
>         case JOIN_FULL:
>             fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
>                                               fpinfo_i->remote_conds);
>             fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
>                                               fpinfo_o->remote_conds);
>             break;
>
>         default:
>             /* Should not happen, we have just check this above */
>             elog(ERROR, "unsupported join type %d", jointype);
>     }
>
> would break the list fpinfo_i->remote_conds in the case of INNER JOIN or
> FULL JOIN.  You can see the list breakage from e.g., the following queries
> on an Assert-enabled build:
>
> postgres=# create extension postgres_fdw;
> CREATE EXTENSION
> postgres=# create server myserver foreign data wrapper postgres_fdw
> options (dbname 'mydatabase');
> CREATE SERVER
> postgres=# create user mapping for current_user server myserver;
> CREATE USER MAPPING
> postgres=# create foreign table foo (a int) server myserver options
> (table_name 'foo');
> CREATE FOREIGN TABLE
> postgres=# create foreign table bar (a int) server myserver options
> (table_name 'bar');
> CREATE FOREIGN TABLE
> postgres=# create foreign table baz (a int) server myserver options
> (table_name 'baz');
> CREATE FOREIGN TABLE
> postgres=# select * from foo, bar, baz where foo.a = bar.a and bar.a =
> baz.a and foo.a < 10 and bar.a < 10 and baz.a < 10;
>
> Attached is a patch to avoid the breakage.
>
> Best regards,
> Etsuro Fujita
>



-- 
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company

Attachment: foreign_join_ok_v2.patch
Description: application/download

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