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/