aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/pathnode.c
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2020-10-12 20:41:16 +1300
committerThomas Munro <tmunro@postgresql.org>2020-10-13 00:26:49 +1300
commitf0f13a3a08b2757997410f3a1c38bdc22973c525 (patch)
tree47a4364849b5bdafb0e0e7ba6f33fe471feda985 /src/backend/optimizer/util/pathnode.c
parent3fb676504da9c019540c7384423c7e3d7d394110 (diff)
downloadpostgresql-f0f13a3a08b2757997410f3a1c38bdc22973c525.tar.gz
postgresql-f0f13a3a08b2757997410f3a1c38bdc22973c525.zip
Fix estimates for ModifyTable paths without RETURNING.
In the past, we always estimated that a ModifyTable node would emit the same number of rows as its subpaths. Without a RETURNING clause, the correct estimate is zero. Fix, in preparation for a proposed parallel write patch that is sensitive to that number. A remaining problem is that for RETURNING queries, the estimated width is based on subpath output rather than the RETURNING tlist. Reviewed-by: Greg Nancarrow <gregn4422@gmail.com> Discussion: https://postgr.es/m/CAJcOf-cXnB5cnMKqWEp2E2z7Mvcd04iLVmV%3DqpFJrR3AcrTS3g%40mail.gmail.com
Diffstat (limited to 'src/backend/optimizer/util/pathnode.c')
-rw-r--r--src/backend/optimizer/util/pathnode.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index c1fc866cbf9..5281a2f9983 100644
--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -3583,15 +3583,18 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel,
if (lc == list_head(subpaths)) /* first node? */
pathnode->path.startup_cost = subpath->startup_cost;
pathnode->path.total_cost += subpath->total_cost;
- pathnode->path.rows += subpath->rows;
- total_size += subpath->pathtarget->width * subpath->rows;
+ if (returningLists != NIL)
+ {
+ pathnode->path.rows += subpath->rows;
+ total_size += subpath->pathtarget->width * subpath->rows;
+ }
}
/*
* Set width to the average width of the subpath outputs. XXX this is
- * totally wrong: we should report zero if no RETURNING, else an average
- * of the RETURNING tlist widths. But it's what happened historically,
- * and improving it is a task for another day.
+ * totally wrong: we should return an average of the RETURNING tlist
+ * widths. But it's what happened historically, and improving it is a task
+ * for another day.
*/
if (pathnode->path.rows > 0)
total_size /= pathnode->path.rows;