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)) ...@@ -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)'))); 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)'))) AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')))
GEOMETRYCOLLECTION() 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( ...@@ -204,3 +204,5 @@ SELECT AsText( ST_UNION(
SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))); 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, ...@@ -1158,6 +1158,7 @@ int Gcalc_operation_reducer::get_line_result(res_point *cur,
Gcalc_result_receiver *storage) Gcalc_result_receiver *storage)
{ {
res_point *next; res_point *next;
res_point *cur_orig= cur;
int move_upward= 1; int move_upward= 1;
if (cur->glue) if (cur->glue)
{ {
...@@ -1171,6 +1172,14 @@ int Gcalc_operation_reducer::get_line_result(res_point *cur, ...@@ -1171,6 +1172,14 @@ int Gcalc_operation_reducer::get_line_result(res_point *cur,
if (!next) if (!next)
{ {
next= cur->glue; 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; 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