summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2005-10-14 13:57:38 +0500
committerunknown <bar@mysql.com>2005-10-14 13:57:38 +0500
commit05414133afc010aa4f9b3fb36a9b37212a560c39 (patch)
tree627bcf624588d44b6b35ee7312fed398e5da098c /strings
parent154434ae787220bd42edbc1f9adc443d15035e85 (diff)
parent9cc7d75ea3acf8cf2f2491e8740d48f83cf0c47b (diff)
downloadmariadb-git-05414133afc010aa4f9b3fb36a9b37212a560c39.tar.gz
Merge mysql.com:/usr/home/bar/mysql-4.1.b13145
into mysql.com:/usr/home/bar/mysql-4.1 mysql-test/r/ctype_latin1.result: Auto merged mysql-test/t/ctype_latin1.test: Auto merged
Diffstat (limited to 'strings')
-rw-r--r--strings/ctype-big5.c36
-rw-r--r--strings/ctype-cp932.c11
-rw-r--r--strings/ctype-gbk.c15
-rw-r--r--strings/ctype-mb.c17
-rw-r--r--strings/ctype-simple.c11
-rw-r--r--strings/ctype-sjis.c11
-rw-r--r--strings/ctype-tis620.c73
-rw-r--r--strings/ctype-ucs2.c6
-rw-r--r--strings/my_strtoll10.c9
-rw-r--r--strings/xml.c2
10 files changed, 58 insertions, 133 deletions
diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c
index 76a4e197405..e15554fa576 100644
--- a/strings/ctype-big5.c
+++ b/strings/ctype-big5.c
@@ -392,16 +392,12 @@ static my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)),
uint res_length, char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
- const char *end;
+ const char *end= ptr + ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
- uint charlen= my_charpos(cs, ptr, ptr+ptr_length, res_length/cs->mbmaxlen);
+ uint charlen= res_length / cs->mbmaxlen;
- if (charlen < ptr_length)
- ptr_length= charlen;
- end= ptr + ptr_length;
-
- for (; ptr != end && min_str != min_end ; ptr++)
+ for (; ptr != end && min_str != min_end && charlen > 0; ptr++, charlen--)
{
if (ptr+1 != end && isbig5code(ptr[0],ptr[1]))
{
@@ -412,7 +408,10 @@ static my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)),
if (*ptr == escape && ptr+1 != end)
{
ptr++; /* Skip escape */
- *min_str++= *max_str++ = *ptr;
+ if (isbig5code(ptr[0], ptr[1]))
+ *min_str++= *max_str++ = *ptr++;
+ if (min_str < min_end)
+ *min_str++= *max_str++= *ptr;
continue;
}
if (*ptr == w_one) /* '_' in SQL */
@@ -1696,7 +1695,7 @@ static uint16 tab_big5_uni0[]={
0x2467,0x2468,0x2469,0x2474,0x2475,0x2476,0x2477,0x2478,
0x2479,0x247A,0x247B,0x247C,0x247D};
-/* page 1 0xC940-0xF9D5 */
+/* page 1 0xC940-0xF9DC */
static uint16 tab_big5_uni1[]={
0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C,0x4E47,
0x4E8D,0x56D7,0xFA0C,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E,
@@ -3252,12 +3251,13 @@ static uint16 tab_big5_uni1[]={
0x9E17,0x9F48,0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482,
0x9480,0x9481,0x9A69,0x9A68,0x9B2E,0x9E19,0x7229,0x864B,
0x8B9F,0x9483,0x9C79,0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D,
-0x7069,0x706A,0x9EA4,0x9F7E,0x9F49,0x9F98};
+0x7069,0x706A,0x9EA4,0x9F7E,0x9F49,0x9F98,0x7881,0x92B9,
+0x88CF,0x58BB,0x6052,0x7CA7,0x5AFA};
static int func_big5_uni_onechar(int code){
if ((code>=0xA140)&&(code<=0xC7FC))
return(tab_big5_uni0[code-0xA140]);
- if ((code>=0xC940)&&(code<=0xF9D5))
+ if ((code>=0xC940)&&(code<=0xF9DC))
return(tab_big5_uni1[code-0xC940]);
return(0);
}
@@ -3886,7 +3886,7 @@ static uint16 tab_uni_big57[]={
0xE54D,0xE552, 0,0xE54E, 0,0xE551,0xBC5C, 0,
0xBEA5,0xBC5B, 0,0xE54A,0xE550, 0,0xBC5A,0xE54F,
0,0xE54C, 0,0xBC58, 0, 0, 0, 0,
- 0, 0,0xE94D, 0,0xE94F,0xE94A,0xBEC1,0xE94C,
+ 0, 0,0xE94D,0xF9D9,0xE94F,0xE94A,0xBEC1,0xE94C,
0,0xBEC0,0xE94E, 0, 0,0xBEC3,0xE950,0xBEC2,
0xE949,0xE94B, 0, 0, 0, 0,0xC0A5,0xECCC,
0,0xC0A4,0xECCD,0xC0A3,0xECCB,0xC0A2,0xECCA, 0,
@@ -3958,7 +3958,7 @@ static uint16 tab_uni_big57[]={
0xE175,0xB9DE,0xE174,0xB9E4, 0,0xE16D,0xB9DF, 0,
0xE17B,0xB9E0,0xE16F,0xE172,0xE177,0xE171,0xE16C, 0,
0, 0, 0,0xE173,0xE555,0xBC61,0xE558,0xE557,
-0xE55A,0xE55C, 0,0xBC5F, 0,0xE556, 0,0xE554,
+0xE55A,0xE55C,0xF9DC,0xBC5F, 0,0xE556, 0,0xE554,
0,0xE55D,0xE55B,0xE559, 0,0xE55F, 0,0xE55E,
0xBC63,0xBC5E, 0,0xBC60,0xBC62, 0, 0,0xE560,
0xE957, 0, 0,0xE956,0xE955, 0,0xE958,0xE951,
@@ -4129,7 +4129,7 @@ static uint16 tab_uni_big57[]={
0,0xCEC0, 0, 0, 0, 0, 0, 0,
0xCECA,0xD1A1,0xCECB,0xABEE,0xCECE,0xCEC4,0xABED,0xCEC6,
0,0xCEC7, 0, 0,0xCEC9,0xABE9, 0, 0,
-0xAEA3, 0, 0,0xCEC5,0xCEC1,0xAEA4, 0, 0,
+0xAEA3, 0,0xF9DA,0xCEC5,0xCEC1,0xAEA4, 0, 0,
0xCECF,0xAE7E,0xD17D,0xCEC8, 0,0xD17C,0xCEC3,0xCECC,
0, 0,0xABEC,0xAEA1,0xABF2,0xAEA2,0xCED0,0xD17E,
0xABEB,0xAEA6,0xABF1,0xABF0,0xABEF,0xAEA5,0xCED1,0xAEA7,
@@ -4903,7 +4903,7 @@ static uint16 tab_uni_big57[]={
0xDACF,0xDACE,0xDACB,0xB2B8,0xB577,0xDAC9,0xDACC,0xB578,
0xDACD,0xDACA, 0, 0, 0, 0, 0, 0,
0,0xDEEE, 0,0xDEF2,0xB84E, 0,0xE2F0,0xB851,
-0xDEF0, 0, 0,0xDEED,0xDEE8,0xDEEA,0xDEEB,0xDEE4,
+0xDEF0,0xF9D6, 0,0xDEED,0xDEE8,0xDEEA,0xDEEB,0xDEE4,
0,0xB84D, 0, 0,0xB84C, 0,0xB848,0xDEE7,
0,0xB84F, 0,0xB850,0xDEE6,0xDEE9,0xDEF1,0xB84A,
0xB84B,0xDEEF,0xDEE5, 0, 0, 0,0xE2F2,0xBAD0,
@@ -5035,7 +5035,7 @@ static uint16 tab_uni_big57[]={
0xD34D,0xAFBB,0xD34B, 0,0xD34C,0xD34E, 0, 0,
0,0xD34A,0xB2C9, 0,0xD6DE,0xB2CB,0xD6E0,0xB2CA,
0xD6DF, 0, 0, 0, 0, 0,0xDAE8,0xB5AF,
- 0,0xDAEA,0xDAE7,0xD6E1, 0,0xB5B0, 0, 0,
+ 0,0xDAEA,0xDAE7,0xD6E1, 0,0xB5B0, 0,0xF9DB,
0xDAE9, 0, 0, 0, 0, 0, 0,0xDF56,
0,0xB864,0xDF54,0xB865,0xDF55,0xB866, 0, 0,
0,0xBAE9,0xE361,0xE35E,0xE360,0xBAEA,0xBAEB,0xE35F,
@@ -5424,7 +5424,7 @@ static uint16 tab_uni_big57[]={
0,0xB5F6,0xDBCD, 0, 0, 0,0xDBC9,0xDBCB,
0xDBC6,0xDBC5,0xDBC3, 0,0xDBCA,0xDBCC,0xDBC8, 0,
0xDBC7,0xB5F4,0xB5F5, 0, 0, 0, 0, 0,
- 0,0xDBCF,0xB8CD,0xDFF2,0xDFF8,0xDFF3,0xDFF4, 0,
+ 0,0xDBCF,0xB8CD,0xDFF2,0xDFF8,0xDFF3,0xDFF4,0xF9D8,
0xDFF9, 0,0xB8CF, 0,0xB8C7,0xB8CE,0xDFF1,0xDBC4,
0xB8CA,0xB8C8,0xDFF7,0xDFF6,0xB8C9,0xB8CB,0xDFF5,0xB8C6,
0,0xB8CC, 0, 0, 0, 0, 0,0xE3F6,
@@ -5742,7 +5742,7 @@ static uint16 tab_uni_big57[]={
0xE47B,0xE4AF,0xE4AC,0xE4A7,0xE477,0xE476,0xE4A1,0xE4B4,
0xBBCF,0xE4B7,0xE47D,0xE4A3,0xBE52, 0, 0, 0,
0, 0,0xBE5A,0xBE55,0xE8A4,0xE8A1,0xE867,0xBE50,
- 0, 0, 0,0xBE4F,0xBE56, 0, 0, 0,
+ 0,0xF9D7, 0,0xBE4F,0xBE56, 0, 0, 0,
0xE865,0xBE54,0xE871,0xE863,0xE864,0xBE4E,0xE8A3,0xBE58,
0xE874,0xE879,0xE873,0xEBEE,0xE86F,0xE877,0xE875,0xE868,
0xE862,0xE87D,0xBE57,0xE87E, 0,0xE878, 0,0xE86D,
diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c
index e476130b706..63f95a28037 100644
--- a/strings/ctype-cp932.c
+++ b/strings/ctype-cp932.c
@@ -322,16 +322,13 @@ static my_bool my_like_range_cp932(CHARSET_INFO *cs __attribute__((unused)),
uint res_length, char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
- const char *end;
+ const char *end= ptr + ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
- uint charlen= my_charpos(cs, ptr, ptr+ptr_length, res_length/cs->mbmaxlen);
+ uint charlen= res_length / cs->mbmaxlen;
- if (charlen < ptr_length)
- ptr_length= charlen;
- end= ptr + ptr_length;
-
- while (ptr < end && min_str < min_end) {
+ for ( ; ptr < end && min_str < min_end && charlen > 0 ; charlen--)
+ {
if (ismbchar_cp932(cs, ptr, end)) {
*min_str++ = *max_str++ = *ptr++;
if (min_str < min_end)
diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c
index 82c76b8ee96..b5b86984794 100644
--- a/strings/ctype-gbk.c
+++ b/strings/ctype-gbk.c
@@ -2705,16 +2705,12 @@ static my_bool my_like_range_gbk(CHARSET_INFO *cs __attribute__((unused)),
uint res_length, char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
- const char *end;
+ const char *end= ptr + ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
- uint charlen= my_charpos(cs, ptr, ptr+ptr_length, res_length/cs->mbmaxlen);
+ uint charlen= res_length / cs->mbmaxlen;
- if (charlen < ptr_length)
- ptr_length= charlen;
- end= ptr + ptr_length;
-
- for (; ptr != end && min_str != min_end ; ptr++)
+ for (; ptr != end && min_str != min_end && charlen > 0; ptr++, charlen--)
{
if (ptr+1 != end && isgbkcode(ptr[0],ptr[1]))
{
@@ -2725,7 +2721,10 @@ static my_bool my_like_range_gbk(CHARSET_INFO *cs __attribute__((unused)),
if (*ptr == escape && ptr+1 != end)
{
ptr++; /* Skip escape */
- *min_str++= *max_str++ = *ptr;
+ if (isgbkcode(ptr[0], ptr[1]))
+ *min_str++= *max_str++ = *ptr;
+ if (min_str < min_end)
+ *min_str++= *max_str++= *ptr;
continue;
}
if (*ptr == w_one) /* '_' in SQL */
diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c
index 4b22f158284..eb032759d25 100644
--- a/strings/ctype-mb.c
+++ b/strings/ctype-mb.c
@@ -502,17 +502,13 @@ my_bool my_like_range_mb(CHARSET_INFO *cs,
char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
- const char *end;
+ const char *end= ptr + ptr_length;
char *min_org= min_str;
char *min_end= min_str + res_length;
char *max_end= max_str + res_length;
- uint charlen= my_charpos(cs, ptr, ptr+ptr_length, res_length/cs->mbmaxlen);
+ uint charlen= res_length / cs->mbmaxlen;
- if (charlen < ptr_length)
- ptr_length= charlen;
- end= ptr + ptr_length;
-
- for (; ptr != end && min_str != min_end ; ptr++)
+ for (; ptr != end && min_str != min_end && charlen > 0 ; ptr++, charlen--)
{
if (*ptr == escape && ptr+1 != end)
{
@@ -522,14 +518,8 @@ my_bool my_like_range_mb(CHARSET_INFO *cs,
}
if (*ptr == w_one || *ptr == w_many) /* '_' and '%' in SQL */
{
- charlen= my_charpos(cs, min_org, min_str, res_length/cs->mbmaxlen);
-
- if (charlen < (uint) (min_str - min_org))
- min_str= min_org + charlen;
-
/* Write min key */
*min_length= (uint) (min_str - min_org);
- *max_length= res_length;
do
{
*min_str++= (char) cs->min_sort_char;
@@ -540,6 +530,7 @@ my_bool my_like_range_mb(CHARSET_INFO *cs,
representation of the max_sort_char character,
and copy it into max_str in a loop.
*/
+ *max_length= res_length;
pad_max_char(cs, max_str, max_end);
return 0;
}
diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c
index af673b78254..efddab621f2 100644
--- a/strings/ctype-simple.c
+++ b/strings/ctype-simple.c
@@ -997,17 +997,12 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
- const char *end;
+ const char *end= ptr + ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
-#ifdef USE_MB
- uint charlen= my_charpos(cs, ptr, ptr+ptr_length, res_length/cs->mbmaxlen);
- if (charlen < ptr_length)
- ptr_length= charlen;
-#endif
- end= ptr + ptr_length;
+ uint charlen= res_length / cs->mbmaxlen;
- for (; ptr != end && min_str != min_end ; ptr++)
+ for (; ptr != end && min_str != min_end && charlen > 0 ; ptr++, charlen--)
{
if (*ptr == escape && ptr+1 != end)
{
diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c
index 4342fc670df..da79f1796b8 100644
--- a/strings/ctype-sjis.c
+++ b/strings/ctype-sjis.c
@@ -322,16 +322,13 @@ static my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)),
uint res_length, char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
- const char *end;
+ const char *end= ptr + ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
- uint charlen= my_charpos(cs, ptr, ptr+ptr_length, res_length/cs->mbmaxlen);
+ uint charlen= res_length / cs->mbmaxlen;
- if (charlen < ptr_length)
- ptr_length= charlen;
- end= ptr + ptr_length;
-
- while (ptr < end && min_str < min_end) {
+ for ( ; ptr < end && min_str < min_end && charlen > 0 ; charlen--)
+ {
if (ismbchar_sjis(cs, ptr, end)) {
*min_str++ = *max_str++ = *ptr++;
if (min_str < min_end)
diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c
index 208168bb946..35cf10f1bcc 100644
--- a/strings/ctype-tis620.c
+++ b/strings/ctype-tis620.c
@@ -498,7 +498,7 @@ static uint thai2sortable(uchar *tstr, uint len)
l2bias use to control position weight of l2char
example (*=l2char) XX*X must come before X*XX
*/
- memcpy_overlap((char*) p, (char*) (p+1), tlen-1);
+ memmove((char*) p, (char*) (p+1), tlen-1);
tstr[len-1]= l2bias + t_ctype0[1]- L2_GARAN +1;
p--;
continue;
@@ -641,71 +641,6 @@ int my_strnxfrm_tis620(CHARSET_INFO *cs __attribute__((unused)),
}
-
-/*
- Convert SQL LIKE string to C string
-
- Arg: String, its length, escape character, resource length,
- minimal string and maximum string
- Ret: Always 0
-
- IMPLEMENTATION
- We just copy this function from opt_range.cc. No need to convert to
- thai2sortable string. min_str and max_str will be use for comparison and
- converted there.
-
- RETURN VALUES
- 0
-*/
-
-#define max_sort_chr ((char) 255)
-
-static
-my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)),
- const char *ptr, uint ptr_length,
- pbool escape, pbool w_one, pbool w_many,
- uint res_length, char *min_str, char *max_str,
- uint *min_length, uint *max_length)
-{
- const char *end=ptr+ptr_length;
- char *min_org=min_str;
- char *min_end=min_str+res_length;
-
- for (; ptr != end && min_str != min_end ; ptr++)
- {
- if (*ptr == escape && ptr+1 != end)
- {
- ptr++; /* Skip escape */
- *min_str++ = *max_str++ = *ptr;
- continue;
- }
- if (*ptr == w_one) /* '_' in SQL */
- {
- *min_str++='\0'; /* This should be min char */
- *max_str++=max_sort_chr;
- continue;
- }
- if (*ptr == w_many) /* '%' in SQL */
- {
- *min_length= (uint) (min_str - min_org);
- *max_length=res_length;
- do
- {
- *min_str++ = 0;
- *max_str++ = max_sort_chr;
- } while (min_str != min_end);
- return 0;
- }
- *min_str++= *max_str++ = *ptr;
- }
- *min_length= *max_length = (uint) (min_str - min_org);
-
- while (min_str != min_end)
- *min_str++ = *max_str++ = ' '; /* Because of key compression */
- return 0;
-}
-
-
static unsigned short cs_to_uni[256]={
0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
@@ -914,7 +849,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
my_strnncoll_tis620,
my_strnncollsp_tis620,
my_strnxfrm_tis620,
- my_like_range_tis620,
+ my_like_range_simple,
my_wildcmp_8bit, /* wildcmp */
my_strcasecmp_8bit,
my_instr_simple, /* QQ: To be fixed */
@@ -974,7 +909,7 @@ CHARSET_INFO my_charset_tis620_thai_ci=
1, /* mbminlen */
1, /* mbmaxlen */
0, /* min_sort_char */
- 0, /* max_sort_char */
+ 255, /* max_sort_char */
0, /* escape_with_backslash_is_dangerous */
&my_charset_handler,
&my_collation_ci_handler
@@ -1002,7 +937,7 @@ CHARSET_INFO my_charset_tis620_bin=
1, /* mbminlen */
1, /* mbmaxlen */
0, /* min_sort_char */
- 0, /* max_sort_char */
+ 255, /* max_sort_char */
0, /* escape_with_backslash_is_dangerous */
&my_charset_handler,
&my_collation_8bit_bin_handler
diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c
index 2761e781724..56c05635300 100644
--- a/strings/ctype-ucs2.c
+++ b/strings/ctype-ucs2.c
@@ -1426,10 +1426,12 @@ my_bool my_like_range_ucs2(CHARSET_INFO *cs,
const char *end=ptr+ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
+ uint charlen= res_length / cs->mbmaxlen;
- for (; ptr + 1 < end && min_str + 1 < min_end ; ptr+=2)
+ for ( ; ptr + 1 < end && min_str + 1 < min_end && charlen > 0
+ ; ptr+=2, charlen--)
{
- if (ptr[0] == '\0' && ptr[1] == escape && ptr+2 < end)
+ if (ptr[0] == '\0' && ptr[1] == escape && ptr + 1 < end)
{
ptr+=2; /* Skip escape */
*min_str++= *max_str++ = ptr[0];
diff --git a/strings/my_strtoll10.c b/strings/my_strtoll10.c
index 5217564087c..9cfb11524c1 100644
--- a/strings/my_strtoll10.c
+++ b/strings/my_strtoll10.c
@@ -19,7 +19,16 @@
#include <m_string.h>
#undef ULONGLONG_MAX
+/*
+ Needed under MetroWerks Compiler, since MetroWerks compiler does not
+ properly handle a constant expression containing a mod operator
+*/
+#if defined(__NETWARE__) && defined(__MWERKS__)
+static ulonglong ulonglong_max= ~(ulonglong) 0;
+#define ULONGLONG_MAX ulonglong_max
+#else
#define ULONGLONG_MAX (~(ulonglong) 0)
+#endif /* __NETWARE__ && __MWERKS__ */
#define MAX_NEGATIVE_NUMBER ((ulonglong) LL(0x8000000000000000))
#define INIT_CNT 9
#define LFACTOR ULL(1000000000)
diff --git a/strings/xml.c b/strings/xml.c
index 6ba52ea41a8..cec15b99f10 100644
--- a/strings/xml.c
+++ b/strings/xml.c
@@ -81,7 +81,7 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
a->beg=p->cur;
a->end=p->cur;
- if (!bcmp(p->cur,"<!--",4))
+ if ((p->end - p->cur > 3) && !bcmp(p->cur,"<!--",4))
{
for( ; (p->cur < p->end) && bcmp(p->cur, "-->", 3); p->cur++)
{}