mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-09 08:10:09 +08:00
Fix make_greater_string to not have an undocumented collation assumption.
The previous coding worked only if ltproc->fn_collation was always either DEFAULT_COLLATION_OID or a C-compatible locale. While that's true at the moment, it wasn't documented (and in fact wasn't true when this code was committed...). But it only takes a couple more lines to make its internal caching behavior locale-aware, so let's do that.
This commit is contained in:
parent
cdcdfca401
commit
466dac8656
@ -5436,7 +5436,8 @@ pattern_selectivity(Const *patt, Pattern_Type ptype)
|
||||
* in the form of a Const node; else return NULL.
|
||||
*
|
||||
* The caller must provide the appropriate "less than" comparison function
|
||||
* for testing the strings.
|
||||
* for testing the strings. In particular, ltproc->fn_collation specifies
|
||||
* the locale for comparisons.
|
||||
*
|
||||
* The key requirement here is that given a prefix string, say "foo",
|
||||
* we must be able to generate another string "fop" that is greater than
|
||||
@ -5504,19 +5505,21 @@ make_greater_string(const Const *str_const, FmgrInfo *ltproc)
|
||||
{
|
||||
/* If first time through, determine the suffix to use */
|
||||
static char suffixchar = 0;
|
||||
static Oid suffixcollation = 0;
|
||||
|
||||
if (!suffixchar)
|
||||
if (!suffixchar || suffixcollation != ltproc->fn_collation)
|
||||
{
|
||||
char *best;
|
||||
|
||||
best = "Z";
|
||||
if (varstr_cmp(best, 1, "z", 1, DEFAULT_COLLATION_OID) < 0)
|
||||
if (varstr_cmp(best, 1, "z", 1, ltproc->fn_collation) < 0)
|
||||
best = "z";
|
||||
if (varstr_cmp(best, 1, "y", 1, DEFAULT_COLLATION_OID) < 0)
|
||||
if (varstr_cmp(best, 1, "y", 1, ltproc->fn_collation) < 0)
|
||||
best = "y";
|
||||
if (varstr_cmp(best, 1, "9", 1, DEFAULT_COLLATION_OID) < 0)
|
||||
if (varstr_cmp(best, 1, "9", 1, ltproc->fn_collation) < 0)
|
||||
best = "9";
|
||||
suffixchar = *best;
|
||||
suffixcollation = ltproc->fn_collation;
|
||||
}
|
||||
|
||||
/* And build the string to compare to */
|
||||
|
Loading…
Reference in New Issue
Block a user