pgsql: Make entirely-dummy appendrels get marked as such in set_append_
От | Tom Lane |
---|---|
Тема | pgsql: Make entirely-dummy appendrels get marked as such in set_append_ |
Дата | |
Msg-id | E1ZJSOO-0000jB-LW@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Make entirely-dummy appendrels get marked as such in set_append_rel_size. 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. Branch ------ REL9_2_STABLE Details ------- http://git.postgresql.org/pg/commitdiff/16b2a50187ab2b4b1a0c2f5798b6cfaaebd93ed0 Modified Files -------------- src/backend/optimizer/path/allpaths.c | 102 ++++++++++++++++++++------------- src/test/regress/expected/join.out | 20 +++++++ src/test/regress/sql/join.sql | 11 ++++ 3 files changed, 92 insertions(+), 41 deletions(-)
В списке pgsql-committers по дате отправления: