Commit cda23a6f authored by MySQL Build Team's avatar MySQL Build Team

Backport into build-200911241145-5.1.40sp1

> ------------------------------------------------------------
> revno: 1810.3959.6
> revision-id: joro@sun.com-20091021084345-iki6z0uceieoupey
> parent: ramil@mysql.com-20091023112648-gie6o3odj57cxh1e
> committer: Georgi Kodinov <joro@sun.com>
> branch nick: B47780-5.0-bugteam
> timestamp: Wed 2009-10-21 11:43:45 +0300
> message:
>   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 f24cb03d
...@@ -972,6 +972,18 @@ select min(`col002`) from t1 union select `col002` from t1; ...@@ -972,6 +972,18 @@ 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
create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime); create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
create view v1 as select * from t1; create view v1 as select * from t1;
......
...@@ -655,6 +655,22 @@ insert into t1 values (),(),(); ...@@ -655,6 +655,22 @@ 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
......
...@@ -84,7 +84,9 @@ String *Item_func_geometry_from_wkb::val_str(String *str) ...@@ -84,7 +84,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);
...@@ -94,7 +96,10 @@ String *Item_func_geometry_from_wkb::val_str(String *str) ...@@ -94,7 +96,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