diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 47d80b0d25..bd60b55574 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -122,7 +122,7 @@ bool bsysscan = false; * lookups as fast as possible. */ static FullTransactionId XactTopFullTransactionId = {InvalidTransactionId}; -static int nParallelCurrentXids = 0; +static int nParallelCurrentXids = 0; static TransactionId *ParallelCurrentXids; /* diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 5d1f7089da..d53c9c7235 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -1624,13 +1624,20 @@ ExplainNode(PlanState *planstate, List *ancestors, if (es->format == EXPLAIN_FORMAT_TEXT) { if (es->timing) + { + appendStringInfo(es->str, " (actual time=%.3f..%.3f", + startup_ms, total_ms); appendStringInfo(es->str, - " (actual time=%.3f..%.3f rows=%.0f loops=%.0f)", - startup_ms, total_ms, rows, nloops); + nloops == 1 ? " rows=%.0f loops=%.0f)" : " rows=%.2f loops=%.0f)", + rows, nloops); + } else + { appendStringInfo(es->str, - " (actual rows=%.0f loops=%.0f)", + nloops == 1 ? + " (actual rows=%.0f loops=%.0f)" : " (actual rows=%.2f loops=%.0f)", rows, nloops); + } } else { @@ -1641,7 +1648,7 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyFloat("Actual Total Time", "ms", total_ms, 3, es); } - ExplainPropertyFloat("Actual Rows", NULL, rows, 0, es); + ExplainPropertyFloat("Actual Rows", NULL, rows, nloops == 1 ? 0 : 2, es); ExplainPropertyFloat("Actual Loops", NULL, nloops, 0, es); } } @@ -1690,13 +1697,19 @@ ExplainNode(PlanState *planstate, List *ancestors, { ExplainIndentText(es); if (es->timing) + { + appendStringInfo(es->str, "actual time=%.3f..%.3f", + startup_ms, total_ms); appendStringInfo(es->str, - "actual time=%.3f..%.3f rows=%.0f loops=%.0f\n", - startup_ms, total_ms, rows, nloops); + nloops == 1 ? " rows=%.0f loops=%.0f" : " rows=%.2f loops=%.0f", + rows, nloops); + } else - appendStringInfo(es->str, - "actual rows=%.0f loops=%.0f\n", + { + appendStringInfo(es->str, nloops == 1 ? + "actual rows=%.0f loops=%.0f" : "actual rows=%.2f loops=%.0f", rows, nloops); + } } else { @@ -1707,7 +1720,7 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyFloat("Actual Total Time", "ms", total_ms, 3, es); } - ExplainPropertyFloat("Actual Rows", NULL, rows, 0, es); + ExplainPropertyFloat("Actual Rows", NULL, rows, nloops == 1 ? 0 : 2, es); ExplainPropertyFloat("Actual Loops", NULL, nloops, 0, es); } diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index ce12915592..baecc40e0c 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1937,7 +1937,7 @@ _outPathInfo(StringInfo str, const Path *node) WRITE_BOOL_FIELD(parallel_aware); WRITE_BOOL_FIELD(parallel_safe); WRITE_INT_FIELD(parallel_workers); - WRITE_FLOAT_FIELD(rows, "%.0f"); + WRITE_FLOAT_FIELD(rows, "%.2f"); WRITE_FLOAT_FIELD(startup_cost, "%.2f"); WRITE_FLOAT_FIELD(total_cost, "%.2f"); WRITE_NODE_FIELD(pathkeys);