Commit dd02c4a1 authored by Georgi Kodinov's avatar Georgi Kodinov

Bug #47780: crash when comparing GIS items from subquery

      
If the first argument to GeomFromWKB function is a geometry
field then the function just returns its value.
However in doing so it's not preserving first argument's 
null_value flag and this causes unexpected null value to
be returned to the calling function.
      
Fixed by updating the null_value of the GeomFromWKB function
in such cases (and all other cases that return a NULL e.g.
because of not enough memory for the return buffer).
parent 24885e81
...@@ -971,4 +971,16 @@ select min(`col002`) from t1 union select `col002` from t1; ...@@ -971,4 +971,16 @@ select min(`col002`) from t1 union select `col002` from t1;
min(`col002`) min(`col002`)
NULL NULL
drop table t1; drop table t1;
#
# Bug #47780: crash when comparing GIS items from subquery
#
CREATE TABLE t1(a INT, b MULTIPOLYGON);
INSERT INTO t1 VALUES
(0,
GEOMFROMTEXT(
'multipolygon(((1 2,3 4,5 6,7 8,9 8),(7 6,5 4,3 2,1 2,3 4)))'));
# must not crash
SELECT 1 FROM t1 WHERE a <> (SELECT GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
1
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -654,4 +654,20 @@ insert into t1 values (),(),(); ...@@ -654,4 +654,20 @@ insert into t1 values (),(),();
select min(`col002`) from t1 union select `col002` from t1; select min(`col002`) from t1 union select `col002` from t1;
drop table t1; drop table t1;
--echo #
--echo # Bug #47780: crash when comparing GIS items from subquery
--echo #
CREATE TABLE t1(a INT, b MULTIPOLYGON);
INSERT INTO t1 VALUES
(0,
GEOMFROMTEXT(
'multipolygon(((1 2,3 4,5 6,7 8,9 8),(7 6,5 4,3 2,1 2,3 4)))'));
--echo # must not crash
SELECT 1 FROM t1 WHERE a <> (SELECT GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -76,7 +76,9 @@ String *Item_func_geometry_from_wkb::val_str(String *str) ...@@ -76,7 +76,9 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
if (args[0]->field_type() == MYSQL_TYPE_GEOMETRY) if (args[0]->field_type() == MYSQL_TYPE_GEOMETRY)
{ {
return args[0]->val_str(str); String *str_ret= args[0]->val_str(str);
null_value= args[0]->null_value;
return str_ret;
} }
wkb= args[0]->val_str(&arg_val); wkb= args[0]->val_str(&arg_val);
...@@ -86,7 +88,10 @@ String *Item_func_geometry_from_wkb::val_str(String *str) ...@@ -86,7 +88,10 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
str->set_charset(&my_charset_bin); str->set_charset(&my_charset_bin);
if (str->reserve(SRID_SIZE, 512)) if (str->reserve(SRID_SIZE, 512))
return 0; {
null_value= TRUE; /* purecov: inspected */
return 0; /* purecov: inspected */
}
str->length(0); str->length(0);
str->q_append(srid); str->q_append(srid);
if ((null_value= if ((null_value=
......
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