mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
small compress/uncompress modification after monty's review
This commit is contained in:
@ -7,11 +7,6 @@ length(@test_compress_string)
|
|||||||
select uncompress(compress(@test_compress_string));
|
select uncompress(compress(@test_compress_string));
|
||||||
uncompress(compress(@test_compress_string))
|
uncompress(compress(@test_compress_string))
|
||||||
string for test compress function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
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);
|
select uncompressed_length(compress(@test_compress_string))=length(@test_compress_string);
|
||||||
uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)
|
uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)
|
||||||
1
|
1
|
||||||
@ -33,3 +28,15 @@ select concat('|',c,'|') from t1;
|
|||||||
concat('|',c,'|')
|
concat('|',c,'|')
|
||||||
|d|
|
|d|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
select compress("");
|
||||||
|
compress("")
|
||||||
|
|
||||||
|
select uncompress("");
|
||||||
|
uncompress("")
|
||||||
|
|
||||||
|
select uncompress(compress(""));
|
||||||
|
uncompress(compress(""))
|
||||||
|
|
||||||
|
select uncompressed_length("");
|
||||||
|
uncompressed_length("")
|
||||||
|
0
|
||||||
|
@ -7,7 +7,6 @@ select @test_compress_string:='string for test compress function aaaaaaaaaaaaaaa
|
|||||||
select length(@test_compress_string);
|
select length(@test_compress_string);
|
||||||
|
|
||||||
select uncompress(compress(@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))=length(@test_compress_string);
|
||||||
select uncompressed_length(compress(@test_compress_string));
|
select uncompressed_length(compress(@test_compress_string));
|
||||||
select length(compress(@test_compress_string))<length(@test_compress_string);
|
select length(compress(@test_compress_string))<length(@test_compress_string);
|
||||||
@ -17,4 +16,10 @@ insert into t1 (a,b,c) values (compress(@test_compress_string),compress(@test_co
|
|||||||
select uncompress(a) from t1;
|
select uncompress(a) from t1;
|
||||||
select uncompress(b) from t1;
|
select uncompress(b) from t1;
|
||||||
select concat('|',c,'|') from t1;
|
select concat('|',c,'|') from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
select compress("");
|
||||||
|
select uncompress("");
|
||||||
|
select uncompress(compress(""));
|
||||||
|
select uncompressed_length("");
|
||||||
|
|
||||||
|
@ -646,7 +646,13 @@ Item *create_func_point(Item *a, Item *b)
|
|||||||
return new Item_func_point(a, b);
|
return new Item_func_point(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_COMPRESS
|
#if !defined(HAVE_COMPRESS)
|
||||||
|
|
||||||
|
Item *create_func_compress (Item*a __attribute__((unused))){return 0;}
|
||||||
|
Item *create_func_uncompress (Item*a __attribute__((unused))){return 0;}
|
||||||
|
Item *create_func_uncompressed_length(Item*a __attribute__((unused))){return 0;}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
Item *create_func_compress(Item* a)
|
Item *create_func_compress(Item* a)
|
||||||
{
|
{
|
||||||
|
@ -142,9 +142,7 @@ Item *create_func_numgeometries(Item *a);
|
|||||||
|
|
||||||
Item *create_func_point(Item *a, Item *b);
|
Item *create_func_point(Item *a, Item *b);
|
||||||
|
|
||||||
#ifdef HAVE_COMPRESS
|
|
||||||
Item *create_func_compress(Item *a);
|
Item *create_func_compress(Item *a);
|
||||||
Item *create_func_uncompress(Item *a);
|
Item *create_func_uncompress(Item *a);
|
||||||
Item *create_func_uncompressed_length(Item *a);
|
Item *create_func_uncompressed_length(Item *a);
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -993,7 +993,8 @@ longlong Item_func_uncompressed_length::val_int()
|
|||||||
return 0; /* purecov: inspected */
|
return 0; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
null_value=0;
|
null_value=0;
|
||||||
return uint4korr(res->c_ptr());
|
if (res->is_empty()) return 0;
|
||||||
|
return uint4korr(res->c_ptr()) & 0x3FFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_COMPRESS */
|
#endif /* HAVE_COMPRESS */
|
||||||
|
@ -2924,6 +2924,8 @@ ret:
|
|||||||
String *Item_func_compress::val_str(String *str)
|
String *Item_func_compress::val_str(String *str)
|
||||||
{
|
{
|
||||||
String *res= args[0]->val_str(str);
|
String *res= args[0]->val_str(str);
|
||||||
|
if (res->is_empty()) return res;
|
||||||
|
|
||||||
int err= Z_OK;
|
int err= Z_OK;
|
||||||
int code;
|
int code;
|
||||||
|
|
||||||
@ -2939,14 +2941,13 @@ String *Item_func_compress::val_str(String *str)
|
|||||||
compress(compress(compress(...)))
|
compress(compress(compress(...)))
|
||||||
I.e. zlib give number 'at least'..
|
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));
|
buffer.realloc((uint32)new_size + 4);
|
||||||
|
Byte *body= ((Byte*)buffer.c_ptr()) + 4;
|
||||||
Byte *body= ((Byte*)buffer.c_ptr())+sizeof(int32);
|
|
||||||
err= compress(body, &new_size,(const Bytef*)res->c_ptr(), res->length());
|
|
||||||
|
|
||||||
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;
|
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));
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int4store(buffer.c_ptr(),res->length());
|
int4store(buffer.c_ptr(),res->length() & 0x3FFFFFFF);
|
||||||
buffer.length((uint32)new_size+sizeof(int32));
|
buffer.length((uint32)new_size + 4);
|
||||||
|
|
||||||
/* 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));
|
|
||||||
|
|
||||||
return &buffer;
|
return &buffer;
|
||||||
}
|
}
|
||||||
@ -2973,7 +2964,9 @@ String *Item_func_compress::val_str(String *str)
|
|||||||
String *Item_func_uncompress::val_str(String *str)
|
String *Item_func_uncompress::val_str(String *str)
|
||||||
{
|
{
|
||||||
String *res= args[0]->val_str(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;
|
int err= Z_OK;
|
||||||
uint code;
|
uint code;
|
||||||
|
|
||||||
@ -2982,16 +2975,14 @@ String *Item_func_uncompress::val_str(String *str)
|
|||||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||||
ER_TOO_BIG_FOR_UNCOMPRESS,
|
ER_TOO_BIG_FOR_UNCOMPRESS,
|
||||||
ER(ER_TOO_BIG_FOR_UNCOMPRESS),MAX_BLOB_WIDTH);
|
ER(ER_TOO_BIG_FOR_UNCOMPRESS),MAX_BLOB_WIDTH);
|
||||||
null_value= 1;
|
null_value= 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.realloc((uint32)new_size);
|
buffer.realloc((uint32)new_size);
|
||||||
|
|
||||||
err= uncompress((Byte*)buffer.c_ptr(), &new_size,
|
if ((err= uncompress((Byte*)buffer.c_ptr(), &new_size,
|
||||||
((const Bytef*)res->c_ptr())+sizeof(int32),res->length());
|
((const Bytef*)res->c_ptr())+4,res->length())) == Z_OK)
|
||||||
|
|
||||||
if (err == Z_OK)
|
|
||||||
{
|
{
|
||||||
buffer.length((uint32)new_size);
|
buffer.length((uint32)new_size);
|
||||||
return &buffer;
|
return &buffer;
|
||||||
|
@ -448,9 +448,7 @@ static SYMBOL sql_functions[] = {
|
|||||||
{ "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
|
{ "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
|
||||||
{ "COALESCE", SYM(COALESCE),0,0},
|
{ "COALESCE", SYM(COALESCE),0,0},
|
||||||
{ "COERCIBILITY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_coercibility)},
|
{ "COERCIBILITY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_coercibility)},
|
||||||
#ifdef HAVE_COMPRESS
|
|
||||||
{ "COMPRESS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_compress)},
|
{ "COMPRESS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_compress)},
|
||||||
#endif
|
|
||||||
{ "CONCAT", SYM(CONCAT),0,0},
|
{ "CONCAT", SYM(CONCAT),0,0},
|
||||||
{ "CONCAT_WS", SYM(CONCAT_WS),0,0},
|
{ "CONCAT_WS", SYM(CONCAT_WS),0,0},
|
||||||
{ "CONNECTION_ID", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_connection_id)},
|
{ "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)},
|
{ "TOUCHES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_touches)},
|
||||||
{ "TRIM", SYM(TRIM),0,0},
|
{ "TRIM", SYM(TRIM),0,0},
|
||||||
{ "UCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
{ "UCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
||||||
#ifdef HAVE_COMPRESS
|
|
||||||
{ "UNCOMPRESS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompress)},
|
{ "UNCOMPRESS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompress)},
|
||||||
{ "UNCOMPRESSED_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompressed_length)},
|
{ "UNCOMPRESSED_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompressed_length)},
|
||||||
#endif
|
|
||||||
{ "UNIQUE_USERS", SYM(UNIQUE_USERS),0,0},
|
{ "UNIQUE_USERS", SYM(UNIQUE_USERS),0,0},
|
||||||
{ "UNIX_TIMESTAMP", SYM(UNIX_TIMESTAMP),0,0},
|
{ "UNIX_TIMESTAMP", SYM(UNIX_TIMESTAMP),0,0},
|
||||||
{ "UPPER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
{ "UPPER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
||||||
|
Reference in New Issue
Block a user