This patch is aimed to fix the case-insentivity for the LIKE
operator, which currently works only for latin-1 ASCII
sybmbols. The patch now supports case-insensitivity for the
Cyrillic, Latin and Greek alphabets, as well as other
individual symbols (such as umlauts in German). Support for
other languages can be added easily.  I think that a part of
the documentation can safely be deleted, namely: (A bug:
SQLite only understands upper/lower case for 7-bit Latin
characters. Hence the LIKE operator is case sensitive for
8-bit iso8859 characters or UTF-8 characters. For example,
the expression 'a' LIKE 'A' is TRUE but 'æ' LIKE
'Æ' is FALSE.).

Here's the patch against the current CVS:


diff -ur sqlite/src/func.c sqlite-local/src/func.c
--- sqlite/src/func.c   2005-12-09 22:02:05.000000000 +0200
+++ sqlite-local/src/func.c     2006-01-06 21:56:19.000000000
+0200
@@ -363,10 +363,10 @@
   const struct compareInfo *pInfo, /* Information about how
to do the compare */
   const int esc                    /* The escape character
*/
 ){
-  register int c;
+  unsigned register int c;
   int invert;
   int seen;
-  int c2;
+  unsigned int c2;
   u8 matchOne = pInfo->matchOne;
   u8 matchAll = pInfo->matchAll;
   u8 matchSet = pInfo->matchSet;
@@ -375,17 +375,20 @@

   while( (c = *zPattern)!=0 ){
     if( !prevEscape && c==matchAll ){
+      u8 *ptr_c = &zPattern[1];
       while( (c=zPattern[1]) == matchAll || c == matchOne
){
         if( c==matchOne ){
           if( *zString==0 ) return 0;
           sqliteNextChar(zString);
         }
         zPattern++;
+        ptr_c++;
       }
       if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
         u8 const *zTemp = &zPattern[1];
         sqliteNextChar(zTemp);
         c = *zTemp;
+        ptr_c = zTemp;
       }
       if( c==0 ) return 1;
       if( c==matchSet ){
@@ -397,9 +400,15 @@
       }else{
         while( (c2 = *zString)!=0 ){
           if( noCase ){
-            c2 = sqlite3UpperToLower[c2];
-            c = sqlite3UpperToLower[c];
-            while( c2 != 0 && c2 != c ){ c2 =
sqlite3UpperToLower[*++zString]; }
+            c2 = sqliteCharVal(zString);
+            if ( c2 <= UpperToLowerMaxChar ) c2 =
sqlite3UpperToLower[ c2 ];
+            c = sqliteCharVal(ptr_c);
+            if ( c <= UpperToLowerMaxChar ) c =
sqlite3UpperToLower[ c ];
+            while( c2 != 0 && c2 != c ) {
+              sqliteNextChar(zString);
+              c2 = sqliteCharVal(zString);
+              if ( c2 <= UpperToLowerMaxChar ) c2 =
sqlite3UpperToLower[ c2 ];
+            }
           }else{
             while( c2 != 0 && c2 != c ){ c2 = *++zString; }
           }
@@ -448,12 +457,18 @@
       sqliteNextChar(zPattern);
     }else{
       if( noCase ){
-        if( sqlite3UpperToLower[c] !=
sqlite3UpperToLower[*zString] ) return 0;
+        c = sqliteCharVal(zPattern);
+        if ( c <= UpperToLowerMaxChar ) c =
sqlite3UpperToLower[ c ];
+        c2 = sqliteCharVal(zString);
+        if ( c2 <= UpperToLowerMaxChar ) c2 =
sqlite3UpperToLower[ c2 ];
+        if( c != c2 ) return 0;
+        sqliteNextChar(zPattern);
+        sqliteNextChar(zString);
       }else{
         if( c != *zString ) return 0;
+        zPattern++;
+        zString++;
       }
-      zPattern++;
-      zString++;
       prevEscape = 0;
     }
   }
Only in sqlite-local/src: func.c~
diff -ur sqlite/src/sqliteInt.h sqlite-local/src/sqliteInt.h
--- sqlite/src/sqliteInt.h      2006-01-06 19:56:56.000000000
+0200
+++ sqlite-local/src/sqliteInt.h        2006-01-06
20:56:37.000000000 +0200
@@ -1693,7 +1693,8 @@
 char *sqlite3utf16to8(const void*, int);
 int sqlite3ValueFromExpr(Expr *, u8, u8, sqlite3_value **);
 void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
-extern const unsigned char sqlite3UpperToLower[];
+extern const unsigned int UpperToLowerMaxChar;
+extern const unsigned int sqlite3UpperToLower[];
 void sqlite3RootPageMoved(Db*, int, int);
 void sqlite3Reindex(Parse*, Token*, Token*);
 void sqlite3AlterFunctions(sqlite3*);
diff -ur sqlite/src/util.c sqlite-local/src/util.c
--- sqlite/src/util.c   2006-01-06 19:57:04.000000000 +0200
+++ sqlite-local/src/util.c     2006-01-06 21:18:57.000000000
+0200
@@ -811,25 +811,76 @@
   }
 }

+const unsigned int UpperToLowerMaxChar = 1103;
 /* An array to map all upper-case characters into their
corresponding
 ** lower-case character.
 */
-const unsigned char sqlite3UpperToLower[] = {
-      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
13, 14, 15, 16, 17,
-     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35,
-     36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53,
-     54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98,
99,100,101,102,103,
-   
104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
-    122, 91, 92, 93, 94, 95, 96, 97, 98,
99,100,101,102,103,104,105,106,107,
-   
108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
-   
126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
-   
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
-   
162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
-   
180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
-   
198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
-   
216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
-   
234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
-    252,253,254,255
+const unsigned int sqlite3UpperToLower[] = {
+  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
+  17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+  34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+  51,52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,
+ 
100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,
+ 
117,118,119,120,121,122,91,92,93,94,95,96,97,98,99,100,101,
+ 
102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,
+ 
119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,
+ 
136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,
+ 
153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
+ 
170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,
+ 
187,188,189,190,191,224,225,226,227,228,229,230,231,232,233,234,235,
+ 
236,237,238,239,240,241,242,243,244,245,246,215,248,249,250,251,252,
+ 
253,254,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,
+ 
238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,
+ 
255,257,257,259,259,261,261,263,263,265,265,267,267,269,269,271,271,
+ 
273,273,275,275,277,277,279,279,281,281,283,283,285,285,287,287,289,
+ 
289,291,291,293,293,295,295,297,297,299,299,301,301,303,303,305,305,
+ 
307,307,309,309,311,311,313,313,315,315,317,317,319,319,321,321,323,
+ 
323,325,325,327,327,328,329,331,331,333,333,335,335,337,337,339,339,
+ 
341,341,343,343,345,345,347,347,349,349,351,351,353,353,355,355,357,
+ 
357,359,359,361,361,363,363,365,365,367,367,369,369,371,371,373,373,
+ 
375,375,376,378,378,380,380,382,382,383,384,385,386,387,388,389,390,
+ 
391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,
+ 
408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,
+ 
425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,
+ 
442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,
+ 
459,460,462,462,464,464,466,466,468,468,469,470,471,472,473,474,475,
+ 
476,477,478,479,480,481,483,483,484,485,486,487,488,489,491,491,493,
+ 
493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,
+ 
510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,
+ 
527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,
+ 
544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,
+ 
561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,
+ 
578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,
+ 
595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,
+ 
612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,
+ 
629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,
+ 
646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,
+ 
663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,
+ 
680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,
+ 
697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,
+ 
714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,
+ 
731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,
+ 
748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,
+ 
765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,
+ 
782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,
+ 
799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,
+ 
816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,
+ 
833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,
+ 
850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,
+ 
867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,
+ 
884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,
+ 
901,902,903,904,905,906,907,908,909,910,911,912,945,946,947,948,949,
+ 
950,951,952,953,954,955,956,957,958,959,960,961,930,963,964,965,966,
+ 
967,968,969,970,939,940,941,942,943,944,945,946,947,948,949,950,951,
+ 
952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,
+ 
969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,
+ 
986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,
+ 
1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,
+ 
1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,
+ 
1037,1038,1039,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,
+ 
1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,
+ 
1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,
+ 
1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104
 };
 #define UpperToLower sqlite3UpperToLower


-----------------------------

Търсите нов, високопроходим автомобил на цената на лека кола?
http://www.landwind-bg.com/

Reply via email to