Skip to content

Commit 9843841

Browse files
author
Etsuro Fujita
committed
postgres_fdw: Fix assertion in estimate_path_cost_size().
Commit 08d2d58 added an assertion assuming that the retrieved_rows estimate for a foreign relation, which is re-used to cost pre-sorted foreign paths with local stats, is set to at least one row in estimate_path_cost_size(), which isn't correct because if the relation is a foreign table with tuples=0, the estimate would be set to 0 there when not using remote estimates. Per bug #16807 from Alexander Lakhin. Back-patch to v13 where the aforementioned commit went in. Author: Etsuro Fujita Reviewed-by: Kyotaro Horiguchi Discussion: https://postgr.es/m/16807-9fe4e08fbaa5c7ce%40postgresql.org
1 parent 6467661 commit 9843841

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

contrib/postgres_fdw/expected/postgres_fdw.out

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,24 @@ SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2
602602

603603
RESET enable_hashjoin;
604604
RESET enable_nestloop;
605+
-- Test executing assertion in estimate_path_cost_size() that makes sure that
606+
-- retrieved_rows for foreign rel re-used to cost pre-sorted foreign paths is
607+
-- a sensible value even when the rel has tuples=0
608+
CREATE TABLE loct_empty (c1 int NOT NULL, c2 text);
609+
CREATE FOREIGN TABLE ft_empty (c1 int NOT NULL, c2 text)
610+
SERVER loopback OPTIONS (table_name 'loct_empty');
611+
INSERT INTO loct_empty
612+
SELECT id, 'AAA' || to_char(id, 'FM000') FROM generate_series(1, 100) id;
613+
DELETE FROM loct_empty;
614+
ANALYZE ft_empty;
615+
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1;
616+
QUERY PLAN
617+
-------------------------------------------------------------------------------
618+
Foreign Scan on public.ft_empty
619+
Output: c1, c2
620+
Remote SQL: SELECT c1, c2 FROM public.loct_empty ORDER BY c1 ASC NULLS LAST
621+
(3 rows)
622+
605623
-- ===================================================================
606624
-- WHERE with remotely-executable conditions
607625
-- ===================================================================

contrib/postgres_fdw/postgres_fdw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2810,7 +2810,7 @@ estimate_path_cost_size(PlannerInfo *root,
28102810
*/
28112811
if (fpinfo->rel_startup_cost >= 0 && fpinfo->rel_total_cost >= 0)
28122812
{
2813-
Assert(fpinfo->retrieved_rows >= 1);
2813+
Assert(fpinfo->retrieved_rows >= 0);
28142814

28152815
rows = fpinfo->rows;
28162816
retrieved_rows = fpinfo->retrieved_rows;

contrib/postgres_fdw/sql/postgres_fdw.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,18 @@ SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2
298298
RESET enable_hashjoin;
299299
RESET enable_nestloop;
300300

301+
-- Test executing assertion in estimate_path_cost_size() that makes sure that
302+
-- retrieved_rows for foreign rel re-used to cost pre-sorted foreign paths is
303+
-- a sensible value even when the rel has tuples=0
304+
CREATE TABLE loct_empty (c1 int NOT NULL, c2 text);
305+
CREATE FOREIGN TABLE ft_empty (c1 int NOT NULL, c2 text)
306+
SERVER loopback OPTIONS (table_name 'loct_empty');
307+
INSERT INTO loct_empty
308+
SELECT id, 'AAA' || to_char(id, 'FM000') FROM generate_series(1, 100) id;
309+
DELETE FROM loct_empty;
310+
ANALYZE ft_empty;
311+
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1;
312+
301313
-- ===================================================================
302314
-- WHERE with remotely-executable conditions
303315
-- ===================================================================

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy