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:
Tom Lane 2011-04-08 17:39:59 -04:00
parent cdcdfca401
commit 466dac8656

View File

@ -5436,7 +5436,8 @@ pattern_selectivity(Const *patt, Pattern_Type ptype)
* in the form of a Const node; else return NULL. * in the form of a Const node; else return NULL.
* *
* The caller must provide the appropriate "less than" comparison function * 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", * 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 * 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 */ /* If first time through, determine the suffix to use */
static char suffixchar = 0; static char suffixchar = 0;
static Oid suffixcollation = 0;
if (!suffixchar) if (!suffixchar || suffixcollation != ltproc->fn_collation)
{ {
char *best; char *best;
best = "Z"; 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"; 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"; 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"; best = "9";
suffixchar = *best; suffixchar = *best;
suffixcollation = ltproc->fn_collation;
} }
/* And build the string to compare to */ /* And build the string to compare to */