Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita2f17f0

Browse files
committed
Control collation behavior with a method table.
Previously, behavior branched based on the provider. A method table isless error-prone and more flexible.The ctype behavior will be addressed in an upcoming commit.Reviewed-by: Andreas KarlssonDiscussion:https://postgr.es/m/2830211e1b6e6a2e26d845780b03e125281ea17b.camel%40j-davis.com
1 parent4f5cef2 commita2f17f0

File tree

4 files changed

+180
-176
lines changed

4 files changed

+180
-176
lines changed

‎src/backend/utils/adt/pg_locale.c

Lines changed: 16 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -92,27 +92,12 @@ extern char *get_collation_actual_version_builtin(const char *collcollate);
9292
/* pg_locale_icu.c */
9393
#ifdefUSE_ICU
9494
externUCollator*pg_ucol_open(constchar*loc_str);
95-
externintstrncoll_icu(constchar*arg1,ssize_tlen1,
96-
constchar*arg2,ssize_tlen2,
97-
pg_locale_tlocale);
98-
externsize_tstrnxfrm_icu(char*dest,size_tdestsize,
99-
constchar*src,ssize_tsrclen,
100-
pg_locale_tlocale);
101-
externsize_tstrnxfrm_prefix_icu(char*dest,size_tdestsize,
102-
constchar*src,ssize_tsrclen,
103-
pg_locale_tlocale);
10495
externchar*get_collation_actual_version_icu(constchar*collcollate);
10596
#endif
10697
externpg_locale_tcreate_pg_locale_icu(Oidcollid,MemoryContextcontext);
10798

10899
/* pg_locale_libc.c */
109100
externpg_locale_tcreate_pg_locale_libc(Oidcollid,MemoryContextcontext);
110-
externintstrncoll_libc(constchar*arg1,ssize_tlen1,
111-
constchar*arg2,ssize_tlen2,
112-
pg_locale_tlocale);
113-
externsize_tstrnxfrm_libc(char*dest,size_tdestsize,
114-
constchar*src,ssize_tsrclen,
115-
pg_locale_tlocale);
116101
externchar*get_collation_actual_version_libc(constchar*collcollate);
117102

118103
externsize_tstrlower_builtin(char*dst,size_tdstsize,constchar*src,
@@ -1244,6 +1229,9 @@ create_pg_locale(Oid collid, MemoryContext context)
12441229

12451230
result->is_default= false;
12461231

1232+
Assert((result->collate_is_c&&result->collate==NULL)||
1233+
(!result->collate_is_c&&result->collate!=NULL));
1234+
12471235
datum=SysCacheGetAttr(COLLOID,tp,Anum_pg_collation_collversion,
12481236
&isnull);
12491237
if (!isnull)
@@ -1467,19 +1455,7 @@ pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen,
14671455
int
14681456
pg_strcoll(constchar*arg1,constchar*arg2,pg_locale_tlocale)
14691457
{
1470-
intresult;
1471-
1472-
if (locale->provider==COLLPROVIDER_LIBC)
1473-
result=strncoll_libc(arg1,-1,arg2,-1,locale);
1474-
#ifdefUSE_ICU
1475-
elseif (locale->provider==COLLPROVIDER_ICU)
1476-
result=strncoll_icu(arg1,-1,arg2,-1,locale);
1477-
#endif
1478-
else
1479-
/* shouldn't happen */
1480-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1481-
1482-
returnresult;
1458+
returnlocale->collate->strncoll(arg1,-1,arg2,-1,locale);
14831459
}
14841460

14851461
/*
@@ -1500,51 +1476,25 @@ int
15001476
pg_strncoll(constchar*arg1,ssize_tlen1,constchar*arg2,ssize_tlen2,
15011477
pg_locale_tlocale)
15021478
{
1503-
intresult;
1504-
1505-
if (locale->provider==COLLPROVIDER_LIBC)
1506-
result=strncoll_libc(arg1,len1,arg2,len2,locale);
1507-
#ifdefUSE_ICU
1508-
elseif (locale->provider==COLLPROVIDER_ICU)
1509-
result=strncoll_icu(arg1,len1,arg2,len2,locale);
1510-
#endif
1511-
else
1512-
/* shouldn't happen */
1513-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1514-
1515-
returnresult;
1479+
returnlocale->collate->strncoll(arg1,len1,arg2,len2,locale);
15161480
}
15171481

15181482
/*
15191483
* Return true if the collation provider supports pg_strxfrm() and
15201484
* pg_strnxfrm(); otherwise false.
15211485
*
1522-
* Unfortunately, it seems that strxfrm() for non-C collations is broken on
1523-
* many common platforms; testing of multiple versions of glibc reveals that,
1524-
* for many locales, strcoll() and strxfrm() do not return consistent
1525-
* results. While no other libc other than Cygwin has so far been shown to
1526-
* have a problem, we take the conservative course of action for right now and
1527-
* disable this categorically. (Users who are certain this isn't a problem on
1528-
* their system can define TRUST_STRXFRM.)
15291486
*
15301487
* No similar problem is known for the ICU provider.
15311488
*/
15321489
bool
15331490
pg_strxfrm_enabled(pg_locale_tlocale)
15341491
{
1535-
if (locale->provider==COLLPROVIDER_LIBC)
1536-
#ifdefTRUST_STRXFRM
1537-
return true;
1538-
#else
1539-
return false;
1540-
#endif
1541-
elseif (locale->provider==COLLPROVIDER_ICU)
1542-
returntrue;
1543-
else
1544-
/* shouldn't happen */
1545-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1546-
1547-
return false;/* keep compiler quiet */
1492+
/*
1493+
* locale->collate->strnxfrm is still a required method, even if it may
1494+
* have the wrong behavior, because the planner uses it for estimates in
1495+
* some cases.
1496+
*/
1497+
returnlocale->collate->strxfrm_is_safe;
15481498
}
15491499

15501500
/*
@@ -1555,19 +1505,7 @@ pg_strxfrm_enabled(pg_locale_t locale)
15551505
size_t
15561506
pg_strxfrm(char*dest,constchar*src,size_tdestsize,pg_locale_tlocale)
15571507
{
1558-
size_tresult=0;/* keep compiler quiet */
1559-
1560-
if (locale->provider==COLLPROVIDER_LIBC)
1561-
result=strnxfrm_libc(dest,destsize,src,-1,locale);
1562-
#ifdefUSE_ICU
1563-
elseif (locale->provider==COLLPROVIDER_ICU)
1564-
result=strnxfrm_icu(dest,destsize,src,-1,locale);
1565-
#endif
1566-
else
1567-
/* shouldn't happen */
1568-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1569-
1570-
returnresult;
1508+
returnlocale->collate->strnxfrm(dest,destsize,src,-1,locale);
15711509
}
15721510

15731511
/*
@@ -1593,19 +1531,7 @@ size_t
15931531
pg_strnxfrm(char*dest,size_tdestsize,constchar*src,ssize_tsrclen,
15941532
pg_locale_tlocale)
15951533
{
1596-
size_tresult=0;/* keep compiler quiet */
1597-
1598-
if (locale->provider==COLLPROVIDER_LIBC)
1599-
result=strnxfrm_libc(dest,destsize,src,srclen,locale);
1600-
#ifdefUSE_ICU
1601-
elseif (locale->provider==COLLPROVIDER_ICU)
1602-
result=strnxfrm_icu(dest,destsize,src,srclen,locale);
1603-
#endif
1604-
else
1605-
/* shouldn't happen */
1606-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1607-
1608-
returnresult;
1534+
returnlocale->collate->strnxfrm(dest,destsize,src,srclen,locale);
16091535
}
16101536

16111537
/*
@@ -1615,15 +1541,7 @@ pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen,
16151541
bool
16161542
pg_strxfrm_prefix_enabled(pg_locale_tlocale)
16171543
{
1618-
if (locale->provider==COLLPROVIDER_LIBC)
1619-
return false;
1620-
elseif (locale->provider==COLLPROVIDER_ICU)
1621-
return true;
1622-
else
1623-
/* shouldn't happen */
1624-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1625-
1626-
return false;/* keep compiler quiet */
1544+
return (locale->collate->strnxfrm_prefix!=NULL);
16271545
}
16281546

16291547
/*
@@ -1635,7 +1553,7 @@ size_t
16351553
pg_strxfrm_prefix(char*dest,constchar*src,size_tdestsize,
16361554
pg_locale_tlocale)
16371555
{
1638-
returnpg_strnxfrm_prefix(dest,destsize,src,-1,locale);
1556+
returnlocale->collate->strnxfrm_prefix(dest,destsize,src,-1,locale);
16391557
}
16401558

16411559
/*
@@ -1660,16 +1578,7 @@ size_t
16601578
pg_strnxfrm_prefix(char*dest,size_tdestsize,constchar*src,
16611579
ssize_tsrclen,pg_locale_tlocale)
16621580
{
1663-
size_tresult=0;/* keep compiler quiet */
1664-
1665-
#ifdefUSE_ICU
1666-
if (locale->provider==COLLPROVIDER_ICU)
1667-
result=strnxfrm_prefix_icu(dest,destsize,src,-1,locale);
1668-
else
1669-
#endif
1670-
PGLOCALE_SUPPORT_ERROR(locale->provider);
1671-
1672-
returnresult;
1581+
returnlocale->collate->strnxfrm_prefix(dest,destsize,src,srclen,locale);
16731582
}
16741583

16751584
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp