diff options
author | unknown <vva@eagle.mysql.r18.ru> | 2003-04-22 18:41:47 -0400 |
---|---|---|
committer | unknown <vva@eagle.mysql.r18.ru> | 2003-04-22 18:41:47 -0400 |
commit | 3475aedb65c4e94da1e7faa6eeddd41d5e8dbe6e (patch) | |
tree | 82a6ee88ce718a01374afecdb2710ee9c420cd6e /sql/item_strfunc.cc | |
parent | 85ad71960c256584e66d94b0ad04e09423a1d033 (diff) | |
download | mariadb-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.cc | 39 |
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; |