pgsql: Avoid divide-by-zero in regex_selectivity() with long fixed pref - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Avoid divide-by-zero in regex_selectivity() with long fixed pref
Date
Msg-id E1lAfy1-0004bq-UX@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Avoid divide-by-zero in regex_selectivity() with long fixed prefix.

Given a regex pattern with a very long fixed prefix (approaching 500
characters), the result of pow(FIXED_CHAR_SEL, fixed_prefix_len) can
underflow to zero.  Typically the preceding selectivity calculation
would have underflowed as well, so that we compute 0/0 and get NaN.
In released branches this leads to an assertion failure later on.
That doesn't happen in HEAD, for reasons I've not explored yet,
but it's surely still a bug.

To fix, just skip the division when the pow() result is zero, so
that we'll (most likely) return a zero selectivity estimate.  In
the edge cases where "sel" didn't yet underflow, perhaps this
isn't desirable, but I'm not sure that the case is worth spending
a lot of effort on.  The results of regex_selectivity_sub() are
barely worth the electrons they're written on anyway :-(

Per report from Alexander Lakhin.  Back-patch to all supported versions.

Discussion: https://postgr.es/m/6de0a0c3-ada9-cd0c-3e4e-2fa9964b41e3@gmail.com

Branch
------
REL_13_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/3a02d68a96edb54d981879b95c28fe4ba79b87f9

Modified Files
--------------
src/backend/utils/adt/like_support.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)


pgsql-committers by date:

Previous
From: Alexander Korotkov
Date:
Subject: pgsql: pg_attribute_no_sanitize_alignment() macro
Next
From: Tom Lane
Date:
Subject: pgsql: Avoid divide-by-zero in regex_selectivity() with long fixed pref