skipped_path = total - insert_path - update_path - delete_path;
Assert(skipped_path >= 0);
- if (es->format == EXPLAIN_FORMAT_TEXT && total > 0)
+ if (es->format == EXPLAIN_FORMAT_TEXT)
{
- ExplainIndentText(es);
- appendStringInfoString(es->str, "Tuples:");
- if (insert_path > 0)
- appendStringInfo(es->str, " inserted=%.0f", insert_path);
- if (update_path > 0)
- appendStringInfo(es->str, " updated=%.0f", update_path);
- if (delete_path > 0)
- appendStringInfo(es->str, " deleted=%.0f", delete_path);
- if (skipped_path > 0)
- appendStringInfo(es->str, " skipped=%.0f", skipped_path);
- appendStringInfoChar(es->str, '\n');
+ if (total > 0)
+ {
+ ExplainIndentText(es);
+ appendStringInfoString(es->str, "Tuples:");
+ if (insert_path > 0)
+ appendStringInfo(es->str, " inserted=%.0f", insert_path);
+ if (update_path > 0)
+ appendStringInfo(es->str, " updated=%.0f", update_path);
+ if (delete_path > 0)
+ appendStringInfo(es->str, " deleted=%.0f", delete_path);
+ if (skipped_path > 0)
+ appendStringInfo(es->str, " skipped=%.0f", skipped_path);
+ appendStringInfoChar(es->str, '\n');
+ }
}
else
{
EXECUTE 'explain (analyze, timing off, summary off, costs off) ' ||
query
LOOP
- ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx');
+ ln := regexp_replace(ln, '(Memory( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g');
RETURN NEXT ln;
END LOOP;
END;
-> Seq Scan on ex_mtarget t (actual rows=49 loops=1)
(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 FUNCTION explain_merge(text);
-- Subqueries
EXECUTE 'explain (analyze, timing off, summary off, costs off) ' ||
query
LOOP
- ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx');
+ ln := regexp_replace(ln, '(Memory( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g');
RETURN NEXT ln;
END LOOP;
END;
WHEN NOT MATCHED AND s.a < 20 THEN
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 FUNCTION explain_merge(text);