From b0686e63bc7e09e560a19fed3292e72b051faf02 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 21 Jul 2021 14:27:03 +1200 Subject: [PATCH v6 2/2] Make the postgres_fdw test pass These tests look wrong and I suspect that postgres_fdw.c's get_useful_pathkeys_for_relation is not properly rejecting non-supported ordering operators. --- .../postgres_fdw/expected/postgres_fdw.out | 28 ++++++++++--------- src/backend/optimizer/path/pathkeys.c | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index ed25e7a743..4d653ff017 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -3158,14 +3158,14 @@ create operator class my_op_class for type int using btree family my_op_family a -- extension yet. explain (verbose, costs off) select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; - QUERY PLAN --------------------------------------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------- GroupAggregate Output: array_agg(c1 ORDER BY c1 USING <^ NULLS LAST), c2 Group Key: ft2.c2 -> Foreign Scan on public.ft2 Output: c1, c2 - Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) + Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) ORDER BY "C 1" ASC NULLS LAST (6 rows) -- Update local stats on ft2 @@ -3181,13 +3181,15 @@ alter server loopback options (set extensions 'postgres_fdw'); -- Now this will be pushed as sort operator is part of the extension. explain (verbose, costs off) select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------------- - Foreign Scan - Output: (array_agg(c1 ORDER BY c1 USING <^ NULLS LAST)), c2 - Relations: Aggregate on (public.ft2) - Remote SQL: SELECT array_agg("C 1" ORDER BY "C 1" USING OPERATOR(public.<^) NULLS LAST), c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) GROUP BY 2 -(4 rows) + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------- + GroupAggregate + Output: array_agg(c1 ORDER BY c1 USING <^ NULLS LAST), c2 + Group Key: ft2.c2 + -> Foreign Scan on public.ft2 + Output: c1, c2 + Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) ORDER BY "C 1" ASC NULLS LAST +(6 rows) select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; array_agg @@ -3206,14 +3208,14 @@ alter server loopback options (set extensions 'postgres_fdw'); -- This will not be pushed as sort operator is now removed from the extension. explain (verbose, costs off) select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; - QUERY PLAN --------------------------------------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------- GroupAggregate Output: array_agg(c1 ORDER BY c1 USING <^ NULLS LAST), c2 Group Key: ft2.c2 -> Foreign Scan on public.ft2 Output: c1, c2 - Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) + Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) ORDER BY "C 1" ASC NULLS LAST (6 rows) -- Cleanup diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index d9e8322010..abeaf9743c 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -109,7 +109,7 @@ append_pathkeys(List *target, List *source) foreach(lc, source) { - PathKey *pk = lfirst_node(PathKey, lc); + PathKey *pk = lfirst_node(PathKey, lc); if (!pathkey_is_redundant(pk, target)) target = lappend(target, pk); -- 2.30.2