Hi,
        The get_parameterized_baserel_size function does not differentiate for 
PARTITIONED_REL and always appends the rel's own restriction clauses. However, 
for PARTITIONED_REL, rel->tuples is computed in set_append_rel_size which comes 
from the sum of lived childrel->rows. It is important to note that 
childrel->rows is the estimated number of result tuples, meaning it already 
includes the effect of the rel's own restriction clauses. 
        Therefore, get_parameterized_baserel_size should not append the rel's 
own restriction clauses again for PARTITIONED_REL. It seems there might be a 
mistake here. Although I have not found any SQL that causes issues, this looks 
like a potential problem. The correct code should handle this situation 
appropriately like this.

--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -5365,7 +5365,10 @@ get_parameterized_baserel_size(PlannerInfo *root, 
RelOptInfo *rel,
         * restriction clauses.  Note that we force the clauses to be treated as
         * non-join clauses during selectivity estimation.
         */
-       allclauses = list_concat_copy(param_clauses, rel->baserestrictinfo);
+       if (rel->reloptkind == RELOPT_BASEREL && IS_PARTITIONED_REL(rel))
+               allclauses = list_copy(param_clauses);
+       else
+               allclauses = list_concat_copy(param_clauses, 
rel->baserestrictinfo);
        nrows = rel->tuples *
                clauselist_selectivity(root,
                                                           allclauses,

Regards,
Yajun Hu

Reply via email to