From 74b02ad0890c400fea7047f07acf80c4198ec72f Mon Sep 17 00:00:00 2001 From: Peet Whittaker Date: Wed, 15 Nov 2017 21:56:27 +0000 Subject: [PATCH 1/2] Fix ArgumentOutOfRangeException when creating a MySqlGeometry from an empty geometry collection --- Source/MySql.Data/Types/MySqlGeometry.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/MySql.Data/Types/MySqlGeometry.cs b/Source/MySql.Data/Types/MySqlGeometry.cs index dbd3cce9..071038cb 100644 --- a/Source/MySql.Data/Types/MySqlGeometry.cs +++ b/Source/MySql.Data/Types/MySqlGeometry.cs @@ -141,8 +141,8 @@ public MySqlGeometry(MySqlDbType type, byte[] val) var yIndex = val.Length == GEOMETRY_LENGTH ? 17 : 13; _valBinary = buffValue; - _xValue = BitConverter.ToDouble(val, xIndex); - _yValue = BitConverter.ToDouble(val, yIndex); + _xValue = val.Length >= xIndex + 8 ? BitConverter.ToDouble(val, xIndex) : 0; + _yValue = val.Length >= yIndex + 8 ? BitConverter.ToDouble(val, yIndex) : 0; this._srid = val.Length == GEOMETRY_LENGTH ? BitConverter.ToInt32(val, 0) : 0; this._isNull = false; this._type = type; From 122eb91d0db6a9e96eef7c64097deae4df7bf84f Mon Sep 17 00:00:00 2001 From: Peet Whittaker Date: Thu, 16 Nov 2017 22:33:43 +0000 Subject: [PATCH 2/2] Add unit tests for creating/reading a MySqlGeometry for an empty geometry collection --- Tests/MySql.Data.Tests/DataTypeTests.cs | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Tests/MySql.Data.Tests/DataTypeTests.cs b/Tests/MySql.Data.Tests/DataTypeTests.cs index d3514efa..0a63d309 100644 --- a/Tests/MySql.Data.Tests/DataTypeTests.cs +++ b/Tests/MySql.Data.Tests/DataTypeTests.cs @@ -967,6 +967,54 @@ public void CanGetToStringFromMySqlGeometry() Assert.Equal("POINT(47.37 -122.21)", valToString); } + /// + /// Bug #86974 Cannot create instance of MySqlGeometry for empty geometry collection + /// + [Fact] + public void CanCreateMySqlGeometryFromEmptyGeometryCollection() + { + var bytes = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + MySqlGeometry v = new MySqlGeometry(MySqlDbType.Geometry, bytes); + Assert.Equal("POINT(3.45845952088873E-323 0)", v.ToString()); + } + + /// + /// Bug #86974 Cannot create instance of MySqlGeometry for empty geometry collection + /// + [Fact] + public void CanGetMySqlGeometryFromEmptyGeometryCollection() + { + if (st.version.Major < 5) return; + + st.execSQL("DROP TABLE IF EXISTS Test"); + st.execSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (ST_GeometryCollectionFromText(\"GEOMETRYCOLLECTION()\"))", st.conn); + cmd.ExecuteNonQuery(); + + // reading as binary + cmd.CommandText = "SELECT AsBinary(v) as v FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetMySqlGeometry(0); + var valWithName = reader.GetMySqlGeometry("v"); + Assert.Equal("POINT(0 0)", val.ToString()); + Assert.Equal("POINT(0 0)", valWithName.ToString()); + } + + // reading as geometry + cmd.CommandText = "SELECT v as v FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetMySqlGeometry(0); + var valWithName = reader.GetMySqlGeometry("v"); + Assert.Equal("POINT(3.45845952088873E-323 0)", val.ToString()); + Assert.Equal("POINT(3.45845952088873E-323 0)", valWithName.ToString()); + } + } + #endregion ///