Commit 8dc1fa1c authored by unknown's avatar unknown
Browse files

Bug #18539: uncompress(d) is null: impossible?

  The UNCOMPRESS() function was not marked as maybe_null, even though
  it returns NULL on invalid data. This confused the optimizer.


mysql-test/r/func_compress.result:
  Add new results
mysql-test/t/func_compress.test:
  Add new regression test
sql/item_strfunc.h:
  Set maybe_null within Item_func_uncompress::fix_length_and_dec()
parent 66fc547d
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -79,3 +79,31 @@ uncompress(a) uncompressed_length(a)
NULL	NULL
a	1
drop table t1;
create table t1 (a varchar(32) not null);
insert into t1 values ('foo');
explain select * from t1 where uncompress(a) is null;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	1	
Warnings:
Error	1256	Uncompressed data size too large; the maximum size is 104857600 (probably, length of uncompressed data was corrupted)
select * from t1 where uncompress(a) is null;
a
foo
Warnings:
Error	1256	Uncompressed data size too large; the maximum size is 104857600 (probably, length of uncompressed data was corrupted)
explain select *, uncompress(a) from t1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	1	
select *, uncompress(a) from t1;
a	uncompress(a)
foo	NULL
Warnings:
Error	1256	Uncompressed data size too large; the maximum size is 104857600 (probably, length of uncompressed data was corrupted)
select *, uncompress(a), uncompress(a) is null from t1;
a	uncompress(a)	uncompress(a) is null
foo	NULL	1
Warnings:
Error	1256	Uncompressed data size too large; the maximum size is 104857600 (probably, length of uncompressed data was corrupted)
Error	1256	Uncompressed data size too large; the maximum size is 104857600 (probably, length of uncompressed data was corrupted)
drop table t1;
End of 5.0 tests
+14 −0
Original line number Diff line number Diff line
@@ -57,3 +57,17 @@ select uncompress(a), uncompressed_length(a) from t1;
drop table t1;

# End of 4.1 tests

#
# Bug #18539: uncompress(d) is null: impossible?
#
create table t1 (a varchar(32) not null);
insert into t1 values ('foo');
explain select * from t1 where uncompress(a) is null;
select * from t1 where uncompress(a) is null;
explain select *, uncompress(a) from t1;
select *, uncompress(a) from t1;
select *, uncompress(a), uncompress(a) is null from t1;
drop table t1;

--echo End of 5.0 tests
+1 −1
Original line number Diff line number Diff line
@@ -784,7 +784,7 @@ class Item_func_uncompress: public Item_str_func
  String buffer;
public:
  Item_func_uncompress(Item *a): Item_str_func(a){}
  void fix_length_and_dec(){max_length= MAX_BLOB_WIDTH;}
  void fix_length_and_dec(){ maybe_null= 1; max_length= MAX_BLOB_WIDTH; }
  const char *func_name() const{return "uncompress";}
  String *val_str(String *) ZLIB_DEPENDED_FUNCTION
};