From e01145902973881c61acb6b54187128bab9c645b Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 5 Oct 2005 17:19:19 +0000
Subject: [PATCH] Make set_function_size_estimates() marginally smarter: per
 original comment, it can at least test whether the expression returns set.

---
 src/backend/optimizer/path/costsize.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 24af7afe799..bb506678ce4 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -49,7 +49,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.147 2005/08/27 22:37:00 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.148 2005/10/05 17:19:19 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1898,17 +1898,23 @@ join_in_selectivity(JoinPath *path, PlannerInfo *root)
 void
 set_function_size_estimates(PlannerInfo *root, RelOptInfo *rel)
 {
+	RangeTblEntry *rte;
+
 	/* Should only be applied to base relations that are functions */
 	Assert(rel->relid > 0);
-	Assert(rel->rtekind == RTE_FUNCTION);
+	rte = rt_fetch(rel->relid, root->parse->rtable);
+	Assert(rte->rtekind == RTE_FUNCTION);
 
 	/*
 	 * Estimate number of rows the function itself will return.
 	 *
-	 * XXX no idea how to do this yet; but should at least check whether
+	 * XXX no idea how to do this yet; but we can at least check whether
 	 * function returns set or not...
 	 */
-	rel->tuples = 1000;
+	if (expression_returns_set(rte->funcexpr))
+		rel->tuples = 1000;
+	else
+		rel->tuples = 1;
 
 	/* Now estimate number of output rows, etc */
 	set_baserel_size_estimates(root, rel);
-- 
GitLab