On Mon, Apr 6, 2020 at 8:43 PM Ashutosh Bapat <ashutosh.ba...@2ndquadrant.com> wrote: > On Fri, 3 Apr 2020 at 20:45, Etsuro Fujita <etsuro.fuj...@gmail.com> wrote: > But it will be good to have following addition I suggested in my patches to > make sure nparts is set to 0 for an unpartitioned relation as per the comment > on nparts in RelOptInfo. > @@ -1653,6 +1663,8 @@ build_joinrel_partition_info(RelOptInfo *joinrel, > RelOptInfo *outer_rel, > jointype, restrictlist)) > { > Assert(!IS_PARTITIONED_REL(joinrel)); > + /* Join is not partitioned. */ > + joinrel->nparts = 0; > return; > }
I didn't modified that function as proposed, because I thought that 1) there would be no need to do so, and that 2) it would be better to set joinrel->nparts only when we set joinrel->part_schema, for consistency. >> >> 3) I think the for nparts comment is somewhat misleading: >> >> >> >> int nparts; /* number of partitions; 0 = not partitioned; >> >> * -1 = not yet set */ >> >> >> >> which says that nparts=0 means not partitioned. But then there are >> >> conditions like this: >> >> >> >> /* Nothing to do, if the join relation is not partitioned. */ >> >> if (joinrel->part_scheme == NULL || joinrel->nparts == 0) >> >> return; >> >> >> >> which (ignoring the obsolete comment) seems to say we can have nparts==0 >> >> even for partitioned tables, no? >> >> Yeah, I think I was a bit hasty. I fixed this. > For a non-join relation, nparts = 0 and nparts = -1 both have the same > meaning. Although we never set nparts = 0 for a non-join relation? I don't think so. Consider this: create table prt (a int, b int) partition by range (a); create table prt_p1 partition of prt for values from (0) to (250); create table prt_p2 partition of prt for values from (250) to (500); drop table prt_p1; drop table prt_p2; select count(*) from prt; For this query, we would have nparts=0 for the partitioned table prt. Thanks! Sorry for the delay. Best regards, Etsuro Fujita