• Tom Lane's avatar
    Make entirely-dummy appendrels get marked as such in set_append_rel_size. · 358eaa01
    Tom Lane authored
    The planner generally expects that the estimated rowcount of any relation
    is at least one row, *unless* it has been proven empty by constraint
    exclusion or similar mechanisms, which is marked by installing a dummy path
    as the rel's cheapest path (cf. IS_DUMMY_REL).  When I split up
    allpaths.c's processing of base rels into separate set_base_rel_sizes and
    set_base_rel_pathlists steps, the intention was that dummy rels would get
    marked as such during the "set size" step; this is what justifies an Assert
    in indxpath.c's get_loop_count that other relations should either be dummy
    or have positive rowcount.  Unfortunately I didn't get that quite right
    for append relations: if all the child rels have been proven empty then
    set_append_rel_size would come up with a rowcount of zero, which is
    correct, but it didn't then do set_dummy_rel_pathlist.  (We would have
    ended up with the right state after set_append_rel_pathlist, but that's
    too late, if we generate indexpaths for some other rel first.)
    
    In addition to fixing the actual bug, I installed an Assert enforcing this
    convention in set_rel_size; that then allows simplification of a couple
    of now-redundant tests for zero rowcount in set_append_rel_size.
    
    Also, to cover the possibility that third-party FDWs have been careless
    about not returning a zero rowcount estimate, apply clamp_row_est to
    whatever an FDW comes up with as the rows estimate.
    
    Per report from Andreas Seltenreich.  Back-patch to 9.2.  Earlier branches
    did not have the separation between set_base_rel_sizes and
    set_base_rel_pathlists steps, so there was no intermediate state where an
    appendrel would have had inconsistent rowcount and pathlist.  It's possible
    that adding the Assert to set_rel_size would be a good idea in older
    branches too; but since they're not under development any more, it's likely
    not worth the trouble.
    358eaa01
allpaths.c 81.5 KB