diff options
author | unknown <bar@noter.intranet.mysql.r18.ru> | 2004-09-26 21:55:17 +0500 |
---|---|---|
committer | unknown <bar@noter.intranet.mysql.r18.ru> | 2004-09-26 21:55:17 +0500 |
commit | b8c66ef26bfc0116a7ba8295fe5e02a95f82e237 (patch) | |
tree | 4417aaba3b750fca3e8cfd3a29e057c13720e3dd /sql/field.cc | |
parent | 6cfa11de5a8ba4edfaf827fb423fa4193f2e2e94 (diff) | |
parent | 0b7c703878ade2b2675c056267b71440d9dd960c (diff) | |
download | mariadb-git-b8c66ef26bfc0116a7ba8295fe5e02a95f82e237.tar.gz |
Merge abarkov@bk-internal.mysql.com:/home/bk/mysql-4.1/
into noter.intranet.mysql.r18.ru:/root/mysql-4.1
sql/field.cc:
Auto merged
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/sql/field.cc b/sql/field.cc index 59d18dabcab..a3a19d93e58 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4414,12 +4414,19 @@ void Field_string::sql_type(String &res) const char *Field_string::pack(char *to, const char *from, uint max_length) { const char *end=from+min(field_length,max_length); - uchar length; + uint length; while (end > from && end[-1] == ' ') end--; - *to= length=(uchar) (end-from); - memcpy(to+1, from, (int) length); - return to+1+length; + length= (end-from); + if (field_length > 255) + { + int2store(to, length); + to+= 2; + } + else + *to++= (char) (uchar) length; + memcpy(to, from, (int) length); + return to+length; } @@ -4432,15 +4439,28 @@ char *Field_string::pack_key(char *to, const char *from, uint max_length) set_if_smaller(length, char_length); while (length && from[length-1] == ' ') length--; - *to= (uchar)length; - memcpy(to+1, from, length); - return to+1+length; + if (field_length > 255) + { + int2store(to, length); + to+= 2; + } + else + *to++= (char) (uchar) length; + memcpy(to, from, length); + return to+length; } const char *Field_string::unpack(char *to, const char *from) { - uint length= (uint) (uchar) *from++; + uint length; + if (field_length > 255) + { + length= uint2korr(from); + from+= 2; + } + else + length= (uint) (uchar) *from++; memcpy(to, from, (int) length); bfill(to+length, field_length - length, ' '); return from+length; @@ -4449,8 +4469,19 @@ const char *Field_string::unpack(char *to, const char *from) int Field_string::pack_cmp(const char *a, const char *b, uint length) { - uint a_length= (uint) (uchar) *a++; - uint b_length= (uint) (uchar) *b++; + uint a_length, b_length; + if (field_length > 255) + { + a_length= uint2korr(a); + b_length= uint2korr(b); + a+= 2; + b+= 2; + } + else + { + a_length= (uint) (uchar) *a++; + b_length= (uint) (uchar) *b++; + } return my_strnncoll(field_charset, (const uchar*)a,a_length, (const uchar*)b,b_length); @@ -4459,7 +4490,14 @@ int Field_string::pack_cmp(const char *a, const char *b, uint length) int Field_string::pack_cmp(const char *b, uint length) { - uint b_length= (uint) (uchar) *b++; + uint b_length; + if (field_length > 255) + { + b_length= uint2korr(b); + b+= 2; + } + else + b_length= (uint) (uchar) *b++; char *end= ptr + field_length; while (end > ptr && end[-1] == ' ') end--; |