locale = pg_newlocale_from_collation(DEFAULT_COLLATION_OID);
INIT_TRADITIONAL_CRC32(crc);
- while (size > 0)
+ if (locale->ctype_is_c)
+ {
+ while (size > 0)
+ {
+ char c = pg_ascii_tolower(*p);
+
+ COMP_TRADITIONAL_CRC32(crc, &c, 1);
+ size--;
+ p++;
+ }
+ }
+ else
{
- char foldstr[UNICODE_CASEMAP_BUFSZ];
- int srclen = pg_mblen(p);
- size_t foldlen;
+ while (size > 0)
+ {
+ char foldstr[UNICODE_CASEMAP_BUFSZ];
+ int srclen = pg_mblen(p);
+ size_t foldlen;
- /* fold one codepoint at a time */
- foldlen = pg_strfold(foldstr, UNICODE_CASEMAP_BUFSZ, p, srclen,
- locale);
+ /* fold one codepoint at a time */
+ foldlen = pg_strfold(foldstr, UNICODE_CASEMAP_BUFSZ, p, srclen,
+ locale);
- COMP_TRADITIONAL_CRC32(crc, foldstr, foldlen);
+ COMP_TRADITIONAL_CRC32(crc, foldstr, foldlen);
- size -= srclen;
- p += srclen;
+ size -= srclen;
+ p += srclen;
+ }
}
FIN_TRADITIONAL_CRC32(crc);
return (unsigned int) crc;
static pg_locale_t locale = NULL;
size_t al_sz = a_sz + 1;
size_t al_len;
- char *al = palloc(al_sz);
+ char *al;
size_t bl_sz = b_sz + 1;
size_t bl_len;
- char *bl = palloc(bl_sz);
+ char *bl;
bool res;
if (!locale)
locale = pg_newlocale_from_collation(DEFAULT_COLLATION_OID);
+ if (locale->ctype_is_c)
+ {
+ if (a_sz > b_sz)
+ return false;
+
+ for (int i = 0; i < a_sz; i++)
+ {
+ if (pg_ascii_tolower(a[i]) != pg_ascii_tolower(b[i]))
+ return false;
+ }
+
+ return true;
+ }
+
+ al = palloc(al_sz);
+ bl = palloc(bl_sz);
+
/* casefold both a and b */
al_len = pg_strfold(al, al_sz, a, a_sz, locale);