Make set_function_size_estimates() marginally smarter: per original
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 5 Oct 2005 17:19:19 +0000 (17:19 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 5 Oct 2005 17:19:19 +0000 (17:19 +0000)
comment, it can at least test whether the expression returns set.

src/backend/optimizer/path/costsize.c

index 75b6928209971dc43d5c4ed87675962fdc93b71e..77af01491b6043f181b926a42e643a7ec86e1f50 100644 (file)
@@ -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);