summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.cc
diff options
context:
space:
mode:
authorunknown <vva@eagle.mysql.r18.ru>2003-04-22 18:41:47 -0400
committerunknown <vva@eagle.mysql.r18.ru>2003-04-22 18:41:47 -0400
commit3475aedb65c4e94da1e7faa6eeddd41d5e8dbe6e (patch)
tree82a6ee88ce718a01374afecdb2710ee9c420cd6e /sql/item_strfunc.cc
parent85ad71960c256584e66d94b0ad04e09423a1d033 (diff)
downloadmariadb-git-3475aedb65c4e94da1e7faa6eeddd41d5e8dbe6e.tar.gz
small compress/uncompress modification after monty's review
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r--sql/item_strfunc.cc39
1 files changed, 15 insertions, 24 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 5fb6af958fb..56e3eb2cb5f 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2924,6 +2924,8 @@ ret:
String *Item_func_compress::val_str(String *str)
{
String *res= args[0]->val_str(str);
+ if (res->is_empty()) return res;
+
int err= Z_OK;
int code;
@@ -2939,14 +2941,13 @@ String *Item_func_compress::val_str(String *str)
compress(compress(compress(...)))
I.e. zlib give number 'at least'..
*/
- uLongf new_size= (uLongf)((res->length()*120)/100)+12;
-
- buffer.realloc((uint32)new_size+sizeof(int32)+sizeof(char));
+ ulong new_size= (ulong)((res->length()*120)/100)+12;
- Byte *body= ((Byte*)buffer.c_ptr())+sizeof(int32);
- err= compress(body, &new_size,(const Bytef*)res->c_ptr(), res->length());
+ buffer.realloc((uint32)new_size + 4);
+ Byte *body= ((Byte*)buffer.c_ptr()) + 4;
- if (err != Z_OK)
+ if ((err= compress(body, &new_size,
+ (const Bytef*)res->c_ptr(), res->length())) != Z_OK)
{
code= err==Z_MEM_ERROR ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_BUF_ERROR;
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,code,ER(code));
@@ -2954,18 +2955,8 @@ String *Item_func_compress::val_str(String *str)
return 0;
}
- int4store(buffer.c_ptr(),res->length());
- buffer.length((uint32)new_size+sizeof(int32));
-
- /* This is for the stupid char fields which trimm ' ': */
- char *last_char= ((char*)body)+new_size-1;
- if (*last_char == ' ')
- {
- *++last_char= '.';
- new_size++;
- }
-
- buffer.length((uint32)new_size+sizeof(int32));
+ int4store(buffer.c_ptr(),res->length() & 0x3FFFFFFF);
+ buffer.length((uint32)new_size + 4);
return &buffer;
}
@@ -2973,7 +2964,9 @@ String *Item_func_compress::val_str(String *str)
String *Item_func_uncompress::val_str(String *str)
{
String *res= args[0]->val_str(str);
- uLongf new_size= uint4korr(res->c_ptr());
+ if (res->is_empty()) return res;
+
+ ulong new_size= uint4korr(res->c_ptr()) & 0x3FFFFFFF;
int err= Z_OK;
uint code;
@@ -2982,16 +2975,14 @@ String *Item_func_uncompress::val_str(String *str)
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
ER_TOO_BIG_FOR_UNCOMPRESS,
ER(ER_TOO_BIG_FOR_UNCOMPRESS),MAX_BLOB_WIDTH);
- null_value= 1;
+ null_value= 0;
return 0;
}
buffer.realloc((uint32)new_size);
- err= uncompress((Byte*)buffer.c_ptr(), &new_size,
- ((const Bytef*)res->c_ptr())+sizeof(int32),res->length());
-
- if (err == Z_OK)
+ if ((err= uncompress((Byte*)buffer.c_ptr(), &new_size,
+ ((const Bytef*)res->c_ptr())+4,res->length())) == Z_OK)
{
buffer.length((uint32)new_size);
return &buffer;