diff --git a/mysql-test/r/func_compress.result b/mysql-test/r/func_compress.result index ac48c8b9494..c4d2eacf363 100644 --- a/mysql-test/r/func_compress.result +++ b/mysql-test/r/func_compress.result @@ -7,11 +7,6 @@ length(@test_compress_string) select uncompress(compress(@test_compress_string)); uncompress(compress(@test_compress_string)) string for test compress function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -select uncompress(@test_compress_string); -uncompress(@test_compress_string) -NULL -Warnings: -Error 1254 Too big size of uncompressed data. The maximum size is 8192. (probably, length of uncompressed data was corrupted) select uncompressed_length(compress(@test_compress_string))=length(@test_compress_string); uncompressed_length(compress(@test_compress_string))=length(@test_compress_string) 1 @@ -33,3 +28,15 @@ select concat('|',c,'|') from t1; concat('|',c,'|') |d| drop table t1; +select compress(""); +compress("") + +select uncompress(""); +uncompress("") + +select uncompress(compress("")); +uncompress(compress("")) + +select uncompressed_length(""); +uncompressed_length("") +0 diff --git a/mysql-test/t/func_compress.test b/mysql-test/t/func_compress.test index 2f86a414792..826721a4053 100644 --- a/mysql-test/t/func_compress.test +++ b/mysql-test/t/func_compress.test @@ -7,7 +7,6 @@ select @test_compress_string:='string for test compress function aaaaaaaaaaaaaaa select length(@test_compress_string); select uncompress(compress(@test_compress_string)); -select uncompress(@test_compress_string); select uncompressed_length(compress(@test_compress_string))=length(@test_compress_string); select uncompressed_length(compress(@test_compress_string)); select length(compress(@test_compress_string))c_ptr()); + if (res->is_empty()) return 0; + return uint4korr(res->c_ptr()) & 0x3FFFFFFF; } #endif /* HAVE_COMPRESS */ 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; + ulong new_size= (ulong)((res->length()*120)/100)+12; - buffer.realloc((uint32)new_size+sizeof(int32)+sizeof(char)); - - 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; diff --git a/sql/lex.h b/sql/lex.h index b5a81a30991..e51b3efff87 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -448,9 +448,7 @@ static SYMBOL sql_functions[] = { { "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "COALESCE", SYM(COALESCE),0,0}, { "COERCIBILITY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_coercibility)}, -#ifdef HAVE_COMPRESS { "COMPRESS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_compress)}, -#endif { "CONCAT", SYM(CONCAT),0,0}, { "CONCAT_WS", SYM(CONCAT_WS),0,0}, { "CONNECTION_ID", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_connection_id)}, @@ -627,10 +625,8 @@ static SYMBOL sql_functions[] = { { "TOUCHES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_touches)}, { "TRIM", SYM(TRIM),0,0}, { "UCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)}, -#ifdef HAVE_COMPRESS { "UNCOMPRESS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompress)}, { "UNCOMPRESSED_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompressed_length)}, -#endif { "UNIQUE_USERS", SYM(UNIQUE_USERS),0,0}, { "UNIX_TIMESTAMP", SYM(UNIX_TIMESTAMP),0,0}, { "UPPER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},