Commit 6dfa30e9 authored by Alexey Botchkov's avatar Alexey Botchkov

bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis.

    Line loops weren't recognized when collect results.
    Fixed by checking if we got the same beginning point of the line.

per-file comments:
  mysql-test/r/gis-precise.result
bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis.
      test result updated.
  mysql-test/t/gis-precise.test
bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis.
      test case added.
  sql/gcalc_tools.cc
bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis.
      check if we get the beginning node of the linestring, then cut the loop.
parent eefff876
......@@ -320,3 +320,6 @@ POLYGON((2 0,2 5,3 3,3 2,7 5,2 0))
SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')));
AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')))
GEOMETRYCOLLECTION()
SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))')));
AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))')))
GEOMETRYCOLLECTION(POINT(8 1),LINESTRING(2 4,2 5,3 5,3 4,2 4))
......@@ -204,3 +204,5 @@ SELECT AsText( ST_UNION(
SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')));
#bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis
SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))')));
......@@ -1158,6 +1158,7 @@ int Gcalc_operation_reducer::get_line_result(res_point *cur,
Gcalc_result_receiver *storage)
{
res_point *next;
res_point *cur_orig= cur;
int move_upward= 1;
if (cur->glue)
{
......@@ -1171,6 +1172,14 @@ int Gcalc_operation_reducer::get_line_result(res_point *cur,
if (!next)
{
next= cur->glue;
if (next == cur_orig)
{
/* It's the line loop */
cur= cur_orig;
cur->glue->glue= NULL;
move_upward= 1;
break;
}
move_upward^= 1;
}
}
......
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