Commit 9b07b12b authored by Ramil Kalimullin's avatar Ramil Kalimullin

Fix for bug #54575: crash when joining tables with unique set column

Problem: a flaw (derefencing a NULL pointer) in the LIKE optimization
code may lead to a server crash in some rare cases.

Fix: check the pointer before its dereferencing.
parent 936a2b11
...@@ -169,3 +169,17 @@ select 'andre%' like 'andre ...@@ -169,3 +169,17 @@ select 'andre%' like 'andre
select _cp1251'andre%' like convert('andre%' using cp1251) escape ''; select _cp1251'andre%' like convert('andre%' using cp1251) escape '';
_cp1251'andre%' like convert('andre%' using cp1251) escape '' _cp1251'andre%' like convert('andre%' using cp1251) escape ''
1 1
End of 4.1 tests
#
# Bug #54575: crash when joining tables with unique set column
#
CREATE TABLE t1(a SET('a') NOT NULL, UNIQUE KEY(a));
CREATE TABLE t2(b INT PRIMARY KEY);
INSERT INTO t1 VALUES ();
Warnings:
Warning 1364 Field 'a' doesn't have a default value
INSERT INTO t2 VALUES (1), (2), (3);
SELECT 1 FROM t2 JOIN t1 ON 1 LIKE a GROUP BY a;
1
DROP TABLE t1, t2;
End of 5.1 tests
...@@ -112,5 +112,19 @@ select 'andre%' like 'andre ...@@ -112,5 +112,19 @@ select 'andre%' like 'andre
# #
select _cp1251'andre%' like convert('andre%' using cp1251) escape ''; select _cp1251'andre%' like convert('andre%' using cp1251) escape '';
#
# End of 4.1 tests --echo End of 4.1 tests
--echo #
--echo # Bug #54575: crash when joining tables with unique set column
--echo #
CREATE TABLE t1(a SET('a') NOT NULL, UNIQUE KEY(a));
CREATE TABLE t2(b INT PRIMARY KEY);
INSERT INTO t1 VALUES ();
INSERT INTO t2 VALUES (1), (2), (3);
SELECT 1 FROM t2 JOIN t1 ON 1 LIKE a GROUP BY a;
DROP TABLE t1, t2;
--echo End of 5.1 tests
...@@ -4568,13 +4568,14 @@ Item_func::optimize_type Item_func_like::select_optimize() const ...@@ -4568,13 +4568,14 @@ Item_func::optimize_type Item_func_like::select_optimize() const
if (args[1]->const_item()) if (args[1]->const_item())
{ {
String* res2= args[1]->val_str((String *)&cmp.value2); String* res2= args[1]->val_str((String *)&cmp.value2);
const char *ptr2;
if (!res2) if (!res2 || !(ptr2= res2->ptr()))
return OPTIMIZE_NONE; return OPTIMIZE_NONE;
if (*res2->ptr() != wild_many) if (*ptr2 != wild_many)
{ {
if (args[0]->result_type() != STRING_RESULT || *res2->ptr() != wild_one) if (args[0]->result_type() != STRING_RESULT || *ptr2 != wild_one)
return OPTIMIZE_OP; return OPTIMIZE_OP;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment