Commit a9a6597d authored by Alexey Botchkov's avatar Alexey Botchkov

fix for bug #201189 ST_BUFFER asserts if radius = 0.

        Internal caclucations can't handle zero distance properly.
        As the ST_BUFFER(geom, 0) is in fact NOOP, we'll just return the
        'geom' as the result here.

per-file comments:
  mysql-test/r/gis-precise.result
fix for bug #201189 ST_BUFFER asserts if radius = 0.
        test result updated.

  mysql-test/t/gis-precise.test
fix for bug #201189 ST_BUFFER asserts if radius = 0.
        test case added.

  sql/item_geofunc.cc
fix for bug #201189 ST_BUFFER asserts if radius = 0.
        return the first argument as the result of the ST_BUFFER, if
        the distance is 0 there.
parent 4f49cdf8
......@@ -209,3 +209,6 @@ astext(ST_UNION (
PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'),
ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))')))))
GEOMETRYCOLLECTION(POLYGON((0 0,1 9,8 2,0 0),(2 2,2 7,3 2,2 2)),LINESTRING(0 0,5 0,5 1.25),LINESTRING(0 0,0 5,0.555555555555556 5),LINESTRING(2.4 5,2 5))
SELECT astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0));
astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0))
LINESTRING(0 0,1 1)
......@@ -111,3 +111,6 @@ SELECT ST_Equals(PointFromText('POINT (12 13)'),PointFromText('POINT (12 13)'))
SELECT astext(ST_UNION (
PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'),
ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))')))));
#bug 801189 ST_BUFFER asserts if radius = 0
SELECT astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0));
......@@ -1406,6 +1406,18 @@ String *Item_func_buffer::val_str(String *str_value)
!(g= Geometry::construct(&buffer, obj->ptr(), obj->length())))
goto mem_error;
/*
If the distance given is 0, the Buffer function is in fact NOOP,
so it's natural just to return the argument1.
Besides, internal calculations here can't handle zero distance anyway.
*/
if (fabs(dist) < GIS_ZERO)
{
null_value= 0;
str_result= obj;
goto mem_error;
}
if (func.reserve_op_buffer(2))
goto mem_error;
/* will specify operands later */
......
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