]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid collation lookup failure when considering a "char" column.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 28 Jun 2026 16:31:29 +0000 (12:31 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 28 Jun 2026 16:31:29 +0000 (12:31 -0400)
If a "char" column has a statistics histogram, scalarineqsel()
would fail with "cache lookup failed for collation 0".  Avoid
the failing lookup by acting as though the collation is "C".

Prior to commit 06421b084, this code didn't fail because
lc_collate_is_c() intentionally didn't spit up on InvalidOid.
It did act differently though: it would take the non-C-collation
code path and hence apply strxfrm using libc's prevailing locale.
But that seems like the wrong thing for a non-collatable comparison,
so let's not resurrect that aspect.

Author: Feng Wu <wufengwufengwufeng@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CACK3muq6s-O1Wc3w4dRL1Fe8YQ-Fz1zJbezeQwhuLgNxGNEFiA@mail.gmail.com
Backpatch-through: 18

src/backend/utils/adt/selfuncs.c

index c9ff71844e70ef33fc82ab4eb01f860154f2b676..9a6effe206fbef360fb1e1d5e731a4c28d5ba221 100644 (file)
@@ -4956,6 +4956,14 @@ convert_string_datum(Datum value, Oid typid, Oid collid, bool *failure)
                        return NULL;
        }
 
+       /*
+        * If we don't have a collation, act as though it's "C".  This would
+        * normally happen only for the "char" type, but perhaps there are other
+        * cases.
+        */
+       if (!OidIsValid(collid))
+               return val;
+
        mylocale = pg_newlocale_from_collation(collid);
 
        if (!mylocale->collate_is_c)