postgres_fdw: Avoid sharing list substructure.
authorRobert Haas <rhaas@postgresql.org>
Sun, 21 Feb 2016 08:47:50 +0000 (14:17 +0530)
committerRobert Haas <rhaas@postgresql.org>
Sun, 21 Feb 2016 08:47:50 +0000 (14:17 +0530)
list_concat(list_concat(a, b), c) destructively changes both a and b;
to avoid such perils, copy lists of remote_conds before incorporating
them into larger lists via list_concat().

Ashutosh Bapat, per a report from Etsuro Fujita

contrib/postgres_fdw/postgres_fdw.c

index 465f43cd7c9a45d5c47d70e50c8418b4f3e2f322..d79e4ccbe3d6a9d2bf48d5e8e249f0738a1537cc 100644 (file)
@@ -3488,30 +3488,30 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype,
    {
        case JOIN_INNER:
            fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
-                                              fpinfo_i->remote_conds);
+                                         list_copy(fpinfo_i->remote_conds));
            fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
-                                              fpinfo_o->remote_conds);
+                                         list_copy(fpinfo_o->remote_conds));
            break;
 
        case JOIN_LEFT:
            fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
-                                             fpinfo_i->remote_conds);
+                                         list_copy(fpinfo_i->remote_conds));
            fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
-                                              fpinfo_o->remote_conds);
+                                         list_copy(fpinfo_o->remote_conds));
            break;
 
        case JOIN_RIGHT:
            fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
-                                             fpinfo_o->remote_conds);
+                                         list_copy(fpinfo_o->remote_conds));
            fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
-                                              fpinfo_i->remote_conds);
+                                         list_copy(fpinfo_i->remote_conds));
            break;
 
        case JOIN_FULL:
            fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
-                                             fpinfo_i->remote_conds);
+                                         list_copy(fpinfo_i->remote_conds));
            fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
-                                             fpinfo_o->remote_conds);
+                                         list_copy(fpinfo_o->remote_conds));
            break;
 
        default: