| This patch removes the usage of tolower() in fts code, which is not locale |
| neutral and causes problem in some locales such as Turkish. |
| See http://crbug.com/15261 for details. |
| An upstream ticket was also created for this issue: |
| http://www.sqlite.org/src/tktview/991789d9f3136a0460dc83a33e815c1aa9757c26 |
| |
| Index: ext/fts3/fts3.c |
| =================================================================== |
| --- ext/fts3/fts3.c 2009-09-04 13:37:41.000000000 -0700 |
| +++ ext/fts3/fts3.c 2009-09-14 18:17:45.000000000 -0700 |
| @@ -326,7 +326,7 @@ |
| return (c&0x80)==0 ? isspace(c) : 0; |
| } |
| static int safe_tolower(char c){ |
| - return (c&0x80)==0 ? tolower(c) : c; |
| + return (c>='A' && c<='Z') ? (c-'A'+'a') : c; |
| } |
| static int safe_isalnum(char c){ |
| return (c&0x80)==0 ? isalnum(c) : 0; |
| Index: ext/fts3/fts3_tokenizer1.c |
| =================================================================== |
| --- ext/fts3/fts3_tokenizer1.c 2009-09-03 13:32:06.000000000 -0700 |
| +++ ext/fts3/fts3_tokenizer1.c 2009-09-02 11:40:21.000000000 -0700 |
| @@ -191,7 +191,7 @@ |
| ** case-insensitivity. |
| */ |
| unsigned char ch = p[iStartOffset+i]; |
| - c->pToken[i] = ch<0x80 ? tolower(ch) : ch; |
| + c->pToken[i] = (ch>='A' && ch<='Z') ? (ch-'A'+'a') : ch; |
| } |
| *ppToken = c->pToken; |
| *pnBytes = n; |
| Index: ext/fts1/simple_tokenizer.c |
| =================================================================== |
| --- ext/fts1/simple_tokenizer.c 2009-09-03 13:32:06.000000000 -0700 |
| +++ ext/fts1/simple_tokenizer.c 2009-09-02 11:40:21.000000000 -0700 |
| @@ -138,7 +138,7 @@ |
| ** case-insensitivity. |
| */ |
| char ch = c->pCurrent[ii]; |
| - c->zToken[ii] = (unsigned char)ch<0x80 ? tolower(ch) : ch; |
| + c->zToken[ii] = ((ch>='A' && ch<='Z') ? (ch-'A'+'a') : ch); |
| } |
| c->zToken[n] = '\0'; |
| *ppToken = c->zToken; |
| Index: ext/fts1/fts1_tokenizer1.c |
| =================================================================== |
| --- ext/fts1/fts1_tokenizer1.c 2009-09-03 13:32:06.000000000 -0700 |
| +++ ext/fts1/fts1_tokenizer1.c 2009-09-02 11:40:21.000000000 -0700 |
| @@ -182,7 +182,7 @@ |
| ** case-insensitivity. |
| */ |
| unsigned char ch = p[iStartOffset+i]; |
| - c->pToken[i] = ch<0x80 ? tolower(ch) : ch; |
| + c->pToken[i] = (ch>='A' && ch<='Z') ? (ch-'A'+'a') : ch; |
| } |
| *ppToken = c->pToken; |
| *pnBytes = n; |
| Index: ext/fts1/fts1.c |
| =================================================================== |
| --- ext/fts1/fts1.c 2009-09-04 13:37:41.000000000 -0700 |
| +++ ext/fts1/fts1.c 2009-09-14 18:16:55.000000000 -0700 |
| @@ -208,7 +208,7 @@ |
| return (c&0x80)==0 ? isspace(c) : 0; |
| } |
| static int safe_tolower(char c){ |
| - return (c&0x80)==0 ? tolower(c) : c; |
| + return (c>='A' && c<='Z') ? (c-'A'+'a') : c; |
| } |
| static int safe_isalnum(char c){ |
| return (c&0x80)==0 ? isalnum(c) : 0; |
| Index: ext/fts2/fts2.c |
| =================================================================== |
| --- ext/fts2/fts2.c 2009-09-04 13:37:41.000000000 -0700 |
| +++ ext/fts2/fts2.c 2009-09-14 18:17:02.000000000 -0700 |
| @@ -372,7 +372,7 @@ |
| return (c&0x80)==0 ? isspace(c) : 0; |
| } |
| static int safe_tolower(char c){ |
| - return (c&0x80)==0 ? tolower(c) : c; |
| + return (c>='A' && c<='Z') ? (c-'A'+'a') : c; |
| } |
| static int safe_isalnum(char c){ |
| return (c&0x80)==0 ? isalnum(c) : 0; |
| Index: ext/fts2/fts2_tokenizer1.c |
| =================================================================== |
| --- ext/fts2/fts2_tokenizer1.c 2009-09-03 13:32:06.000000000 -0700 |
| +++ ext/fts2/fts2_tokenizer1.c 2009-09-02 11:40:21.000000000 -0700 |
| @@ -191,7 +191,7 @@ |
| ** case-insensitivity. |
| */ |
| unsigned char ch = p[iStartOffset+i]; |
| - c->pToken[i] = ch<0x80 ? tolower(ch) : ch; |
| + c->pToken[i] = (ch>='A' && ch<='Z') ? (ch-'A'+'a') : ch; |
| } |
| *ppToken = c->pToken; |
| *pnBytes = n; |