1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-26 12:21:12 +03:00

Fix EXPLAIN MERGE output when no tuples are processed

An 'else' clause was misplaced in commit 598ac10be1, making zero-rows
output look a bit silly.  Add a test case for it.

Pointed out by Tom Lane.

Discussion: https://postgr.es/m/21030.1652893083@sss.pgh.pa.us
This commit is contained in:
Alvaro Herrera
2022-05-18 21:20:49 +02:00
parent 0fbf011200
commit 12e423e21d
3 changed files with 41 additions and 14 deletions

View File

@ -4068,7 +4068,9 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors,
skipped_path = total - insert_path - update_path - delete_path; skipped_path = total - insert_path - update_path - delete_path;
Assert(skipped_path >= 0); Assert(skipped_path >= 0);
if (es->format == EXPLAIN_FORMAT_TEXT && total > 0) if (es->format == EXPLAIN_FORMAT_TEXT)
{
if (total > 0)
{ {
ExplainIndentText(es); ExplainIndentText(es);
appendStringInfoString(es->str, "Tuples:"); appendStringInfoString(es->str, "Tuples:");
@ -4082,6 +4084,7 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors,
appendStringInfo(es->str, " skipped=%.0f", skipped_path); appendStringInfo(es->str, " skipped=%.0f", skipped_path);
appendStringInfoChar(es->str, '\n'); appendStringInfoChar(es->str, '\n');
} }
}
else else
{ {
ExplainPropertyFloat("Tuples Inserted", NULL, insert_path, 0, es); ExplainPropertyFloat("Tuples Inserted", NULL, insert_path, 0, es);

View File

@ -1316,7 +1316,7 @@ BEGIN
EXECUTE 'explain (analyze, timing off, summary off, costs off) ' || EXECUTE 'explain (analyze, timing off, summary off, costs off) ' ||
query query
LOOP LOOP
ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); ln := regexp_replace(ln, '(Memory( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g');
RETURN NEXT ln; RETURN NEXT ln;
END LOOP; END LOOP;
END; END;
@ -1432,6 +1432,24 @@ WHEN NOT MATCHED AND s.a < 20 THEN
-> Seq Scan on ex_mtarget t (actual rows=49 loops=1) -> Seq Scan on ex_mtarget t (actual rows=49 loops=1)
(12 rows) (12 rows)
-- nothing
SELECT explain_merge('
MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a AND t.a < -1000
WHEN MATCHED AND t.a < 10 THEN
DO NOTHING');
explain_merge
--------------------------------------------------------------------
Merge on ex_mtarget t (actual rows=0 loops=1)
-> Hash Join (actual rows=0 loops=1)
Hash Cond: (s.a = t.a)
-> Seq Scan on ex_msource s (actual rows=1 loops=1)
-> Hash (actual rows=0 loops=1)
Buckets: xxx Batches: xxx Memory Usage: xxx
-> Seq Scan on ex_mtarget t (actual rows=0 loops=1)
Filter: (a < '-1000'::integer)
Rows Removed by Filter: 54
(9 rows)
DROP TABLE ex_msource, ex_mtarget; DROP TABLE ex_msource, ex_mtarget;
DROP FUNCTION explain_merge(text); DROP FUNCTION explain_merge(text);
-- Subqueries -- Subqueries

View File

@ -878,7 +878,7 @@ BEGIN
EXECUTE 'explain (analyze, timing off, summary off, costs off) ' || EXECUTE 'explain (analyze, timing off, summary off, costs off) ' ||
query query
LOOP LOOP
ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); ln := regexp_replace(ln, '(Memory( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g');
RETURN NEXT ln; RETURN NEXT ln;
END LOOP; END LOOP;
END; END;
@ -920,6 +920,12 @@ WHEN MATCHED AND t.a >= 30 AND t.a <= 40 THEN
WHEN NOT MATCHED AND s.a < 20 THEN WHEN NOT MATCHED AND s.a < 20 THEN
INSERT VALUES (a, b)'); INSERT VALUES (a, b)');
-- nothing
SELECT explain_merge('
MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a AND t.a < -1000
WHEN MATCHED AND t.a < 10 THEN
DO NOTHING');
DROP TABLE ex_msource, ex_mtarget; DROP TABLE ex_msource, ex_mtarget;
DROP FUNCTION explain_merge(text); DROP FUNCTION explain_merge(text);