On Mon, Jun 12, 2017 at 10:08 AM, Ashutosh Sharma <ashu.coek88@gmail.com> wrote:
> PFA patch that fixes the issue described in above thread. As mentioned
> in the above thread, the crash is basically happening in varstr_cmp()
> function and it's only happening on Windows because in varstr_cmp(),
> if the collation provider is ICU, we don't even think of calling ICU
> functions to compare the string. Infact, we directly attempt to call
> the OS function wsccoll*() which is not expected. Thanks.
>
Your analysis is right, basically, when ICU is enabled we need to use
ICU related functions and use corresponding information in the
pg_locale structure. However, I see few problems with your patch.
+ if (mylocale)
+ {
+ if (mylocale->provider == COLLPROVIDER_ICU)
+ {
+#ifdef USE_ICU
+#ifdef HAVE_UCOL_STRCOLLUTF8
+ if (GetDatabaseEncoding() == PG_UTF8)
+ {
+ UErrorCode status;
+
+ status = U_ZERO_ERROR;
+ result = ucol_strcollUTF8(mylocale->info.icu.ucol,
+ arg1, len1,
+ arg2, len2,
+ &status);
On Windows, we need to map UTF-8 strings to UTF-16 as we are doing in
this function for other Windows specific comparisons for UTF-8
strings. Also, we don't want to screw memcmp optimization we have in
this function, so do this ICU specific checking after memcmp check.
--
With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com