Hello David, I really appreciate your quick reply.
On Wed, Aug 9, 2023 at 7:28 PM David Rowley <dgrowle...@gmail.com> wrote: > If 0004 is adding an em_index to mark the index into > PlannerInfo->eq_members, can't you use that in > setup_eclass_member[_strict]_iterator to loop to verify that the two > methods yield the same result? > > i.e: > > + Bitmapset *matching_ems = NULL; > + memcpy(&idx_iter, iter, sizeof(EquivalenceMemberIterator)); > + memcpy(&noidx_iter, iter, sizeof(EquivalenceMemberIterator)); > + > + idx_iter.use_index = true; > + noidx_iter.use_index = false; > + > + while ((em = eclass_member_iterator_strict_next(&noidx_iter)) != NULL) > + matching_ems = bms_add_member(matching_ems, em->em_index); > + > + Assert(bms_equal(matching_ems, iter->matching_ems)); > > That should void the complaint that the Assert checking is too slow. > You can also delete the list_ptr_cmp function too (also noticed a > complaint about that). Thanks for sharing your idea regarding this verification. It looks good to solve the degradation problem in assert-enabled builds. I will try it. > For the 0003 patch. Can you explain why you think these fields should > be in RangeTblEntry rather than RelOptInfo? I can only guess you might > have done this for memory usage so that we don't have to carry those > fields for join rels? I think RelOptInfo is the correct place to > store fields that are only used in the planner. If you put them in > RangeTblEntry they'll end up in pg_rewrite and be stored for all > views. Seems very space inefficient and scary as it limits the scope > for fixing bugs in back branches due to RangeTblEntries being > serialized into the catalogues in various places. This change was not made for performance reasons but to avoid null reference exceptions. The details are explained in my email [1]. In brief, the earlier patch did not work because simple_rel_array[i] could be NULL for some 'i', and we referenced such a RelOptInfo. For example, the following code snippet in add_eq_member() does not work. I inserted "Assert(rel != NULL)" into this code, and then the assertion failed. So, I moved the indexes to RangeTblEntry to address this issue, but I don't know if this solution is good. We may have to solve this in a different way. ===== @@ -572,9 +662,31 @@ add_eq_member(EquivalenceClass *ec, Expr *expr, Relids relids, + i = -1; + while ((i = bms_next_member(expr_relids, i)) >= 0) + { + RelOptInfo *rel = root->simple_rel_array[i]; + + rel->eclass_member_indexes = bms_add_member(rel->eclass_member_indexes, em_index); + } ===== On Wed, Aug 9, 2023 at 8:54 PM David Rowley <dgrowle...@gmail.com> wrote: > So, I have three concerns with this patch. > I think the best way to move this forward is to explore not putting > partitioned table partitions in EMs and instead see if we can > translate to top-level parent before lookups. This might just be too > complex to translate the Exprs all the time and it may add overhead > unless we can quickly determine somehow that we don't need to attempt > to translate the Expr when the given Expr is already from the > top-level parent. If that can't be made to work, then maybe that shows > the current patch has merit. I really appreciate your detailed advice. I am sorry that I will not be able to respond for a week or two due to my vacation, but I will explore and work on these issues. Thanks again for your kind reply. [1] https://www.postgresql.org/message-id/CAJ2pMkYR_X-%3Dpq%2B39-W5kc0OG7q9u5YUwDBCHnkPur17DXnxuQ%40mail.gmail.com -- Best regards, Yuya Watari