Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
postgres_fdw: don't push ORDER BY with no vars (bug #15352)
authorAndrew Gierth <rhodiumtoad@postgresql.org>
Tue, 28 Aug 2018 13:43:51 +0000 (14:43 +0100)
committerAndrew Gierth <rhodiumtoad@postgresql.org>
Tue, 28 Aug 2018 13:43:51 +0000 (14:43 +0100)
Commit aa09cd242 changed a condition in find_em_expr_for_rel from
being a bms_equal comparison of relids to bms_is_subset, in order to
support order by clauses on foreign joins. But this also allows
through the degenerate case of expressions with no Vars at all (and
hence empty relids), including integer constants which will be parsed
unexpectedly on the remote (viz. "ERROR: ORDER BY position 0 is not in
select list" as in the bug report).

Repair by adding an additional !bms_is_empty test.

Backpatch through to 9.6 where the aforementioned change was made.

Per bug #15352 from Maksym Boguk; analysis and patch by me.

Discussion: https://postgr.es/m/153518420278.1478.14875560810251994661@wrigleys.postgresql.org

contrib/postgres_fdw/postgres_fdw.c

index 0803c30a48ed676acd1eae9ead29b5a4fe694fa9..e4e330397ee8cdcc4592a736270fefd0bf248e89 100644 (file)
@@ -5793,7 +5793,8 @@ find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel)
    {
        EquivalenceMember *em = lfirst(lc_em);
 
-       if (bms_is_subset(em->em_relids, rel->relids))
+       if (bms_is_subset(em->em_relids, rel->relids) &&
+           !bms_is_empty(em->em_relids))
        {
            /*
             * If there is more than one equivalence member whose Vars are