summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2014-11-18 17:36:51 +0100
committerSergei Golubchik <sergii@pisem.net>2014-11-18 17:36:51 +0100
commit84fc27fbef5e12cec28efd5bb0b13c207fe3b681 (patch)
treed0351ae0af9f2fbca7fb36a5c20108314050c3a7
parentf3a800ef6edf8f2c1fa367aefbe7b6567c68a919 (diff)
parentc9742ceac5bd682e24a435c36524305eecca7950 (diff)
downloadmariadb-git-84fc27fbef5e12cec28efd5bb0b13c207fe3b681.tar.gz
5.3 merge
-rw-r--r--mysql-test/r/gis.result6
-rw-r--r--mysql-test/t/gis.test5
-rw-r--r--sql/spatial.cc8
3 files changed, 18 insertions, 1 deletions
diff --git a/mysql-test/r/gis.result b/mysql-test/r/gis.result
index c00f07e7a81..ba69416b0ef 100644
--- a/mysql-test/r/gis.result
+++ b/mysql-test/r/gis.result
@@ -1546,6 +1546,12 @@ Warnings:
Warning 1300 Invalid utf8 character string: 'E043'
Warning 1300 Invalid utf8 character string: 'E043'
drop table t1;
+#
+# MDEV-6883 ST_WITHIN crashes server if (0,0) is matched to POLYGON((0 0))
+#
+select st_within(GeomFromText('Polygon((0 0))'), Point(0,0));
+st_within(GeomFromText('Polygon((0 0))'), Point(0,0))
+1
End of 5.3 tests
#
# Bug#11908153: CRASH AND/OR VALGRIND ERRORS IN FIELD_BLOB::GET_KEY_IMAGE
diff --git a/mysql-test/t/gis.test b/mysql-test/t/gis.test
index 534cabaf7ea..4d421e15d58 100644
--- a/mysql-test/t/gis.test
+++ b/mysql-test/t/gis.test
@@ -1401,6 +1401,11 @@ insert into t1 values(geomfromtext("POINT(0 9.2233720368548e18)"));
select equals(`a`,convert(`a` using utf8)) from `t1`;
drop table t1;
+--echo #
+--echo # MDEV-6883 ST_WITHIN crashes server if (0,0) is matched to POLYGON((0 0))
+--echo #
+select st_within(GeomFromText('Polygon((0 0))'), Point(0,0));
+
--echo End of 5.3 tests
--echo #
diff --git a/sql/spatial.cc b/sql/spatial.cc
index 34d2417f632..c5dc0c2140c 100644
--- a/sql/spatial.cc
+++ b/sql/spatial.cc
@@ -1237,11 +1237,15 @@ int Gis_polygon::store_shapes(Gcalc_shape_transporter *trn) const
trn->start_ring();
get_point(&first_x, &first_y, data);
data+= POINT_DATA_SIZE;
- n_points--;
+
prev_x= first_x;
prev_y= first_y;
if (trn->add_point(first_x, first_y))
return 1;
+
+ if (--n_points == 0)
+ goto single_point_ring;
+
while (--n_points)
{
double x, y;
@@ -1266,6 +1270,8 @@ int Gis_polygon::store_shapes(Gcalc_shape_transporter *trn) const
return 1;
}
data+= POINT_DATA_SIZE;
+
+single_point_ring:
trn->complete_ring();
}