Re: BUG #16122: segfault pg_detoast_datum (datum=0x0) at fmgr.c:1833 numrange query
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Tomas Vondra <tomas.vondra@2ndquadrant.com>
Cc: Adam Scott <adam.c.scott@gmail.com>, pgsql-bugs@lists.postgresql.org
Date: 2019-12-10T05:38:15Z
Lists: pgsql-bugs
Attachments
- rangetype-stat-crash.patch (text/x-diff) patch
On Tue, Nov 19, 2019 at 08:40:56PM +0900, Michael Paquier wrote: > If you add an ANALYZE on the table natica_hdu_test after restoring, I > am rather sure that you would reproduce the crash more quickly because > the handling around the stats of the column are busted here. Anyway, > taking my example of upthread, I have been also able to reproduce the > problem on REL_10_STABLE even with assertions enabled: the trick is > that you need to leave once the session after the analyze on the > table. Then a SELECT within a new session is enough to crash the > server. So... I have looked more at this one, and from my previous example it seems that we have a one-off error when looking up at the array holding the histograms for ranges (lower and upper bound). In my previous example, we get to build 101 RangeBounds when beginning to calculate the range operator selectivity in calc_hist_selectivity(). However, when we get to the point of calc_hist_selectivity_contained(), upper_index gets calculated at 100 which is just at the limit of the indexed bounds, and the code would happily look at the last bound as well as the one-after-the-last bound as range_cmp_bounds() sees fit, but the latter just points to the void. The code looks wrong since its introduction in 59d0bf9d and it seems that the changes done for free_attstatsslot() in 9aab83f make the issue more easily reproducible. A fix like the rough POC attached addresses the issue, but I think that's too naive to not count for the first bin in the ranges evaluated. Tomas, you may be more familiar with this area of the code than I am. What do you think? -- Michael
Commits
-
Fix edge-case crashes and misestimation in range containment selectivity.
- 8c8b456b5116 10.12 landed
- 784c58da1957 9.5.21 landed
- 70c17a81278c 12.2 landed
- 6bd567b65858 9.4.26 landed
- 5832be6ca4d7 11.7 landed
- 2dd10477cbfc 9.6.17 landed
- 652686a334b4 13.0 landed
-
Use stdbool.h if suitable
- 9a95a77d9d5d 11.0 cited
-
Redesign get_attstatsslot()/free_attstatsslot() for more safety and speed.
- 9aab83fc5039 10.0 cited