summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2016-11-29 16:25:22 +0400
committerAlexey Botchkov <holyfoot@askmonty.org>2016-11-29 16:25:22 +0400
commitcc577f81b8c1df0f315bf1e178a35c84f73430d3 (patch)
tree47fa98bab54e48354a20eefa9c52edc26a81dc11
parent098dff10ba92eca9ca8b810b483b57daa194a759 (diff)
downloadmariadb-git-cc577f81b8c1df0f315bf1e178a35c84f73430d3.tar.gz
MDEV-11041 Innodb_gis/ tests taken from MySQL fail.
Some fixes made in innodb and item_create.cc. Adapted Innodb-GIS tests moved to MariaDB.
-rwxr-xr-xmysql-test/mysql-test-run.pl1
-rw-r--r--mysql-test/suite/innodb_gis/r/0.result619
-rw-r--r--mysql-test/suite/innodb_gis/r/1.result1499
-rw-r--r--mysql-test/suite/innodb_gis/r/alter_spatial_index.result671
-rw-r--r--mysql-test/suite/innodb_gis/r/check_rtree.result15
-rw-r--r--mysql-test/suite/innodb_gis/r/create_spatial_index.result1290
-rw-r--r--mysql-test/suite/innodb_gis/r/gis.result1491
-rw-r--r--mysql-test/suite/innodb_gis/r/precise.result515
-rw-r--r--mysql-test/suite/innodb_gis/r/rt_precise.result59
-rw-r--r--mysql-test/suite/innodb_gis/r/rtree.result251
-rw-r--r--mysql-test/suite/innodb_gis/t/0.test42
-rw-r--r--mysql-test/suite/innodb_gis/t/1.test1451
-rw-r--r--mysql-test/suite/innodb_gis/t/alter_spatial_index.test753
-rw-r--r--mysql-test/suite/innodb_gis/t/check_rtree.test27
-rw-r--r--mysql-test/suite/innodb_gis/t/create_spatial_index.test1175
-rw-r--r--mysql-test/suite/innodb_gis/t/gis.test1444
-rw-r--r--mysql-test/suite/innodb_gis/t/precise.test144
-rw-r--r--mysql-test/suite/innodb_gis/t/rt_precise.test74
-rw-r--r--mysql-test/suite/innodb_gis/t/rtree.test236
-rw-r--r--sql/item_create.cc1
-rw-r--r--storage/innobase/include/fil0fil.ic4
21 files changed, 11762 insertions, 0 deletions
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index e7bfdedb2cc..fdbc2a739a2 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -179,6 +179,7 @@ my @DEFAULT_SUITES= qw(
heap-
innodb-
innodb_fts-
+ innodb_gis-
innodb_zip-
maria-
multi_source-
diff --git a/mysql-test/suite/innodb_gis/r/0.result b/mysql-test/suite/innodb_gis/r/0.result
new file mode 100644
index 00000000000..9f155deef23
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/0.result
@@ -0,0 +1,619 @@
+SET default_storage_engine=innodb;
+DROP TABLE IF EXISTS t1, gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+CREATE TABLE gis_point (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g POINT);
+CREATE TABLE gis_line (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g LINESTRING);
+CREATE TABLE gis_polygon (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g POLYGON);
+CREATE TABLE gis_multi_point (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g MULTIPOINT);
+CREATE TABLE gis_multi_line (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g MULTILINESTRING);
+CREATE TABLE gis_multi_polygon (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g MULTIPOLYGON);
+CREATE TABLE gis_geometrycollection (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g GEOMETRYCOLLECTION);
+CREATE TABLE gis_geometry (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g GEOMETRY);
+SHOW CREATE TABLE gis_point;
+Table Create Table
+gis_point CREATE TABLE `gis_point` (
+ `fid` int(11) NOT NULL AUTO_INCREMENT,
+ `g` point DEFAULT NULL,
+ PRIMARY KEY (`fid`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW FIELDS FROM gis_point;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g point YES NULL
+SHOW FIELDS FROM gis_line;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g linestring YES NULL
+SHOW FIELDS FROM gis_polygon;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g polygon YES NULL
+SHOW FIELDS FROM gis_multi_point;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g multipoint YES NULL
+SHOW FIELDS FROM gis_multi_line;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g multilinestring YES NULL
+SHOW FIELDS FROM gis_multi_polygon;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g multipolygon YES NULL
+SHOW FIELDS FROM gis_geometrycollection;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g geometrycollection YES NULL
+SHOW FIELDS FROM gis_geometry;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL auto_increment
+g geometry YES NULL
+INSERT INTO gis_point VALUES
+(101, PointFromText('POINT(10 10)')),
+(102, PointFromText('POINT(20 10)')),
+(103, PointFromText('POINT(20 20)')),
+(104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
+INSERT INTO gis_line VALUES
+(105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
+(106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+(107, LineStringFromWKB(LineString(Point(10, 10), Point(40, 10))));
+INSERT INTO gis_polygon VALUES
+(108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+(109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+(110, PolyFromWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0)))));
+INSERT INTO gis_multi_point VALUES
+(111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+(112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+(113, MPointFromWKB(MultiPoint(Point(3, 6), Point(4, 10))));
+INSERT INTO gis_multi_line VALUES
+(114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+(115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+(116, MLineFromWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7)))));
+INSERT INTO gis_multi_polygon VALUES
+(117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(119, MPolyFromWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))))));
+INSERT INTO gis_geometrycollection VALUES
+(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+(121, GeometryFromWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))));
+INSERT into gis_geometry SELECT * FROM gis_point;
+INSERT into gis_geometry SELECT * FROM gis_line;
+INSERT into gis_geometry SELECT * FROM gis_polygon;
+INSERT into gis_geometry SELECT * FROM gis_multi_point;
+INSERT into gis_geometry SELECT * FROM gis_multi_line;
+INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+SELECT fid, AsText(g) FROM gis_point ORDER by fid;
+fid AsText(g)
+101 POINT(10 10)
+102 POINT(20 10)
+103 POINT(20 20)
+104 POINT(10 20)
+SELECT fid, AsText(g) FROM gis_line ORDER by fid;
+fid AsText(g)
+105 LINESTRING(0 0,0 10,10 0)
+106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+107 LINESTRING(10 10,40 10)
+SELECT fid, AsText(g) FROM gis_polygon ORDER by fid;
+fid AsText(g)
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+110 POLYGON((0 0,30 0,30 30,0 0))
+SELECT fid, AsText(g) FROM gis_multi_point ORDER by fid;
+fid AsText(g)
+111 MULTIPOINT(0 0,10 10,10 20,20 20)
+112 MULTIPOINT(1 1,11 11,11 21,21 21)
+113 MULTIPOINT(3 6,4 10)
+SELECT fid, AsText(g) FROM gis_multi_line ORDER by fid;
+fid AsText(g)
+114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+115 MULTILINESTRING((10 48,10 21,10 0))
+116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+SELECT fid, AsText(g) FROM gis_multi_polygon ORDER by fid;
+fid AsText(g)
+117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+SELECT fid, AsText(g) FROM gis_geometrycollection ORDER by fid;
+fid AsText(g)
+120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+SELECT fid, AsText(g) FROM gis_geometry ORDER by fid;
+fid AsText(g)
+101 POINT(10 10)
+102 POINT(20 10)
+103 POINT(20 20)
+104 POINT(10 20)
+105 LINESTRING(0 0,0 10,10 0)
+106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+107 LINESTRING(10 10,40 10)
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+110 POLYGON((0 0,30 0,30 30,0 0))
+111 MULTIPOINT(0 0,10 10,10 20,20 20)
+112 MULTIPOINT(1 1,11 11,11 21,21 21)
+113 MULTIPOINT(3 6,4 10)
+114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+115 MULTILINESTRING((10 48,10 21,10 0))
+116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+SELECT fid, Dimension(g) FROM gis_geometry ORDER by fid;
+fid Dimension(g)
+101 0
+102 0
+103 0
+104 0
+105 1
+106 1
+107 1
+108 2
+109 2
+110 2
+111 0
+112 0
+113 0
+114 1
+115 1
+116 1
+117 2
+118 2
+119 2
+120 1
+121 1
+SELECT fid, GeometryType(g) FROM gis_geometry ORDER by fid;
+fid GeometryType(g)
+101 POINT
+102 POINT
+103 POINT
+104 POINT
+105 LINESTRING
+106 LINESTRING
+107 LINESTRING
+108 POLYGON
+109 POLYGON
+110 POLYGON
+111 MULTIPOINT
+112 MULTIPOINT
+113 MULTIPOINT
+114 MULTILINESTRING
+115 MULTILINESTRING
+116 MULTILINESTRING
+117 MULTIPOLYGON
+118 MULTIPOLYGON
+119 MULTIPOLYGON
+120 GEOMETRYCOLLECTION
+121 GEOMETRYCOLLECTION
+SELECT fid, IsEmpty(g) FROM gis_geometry ORDER by fid;
+fid IsEmpty(g)
+101 0
+102 0
+103 0
+104 0
+105 0
+106 0
+107 0
+108 0
+109 0
+110 0
+111 0
+112 0
+113 0
+114 0
+115 0
+116 0
+117 0
+118 0
+119 0
+120 0
+121 0
+SELECT fid, AsText(Envelope(g)) FROM gis_geometry ORDER by fid;
+fid AsText(Envelope(g))
+101 POLYGON((10 10,10 10,10 10,10 10,10 10))
+102 POLYGON((20 10,20 10,20 10,20 10,20 10))
+103 POLYGON((20 20,20 20,20 20,20 20,20 20))
+104 POLYGON((10 20,10 20,10 20,10 20,10 20))
+105 POLYGON((0 0,10 0,10 10,0 10,0 0))
+106 POLYGON((10 10,20 10,20 20,10 20,10 10))
+107 POLYGON((10 10,40 10,40 10,10 10,10 10))
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0))
+110 POLYGON((0 0,30 0,30 30,0 30,0 0))
+111 POLYGON((0 0,20 0,20 20,0 20,0 0))
+112 POLYGON((1 1,21 1,21 21,1 21,1 1))
+113 POLYGON((3 6,4 6,4 10,3 10,3 6))
+114 POLYGON((10 0,16 0,16 48,10 48,10 0))
+115 POLYGON((10 0,10 0,10 48,10 48,10 0))
+116 POLYGON((1 2,21 2,21 8,1 8,1 2))
+117 POLYGON((28 0,84 0,84 42,28 42,28 0))
+118 POLYGON((28 0,84 0,84 42,28 42,28 0))
+119 POLYGON((0 0,3 0,3 3,0 3,0 0))
+120 POLYGON((0 0,10 0,10 10,0 10,0 0))
+121 POLYGON((3 6,44 6,44 9,3 9,3 6))
+explain extended select Dimension(g), GeometryType(g), IsEmpty(g), AsText(Envelope(g)) from gis_geometry;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_geometry ALL NULL NULL NULL NULL 21 100.00
+Warnings:
+Note 1003 select st_dimension(`test`.`gis_geometry`.`g`) AS `Dimension(g)`,st_geometrytype(`test`.`gis_geometry`.`g`) AS `GeometryType(g)`,st_isempty(`test`.`gis_geometry`.`g`) AS `IsEmpty(g)`,st_astext(st_envelope(`test`.`gis_geometry`.`g`)) AS `AsText(Envelope(g))` from `test`.`gis_geometry`
+SELECT fid, X(g) FROM gis_point ORDER by fid;
+fid X(g)
+101 10
+102 20
+103 20
+104 10
+SELECT fid, Y(g) FROM gis_point ORDER by fid;
+fid Y(g)
+101 10
+102 10
+103 20
+104 20
+explain extended select X(g),Y(g) FROM gis_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_point ALL NULL NULL NULL NULL 4 100.00
+Warnings:
+Note 1003 select st_x(`test`.`gis_point`.`g`) AS `X(g)`,st_y(`test`.`gis_point`.`g`) AS `Y(g)` from `test`.`gis_point`
+SELECT fid, AsText(StartPoint(g)) FROM gis_line ORDER by fid;
+fid AsText(StartPoint(g))
+105 POINT(0 0)
+106 POINT(10 10)
+107 POINT(10 10)
+SELECT fid, AsText(EndPoint(g)) FROM gis_line ORDER by fid;
+fid AsText(EndPoint(g))
+105 POINT(10 0)
+106 POINT(10 10)
+107 POINT(40 10)
+SELECT fid, GLength(g) FROM gis_line ORDER by fid;
+fid GLength(g)
+105 24.14213562373095
+106 40
+107 30
+SELECT fid, NumPoints(g) FROM gis_line ORDER by fid;
+fid NumPoints(g)
+105 3
+106 5
+107 2
+SELECT fid, AsText(PointN(g, 2)) FROM gis_line ORDER by fid;
+fid AsText(PointN(g, 2))
+105 POINT(0 10)
+106 POINT(20 10)
+107 POINT(40 10)
+SELECT fid, IsClosed(g) FROM gis_line ORDER by fid;
+fid IsClosed(g)
+105 0
+106 1
+107 0
+explain extended select AsText(StartPoint(g)),AsText(EndPoint(g)),GLength(g),NumPoints(g),AsText(PointN(g, 2)),IsClosed(g) FROM gis_line;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_line ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select st_astext(st_startpoint(`test`.`gis_line`.`g`)) AS `AsText(StartPoint(g))`,st_astext(st_endpoint(`test`.`gis_line`.`g`)) AS `AsText(EndPoint(g))`,st_length(`test`.`gis_line`.`g`) AS `GLength(g)`,st_numpoints(`test`.`gis_line`.`g`) AS `NumPoints(g)`,st_astext(st_pointn(`test`.`gis_line`.`g`,2)) AS `AsText(PointN(g, 2))`,st_isclosed(`test`.`gis_line`.`g`) AS `IsClosed(g)` from `test`.`gis_line`
+SELECT fid, AsText(Centroid(g)) FROM gis_polygon ORDER by fid;
+fid AsText(Centroid(g))
+108 POINT(15 15)
+109 POINT(25.416666666666668 25.416666666666668)
+110 POINT(20 10)
+SELECT fid, Area(g) FROM gis_polygon ORDER by fid;
+fid Area(g)
+108 100
+109 2400
+110 450
+SELECT fid, AsText(ExteriorRing(g)) FROM gis_polygon ORDER by fid;
+fid AsText(ExteriorRing(g))
+108 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+109 LINESTRING(0 0,50 0,50 50,0 50,0 0)
+110 LINESTRING(0 0,30 0,30 30,0 0)
+SELECT fid, NumInteriorRings(g) FROM gis_polygon ORDER by fid;
+fid NumInteriorRings(g)
+108 0
+109 1
+110 0
+SELECT fid, AsText(InteriorRingN(g, 1)) FROM gis_polygon ORDER by fid;
+fid AsText(InteriorRingN(g, 1))
+108 NULL
+109 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+110 NULL
+explain extended select AsText(Centroid(g)),Area(g),AsText(ExteriorRing(g)),NumInteriorRings(g),AsText(InteriorRingN(g, 1)) FROM gis_polygon;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_polygon ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select st_astext(st_centroid(`test`.`gis_polygon`.`g`)) AS `AsText(Centroid(g))`,st_area(`test`.`gis_polygon`.`g`) AS `Area(g)`,st_astext(st_exteriorring(`test`.`gis_polygon`.`g`)) AS `AsText(ExteriorRing(g))`,st_numinteriorrings(`test`.`gis_polygon`.`g`) AS `NumInteriorRings(g)`,st_astext(st_interiorringn(`test`.`gis_polygon`.`g`,1)) AS `AsText(InteriorRingN(g, 1))` from `test`.`gis_polygon`
+SELECT fid, IsClosed(g) FROM gis_multi_line ORDER by fid;
+fid IsClosed(g)
+114 0
+115 0
+116 0
+SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon ORDER by fid;
+fid AsText(Centroid(g))
+117 POINT(55.58852775304245 17.426536064113982)
+118 POINT(55.58852775304245 17.426536064113982)
+119 POINT(2 2)
+SELECT fid, Area(g) FROM gis_multi_polygon ORDER by fid;
+fid Area(g)
+117 1684.5
+118 1684.5
+119 4.5
+SELECT fid, NumGeometries(g) from gis_multi_point ORDER by fid;
+fid NumGeometries(g)
+111 4
+112 4
+113 2
+SELECT fid, NumGeometries(g) from gis_multi_line ORDER by fid;
+fid NumGeometries(g)
+114 2
+115 1
+116 2
+SELECT fid, NumGeometries(g) from gis_multi_polygon ORDER by fid;
+fid NumGeometries(g)
+117 2
+118 2
+119 1
+SELECT fid, NumGeometries(g) from gis_geometrycollection ORDER by fid;
+fid NumGeometries(g)
+120 2
+121 2
+explain extended SELECT fid, NumGeometries(g) from gis_multi_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select `test`.`gis_multi_point`.`fid` AS `fid`,st_numgeometries(`test`.`gis_multi_point`.`g`) AS `NumGeometries(g)` from `test`.`gis_multi_point`
+SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point ORDER by fid;
+fid AsText(GeometryN(g, 2))
+111 POINT(10 10)
+112 POINT(11 11)
+113 POINT(4 10)
+SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_line ORDER by fid;
+fid AsText(GeometryN(g, 2))
+114 LINESTRING(16 0,16 23,16 48)
+115 NULL
+116 LINESTRING(2 5,5 8,21 7)
+SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_polygon ORDER by fid;
+fid AsText(GeometryN(g, 2))
+117 POLYGON((59 18,67 18,67 13,59 13,59 18))
+118 POLYGON((59 18,67 18,67 13,59 13,59 18))
+119 NULL
+SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection ORDER by fid;
+fid AsText(GeometryN(g, 2))
+120 LINESTRING(0 0,10 10)
+121 LINESTRING(3 6,7 9)
+SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection ORDER by fid;
+fid AsText(GeometryN(g, 1))
+120 POINT(0 0)
+121 POINT(44 6)
+explain extended SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select `test`.`gis_multi_point`.`fid` AS `fid`,st_astext(st_geometryn(`test`.`gis_multi_point`.`g`,2)) AS `AsText(GeometryN(g, 2))` from `test`.`gis_multi_point`
+SELECT g1.fid as first, g2.fid as second,
+Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o,
+Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t,
+Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+first second w c o e d t i r
+120 120 1 1 0 1 0 0 1 0
+120 121 0 0 1 0 0 0 1 0
+121 120 0 0 1 0 0 0 1 0
+121 121 1 1 0 1 0 0 1 0
+explain extended SELECT g1.fid as first, g2.fid as second,
+Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o,
+Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t,
+Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE g1 ALL NULL NULL NULL NULL 2 100.00 Using temporary; Using filesort
+1 SIMPLE g2 ALL NULL NULL NULL NULL 2 100.00 Using join buffer (flat, BNL join)
+Warnings:
+Note 1003 select `test`.`g1`.`fid` AS `first`,`test`.`g2`.`fid` AS `second`,st_within(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,st_contains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,mbroverlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,st_equals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,mbrdisjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,st_touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,mbrintersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,st_crosses(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `r` from `test`.`gis_geometrycollection` `g1` join `test`.`gis_geometrycollection` `g2` order by `test`.`g1`.`fid`,`test`.`g2`.`fid`
+DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+CREATE TABLE t1 (
+a INTEGER PRIMARY KEY AUTO_INCREMENT,
+gp point,
+ln linestring,
+pg polygon,
+mp multipoint,
+mln multilinestring,
+mpg multipolygon,
+gc geometrycollection,
+gm geometry
+);
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+a int(11) NO PRI NULL auto_increment
+gp point YES NULL
+ln linestring YES NULL
+pg polygon YES NULL
+mp multipoint YES NULL
+mln multilinestring YES NULL
+mpg multipolygon YES NULL
+gc geometrycollection YES NULL
+gm geometry YES NULL
+ALTER TABLE t1 ADD fid INT;
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+a int(11) NO PRI NULL auto_increment
+gp point YES NULL
+ln linestring YES NULL
+pg polygon YES NULL
+mp multipoint YES NULL
+mln multilinestring YES NULL
+mpg multipolygon YES NULL
+gc geometrycollection YES NULL
+gm geometry YES NULL
+fid int(11) YES NULL
+DROP TABLE t1;
+create table t1 (pk integer primary key auto_increment, a geometry not null);
+insert into t1 (a) values (GeomFromText('Point(1 2)'));
+insert into t1 (a) values ('Garbage');
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert IGNORE into t1 (a) values ('Garbage');
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+drop table t1;
+create table t1 (pk integer primary key auto_increment, fl geometry not null);
+insert into t1 (fl) values (1);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 (fl) values (1.11);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 (fl) values ("qwerty");
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 (fl) values (pointfromtext('point(1,1)'));
+ERROR 23000: Column 'fl' cannot be null
+drop table t1;
+End of 4.1 tests
+CREATE TABLE t1 (name VARCHAR(100), square GEOMETRY);
+INSERT INTO t1 VALUES("center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
+INSERT INTO t1 VALUES("small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+INSERT INTO t1 VALUES("up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+INSERT INTO t1 VALUES("down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+INSERT INTO t1 VALUES("right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+INSERT INTO t1 VALUES("left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrcontains
+center,small
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrdisjoint
+down3,left3,right3,up3
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrequal
+center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrintersect
+big,center,down,down2,left,left2,right,right2,small,up,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbroverlaps
+down,left,right,up
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrtouches FROM t1 a1 JOIN t1 a2 ON MBRTouches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrtouches
+down2,left2,right2,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrwithin
+big,center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+contains
+center,small
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+disjoint
+down3,left3,right3,up3
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+equals
+center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+intersect
+big,center,down,down2,left,left2,right,right2,small,up,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+overlaps
+down,left,right,up
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS touches FROM t1 a1 JOIN t1 a2 ON Touches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+touches
+down2,left2,right2,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS within FROM t1 a1 JOIN t1 a2 ON Within( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+within
+big,center
+SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+SET @point1 = GeomFromText('POLYGON ((0 0))');
+SET @point2 = GeomFromText('POLYGON ((-2 0))');
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
+overlaps
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
+overlaps
+SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
+Overlaps(@horiz1, @vert1)
+0
+SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
+Overlaps(@horiz1, @horiz2)
+1
+SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
+Overlaps(@horiz1, @horiz3)
+0
+SELECT Overlaps(@horiz1, @point1) FROM DUAL;
+Overlaps(@horiz1, @point1)
+0
+SELECT Overlaps(@horiz1, @point2) FROM DUAL;
+Overlaps(@horiz1, @point2)
+0
+DROP TABLE t1;
+End of 5.0 tests
+CREATE TABLE t1 (p POINT);
+CREATE TABLE t2 (p POINT, INDEX(p));
+INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
+INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+1
+EXPLAIN
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ref p p 28 const 1 Using where
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+1
+INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
+INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
+EXPLAIN
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+EXPLAIN
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ref p p 28 const # Using where
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+EXPLAIN
+SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
+SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+DROP TABLE t1, t2;
+End of 5.0 tests
+#
+# Test for bug #58650 "Failing assertion: primary_key_no == -1 ||
+# primary_key_no == 0".
+#
+drop table if exists t1;
+# The minimal test case.
+create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a));
+drop table t1;
+# The original test case.
+create table t1 (a int not null, b linestring not null, unique key b (b(12)));
+create unique index a on t1(a);
+drop table t1;
+create table t1 (g geometry not null, spatial gk(g)) engine=innodb;
+DROP TABLE t1;
+create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb;
+connect a,localhost,root,,;
+connection a;
+start transaction;
+insert into t1 values(1, Point(1,1));
+connect con1,localhost,root,,;
+connection con1;
+set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))');
+set transaction isolation level read uncommitted;
+select count(*) from t1 where ST_Within(t1.c2, @g1);
+count(*)
+0
+disconnect con1;
+connection a;
+commit;
+disconnect a;
+connection default;
+drop table t1;
diff --git a/mysql-test/suite/innodb_gis/r/1.result b/mysql-test/suite/innodb_gis/r/1.result
new file mode 100644
index 00000000000..95baf21cf78
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/1.result
@@ -0,0 +1,1499 @@
+SET default_storage_engine=InnoDB;
+SET innodb_strict_mode=OFF;
+CREATE TABLE gis_point (fid INTEGER NOT NULL PRIMARY KEY, g POINT);
+CREATE TABLE gis_line (fid INTEGER NOT NULL PRIMARY KEY, g LINESTRING);
+CREATE TABLE gis_polygon (fid INTEGER NOT NULL PRIMARY KEY, g POLYGON);
+CREATE TABLE gis_multi_point (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOINT);
+CREATE TABLE gis_multi_line (fid INTEGER NOT NULL PRIMARY KEY, g MULTILINESTRING);
+CREATE TABLE gis_multi_polygon (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOLYGON);
+CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRYCOLLECTION);
+CREATE TABLE gis_geometry (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY);
+SHOW FIELDS FROM gis_point;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g point YES NULL
+SHOW FIELDS FROM gis_line;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g linestring YES NULL
+SHOW FIELDS FROM gis_polygon;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g polygon YES NULL
+SHOW FIELDS FROM gis_multi_point;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g multipoint YES NULL
+SHOW FIELDS FROM gis_multi_line;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g multilinestring YES NULL
+SHOW FIELDS FROM gis_multi_polygon;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g multipolygon YES NULL
+SHOW FIELDS FROM gis_geometrycollection;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g geometrycollection YES NULL
+SHOW FIELDS FROM gis_geometry;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g geometry YES NULL
+INSERT INTO gis_point VALUES
+(101, ST_PointFromText('POINT(10 10)')),
+(102, ST_PointFromText('POINT(20 10)')),
+(103, ST_PointFromText('POINT(20 20)')),
+(104, ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(10 20)'))));
+INSERT INTO gis_line VALUES
+(105, ST_LineFromText('LINESTRING(0 0,0 10,10 0)')),
+(106, ST_LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+(107, ST_LineStringFromWKB(ST_AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+INSERT INTO gis_polygon VALUES
+(108, ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+(109, ST_PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+(110, ST_PolyFromWKB(ST_AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+INSERT INTO gis_multi_point VALUES
+(111, ST_MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+(112, ST_MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+(113, ST_MPointFromWKB(ST_AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+INSERT INTO gis_multi_line VALUES
+(114, ST_MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+(115, ST_MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+(116, ST_MLineFromWKB(ST_AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+INSERT INTO gis_multi_polygon VALUES
+(117, ST_MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(118, ST_MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(119, ST_MPolyFromWKB(ST_AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+INSERT INTO gis_geometrycollection VALUES
+(120, ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+(121, ST_GeometryFromWKB(ST_AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
+INSERT into gis_geometry SELECT * FROM gis_point;
+INSERT into gis_geometry SELECT * FROM gis_line;
+INSERT into gis_geometry SELECT * FROM gis_polygon;
+INSERT into gis_geometry SELECT * FROM gis_multi_point;
+INSERT into gis_geometry SELECT * FROM gis_multi_line;
+INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+SELECT fid, ST_AsText(g) FROM gis_point;
+fid ST_AsText(g)
+101 POINT(10 10)
+102 POINT(20 10)
+103 POINT(20 20)
+104 POINT(10 20)
+SELECT fid, ST_AsText(g) FROM gis_line;
+fid ST_AsText(g)
+105 LINESTRING(0 0,0 10,10 0)
+106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+107 LINESTRING(10 10,40 10)
+SELECT fid, ST_AsText(g) FROM gis_polygon;
+fid ST_AsText(g)
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+110 POLYGON((0 0,30 0,30 30,0 0))
+SELECT fid, ST_AsText(g) FROM gis_multi_point;
+fid ST_AsText(g)
+111 MULTIPOINT(0 0,10 10,10 20,20 20)
+112 MULTIPOINT(1 1,11 11,11 21,21 21)
+113 MULTIPOINT(3 6,4 10)
+SELECT fid, ST_AsText(g) FROM gis_multi_line;
+fid ST_AsText(g)
+114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+115 MULTILINESTRING((10 48,10 21,10 0))
+116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+SELECT fid, ST_AsText(g) FROM gis_multi_polygon;
+fid ST_AsText(g)
+117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+SELECT fid, ST_AsText(g) FROM gis_geometrycollection;
+fid ST_AsText(g)
+120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+SELECT fid, ST_AsText(g) FROM gis_geometry;
+fid ST_AsText(g)
+101 POINT(10 10)
+102 POINT(20 10)
+103 POINT(20 20)
+104 POINT(10 20)
+105 LINESTRING(0 0,0 10,10 0)
+106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+107 LINESTRING(10 10,40 10)
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+110 POLYGON((0 0,30 0,30 30,0 0))
+111 MULTIPOINT(0 0,10 10,10 20,20 20)
+112 MULTIPOINT(1 1,11 11,11 21,21 21)
+113 MULTIPOINT(3 6,4 10)
+114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+115 MULTILINESTRING((10 48,10 21,10 0))
+116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+SELECT fid, ST_Dimension(g) FROM gis_geometry;
+fid ST_Dimension(g)
+101 0
+102 0
+103 0
+104 0
+105 1
+106 1
+107 1
+108 2
+109 2
+110 2
+111 0
+112 0
+113 0
+114 1
+115 1
+116 1
+117 2
+118 2
+119 2
+120 1
+121 1
+SELECT fid, ST_GeometryType(g) FROM gis_geometry;
+fid ST_GeometryType(g)
+101 POINT
+102 POINT
+103 POINT
+104 POINT
+105 LINESTRING
+106 LINESTRING
+107 LINESTRING
+108 POLYGON
+109 POLYGON
+110 POLYGON
+111 MULTIPOINT
+112 MULTIPOINT
+113 MULTIPOINT
+114 MULTILINESTRING
+115 MULTILINESTRING
+116 MULTILINESTRING
+117 MULTIPOLYGON
+118 MULTIPOLYGON
+119 MULTIPOLYGON
+120 GEOMETRYCOLLECTION
+121 GEOMETRYCOLLECTION
+SELECT fid, ST_IsEmpty(g) FROM gis_geometry;
+fid ST_IsEmpty(g)
+101 0
+102 0
+103 0
+104 0
+105 0
+106 0
+107 0
+108 0
+109 0
+110 0
+111 0
+112 0
+113 0
+114 0
+115 0
+116 0
+117 0
+118 0
+119 0
+120 0
+121 0
+SELECT fid, ST_AsText(ST_Envelope(g)) FROM gis_geometry;
+fid ST_AsText(ST_Envelope(g))
+101 POLYGON((10 10,10 10,10 10,10 10,10 10))
+102 POLYGON((20 10,20 10,20 10,20 10,20 10))
+103 POLYGON((20 20,20 20,20 20,20 20,20 20))
+104 POLYGON((10 20,10 20,10 20,10 20,10 20))
+105 POLYGON((0 0,10 0,10 10,0 10,0 0))
+106 POLYGON((10 10,20 10,20 20,10 20,10 10))
+107 POLYGON((10 10,40 10,40 10,10 10,10 10))
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0))
+110 POLYGON((0 0,30 0,30 30,0 30,0 0))
+111 POLYGON((0 0,20 0,20 20,0 20,0 0))
+112 POLYGON((1 1,21 1,21 21,1 21,1 1))
+113 POLYGON((3 6,4 6,4 10,3 10,3 6))
+114 POLYGON((10 0,16 0,16 48,10 48,10 0))
+115 POLYGON((10 0,10 0,10 48,10 48,10 0))
+116 POLYGON((1 2,21 2,21 8,1 8,1 2))
+117 POLYGON((28 0,84 0,84 42,28 42,28 0))
+118 POLYGON((28 0,84 0,84 42,28 42,28 0))
+119 POLYGON((0 0,3 0,3 3,0 3,0 0))
+120 POLYGON((0 0,10 0,10 10,0 10,0 0))
+121 POLYGON((3 6,44 6,44 9,3 9,3 6))
+explain extended select ST_Dimension(g), ST_GeometryType(g), ST_IsEmpty(g), ST_AsText(ST_Envelope(g)) from gis_geometry;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_geometry ALL NULL NULL NULL NULL 21 #
+Warnings:
+Note 1003 select st_dimension(`test`.`gis_geometry`.`g`) AS `ST_Dimension(g)`,st_geometrytype(`test`.`gis_geometry`.`g`) AS `ST_GeometryType(g)`,st_isempty(`test`.`gis_geometry`.`g`) AS `ST_IsEmpty(g)`,st_astext(st_envelope(`test`.`gis_geometry`.`g`)) AS `ST_AsText(ST_Envelope(g))` from `test`.`gis_geometry`
+SELECT fid, ST_X(g) FROM gis_point;
+fid ST_X(g)
+101 10
+102 20
+103 20
+104 10
+SELECT fid, ST_Y(g) FROM gis_point;
+fid ST_Y(g)
+101 10
+102 10
+103 20
+104 20
+explain extended select ST_X(g),ST_Y(g) FROM gis_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_point ALL NULL NULL NULL NULL 4 #
+Warnings:
+Note 1003 select st_x(`test`.`gis_point`.`g`) AS `ST_X(g)`,st_y(`test`.`gis_point`.`g`) AS `ST_Y(g)` from `test`.`gis_point`
+SELECT fid, ST_AsText(ST_StartPoint(g)) FROM gis_line;
+fid ST_AsText(ST_StartPoint(g))
+105 POINT(0 0)
+106 POINT(10 10)
+107 POINT(10 10)
+SELECT fid, ST_AsText(ST_EndPoint(g)) FROM gis_line;
+fid ST_AsText(ST_EndPoint(g))
+105 POINT(10 0)
+106 POINT(10 10)
+107 POINT(40 10)
+SELECT fid, ST_Length(g) FROM gis_line;
+fid ST_Length(g)
+105 24.14213562373095
+106 40
+107 30
+SELECT fid, ST_NumPoints(g) FROM gis_line;
+fid ST_NumPoints(g)
+105 3
+106 5
+107 2
+SELECT fid, ST_AsText(ST_PointN(g, 2)) FROM gis_line;
+fid ST_AsText(ST_PointN(g, 2))
+105 POINT(0 10)
+106 POINT(20 10)
+107 POINT(40 10)
+SELECT fid, ST_IsClosed(g) FROM gis_line;
+fid ST_IsClosed(g)
+105 0
+106 1
+107 0
+explain extended select ST_AsText(ST_StartPoint(g)),ST_AsText(ST_EndPoint(g)),ST_Length(g),ST_NumPoints(g),ST_AsText(ST_PointN(g, 2)),ST_IsClosed(g) FROM gis_line;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_line ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select st_astext(st_startpoint(`test`.`gis_line`.`g`)) AS `ST_AsText(ST_StartPoint(g))`,st_astext(st_endpoint(`test`.`gis_line`.`g`)) AS `ST_AsText(ST_EndPoint(g))`,st_length(`test`.`gis_line`.`g`) AS `ST_Length(g)`,st_numpoints(`test`.`gis_line`.`g`) AS `ST_NumPoints(g)`,st_astext(st_pointn(`test`.`gis_line`.`g`,2)) AS `ST_AsText(ST_PointN(g, 2))`,st_isclosed(`test`.`gis_line`.`g`) AS `ST_IsClosed(g)` from `test`.`gis_line`
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_polygon;
+fid ST_AsText(ST_Centroid(g))
+108 POINT(15 15)
+109 POINT(25.416666666666668 25.416666666666668)
+110 POINT(20 10)
+SELECT fid, ST_Area(g) FROM gis_polygon;
+fid ST_Area(g)
+108 100
+109 2400
+110 450
+SELECT fid, ST_AsText(ST_ExteriorRing(g)) FROM gis_polygon;
+fid ST_AsText(ST_ExteriorRing(g))
+108 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+109 LINESTRING(0 0,50 0,50 50,0 50,0 0)
+110 LINESTRING(0 0,30 0,30 30,0 0)
+SELECT fid, ST_NumInteriorRings(g) FROM gis_polygon;
+fid ST_NumInteriorRings(g)
+108 0
+109 1
+110 0
+SELECT fid, ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+fid ST_AsText(ST_InteriorRingN(g, 1))
+108 NULL
+109 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+110 NULL
+explain extended select ST_AsText(ST_Centroid(g)),ST_Area(g),ST_AsText(ST_ExteriorRing(g)),ST_NumInteriorRings(g),ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_polygon ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select st_astext(st_centroid(`test`.`gis_polygon`.`g`)) AS `ST_AsText(ST_Centroid(g))`,st_area(`test`.`gis_polygon`.`g`) AS `ST_Area(g)`,st_astext(st_exteriorring(`test`.`gis_polygon`.`g`)) AS `ST_AsText(ST_ExteriorRing(g))`,st_numinteriorrings(`test`.`gis_polygon`.`g`) AS `ST_NumInteriorRings(g)`,st_astext(st_interiorringn(`test`.`gis_polygon`.`g`,1)) AS `ST_AsText(ST_InteriorRingN(g, 1))` from `test`.`gis_polygon`
+SELECT fid, ST_IsClosed(g) FROM gis_multi_line;
+fid ST_IsClosed(g)
+114 0
+115 0
+116 0
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_multi_polygon;
+fid ST_AsText(ST_Centroid(g))
+117 POINT(55.58852775304245 17.426536064113982)
+118 POINT(55.58852775304245 17.426536064113982)
+119 POINT(2 2)
+SELECT fid, ST_Area(g) FROM gis_multi_polygon;
+fid ST_Area(g)
+117 1684.5
+118 1684.5
+119 4.5
+SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+fid ST_NumGeometries(g)
+111 4
+112 4
+113 2
+SELECT fid, ST_NumGeometries(g) from gis_multi_line;
+fid ST_NumGeometries(g)
+114 2
+115 1
+116 2
+SELECT fid, ST_NumGeometries(g) from gis_multi_polygon;
+fid ST_NumGeometries(g)
+117 2
+118 2
+119 1
+SELECT fid, ST_NumGeometries(g) from gis_geometrycollection;
+fid ST_NumGeometries(g)
+120 2
+121 2
+explain extended SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select `test`.`gis_multi_point`.`fid` AS `fid`,st_numgeometries(`test`.`gis_multi_point`.`g`) AS `ST_NumGeometries(g)` from `test`.`gis_multi_point`
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+fid ST_AsText(ST_GeometryN(g, 2))
+111 POINT(10 10)
+112 POINT(11 11)
+113 POINT(4 10)
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_line;
+fid ST_AsText(ST_GeometryN(g, 2))
+114 LINESTRING(16 0,16 23,16 48)
+115 NULL
+116 LINESTRING(2 5,5 8,21 7)
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_polygon;
+fid ST_AsText(ST_GeometryN(g, 2))
+117 POLYGON((59 18,67 18,67 13,59 13,59 18))
+118 POLYGON((59 18,67 18,67 13,59 13,59 18))
+119 NULL
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_geometrycollection;
+fid ST_AsText(ST_GeometryN(g, 2))
+120 LINESTRING(0 0,10 10)
+121 LINESTRING(3 6,7 9)
+SELECT fid, ST_AsText(ST_GeometryN(g, 1)) from gis_geometrycollection;
+fid ST_AsText(ST_GeometryN(g, 1))
+120 POINT(0 0)
+121 POINT(44 6)
+explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select `test`.`gis_multi_point`.`fid` AS `fid`,st_astext(st_geometryn(`test`.`gis_multi_point`.`g`,2)) AS `ST_AsText(ST_GeometryN(g, 2))` from `test`.`gis_multi_point`
+SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+first second w c o e d t i r
+120 120 1 1 0 1 0 0 1 0
+120 121 0 0 1 0 0 0 1 0
+121 120 0 0 1 0 0 0 1 0
+121 121 1 1 0 1 0 0 1 0
+explain extended SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE g1 ALL NULL NULL NULL NULL 2 # Using temporary; Using filesort
+1 SIMPLE g2 ALL NULL NULL NULL NULL 2 # Using join buffer (flat, BNL join)
+Warnings:
+Note 1003 select `test`.`g1`.`fid` AS `first`,`test`.`g2`.`fid` AS `second`,mbrwithin(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,mbrcontains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,mbroverlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,mbrequals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,mbrdisjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,st_touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,mbrintersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,st_crosses(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `r` from `test`.`gis_geometrycollection` `g1` join `test`.`gis_geometrycollection` `g2` order by `test`.`g1`.`fid`,`test`.`g2`.`fid`
+DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+CREATE TABLE t1 (
+gp point,
+ln linestring,
+pg polygon,
+mp multipoint,
+mln multilinestring,
+mpg multipolygon,
+gc geometrycollection,
+gm geometry
+);
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+gp point YES NULL
+ln linestring YES NULL
+pg polygon YES NULL
+mp multipoint YES NULL
+mln multilinestring YES NULL
+mpg multipolygon YES NULL
+gc geometrycollection YES NULL
+gm geometry YES NULL
+ALTER TABLE t1 ADD fid INT NOT NULL;
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+gp point YES NULL
+ln linestring YES NULL
+pg polygon YES NULL
+mp multipoint YES NULL
+mln multilinestring YES NULL
+mpg multipolygon YES NULL
+gc geometrycollection YES NULL
+gm geometry YES NULL
+fid int(11) NO NULL
+DROP TABLE t1;
+SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))))
+POINT(1 4)
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select st_astext(st_geometryfromwkb(st_aswkb(st_geometryfromtext('POINT(1 4)')))) AS `ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))))`
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)'))));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select st_astext(st_geometryfromwkb(st_aswkb(st_geometryfromtext('POINT(1 4)')))) AS `ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)'))))`
+SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101))
+101
+explain extended SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select srid(st_geometryfromtext('LineString(1 1,2 2)',101)) AS `ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101))`
+explain extended select ST_issimple(MultiPoint(Point(3, 6), Point(4, 10))), ST_issimple(Point(3, 6));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select st_issimple(st_multipoint(point(3,6),point(4,10))) AS `ST_issimple(MultiPoint(Point(3, 6), Point(4, 10)))`,st_issimple(point(3,6)) AS `ST_issimple(Point(3, 6))`
+create table t1 (a geometry not null);
+insert into t1 values (ST_GeomFromText('Point(1 2)'));
+insert into t1 values ('Garbage');
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert IGNORE into t1 values ('Garbage');
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+alter table t1 add spatial index(a);
+drop table t1;
+create table t1(a geometry not null, index(a(5)));
+insert into t1 values
+(ST_GeomFromText('POINT(1 1)')), (ST_GeomFromText('POINT(3 3)')),
+(ST_GeomFromText('POINT(4 4)')), (ST_GeomFromText('POINT(6 6)'));
+select ST_AsText(a) from t1 where
+MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+or
+MBRContains(ST_GeomFromText('Polygon((2 2, 2 5, 5 5, 5 2, 2 2))'), a);
+ST_AsText(a)
+POINT(1 1)
+POINT(3 3)
+POINT(4 4)
+select ST_AsText(a) from t1 where
+MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+and
+MBRContains(ST_GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a);
+ST_AsText(a)
+POINT(1 1)
+drop table t1;
+CREATE TABLE t1 (Coordinates POINT NOT NULL, INDEX(Coordinates(10)));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(383293632 1754448)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(564952612 157516260)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(903994614 180726515)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(98128178 141127631)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(862547902 799334546)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(341989013 850270906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(803302376 93039099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(857439153 817431356)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(319757546 343162742)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(826341972 717484432)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(305066789 201736238)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(626068992 616241497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(55789424 755830108)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(802874458 312435220)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(153795660 551723671)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(242207428 537089292)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(553478119 807160039)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(694605552 457472733)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(987886554 792733729)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(598600363 850434457)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(592068275 940589376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(700705362 395370650)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(33628474 558144514)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(212802006 353386020)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(901307256 39143977)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(70870451 206374045)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(240880214 696939443)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(822615542 296669638)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(452769551 625489999)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(609104858 606565210)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(177213669 851312285)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(143654501 730691787)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(658472325 838260052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(188164520 646358878)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(630993781 786764883)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(496793334 223062055)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(727354258 197498696)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(618432704 760982731)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(755643210 831234710)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(114368751 656950466)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(870378686 185239202)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(863324511 111258900)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(882178645 685940052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(407928538 334948195)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(311430051 17033395)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941513405 488643719)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(868345680 85167906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(219335507 526818004)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(923427958 407500026)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(173176882 554421738)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(194264908 669970217)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(777483793 921619165)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(867468912 395916497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(682601897 623112122)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(227151206 796970647)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(280062588 97529892)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(982209849 143387099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(208788792 864388493)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(829327151 616717329)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(199336688 140757201)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(633750724 140850093)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(629400920 502096404)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(226017998 848736426)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(28914408 149445955)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(256236452 202091290)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(703867693 450501360)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(872061506 481351486)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(372120524 739530418)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(877267982 54722420)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(362642540 104419188)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(851693067 642705127)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(201949080 833902916)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(786092225 410737872)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(698291409 615419376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(27455201 897628096)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(756176576 661205925)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(38478189 385577496)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(163302328 264496186)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(234313922 192216735)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(413942141 490550373)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(394308025 117809834)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941051732 266369530)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(599161319 313172256)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(5899948 476429301)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(367894677 368542487)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(580848489 219587743)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(11247614 782797569)'));
+drop table t1;
+create table t1 select ST_GeomFromWKB(POINT(1,3));
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `ST_GeomFromWKB(POINT(1,3))` geometry DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+drop table t1;
+SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
+CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo`
+geometry NOT NULL default '') ENGINE=InnoDB ;
+SET sql_mode = default;
+insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363
+36.305435,-114.992394 36.305202,-114.991219 36.305975,-114.991163
+36.306845,-114.989432 36.309452,-114.978275 36.312642,-114.977363
+36.311978,-114.975327 36.312344,-114.96502 36.31597,-114.963364
+36.313629,-114.961723 36.313721,-114.956398 36.316057,-114.951882
+36.320979,-114.947073 36.323475,-114.945207 36.326451,-114.945207
+36.326451,-114.944132 36.326061,-114.94003 36.326588,-114.924017
+36.334484,-114.923281 36.334146,-114.92564 36.331504,-114.94072
+36.319282,-114.945348 36.314812,-114.948091 36.314762,-114.951755
+36.316211,-114.952446 36.313883,-114.952644 36.309488,-114.944725
+36.313083,-114.93706 36.32043,-114.932478 36.323497,-114.924556
+36.327708,-114.922608 36.329715,-114.92009 36.328695,-114.912105
+36.323566,-114.901647 36.317952,-114.897436 36.313968,-114.895344
+36.309573,-114.891699 36.304398,-114.890569 36.303551,-114.886356
+36.302702,-114.885141 36.301351,-114.885709 36.297391,-114.892499
+36.290893,-114.902142 36.288974,-114.904941 36.288838,-114.905308
+36.289845,-114.906325 36.290395,-114.909916 36.289549,-114.914527
+36.287535,-114.918797 36.284423,-114.922982 36.279731,-114.924113
+36.277282,-114.924057 36.275817,-114.927733 36.27053,-114.929354
+36.269029,-114.929354 36.269029,-114.950856 36.268715,-114.950768
+36.264324,-114.960206 36.264293,-114.960301 36.268943,-115.006662
+36.268929,-115.008583 36.265619,-115.00665 36.264247,-115.006659
+36.246873,-115.006659 36.246873,-115.006838 36.247697,-115.010764
+36.247774,-115.015609 36.25113,-115.015765 36.254505,-115.029517
+36.254619,-115.038573 36.249317,-115.038573 36.249317,-115.023403
+36.25841,-115.023873 36.258994,-115.031845 36.259829,-115.03183
+36.261053,-115.025561 36.261095,-115.036417 36.274632,-115.033729
+36.276041,-115.032217 36.274851,-115.029845 36.273959,-115.029934
+36.274966,-115.025763 36.274896,-115.025406 36.281044,-115.028731
+36.284471,-115.036497 36.290377,-115.042071 36.291039,-115.026759
+36.298478,-115.008995 36.301966,-115.006363 36.305435),(-115.079835
+36.244369,-115.079735 36.260186,-115.076435 36.262369,-115.069758
+36.265,-115.070235 36.268757,-115.064542 36.268655,-115.061843
+36.269857,-115.062676 36.270693,-115.06305 36.272344,-115.059051
+36.281023,-115.05918 36.283008,-115.060591 36.285246,-115.061913
+36.290022,-115.062499 36.306353,-115.062499 36.306353,-115.060918
+36.30642,-115.06112 36.289779,-115.05713 36.2825,-115.057314
+36.279446,-115.060779 36.274659,-115.061366 36.27209,-115.057858
+36.26557,-115.055805 36.262883,-115.054688 36.262874,-115.047335
+36.25037,-115.044234 36.24637,-115.052434 36.24047,-115.061734
+36.23507,-115.061934 36.22677,-115.061934 36.22677,-115.061491
+36.225267,-115.062024 36.218194,-115.060134 36.218278,-115.060133
+36.210771,-115.057833 36.210771,-115.057433 36.196271,-115.062233
+36.196271,-115.062233 36.190371,-115.062233 36.190371,-115.065533
+36.190371,-115.071333 36.188571,-115.098331 36.188275,-115.098331
+36.188275,-115.098435 36.237569,-115.097535 36.240369,-115.097535
+36.240369,-115.093235 36.240369,-115.089135 36.240469,-115.083135
+36.240569,-115.083135 36.240569,-115.079835
+36.244369)))')),('85998',ST_GeomFromText('MULTIPOLYGON(((-115.333107
+36.264587,-115.333168 36.280638,-115.333168 36.280638,-115.32226
+36.280643,-115.322538 36.274311,-115.327222 36.274258,-115.32733
+36.263026,-115.330675 36.262984,-115.332132 36.264673,-115.333107
+36.264587),(-115.247239 36.247066,-115.247438 36.218267,-115.247438
+36.218267,-115.278525 36.219263,-115.278525 36.219263,-115.301545
+36.219559,-115.332748 36.219197,-115.332757 36.220041,-115.332757
+36.220041,-115.332895 36.233514,-115.349023 36.233479,-115.351489
+36.234475,-115.353681 36.237021,-115.357106 36.239789,-115.36519
+36.243331,-115.368156 36.243487,-115.367389 36.244902,-115.364553
+36.246014,-115.359219 36.24616,-115.356186 36.248025,-115.353347
+36.248004,-115.350813 36.249507,-115.339673 36.25387,-115.333069
+36.255018,-115.333069 36.255018,-115.333042 36.247767,-115.279039
+36.248666,-115.263639 36.247466,-115.263839 36.252766,-115.261439
+36.252666,-115.261439 36.247366,-115.247239 36.247066)))'));
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85998;
+object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo))
+85998 MULTIPOLYGON 1 POINT(115.31877315203187 -36.23747282102153)
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85984;
+object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo))
+85984 MULTIPOLYGON 1 POINT(-114.87787186923313 36.33101763469059)
+drop table t1;
+create table t1 (fl geometry not null);
+insert into t1 values (1);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 values (1.11);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 values ("qwerty");
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 values (ST_pointfromtext('point(1,1)'));
+ERROR 23000: Column 'fl' cannot be null
+drop table t1;
+select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000))));
+(ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000))))
+POINT(10 10)
+select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440))));
+(ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440))))
+POINT(10 10)
+create table t1 (g GEOMETRY);
+select * from t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def test t1 t1 g g 255 4294967295 0 Y 144 0 63
+g
+select ST_asbinary(g) from t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def ST_asbinary(g) 252 4294967295 0 Y 128 0 63
+ST_asbinary(g)
+drop table t1;
+create table t1 (a TEXT, b GEOMETRY NOT NULL, INDEX(b(5)));
+alter table t1 disable keys;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+load data infile '../../std_data/bad_gis_data.dat' into table t1;
+ERROR 22004: Column set to default value; NULL supplied to NOT NULL column 'b' at row 1
+alter table t1 enable keys;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+drop table t1;
+create table t1 (a int, b blob);
+insert into t1 values (1, ''), (2, NULL), (3, '1');
+select * from t1;
+a b
+1
+2 NULL
+3 1
+select
+ST_geometryfromtext(b) IS NULL, ST_geometryfromwkb(b) IS NULL, ST_astext(b) IS NULL,
+ST_aswkb(b) IS NULL, ST_geometrytype(b) IS NULL, ST_centroid(b) IS NULL,
+ST_envelope(b) IS NULL, ST_startpoint(b) IS NULL, ST_endpoint(b) IS NULL,
+ST_exteriorring(b) IS NULL, ST_pointn(b, 1) IS NULL, ST_geometryn(b, 1) IS NULL,
+ST_interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, ST_isempty(b) IS NULL,
+ST_issimple(b) IS NULL, ST_isclosed(b) IS NULL, ST_dimension(b) IS NULL,
+ST_numgeometries(b) IS NULL, ST_numinteriorrings(b) IS NULL, ST_numpoints(b) IS NULL,
+ST_area(b) IS NULL, ST_length(b) IS NULL, ST_srid(b) IS NULL, ST_x(b) IS NULL,
+ST_y(b) IS NULL
+from t1;
+ERROR 22007: Illegal non geometric '`test`.`t1`.`b`' value found during parsing
+select
+MBRwithin(b, b) IS NULL, MBRcontains(b, b) IS NULL, MBRoverlaps(b, b) IS NULL,
+MBRequals(b, b) IS NULL, MBRdisjoint(b, b) IS NULL, ST_touches(b, b) IS NULL,
+MBRintersects(b, b) IS NULL, ST_crosses(b, b) IS NULL
+from t1;
+MBRwithin(b, b) IS NULL MBRcontains(b, b) IS NULL MBRoverlaps(b, b) IS NULL MBRequals(b, b) IS NULL MBRdisjoint(b, b) IS NULL ST_touches(b, b) IS NULL MBRintersects(b, b) IS NULL ST_crosses(b, b) IS NULL
+1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1
+select
+point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
+multilinestring(b) IS NULL, multipolygon(b) IS NULL,
+geometrycollection(b) IS NULL
+from t1;
+ERROR 22007: Illegal non geometric '`test`.`t1`.`b`' value found during parsing
+drop table t1;
+CREATE TABLE t1(a POINT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (NULL);
+SELECT * FROM t1;
+a
+NULL
+DROP TABLE t1;
+CREATE TABLE `t1` ( `col9` set('a'), `col89` date);
+INSERT IGNORE INTO `t1` VALUES ('','0000-00-00');
+select ST_geomfromtext(col9,col89) as a from t1;
+a
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (
+geomdata polygon NOT NULL,
+KEY index_geom (geomdata(10))
+) ENGINE=InnoDB DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+Warnings:
+Warning 1478 InnoDB: assuming ROW_FORMAT=DYNAMIC.
+CREATE TABLE t2 (
+geomdata polygon NOT NULL,
+KEY index_geom (geomdata(10))
+) ENGINE=InnoDB DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+Warnings:
+Warning 1478 InnoDB: assuming ROW_FORMAT=DYNAMIC.
+CREATE TABLE t3
+select
+ST_aswkb(ws.geomdata) AS geomdatawkb
+from
+t1 ws
+union
+select
+ST_aswkb(ws.geomdata) AS geomdatawkb
+from
+t2 ws;
+describe t3;
+Field Type Null Key Default Extra
+geomdatawkb longblob YES NULL
+drop table t1;
+drop table t2;
+drop table t3;
+create table t1(col1 geometry default null,col15 geometrycollection not
+null, index(col15(5)),index(col1(15)))engine=InnoDB;
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+check table t1 extended;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+drop table t1;
+End of 4.1 tests
+create table t1 (s1 geometry not null,s2 char(100));
+create trigger t1_bu before update on t1 for each row set new.s1 = null;
+insert into t1 values (null,null);
+ERROR 23000: Column 's1' cannot be null
+drop table t1;
+drop procedure if exists fn3;
+create function fn3 () returns point deterministic return ST_GeomFromText("point(1 1)");
+show create function fn3;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+fn3 NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` FUNCTION `fn3`() RETURNS point
+ DETERMINISTIC
+return ST_GeomFromText("point(1 1)") latin1 latin1_swedish_ci latin1_swedish_ci
+select ST_astext(fn3());
+ST_astext(fn3())
+POINT(1 1)
+drop function fn3;
+create table t1(pt POINT);
+alter table t1 add primary key pti(pt);
+drop table t1;
+create table t1(pt GEOMETRY);
+alter table t1 add primary key pti(pt);
+ERROR 42000: BLOB/TEXT column 'pt' used in key specification without a key length
+alter table t1 add primary key pti(pt(20));
+drop table t1;
+create table t1 select ST_GeomFromText('point(1 1)');
+desc t1;
+Field Type Null Key Default Extra
+ST_GeomFromText('point(1 1)') geometry YES NULL
+drop table t1;
+create table t1 (g geometry not null);
+insert into t1 values(default);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+drop table t1;
+CREATE TABLE t1 (a GEOMETRY);
+CREATE VIEW v1 AS SELECT ST_GeomFromwkb(ST_ASBINARY(a)) FROM t1;
+CREATE VIEW v2 AS SELECT a FROM t1;
+DESCRIBE v1;
+Field Type Null Key Default Extra
+ST_GeomFromwkb(ST_ASBINARY(a)) geometry YES NULL
+DESCRIBE v2;
+Field Type Null Key Default Extra
+a geometry YES NULL
+DROP VIEW v1,v2;
+DROP TABLE t1;
+create table t1 (name VARCHAR(100), square GEOMETRY);
+INSERT INTO t1 VALUES("center", ST_GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
+INSERT INTO t1 VALUES("small", ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+INSERT INTO t1 VALUES("up", ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", ST_GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+INSERT INTO t1 VALUES("down", ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", ST_GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+INSERT INTO t1 VALUES("right", ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", ST_GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+INSERT INTO t1 VALUES("left", ST_GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", ST_GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrcontains
+center,small
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrdisjoint
+down3,left3,right3,up3
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrequals
+center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrintersect
+big,center,down,down2,left,left2,right,right2,small,up,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbroverlaps
+down,left,right,up
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrtouches FROM t1 a1 JOIN t1 a2 ON MBRTouches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrtouches
+down2,left2,right2,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrwithin
+big,center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRcontains
+center,small
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRdisjoint
+down3,left3,right3,up3
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRequals
+center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+intersect
+big,center,down,down2,left,left2,right,right2,small,up,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRoverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRoverlaps
+down,left,right,up
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS ST_touches FROM t1 a1 JOIN t1 a2 ON ST_Touches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+ST_touches
+down2,left2,right2,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRwithin
+big,center
+SET @vert1 = ST_GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+SET @horiz1 = ST_GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+SET @horiz2 = ST_GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+SET @horiz3 = ST_GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+SET @point1 = ST_GeomFromText('POLYGON ((0 0))');
+SET @point2 = ST_GeomFromText('POLYGON ((-2 0))');
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @vert1) GROUP BY a1.name;
+MBRoverlaps
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @horiz1) GROUP BY a1.name;
+MBRoverlaps
+SELECT MBROverlaps(@horiz1, @vert1) FROM DUAL;
+MBROverlaps(@horiz1, @vert1)
+0
+SELECT MBROverlaps(@horiz1, @horiz2) FROM DUAL;
+MBROverlaps(@horiz1, @horiz2)
+1
+SELECT MBROverlaps(@horiz1, @horiz3) FROM DUAL;
+MBROverlaps(@horiz1, @horiz3)
+0
+SELECT MBROverlaps(@horiz1, @point1) FROM DUAL;
+MBROverlaps(@horiz1, @point1)
+0
+SELECT MBROverlaps(@horiz1, @point2) FROM DUAL;
+MBROverlaps(@horiz1, @point2)
+0
+DROP TABLE t1;
+create table t1(f1 geometry, f2 polygon, f3 linestring);
+select f1 from t1 union select f1 from t1;
+f1
+insert into t1 (f2,f3) values (ST_GeomFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))'), ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'));
+select ST_AsText(f2),ST_AsText(f3) from t1;
+ST_AsText(f2) ST_AsText(f3)
+POLYGON((10 10,20 10,20 20,10 20,10 10)) LINESTRING(0 0,1 1,2 2)
+select ST_AsText(a) from (select f2 as a from t1 union select f3 from t1) t;
+ST_AsText(a)
+POLYGON((10 10,20 10,20 20,10 20,10 10))
+LINESTRING(0 0,1 1,2 2)
+create table t2 as select f2 as a from t1 union select f3 from t1;
+desc t2;
+Field Type Null Key Default Extra
+a geometry YES NULL
+select ST_AsText(a) from t2;
+ST_AsText(a)
+POLYGON((10 10,20 10,20 20,10 20,10 10))
+LINESTRING(0 0,1 1,2 2)
+drop table t1, t2;
+SELECT 1;
+1
+1
+CREATE TABLE t1 (p POINT);
+CREATE TABLE t2 (p POINT, INDEX(p));
+INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
+INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+1
+EXPLAIN
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ref p p 28 const 1 Using where
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+1
+INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
+INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
+EXPLAIN
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+EXPLAIN
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ref p p 28 const # Using where
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+EXPLAIN
+SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
+SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+DROP TABLE t1, t2;
+End of 5.0 tests
+#
+# Test for bug #58650 "Failing assertion: primary_key_no == -1 ||
+# primary_key_no == 0".
+#
+drop table if exists t1;
+# The minimal test case.
+create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a));
+drop table t1;
+# The original test case.
+create table t1 (a int not null, b linestring not null, unique key b (b(12)));
+create unique index a on t1(a);
+drop table t1;
+create table `t1` (`col002` point)engine=InnoDB;
+insert into t1 values (),(),();
+select min(`col002`) from t1 union select `col002` from t1;
+min(`col002`)
+NULL
+drop table t1;
+#
+# Bug #47780: crash when comparing GIS items from subquery
+#
+CREATE TABLE t1(a INT, b MULTIPOLYGON);
+INSERT INTO t1 VALUES
+(0,
+ST_GEOMFROMTEXT(
+'multipolygon(((1 2,3 4,5 6,7 8,9 8,1 2,1 2),(7 6,5 4,3 2,1 2,3 4,7 6)))'));
+# must not crash
+SELECT 1 FROM t1 WHERE a <> (SELECT ST_GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
+1
+Warnings:
+Warning 1292 Truncated incorrect DOUBLE value: '\x00\x00\x00\x00\x01\x06\x00\x00\x00\x01\x00\x00\x00\x01\x03\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+DROP TABLE t1;
+#
+# Bug #49250 : spatial btree index corruption and crash
+# Part one : spatial syntax check
+#
+CREATE TABLE t1(col1 MULTIPOLYGON NOT NULL,
+SPATIAL INDEX USING BTREE (col1));
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE (col1))' at line 2
+CREATE TABLE t2(col1 MULTIPOLYGON NOT NULL);
+CREATE SPATIAL INDEX USING BTREE ON t2(col);
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE ON t2(col)' at line 1
+ALTER TABLE t2 ADD SPATIAL INDEX USING BTREE (col1);
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE (col1)' at line 1
+DROP TABLE t2;
+End of 5.0 tests
+create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
+create view v1 as select * from t1;
+desc v1;
+Field Type Null Key Default Extra
+f1 tinyint(1) YES NULL
+f2 char(1) YES NULL
+f3 varchar(1) YES NULL
+f4 geometry YES NULL
+f5 datetime YES NULL
+drop view v1;
+drop table t1;
+SELECT MultiPoint(12345,'');
+ERROR 22007: Illegal non geometric '12345' value found during parsing
+SELECT 1 FROM (SELECT GREATEST(1,GEOMETRYCOLLECTION('00000','00000')) b FROM DUAL) AS d WHERE (LINESTRING(d.b));
+ERROR 22007: Illegal non geometric ''00000'' value found during parsing
+#
+# BUG#51875: crash when loading data into geometry function ST_polyfromwkb
+#
+SET @a=0x00000000030000000100000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+SET @a=ST_POLYFROMWKB(@a);
+SET @a=0x00000000030000000000000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+SET @a=ST_POLYFROMWKB(@a);
+create table t1(a polygon NOT NULL)engine=InnoDB;
+insert into t1 values (ST_geomfromtext("point(0 1)"));
+ERROR 22007: Incorrect POLYGON value: 'POINT' for column 'a' at row 1
+insert into t1 values (ST_geomfromtext("point(1 0)"));
+ERROR 22007: Incorrect POLYGON value: 'POINT' for column 'a' at row 1
+select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
+p
+drop table t1;
+#
+# Test for bug #59888 "debug assertion when attempt to create spatial index
+# on char > 31 bytes".
+#
+create table t1(a char(32) not null) engine=InnoDB;
+create index i on t1 (a(5));
+drop table t1;
+End of 5.1 tests
+CREATE TABLE t0 (a BINARY(32) NOT NULL);
+CREATE UNIQUE INDEX i on t0 (a(10));
+INSERT INTO t0 VALUES (1);
+CREATE TABLE t1(
+col0 BINARY NOT NULL,
+col2 TIMESTAMP,
+INDEX i1 (col0)
+) ENGINE=InnoDB;
+CREATE TABLE t2 (
+col0 BINARY NOT NULL,
+col2 TIMESTAMP
+) ENGINE=InnoDB;
+CREATE INDEX idx0 ON t1(col0);
+Warnings:
+Note 1831 Duplicate index 'idx0' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release
+CREATE TABLE t3 (
+col0 INTEGER NOT NULL,
+col1 POINT,
+col2 POINT
+);
+CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+CREATE TABLE t4 (
+col0 INTEGER NOT NULL,
+col1 POINT,
+col2 LINESTRING,
+INDEX i1 (col1(5), col2(5))
+);
+DROP TABLE IF EXISTS t0, t1, t2, t3,t4;
+#
+# BUG#12414917 - ST_ISCLOSED() CRASHES ON 64-BIT BUILDS
+#
+SELECT ST_ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)));
+ST_ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)))
+-1
+#
+# BUG#12537203 - CRASH WHEN SUBSELECTING GLOBAL VARIABLES IN
+# GEOMETRY FUNCTION ARGUMENTS
+#
+SELECT GEOMETRYCOLLECTION((SELECT @@OLD));
+ERROR 22007: Illegal non geometric '' value found during parsing
+End of 5.1 tests
+#
+# Bug#11908153: CRASH AND/OR VALGRIND ERRORS IN FIELD_BLOB::GET_KEY_IMAGE
+#
+CREATE TABLE g1
+(a geometry NOT NULL, UNIQUE KEY i (a(151))) engine=InnoDB;
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 1)'));
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 2)'));
+FLUSH TABLES;
+SELECT 1 FROM g1
+FORCE INDEX(i) WHERE a = date_sub(now(), interval 2808.4 year_month)
+;
+1
+Warnings:
+Warning 1292 Incorrect datetime value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0?\x00\x00\x00\x00\x00\x00\xF0?'
+Warning 1441 Datetime function: datetime field overflow
+Warning 1292 Incorrect datetime value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0?\x00\x00\x00\x00\x00\x00\x00@'
+DROP TABLE g1;
+#
+# Bug#13013970 MORE CRASHES IN FIELD_BLOB::GET_KEY_IMAGE
+#
+CREATE TABLE g1(a TEXT NOT NULL, KEY(a(255)));
+INSERT INTO g1 VALUES ('a'),('a');
+SELECT 1 FROM g1 WHERE a >= ANY
+(SELECT 1 FROM g1 WHERE a = ST_geomfromtext('') OR a) ;
+1
+Warnings:
+Warning 1292 Truncated incorrect DOUBLE value: 'a'
+Warning 1292 Truncated incorrect DOUBLE value: 'a'
+DROP TABLE g1;
+End of 5.5 tests
+DROP DATABASE IF EXISTS gis_ogs;
+CREATE DATABASE gis_ogs;
+USE gis_ogs;
+#
+# C.3.3.1 Geometry types and functions schema construction
+#
+CREATE TABLE lakes (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+shore POLYGON);
+CREATE TABLE road_segments (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+aliases CHARACTER VARYING(64),
+num_lanes INTEGER,
+centerline LINESTRING);
+CREATE TABLE divided_routes (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+num_lanes INTEGER,
+centerlines MULTILINESTRING);
+CREATE TABLE forests (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+boundary MULTIPOLYGON);
+CREATE TABLE bridges (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+position POINT);
+CREATE TABLE streams (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+centerline LINESTRING);
+CREATE TABLE buildings (
+fid INTEGER NOT NULL PRIMARY KEY,
+address CHARACTER VARYING(64),
+position POINT,
+footprint POLYGON);
+CREATE TABLE ponds (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+type CHARACTER VARYING(64),
+shores MULTIPOLYGON);
+CREATE TABLE named_places (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+boundary POLYGON);
+CREATE TABLE map_neatlines (
+fid INTEGER NOT NULL PRIMARY KEY,
+neatline POLYGON);
+#
+# C.3.3.2 Geometry types and functions schema data loading
+#
+# Lakes
+INSERT INTO lakes VALUES (
+101, 'BLUE LAKE',
+ST_PolyFromText(
+'POLYGON(
+(52 18,66 23,73 9,48 6,52 18),
+(59 18,67 18,67 13,59 13,59 18)
+)',
+101));
+# Road Segments
+INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+ST_LineFromText(
+'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 70 38, 72 48 )' ,101));
+INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+ST_LineFromText(
+'LINESTRING( 70 38, 84 42 )' ,101));
+INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+1,
+ST_LineFromText(
+'LINESTRING( 28 26, 28 0 )',101));
+# DividedRoutes
+INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+ST_MLineFromText(
+'MULTILINESTRING((10 48,10 21,10 0),
+(16 0,16 23,16 48))', 101));
+# Forests
+INSERT INTO forests VALUES(109, 'Green Forest',
+ST_MPolyFromText(
+'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+101));
+# Bridges
+INSERT INTO bridges VALUES(110, 'Cam Bridge', ST_PointFromText(
+'POINT( 44 31 )', 101));
+# Streams
+INSERT INTO streams VALUES(111, 'Cam Stream',
+ST_LineFromText(
+'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+INSERT INTO streams VALUES(112, NULL,
+ST_LineFromText(
+'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+# Buildings
+INSERT INTO buildings VALUES(113, '123 Main Street',
+ST_PointFromText(
+'POINT( 52 30 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+INSERT INTO buildings VALUES(114, '215 Main Street',
+ST_PointFromText(
+'POINT( 64 33 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+# Ponds
+INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+ST_MPolyFromText(
+'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+# Named Places
+INSERT INTO named_places VALUES(117, 'Ashton',
+ST_PolyFromText(
+'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+INSERT INTO named_places VALUES(118, 'Goose Island',
+ST_PolyFromText(
+'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+# Map Neatlines
+INSERT INTO map_neatlines VALUES(115,
+ST_PolyFromText(
+'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+#
+# C.3.3.3 Geometry types and functions schema test queries
+
+# Conformance Item T6
+SELECT ST_Dimension(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_Dimension(shore)
+2
+# Conformance Item T7
+SELECT ST_GeometryType(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_GeometryType(centerlines)
+MULTILINESTRING
+# Conformance Item T8
+SELECT ST_AsText(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(boundary)
+POLYGON((67 13,67 18,59 18,59 13,67 13))
+# Conformance Item T9
+SELECT ST_AsText(ST_PolyFromWKB(ST_AsBinary(boundary),101))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(ST_PolyFromWKB(ST_AsBinary(boundary),101))
+POLYGON((67 13,67 18,59 18,59 13,67 13))
+# Conformance Item T10
+SELECT ST_SRID(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+ST_SRID(boundary)
+101
+# Conformance Item T11
+SELECT ST_IsEmpty(centerline)
+FROM road_segments
+WHERE name = 'Route 5'
+AND aliases = 'Main Street';
+ST_IsEmpty(centerline)
+0
+# Conformance Item T14
+SELECT ST_AsText(ST_Envelope(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(ST_Envelope(boundary))
+POLYGON((59 13,67 13,67 18,59 18,59 13))
+# Conformance Item T15
+SELECT ST_X(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+ST_X(position)
+44
+# Conformance Item T16
+SELECT ST_Y(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+ST_Y(position)
+31
+# Conformance Item T17
+SELECT ST_AsText(ST_StartPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+ST_AsText(ST_StartPoint(centerline))
+POINT(0 18)
+# Conformance Item T18
+SELECT ST_AsText(ST_EndPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+ST_AsText(ST_EndPoint(centerline))
+POINT(44 31)
+# Conformance Item T21
+SELECT ST_Length(centerline)
+FROM road_segments
+WHERE fid = 106;
+ST_Length(centerline)
+26
+# Conformance Item T22
+SELECT ST_NumPoints(centerline)
+FROM road_segments
+WHERE fid = 102;
+ST_NumPoints(centerline)
+5
+# Conformance Item T23
+SELECT ST_AsText(ST_PointN(centerline, 1))
+FROM road_segments
+WHERE fid = 102;
+ST_AsText(ST_PointN(centerline, 1))
+POINT(0 18)
+# Conformance Item T24
+SELECT ST_AsText(ST_Centroid(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(ST_Centroid(boundary))
+POINT(63 15.5)
+# Conformance Item T26
+SELECT ST_Area(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+ST_Area(boundary)
+40
+# Conformance Item T27
+SELECT ST_AsText(ST_ExteriorRing(shore))
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_AsText(ST_ExteriorRing(shore))
+LINESTRING(52 18,66 23,73 9,48 6,52 18)
+# Conformance Item T28
+SELECT ST_NumInteriorRings(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_NumInteriorRings(shore)
+1
+# Conformance Item T29
+SELECT ST_AsText(ST_InteriorRingN(shore, 1))
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_AsText(ST_InteriorRingN(shore, 1))
+LINESTRING(59 18,67 18,67 13,59 13,59 18)
+# Conformance Item T30
+SELECT ST_NumGeometries(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_NumGeometries(centerlines)
+2
+# Conformance Item T31
+SELECT ST_AsText(ST_GeometryN(centerlines, 2))
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_AsText(ST_GeometryN(centerlines, 2))
+LINESTRING(16 0,16 23,16 48)
+# Conformance Item T32
+SELECT ST_IsClosed(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_IsClosed(centerlines)
+0
+# Conformance Item T33
+SELECT ST_Length(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_Length(centerlines)
+96
+# Conformance Item T34
+SELECT ST_AsText(ST_Centroid(shores))
+FROM ponds
+WHERE fid = 120;
+ST_AsText(ST_Centroid(shores))
+POINT(25 42)
+# Conformance Item T36
+SELECT ST_Area(shores)
+FROM ponds
+WHERE fid = 120;
+ST_Area(shores)
+8
+# Conformance Item T37
+SELECT ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+1
+# Conformance Item T37
+# Geometry arguments' SRIDs must be identical.
+SELECT ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',101))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',101))
+1
+# Conformance Item T38
+SELECT ST_Disjoint(centerlines, boundary)
+FROM divided_routes, named_places
+WHERE divided_routes.name = 'Route 75'
+AND named_places.name = 'Ashton';
+ST_Disjoint(centerlines, boundary)
+1
+# Conformance Item T39
+SELECT ST_Touches(centerline, shore)
+FROM streams, lakes
+WHERE streams.name = 'Cam Stream'
+AND lakes.name = 'Blue Lake';
+ST_Touches(centerline, shore)
+1
+# Conformance Item T42
+SELECT ST_Crosses(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+ST_Crosses(road_segments.centerline, divided_routes.centerlines)
+1
+# Conformance Item T43
+SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+1
+# Conformance Item T44
+SELECT ST_Contains(forests.boundary, named_places.boundary)
+FROM forests, named_places
+WHERE forests.name = 'Green Forest'
+AND named_places.name = 'Ashton';
+ST_Contains(forests.boundary, named_places.boundary)
+0
+# Conformance Item T46
+SELECT ST_Distance(position, boundary)
+FROM bridges, named_places
+WHERE bridges.name = 'Cam Bridge'
+AND named_places.name = 'Ashton';
+ST_Distance(position, boundary)
+12
+# Conformance Item T48
+SELECT ST_AsText(ST_Difference(named_places.boundary, forests.boundary))
+FROM named_places, forests
+WHERE named_places.name = 'Ashton'
+AND forests.name = 'Green Forest';
+ST_AsText(ST_Difference(named_places.boundary, forests.boundary))
+POLYGON((56 34,62 48,84 48,84 42,56 34))
+SELECT ST_AsText(ST_Union(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Goose Island';
+ST_AsText(ST_Union(shore, boundary))
+POLYGON((48 6,52 18,66 23,73 9,48 6))
+# Conformance Item T50
+SELECT ST_AsText(ST_SymDifference(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Ashton';
+ST_AsText(ST_SymDifference(shore, boundary))
+MULTIPOLYGON(((48 6,52 18,66 23,73 9,48 6),(59 13,59 18,67 18,67 13,59 13)),((56 30,56 34,62 48,84 48,84 30,56 30)))
+# Conformance Item T51
+SELECT count(*)
+FROM buildings, bridges
+WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+count(*)
+1
+DROP DATABASE gis_ogs;
+#
+# Bug#13362660 ASSERTION `FIELD_POS < FIELD_COUNT' FAILED. IN PROTOCOL_TEXT::STORE
+#
+SELECT ST_Union('', ''), md5(1);
+ST_Union('', '') md5(1)
+NULL c4ca4238a0b923820dcc509a6f75849b
diff --git a/mysql-test/suite/innodb_gis/r/alter_spatial_index.result b/mysql-test/suite/innodb_gis/r/alter_spatial_index.result
new file mode 100644
index 00000000000..c347495caf2
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/alter_spatial_index.result
@@ -0,0 +1,671 @@
+CALL mtr.add_suppression("but MySQL is asking statistics for 2 columns. Have you mixed");
+CREATE TABLE tab(c1 int NOT NULL PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB;
+CREATE TABLE tab1(c1 int NOT NULL PRIMARY KEY,c2 MULTIPOINT NOT NULL,
+c3 MULTILINESTRING NOT NULL,c4 MULTIPOLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB;
+INSERT INTO tab1 SELECT * FROM tab;
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+ALTER TABLE tab ADD SPATIAL INDEX idx2(c2 ASC);
+ALTER TABLE tab ADD SPATIAL KEY idx3(c3 DESC);
+ALTER TABLE tab ADD SPATIAL INDEX idx4(c4 ASC) COMMENT 'testing spatial index on Polygon';
+ALTER TABLE tab ADD SPATIAL KEY idx5(c5 ASC) COMMENT 'testing spatial index on Geometry';
+ALTER TABLE tab ADD INDEX idx6(c4(10)) USING BTREE;
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+3 POINT(4 4) POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+3 POINT(0 0) POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+UPDATE tab SET C2 = ST_GeomFromText('POINT(100 100)')
+WHERE MBRContains(tab.c4, @g1);
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+SET @g1 = ST_GeomFromText( 'POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))');
+SELECT c1,ST_AsText(c2),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1);
+c1 ST_AsText(c2) ST_Astext(c4)
+5 POINT(3 3) POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+UPDATE tab SET C2 = ST_GeomFromText('POINT(200 200)')
+WHERE MBRWithin(tab.c4, @g1);
+SELECT c1,ST_AsText(c2),ST_AsText(c4) FROM tab WHERE MBRWithin(tab.c4, @g1);
+c1 ST_AsText(c2) ST_AsText(c4)
+5 POINT(200 200) POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+ALTER TABLE tab MODIFY COLUMN c2 MULTIPOINT;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab MODIFY COLUMN c3 MULTILINESTRING;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab MODIFY COLUMN c4 MULTIPOLYGON;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab MODIFY COLUMN c3 MULTILINESTRING NULL;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab MODIFY COLUMN c4 MULTIPOLYGON NULL;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab MODIFY COLUMN c4 Geometry NULL;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab CHANGE COLUMN c2 c22 POINT;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab CHANGE COLUMN c3 c33 LINESTRING;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab CHANGE COLUMN c4 c44 POLYGON;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+ALTER TABLE tab add SPATIAL INDEX idx1(c1);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+ALTER TABLE tab ADD SPATIAL INDEX idx6(c2 ASC) USING BTREE;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE' at line 1
+ALTER TABLE tab ADD SPATIAL INDEX idx6(c2 ASC) USING HASH;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING HASH' at line 1
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` geometry NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c1`),
+ SPATIAL KEY `idx2` (`c2`),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A # NULL NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+SET @g1 = ST_GeomFromText('POLYGON((20 20,30 30,40 40,50 50,40 50,30 40,30 30,20 20))');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+2 POINT(20 20) POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+1 POINT(10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+UPDATE tab SET C2 = ST_GeomFromText('POINT(1000 1000)')
+WHERE ST_Crosses(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+2 POINT(1000 1000) POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+1 POINT(1000 1000) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+ALTER TABLE tab CHANGE COLUMN c2 c22 POINT NOT NULL;
+ALTER TABLE tab CHANGE COLUMN c3 c33 LINESTRING NOT NULL;
+ALTER TABLE tab CHANGE COLUMN c4 c44 POLYGON NOT NULL;
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c22` point NOT NULL,
+ `c33` linestring NOT NULL,
+ `c44` polygon NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c1`),
+ SPATIAL KEY `idx2` (`c22`),
+ SPATIAL KEY `idx3` (`c33`),
+ SPATIAL KEY `idx4` (`c44`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c44`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A # NULL NULL BTREE
+tab 1 idx2 1 c22 A # 32 NULL SPATIAL
+tab 1 idx3 1 c33 A # 32 NULL SPATIAL
+tab 1 idx4 1 c44 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c44 A # 10 NULL BTREE
+ALTER TABLE tab CHANGE COLUMN c22 c2 POINT NOT NULL;
+ALTER TABLE tab CHANGE COLUMN c33 c3 LINESTRING NOT NULL;
+ALTER TABLE tab CHANGE COLUMN c44 c4 POLYGON NOT NULL;
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` polygon NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c1`),
+ SPATIAL KEY `idx2` (`c2`),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A # NULL NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+ALTER TABLE tab DISABLE KEYS;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`tab` doesn't have this option
+SHOW WARNINGS;
+Level Code Message
+Note 1031 Storage engine InnoDB of the table `test`.`tab` doesn't have this option
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+10 POINT(160 160) POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE MBREquals(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+10 POINT(2000 2000) POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+ALTER TABLE tab DROP PRIMARY KEY;
+ALTER TABLE tab ADD PRIMARY KEY(c2) ;
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+UPDATE tab SET C2 = ST_GeomFromText('POINT(3000 3000)')
+WHERE ST_Touches(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+FLUSH TABLE tab FOR EXPORT;
+UNLOCK TABLES;
+ALTER TABLE tab DISCARD TABLESPACE;
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab;
+ERROR HY000: Tablespace has been discarded for table `tab`
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+4 POINT(50 50) POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+6 POINT(3 3) POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POINT(60 70) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POINT(0 0) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POINT(120 120) POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+SET @g1 = ST_GeomFromText('LINESTRING( 3010 3010,4010 4010,5010 5010)');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) order by c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+7 POINT(60 70) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POINT(0 0) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POINT(120 120) POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+UPDATE tab SET c2 = ST_GeomFromText('POINT(4000 4000)')
+WHERE MBRIntersects(tab.c4, @g1);
+ERROR 23000: Duplicate entry '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00@\xAF@\x' for key 'PRIMARY'
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+7 POINT(60 70) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POINT(0 0) POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POINT(120 120) POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+DELETE FROM tab WHERE MBRIntersects(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+INSERT INTO tab SELECT * FROM tab1;
+ALTER TABLE tab DROP PRIMARY KEY;
+ALTER TABLE tab DROP INDEX idx2;
+CREATE TEMPORARY TABLE temp_tab AS SELECT * FROM tab where c1 = c2;
+INSERT INTO temp_tab SELECT * FROM tab;
+CREATE SPATIAL INDEX idx2 ON temp_tab(c2);
+CREATE SPATIAL INDEX idx3 ON temp_tab(c3);
+CREATE SPATIAL INDEX idx4 ON temp_tab(c4);
+CREATE SPATIAL INDEX idx5 ON temp_tab(c5);
+SHOW CREATE TABLE temp_tab;
+Table Create Table
+temp_tab CREATE TEMPORARY TABLE `temp_tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` geometry NOT NULL,
+ `c5` geometry NOT NULL,
+ SPATIAL KEY `idx2` (`c2`),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`),
+ SPATIAL KEY `idx5` (`c5`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+UPDATE temp_tab SET C2 = ST_GeomFromText('POINT(1000 1000)')
+WHERE MBRContains(temp_tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1);
+c1 ST_Astext(c2) ST_Astext(c4)
+DELETE FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` geometry NOT NULL,
+ `c5` geometry NOT NULL,
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+DELETE FROM tab;
+ALTER TABLE tab ADD PRIMARY KEY(c2);
+CREATE SPATIAL INDEX idx2 ON tab(c2 ASC);
+ALTER TABLE tab ADD CONSTRAINT const_1 UNIQUE(c2);
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` geometry NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c2`(25)),
+ UNIQUE KEY `const_1` (`c2`(25)),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE,
+ SPATIAL KEY `idx2` (`c2`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c2 A # 25 NULL BTREE
+tab 0 const_1 1 c2 A # 25 NULL BTREE
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+DELETE FROM tab;
+ALTER TABLE tab DROP PRIMARY KEY ;
+ALTER TABLE tab DROP KEY const_1;
+ALTER TABLE tab ADD PRIMARY KEY(c5(10));
+ALTER TABLE tab ADD CONSTRAINT const_1 UNIQUE(c5(10));
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` geometry NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c5`(10)),
+ UNIQUE KEY `const_1` (`c5`(10)),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE,
+ SPATIAL KEY `idx2` (`c2`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c5 A # 10 NULL BTREE
+tab 0 const_1 1 c5 A # 10 NULL BTREE
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+DROP TABLE tab,tab1,temp_tab;
+CREATE TABLE tab(c1 int NOT NULL PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB;
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+ALTER TABLE tab ADD SPATIAL INDEX idx2(c2 ASC);
+ALTER TABLE tab ADD SPATIAL KEY idx3(c3 DESC);
+ALTER TABLE tab ADD SPATIAL INDEX idx4(c4 ASC) COMMENT 'testing spatial index on Polygon';
+ALTER TABLE tab ADD SPATIAL KEY idx5(c5 ASC) COMMENT 'testing spatial index on Geometry';
+ALTER TABLE tab ADD INDEX idx6(c4(10)) USING BTREE;
+ALTER TABLE tab MODIFY COLUMN c2 GEOMETRY NOT NULL;
+ALTER TABLE tab add COLUMN c8 POINT NOT NULL, ALGORITHM = INPLACE, LOCK=NONE;
+ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` geometry NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` polygon NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c1`),
+ SPATIAL KEY `idx2` (`c2`),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A # NULL NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+UPDATE tab SET C2 = ST_GeomFromText('POINT(1000 1000)')
+WHERE MBRContains(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+3 POINT(1000 1000) POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c2) ST_Astext(c4)
+ALTER TABLE tab MODIFY COLUMN c4 GEOMETRY NOT NULL;
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` geometry NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` geometry NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c1`),
+ SPATIAL KEY `idx2` (`c2`),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A # NULL NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+SET @g2 = ST_GeomFromText('LINESTRING(140 140,150 150,160 160)');
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1)
+AND MBREquals(tab.c3,@g2) ORDER BY c1;
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+10 POINT(160 160) LINESTRING(140 140,150 150,160 160) POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE MBREquals(tab.c4, @g1) AND MBREquals(tab.c3,@g2);
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1)
+AND MBREquals(tab.c3,@g2) ORDER BY c1;
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+10 POINT(2000 2000) LINESTRING(140 140,150 150,160 160) POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+DELETE FROM tab WHERE MBREquals(tab.c4, @g1) AND MBREquals(tab.c3,@g2);
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1)
+AND MBREquals(tab.c3,@g2) ORDER BY c1;
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))');
+SET @g2 = ST_GeomFromText('LINESTRING(1 1,2 2,3 3)');
+ALTER TABLE tab MODIFY COLUMN c2 POINT NOT NULL;
+ALTER TABLE tab MODIFY COLUMN c3 LINESTRING NOT NULL;
+ALTER TABLE tab MODIFY COLUMN c4 POLYGON NOT NULL;
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` int(11) NOT NULL,
+ `c2` point NOT NULL,
+ `c3` linestring NOT NULL,
+ `c4` polygon NOT NULL,
+ `c5` geometry NOT NULL,
+ PRIMARY KEY (`c1`),
+ SPATIAL KEY `idx2` (`c2`),
+ SPATIAL KEY `idx3` (`c3`),
+ SPATIAL KEY `idx4` (`c4`) COMMENT 'testing spatial index on Polygon',
+ SPATIAL KEY `idx5` (`c5`) COMMENT 'testing spatial index on Geometry',
+ KEY `idx6` (`c4`(10)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A # NULL NULL BTREE
+tab 1 idx2 1 c2 A # 32 NULL SPATIAL
+tab 1 idx3 1 c3 A # 32 NULL SPATIAL
+tab 1 idx4 1 c4 A # 32 NULL SPATIAL testing spatial index on Polygon
+tab 1 idx5 1 c5 A # 32 NULL SPATIAL testing spatial index on Geometry
+tab 1 idx6 1 c4 A # 10 NULL BTREE
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+SET @g2 = ST_GeomFromText('LINESTRING(1 1,2 2,3 3)');
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+AND ST_Touches(tab.c3,@g2);
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE ST_Touches(tab.c4, @g1) AND ST_Touches(tab.c3,@g2);
+DELETE FROM tab WHERE ST_Touches(tab.c4, @g1) AND ST_Touches(tab.c3,@g2);
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+AND ST_Touches(tab.c3,@g2);
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+OR ST_Touches(tab.c3,@g2);
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+2 POINT(20 20) LINESTRING(20 20,30 30,40 40) POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE ST_Touches(tab.c4, @g1) OR ST_Touches(tab.c3,@g2);
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+OR ST_Touches(tab.c3,@g2);
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+2 POINT(2000 2000) LINESTRING(20 20,30 30,40 40) POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+DELETE FROM tab WHERE ST_Touches(tab.c4, @g1) OR ST_Touches(tab.c3,@g2);
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+OR ST_Touches(tab.c3,@g2);
+c1 ST_Astext(c2) ST_AsText(c3) ST_Astext(c4)
+ALTER TABLE tab MODIFY COLUMN c4 INT NOT NULL;
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+ALTER TABLE tab MODIFY COLUMN c4 BLOB NOT NULL;
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+ALTER TABLE tab ENGINE Myisam;
+ALTER TABLE tab ENGINE InnoDB;
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))');
+SET @g2 = ST_GeomFromText('LINESTRING(400 400,500 500,600 700)');
+SELECT c1,ST_AsText(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) AND MBRWithin(tab.c3, @g2);
+c1 ST_AsText(c2) ST_AsText(c3) ST_Astext(c4)
+5 POINT(3 3) LINESTRING(400 400,500 500,600 700) POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+SET @g1 = ST_GeomFromText('POINT(2000 2000)');
+SET @g2 = ST_GeomFromText('POINT(2000 2000)');
+SELECT c1,ST_AsText(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c2, @g1) AND MBRWithin(tab.c3, @g2);
+c1 ST_AsText(c2) ST_AsText(c3) ST_Astext(c4)
+DELETE FROM tab WHERE MBRWithin(tab.c2, @g1) AND MBRWithin(tab.c3, @g2);
+SELECT c1,ST_AsText(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c2, @g1) AND MBRWithin(tab.c3, @g2);
+c1 ST_AsText(c2) ST_AsText(c3) ST_Astext(c4)
+DROP TABLE tab;
+CREATE TABLE parent (id POINT, PRIMARY KEY(id)) ENGINE=InnoDB;
+CREATE TABLE child (id GEOMETRY NOT NULL, parent_id POINT NOT NULL) ENGINE=InnoDB;
+ALTER TABLE parent ADD SPATIAL INDEX idx1(id ASC);
+ALTER TABLE child ADD SPATIAL INDEX idx2(parent_id ASC);
+SHOW CREATE TABLE parent;
+Table Create Table
+parent CREATE TABLE `parent` (
+ `id` point NOT NULL,
+ PRIMARY KEY (`id`(25)),
+ SPATIAL KEY `idx1` (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW CREATE TABLE child;
+Table Create Table
+child CREATE TABLE `child` (
+ `id` geometry NOT NULL,
+ `parent_id` point NOT NULL,
+ SPATIAL KEY `idx2` (`parent_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM parent;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+parent 0 PRIMARY 1 id A 0 25 NULL BTREE
+parent 1 idx1 1 id A NULL 32 NULL SPATIAL
+SHOW INDEX FROM child;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+child 1 idx2 1 parent_id A # 32 NULL SPATIAL
+ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ;
+ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ON DELETE CASCADE ;
+DROP table child,parent;
+CREATE TABLE parent (id GEOMETRY, PRIMARY KEY(id(10))) ENGINE=InnoDB;
+CREATE TABLE child (id GEOMETRY NOT NULL, parent_id GEOMETRY NOT NULL) ENGINE=InnoDB;
+ALTER TABLE parent ADD SPATIAL INDEX idx1(id ASC) ;
+ALTER TABLE child ADD SPATIAL INDEX idx2(parent_id ASC);
+SHOW CREATE TABLE parent;
+Table Create Table
+parent CREATE TABLE `parent` (
+ `id` geometry NOT NULL,
+ PRIMARY KEY (`id`(10)),
+ SPATIAL KEY `idx1` (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW CREATE TABLE child;
+Table Create Table
+child CREATE TABLE `child` (
+ `id` geometry NOT NULL,
+ `parent_id` geometry NOT NULL,
+ SPATIAL KEY `idx2` (`parent_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM parent;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+parent 0 PRIMARY 1 id A 0 10 NULL BTREE
+parent 1 idx1 1 id A NULL 32 NULL SPATIAL
+SHOW INDEX FROM child;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+child 1 idx2 1 parent_id A NULL 32 NULL SPATIAL
+ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ;
+DROP table child,parent;
+create table t1 (c1 int) engine=innodb;
+insert into t1 values(NULL);
+alter table t1 add b geometry, add spatial index(b), algorithm=inplace;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+alter table t1 add b geometry, algorithm=inplace;
+update t1 set b = st_geomfromtext('point(0 0)');
+alter table t1 add spatial index(b), algorithm=inplace;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+delete from t1;
+DROP table t1;
+create table t1 (c1 int) engine=innodb;
+insert into t1 values(NULL);
+alter table t1 add b geometry, add spatial index(b), algorithm=copy;
+ERROR 42000: All parts of a SPATIAL index must be NOT NULL
+alter table t1 add b geometry not null, add spatial index(b), algorithm=copy;
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+update t1 set b = st_geomfromtext('point(0 0)');
+ERROR 42S22: Unknown column 'b' in 'field list'
+alter table t1 add spatial index(b), algorithm=copy;
+ERROR 42000: Key column 'b' doesn't exist in table
+delete from t1;
+DROP table t1;
+#
+# BUG#20111575 ALTER TABLE...ADD SPATIAL INDEX...LOCK NONE IS REFUSED
+# WITHOUT STATING A REASON
+#
+CREATE TABLE t1(p point NOT NULL) ENGINE=innodb;
+ALTER TABLE t1 ADD SPATIAL INDEX(p), LOCK=NONE;
+ERROR 0A000: LOCK=NONE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try LOCK=SHARED
+ALTER TABLE t1 ADD SPATIAL INDEX(p);
+ALTER TABLE t1 FORCE, LOCK=NONE;
+ERROR 0A000: LOCK=NONE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try LOCK=SHARED
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_gis/r/check_rtree.result b/mysql-test/suite/innodb_gis/r/check_rtree.result
new file mode 100644
index 00000000000..fe60a628fde
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/check_rtree.result
@@ -0,0 +1,15 @@
+create table t1 (i int, g geometry not null, spatial index (g))engine=innodb;
+SET SESSION debug="+d,rtree_test_check_count";
+Warnings:
+Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
+insert into t1 values (1, POINT(1,1));
+insert into t1 values (1, POINT(1.5,1.5));
+insert into t1 values (1, POINT(3,3));
+insert into t1 values (1, POINT(3.1,3.1));
+insert into t1 values (1, POINT(5,5));
+CALL mtr.add_suppression("InnoDB: Flagged corruption of `g` in table `test`.`t1` in CHECK TABLE; Wrong count");
+check table t1;
+Table Op Msg_type Msg_text
+test.t1 check Warning InnoDB: Index 'g' contains 0 entries, should be 5.
+test.t1 check error Corrupt
+drop table t1;
diff --git a/mysql-test/suite/innodb_gis/r/create_spatial_index.result b/mysql-test/suite/innodb_gis/r/create_spatial_index.result
new file mode 100644
index 00000000000..a44a19a5d5c
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/create_spatial_index.result
@@ -0,0 +1,1290 @@
+CREATE TABLE tab(c1 int NOT NULL PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
+CREATE SPATIAL INDEX idx1 on tab(c2 ASC);
+CREATE SPATIAL INDEX idx2 on tab(c3 DESC) COMMENT 'wl6968';
+CREATE SPATIAL INDEX idx3 on tab(c4 ASC) KEY_BLOCK_SIZE=8 ;
+CREATE SPATIAL INDEX idx4 on tab(c5 DESC) KEY_BLOCK_SIZE=4
+COMMENT 'Spatial index on Geometry type column';
+SHOW INDEXES FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A 0 NULL NULL BTREE
+tab 1 idx1 1 c2 A NULL 32 NULL SPATIAL
+tab 1 idx2 1 c3 A NULL 32 NULL SPATIAL wl6968
+tab 1 idx3 1 c4 A NULL 32 NULL SPATIAL
+tab 1 idx4 1 c5 A NULL 32 NULL SPATIAL Spatial index on Geometry type column
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 10 10,30 30,40 40)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_CRosses(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+6 POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING(7 1,30 30,1010 3010,1010 2010,3010 3010,4010 4010,5010 5010 )');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 100 100,200 200,300 300)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+6 POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRTouches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRTouches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+CREATE PROCEDURE proc_wl6968()
+BEGIN
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+END |
+CALL proc_wl6968();
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+SET @g1 = ST_GeomFromText('POLYGON((100 200,1010 1010,1020 1020,500 300,300 200,100 300,100 200))');
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+SET @g1 = ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))');
+SET @g2 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+UPDATE tab SET C4 = @g2 WHERE ST_Crosses(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g2) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+DROP TABLE tab;
+DROP PROCEDURE proc_wl6968;
+CREATE TABLE tab(c1 int ,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16;
+CREATE SPATIAL INDEX idx1 on tab(c2 ASC);
+CREATE SPATIAL INDEX idx2 on tab(c3 DESC) COMMENT 'wl6968';
+CREATE SPATIAL INDEX idx3 on tab(c4 ASC) KEY_BLOCK_SIZE=2 ;
+CREATE SPATIAL INDEX idx4 on tab(c5 DESC) KEY_BLOCK_SIZE=8
+COMMENT 'Spatial index on Geometry type column';
+SHOW INDEXES FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 1 idx1 1 c2 A NULL 32 NULL SPATIAL
+tab 1 idx2 1 c3 A NULL 32 NULL SPATIAL wl6968
+tab 1 idx3 1 c4 A NULL 32 NULL SPATIAL
+tab 1 idx4 1 c5 A NULL 32 NULL SPATIAL Spatial index on Geometry type column
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 10 10,30 30,40 40)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_CRosses(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+6 POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING(7 1,30 30,1010 3010,1010 2010,3010 3010,4010 4010,5010 5010 )');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 100 100,200 200,300 300)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+6 POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRTouches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRTouches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+CREATE PROCEDURE proc_wl6968()
+BEGIN
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+END |
+CALL proc_wl6968();
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+SET @g2 = ST_GeomFromText( 'POLYGON((1 1,2 2,3 3,10 3,5 1,1 1))');
+UPDATE tab SET C4 = @g2 WHERE MBROverlaps(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((1 1,2 2,3 3,10 3,5 1,1 1))
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+DROP TABLE tab;
+DROP PROCEDURE proc_wl6968;
+CREATE TABLE tab(c1 int AUTO_INCREMENT PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16;
+CREATE SPATIAL INDEX idx1 on tab(c2 ASC);
+CREATE SPATIAL INDEX idx2 on tab(c3 DESC) COMMENT 'wl6968';
+CREATE SPATIAL INDEX idx3 on tab(c4 ASC) KEY_BLOCK_SIZE=16 ;
+CREATE SPATIAL INDEX idx4 on tab(c5 DESC) KEY_BLOCK_SIZE=16
+COMMENT 'Spatial index on Geometry type column';
+SHOW INDEXES FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 0 PRIMARY 1 c1 A 0 NULL NULL BTREE
+tab 1 idx1 1 c2 A NULL 32 NULL SPATIAL
+tab 1 idx2 1 c3 A NULL 32 NULL SPATIAL wl6968
+tab 1 idx3 1 c4 A NULL 32 NULL SPATIAL
+tab 1 idx4 1 c5 A NULL 32 NULL SPATIAL Spatial index on Geometry type column
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+ANALYZE TABLE tab;
+Table Op Msg_type Msg_text
+test.tab analyze status OK
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 10 10,30 30,40 40)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_CRosses(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+6 POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('LINESTRING(7 1,30 30,1010 3010,1010 2010,3010 3010,4010 4010,5010 5010 )');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 100 100,200 200,300 300)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+4 POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))
+5 POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))
+6 POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))
+7 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+8 POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))
+9 POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab index idx3 PRIMARY 4 NULL 10 Using where
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab ALL idx3 NULL NULL NULL 10 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 1 Using where
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where; Using filesort
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRTouches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+EXPLAIN DELETE FROM tab WHERE MBRTouches(tab.c4, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE tab range idx3 idx3 34 NULL 2 Using where
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+10 POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))
+DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+1 POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))
+2 POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))
+3 POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))
+DELETE FROM tab WHERE MBRIntersects(tab.c4, @g1);
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+c1 ST_Astext(c4)
+CHECK TABLE tab;
+Table Op Msg_type Msg_text
+test.tab check status OK
+DROP TABLE tab;
+CREATE TABLE tab(c1 POINT NOT NULL,CONSTRAINT tab_const check(c1 > 0) ) ENGINE=InnoDB;
+CREATE SPATIAL INDEX idx1 ON tab(c1) ;
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `c1` point NOT NULL,
+ SPATIAL KEY `idx1` (`c1`),
+ CONSTRAINT `tab_const` CHECK (c1 > 0)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SHOW INDEX FROM tab;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+tab 1 idx1 1 c1 A NULL 32 NULL SPATIAL
+set @g1 = ST_GeomFromText('POINT(-1 -2)');
+SELECT ST_AsText(c1) FROM tab;
+ST_AsText(c1)
+DROP table tab;
+create table `t1`(`a` geometry not null,`b` linestring not null,
+primary key (`b`(192),`a`(141)),spatial key (`b`)) engine=innodb;
+insert into `t1` values(
+point(1,1),
+linestring(point(1,1),point(1,1))
+);
+insert into `t1` values
+(
+polygon(
+linestring(point(1,1),point(1,1)),
+linestring(point(1,1),point(11,1))
+),
+linestring(point(1,1),point(1,1))
+);
+ERROR 23000: Column 'a' cannot be null
+select 1 from t1 where st_intersects(
+geometrycollection(point(1,-1)),b
+);
+1
+drop table t1;
+CREATE TABLE t1(c1 POINT NOT NULL);
+DROP TABLE mysql.innodb_table_stats;
+CALL mtr.add_suppression("InnoDB: Table `mysql`.`innodb_table_stats` not found.");
+CALL mtr.add_suppression("InnoDB: Fetch of persistent statistics requested for table `test`.`t1` but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.");
+CREATE SPATIAL INDEX idx2 ON t1(c1);
+DROP TABLE t1;
+CREATE TABLE mysql.innodb_table_stats (
+database_name varchar(64) COLLATE utf8_bin NOT NULL,
+table_name varchar(64) COLLATE utf8_bin NOT NULL,
+last_update timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+n_rows bigint(20) unsigned NOT NULL,
+clustered_index_size bigint(20) unsigned NOT NULL,
+sum_of_other_index_sizes bigint(20) unsigned NOT NULL,
+PRIMARY KEY (`database_name`,`table_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
diff --git a/mysql-test/suite/innodb_gis/r/gis.result b/mysql-test/suite/innodb_gis/r/gis.result
new file mode 100644
index 00000000000..ccf5224c56c
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/gis.result
@@ -0,0 +1,1491 @@
+SET default_storage_engine=InnoDB;
+DROP TABLE IF EXISTS t1, gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+CREATE TABLE gis_point (fid INTEGER NOT NULL PRIMARY KEY, g POINT);
+CREATE TABLE gis_line (fid INTEGER NOT NULL PRIMARY KEY, g LINESTRING);
+CREATE TABLE gis_polygon (fid INTEGER NOT NULL PRIMARY KEY, g POLYGON);
+CREATE TABLE gis_multi_point (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOINT);
+CREATE TABLE gis_multi_line (fid INTEGER NOT NULL PRIMARY KEY, g MULTILINESTRING);
+CREATE TABLE gis_multi_polygon (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOLYGON);
+CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRYCOLLECTION);
+CREATE TABLE gis_geometry (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY);
+SHOW FIELDS FROM gis_point;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g point YES NULL
+SHOW FIELDS FROM gis_line;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g linestring YES NULL
+SHOW FIELDS FROM gis_polygon;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g polygon YES NULL
+SHOW FIELDS FROM gis_multi_point;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g multipoint YES NULL
+SHOW FIELDS FROM gis_multi_line;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g multilinestring YES NULL
+SHOW FIELDS FROM gis_multi_polygon;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g multipolygon YES NULL
+SHOW FIELDS FROM gis_geometrycollection;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g geometrycollection YES NULL
+SHOW FIELDS FROM gis_geometry;
+Field Type Null Key Default Extra
+fid int(11) NO PRI NULL
+g geometry YES NULL
+INSERT INTO gis_point VALUES
+(101, ST_PointFromText('POINT(10 10)')),
+(102, ST_PointFromText('POINT(20 10)')),
+(103, ST_PointFromText('POINT(20 20)')),
+(104, ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(10 20)'))));
+INSERT INTO gis_line VALUES
+(105, ST_LineFromText('LINESTRING(0 0,0 10,10 0)')),
+(106, ST_LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+(107, ST_LineStringFromWKB(ST_AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+INSERT INTO gis_polygon VALUES
+(108, ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+(109, ST_PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+(110, ST_PolyFromWKB(ST_AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+INSERT INTO gis_multi_point VALUES
+(111, ST_MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+(112, ST_MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+(113, ST_MPointFromWKB(ST_AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+INSERT INTO gis_multi_line VALUES
+(114, ST_MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+(115, ST_MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+(116, ST_MLineFromWKB(ST_AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+INSERT INTO gis_multi_polygon VALUES
+(117, ST_MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(118, ST_MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(119, ST_MPolyFromWKB(ST_AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+INSERT INTO gis_geometrycollection VALUES
+(120, ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+(121, ST_GeometryFromWKB(ST_AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
+INSERT into gis_geometry SELECT * FROM gis_point;
+INSERT into gis_geometry SELECT * FROM gis_line;
+INSERT into gis_geometry SELECT * FROM gis_polygon;
+INSERT into gis_geometry SELECT * FROM gis_multi_point;
+INSERT into gis_geometry SELECT * FROM gis_multi_line;
+INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+SELECT fid, ST_AsText(g) FROM gis_point;
+fid ST_AsText(g)
+101 POINT(10 10)
+102 POINT(20 10)
+103 POINT(20 20)
+104 POINT(10 20)
+SELECT fid, ST_AsText(g) FROM gis_line;
+fid ST_AsText(g)
+105 LINESTRING(0 0,0 10,10 0)
+106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+107 LINESTRING(10 10,40 10)
+SELECT fid, ST_AsText(g) FROM gis_polygon;
+fid ST_AsText(g)
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+110 POLYGON((0 0,30 0,30 30,0 0))
+SELECT fid, ST_AsText(g) FROM gis_multi_point;
+fid ST_AsText(g)
+111 MULTIPOINT(0 0,10 10,10 20,20 20)
+112 MULTIPOINT(1 1,11 11,11 21,21 21)
+113 MULTIPOINT(3 6,4 10)
+SELECT fid, ST_AsText(g) FROM gis_multi_line;
+fid ST_AsText(g)
+114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+115 MULTILINESTRING((10 48,10 21,10 0))
+116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+SELECT fid, ST_AsText(g) FROM gis_multi_polygon;
+fid ST_AsText(g)
+117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+SELECT fid, ST_AsText(g) FROM gis_geometrycollection;
+fid ST_AsText(g)
+120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+SELECT fid, ST_AsText(g) FROM gis_geometry;
+fid ST_AsText(g)
+101 POINT(10 10)
+102 POINT(20 10)
+103 POINT(20 20)
+104 POINT(10 20)
+105 LINESTRING(0 0,0 10,10 0)
+106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+107 LINESTRING(10 10,40 10)
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+110 POLYGON((0 0,30 0,30 30,0 0))
+111 MULTIPOINT(0 0,10 10,10 20,20 20)
+112 MULTIPOINT(1 1,11 11,11 21,21 21)
+113 MULTIPOINT(3 6,4 10)
+114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+115 MULTILINESTRING((10 48,10 21,10 0))
+116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+SELECT fid, ST_Dimension(g) FROM gis_geometry;
+fid ST_Dimension(g)
+101 0
+102 0
+103 0
+104 0
+105 1
+106 1
+107 1
+108 2
+109 2
+110 2
+111 0
+112 0
+113 0
+114 1
+115 1
+116 1
+117 2
+118 2
+119 2
+120 1
+121 1
+SELECT fid, ST_GeometryType(g) FROM gis_geometry;
+fid ST_GeometryType(g)
+101 POINT
+102 POINT
+103 POINT
+104 POINT
+105 LINESTRING
+106 LINESTRING
+107 LINESTRING
+108 POLYGON
+109 POLYGON
+110 POLYGON
+111 MULTIPOINT
+112 MULTIPOINT
+113 MULTIPOINT
+114 MULTILINESTRING
+115 MULTILINESTRING
+116 MULTILINESTRING
+117 MULTIPOLYGON
+118 MULTIPOLYGON
+119 MULTIPOLYGON
+120 GEOMETRYCOLLECTION
+121 GEOMETRYCOLLECTION
+SELECT fid, ST_IsEmpty(g) FROM gis_geometry;
+fid ST_IsEmpty(g)
+101 0
+102 0
+103 0
+104 0
+105 0
+106 0
+107 0
+108 0
+109 0
+110 0
+111 0
+112 0
+113 0
+114 0
+115 0
+116 0
+117 0
+118 0
+119 0
+120 0
+121 0
+SELECT fid, ST_AsText(ST_Envelope(g)) FROM gis_geometry;
+fid ST_AsText(ST_Envelope(g))
+101 POLYGON((10 10,10 10,10 10,10 10,10 10))
+102 POLYGON((20 10,20 10,20 10,20 10,20 10))
+103 POLYGON((20 20,20 20,20 20,20 20,20 20))
+104 POLYGON((10 20,10 20,10 20,10 20,10 20))
+105 POLYGON((0 0,10 0,10 10,0 10,0 0))
+106 POLYGON((10 10,20 10,20 20,10 20,10 10))
+107 POLYGON((10 10,40 10,40 10,10 10,10 10))
+108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+109 POLYGON((0 0,50 0,50 50,0 50,0 0))
+110 POLYGON((0 0,30 0,30 30,0 30,0 0))
+111 POLYGON((0 0,20 0,20 20,0 20,0 0))
+112 POLYGON((1 1,21 1,21 21,1 21,1 1))
+113 POLYGON((3 6,4 6,4 10,3 10,3 6))
+114 POLYGON((10 0,16 0,16 48,10 48,10 0))
+115 POLYGON((10 0,10 0,10 48,10 48,10 0))
+116 POLYGON((1 2,21 2,21 8,1 8,1 2))
+117 POLYGON((28 0,84 0,84 42,28 42,28 0))
+118 POLYGON((28 0,84 0,84 42,28 42,28 0))
+119 POLYGON((0 0,3 0,3 3,0 3,0 0))
+120 POLYGON((0 0,10 0,10 10,0 10,0 0))
+121 POLYGON((3 6,44 6,44 9,3 9,3 6))
+explain extended select ST_Dimension(g), ST_GeometryType(g), ST_IsEmpty(g), ST_AsText(ST_Envelope(g)) from gis_geometry;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_geometry ALL NULL NULL NULL NULL 21 #
+Warnings:
+Note 1003 select st_dimension(`test`.`gis_geometry`.`g`) AS `ST_Dimension(g)`,st_geometrytype(`test`.`gis_geometry`.`g`) AS `ST_GeometryType(g)`,st_isempty(`test`.`gis_geometry`.`g`) AS `ST_IsEmpty(g)`,st_astext(st_envelope(`test`.`gis_geometry`.`g`)) AS `ST_AsText(ST_Envelope(g))` from `test`.`gis_geometry`
+SELECT fid, ST_X(g) FROM gis_point;
+fid ST_X(g)
+101 10
+102 20
+103 20
+104 10
+SELECT fid, ST_Y(g) FROM gis_point;
+fid ST_Y(g)
+101 10
+102 10
+103 20
+104 20
+explain extended select ST_X(g),ST_Y(g) FROM gis_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_point ALL NULL NULL NULL NULL 4 #
+Warnings:
+Note 1003 select st_x(`test`.`gis_point`.`g`) AS `ST_X(g)`,st_y(`test`.`gis_point`.`g`) AS `ST_Y(g)` from `test`.`gis_point`
+SELECT fid, ST_AsText(ST_StartPoint(g)) FROM gis_line;
+fid ST_AsText(ST_StartPoint(g))
+105 POINT(0 0)
+106 POINT(10 10)
+107 POINT(10 10)
+SELECT fid, ST_AsText(ST_EndPoint(g)) FROM gis_line;
+fid ST_AsText(ST_EndPoint(g))
+105 POINT(10 0)
+106 POINT(10 10)
+107 POINT(40 10)
+SELECT fid, ST_Length(g) FROM gis_line;
+fid ST_Length(g)
+105 24.14213562373095
+106 40
+107 30
+SELECT fid, ST_NumPoints(g) FROM gis_line;
+fid ST_NumPoints(g)
+105 3
+106 5
+107 2
+SELECT fid, ST_AsText(ST_PointN(g, 2)) FROM gis_line;
+fid ST_AsText(ST_PointN(g, 2))
+105 POINT(0 10)
+106 POINT(20 10)
+107 POINT(40 10)
+SELECT fid, ST_IsClosed(g) FROM gis_line;
+fid ST_IsClosed(g)
+105 0
+106 1
+107 0
+explain extended select ST_AsText(ST_StartPoint(g)),ST_AsText(ST_EndPoint(g)),ST_Length(g),ST_NumPoints(g),ST_AsText(ST_PointN(g, 2)),ST_IsClosed(g) FROM gis_line;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_line ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select st_astext(st_startpoint(`test`.`gis_line`.`g`)) AS `ST_AsText(ST_StartPoint(g))`,st_astext(st_endpoint(`test`.`gis_line`.`g`)) AS `ST_AsText(ST_EndPoint(g))`,st_length(`test`.`gis_line`.`g`) AS `ST_Length(g)`,st_numpoints(`test`.`gis_line`.`g`) AS `ST_NumPoints(g)`,st_astext(st_pointn(`test`.`gis_line`.`g`,2)) AS `ST_AsText(ST_PointN(g, 2))`,st_isclosed(`test`.`gis_line`.`g`) AS `ST_IsClosed(g)` from `test`.`gis_line`
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_polygon;
+fid ST_AsText(ST_Centroid(g))
+108 POINT(15 15)
+109 POINT(25.416666666666668 25.416666666666668)
+110 POINT(20 10)
+SELECT fid, ST_Area(g) FROM gis_polygon;
+fid ST_Area(g)
+108 100
+109 2400
+110 450
+SELECT fid, ST_AsText(ST_ExteriorRing(g)) FROM gis_polygon;
+fid ST_AsText(ST_ExteriorRing(g))
+108 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+109 LINESTRING(0 0,50 0,50 50,0 50,0 0)
+110 LINESTRING(0 0,30 0,30 30,0 0)
+SELECT fid, ST_NumInteriorRings(g) FROM gis_polygon;
+fid ST_NumInteriorRings(g)
+108 0
+109 1
+110 0
+SELECT fid, ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+fid ST_AsText(ST_InteriorRingN(g, 1))
+108 NULL
+109 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+110 NULL
+explain extended select ST_AsText(ST_Centroid(g)),ST_Area(g),ST_AsText(ST_ExteriorRing(g)),ST_NumInteriorRings(g),ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_polygon ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select st_astext(st_centroid(`test`.`gis_polygon`.`g`)) AS `ST_AsText(ST_Centroid(g))`,st_area(`test`.`gis_polygon`.`g`) AS `ST_Area(g)`,st_astext(st_exteriorring(`test`.`gis_polygon`.`g`)) AS `ST_AsText(ST_ExteriorRing(g))`,st_numinteriorrings(`test`.`gis_polygon`.`g`) AS `ST_NumInteriorRings(g)`,st_astext(st_interiorringn(`test`.`gis_polygon`.`g`,1)) AS `ST_AsText(ST_InteriorRingN(g, 1))` from `test`.`gis_polygon`
+SELECT fid, ST_IsClosed(g) FROM gis_multi_line;
+fid ST_IsClosed(g)
+114 0
+115 0
+116 0
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_multi_polygon;
+fid ST_AsText(ST_Centroid(g))
+117 POINT(55.58852775304245 17.426536064113982)
+118 POINT(55.58852775304245 17.426536064113982)
+119 POINT(2 2)
+SELECT fid, ST_Area(g) FROM gis_multi_polygon;
+fid ST_Area(g)
+117 1684.5
+118 1684.5
+119 4.5
+SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+fid ST_NumGeometries(g)
+111 4
+112 4
+113 2
+SELECT fid, ST_NumGeometries(g) from gis_multi_line;
+fid ST_NumGeometries(g)
+114 2
+115 1
+116 2
+SELECT fid, ST_NumGeometries(g) from gis_multi_polygon;
+fid ST_NumGeometries(g)
+117 2
+118 2
+119 1
+SELECT fid, ST_NumGeometries(g) from gis_geometrycollection;
+fid ST_NumGeometries(g)
+120 2
+121 2
+explain extended SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select `test`.`gis_multi_point`.`fid` AS `fid`,st_numgeometries(`test`.`gis_multi_point`.`g`) AS `ST_NumGeometries(g)` from `test`.`gis_multi_point`
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+fid ST_AsText(ST_GeometryN(g, 2))
+111 POINT(10 10)
+112 POINT(11 11)
+113 POINT(4 10)
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_line;
+fid ST_AsText(ST_GeometryN(g, 2))
+114 LINESTRING(16 0,16 23,16 48)
+115 NULL
+116 LINESTRING(2 5,5 8,21 7)
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_polygon;
+fid ST_AsText(ST_GeometryN(g, 2))
+117 POLYGON((59 18,67 18,67 13,59 13,59 18))
+118 POLYGON((59 18,67 18,67 13,59 13,59 18))
+119 NULL
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_geometrycollection;
+fid ST_AsText(ST_GeometryN(g, 2))
+120 LINESTRING(0 0,10 10)
+121 LINESTRING(3 6,7 9)
+SELECT fid, ST_AsText(ST_GeometryN(g, 1)) from gis_geometrycollection;
+fid ST_AsText(ST_GeometryN(g, 1))
+120 POINT(0 0)
+121 POINT(44 6)
+explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 #
+Warnings:
+Note 1003 select `test`.`gis_multi_point`.`fid` AS `fid`,st_astext(st_geometryn(`test`.`gis_multi_point`.`g`,2)) AS `ST_AsText(ST_GeometryN(g, 2))` from `test`.`gis_multi_point`
+SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+first second w c o e d t i r
+120 120 1 1 0 1 0 0 1 0
+120 121 0 0 1 0 0 0 1 0
+121 120 0 0 1 0 0 0 1 0
+121 121 1 1 0 1 0 0 1 0
+explain extended SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE g1 ALL NULL NULL NULL NULL 2 # Using temporary; Using filesort
+1 SIMPLE g2 ALL NULL NULL NULL NULL 2 # Using join buffer (flat, BNL join)
+Warnings:
+Note 1003 select `test`.`g1`.`fid` AS `first`,`test`.`g2`.`fid` AS `second`,mbrwithin(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,mbrcontains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,mbroverlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,mbrequals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,mbrdisjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,st_touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,mbrintersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,st_crosses(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `r` from `test`.`gis_geometrycollection` `g1` join `test`.`gis_geometrycollection` `g2` order by `test`.`g1`.`fid`,`test`.`g2`.`fid`
+DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+CREATE TABLE t1 (
+gp point,
+ln linestring,
+pg polygon,
+mp multipoint,
+mln multilinestring,
+mpg multipolygon,
+gc geometrycollection,
+gm geometry
+);
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+gp point YES NULL
+ln linestring YES NULL
+pg polygon YES NULL
+mp multipoint YES NULL
+mln multilinestring YES NULL
+mpg multipolygon YES NULL
+gc geometrycollection YES NULL
+gm geometry YES NULL
+ALTER TABLE t1 ADD fid INT NOT NULL;
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+gp point YES NULL
+ln linestring YES NULL
+pg polygon YES NULL
+mp multipoint YES NULL
+mln multilinestring YES NULL
+mpg multipolygon YES NULL
+gc geometrycollection YES NULL
+gm geometry YES NULL
+fid int(11) NO NULL
+DROP TABLE t1;
+SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))))
+POINT(1 4)
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select st_astext(st_geometryfromwkb(st_aswkb(st_geometryfromtext('POINT(1 4)')))) AS `ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))))`
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)'))));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select st_astext(st_geometryfromwkb(st_aswkb(st_geometryfromtext('POINT(1 4)')))) AS `ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)'))))`
+SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101))
+101
+explain extended SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select srid(st_geometryfromtext('LineString(1 1,2 2)',101)) AS `ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101))`
+explain extended select ST_issimple(MultiPoint(Point(3, 6), Point(4, 10))), ST_issimple(Point(3, 6));
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select st_issimple(st_multipoint(point(3,6),point(4,10))) AS `ST_issimple(MultiPoint(Point(3, 6), Point(4, 10)))`,st_issimple(point(3,6)) AS `ST_issimple(Point(3, 6))`
+create table t1 (a geometry not null);
+insert into t1 values (ST_GeomFromText('Point(1 2)'));
+insert into t1 values ('Garbage');
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert IGNORE into t1 values ('Garbage');
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+alter table t1 add spatial index(a);
+drop table t1;
+create table t1(a geometry not null, spatial index(a));
+insert into t1 values
+(ST_GeomFromText('POINT(1 1)')), (ST_GeomFromText('POINT(3 3)')),
+(ST_GeomFromText('POINT(4 4)')), (ST_GeomFromText('POINT(6 6)'));
+select ST_AsText(a) from t1 where
+MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+or
+MBRContains(ST_GeomFromText('Polygon((2 2, 2 5, 5 5, 5 2, 2 2))'), a);
+ST_AsText(a)
+POINT(1 1)
+POINT(3 3)
+POINT(4 4)
+select ST_AsText(a) from t1 where
+MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+and
+MBRContains(ST_GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a);
+ST_AsText(a)
+POINT(1 1)
+drop table t1;
+CREATE TABLE t1 (Coordinates POINT NOT NULL, SPATIAL INDEX(Coordinates));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(383293632 1754448)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(564952612 157516260)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(903994614 180726515)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(98128178 141127631)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(862547902 799334546)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(341989013 850270906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(803302376 93039099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(857439153 817431356)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(319757546 343162742)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(826341972 717484432)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(305066789 201736238)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(626068992 616241497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(55789424 755830108)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(802874458 312435220)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(153795660 551723671)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(242207428 537089292)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(553478119 807160039)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(694605552 457472733)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(987886554 792733729)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(598600363 850434457)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(592068275 940589376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(700705362 395370650)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(33628474 558144514)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(212802006 353386020)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(901307256 39143977)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(70870451 206374045)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(240880214 696939443)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(822615542 296669638)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(452769551 625489999)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(609104858 606565210)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(177213669 851312285)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(143654501 730691787)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(658472325 838260052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(188164520 646358878)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(630993781 786764883)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(496793334 223062055)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(727354258 197498696)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(618432704 760982731)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(755643210 831234710)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(114368751 656950466)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(870378686 185239202)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(863324511 111258900)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(882178645 685940052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(407928538 334948195)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(311430051 17033395)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941513405 488643719)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(868345680 85167906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(219335507 526818004)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(923427958 407500026)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(173176882 554421738)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(194264908 669970217)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(777483793 921619165)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(867468912 395916497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(682601897 623112122)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(227151206 796970647)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(280062588 97529892)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(982209849 143387099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(208788792 864388493)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(829327151 616717329)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(199336688 140757201)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(633750724 140850093)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(629400920 502096404)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(226017998 848736426)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(28914408 149445955)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(256236452 202091290)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(703867693 450501360)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(872061506 481351486)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(372120524 739530418)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(877267982 54722420)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(362642540 104419188)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(851693067 642705127)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(201949080 833902916)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(786092225 410737872)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(698291409 615419376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(27455201 897628096)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(756176576 661205925)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(38478189 385577496)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(163302328 264496186)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(234313922 192216735)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(413942141 490550373)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(394308025 117809834)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941051732 266369530)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(599161319 313172256)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(5899948 476429301)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(367894677 368542487)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(580848489 219587743)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(11247614 782797569)'));
+drop table t1;
+create table t1 select ST_GeomFromWKB(POINT(1,3));
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `ST_GeomFromWKB(POINT(1,3))` geometry DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+drop table t1;
+SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
+CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo`
+geometry NOT NULL default '');
+SET sql_mode = default;
+insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363
+36.305435,-114.992394 36.305202,-114.991219 36.305975,-114.991163
+36.306845,-114.989432 36.309452,-114.978275 36.312642,-114.977363
+36.311978,-114.975327 36.312344,-114.96502 36.31597,-114.963364
+36.313629,-114.961723 36.313721,-114.956398 36.316057,-114.951882
+36.320979,-114.947073 36.323475,-114.945207 36.326451,-114.945207
+36.326451,-114.944132 36.326061,-114.94003 36.326588,-114.924017
+36.334484,-114.923281 36.334146,-114.92564 36.331504,-114.94072
+36.319282,-114.945348 36.314812,-114.948091 36.314762,-114.951755
+36.316211,-114.952446 36.313883,-114.952644 36.309488,-114.944725
+36.313083,-114.93706 36.32043,-114.932478 36.323497,-114.924556
+36.327708,-114.922608 36.329715,-114.92009 36.328695,-114.912105
+36.323566,-114.901647 36.317952,-114.897436 36.313968,-114.895344
+36.309573,-114.891699 36.304398,-114.890569 36.303551,-114.886356
+36.302702,-114.885141 36.301351,-114.885709 36.297391,-114.892499
+36.290893,-114.902142 36.288974,-114.904941 36.288838,-114.905308
+36.289845,-114.906325 36.290395,-114.909916 36.289549,-114.914527
+36.287535,-114.918797 36.284423,-114.922982 36.279731,-114.924113
+36.277282,-114.924057 36.275817,-114.927733 36.27053,-114.929354
+36.269029,-114.929354 36.269029,-114.950856 36.268715,-114.950768
+36.264324,-114.960206 36.264293,-114.960301 36.268943,-115.006662
+36.268929,-115.008583 36.265619,-115.00665 36.264247,-115.006659
+36.246873,-115.006659 36.246873,-115.006838 36.247697,-115.010764
+36.247774,-115.015609 36.25113,-115.015765 36.254505,-115.029517
+36.254619,-115.038573 36.249317,-115.038573 36.249317,-115.023403
+36.25841,-115.023873 36.258994,-115.031845 36.259829,-115.03183
+36.261053,-115.025561 36.261095,-115.036417 36.274632,-115.033729
+36.276041,-115.032217 36.274851,-115.029845 36.273959,-115.029934
+36.274966,-115.025763 36.274896,-115.025406 36.281044,-115.028731
+36.284471,-115.036497 36.290377,-115.042071 36.291039,-115.026759
+36.298478,-115.008995 36.301966,-115.006363 36.305435),(-115.079835
+36.244369,-115.079735 36.260186,-115.076435 36.262369,-115.069758
+36.265,-115.070235 36.268757,-115.064542 36.268655,-115.061843
+36.269857,-115.062676 36.270693,-115.06305 36.272344,-115.059051
+36.281023,-115.05918 36.283008,-115.060591 36.285246,-115.061913
+36.290022,-115.062499 36.306353,-115.062499 36.306353,-115.060918
+36.30642,-115.06112 36.289779,-115.05713 36.2825,-115.057314
+36.279446,-115.060779 36.274659,-115.061366 36.27209,-115.057858
+36.26557,-115.055805 36.262883,-115.054688 36.262874,-115.047335
+36.25037,-115.044234 36.24637,-115.052434 36.24047,-115.061734
+36.23507,-115.061934 36.22677,-115.061934 36.22677,-115.061491
+36.225267,-115.062024 36.218194,-115.060134 36.218278,-115.060133
+36.210771,-115.057833 36.210771,-115.057433 36.196271,-115.062233
+36.196271,-115.062233 36.190371,-115.062233 36.190371,-115.065533
+36.190371,-115.071333 36.188571,-115.098331 36.188275,-115.098331
+36.188275,-115.098435 36.237569,-115.097535 36.240369,-115.097535
+36.240369,-115.093235 36.240369,-115.089135 36.240469,-115.083135
+36.240569,-115.083135 36.240569,-115.079835
+36.244369)))')),('85998',ST_GeomFromText('MULTIPOLYGON(((-115.333107
+36.264587,-115.333168 36.280638,-115.333168 36.280638,-115.32226
+36.280643,-115.322538 36.274311,-115.327222 36.274258,-115.32733
+36.263026,-115.330675 36.262984,-115.332132 36.264673,-115.333107
+36.264587),(-115.247239 36.247066,-115.247438 36.218267,-115.247438
+36.218267,-115.278525 36.219263,-115.278525 36.219263,-115.301545
+36.219559,-115.332748 36.219197,-115.332757 36.220041,-115.332757
+36.220041,-115.332895 36.233514,-115.349023 36.233479,-115.351489
+36.234475,-115.353681 36.237021,-115.357106 36.239789,-115.36519
+36.243331,-115.368156 36.243487,-115.367389 36.244902,-115.364553
+36.246014,-115.359219 36.24616,-115.356186 36.248025,-115.353347
+36.248004,-115.350813 36.249507,-115.339673 36.25387,-115.333069
+36.255018,-115.333069 36.255018,-115.333042 36.247767,-115.279039
+36.248666,-115.263639 36.247466,-115.263839 36.252766,-115.261439
+36.252666,-115.261439 36.247366,-115.247239 36.247066)))'));
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85998;
+object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo))
+85998 MULTIPOLYGON 1 POINT(115.31877315203187 -36.23747282102153)
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85984;
+object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo))
+85984 MULTIPOLYGON 1 POINT(-114.87787186923313 36.33101763469059)
+drop table t1;
+create table t1 (fl geometry not null);
+insert into t1 values (1);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 values (1.11);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 values ("qwerty");
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+insert into t1 values (ST_pointfromtext('point(1,1)'));
+ERROR 23000: Column 'fl' cannot be null
+drop table t1;
+select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000))));
+(ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000))))
+POINT(10 10)
+select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440))));
+(ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440))))
+POINT(10 10)
+create table t1 (g GEOMETRY);
+select * from t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def test t1 t1 g g 255 4294967295 0 Y 144 0 63
+g
+select ST_asbinary(g) from t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def ST_asbinary(g) 252 4294967295 0 Y 128 0 63
+ST_asbinary(g)
+drop table t1;
+create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
+alter table t1 disable keys;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+load data infile '../../std_data/bad_gis_data.dat' into table t1;
+ERROR 22004: Column set to default value; NULL supplied to NOT NULL column 'b' at row 1
+alter table t1 enable keys;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+drop table t1;
+create table t1 (a int, b blob);
+insert into t1 values (1, ''), (2, NULL), (3, '1');
+select * from t1;
+a b
+1
+2 NULL
+3 1
+select
+ST_geometryfromtext(b) IS NULL, ST_geometryfromwkb(b) IS NULL, ST_astext(b) IS NULL,
+ST_aswkb(b) IS NULL, ST_geometrytype(b) IS NULL, ST_centroid(b) IS NULL,
+ST_envelope(b) IS NULL, ST_startpoint(b) IS NULL, ST_endpoint(b) IS NULL,
+ST_exteriorring(b) IS NULL, ST_pointn(b, 1) IS NULL, ST_geometryn(b, 1) IS NULL,
+ST_interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, ST_isempty(b) IS NULL,
+ST_issimple(b) IS NULL, ST_isclosed(b) IS NULL, ST_dimension(b) IS NULL,
+ST_numgeometries(b) IS NULL, ST_numinteriorrings(b) IS NULL, ST_numpoints(b) IS NULL,
+ST_area(b) IS NULL, ST_length(b) IS NULL, ST_srid(b) IS NULL, ST_x(b) IS NULL,
+ST_y(b) IS NULL
+from t1;
+ERROR 22007: Illegal non geometric '`test`.`t1`.`b`' value found during parsing
+select
+MBRwithin(b, b) IS NULL, MBRcontains(b, b) IS NULL, MBRoverlaps(b, b) IS NULL,
+MBRequals(b, b) IS NULL, MBRdisjoint(b, b) IS NULL, ST_touches(b, b) IS NULL,
+MBRintersects(b, b) IS NULL, ST_crosses(b, b) IS NULL
+from t1;
+MBRwithin(b, b) IS NULL MBRcontains(b, b) IS NULL MBRoverlaps(b, b) IS NULL MBRequals(b, b) IS NULL MBRdisjoint(b, b) IS NULL ST_touches(b, b) IS NULL MBRintersects(b, b) IS NULL ST_crosses(b, b) IS NULL
+1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1
+select
+point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
+multilinestring(b) IS NULL, multipolygon(b) IS NULL,
+geometrycollection(b) IS NULL
+from t1;
+ERROR 22007: Illegal non geometric '`test`.`t1`.`b`' value found during parsing
+drop table t1;
+CREATE TABLE t1(a POINT) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (NULL);
+SELECT * FROM t1;
+a
+NULL
+DROP TABLE t1;
+CREATE TABLE `t1` ( `col9` set('a'), `col89` date);
+INSERT IGNORE INTO `t1` VALUES ('','0000-00-00');
+select ST_geomfromtext(col9,col89) as a from t1;
+a
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (
+geomdata polygon NOT NULL,
+SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+CREATE TABLE t2 (
+geomdata polygon NOT NULL,
+SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+CREATE TABLE t3
+select
+ST_aswkb(ws.geomdata) AS geomdatawkb
+from
+t1 ws
+union
+select
+ST_aswkb(ws.geomdata) AS geomdatawkb
+from
+t2 ws;
+describe t3;
+Field Type Null Key Default Extra
+geomdatawkb longblob YES NULL
+drop table t1;
+drop table t2;
+drop table t3;
+create table t1(col1 geometry default null,col15 geometrycollection not
+null,spatial index(col15),index(col1(15)))engine=innodb;
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+check table t1 extended;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+drop table t1;
+End of 4.1 tests
+create table t1 (s1 geometry not null,s2 char(100));
+create trigger t1_bu before update on t1 for each row set new.s1 = null;
+insert into t1 values (null,null);
+ERROR 23000: Column 's1' cannot be null
+drop table t1;
+drop procedure if exists fn3;
+create function fn3 () returns point deterministic return ST_GeomFromText("point(1 1)");
+show create function fn3;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+fn3 NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` FUNCTION `fn3`() RETURNS point
+ DETERMINISTIC
+return ST_GeomFromText("point(1 1)") latin1 latin1_swedish_ci latin1_swedish_ci
+select ST_astext(fn3());
+ST_astext(fn3())
+POINT(1 1)
+drop function fn3;
+create table t1(pt POINT);
+alter table t1 add primary key pti(pt);
+drop table t1;
+create table t1(pt GEOMETRY);
+alter table t1 add primary key pti(pt);
+ERROR 42000: BLOB/TEXT column 'pt' used in key specification without a key length
+alter table t1 add primary key pti(pt(20));
+drop table t1;
+create table t1 select ST_GeomFromText('point(1 1)');
+desc t1;
+Field Type Null Key Default Extra
+ST_GeomFromText('point(1 1)') geometry YES NULL
+drop table t1;
+create table t1 (g geometry not null);
+insert into t1 values(default);
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+drop table t1;
+CREATE TABLE t1 (a GEOMETRY);
+CREATE VIEW v1 AS SELECT ST_GeomFromwkb(ST_ASBINARY(a)) FROM t1;
+CREATE VIEW v2 AS SELECT a FROM t1;
+DESCRIBE v1;
+Field Type Null Key Default Extra
+ST_GeomFromwkb(ST_ASBINARY(a)) geometry YES NULL
+DESCRIBE v2;
+Field Type Null Key Default Extra
+a geometry YES NULL
+DROP VIEW v1,v2;
+DROP TABLE t1;
+create table t1 (name VARCHAR(100), square GEOMETRY);
+INSERT INTO t1 VALUES("center", ST_GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
+INSERT INTO t1 VALUES("small", ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+INSERT INTO t1 VALUES("up", ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", ST_GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+INSERT INTO t1 VALUES("down", ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", ST_GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+INSERT INTO t1 VALUES("right", ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", ST_GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+INSERT INTO t1 VALUES("left", ST_GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", ST_GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrcontains
+center,small
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrdisjoint
+down3,left3,right3,up3
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrequals
+center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrintersect
+big,center,down,down2,left,left2,right,right2,small,up,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbroverlaps
+down,left,right,up
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrtouches FROM t1 a1 JOIN t1 a2 ON MBRTouches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrtouches
+down2,left2,right2,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+mbrwithin
+big,center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRcontains
+center,small
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRdisjoint
+down3,left3,right3,up3
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRequals
+center
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+intersect
+big,center,down,down2,left,left2,right,right2,small,up,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRoverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRoverlaps
+down,left,right,up
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS ST_touches FROM t1 a1 JOIN t1 a2 ON ST_Touches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+ST_touches
+down2,left2,right2,up2
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+MBRwithin
+big,center
+SET @vert1 = ST_GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+SET @horiz1 = ST_GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+SET @horiz2 = ST_GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+SET @horiz3 = ST_GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+SET @point1 = ST_GeomFromText('POLYGON ((0 0))');
+SET @point2 = ST_GeomFromText('POLYGON ((-2 0))');
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @vert1) GROUP BY a1.name;
+MBRoverlaps
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @horiz1) GROUP BY a1.name;
+MBRoverlaps
+SELECT MBROverlaps(@horiz1, @vert1) FROM DUAL;
+MBROverlaps(@horiz1, @vert1)
+0
+SELECT MBROverlaps(@horiz1, @horiz2) FROM DUAL;
+MBROverlaps(@horiz1, @horiz2)
+1
+SELECT MBROverlaps(@horiz1, @horiz3) FROM DUAL;
+MBROverlaps(@horiz1, @horiz3)
+0
+SELECT MBROverlaps(@horiz1, @point1) FROM DUAL;
+MBROverlaps(@horiz1, @point1)
+0
+SELECT MBROverlaps(@horiz1, @point2) FROM DUAL;
+MBROverlaps(@horiz1, @point2)
+0
+DROP TABLE t1;
+create table t1(f1 geometry, f2 polygon, f3 linestring);
+select f1 from t1 union select f1 from t1;
+f1
+insert into t1 (f2,f3) values (ST_GeomFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))'), ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'));
+select ST_AsText(f2),ST_AsText(f3) from t1;
+ST_AsText(f2) ST_AsText(f3)
+POLYGON((10 10,20 10,20 20,10 20,10 10)) LINESTRING(0 0,1 1,2 2)
+select ST_AsText(a) from (select f2 as a from t1 union select f3 from t1) t;
+ST_AsText(a)
+POLYGON((10 10,20 10,20 20,10 20,10 10))
+LINESTRING(0 0,1 1,2 2)
+create table t2 as select f2 as a from t1 union select f3 from t1;
+desc t2;
+Field Type Null Key Default Extra
+a geometry YES NULL
+select ST_AsText(a) from t2;
+ST_AsText(a)
+POLYGON((10 10,20 10,20 20,10 20,10 10))
+LINESTRING(0 0,1 1,2 2)
+drop table t1, t2;
+SELECT 1;
+1
+1
+CREATE TABLE t1 (p POINT);
+CREATE TABLE t2 (p POINT, INDEX(p));
+INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
+INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+1
+EXPLAIN
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ref p p 28 const 1 Using where
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+1
+INSERT INTO t1 VALUES (POINTFROMTEXT('POINT(1 2)'));
+INSERT INTO t2 VALUES (POINTFROMTEXT('POINT(1 2)'));
+EXPLAIN
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
+SELECT COUNT(*) FROM t1 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+EXPLAIN
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ref p p 28 const # Using where
+SELECT COUNT(*) FROM t2 WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+EXPLAIN
+SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
+SELECT COUNT(*) FROM t2 IGNORE INDEX(p) WHERE p=POINTFROMTEXT('POINT(1 2)');
+COUNT(*)
+2
+DROP TABLE t1, t2;
+End of 5.0 tests
+#
+# Test for bug #58650 "Failing assertion: primary_key_no == -1 ||
+# primary_key_no == 0".
+#
+drop table if exists t1;
+# The minimal test case.
+create table t1 (a int not null, b linestring not null, unique key b (b(12)), unique key a (a));
+drop table t1;
+# The original test case.
+create table t1 (a int not null, b linestring not null, unique key b (b(12)));
+create unique index a on t1(a);
+drop table t1;
+create table `t1` (`col002` point)engine=innodb;
+insert into t1 values (),(),();
+select min(`col002`) from t1 union select `col002` from t1;
+min(`col002`)
+NULL
+drop table t1;
+#
+# Bug #47780: crash when comparing GIS items from subquery
+#
+CREATE TABLE t1(a INT, b MULTIPOLYGON);
+INSERT INTO t1 VALUES
+(0,
+ST_GEOMFROMTEXT(
+'multipolygon(((1 2,3 4,5 6,7 8,9 8,1 2,1 2),(7 6,5 4,3 2,1 2,3 4,7 6)))'));
+# must not crash
+SELECT 1 FROM t1 WHERE a <> (SELECT ST_GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
+1
+Warnings:
+Warning 1292 Truncated incorrect DOUBLE value: '\x00\x00\x00\x00\x01\x06\x00\x00\x00\x01\x00\x00\x00\x01\x03\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+DROP TABLE t1;
+#
+# Bug #49250 : spatial btree index corruption and crash
+# Part one : spatial syntax check
+#
+CREATE TABLE t1(col1 MULTIPOLYGON NOT NULL,
+SPATIAL INDEX USING BTREE (col1));
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE (col1))' at line 2
+CREATE TABLE t2(col1 MULTIPOLYGON NOT NULL);
+CREATE SPATIAL INDEX USING BTREE ON t2(col);
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE ON t2(col)' at line 1
+ALTER TABLE t2 ADD SPATIAL INDEX USING BTREE (col1);
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USING BTREE (col1)' at line 1
+DROP TABLE t2;
+End of 5.0 tests
+create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
+create view v1 as select * from t1;
+desc v1;
+Field Type Null Key Default Extra
+f1 tinyint(1) YES NULL
+f2 char(1) YES NULL
+f3 varchar(1) YES NULL
+f4 geometry YES NULL
+f5 datetime YES NULL
+drop view v1;
+drop table t1;
+SELECT MultiPoint(12345,'');
+ERROR 22007: Illegal non geometric '12345' value found during parsing
+SELECT 1 FROM (SELECT GREATEST(1,GEOMETRYCOLLECTION('00000','00000')) b FROM DUAL) AS d WHERE (LINESTRING(d.b));
+ERROR 22007: Illegal non geometric ''00000'' value found during parsing
+#
+# BUG#51875: crash when loading data into geometry function ST_polyfromwkb
+#
+SET @a=0x00000000030000000100000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+SET @a=ST_POLYFROMWKB(@a);
+SET @a=0x00000000030000000000000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+SET @a=ST_POLYFROMWKB(@a);
+create table t1(a polygon NOT NULL)engine=innodb;
+insert into t1 values (ST_geomfromtext("point(0 1)"));
+ERROR 22007: Incorrect POLYGON value: 'POINT' for column 'a' at row 1
+insert into t1 values (ST_geomfromtext("point(1 0)"));
+ERROR 22007: Incorrect POLYGON value: 'POINT' for column 'a' at row 1
+select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
+p
+drop table t1;
+#
+# Test for bug #59888 "debug assertion when attempt to create spatial index
+# on char > 31 bytes".
+#
+create table t1(a char(32) not null) engine=innodb;
+create spatial index i on t1 (a);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+drop table t1;
+End of 5.1 tests
+CREATE TABLE t0 (a BINARY(32) NOT NULL);
+CREATE SPATIAL INDEX i on t0 (a);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+INSERT INTO t0 VALUES (1);
+CREATE TABLE t1(
+col0 BINARY NOT NULL,
+col2 TIMESTAMP,
+SPATIAL INDEX i1 (col0)
+) ENGINE=MyISAM;
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+CREATE TABLE t1 (
+col0 BINARY NOT NULL,
+col2 TIMESTAMP
+) ENGINE=MyISAM;
+CREATE SPATIAL INDEX idx0 ON t1(col0);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+ALTER TABLE t1 ADD SPATIAL INDEX i1 (col0);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+CREATE TABLE t2 (
+col0 INTEGER NOT NULL,
+col1 POINT,
+col2 POINT
+);
+CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+CREATE TABLE t3 (
+col0 INTEGER NOT NULL,
+col1 POINT,
+col2 LINESTRING,
+SPATIAL INDEX i1 (col1, col2)
+);
+ERROR HY000: Incorrect arguments to SPATIAL INDEX
+DROP TABLE t0, t1, t2;
+#
+# BUG#12414917 - ST_ISCLOSED() CRASHES ON 64-BIT BUILDS
+#
+SELECT ST_ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)));
+ST_ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)))
+-1
+#
+# BUG#12537203 - CRASH WHEN SUBSELECTING GLOBAL VARIABLES IN
+# GEOMETRY FUNCTION ARGUMENTS
+#
+SELECT GEOMETRYCOLLECTION((SELECT @@OLD));
+ERROR 22007: Illegal non geometric '' value found during parsing
+End of 5.1 tests
+#
+# Bug#11908153: CRASH AND/OR VALGRIND ERRORS IN FIELD_BLOB::GET_KEY_IMAGE
+#
+CREATE TABLE g1
+(a geometry NOT NULL, UNIQUE KEY i (a(151))) engine=innodb;
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 1)'));
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 2)'));
+FLUSH TABLES;
+SELECT 1 FROM g1
+FORCE INDEX(i) WHERE a = date_sub(now(), interval 2808.4 year_month)
+;
+1
+Warnings:
+Warning 1292 Incorrect datetime value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0?\x00\x00\x00\x00\x00\x00\xF0?'
+Warning 1441 Datetime function: datetime field overflow
+Warning 1292 Incorrect datetime value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0?\x00\x00\x00\x00\x00\x00\x00@'
+DROP TABLE g1;
+#
+# Bug#13013970 MORE CRASHES IN FIELD_BLOB::GET_KEY_IMAGE
+#
+CREATE TABLE g1(a TEXT NOT NULL, KEY(a(255)));
+INSERT INTO g1 VALUES ('a'),('a');
+SELECT 1 FROM g1 WHERE a >= ANY
+(SELECT 1 FROM g1 WHERE a = ST_geomfromtext('') OR a) ;
+1
+Warnings:
+Warning 1292 Truncated incorrect DOUBLE value: 'a'
+Warning 1292 Truncated incorrect DOUBLE value: 'a'
+DROP TABLE g1;
+End of 5.5 tests
+DROP DATABASE IF EXISTS gis_ogs;
+CREATE DATABASE gis_ogs;
+USE gis_ogs;
+#
+# C.3.3.1 Geometry types and functions schema construction
+#
+CREATE TABLE lakes (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+shore POLYGON);
+CREATE TABLE road_segments (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+aliases CHARACTER VARYING(64),
+num_lanes INTEGER,
+centerline LINESTRING);
+CREATE TABLE divided_routes (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+num_lanes INTEGER,
+centerlines MULTILINESTRING);
+CREATE TABLE forests (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+boundary MULTIPOLYGON);
+CREATE TABLE bridges (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+position POINT);
+CREATE TABLE streams (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+centerline LINESTRING);
+CREATE TABLE buildings (
+fid INTEGER NOT NULL PRIMARY KEY,
+address CHARACTER VARYING(64),
+position POINT,
+footprint POLYGON);
+CREATE TABLE ponds (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+type CHARACTER VARYING(64),
+shores MULTIPOLYGON);
+CREATE TABLE named_places (
+fid INTEGER NOT NULL PRIMARY KEY,
+name CHARACTER VARYING(64),
+boundary POLYGON);
+CREATE TABLE map_neatlines (
+fid INTEGER NOT NULL PRIMARY KEY,
+neatline POLYGON);
+#
+# C.3.3.2 Geometry types and functions schema data loading
+#
+# Lakes
+INSERT INTO lakes VALUES (
+101, 'BLUE LAKE',
+ST_PolyFromText(
+'POLYGON(
+(52 18,66 23,73 9,48 6,52 18),
+(59 18,67 18,67 13,59 13,59 18)
+)',
+101));
+# Road Segments
+INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+ST_LineFromText(
+'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 70 38, 72 48 )' ,101));
+INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+ST_LineFromText(
+'LINESTRING( 70 38, 84 42 )' ,101));
+INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+1,
+ST_LineFromText(
+'LINESTRING( 28 26, 28 0 )',101));
+# DividedRoutes
+INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+ST_MLineFromText(
+'MULTILINESTRING((10 48,10 21,10 0),
+(16 0,16 23,16 48))', 101));
+# Forests
+INSERT INTO forests VALUES(109, 'Green Forest',
+ST_MPolyFromText(
+'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+101));
+# Bridges
+INSERT INTO bridges VALUES(110, 'Cam Bridge', ST_PointFromText(
+'POINT( 44 31 )', 101));
+# Streams
+INSERT INTO streams VALUES(111, 'Cam Stream',
+ST_LineFromText(
+'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+INSERT INTO streams VALUES(112, NULL,
+ST_LineFromText(
+'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+# Buildings
+INSERT INTO buildings VALUES(113, '123 Main Street',
+ST_PointFromText(
+'POINT( 52 30 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+INSERT INTO buildings VALUES(114, '215 Main Street',
+ST_PointFromText(
+'POINT( 64 33 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+# Ponds
+INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+ST_MPolyFromText(
+'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+# Named Places
+INSERT INTO named_places VALUES(117, 'Ashton',
+ST_PolyFromText(
+'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+INSERT INTO named_places VALUES(118, 'Goose Island',
+ST_PolyFromText(
+'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+# Map Neatlines
+INSERT INTO map_neatlines VALUES(115,
+ST_PolyFromText(
+'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+#
+# C.3.3.3 Geometry types and functions schema test queries
+
+# Conformance Item T6
+SELECT ST_Dimension(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_Dimension(shore)
+2
+# Conformance Item T7
+SELECT ST_GeometryType(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_GeometryType(centerlines)
+MULTILINESTRING
+# Conformance Item T8
+SELECT ST_AsText(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(boundary)
+POLYGON((67 13,67 18,59 18,59 13,67 13))
+# Conformance Item T9
+SELECT ST_AsText(ST_PolyFromWKB(ST_AsBinary(boundary),101))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(ST_PolyFromWKB(ST_AsBinary(boundary),101))
+POLYGON((67 13,67 18,59 18,59 13,67 13))
+# Conformance Item T10
+SELECT ST_SRID(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+ST_SRID(boundary)
+101
+# Conformance Item T11
+SELECT ST_IsEmpty(centerline)
+FROM road_segments
+WHERE name = 'Route 5'
+AND aliases = 'Main Street';
+ST_IsEmpty(centerline)
+0
+# Conformance Item T14
+SELECT ST_AsText(ST_Envelope(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(ST_Envelope(boundary))
+POLYGON((59 13,67 13,67 18,59 18,59 13))
+# Conformance Item T15
+SELECT ST_X(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+ST_X(position)
+44
+# Conformance Item T16
+SELECT ST_Y(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+ST_Y(position)
+31
+# Conformance Item T17
+SELECT ST_AsText(ST_StartPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+ST_AsText(ST_StartPoint(centerline))
+POINT(0 18)
+# Conformance Item T18
+SELECT ST_AsText(ST_EndPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+ST_AsText(ST_EndPoint(centerline))
+POINT(44 31)
+# Conformance Item T21
+SELECT ST_Length(centerline)
+FROM road_segments
+WHERE fid = 106;
+ST_Length(centerline)
+26
+# Conformance Item T22
+SELECT ST_NumPoints(centerline)
+FROM road_segments
+WHERE fid = 102;
+ST_NumPoints(centerline)
+5
+# Conformance Item T23
+SELECT ST_AsText(ST_PointN(centerline, 1))
+FROM road_segments
+WHERE fid = 102;
+ST_AsText(ST_PointN(centerline, 1))
+POINT(0 18)
+# Conformance Item T24
+SELECT ST_AsText(ST_Centroid(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_AsText(ST_Centroid(boundary))
+POINT(63 15.5)
+# Conformance Item T26
+SELECT ST_Area(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+ST_Area(boundary)
+40
+# Conformance Item T27
+SELECT ST_AsText(ST_ExteriorRing(shore))
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_AsText(ST_ExteriorRing(shore))
+LINESTRING(52 18,66 23,73 9,48 6,52 18)
+# Conformance Item T28
+SELECT ST_NumInteriorRings(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_NumInteriorRings(shore)
+1
+# Conformance Item T29
+SELECT ST_AsText(ST_InteriorRingN(shore, 1))
+FROM lakes
+WHERE name = 'Blue Lake';
+ST_AsText(ST_InteriorRingN(shore, 1))
+LINESTRING(59 18,67 18,67 13,59 13,59 18)
+# Conformance Item T30
+SELECT ST_NumGeometries(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_NumGeometries(centerlines)
+2
+# Conformance Item T31
+SELECT ST_AsText(ST_GeometryN(centerlines, 2))
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_AsText(ST_GeometryN(centerlines, 2))
+LINESTRING(16 0,16 23,16 48)
+# Conformance Item T32
+SELECT ST_IsClosed(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_IsClosed(centerlines)
+0
+# Conformance Item T33
+SELECT ST_Length(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+ST_Length(centerlines)
+96
+# Conformance Item T34
+SELECT ST_AsText(ST_Centroid(shores))
+FROM ponds
+WHERE fid = 120;
+ST_AsText(ST_Centroid(shores))
+POINT(25 42)
+# Conformance Item T36
+SELECT ST_Area(shores)
+FROM ponds
+WHERE fid = 120;
+ST_Area(shores)
+8
+# Conformance Item T37
+SELECT ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',101))
+FROM named_places
+WHERE name = 'Goose Island';
+ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',101))
+1
+# Conformance Item T38
+SELECT ST_Disjoint(centerlines, boundary)
+FROM divided_routes, named_places
+WHERE divided_routes.name = 'Route 75'
+AND named_places.name = 'Ashton';
+ST_Disjoint(centerlines, boundary)
+1
+# Conformance Item T39
+SELECT ST_Touches(centerline, shore)
+FROM streams, lakes
+WHERE streams.name = 'Cam Stream'
+AND lakes.name = 'Blue Lake';
+ST_Touches(centerline, shore)
+1
+# Conformance Item T42
+SELECT ST_Crosses(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+ST_Crosses(road_segments.centerline, divided_routes.centerlines)
+1
+# Conformance Item T43
+SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+1
+# Conformance Item T44
+SELECT ST_Contains(forests.boundary, named_places.boundary)
+FROM forests, named_places
+WHERE forests.name = 'Green Forest'
+AND named_places.name = 'Ashton';
+ST_Contains(forests.boundary, named_places.boundary)
+0
+# Conformance Item T46
+SELECT ST_Distance(position, boundary)
+FROM bridges, named_places
+WHERE bridges.name = 'Cam Bridge'
+AND named_places.name = 'Ashton';
+ST_Distance(position, boundary)
+12
+# Conformance Item T48
+SELECT ST_AsText(ST_Difference(named_places.boundary, forests.boundary))
+FROM named_places, forests
+WHERE named_places.name = 'Ashton'
+AND forests.name = 'Green Forest';
+ST_AsText(ST_Difference(named_places.boundary, forests.boundary))
+POLYGON((56 34,62 48,84 48,84 42,56 34))
+SELECT ST_AsText(ST_Union(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Goose Island';
+ST_AsText(ST_Union(shore, boundary))
+POLYGON((48 6,52 18,66 23,73 9,48 6))
+# Conformance Item T50
+SELECT ST_AsText(ST_SymDifference(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Ashton';
+ST_AsText(ST_SymDifference(shore, boundary))
+MULTIPOLYGON(((48 6,52 18,66 23,73 9,48 6),(59 13,59 18,67 18,67 13,59 13)),((56 30,56 34,62 48,84 48,84 30,56 30)))
+# Conformance Item T51
+SELECT count(*)
+FROM buildings, bridges
+WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+count(*)
+1
+DROP DATABASE gis_ogs;
+#
+# Bug#13362660 ASSERTION `FIELD_POS < FIELD_COUNT' FAILED. IN PROTOCOL_TEXT::STORE
+#
+SELECT ST_Union('', ''), md5(1);
+ST_Union('', '') md5(1)
+NULL c4ca4238a0b923820dcc509a6f75849b
diff --git a/mysql-test/suite/innodb_gis/r/precise.result b/mysql-test/suite/innodb_gis/r/precise.result
new file mode 100644
index 00000000000..9d6538bc3ed
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/precise.result
@@ -0,0 +1,515 @@
+DROP TABLE IF EXISTS t1;
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), ST_GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))'));
+1 ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), ST_GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))'))
+1 1
+select 0, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))'));
+0 ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))'))
+0 0
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POINT(10 10)'));
+1 ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POINT(10 10)'))
+1 1
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+1 ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'))
+1 1
+select 0, ST_Within(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+0 ST_Within(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'))
+0 0
+select 1, ST_Within(ST_GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), ST_GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))'));
+1 ST_Within(ST_GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), ST_GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))'))
+1 1
+create table t1 (g point)engine=innodb;
+insert into t1 values
+(ST_GeomFromText('POINT(2 2)')), (ST_GeomFromText('POINT(2 4)')), (ST_GeomFromText('POINT(2 6)')), (ST_GeomFromText('POINT(2 8)')),
+(ST_GeomFromText('POINT(4 2)')), (ST_GeomFromText('POINT(4 4)')), (ST_GeomFromText('POINT(4 6)')), (ST_GeomFromText('POINT(4 8)')),
+(ST_GeomFromText('POINT(6 2)')), (ST_GeomFromText('POINT(6 4)')), (ST_GeomFromText('POINT(6 6)')), (ST_GeomFromText('POINT(6 8)')),
+(ST_GeomFromText('POINT(8 2)')), (ST_GeomFromText('POINT(8 4)')), (ST_GeomFromText('POINT(8 6)')), (ST_GeomFromText('POINT(8 8)'));
+select ST_astext(g) from t1 where ST_Within(g, ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'));
+ST_astext(g)
+POINT(4 4)
+POINT(6 2)
+POINT(6 4)
+POINT(6 6)
+select 'Contains';
+Contains
+Contains
+select ST_astext(g) from t1 where ST_Contains(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
+ST_astext(g)
+POINT(4 4)
+POINT(6 2)
+POINT(6 4)
+POINT(6 6)
+select 'Intersects';
+Intersects
+Intersects
+select ST_astext(g) from t1 where ST_Intersects(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
+ST_astext(g)
+POINT(4 4)
+POINT(6 2)
+POINT(6 4)
+POINT(6 6)
+select 'Contains';
+Contains
+Contains
+select ST_astext(g) from t1 where ST_Contains(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
+ST_astext(g)
+POINT(4 4)
+POINT(6 2)
+POINT(6 4)
+POINT(6 6)
+select 'Contains2';
+Contains2
+Contains2
+select ST_astext(g) from t1 where ST_Contains(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1), (5.01 3.01, 6 5, 9 5, 8 3, 5.01 3.01))'), g);
+ST_astext(g)
+POINT(4 4)
+POINT(6 2)
+POINT(6 6)
+POINT(8 4)
+DROP TABLE t1;
+select 0, ST_Within(ST_GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+0 ST_Within(ST_GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'))
+0 0
+select 1, ST_Within(ST_GeomFromText('LINESTRING(15 15, 16 16)'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+1 ST_Within(ST_GeomFromText('LINESTRING(15 15, 16 16)'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'))
+1 1
+select 1, ST_Intersects(ST_GeomFromText('LINESTRING(15 15, 50 50)'), ST_GeomFromText('LINESTRING(50 15, 15 50)'));
+1 ST_Intersects(ST_GeomFromText('LINESTRING(15 15, 50 50)'), ST_GeomFromText('LINESTRING(50 15, 15 50)'))
+1 1
+select 1, ST_Intersects(ST_GeomFromText('LINESTRING(15 15, 50 50)'), ST_GeomFromText('LINESTRING(16 16, 51 51)'));
+1 ST_Intersects(ST_GeomFromText('LINESTRING(15 15, 50 50)'), ST_GeomFromText('LINESTRING(16 16, 51 51)'))
+1 1
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'));
+1 ST_Intersects(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))
+1 1
+select ST_astext(ST_Union(ST_geometryfromtext('point(1 1)'), ST_geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')));
+ST_astext(ST_Union(ST_geometryfromtext('point(1 1)'), ST_geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')))
+POLYGON((0 0,1 2,2 0,0 0))
+select ST_astext(ST_Intersection(ST_geometryfromtext('point(1 1)'), ST_geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')));
+ST_astext(ST_Intersection(ST_geometryfromtext('point(1 1)'), ST_geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')))
+POINT(1 1)
+select ST_Intersects(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'));
+ST_Intersects(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))
+1
+select ST_contains(ST_GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), ST_GeomFromText('POINT(5 10)'));
+ST_contains(ST_GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), ST_GeomFromText('POINT(5 10)'))
+0
+select ST_Disjoint(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))'));
+ST_Disjoint(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))'))
+1
+select ST_Disjoint(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'));
+ST_Disjoint(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'))
+0
+select ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'));
+ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'))
+1
+select ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))'));
+ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))'))
+0
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
+ST_DISTANCE(ST_geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'))
+0.7071067811865475
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), ST_geomfromtext('linestring(0 1, 1 0)'));
+ST_DISTANCE(ST_geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), ST_geomfromtext('linestring(0 1, 1 0)'))
+0
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
+ST_DISTANCE(ST_geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'))
+0
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), ST_geomfromtext('point(3 3)'));
+ST_DISTANCE(ST_geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), ST_geomfromtext('point(3 3)'))
+0.4472135954999579
+select ST_DISTANCE(ST_geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
+ST_DISTANCE(ST_geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'))
+0.8944271909999159
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')));
+ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')))
+POLYGON((26.47058823529412 23.823529411764707,21.951219512195124 27.439024390243905,23.855421686746986 29.819277108433734,29.289940828402365 26.36094674556213,26.47058823529412 23.823529411764707))
+select ST_astext(ST_Intersection(ST_GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), ST_GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)')));
+ST_astext(ST_Intersection(ST_GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), ST_GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)')))
+MULTIPOINT(26.47058823529412 23.823529411764707,29.289940828402365 26.36094674556213,21.951219512195124 27.439024390243905,23.855421686746986 29.819277108433734)
+select ST_astext(ST_Intersection(ST_GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), ST_GeomFromText('LINESTRING(50 5, 55 10, 0 45)')));
+ST_astext(ST_Intersection(ST_GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), ST_GeomFromText('LINESTRING(50 5, 55 10, 0 45)')))
+POINT(29.289940828402365 26.36094674556213)
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POINT(20 20)')));
+ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POINT(20 20)')))
+POINT(20 20)
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200)')));
+ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200)')))
+LINESTRING(0 0,46.666666666666664 46.666666666666664)
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
+ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')))
+MULTILINESTRING((0 0,46.666666666666664 46.666666666666664),(8 10,45.33333333333333 47.33333333333333))
+select ST_astext(ST_UNION(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
+ST_astext(ST_UNION(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')))
+GEOMETRYCOLLECTION(LINESTRING(-10 -10,0 0),LINESTRING(-11 -9,8 10),POLYGON((0 0,40 50,50 45,0 0)),LINESTRING(46.666666666666664 46.666666666666664,200 200,199 201,45.33333333333333 47.33333333333333))
+select ST_astext(ST_intersection(ST_geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), ST_geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')));
+ST_astext(ST_intersection(ST_geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), ST_geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')))
+POLYGON((0 0,0 1,0.5 0.5,0 0))
+select ST_astext(ST_symdifference(ST_geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), ST_geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')));
+ST_astext(ST_symdifference(ST_geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), ST_geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')))
+MULTIPOLYGON(((0 0,0.5 0.5,1 0,0 0)),((0.5 0.5,0 1,0 2,1 1,0.5 0.5)))
+select ST_astext(ST_UNION(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
+ST_astext(ST_UNION(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')))
+GEOMETRYCOLLECTION(LINESTRING(-10 -10,0 0),LINESTRING(-11 -9,8 10),POLYGON((0 0,40 50,50 45,0 0)),LINESTRING(46.666666666666664 46.666666666666664,200 200,199 201,45.33333333333333 47.33333333333333))
+select ST_astext(ST_buffer(ST_geometryfromtext('point(1 1)'), 1));
+ST_astext(ST_buffer(ST_geometryfromtext('point(1 1)'), 1))
+POLYGON((1 0,0.9509 0.0012,0.9019 0.0048,0.8532 0.0108,0.8049 0.0192,0.7570 0.0299,0.7097 0.0430,0.6631 0.0584,0.6173 0.0761,0.5724 0.0960,0.5286 0.1180,0.4858 0.1422,0.4444 0.1685,0.4043 0.1967,0.3656 0.2269,0.3284 0.2590,0.2928 0.2928,0.2590 0.3284,0.2269 0.3656,0.1967 0.4043,0.1685 0.4444,0.1422 0.4858,0.1180 0.5286,0.0960 0.5724,0.0761 0.6173,0.0584 0.6631,0.0430 0.7097,0.0299 0.7570,0.0192 0.8049,0.0108 0.8532,0.0048 0.9019,0.0012 0.9509,0 1,0.0048 1.0980,0.0108 1.1467,0.0192 1.1950,0.0299 1.2429,0.0430 1.2902,0.0584 1.3368,0.0761 1.3826,0.0960 1.4275,0.1180 1.4713,0.1422 1.5141,0.1685 1.5555,0.1967 1.5956,0.2269 1.6343,0.2590 1.6715,0.2928 1.7071,0.3284 1.7409,0.3656 1.7730,0.4043 1.8032,0.4444 1.8314,0.4858 1.8577,0.5286 1.8819,0.5724 1.9039,0.6173 1.9238,0.6631 1.9415,0.7097 1.9569,0.7570 1.9700,0.8049 1.9807,0.8532 1.9891,0.9019 1.9951,0.9509 1.9987,1 2,1.0490 1.9987,1.0980 1.9951,1.1467 1.9891,1.1950 1.9807,1.2429 1.9700,1.2902 1.9569,1.3368 1.9415,1.3826 1.9238,1.4275 1.9039,1.4713 1.8819,1.5141 1.8577,1.5555 1.8314,1.5956 1.8032,1.6343 1.7730,1.6715 1.7409,1.7071 1.7071,1.7409 1.6715,1.7730 1.6343,1.8032 1.5956,1.8314 1.5555,1.8577 1.5141,1.8819 1.4713,1.9039 1.4275,1.9238 1.3826,1.9415 1.3368,1.9569 1.2902,1.9700 1.2429,1.9807 1.1950,1.9891 1.1467,1.9951 1.0980,1.9987 1.0490,2 1,1.9951 0.9019,1.9891 0.8532,1.9807 0.8049,1.9700 0.7570,1.9569 0.7097,1.9415 0.6631,1.9238 0.6173,1.9039 0.5724,1.8819 0.5286,1.8577 0.4858,1.8314 0.4444,1.8032 0.4043,1.7730 0.3656,1.7409 0.3284,1.7071 0.2928,1.6715 0.2590,1.6343 0.2269,1.5956 0.1967,1.5555 0.1685,1.5141 0.1422,1.4713 0.1180,1.4275 0.0960,1.3826 0.0761,1.3368 0.0584,1.2902 0.0430,1.2429 0.0299,1.1950 0.0192,1.1467 0.0108,1.0980 0.0048,1.0490 0.0012,1 0))
+create table t1(geom geometrycollection)engine=innodb;
+select ST_astext(geom), ST_area(geom),ST_area(ST_buffer(geom,2)) from t1;
+ST_astext(geom) ST_area(geom) ST_area(ST_buffer(geom,2))
+select ST_NUMPOINTS(ST_EXTERIORRING(ST_buffer(geom,2))) from t1;
+ST_NUMPOINTS(ST_EXTERIORRING(ST_buffer(geom,2)))
+set @geom=ST_geomfromtext('LINESTRING(2 1, 4 2, 2 3, 2 5)');
+set @buff=ST_buffer(@geom,1);
+select ST_NUMPOINTS(ST_EXTERIORRING(@buff)) from t1;
+ST_NUMPOINTS(ST_EXTERIORRING(@buff))
+DROP TABLE t1;
+select st_touches(ST_geomfromtext('point(0 0)'), ST_geomfromtext('point(1 1)'));
+st_touches(ST_geomfromtext('point(0 0)'), ST_geomfromtext('point(1 1)'))
+0
+select st_touches(ST_geomfromtext('point(1 1)'), ST_geomfromtext('point(1 1)'));
+st_touches(ST_geomfromtext('point(1 1)'), ST_geomfromtext('point(1 1)'))
+0
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 1)'));
+st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 1)'))
+1
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 0)'));
+st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 0)'))
+0
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 2)'));
+st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 2)'))
+0
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))'));
+st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))'))
+0
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))'));
+st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))'))
+1
+SELECT ST_Equals(ST_PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),ST_PolyFromText('POLYGON((67 13, 67 18, 59 19, 59 13, 59 13, 67 13) )')) as result;
+result
+0
+SELECT ST_Equals(ST_PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),ST_PolyFromText('POLYGON((67 13, 67 18, 59 18, 59 13, 59 13, 67 13) )')) as result;
+result
+1
+SELECT ST_Equals(ST_PointFromText('POINT (12 13)'),ST_PointFromText('POINT (12 13)')) as result;
+result
+1
+#
+# BUG#11755628/47429: INTERSECTION FUNCTION CRASHED MYSQLD
+# BUG#11759650/51979: UNION/INTERSECTION OF POLYGONS CRASHES MYSQL
+#
+SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((525000 183300,525400
+183300,525400 18370, 525000 183700,525000 183300))'),
+ST_geomfromtext('POLYGON((525298.67 183511.53,525296.57
+183510.39,525296.42 183510.31,525289.11 183506.62,525283.17
+183503.47,525280.98 183502.26,525278.63 183500.97,525278.39
+183500.84,525276.79 183500,525260.7 183491.55,525263.95
+183484.75,525265.58 183481.95,525278.97 183488.73,525276.5
+183493.45,525275.5 183495.7,525280.35 183498.2,525282.3
+183499.1,525282.2 183499.3,525283.55 183500,525301.75
+183509.35,525304.45 183504.25,525307.85 183504.95,525304.5
+183510.83,525302.81 183513.8,525298.67 183511.53),(525275.06
+183489.89,525272.06 183488.37,525268.94 183494.51,525271.94
+183496.03,525275.06 183489.89),(525263.26 183491.55,525266.15
+183493.04,525269.88 183485.82,525266.99 183484.33,525263.26
+183491.55))'))) st_u;
+st_u
+MULTIPOLYGON(((525400 18370,525000.9677614468 183300,525400 183300,525400 18370)),((525000 183300,525000 183700,525000.9677614468 183300,525000 183300)),((525265.58 183481.95,525263.95 183484.75,525260.7 183491.55,525276.79 183500,525278.39 183500.84,525278.63 183500.97,525280.98 183502.26,525283.17 183503.47,525289.11 183506.62,525296.42 183510.31,525296.57 183510.39,525298.67 183511.53,525302.81 183513.8,525304.5 183510.83,525307.85 183504.95,525304.45 183504.25,525301.75 183509.35,525283.55 183500,525282.2 183499.3,525282.3 183499.1,525280.35 183498.2,525275.5 183495.7,525276.5 183493.45,525278.97 183488.73,525265.58 183481.95),(525266.99 183484.33,525263.26 183491.55,525266.15 183493.04,525269.88 183485.82,525266.99 183484.33),(525272.06 183488.37,525268.94 183494.51,525271.94 183496.03,525275.06 183489.89,525272.06 183488.37)))
+SET @a=0x0000000001030000000200000005000000000000000000000000000000000000000000000000002440000000000000000000000000000024400000000000002440000000000000000000000000000024400000000000000000000000000000000000000000000000000000F03F000000000000F03F0000000000000040000000000000F03F00000000000000400000000000000040000000000000F03F0000000000000040000000000000F03F000000000000F03F;
+SELECT ST_ASTEXT(ST_TOUCHES(@a, ST_GEOMFROMTEXT('point(0 0)'))) t;
+t
+NULL
+DROP TABLE IF EXISTS p1;
+CREATE PROCEDURE p1(dist DOUBLE, geom TEXT)
+BEGIN
+DECLARE g GEOMETRY;
+SET g=GeomFromText(geom);
+SELECT geom AS `-----`;
+SELECT dist, GeometryType(@buf:=ST_Buffer(g, dist)) AS `buffer`, ROUND(ST_AREA(@buf),2) AS buf_area;
+END|
+#
+# Testing ST_BUFFER with positive distance
+#
+-----
+POINT(0 0))
+dist buffer buf_area
+1 POLYGON 3.14
+-----
+LineString(0 1, 1 1))
+dist buffer buf_area
+1 POLYGON 5.14
+-----
+LineString(9 9,8 1,1 5,0 0)
+dist buffer buf_area
+1 POLYGON 44.63
+-----
+Polygon((2 2,2 8,8 8,8 2,2 2))
+dist buffer buf_area
+1 POLYGON 63.14
+-----
+Polygon((0 0,0 8,8 8,8 0,0 0),(2 2,6 2,6 6,2 6,2 2))
+dist buffer buf_area
+1 POLYGON 95.14
+-----
+Polygon((0 0, 0 8, 8 8, 8 10, -10 10, -10 0, 0 0))
+dist buffer buf_area
+1 POLYGON 174.93
+-----
+MultiPoint(9 9,8 1,1 5)
+dist buffer buf_area
+1 MULTIPOLYGON 9.42
+-----
+MultiLineString((0 0,2 2))
+dist buffer buf_area
+1 POLYGON 8.80
+-----
+MultiLineString((0 0,2 2,0 4))
+dist buffer buf_area
+1 POLYGON 14.24
+-----
+MultiLineString((0 0,2 2),(0 2,2 0))
+dist buffer buf_area
+1 POLYGON 13.59
+-----
+MultiLineString((2 2,2 8,-2 8),(-6 -6, 6 6),(10 10, 14 14))
+dist buffer buf_area
+1 MULTIPOLYGON 70.06
+-----
+MultiPolygon(((2 2,2 8,8 8,8 2,2 2)), ((9 9,8 1,1 5,9 9)))
+dist buffer buf_area
+1 POLYGON 73.18
+-----
+MultiPolygon(((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)),((9 9,8 1,1 5,9 9)))
+dist buffer buf_area
+1 POLYGON 73.18
+-----
+GeometryCollection(Point(0 0))
+dist buffer buf_area
+1 POLYGON 3.14
+-----
+GeometryCollection(LineString(0 0, 2 2)))
+dist buffer buf_area
+1 POLYGON 8.80
+-----
+GeometryCollection(Polygon((2 2,2 8,8 8,8 2,2 2))))
+dist buffer buf_area
+1 POLYGON 63.14
+-----
+GeometryCollection(MultiPoint(9 9,8 1,1 5))
+dist buffer buf_area
+1 MULTIPOLYGON 9.42
+-----
+GeometryCollection(MultiLineString((0 0,0 1),(3 0,3 1)))
+dist buffer buf_area
+1 MULTIPOLYGON 10.28
+-----
+GeometryCollection(MultiPolygon(((0 0, 3 0, 3 3, 0 3, 0 0)),((6 6,6 9,9 9,9 6,6 6))))
+dist buffer buf_area
+1 MULTIPOLYGON 48.28
+-----
+GeometryCollection(Point(9 9),LineString(1 5,0 0),Polygon((2 2,2 8,8 8,8 2,2 2)))
+dist buffer buf_area
+1 POLYGON 75.92
+#
+# Testing ST_BUFFER with zero distance
+#
+-----
+POINT(0 0))
+dist buffer buf_area
+0 POINT 0.00
+-----
+LineString(0 1, 1 1))
+dist buffer buf_area
+0 LINESTRING 0.00
+-----
+LineString(9 9,8 1,1 5,0 0)
+dist buffer buf_area
+0 LINESTRING 0.00
+-----
+Polygon((2 2,2 8,8 8,8 2,2 2))
+dist buffer buf_area
+0 POLYGON 36.00
+-----
+Polygon((0 0,0 8,8 8,8 0,0 0),(2 2,6 2,6 6,2 6,2 2))
+dist buffer buf_area
+0 POLYGON 48.00
+-----
+Polygon((0 0, 0 8, 8 8, 8 10, -10 10, -10 0, 0 0))
+dist buffer buf_area
+0 POLYGON 116.00
+-----
+MultiPoint(9 9,8 1,1 5)
+dist buffer buf_area
+0 MULTIPOINT NULL
+-----
+MultiLineString((0 0,2 2))
+dist buffer buf_area
+0 MULTILINESTRING NULL
+-----
+MultiLineString((0 0,2 2,0 4))
+dist buffer buf_area
+0 MULTILINESTRING NULL
+-----
+MultiLineString((0 0,2 2),(0 2,2 0))
+dist buffer buf_area
+0 MULTILINESTRING NULL
+-----
+MultiLineString((2 2,2 8,-2 8),(-6 -6, 6 6),(10 10, 14 14))
+dist buffer buf_area
+0 MULTILINESTRING NULL
+-----
+MultiPolygon(((2 2,2 8,8 8,8 2,2 2)), ((9 9,8 1,1 5,9 9)))
+dist buffer buf_area
+0 MULTIPOLYGON 66.00
+-----
+MultiPolygon(((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)),((9 9,8 1,1 5,9 9)))
+dist buffer buf_area
+0 MULTIPOLYGON 62.00
+-----
+GeometryCollection(Point(0 0))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(LineString(0 0, 2 2)))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(Polygon((2 2,2 8,8 8,8 2,2 2))))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION 36.00
+-----
+GeometryCollection(MultiPoint(9 9,8 1,1 5))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION NULL
+-----
+GeometryCollection(MultiLineString((0 0,0 1),(3 0,3 1)))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION NULL
+-----
+GeometryCollection(MultiPolygon(((0 0, 3 0, 3 3, 0 3, 0 0)),((6 6,6 9,9 9,9 6,6 6))))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION 18.00
+-----
+GeometryCollection(Point(9 9),LineString(1 5,0 0),Polygon((2 2,2 8,8 8,8 2,2 2)))
+dist buffer buf_area
+0 GEOMETRYCOLLECTION 36.00
+#
+# Testing ST_BUFFER with negative distance
+#
+-----
+POINT(0 0))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+LineString(0 1, 1 1))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+LineString(9 9,8 1,1 5,0 0)
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+Polygon((2 2,2 8,8 8,8 2,2 2))
+dist buffer buf_area
+-1 POLYGON 16.00
+-----
+MultiPoint(9 9,8 1,1 5)
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+MultiLineString((0 0,2 2))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+MultiLineString((0 0,2 2,0 4))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+MultiLineString((0 0,2 2),(0 2,2 0))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+MultiLineString((2 2,2 8,-2 8),(-6 -6, 6 6),(10 10, 14 14))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(Point(0 0))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(LineString(0 0, 2 2)))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(Polygon((2 2,2 8,8 8,8 2,2 2))))
+dist buffer buf_area
+-1 POLYGON 16.00
+-----
+GeometryCollection(MultiPoint(9 9,8 1,1 5))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(MultiLineString((0 0,0 1),(3 0,3 1)))
+dist buffer buf_area
+-1 GEOMETRYCOLLECTION 0.00
+-----
+GeometryCollection(Point(9 9),LineString(1 5,0 0),Polygon((2 2,2 8,8 8,8 2,2 2)))
+dist buffer buf_area
+-1 POLYGON 16.00
+SELECT ST_CONTAINS(
+GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'),
+GeomFromText('POINT(5 10)'));
+ST_CONTAINS(
+GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'),
+GeomFromText('POINT(5 10)'))
+0
+SELECT AsText(ST_UNION(
+GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'),
+GeomFromText('POINT(5 10)')));
+AsText(ST_UNION(
+GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'),
+GeomFromText('POINT(5 10)')))
+GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)),POLYGON((6 6,6 11,11 11,11 6,6 6)),POINT(5 10))
+DROP PROCEDURE p1;
+#
+# Bug #13833019 ASSERTION `T1->RESULT_RANGE' FAILED IN GCALC_OPERATION_REDUCER::END_COUPLE
+#
+SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3));
+GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3))
+POLYGON
+#
+# Bug #13832749 HANDLE_FATAL_SIGNAL IN GCALC_FUNCTION::COUNT_INTERNAL
+#
+SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1));
+GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1))
+POLYGON
+#
+# Bug#13358363 - ASSERTION: N > 0 && N < SINUSES_CALCULATED*2+1 | GET_N_SINCOS/ADD_EDGE_BUFFER
+#
+DO ST_BUFFER(ST_GEOMCOLLFROMTEXT('linestring(1 1,2 2)'),'');
+Warnings:
+Warning 1292 Truncated incorrect DOUBLE value: ''
+SELECT ST_WITHIN(
+LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '),
+ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) '),
+ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) '))));
+ST_WITHIN(
+LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '),
+ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) ')
+0
+SELECT ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '),
+ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))'))));
+ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '),
+ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))'))))
+2
+SELECT ST_NUMINTERIORRINGS(
+ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '),
+SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) ')))));
+ST_NUMINTERIORRINGS(
+ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '),
+SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) ')))))
+0
+SELECT ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'),
+SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) '))));
+ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'),
+SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) '))))
+POLYGON((9 9,5 2,4 5,9 9))
diff --git a/mysql-test/suite/innodb_gis/r/rt_precise.result b/mysql-test/suite/innodb_gis/r/rt_precise.result
new file mode 100644
index 00000000000..e52f2ab5aa3
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/rt_precise.result
@@ -0,0 +1,59 @@
+SET default_storage_engine=InnoDB;
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (
+fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+g GEOMETRY NOT NULL,
+KEY gis_key(g(5))
+) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `fid` int(11) NOT NULL AUTO_INCREMENT,
+ `g` geometry NOT NULL,
+ PRIMARY KEY (`fid`),
+ KEY `gis_key` (`g`(5))
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SELECT count(*) FROM t1;
+count(*)
+150
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status OK
+EXPLAIN SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g, ST_GeomFromText('Polygon((140 140,160 140,160 160,140 140))'));
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL gis_key NULL NULL NULL 150 #
+SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g, ST_GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')) ORDER BY fid;
+fid ST_AsText(g)
+1 LINESTRING(150 150,150 150)
+2 LINESTRING(149 149,151 151)
+3 LINESTRING(148 148,152 152)
+4 LINESTRING(147 147,153 153)
+5 LINESTRING(146 146,154 154)
+6 LINESTRING(145 145,155 155)
+7 LINESTRING(144 144,156 156)
+8 LINESTRING(143 143,157 157)
+9 LINESTRING(142 142,158 158)
+10 LINESTRING(141 141,159 159)
+11 LINESTRING(140 140,160 160)
+DROP TABLE t1;
+CREATE TABLE t1 (
+fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+g GEOMETRY NOT NULL
+) ENGINE=InnoDB;
+ALTER TABLE t1 ADD SPATIAL KEY(g);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `fid` int(11) NOT NULL AUTO_INCREMENT,
+ `g` geometry NOT NULL,
+ PRIMARY KEY (`fid`),
+ SPATIAL KEY `g` (`g`)
+) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=latin1
+SELECT count(*) FROM t1;
+count(*)
+100
+SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g,
+ST_GeomFromText('Polygon((40 40,60 40,60 60,40 40))')) ORDER BY fid;
+fid ST_AsText(g)
+DROP TABLE t1;
+End of 5.5 tests.
diff --git a/mysql-test/suite/innodb_gis/r/rtree.result b/mysql-test/suite/innodb_gis/r/rtree.result
new file mode 100644
index 00000000000..8374be77564
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/rtree.result
@@ -0,0 +1,251 @@
+create table t1 (i int, g geometry not null, spatial index (g))engine=innodb;
+insert into t1 values (1, POINT(1,1));
+insert into t1 values (1, POINT(1.5,1.5));
+insert into t1 values (1, POINT(3,3));
+insert into t1 values (1, POINT(3.1,3.1));
+insert into t1 values (1, POINT(5,5));
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status OK
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+explain select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range g g 34 NULL 1 Using where
+select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+ST_astext(t1.g)
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+delete from t1 where MBRWithin(t1.g, @g1);
+check table t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+select ST_astext(t1.g) from t1;
+ST_astext(t1.g)
+POINT(1 1)
+POINT(1.5 1.5)
+POINT(3 3)
+POINT(3.1 3.1)
+POINT(5 5)
+set @g1 = ST_GeomFromText('Polygon((5 5,5 5,5 5,5 5,5 5))');
+update t1 set g = POINT(2,2) where MBRWithin(t1.g, @g1);
+check table t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+select ST_astext(t1.g) from t1;
+ST_astext(t1.g)
+POINT(1 1)
+POINT(1.5 1.5)
+POINT(3 3)
+POINT(3.1 3.1)
+POINT(2 2)
+show indexes from t1;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+t1 1 g 1 g A # 32 NULL SPATIAL
+drop table t1;
+create table t1 (name VARCHAR(100), square GEOMETRY not null, spatial index (square))engine=innodb;
+INSERT INTO t1 VALUES("small", ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+INSERT INTO t1 VALUES("up", ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", ST_GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+INSERT INTO t1 VALUES("down", ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", ST_GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+INSERT INTO t1 VALUES("right", ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", ST_GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+INSERT INTO t1 VALUES("left", ST_GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", ST_GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+SET @p = ST_GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))');
+SELECT name, ST_AsText(square) from t1 where MBRContains(@p, square);
+name ST_AsText(square)
+small POLYGON((0 0,0 1,1 1,1 0,0 0))
+SELECT name, ST_AsText(square) from t1 where MBRDisjoint(@p, square);
+name ST_AsText(square)
+up3 POLYGON((0 3,0 5,2 5,2 3,0 3))
+down3 POLYGON((0 -3,0 -1,2 -1,2 -3,0 -3))
+right3 POLYGON((3 0,3 2,5 2,5 0,3 0))
+left3 POLYGON((-3 0,-3 2,-1 2,-1 0,-3 0))
+SELECT name, ST_AsText(square) from t1 where MBREquals(@p, square);
+name ST_AsText(square)
+SELECT name, ST_AsText(square) from t1 where MBRIntersects(@p, square);
+name ST_AsText(square)
+right2 POLYGON((2 0,2 2,4 2,4 0,2 0))
+right POLYGON((1 0,1 2,3 2,3 0,1 0))
+up2 POLYGON((0 2,0 4,2 4,2 2,0 2))
+up POLYGON((0 1,0 3,2 3,2 1,0 1))
+big POLYGON((0 0,0 3,3 3,3 0,0 0))
+small POLYGON((0 0,0 1,1 1,1 0,0 0))
+down POLYGON((0 -1,0 1,2 1,2 -1,0 -1))
+down2 POLYGON((0 -2,0 0,2 0,2 -2,0 -2))
+left POLYGON((-1 0,-1 2,1 2,1 0,-1 0))
+left2 POLYGON((-2 0,-2 2,0 2,0 0,-2 0))
+SELECT name, ST_AsText(square) from t1 where MBROverlaps(@p, square);
+name ST_AsText(square)
+right POLYGON((1 0,1 2,3 2,3 0,1 0))
+up POLYGON((0 1,0 3,2 3,2 1,0 1))
+down POLYGON((0 -1,0 1,2 1,2 -1,0 -1))
+left POLYGON((-1 0,-1 2,1 2,1 0,-1 0))
+SELECT name, ST_AsText(square) from t1 where MBRTouches(@p, square);
+name ST_AsText(square)
+right2 POLYGON((2 0,2 2,4 2,4 0,2 0))
+up2 POLYGON((0 2,0 4,2 4,2 2,0 2))
+down2 POLYGON((0 -2,0 0,2 0,2 -2,0 -2))
+left2 POLYGON((-2 0,-2 2,0 2,0 0,-2 0))
+SELECT name, ST_AsText(square) from t1 where MBRWithin(@p, square);
+name ST_AsText(square)
+big POLYGON((0 0,0 3,3 3,3 0,0 0))
+SET @vert1 = ST_GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+SET @horiz1 = ST_GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+SET @horiz2 = ST_GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+SET @horiz3 = ST_GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+SET @point1 = ST_GeomFromText('POLYGON ((0 0))');
+SET @point2 = ST_GeomFromText('POLYGON ((-2 0))');
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @vert1) GROUP BY a1.name;
+MBRoverlaps
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @horiz1) GROUP BY a1.name;
+MBRoverlaps
+SELECT MBROverlaps(@horiz1, @vert1) FROM DUAL;
+MBROverlaps(@horiz1, @vert1)
+0
+SELECT MBROverlaps(@horiz1, @horiz2) FROM DUAL;
+MBROverlaps(@horiz1, @horiz2)
+1
+SELECT MBROverlaps(@horiz1, @horiz3) FROM DUAL;
+MBROverlaps(@horiz1, @horiz3)
+0
+SELECT MBROverlaps(@horiz1, @point1) FROM DUAL;
+MBROverlaps(@horiz1, @point1)
+0
+SELECT MBROverlaps(@horiz1, @point2) FROM DUAL;
+MBROverlaps(@horiz1, @point2)
+0
+DROP TABLE t1;
+create table t1 (i int not null, g geometry not null)engine=innodb;
+insert into t1 values (1, POINT(1,1));
+insert into t1 values (2, POINT(1.5,1.5));
+insert into t1 values (3, POINT(3,3));
+insert into t1 values (4, POINT(3.1,3.1));
+insert into t1 values (5, POINT(5,5));
+alter table t1 add primary key(i);
+alter table t1 drop primary key;
+create spatial index idx on t1(g);
+create spatial index idx2 on t1(g);
+Warnings:
+Note 1831 Duplicate index 'idx2' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release
+alter table t1 add primary key(i);
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `i` int(11) NOT NULL,
+ `g` geometry NOT NULL,
+ PRIMARY KEY (`i`),
+ SPATIAL KEY `idx` (`g`),
+ SPATIAL KEY `idx2` (`g`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+drop index idx on t1;
+drop table t1;
+create table t1 (i int, i2 char(10), g geometry not null, primary key (i, i2), spatial index (g))engine=innodb;
+insert into t1 values (1, "111", POINT(1,1));
+insert into t1 values (2, "222", POINT(1.5,1.5));
+insert into t1 values (3, "333", POINT(3,3));
+insert into t1 values (4, "444", POINT(3.1,3.1));
+insert into t1 values (5, "555", POINT(5,5));
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status OK
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+explain select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range g g 34 NULL 1 Using where
+select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+ST_astext(t1.g)
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+delete from t1 where MBRWithin(t1.g, @g1);
+check table t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+select ST_astext(t1.g) from t1;
+ST_astext(t1.g)
+POINT(1 1)
+POINT(1.5 1.5)
+POINT(3 3)
+POINT(3.1 3.1)
+POINT(5 5)
+set @g1 = ST_GeomFromText('Polygon((5 5,5 5,5 5,5 5,5 5))');
+update t1 set g = POINT(2,2) where MBRWithin(t1.g, @g1);
+check table t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+select ST_astext(t1.g) from t1;
+ST_astext(t1.g)
+POINT(1 1)
+POINT(1.5 1.5)
+POINT(3 3)
+POINT(3.1 3.1)
+POINT(2 2)
+show indexes from t1;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+t1 0 PRIMARY 1 i A # NULL NULL BTREE
+t1 0 PRIMARY 2 i2 A # NULL NULL BTREE
+t1 1 g 1 g A # 32 NULL SPATIAL
+drop table t1;
+CREATE TABLE `t1` (
+`id` int(11) NOT NULL AUTO_INCREMENT,
+`way` geometry NOT NULL,
+PRIMARY KEY (`id`),
+SPATIAL KEY `way` (`way`)
+) ENGINE=InnoDB;
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 5)');
+SELECT COUNT(*)
+FROM t1
+WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((2 2,4 2, 4 4, 2 4, 2 2))'),way);
+COUNT(*)
+9
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
+test.t1 optimize status OK
+SELECT COUNT(*)
+FROM t1
+WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((2 2,4 2, 4 4, 2 4, 2 2))'),way);
+COUNT(*)
+9
+DROP TABLE t1;
+CREATE TABLE t1( i INT, g GEOMETRY NOT NULL, SPATIAL INDEX (g)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(1, LINESTRING(POINT(1,1), POINT(4, 4)));
+INSERT INTO t1 VALUES(2, LINESTRING(POINT(2,2), POINT(5, 5)));
+UPDATE t1 SET g = LINESTRING(POINT(1,1), POINT(2,2), POINT(3,3), POINT(4,4))
+WHERE i = 1;
+UPDATE t1 SET g = LINESTRING(POINT(1,1), POINT(2,2), POINT(3,3), POINT(8,8))
+WHERE i = 2;
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+DELETE FROM t1
+WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((0 0,4 0, 4 4, 0 4, 0 0))'),g);
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_gis/t/0.test b/mysql-test/suite/innodb_gis/t/0.test
new file mode 100644
index 00000000000..b5d82f2ae69
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/0.test
@@ -0,0 +1,42 @@
+--source include/have_innodb.inc
+SET default_storage_engine=innodb;
+--source include/gis_generic.inc
+--source include/gis_keys.inc
+
+#
+# Bug #15680 (SPATIAL key in innodb)
+#
+#--error ER_TABLE_CANT_HANDLE_SPKEYS
+create table t1 (g geometry not null, spatial gk(g)) engine=innodb;
+
+DROP TABLE t1;
+
+# Test read uncommitted
+create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb;
+
+connect (a,localhost,root,,);
+connection a;
+
+start transaction;
+insert into t1 values(1, Point(1,1));
+
+
+connect (con1,localhost,root,,);
+connection con1;
+set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))');
+set transaction isolation level read uncommitted;
+select count(*) from t1 where ST_Within(t1.c2, @g1);
+disconnect con1;
+
+--source include/wait_until_disconnected.inc
+
+connection a;
+commit;
+disconnect a;
+--source include/wait_until_disconnected.inc
+
+connection default;
+drop table t1;
+
+
+
diff --git a/mysql-test/suite/innodb_gis/t/1.test b/mysql-test/suite/innodb_gis/t/1.test
new file mode 100644
index 00000000000..110a8acc18f
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/1.test
@@ -0,0 +1,1451 @@
+#*****************************************************************
+# The Orginal name of the testcase : gis.test
+# The following are the modification done
+# 1.SET default_storage_engine=InnoDB;
+# 2.MyiSam to Innodb where ever is required.
+# 3.Spatial index to Index as Innodb does not support
+#*****************************************************************
+--source include/have_innodb.inc
+-- source include/have_geometry.inc
+
+SET default_storage_engine=InnoDB;
+SET innodb_strict_mode=OFF;
+
+#
+# Spatial objects
+#
+
+CREATE TABLE gis_point (fid INTEGER NOT NULL PRIMARY KEY, g POINT);
+CREATE TABLE gis_line (fid INTEGER NOT NULL PRIMARY KEY, g LINESTRING);
+CREATE TABLE gis_polygon (fid INTEGER NOT NULL PRIMARY KEY, g POLYGON);
+CREATE TABLE gis_multi_point (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOINT);
+CREATE TABLE gis_multi_line (fid INTEGER NOT NULL PRIMARY KEY, g MULTILINESTRING);
+CREATE TABLE gis_multi_polygon (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOLYGON);
+CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRYCOLLECTION);
+CREATE TABLE gis_geometry (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY);
+
+SHOW FIELDS FROM gis_point;
+SHOW FIELDS FROM gis_line;
+SHOW FIELDS FROM gis_polygon;
+SHOW FIELDS FROM gis_multi_point;
+SHOW FIELDS FROM gis_multi_line;
+SHOW FIELDS FROM gis_multi_polygon;
+SHOW FIELDS FROM gis_geometrycollection;
+SHOW FIELDS FROM gis_geometry;
+
+
+INSERT INTO gis_point VALUES
+(101, ST_PointFromText('POINT(10 10)')),
+(102, ST_PointFromText('POINT(20 10)')),
+(103, ST_PointFromText('POINT(20 20)')),
+(104, ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(10 20)'))));
+
+INSERT INTO gis_line VALUES
+(105, ST_LineFromText('LINESTRING(0 0,0 10,10 0)')),
+(106, ST_LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+(107, ST_LineStringFromWKB(ST_AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+
+INSERT INTO gis_polygon VALUES
+(108, ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+(109, ST_PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+(110, ST_PolyFromWKB(ST_AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+
+INSERT INTO gis_multi_point VALUES
+(111, ST_MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+(112, ST_MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+(113, ST_MPointFromWKB(ST_AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+
+INSERT INTO gis_multi_line VALUES
+(114, ST_MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+(115, ST_MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+(116, ST_MLineFromWKB(ST_AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+
+
+INSERT INTO gis_multi_polygon VALUES
+(117, ST_MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(118, ST_MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(119, ST_MPolyFromWKB(ST_AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+
+INSERT INTO gis_geometrycollection VALUES
+(120, ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+(121, ST_GeometryFromWKB(ST_AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
+
+INSERT into gis_geometry SELECT * FROM gis_point;
+INSERT into gis_geometry SELECT * FROM gis_line;
+INSERT into gis_geometry SELECT * FROM gis_polygon;
+INSERT into gis_geometry SELECT * FROM gis_multi_point;
+INSERT into gis_geometry SELECT * FROM gis_multi_line;
+INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+
+SELECT fid, ST_AsText(g) FROM gis_point;
+SELECT fid, ST_AsText(g) FROM gis_line;
+SELECT fid, ST_AsText(g) FROM gis_polygon;
+SELECT fid, ST_AsText(g) FROM gis_multi_point;
+SELECT fid, ST_AsText(g) FROM gis_multi_line;
+SELECT fid, ST_AsText(g) FROM gis_multi_polygon;
+SELECT fid, ST_AsText(g) FROM gis_geometrycollection;
+SELECT fid, ST_AsText(g) FROM gis_geometry;
+
+SELECT fid, ST_Dimension(g) FROM gis_geometry;
+SELECT fid, ST_GeometryType(g) FROM gis_geometry;
+SELECT fid, ST_IsEmpty(g) FROM gis_geometry;
+SELECT fid, ST_AsText(ST_Envelope(g)) FROM gis_geometry;
+--replace_column 10 #
+explain extended select ST_Dimension(g), ST_GeometryType(g), ST_IsEmpty(g), ST_AsText(ST_Envelope(g)) from gis_geometry;
+
+SELECT fid, ST_X(g) FROM gis_point;
+SELECT fid, ST_Y(g) FROM gis_point;
+--replace_column 10 #
+explain extended select ST_X(g),ST_Y(g) FROM gis_point;
+
+SELECT fid, ST_AsText(ST_StartPoint(g)) FROM gis_line;
+SELECT fid, ST_AsText(ST_EndPoint(g)) FROM gis_line;
+SELECT fid, ST_Length(g) FROM gis_line;
+SELECT fid, ST_NumPoints(g) FROM gis_line;
+SELECT fid, ST_AsText(ST_PointN(g, 2)) FROM gis_line;
+SELECT fid, ST_IsClosed(g) FROM gis_line;
+--replace_column 10 #
+explain extended select ST_AsText(ST_StartPoint(g)),ST_AsText(ST_EndPoint(g)),ST_Length(g),ST_NumPoints(g),ST_AsText(ST_PointN(g, 2)),ST_IsClosed(g) FROM gis_line;
+
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_polygon;
+SELECT fid, ST_Area(g) FROM gis_polygon;
+SELECT fid, ST_AsText(ST_ExteriorRing(g)) FROM gis_polygon;
+SELECT fid, ST_NumInteriorRings(g) FROM gis_polygon;
+SELECT fid, ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+--replace_column 10 #
+explain extended select ST_AsText(ST_Centroid(g)),ST_Area(g),ST_AsText(ST_ExteriorRing(g)),ST_NumInteriorRings(g),ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+
+SELECT fid, ST_IsClosed(g) FROM gis_multi_line;
+
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_multi_polygon;
+SELECT fid, ST_Area(g) FROM gis_multi_polygon;
+
+SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+SELECT fid, ST_NumGeometries(g) from gis_multi_line;
+SELECT fid, ST_NumGeometries(g) from gis_multi_polygon;
+SELECT fid, ST_NumGeometries(g) from gis_geometrycollection;
+--replace_column 10 #
+explain extended SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_line;
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_polygon;
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_geometrycollection;
+SELECT fid, ST_AsText(ST_GeometryN(g, 1)) from gis_geometrycollection;
+--replace_column 10 #
+explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+
+SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+--replace_column 10 #
+explain extended SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+
+DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+
+#
+# Check that ALTER TABLE doesn't loose geometry type
+#
+CREATE TABLE t1 (
+ gp point,
+ ln linestring,
+ pg polygon,
+ mp multipoint,
+ mln multilinestring,
+ mpg multipolygon,
+ gc geometrycollection,
+ gm geometry
+);
+
+SHOW FIELDS FROM t1;
+ALTER TABLE t1 ADD fid INT NOT NULL;
+SHOW FIELDS FROM t1;
+DROP TABLE t1;
+
+SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)'))));
+SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+explain extended SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+#select ST_issimple(MultiPoint(Point(3, 6), Point(4, 10))), ST_issimple(Point(3, 6)),ST_issimple(ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),ST_issimple(ST_GeometryFromText('POINT(1 4)')), ST_issimple(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')));
+explain extended select ST_issimple(MultiPoint(Point(3, 6), Point(4, 10))), ST_issimple(Point(3, 6));
+
+create table t1 (a geometry not null);
+insert into t1 values (ST_GeomFromText('Point(1 2)'));
+-- error 1416
+insert into t1 values ('Garbage');
+-- error 1416
+insert IGNORE into t1 values ('Garbage');
+
+# Now we support spatial index
+alter table t1 add spatial index(a);
+
+drop table t1;
+
+#
+# Bug #5219: problem with range optimizer
+#
+
+create table t1(a geometry not null, index(a(5)));
+insert into t1 values
+(ST_GeomFromText('POINT(1 1)')), (ST_GeomFromText('POINT(3 3)')),
+(ST_GeomFromText('POINT(4 4)')), (ST_GeomFromText('POINT(6 6)'));
+select ST_AsText(a) from t1 where
+ MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+ or
+ MBRContains(ST_GeomFromText('Polygon((2 2, 2 5, 5 5, 5 2, 2 2))'), a);
+select ST_AsText(a) from t1 where
+ MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+ and
+ MBRContains(ST_GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a);
+drop table t1;
+
+CREATE TABLE t1 (Coordinates POINT NOT NULL, INDEX(Coordinates(10)));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(383293632 1754448)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(564952612 157516260)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(903994614 180726515)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(98128178 141127631)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(862547902 799334546)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(341989013 850270906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(803302376 93039099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(857439153 817431356)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(319757546 343162742)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(826341972 717484432)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(305066789 201736238)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(626068992 616241497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(55789424 755830108)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(802874458 312435220)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(153795660 551723671)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(242207428 537089292)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(553478119 807160039)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(694605552 457472733)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(987886554 792733729)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(598600363 850434457)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(592068275 940589376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(700705362 395370650)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(33628474 558144514)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(212802006 353386020)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(901307256 39143977)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(70870451 206374045)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(240880214 696939443)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(822615542 296669638)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(452769551 625489999)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(609104858 606565210)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(177213669 851312285)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(143654501 730691787)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(658472325 838260052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(188164520 646358878)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(630993781 786764883)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(496793334 223062055)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(727354258 197498696)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(618432704 760982731)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(755643210 831234710)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(114368751 656950466)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(870378686 185239202)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(863324511 111258900)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(882178645 685940052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(407928538 334948195)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(311430051 17033395)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941513405 488643719)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(868345680 85167906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(219335507 526818004)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(923427958 407500026)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(173176882 554421738)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(194264908 669970217)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(777483793 921619165)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(867468912 395916497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(682601897 623112122)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(227151206 796970647)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(280062588 97529892)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(982209849 143387099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(208788792 864388493)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(829327151 616717329)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(199336688 140757201)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(633750724 140850093)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(629400920 502096404)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(226017998 848736426)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(28914408 149445955)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(256236452 202091290)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(703867693 450501360)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(872061506 481351486)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(372120524 739530418)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(877267982 54722420)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(362642540 104419188)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(851693067 642705127)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(201949080 833902916)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(786092225 410737872)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(698291409 615419376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(27455201 897628096)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(756176576 661205925)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(38478189 385577496)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(163302328 264496186)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(234313922 192216735)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(413942141 490550373)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(394308025 117809834)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941051732 266369530)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(599161319 313172256)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(5899948 476429301)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(367894677 368542487)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(580848489 219587743)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(11247614 782797569)'));
+drop table t1;
+
+create table t1 select ST_GeomFromWKB(POINT(1,3));
+show create table t1;
+drop table t1;
+
+SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
+
+CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo`
+geometry NOT NULL default '') ENGINE=InnoDB ;
+
+SET sql_mode = default;
+
+insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363
+36.305435,-114.992394 36.305202,-114.991219 36.305975,-114.991163
+36.306845,-114.989432 36.309452,-114.978275 36.312642,-114.977363
+36.311978,-114.975327 36.312344,-114.96502 36.31597,-114.963364
+36.313629,-114.961723 36.313721,-114.956398 36.316057,-114.951882
+36.320979,-114.947073 36.323475,-114.945207 36.326451,-114.945207
+36.326451,-114.944132 36.326061,-114.94003 36.326588,-114.924017
+36.334484,-114.923281 36.334146,-114.92564 36.331504,-114.94072
+36.319282,-114.945348 36.314812,-114.948091 36.314762,-114.951755
+36.316211,-114.952446 36.313883,-114.952644 36.309488,-114.944725
+36.313083,-114.93706 36.32043,-114.932478 36.323497,-114.924556
+36.327708,-114.922608 36.329715,-114.92009 36.328695,-114.912105
+36.323566,-114.901647 36.317952,-114.897436 36.313968,-114.895344
+36.309573,-114.891699 36.304398,-114.890569 36.303551,-114.886356
+36.302702,-114.885141 36.301351,-114.885709 36.297391,-114.892499
+36.290893,-114.902142 36.288974,-114.904941 36.288838,-114.905308
+36.289845,-114.906325 36.290395,-114.909916 36.289549,-114.914527
+36.287535,-114.918797 36.284423,-114.922982 36.279731,-114.924113
+36.277282,-114.924057 36.275817,-114.927733 36.27053,-114.929354
+36.269029,-114.929354 36.269029,-114.950856 36.268715,-114.950768
+36.264324,-114.960206 36.264293,-114.960301 36.268943,-115.006662
+36.268929,-115.008583 36.265619,-115.00665 36.264247,-115.006659
+36.246873,-115.006659 36.246873,-115.006838 36.247697,-115.010764
+36.247774,-115.015609 36.25113,-115.015765 36.254505,-115.029517
+36.254619,-115.038573 36.249317,-115.038573 36.249317,-115.023403
+36.25841,-115.023873 36.258994,-115.031845 36.259829,-115.03183
+36.261053,-115.025561 36.261095,-115.036417 36.274632,-115.033729
+36.276041,-115.032217 36.274851,-115.029845 36.273959,-115.029934
+36.274966,-115.025763 36.274896,-115.025406 36.281044,-115.028731
+36.284471,-115.036497 36.290377,-115.042071 36.291039,-115.026759
+36.298478,-115.008995 36.301966,-115.006363 36.305435),(-115.079835
+36.244369,-115.079735 36.260186,-115.076435 36.262369,-115.069758
+36.265,-115.070235 36.268757,-115.064542 36.268655,-115.061843
+36.269857,-115.062676 36.270693,-115.06305 36.272344,-115.059051
+36.281023,-115.05918 36.283008,-115.060591 36.285246,-115.061913
+36.290022,-115.062499 36.306353,-115.062499 36.306353,-115.060918
+36.30642,-115.06112 36.289779,-115.05713 36.2825,-115.057314
+36.279446,-115.060779 36.274659,-115.061366 36.27209,-115.057858
+36.26557,-115.055805 36.262883,-115.054688 36.262874,-115.047335
+36.25037,-115.044234 36.24637,-115.052434 36.24047,-115.061734
+36.23507,-115.061934 36.22677,-115.061934 36.22677,-115.061491
+36.225267,-115.062024 36.218194,-115.060134 36.218278,-115.060133
+36.210771,-115.057833 36.210771,-115.057433 36.196271,-115.062233
+36.196271,-115.062233 36.190371,-115.062233 36.190371,-115.065533
+36.190371,-115.071333 36.188571,-115.098331 36.188275,-115.098331
+36.188275,-115.098435 36.237569,-115.097535 36.240369,-115.097535
+36.240369,-115.093235 36.240369,-115.089135 36.240469,-115.083135
+36.240569,-115.083135 36.240569,-115.079835
+36.244369)))')),('85998',ST_GeomFromText('MULTIPOLYGON(((-115.333107
+36.264587,-115.333168 36.280638,-115.333168 36.280638,-115.32226
+36.280643,-115.322538 36.274311,-115.327222 36.274258,-115.32733
+36.263026,-115.330675 36.262984,-115.332132 36.264673,-115.333107
+36.264587),(-115.247239 36.247066,-115.247438 36.218267,-115.247438
+36.218267,-115.278525 36.219263,-115.278525 36.219263,-115.301545
+36.219559,-115.332748 36.219197,-115.332757 36.220041,-115.332757
+36.220041,-115.332895 36.233514,-115.349023 36.233479,-115.351489
+36.234475,-115.353681 36.237021,-115.357106 36.239789,-115.36519
+36.243331,-115.368156 36.243487,-115.367389 36.244902,-115.364553
+36.246014,-115.359219 36.24616,-115.356186 36.248025,-115.353347
+36.248004,-115.350813 36.249507,-115.339673 36.25387,-115.333069
+36.255018,-115.333069 36.255018,-115.333042 36.247767,-115.279039
+36.248666,-115.263639 36.247466,-115.263839 36.252766,-115.261439
+36.252666,-115.261439 36.247366,-115.247239 36.247066)))'));
+
+# Expected result is 115.31877315203187, but IA64 returns 115.31877315203188
+# due to fused multiply-add instructions.
+--replace_result 115.31877315203188 115.31877315203187
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85998;
+
+# Expected result is 36.3310176346905, but IA64 returns 36.3310176346904
+# due to fused multiply-add instructions.
+--replace_result 36.3310176346904 36.3310176346905 -114.87787186923326 -114.87787186923313 36.33101763469053 36.33101763469059 36.33101763469043 36.33101763469059
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85984;
+
+drop table t1;
+
+create table t1 (fl geometry not null);
+--error 1416
+insert into t1 values (1);
+--error 1416
+insert into t1 values (1.11);
+--error 1416
+insert into t1 values ("qwerty");
+# --error ER_GIS_INVALID_DATA
+--error ER_BAD_NULL_ERROR
+insert into t1 values (ST_pointfromtext('point(1,1)'));
+
+drop table t1;
+
+select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000))));
+select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440))));
+
+--enable_metadata
+create table t1 (g GEOMETRY);
+select * from t1;
+select ST_asbinary(g) from t1;
+--disable_metadata
+drop table t1;
+
+create table t1 (a TEXT, b GEOMETRY NOT NULL, INDEX(b(5)));
+alter table t1 disable keys;
+--error 1263
+load data infile '../../std_data/bad_gis_data.dat' into table t1;
+alter table t1 enable keys;
+drop table t1;
+
+#
+# Bug #26038: is null and bad data
+#
+
+create table t1 (a int, b blob);
+insert into t1 values (1, ''), (2, NULL), (3, '1');
+select * from t1;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+select
+ ST_geometryfromtext(b) IS NULL, ST_geometryfromwkb(b) IS NULL, ST_astext(b) IS NULL,
+ ST_aswkb(b) IS NULL, ST_geometrytype(b) IS NULL, ST_centroid(b) IS NULL,
+ ST_envelope(b) IS NULL, ST_startpoint(b) IS NULL, ST_endpoint(b) IS NULL,
+ ST_exteriorring(b) IS NULL, ST_pointn(b, 1) IS NULL, ST_geometryn(b, 1) IS NULL,
+ ST_interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, ST_isempty(b) IS NULL,
+ ST_issimple(b) IS NULL, ST_isclosed(b) IS NULL, ST_dimension(b) IS NULL,
+ ST_numgeometries(b) IS NULL, ST_numinteriorrings(b) IS NULL, ST_numpoints(b) IS NULL,
+ ST_area(b) IS NULL, ST_length(b) IS NULL, ST_srid(b) IS NULL, ST_x(b) IS NULL,
+ ST_y(b) IS NULL
+from t1;
+
+# --error ER_GIS_INVALID_DATA
+select
+ MBRwithin(b, b) IS NULL, MBRcontains(b, b) IS NULL, MBRoverlaps(b, b) IS NULL,
+ MBRequals(b, b) IS NULL, MBRdisjoint(b, b) IS NULL, ST_touches(b, b) IS NULL,
+ MBRintersects(b, b) IS NULL, ST_crosses(b, b) IS NULL
+from t1;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+select
+ point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
+ multilinestring(b) IS NULL, multipolygon(b) IS NULL,
+ geometrycollection(b) IS NULL
+from t1;
+
+drop table t1;
+
+#
+# Bug #27164: Crash when mixing InnoDB and InnoDB Geospatial tables
+#
+CREATE TABLE t1(a POINT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (NULL);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+#
+# Bug #30955 ST_geomfromtext() crasher
+#
+CREATE TABLE `t1` ( `col9` set('a'), `col89` date);
+INSERT IGNORE INTO `t1` VALUES ('','0000-00-00');
+# --error ER_GIS_INVALID_DATA
+select ST_geomfromtext(col9,col89) as a from t1;
+DROP TABLE t1;
+
+#
+# Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data)
+#
+
+CREATE TABLE t1 (
+ geomdata polygon NOT NULL,
+ KEY index_geom (geomdata(10))
+) ENGINE=InnoDB DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+
+CREATE TABLE t2 (
+ geomdata polygon NOT NULL,
+ KEY index_geom (geomdata(10))
+) ENGINE=InnoDB DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+
+CREATE TABLE t3
+select
+ ST_aswkb(ws.geomdata) AS geomdatawkb
+ from
+ t1 ws
+union
+ select
+ ST_aswkb(ws.geomdata) AS geomdatawkb
+ from
+ t2 ws;
+
+describe t3;
+
+drop table t1;
+drop table t2;
+drop table t3;
+
+#
+# Bug #30284 spatial key corruption
+#
+
+create table t1(col1 geometry default null,col15 geometrycollection not
+null, index(col15(5)),index(col1(15)))engine=InnoDB;
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+check table t1 extended;
+drop table t1;
+
+--echo End of 4.1 tests
+
+#
+# Bug #12281 (Geometry: crash in trigger)
+#
+
+create table t1 (s1 geometry not null,s2 char(100));
+create trigger t1_bu before update on t1 for each row set new.s1 = null;
+--error 1048
+insert into t1 values (null,null);
+drop table t1;
+
+#
+# Bug #10499 (function creation with GEOMETRY datatype)
+#
+--disable_warnings
+drop procedure if exists fn3;
+--enable_warnings
+create function fn3 () returns point deterministic return ST_GeomFromText("point(1 1)");
+show create function fn3;
+select ST_astext(fn3());
+drop function fn3;
+
+#
+# Bug #12267 (primary key over GIS)
+#
+create table t1(pt POINT);
+alter table t1 add primary key pti(pt);
+drop table t1;
+create table t1(pt GEOMETRY);
+--error 1170
+alter table t1 add primary key pti(pt);
+alter table t1 add primary key pti(pt(20));
+drop table t1;
+
+
+create table t1 select ST_GeomFromText('point(1 1)');
+desc t1;
+drop table t1;
+
+#
+# Bug #20691 (DEFAULT over NOT NULL field)
+#
+create table t1 (g geometry not null);
+--error ER_CANT_CREATE_GEOMETRY_OBJECT
+insert into t1 values(default);
+drop table t1;
+
+#
+# Bug #27300: create view with geometry functions lost columns types
+#
+CREATE TABLE t1 (a GEOMETRY);
+CREATE VIEW v1 AS SELECT ST_GeomFromwkb(ST_ASBINARY(a)) FROM t1;
+CREATE VIEW v2 AS SELECT a FROM t1;
+DESCRIBE v1;
+DESCRIBE v2;
+
+DROP VIEW v1,v2;
+DROP TABLE t1;
+
+#
+# Bug#24563: MBROverlaps does not seem to function propertly
+# Bug#54888: MBROverlaps missing in 5.1?
+#
+
+# Test all MBR* functions and their non-MBR-prefixed aliases,
+# using shifted squares to verify the spatial relations.
+
+create table t1 (name VARCHAR(100), square GEOMETRY);
+
+INSERT INTO t1 VALUES("center", ST_GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
+
+INSERT INTO t1 VALUES("small", ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+
+INSERT INTO t1 VALUES("up", ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", ST_GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+
+INSERT INTO t1 VALUES("down", ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", ST_GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+
+INSERT INTO t1 VALUES("right", ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", ST_GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+
+INSERT INTO t1 VALUES("left", ST_GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", ST_GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrtouches FROM t1 a1 JOIN t1 a2 ON MBRTouches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRoverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS ST_touches FROM t1 a1 JOIN t1 a2 ON ST_Touches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+
+# MBROverlaps needs a few more tests, with point and line dimensions
+
+# --error ER_GIS_INVALID_DATA
+SET @vert1 = ST_GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz1 = ST_GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz2 = ST_GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz3 = ST_GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+# --error ER_GIS_INVALID_DATA
+SET @point1 = ST_GeomFromText('POLYGON ((0 0))');
+# --error ER_GIS_INVALID_DATA
+SET @point2 = ST_GeomFromText('POLYGON ((-2 0))');
+
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @vert1) GROUP BY a1.name;
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @horiz1) GROUP BY a1.name;
+SELECT MBROverlaps(@horiz1, @vert1) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @horiz2) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @horiz3) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @point1) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @point2) FROM DUAL;
+
+DROP TABLE t1;
+
+#
+# Bug#28763: Selecting geometry fields in UNION caused server crash.
+#
+create table t1(f1 geometry, f2 polygon, f3 linestring);
+select f1 from t1 union select f1 from t1;
+insert into t1 (f2,f3) values (ST_GeomFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))'), ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'));
+select ST_AsText(f2),ST_AsText(f3) from t1;
+select ST_AsText(a) from (select f2 as a from t1 union select f3 from t1) t;
+create table t2 as select f2 as a from t1 union select f3 from t1;
+desc t2;
+select ST_AsText(a) from t2;
+drop table t1, t2;
+
+#
+# Bug #29166: MYsql crash when query is run
+#
+
+# The test query itself is not logged : too large output.
+# The real test is the second query : see if the first hasn't crashed the
+# server
+--disable_query_log
+--disable_result_log
+SELECT ST_AsText(ST_GeometryFromText(CONCAT(
+ 'MULTIPOLYGON(((',
+ REPEAT ('-0.00000000001234567890123456789012 -0.123456789012345678,', 1000),
+ '-0.00000000001234567890123456789012 -0.123456789012345678',
+ ')))'
+))) AS a;
+--enable_result_log
+--enable_query_log
+SELECT 1;
+
+-- source include/gis_keys.inc
+
+#
+# Bug #31155 gis types in union'd select cause crash
+#
+
+create table `t1` (`col002` point)engine=InnoDB;
+insert into t1 values (),(),();
+# --error ER_WRONG_ARGUMENTS
+select min(`col002`) from t1 union select `col002` from t1;
+drop table t1;
+
+--echo #
+--echo # Bug #47780: crash when comparing GIS items from subquery
+--echo #
+
+CREATE TABLE t1(a INT, b MULTIPOLYGON);
+INSERT INTO t1 VALUES
+ (0,
+ ST_GEOMFROMTEXT(
+ 'multipolygon(((1 2,3 4,5 6,7 8,9 8,1 2,1 2),(7 6,5 4,3 2,1 2,3 4,7 6)))'));
+
+--echo # must not crash
+SELECT 1 FROM t1 WHERE a <> (SELECT ST_GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
+
+DROP TABLE t1;
+
+--echo #
+--echo # Bug #49250 : spatial btree index corruption and crash
+--echo # Part one : spatial syntax check
+--echo #
+
+--error ER_PARSE_ERROR
+CREATE TABLE t1(col1 MULTIPOLYGON NOT NULL,
+ SPATIAL INDEX USING BTREE (col1));
+CREATE TABLE t2(col1 MULTIPOLYGON NOT NULL);
+--error ER_PARSE_ERROR
+CREATE SPATIAL INDEX USING BTREE ON t2(col);
+--error ER_PARSE_ERROR
+ALTER TABLE t2 ADD SPATIAL INDEX USING BTREE (col1);
+
+DROP TABLE t2;
+
+--echo End of 5.0 tests
+
+
+#
+# Bug #11335 View redefines column types
+#
+create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
+create view v1 as select * from t1;
+desc v1;
+drop view v1;
+drop table t1;
+
+#
+# Bug#44684: valgrind reports invalid reads in
+# Item_func_spatial_collection::val_str
+#
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+SELECT MultiPoint(12345,'');
+#SELECT MultiPoint(123451,'');
+#SELECT MultiPoint(1234512,'');
+#SELECT MultiPoint(12345123,'');
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+#SELECT MultiLineString(12345,'');
+#SELECT MultiLineString(123451,'');
+#SELECT MultiLineString(1234512,'');
+#SELECT MultiLineString(12345123,'');
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+#SELECT LineString(12345,'');
+#SELECT LineString(123451,'');
+#SELECT LineString(1234512,'');
+#SELECT LineString(12345123,'');
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+#SELECT Polygon(12345,'');
+#SELECT Polygon(123451,'');
+#SELECT Polygon(1234512,'');
+#SELECT Polygon(12345123,'');
+
+#
+# Bug55531 crash with conversions of geometry types / strings
+#
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+SELECT 1 FROM (SELECT GREATEST(1,GEOMETRYCOLLECTION('00000','00000')) b FROM DUAL) AS d WHERE (LINESTRING(d.b));
+
+
+--echo #
+--echo # BUG#51875: crash when loading data into geometry function ST_polyfromwkb
+--echo #
+SET @a=0x00000000030000000100000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+# --error ER_GIS_INVALID_DATA
+SET @a=ST_POLYFROMWKB(@a);
+SET @a=0x00000000030000000000000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+# --error ER_GIS_INVALID_DATA
+SET @a=ST_POLYFROMWKB(@a);
+
+
+#
+# Bug #57321 crashes and valgrind errors from spatial types
+#
+
+create table t1(a polygon NOT NULL)engine=InnoDB;
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+insert into t1 values (ST_geomfromtext("point(0 1)"));
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+insert into t1 values (ST_geomfromtext("point(1 0)"));
+select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
+drop table t1;
+
+
+--echo #
+--echo # Test for bug #59888 "debug assertion when attempt to create spatial index
+--echo # on char > 31 bytes".
+--echo #
+create table t1(a char(32) not null) engine=InnoDB;
+#--error ER_SPATIAL_MUST_HAVE_GEOM_COL
+create index i on t1 (a(5));
+drop table t1;
+
+
+--echo End of 5.1 tests
+
+#
+# Bug #50574 5.5.ST_x allows spatial indexes on non-spatial
+# columns, causing crashes!
+# Bug#11767480 SPATIAL INDEXES ON NON-SPATIAL COLUMNS
+# CAUSE CRASHES.
+#
+CREATE TABLE t0 (a BINARY(32) NOT NULL);
+#--error ER_SPATIAL_MUST_HAVE_GEOM_COL
+CREATE UNIQUE INDEX i on t0 (a(10));
+INSERT INTO t0 VALUES (1);
+
+#--error ER_SPATIAL_MUST_HAVE_GEOM_COL
+CREATE TABLE t1(
+ col0 BINARY NOT NULL,
+ col2 TIMESTAMP,
+ INDEX i1 (col0)
+) ENGINE=InnoDB;
+
+# Test other ways to add indices
+CREATE TABLE t2 (
+ col0 BINARY NOT NULL,
+ col2 TIMESTAMP
+) ENGINE=InnoDB;
+
+#--error ER_SPATIAL_MUST_HAVE_GEOM_COL
+CREATE INDEX idx0 ON t1(col0);
+
+#--error ER_SPATIAL_MUST_HAVE_GEOM_COL
+#ALTER TABLE t1 ADD INDEX i1 (col0);
+
+CREATE TABLE t3 (
+ col0 INTEGER NOT NULL,
+ col1 POINT,
+ col2 POINT
+);
+
+# --error ER_TOO_MANY_KEY_PARTS
+--error ER_WRONG_ARGUMENTS
+CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
+
+
+CREATE TABLE t4 (
+ col0 INTEGER NOT NULL,
+ col1 POINT,
+ col2 LINESTRING,
+ INDEX i1 (col1(5), col2(5))
+);
+
+# cleanup
+DROP TABLE IF EXISTS t0, t1, t2, t3,t4;
+
+
+--echo #
+--echo # BUG#12414917 - ST_ISCLOSED() CRASHES ON 64-BIT BUILDS
+--echo #
+# --error ER_GIS_DATA_WRONG_ENDIANESS
+SELECT ST_ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)));
+
+--echo #
+--echo # BUG#12537203 - CRASH WHEN SUBSELECTING GLOBAL VARIABLES IN
+--echo # GEOMETRY FUNCTION ARGUMENTS
+--echo #
+--replace_regex /non geometric .* value/non geometric '' value/
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+SELECT GEOMETRYCOLLECTION((SELECT @@OLD));
+
+
+--echo End of 5.1 tests
+
+
+--echo #
+--echo # Bug#11908153: CRASH AND/OR VALGRIND ERRORS IN FIELD_BLOB::GET_KEY_IMAGE
+--echo #
+
+CREATE TABLE g1
+(a geometry NOT NULL, UNIQUE KEY i (a(151))) engine=InnoDB;
+
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 1)'));
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 2)'));
+
+FLUSH TABLES;
+
+SELECT 1 FROM g1
+FORCE INDEX(i) WHERE a = date_sub(now(), interval 2808.4 year_month)
+;
+
+DROP TABLE g1;
+
+--echo #
+--echo # Bug#13013970 MORE CRASHES IN FIELD_BLOB::GET_KEY_IMAGE
+--echo #
+
+CREATE TABLE g1(a TEXT NOT NULL, KEY(a(255)));
+
+INSERT INTO g1 VALUES ('a'),('a');
+# --error ER_GIS_INVALID_DATA
+SELECT 1 FROM g1 WHERE a >= ANY
+(SELECT 1 FROM g1 WHERE a = ST_geomfromtext('') OR a) ;
+
+DROP TABLE g1;
+
+--echo End of 5.5 tests
+
+
+# Conformance tests
+#
+# C.3.3 Geometry types and functions
+#
+
+--disable_warnings
+DROP DATABASE IF EXISTS gis_ogs;
+--enable_warnings
+
+CREATE DATABASE gis_ogs;
+USE gis_ogs;
+
+--echo #
+--echo # C.3.3.1 Geometry types and functions schema construction
+--echo #
+
+# TODO: WL#2377
+#CREATE TABLE spatial_ref_sys (
+#ST_srid INTEGER NOT NULL PRIMARY KEY,
+#auth_name CHARACTER VARYING,
+#auth_srid INTEGER,
+#srtext CHARACTER VARYING(2048));
+
+CREATE TABLE lakes (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ shore POLYGON);
+
+CREATE TABLE road_segments (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ aliases CHARACTER VARYING(64),
+ num_lanes INTEGER,
+ centerline LINESTRING);
+
+CREATE TABLE divided_routes (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ num_lanes INTEGER,
+ centerlines MULTILINESTRING);
+
+CREATE TABLE forests (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ boundary MULTIPOLYGON);
+
+CREATE TABLE bridges (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ position POINT);
+
+CREATE TABLE streams (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ centerline LINESTRING);
+
+CREATE TABLE buildings (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ address CHARACTER VARYING(64),
+ position POINT,
+ footprint POLYGON);
+
+CREATE TABLE ponds (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ type CHARACTER VARYING(64),
+ shores MULTIPOLYGON);
+
+CREATE TABLE named_places (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ boundary POLYGON);
+
+CREATE TABLE map_neatlines (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ neatline POLYGON);
+
+--echo #
+--echo # C.3.3.2 Geometry types and functions schema data loading
+--echo #
+
+# TODO: WL#2377
+#-- Spatial Reference System
+#INSERT INTO spatial_ref_sys VALUES
+#(101, 'POSC', 32214, 'PROJCS["UTM_ZONE_14N",
+#GEOGCS["World Geodetic System 72",
+#DATUM["WGS_72",
+#ELLIPSOID["NWL_10D", 6378135, 298.26]],
+#PRIMEM["Greenwich", 0],
+#UNIT["Meter", 1.0]],
+#PROJECTION["Transverse_Mercator"],
+#PARAMETER["False_Easting", 500000.0],
+#PARAMETER["False_Northing", 0.0],
+#PARAMETER["Central_Meridian", -99.0],
+#PARAMETER["Scale_Factor", 0.9996],
+#PARAMETER["Latitude_of_origin", 0.0],
+#UNIT["Meter", 1.0]]');
+
+--echo # Lakes
+INSERT INTO lakes VALUES (
+101, 'BLUE LAKE',
+ST_PolyFromText(
+'POLYGON(
+(52 18,66 23,73 9,48 6,52 18),
+(59 18,67 18,67 13,59 13,59 18)
+)',
+101));
+
+
+--echo # Road Segments
+
+INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+
+INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+ST_LineFromText(
+'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+
+INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 70 38, 72 48 )' ,101));
+
+INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+ST_LineFromText(
+'LINESTRING( 70 38, 84 42 )' ,101));
+
+INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+1,
+ST_LineFromText(
+'LINESTRING( 28 26, 28 0 )',101));
+
+--echo # DividedRoutes
+
+INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+ST_MLineFromText(
+'MULTILINESTRING((10 48,10 21,10 0),
+(16 0,16 23,16 48))', 101));
+
+--echo # Forests
+
+INSERT INTO forests VALUES(109, 'Green Forest',
+ST_MPolyFromText(
+'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+101));
+
+--echo # Bridges
+
+INSERT INTO bridges VALUES(110, 'Cam Bridge', ST_PointFromText(
+'POINT( 44 31 )', 101));
+
+--echo # Streams
+
+INSERT INTO streams VALUES(111, 'Cam Stream',
+ST_LineFromText(
+'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+
+INSERT INTO streams VALUES(112, NULL,
+ST_LineFromText(
+'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+
+--echo # Buildings
+
+INSERT INTO buildings VALUES(113, '123 Main Street',
+ST_PointFromText(
+'POINT( 52 30 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+
+INSERT INTO buildings VALUES(114, '215 Main Street',
+ST_PointFromText(
+'POINT( 64 33 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+
+
+--echo # Ponds
+
+INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+ST_MPolyFromText(
+'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+
+--echo # Named Places
+
+INSERT INTO named_places VALUES(117, 'Ashton',
+ST_PolyFromText(
+'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+
+INSERT INTO named_places VALUES(118, 'Goose Island',
+ST_PolyFromText(
+'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+
+--echo # Map Neatlines
+
+INSERT INTO map_neatlines VALUES(115,
+ST_PolyFromText(
+'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+
+--echo #
+--echo # C.3.3.3 Geometry types and functions schema test queries
+--echo
+
+# TODO: WL#2377
+#--echo # Conformance Item T1
+#SELECT f_table_name
+#FROM geometry_columns;
+#
+#--echo # Conformance Item T2
+#SELECT f_geometry_column
+#FROM geometry_columns
+#WHERE f_table_name = 'streams';
+#
+#--echo # Conformance Item T3
+#SELECT coord_dimension
+#FROM geometry_columns
+#WHERE f_table_name = 'streams';
+#
+#--echo # Conformance Item T4
+#
+#SELECT ST_srid
+#FROM geometry_columns
+#WHERE f_table_name = 'streams';
+#
+#--echo # Conformance Item T5
+#
+#SELECT srtext
+#FROM SPATIAL_REF_SYS
+#WHERE ST_SRID = 101;
+#
+
+
+--echo # Conformance Item T6
+# TODO: ST_Dimension() alias
+SELECT ST_Dimension(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T7
+# TODO: ST_GeometryType() alias
+SELECT ST_GeometryType(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T8
+# TODO: ST_AsText() alias
+SELECT ST_AsText(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T9
+# TODO: ST_AsBinary(), ST_PolyFromWKB() aliases
+SELECT ST_AsText(ST_PolyFromWKB(ST_AsBinary(boundary),101))
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T10
+# TODO: ST_SRID() alias
+SELECT ST_SRID(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T11
+# TODO: ST_IsEmpty() alias
+SELECT ST_IsEmpty(centerline)
+FROM road_segments
+WHERE name = 'Route 5'
+AND aliases = 'Main Street';
+
+# FIXME: get wrong result:0, expected 1.
+#--echo # Conformance Item T12
+# TODO: ST_IsSimple() alias
+#SELECT ST_IsSimple(shore)
+#FROM lakes
+#WHERE name = 'Blue Lake';
+
+# TODO: WL#2377
+#--echo # Conformance Item T13
+#SELECT ST_AsText(Boundary((boundary),101)
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+--echo # Conformance Item T14
+# TODO: ST_Envelope( ) alias
+# FIXME: we get anticlockwise, GIS suggests clockwise
+SELECT ST_AsText(ST_Envelope(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T15
+# TODO: ST_X() alias
+SELECT ST_X(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+
+--echo # Conformance Item T16
+# TODO: ST_Y() alias
+SELECT ST_Y(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+
+--echo # Conformance Item T17
+# TODO: ST_StartPoint() alias
+SELECT ST_AsText(ST_StartPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+
+--echo # Conformance Item T18
+# TODO: ST_EndPoint
+SELECT ST_AsText(ST_EndPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+
+# TODO: WL#2377
+#--echo # Conformance Item T19
+# TODO: ST_LineFromWKB() alias
+#SELECT ST_IsClosed(LineFromWKB(ST_AsBinary(Boundary(boundary)),ST_SRID(boundary)))
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+# TODO: WL#2377
+#--echo # Conformance Item T20
+#SELECT IsRing(LineFromWKB(ST_AsBinary(Boundary(boundary)),ST_SRID(boundary)))
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+--echo # Conformance Item T21
+# TODO: ST_Length() alias
+SELECT ST_Length(centerline)
+FROM road_segments
+WHERE fid = 106;
+
+--echo # Conformance Item T22
+# TODO: ST_NumPoints() alias
+SELECT ST_NumPoints(centerline)
+FROM road_segments
+WHERE fid = 102;
+
+--echo # Conformance Item T23
+# TODO: ST_PointN() alias
+SELECT ST_AsText(ST_PointN(centerline, 1))
+FROM road_segments
+WHERE fid = 102;
+
+--echo # Conformance Item T24
+# TODO: ST_Centroid() alias
+SELECT ST_AsText(ST_Centroid(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+
+# TODO: WL#2377
+#--echo # Conformance Item T25
+#SELECT MBRContains(boundary, PointOnSurface(boundary))
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+--echo # Conformance Item T26
+# TODO: ST_Area() alias
+SELECT ST_Area(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T27
+# TODO: ST_ExteriorRing() alias
+SELECT ST_AsText(ST_ExteriorRing(shore))
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T28
+# TODO: ST_NumInteriorRings() alias
+SELECT ST_NumInteriorRings(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T29
+# TODO: ST_InteriorRingN() alias
+SELECT ST_AsText(ST_InteriorRingN(shore, 1))
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T30
+# TODO: ST_NumGeometries() alias
+SELECT ST_NumGeometries(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T31
+# TODO: ST_GeometryN() alias
+SELECT ST_AsText(ST_GeometryN(centerlines, 2))
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T32
+# TODO: ST_IsClosed() alias
+SELECT ST_IsClosed(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T33
+# TODO: ST_Length() alias
+SELECT ST_Length(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T34
+# TODO: ST_Centroid() alias
+SELECT ST_AsText(ST_Centroid(shores))
+FROM ponds
+WHERE fid = 120;
+
+# TODO: WL#2377
+#--echo # Conformance Item T35
+#SELECT MBRContains(shores, PointOnSurface(shores))
+#FROM ponds
+#WHERE fid = 120;
+
+--echo # Conformance Item T36
+# TODO: ST_Area() alias
+SELECT ST_Area(shores)
+FROM ponds
+WHERE fid = 120;
+
+--echo # Conformance Item T37
+# TODO: ST_PolyFromText() alias
+# --error ER_GIS_DIFFERENT_SRIDS
+SELECT ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T37
+--echo # Geometry arguments' SRIDs must be identical.
+SELECT ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',101))
+FROM named_places
+WHERE name = 'Goose Island';
+
+
+--echo # Conformance Item T38
+SELECT ST_Disjoint(centerlines, boundary)
+FROM divided_routes, named_places
+WHERE divided_routes.name = 'Route 75'
+AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T39
+SELECT ST_Touches(centerline, shore)
+FROM streams, lakes
+WHERE streams.name = 'Cam Stream'
+AND lakes.name = 'Blue Lake';
+
+# FIXME: wrong result: get 0, expected 1
+#--echo # Conformance Item T40
+#SELECT ST_Within(boundary, footprint)
+#FROM named_places, buildings
+#WHERE named_places.name = 'Ashton'
+#AND buildings.address = '215 Main Street';
+
+# FIXME: wrong result: get 0, expected 1
+#--echo # Conformance Item T41
+#SELECT ST_Overlaps(forests.boundary, named_places.boundary)
+#FROM forests, named_places
+#WHERE forests.name = 'Green Forest'
+#AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T42
+# FIXME: TODO: ST_Crosses() alias
+SELECT ST_Crosses(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+
+--echo # Conformance Item T43
+SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+
+--echo # Conformance Item T44
+SELECT ST_Contains(forests.boundary, named_places.boundary)
+FROM forests, named_places
+WHERE forests.name = 'Green Forest'
+AND named_places.name = 'Ashton';
+
+# TODO: WL#2377
+#--echo # Conformance Item T45
+#SELECT Relate(forests.boundary, named_places.boundary, 'TTTTTTTTT')
+#FROM forests, named_places
+#WHERE forests.name = 'Green Forest'
+#AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T46
+SELECT ST_Distance(position, boundary)
+FROM bridges, named_places
+WHERE bridges.name = 'Cam Bridge'
+AND named_places.name = 'Ashton';
+
+# FIXME: wrong result: NULL, expected 12
+#--echo # Conformance Item T47
+#SELECT ST_AsText(ST_Intersection(centerline, shore))
+#FROM streams, lakes
+#WHERE streams.name = 'Cam Stream'
+#AND lakes.name = 'Blue Lake';
+
+--echo # Conformance Item T48
+SELECT ST_AsText(ST_Difference(named_places.boundary, forests.boundary))
+FROM named_places, forests
+WHERE named_places.name = 'Ashton'
+AND forests.name = 'Green Forest';
+
+#--echo # Conformance Item T49
+SELECT ST_AsText(ST_Union(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Goose Island';
+
+--echo # Conformance Item T50
+SELECT ST_AsText(ST_SymDifference(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T51
+SELECT count(*)
+FROM buildings, bridges
+WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+
+# TODO: WL#2377
+#--echo # Conformance Item T52
+#SELECT ST_AsText(ConvexHull(shore))
+#FROM lakes
+#WHERE lakes.name = 'Blue Lake';
+
+DROP DATABASE gis_ogs;
+
+--echo #
+--echo # Bug#13362660 ASSERTION `FIELD_POS < FIELD_COUNT' FAILED. IN PROTOCOL_TEXT::STORE
+--echo #
+
+# --error ER_GIS_INVALID_DATA
+SELECT ST_Union('', ''), md5(1);
diff --git a/mysql-test/suite/innodb_gis/t/alter_spatial_index.test b/mysql-test/suite/innodb_gis/t/alter_spatial_index.test
new file mode 100644
index 00000000000..efd6cb6c867
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/alter_spatial_index.test
@@ -0,0 +1,753 @@
+# ******************************************************************
+# Test Alter table add spatial idex asc/desc comments
+# Test error Alter table modify column with No not null option
+# Test error Alter table modify column with null option
+# Test table column having both indexes spatial and Btree
+# Test error Alter table spatial index using hash/Btree
+# Test modify column from point to multipoint,line to multiline
+# Test modify column from mutipoint to point,multiline to line
+# Test discard & import tablepsace
+# spatial index on temp tables
+# Unique constraint on spatial index column Geometry
+# Unique constraint on spatial index column POINT
+# Modify Engine Innodb to Myisam to InnoDB
+# Check Foreign Key constraint on Point column
+# Check Foreign Key constraint on Geometry column
+# ******************************************************************
+
+CALL mtr.add_suppression("but MySQL is asking statistics for 2 columns. Have you mixed");
+
+--source include/have_innodb.inc
+--source include/have_geometry.inc
+
+let MYSQLD_DATADIR= `select @@datadir`;
+
+CREATE TABLE tab(c1 int NOT NULL PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB;
+
+CREATE TABLE tab1(c1 int NOT NULL PRIMARY KEY,c2 MULTIPOINT NOT NULL,
+c3 MULTILINESTRING NOT NULL,c4 MULTIPOLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB;
+
+INSERT INTO tab1 SELECT * FROM tab;
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+
+
+ALTER TABLE tab ADD SPATIAL INDEX idx2(c2 ASC);
+
+ALTER TABLE tab ADD SPATIAL KEY idx3(c3 DESC);
+
+ALTER TABLE tab ADD SPATIAL INDEX idx4(c4 ASC) COMMENT 'testing spatial index on Polygon';
+
+ALTER TABLE tab ADD SPATIAL KEY idx5(c5 ASC) COMMENT 'testing spatial index on Geometry';
+
+ALTER TABLE tab ADD INDEX idx6(c4(10)) USING BTREE;
+
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+
+
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1);
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(100 100)')
+WHERE MBRContains(tab.c4, @g1);
+
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+# Test the MBRWithin
+SET @g1 = ST_GeomFromText( 'POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))');
+
+SELECT c1,ST_AsText(c2),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(200 200)')
+WHERE MBRWithin(tab.c4, @g1);
+
+SELECT c1,ST_AsText(c2),ST_AsText(c4) FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab MODIFY COLUMN c2 MULTIPOINT;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab MODIFY COLUMN c3 MULTILINESTRING;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab MODIFY COLUMN c4 MULTIPOLYGON;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab MODIFY COLUMN c3 MULTILINESTRING NULL;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab MODIFY COLUMN c4 MULTIPOLYGON NULL;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab MODIFY COLUMN c4 Geometry NULL;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab CHANGE COLUMN c2 c22 POINT;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab CHANGE COLUMN c3 c33 LINESTRING;
+
+--error ER_SPATIAL_CANT_HAVE_NULL
+ALTER TABLE tab CHANGE COLUMN c4 c44 POLYGON;
+
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+ALTER TABLE tab add SPATIAL INDEX idx1(c1);
+
+--error ER_PARSE_ERROR
+ALTER TABLE tab ADD SPATIAL INDEX idx6(c2 ASC) USING BTREE;
+
+--error ER_PARSE_ERROR
+ALTER TABLE tab ADD SPATIAL INDEX idx6(c2 ASC) USING HASH;
+
+# --error ER_INVALID_USE_OF_NULL
+# ALTER TABLE tab CHANGE c2 c2 MULTIPOINT NOT NULL FIRST, ALGORITHM=COPY;
+
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# ALTER TABLE tab MODIFY COLUMN c3 MULTILINESTRING NOT NULL,ALGORITHM=COPY;
+
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# ALTER TABLE tab MODIFY COLUMN c4 MULTIPOLYGON NOT NULL;
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((20 20,30 30,40 40,50 50,40 50,30 40,30 30,20 20))');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(1000 1000)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+ALTER TABLE tab CHANGE COLUMN c2 c22 POINT NOT NULL;
+
+ALTER TABLE tab CHANGE COLUMN c3 c33 LINESTRING NOT NULL;
+
+ALTER TABLE tab CHANGE COLUMN c4 c44 POLYGON NOT NULL;
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+ALTER TABLE tab CHANGE COLUMN c22 c2 POINT NOT NULL;
+
+ALTER TABLE tab CHANGE COLUMN c33 c3 LINESTRING NOT NULL;
+
+ALTER TABLE tab CHANGE COLUMN c44 c4 POLYGON NOT NULL;
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+ALTER TABLE tab DISABLE KEYS;
+
+SHOW WARNINGS;
+
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1);
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE MBREquals(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1);
+
+DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1);
+
+ALTER TABLE tab DROP PRIMARY KEY;
+
+ALTER TABLE tab ADD PRIMARY KEY(c2) ;
+
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(3000 3000)')
+WHERE ST_Touches(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+FLUSH TABLE tab FOR EXPORT;
+
+--copy_file $MYSQLD_DATADIR/test/tab.ibd $MYSQLD_DATADIR/test/tab.ibd.bk
+
+UNLOCK TABLES;
+
+ALTER TABLE tab DISCARD TABLESPACE;
+
+--disable_warnings
+
+--error ER_TABLESPACE_DISCARDED
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab;
+
+--copy_file $MYSQLD_DATADIR/test/tab.ibd.bk $MYSQLD_DATADIR/test/tab.ibd
+
+--remove_file $MYSQLD_DATADIR/test/tab.ibd.bk
+
+--disable_query_log
+
+ALTER TABLE tab IMPORT TABLESPACE;
+
+--enable_query_log
+
+CHECK TABLE tab;
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab ORDER BY c1;
+
+SET @g1 = ST_GeomFromText('LINESTRING( 3010 3010,4010 4010,5010 5010)');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) order by c1;
+
+--error ER_DUP_ENTRY
+UPDATE tab SET c2 = ST_GeomFromText('POINT(4000 4000)')
+WHERE MBRIntersects(tab.c4, @g1);
+
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# UPDATE tab SET c4 = ST_GeomFromText('POINT(4000 4000)')
+# WHERE MBRIntersects(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBRIntersects(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+INSERT INTO tab SELECT * FROM tab1;
+
+ALTER TABLE tab DROP PRIMARY KEY;
+
+ALTER TABLE tab DROP INDEX idx2;
+
+# Check spatial index on temp tables
+
+CREATE TEMPORARY TABLE temp_tab AS SELECT * FROM tab where c1 = c2;
+
+INSERT INTO temp_tab SELECT * FROM tab;
+
+CREATE SPATIAL INDEX idx2 ON temp_tab(c2);
+
+CREATE SPATIAL INDEX idx3 ON temp_tab(c3);
+
+CREATE SPATIAL INDEX idx4 ON temp_tab(c4);
+
+CREATE SPATIAL INDEX idx5 ON temp_tab(c5);
+
+SHOW CREATE TABLE temp_tab;
+
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1) ORDER BY c1;
+
+# The following comments will be removed once the patch is available
+UPDATE temp_tab SET C2 = ST_GeomFromText('POINT(1000 1000)')
+WHERE MBRContains(temp_tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1);
+
+# Sever crashes Here so commented, will be removed later
+DELETE FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM temp_tab WHERE MBRContains(temp_tab.c4, @g1) ORDER BY c1;
+
+# Check Unique constraint on spatial index column POINT
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+DELETE FROM tab;
+
+ALTER TABLE tab ADD PRIMARY KEY(c2);
+
+CREATE SPATIAL INDEX idx2 ON tab(c2 ASC);
+
+ALTER TABLE tab ADD CONSTRAINT const_1 UNIQUE(c2);
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+# Check Unique constraint on spatial index column Geometry
+
+DELETE FROM tab;
+
+ALTER TABLE tab DROP PRIMARY KEY ;
+
+ALTER TABLE tab DROP KEY const_1;
+
+ALTER TABLE tab ADD PRIMARY KEY(c5(10));
+
+ALTER TABLE tab ADD CONSTRAINT const_1 UNIQUE(c5(10));
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+#cleanup
+DROP TABLE tab,tab1,temp_tab;
+
+--enable_warnings
+
+# Check Modify POINT to GEOMETRY and GEOMETRY to POINT
+CREATE TABLE tab(c1 int NOT NULL PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB;
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+
+ANALYZE TABLE tab;
+
+ALTER TABLE tab ADD SPATIAL INDEX idx2(c2 ASC);
+
+ALTER TABLE tab ADD SPATIAL KEY idx3(c3 DESC);
+
+ALTER TABLE tab ADD SPATIAL INDEX idx4(c4 ASC) COMMENT 'testing spatial index on Polygon';
+
+ALTER TABLE tab ADD SPATIAL KEY idx5(c5 ASC) COMMENT 'testing spatial index on Geometry';
+
+ALTER TABLE tab ADD INDEX idx6(c4(10)) USING BTREE;
+
+
+ALTER TABLE tab MODIFY COLUMN c2 GEOMETRY NOT NULL;
+
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# ALTER TABLE tab MODIFY COLUMN c3 POLYGON NOT NULL;
+
+# --error ER_INVALID_USE_OF_NULL
+# ALTER TABLE tab add COLUMN c7 POINT NOT NULL;
+
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE tab add COLUMN c8 POINT NOT NULL, ALGORITHM = INPLACE, LOCK=NONE;
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(1000 1000)')
+WHERE MBRContains(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c2),ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# ALTER TABLE tab MODIFY COLUMN c2 POLYGON NOT NULL;
+
+ALTER TABLE tab MODIFY COLUMN c4 GEOMETRY NOT NULL;
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+ANALYZE TABLE tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+SET @g2 = ST_GeomFromText('LINESTRING(140 140,150 150,160 160)');
+
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1)
+AND MBREquals(tab.c3,@g2) ORDER BY c1;
+
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE MBREquals(tab.c4, @g1) AND MBREquals(tab.c3,@g2);
+
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1)
+AND MBREquals(tab.c3,@g2) ORDER BY c1;
+
+DELETE FROM tab WHERE MBREquals(tab.c4, @g1) AND MBREquals(tab.c3,@g2);
+
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1)
+AND MBREquals(tab.c3,@g2) ORDER BY c1;
+
+ANALYZE TABLE tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))');
+
+SET @g2 = ST_GeomFromText('LINESTRING(1 1,2 2,3 3)');
+
+# When Point type data exist in the column allow DDL operation
+ALTER TABLE tab MODIFY COLUMN c2 POINT NOT NULL;
+
+ALTER TABLE tab MODIFY COLUMN c3 LINESTRING NOT NULL;
+
+ALTER TABLE tab MODIFY COLUMN c4 POLYGON NOT NULL;
+
+SHOW CREATE TABLE tab;
+
+--replace_column 7 #
+SHOW INDEX FROM tab;
+
+ANALYZE TABLE tab;
+
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+SET @g2 = ST_GeomFromText('LINESTRING(1 1,2 2,3 3)');
+
+# Should be 0 rows affected
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+AND ST_Touches(tab.c3,@g2);
+
+# Should be 0 rows affected
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE ST_Touches(tab.c4, @g1) AND ST_Touches(tab.c3,@g2);
+
+# Should be 0 rows affected
+DELETE FROM tab WHERE ST_Touches(tab.c4, @g1) AND ST_Touches(tab.c3,@g2);
+
+# Should be 0 rows affected
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+AND ST_Touches(tab.c3,@g2);
+
+# should be 1 row affected
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+OR ST_Touches(tab.c3,@g2);
+
+# should be 1 row affected
+UPDATE tab SET C2 = ST_GeomFromText('POINT(2000 2000)')
+WHERE ST_Touches(tab.c4, @g1) OR ST_Touches(tab.c3,@g2);
+
+# should be 1 row affected
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+OR ST_Touches(tab.c3,@g2);
+
+# should be 1 row affected
+DELETE FROM tab WHERE ST_Touches(tab.c4, @g1) OR ST_Touches(tab.c3,@g2);
+
+# Should be Empty set
+SELECT c1,ST_Astext(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1)
+OR ST_Touches(tab.c3,@g2);
+
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+ALTER TABLE tab MODIFY COLUMN c4 INT NOT NULL;
+
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+ALTER TABLE tab MODIFY COLUMN c4 BLOB NOT NULL;
+
+# Test InnoDB to Myisam to InnoDB
+ALTER TABLE tab ENGINE Myisam;
+
+ALTER TABLE tab ENGINE InnoDB;
+
+ANALYZE TABLE tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))');
+
+SET @g2 = ST_GeomFromText('LINESTRING(400 400,500 500,600 700)');
+
+SELECT c1,ST_AsText(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) AND MBRWithin(tab.c3, @g2);
+
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# UPDATE tab SET c2 = ST_GeomFromText('POINT(2000 2000)'),
+# c3=ST_GeomFromText('POINT(2000 2000)')
+# WHERE MBRWithin(tab.c4, @g1) AND MBRWithin(tab.c3, @g2);
+
+SET @g1 = ST_GeomFromText('POINT(2000 2000)');
+
+SET @g2 = ST_GeomFromText('POINT(2000 2000)');
+
+SELECT c1,ST_AsText(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c2, @g1) AND MBRWithin(tab.c3, @g2);
+
+DELETE FROM tab WHERE MBRWithin(tab.c2, @g1) AND MBRWithin(tab.c3, @g2);
+
+SELECT c1,ST_AsText(c2),ST_AsText(c3),ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c2, @g1) AND MBRWithin(tab.c3, @g2);
+
+#cleanup
+DROP TABLE tab;
+
+# Check Foreign Key constraint on Point column
+CREATE TABLE parent (id POINT, PRIMARY KEY(id)) ENGINE=InnoDB;
+
+CREATE TABLE child (id GEOMETRY NOT NULL, parent_id POINT NOT NULL) ENGINE=InnoDB;
+
+ALTER TABLE parent ADD SPATIAL INDEX idx1(id ASC);
+
+ALTER TABLE child ADD SPATIAL INDEX idx2(parent_id ASC);
+
+SHOW CREATE TABLE parent;
+
+SHOW CREATE TABLE child;
+
+SHOW INDEX FROM parent;
+
+--replace_column 7 #
+SHOW INDEX FROM child;
+
+# --error ER_CANNOT_ADD_FOREIGN
+--disable_result_log
+--error ER_CANT_CREATE_TABLE
+ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ;
+
+# --error ER_CANNOT_ADD_FOREIGN
+--error ER_CANT_CREATE_TABLE
+ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ON DELETE CASCADE ;
+--enable_result_log
+
+#cleanup
+DROP table child,parent;
+
+# Check Foreign Key constraint on Geometry column
+CREATE TABLE parent (id GEOMETRY, PRIMARY KEY(id(10))) ENGINE=InnoDB;
+
+CREATE TABLE child (id GEOMETRY NOT NULL, parent_id GEOMETRY NOT NULL) ENGINE=InnoDB;
+
+ALTER TABLE parent ADD SPATIAL INDEX idx1(id ASC) ;
+
+ALTER TABLE child ADD SPATIAL INDEX idx2(parent_id ASC);
+
+SHOW CREATE TABLE parent;
+
+SHOW CREATE TABLE child;
+
+SHOW INDEX FROM parent;
+
+SHOW INDEX FROM child;
+
+--disable_result_log
+# --error ER_BLOB_KEY_WITHOUT_LENGTH
+--error ER_CANT_CREATE_TABLE
+ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ;
+--enable_result_log
+
+#cleanup
+DROP table child,parent;
+
+# Check add spatial index when table already has rows (inplace).
+create table t1 (c1 int) engine=innodb;
+insert into t1 values(NULL);
+
+# Add spatial index fail, since geometry column can't be null.
+--error ER_SPATIAL_CANT_HAVE_NULL
+alter table t1 add b geometry, add spatial index(b), algorithm=inplace;
+
+# Add spatial index fail, since there's invalid geo data.
+# The case has to be commented because it no longer fails and following cases
+# don't expect the effect of such a statement.
+#--error ER_CANT_CREATE_GEOMETRY_OBJECT
+# alter table t1 add b geometry not null, add spatial index(b), algorithm=inplace;
+
+# Add a geometry column.
+alter table t1 add b geometry, algorithm=inplace;
+
+# Add spatial index fail, since there's a NULL or invalid geo data.
+# The case has to be commented because it no longer fails and following cases
+# don't expect the effect of such a statement.
+#--error ER_CANT_CREATE_GEOMETRY_OBJECT
+#alter table t1 add spatial index(b), algorithm=inplace;
+
+# Update invalide geo data to point(0 0).
+update t1 set b = st_geomfromtext('point(0 0)');
+
+# Add spatial index success.
+--error ER_SPATIAL_CANT_HAVE_NULL
+alter table t1 add spatial index(b), algorithm=inplace;
+
+# Delete rows.
+delete from t1;
+
+#cleanup
+DROP table t1;
+
+# Check add spatial index when table already has rows (copy).
+create table t1 (c1 int) engine=innodb;
+insert into t1 values(NULL);
+
+# Add spatial index fail, since geometry column can't be null.
+--error ER_SPATIAL_CANT_HAVE_NULL
+alter table t1 add b geometry, add spatial index(b), algorithm=copy;
+
+# Add spatial index fail, since there's a NULL or invalid geo data.
+# --error ER_INVALID_USE_OF_NULL
+--error ER_CANT_CREATE_GEOMETRY_OBJECT
+alter table t1 add b geometry not null, add spatial index(b), algorithm=copy;
+
+# Add a geometry column.
+# --error ER_INVALID_USE_OF_NULL
+# alter table t1 add b geometry not null, algorithm=copy;
+
+# Add spatial index.
+# The case has to be commented because it no longer fails and following cases
+# don't expect the effect of such a statement.
+#--error ER_CANT_CREATE_GEOMETRY_OBJECT
+#alter table t1 add spatial index(b), algorithm=copy;
+
+# Update invalide geo data to point(0 0).
+--error ER_BAD_FIELD_ERROR
+update t1 set b = st_geomfromtext('point(0 0)');
+
+# Add spatial index success.
+--error ER_KEY_COLUMN_DOES_NOT_EXITS
+alter table t1 add spatial index(b), algorithm=copy;
+
+# Delete rows.
+delete from t1;
+
+#cleanup
+DROP table t1;
+
+--echo #
+--echo # BUG#20111575 ALTER TABLE...ADD SPATIAL INDEX...LOCK NONE IS REFUSED
+--echo # WITHOUT STATING A REASON
+--echo #
+CREATE TABLE t1(p point NOT NULL) ENGINE=innodb;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 ADD SPATIAL INDEX(p), LOCK=NONE;
+ALTER TABLE t1 ADD SPATIAL INDEX(p);
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 FORCE, LOCK=NONE;
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_gis/t/check_rtree.test b/mysql-test/suite/innodb_gis/t/check_rtree.test
new file mode 100644
index 00000000000..09bba50d191
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/check_rtree.test
@@ -0,0 +1,27 @@
+# This test case will test checking R-tree features.
+
+# Not supported in embedded
+--source include/not_embedded.inc
+--source include/have_debug.inc
+--source include/have_innodb.inc
+
+# Create table with R-tree index.
+create table t1 (i int, g geometry not null, spatial index (g))engine=innodb;
+
+# Turn on the geometry data print.
+SET SESSION debug="+d,rtree_test_check_count";
+
+# Insert values.
+insert into t1 values (1, POINT(1,1));
+insert into t1 values (1, POINT(1.5,1.5));
+insert into t1 values (1, POINT(3,3));
+insert into t1 values (1, POINT(3.1,3.1));
+insert into t1 values (1, POINT(5,5));
+
+CALL mtr.add_suppression("InnoDB: Flagged corruption of `g` in table `test`.`t1` in CHECK TABLE; Wrong count");
+
+# Select by R-tree index.
+check table t1;
+
+# Cleanup.
+drop table t1;
diff --git a/mysql-test/suite/innodb_gis/t/create_spatial_index.test b/mysql-test/suite/innodb_gis/t/create_spatial_index.test
new file mode 100644
index 00000000000..d25a2e79793
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/create_spatial_index.test
@@ -0,0 +1,1175 @@
+# *********************************************************
+# Test Multiple Spatial Indexes on compression table
+# Test spatial index with table having primary key column
+# Test Spatial index with Create Index different clauses
+# Test Spatial index with spatial relationship functions
+# Test Spatial index with MBR spatial relationship functions
+# Test Spatial index columns with DML & SELECT queries
+# Test Spatial index with procedures
+# Test Delete & Update & check status of the table
+# Test spatial index with table have no primary key column
+# Test spatial index with table have no auto_increment
+# Test spatial index with check constraint
+# **********************************************************
+--source include/have_innodb.inc
+--source include/have_innodb_16k.inc
+--source include/have_geometry.inc
+
+
+# Check spatial index functionality on compress table with Primary key
+CREATE TABLE tab(c1 int NOT NULL PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
+
+# Check spatial index functionality with Create Index clause options
+CREATE SPATIAL INDEX idx1 on tab(c2 ASC);
+CREATE SPATIAL INDEX idx2 on tab(c3 DESC) COMMENT 'wl6968';
+CREATE SPATIAL INDEX idx3 on tab(c4 ASC) KEY_BLOCK_SIZE=8 ;
+CREATE SPATIAL INDEX idx4 on tab(c5 DESC) KEY_BLOCK_SIZE=4
+COMMENT 'Spatial index on Geometry type column';
+
+# Check index type
+SHOW INDEXES FROM tab;
+
+# Populate some spatial data
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+
+ANALYZE TABLE tab;
+
+# Check the spatial relationship between 2 GIS shapes
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+# Test the MBRWithin
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+# Test the ST_Crosses
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 10 10,30 30,40 40)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_CRosses(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+# Test the MBRDisjoint
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+
+# Test the MBREquals
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+# Test the MBRintersects
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+# Test the Overelaps
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING(7 1,30 30,1010 3010,1010 2010,3010 3010,4010 4010,5010 5010 )');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+# Test the ST_Touches
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 100 100,200 200,300 300)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+# Test the MBRDisjoint
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+
+# Test the MBREquals
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+# Test the MBRintersects
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+# Test the MBROverelaps
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+# Test the MBRTouches
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRTouches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRTouches(tab.c4, @g1);
+
+# Test with Procedure
+delimiter |;
+
+CREATE PROCEDURE proc_wl6968()
+BEGIN
+
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+END |
+
+delimiter ;|
+
+CALL proc_wl6968();
+
+# Test the Delete & Update
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((100 200,1010 1010,1020 1020,500 300,300 200,100 300,100 200))');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))');
+
+SET @g2 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+UPDATE tab SET C4 = @g2 WHERE ST_Crosses(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g2) ORDER BY c1;
+
+CHECK TABLE tab;
+
+# Cleanup
+DROP TABLE tab;
+DROP PROCEDURE proc_wl6968;
+
+# End of Testcase compress table with Primary key
+
+# Check spatial index functionality on compress table No Primary key
+CREATE TABLE tab(c1 int ,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16;
+
+# Check spatial index functionality with Create Index clause options
+CREATE SPATIAL INDEX idx1 on tab(c2 ASC);
+CREATE SPATIAL INDEX idx2 on tab(c3 DESC) COMMENT 'wl6968';
+CREATE SPATIAL INDEX idx3 on tab(c4 ASC) KEY_BLOCK_SIZE=2 ;
+CREATE SPATIAL INDEX idx4 on tab(c5 DESC) KEY_BLOCK_SIZE=8
+COMMENT 'Spatial index on Geometry type column';
+
+# Check index type
+SHOW INDEXES FROM tab;
+
+# Populate some spatial data
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(1,ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(2,ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(3,ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(4,ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(5,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(6,ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(7,ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(8,ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(9,ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+
+
+INSERT INTO tab(c1,c2,c3,c4,c5)
+VALUES(10,ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+
+ANALYZE TABLE tab;
+
+# Check the spatial relationship between 2 GIS shapes
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+# Test the MBRWithin
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+# Test the ST_Crosses
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 10 10,30 30,40 40)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_CRosses(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+# Test the MBRDisjoint
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+
+# Test the MBREquals
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+# Test the MBRintersects
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+# Test the Overelaps
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING(7 1,30 30,1010 3010,1010 2010,3010 3010,4010 4010,5010 5010 )');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+# Test the ST_Touches
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 100 100,200 200,300 300)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+# Test the MBRDisjoint
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+
+# Test the MBREquals
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+# Test the MBRintersects
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+# Test the MBROverelaps
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+# Test the MBRTouches
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRTouches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRTouches(tab.c4, @g1);
+
+# Test with Procedure
+delimiter |;
+
+CREATE PROCEDURE proc_wl6968()
+BEGIN
+
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+END |
+
+delimiter ;|
+
+CALL proc_wl6968();
+
+# Test the Delete & Update
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+SET @g2 = ST_GeomFromText( 'POLYGON((1 1,2 2,3 3,10 3,5 1,1 1))');
+
+UPDATE tab SET C4 = @g2 WHERE MBROverlaps(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+# Cleanup
+DROP TABLE tab;
+DROP PROCEDURE proc_wl6968;
+
+# End of Testcase compress table No Primary key
+
+# Check spatial index functionality on compress table with auto_increment
+CREATE TABLE tab(c1 int AUTO_INCREMENT PRIMARY KEY,c2 POINT NOT NULL,
+c3 LINESTRING NOT NULL,c4 POLYGON NOT NULL,c5 GEOMETRY NOT NULL)
+ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16;
+
+# Check spatial index functionality with Create Index clause options
+CREATE SPATIAL INDEX idx1 on tab(c2 ASC);
+CREATE SPATIAL INDEX idx2 on tab(c3 DESC) COMMENT 'wl6968';
+CREATE SPATIAL INDEX idx3 on tab(c4 ASC) KEY_BLOCK_SIZE=16 ;
+CREATE SPATIAL INDEX idx4 on tab(c5 DESC) KEY_BLOCK_SIZE=16
+COMMENT 'Spatial index on Geometry type column';
+
+# Check index type
+SHOW INDEXES FROM tab;
+
+# Populate some spatial data
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(10 10)'),ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'),
+ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))'));
+
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(20 20)'),ST_GeomFromText('LINESTRING(20 20,30 30,40 40)'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'),
+ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))'));
+
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(4 4)'),ST_GeomFromText('LINESTRING(130 130,140 140,150 150)'),
+ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'),
+ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))'));
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(50 50)'),ST_GeomFromText('LINESTRING(200 200,300 300,400 400)'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'),
+ST_GeomFromText('POLYGON((300 300,400 400,500 500,300 500,300 400,300 300))'));
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(400 400,500 500,600 700)'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'),
+ST_GeomFromText('POLYGON((1010 1010,1020 1020,1030 1030,1040 1030,1020 1010,1010 1010))'));
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(3 3)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'),
+ST_GeomFromText('POLYGON((2010 2010,2020 2020,2030 2030,2040 2030,2020 2010,2010 2010))'));
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(60 70)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(0 0)'),ST_GeomFromText('LINESTRING(40 40,50 50,60 70)'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'),
+ST_GeomFromText('POLYGON((3010 3010,3020 3020,3030 3030,3040 3030,3020 3010,3010 3010))'));
+
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(120 120)'),ST_GeomFromText('LINESTRING(100 100,110 110,120 120)'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'),
+ST_GeomFromText('POLYGON((4010 4010,4020 4020,4030 4030,4040 4030,4020 4010,4010 4010))'));
+
+
+INSERT INTO tab(c2,c3,c4,c5)
+VALUES(ST_GeomFromText('POINT(160 160)'),ST_GeomFromText('LINESTRING(140 140,150 150,160 160)'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'),
+ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))'));
+
+ANALYZE TABLE tab;
+
+# Check the spatial relationship between 2 GIS shapes
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 300 300,400 400)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+# Test the MBRWithin
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+# Test the ST_Crosses
+SET @g1 = ST_GeomFromText('POLYGON((100 200,200 300,400 500,500 300,300 200,100 300,100 200))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 10 10,30 30,40 40)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_CRosses(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Crosses(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Crosses(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Crosses(tab.c4, @g1);
+
+# Test the MBRDisjoint
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+
+# Test the MBREquals
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+# Test the MBRintersects
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+# Test the Overelaps
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING(7 1,30 30,1010 3010,1010 2010,3010 3010,4010 4010,5010 5010 )');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+# Test the ST_Touches
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 100 100,200 200,300 300)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE ST_Touches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE ST_Touches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE ST_Touches(tab.c4, @g1);
+
+# Test the MBRContains
+SET @g1 = ST_GeomFromText( 'POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRContains(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRContains(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRContains(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText( 'POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) ');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRWithin(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRWithin(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRWithin(tab.c4, @g1);
+
+# Test the MBRDisjoint
+SET @g1 = ST_GeomFromText('POLYGON((4 -2,5 -4,6 -5,7 -4,7 2,4 -2))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRDisjoint(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRDisjoint(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRDisjoint(tab.c4, @g1);
+
+# Test the MBREquals
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBREquals(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+# Test the MBRintersects
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+SET @g1 = ST_GeomFromText('LINESTRING( 30 30,40 40,50 50)');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRintersects(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRintersects(tab.c4, @g1);
+
+# Test the MBROverelaps
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 2,4 5,5 5,7 1,0 0 ))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBROverlaps(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBROverlaps(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBROverlaps(tab.c4, @g1);
+
+# Test the MBRTouches
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+EXPLAIN SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRTouches(tab.c4, @g1) ORDER BY c1;
+
+EXPLAIN UPDATE tab SET C2 = ST_GeomFromText('POINT(0 0)')
+WHERE MBRTouches(tab.c4, @g1);
+
+EXPLAIN DELETE FROM tab WHERE MBRTouches(tab.c4, @g1);
+
+# Test the Delete & Update
+SET @g1 = ST_GeomFromText('POLYGON((5010 5010,5020 5020,5030 5030,5040 5030,5020 5010,5010 5010))');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBREquals(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBREquals(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+SET @g1 = ST_GeomFromText( 'POLYGON((0 0,0 30,30 40,40 50,50 30,0 0))');
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+DELETE FROM tab WHERE MBRIntersects(tab.c4, @g1);
+
+SELECT c1,ST_Astext(c4) FROM tab WHERE MBRIntersects(tab.c4, @g1) ORDER BY c1;
+
+CHECK TABLE tab;
+
+# Cleanup
+DROP TABLE tab;
+
+# End of Testcase compress table with Auto_increment
+
+# Test check constraint on spatial column
+CREATE TABLE tab(c1 POINT NOT NULL,CONSTRAINT tab_const check(c1 > 0) ) ENGINE=InnoDB;
+
+CREATE SPATIAL INDEX idx1 ON tab(c1) ;
+
+SHOW CREATE TABLE tab;
+
+SHOW INDEX FROM tab;
+
+set @g1 = ST_GeomFromText('POINT(-1 -2)');
+
+SELECT ST_AsText(c1) FROM tab;
+
+DROP table tab;
+
+# repro case for bug#20451454 - FAILING ASSERTION: LOW_MATCH
+# < DTUPLE_GET_N_FIELDS_CMP(TUPLE)
+create table `t1`(`a` geometry not null,`b` linestring not null,
+primary key (`b`(192),`a`(141)),spatial key (`b`)) engine=innodb;
+insert into `t1` values(
+ point(1,1),
+ linestring(point(1,1),point(1,1))
+);
+
+# --error ER_GIS_INVALID_DATA
+--error ER_BAD_NULL_ERROR
+insert into `t1` values
+(
+ polygon(
+ linestring(point(1,1),point(1,1)),
+ linestring(point(1,1),point(11,1))
+ ),
+ linestring(point(1,1),point(1,1))
+);
+select 1 from t1 where st_intersects(
+ geometrycollection(point(1,-1)),b
+);
+drop table t1;
+
+# Reproduce case for updating statistic after droping stats info table.
+CREATE TABLE t1(c1 POINT NOT NULL);
+DROP TABLE mysql.innodb_table_stats;
+CALL mtr.add_suppression("InnoDB: Table `mysql`.`innodb_table_stats` not found.");
+CALL mtr.add_suppression("InnoDB: Fetch of persistent statistics requested for table `test`.`t1` but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.");
+CREATE SPATIAL INDEX idx2 ON t1(c1);
+
+DROP TABLE t1;
+CREATE TABLE mysql.innodb_table_stats (
+ database_name varchar(64) COLLATE utf8_bin NOT NULL,
+ table_name varchar(64) COLLATE utf8_bin NOT NULL,
+ last_update timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ n_rows bigint(20) unsigned NOT NULL,
+ clustered_index_size bigint(20) unsigned NOT NULL,
+ sum_of_other_index_sizes bigint(20) unsigned NOT NULL,
+ PRIMARY KEY (`database_name`,`table_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
diff --git a/mysql-test/suite/innodb_gis/t/gis.test b/mysql-test/suite/innodb_gis/t/gis.test
new file mode 100644
index 00000000000..f28809f393c
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/gis.test
@@ -0,0 +1,1444 @@
+# This is a testcase copied from mysql-test/t/gis.test
+
+--source include/have_innodb.inc
+-- source include/have_geometry.inc
+
+SET default_storage_engine=InnoDB;
+
+#
+# Spatial objects
+#
+
+--disable_warnings
+DROP TABLE IF EXISTS t1, gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+--enable_warnings
+
+CREATE TABLE gis_point (fid INTEGER NOT NULL PRIMARY KEY, g POINT);
+CREATE TABLE gis_line (fid INTEGER NOT NULL PRIMARY KEY, g LINESTRING);
+CREATE TABLE gis_polygon (fid INTEGER NOT NULL PRIMARY KEY, g POLYGON);
+CREATE TABLE gis_multi_point (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOINT);
+CREATE TABLE gis_multi_line (fid INTEGER NOT NULL PRIMARY KEY, g MULTILINESTRING);
+CREATE TABLE gis_multi_polygon (fid INTEGER NOT NULL PRIMARY KEY, g MULTIPOLYGON);
+CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRYCOLLECTION);
+CREATE TABLE gis_geometry (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY);
+
+SHOW FIELDS FROM gis_point;
+SHOW FIELDS FROM gis_line;
+SHOW FIELDS FROM gis_polygon;
+SHOW FIELDS FROM gis_multi_point;
+SHOW FIELDS FROM gis_multi_line;
+SHOW FIELDS FROM gis_multi_polygon;
+SHOW FIELDS FROM gis_geometrycollection;
+SHOW FIELDS FROM gis_geometry;
+
+
+INSERT INTO gis_point VALUES
+(101, ST_PointFromText('POINT(10 10)')),
+(102, ST_PointFromText('POINT(20 10)')),
+(103, ST_PointFromText('POINT(20 20)')),
+(104, ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(10 20)'))));
+
+INSERT INTO gis_line VALUES
+(105, ST_LineFromText('LINESTRING(0 0,0 10,10 0)')),
+(106, ST_LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+(107, ST_LineStringFromWKB(ST_AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+
+INSERT INTO gis_polygon VALUES
+(108, ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+(109, ST_PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+(110, ST_PolyFromWKB(ST_AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+
+INSERT INTO gis_multi_point VALUES
+(111, ST_MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+(112, ST_MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+(113, ST_MPointFromWKB(ST_AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+
+INSERT INTO gis_multi_line VALUES
+(114, ST_MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+(115, ST_MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+(116, ST_MLineFromWKB(ST_AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+
+
+INSERT INTO gis_multi_polygon VALUES
+(117, ST_MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(118, ST_MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+(119, ST_MPolyFromWKB(ST_AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+
+INSERT INTO gis_geometrycollection VALUES
+(120, ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+(121, ST_GeometryFromWKB(ST_AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
+
+INSERT into gis_geometry SELECT * FROM gis_point;
+INSERT into gis_geometry SELECT * FROM gis_line;
+INSERT into gis_geometry SELECT * FROM gis_polygon;
+INSERT into gis_geometry SELECT * FROM gis_multi_point;
+INSERT into gis_geometry SELECT * FROM gis_multi_line;
+INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+
+SELECT fid, ST_AsText(g) FROM gis_point;
+SELECT fid, ST_AsText(g) FROM gis_line;
+SELECT fid, ST_AsText(g) FROM gis_polygon;
+SELECT fid, ST_AsText(g) FROM gis_multi_point;
+SELECT fid, ST_AsText(g) FROM gis_multi_line;
+SELECT fid, ST_AsText(g) FROM gis_multi_polygon;
+SELECT fid, ST_AsText(g) FROM gis_geometrycollection;
+SELECT fid, ST_AsText(g) FROM gis_geometry;
+
+SELECT fid, ST_Dimension(g) FROM gis_geometry;
+SELECT fid, ST_GeometryType(g) FROM gis_geometry;
+SELECT fid, ST_IsEmpty(g) FROM gis_geometry;
+SELECT fid, ST_AsText(ST_Envelope(g)) FROM gis_geometry;
+--replace_column 10 #
+explain extended select ST_Dimension(g), ST_GeometryType(g), ST_IsEmpty(g), ST_AsText(ST_Envelope(g)) from gis_geometry;
+
+SELECT fid, ST_X(g) FROM gis_point;
+SELECT fid, ST_Y(g) FROM gis_point;
+--replace_column 10 #
+explain extended select ST_X(g),ST_Y(g) FROM gis_point;
+
+SELECT fid, ST_AsText(ST_StartPoint(g)) FROM gis_line;
+SELECT fid, ST_AsText(ST_EndPoint(g)) FROM gis_line;
+SELECT fid, ST_Length(g) FROM gis_line;
+SELECT fid, ST_NumPoints(g) FROM gis_line;
+SELECT fid, ST_AsText(ST_PointN(g, 2)) FROM gis_line;
+SELECT fid, ST_IsClosed(g) FROM gis_line;
+--replace_column 10 #
+explain extended select ST_AsText(ST_StartPoint(g)),ST_AsText(ST_EndPoint(g)),ST_Length(g),ST_NumPoints(g),ST_AsText(ST_PointN(g, 2)),ST_IsClosed(g) FROM gis_line;
+
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_polygon;
+SELECT fid, ST_Area(g) FROM gis_polygon;
+SELECT fid, ST_AsText(ST_ExteriorRing(g)) FROM gis_polygon;
+SELECT fid, ST_NumInteriorRings(g) FROM gis_polygon;
+SELECT fid, ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+--replace_column 10 #
+explain extended select ST_AsText(ST_Centroid(g)),ST_Area(g),ST_AsText(ST_ExteriorRing(g)),ST_NumInteriorRings(g),ST_AsText(ST_InteriorRingN(g, 1)) FROM gis_polygon;
+
+SELECT fid, ST_IsClosed(g) FROM gis_multi_line;
+
+SELECT fid, ST_AsText(ST_Centroid(g)) FROM gis_multi_polygon;
+SELECT fid, ST_Area(g) FROM gis_multi_polygon;
+
+SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+SELECT fid, ST_NumGeometries(g) from gis_multi_line;
+SELECT fid, ST_NumGeometries(g) from gis_multi_polygon;
+SELECT fid, ST_NumGeometries(g) from gis_geometrycollection;
+--replace_column 10 #
+explain extended SELECT fid, ST_NumGeometries(g) from gis_multi_point;
+
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_line;
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_polygon;
+SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_geometrycollection;
+SELECT fid, ST_AsText(ST_GeometryN(g, 1)) from gis_geometrycollection;
+--replace_column 10 #
+explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point;
+
+SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+--replace_column 10 #
+explain extended SELECT g1.fid as first, g2.fid as second,
+MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o,
+MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t,
+MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r
+FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+
+DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+
+#
+# Check that ALTER TABLE doesn't loose geometry type
+#
+CREATE TABLE t1 (
+ gp point,
+ ln linestring,
+ pg polygon,
+ mp multipoint,
+ mln multilinestring,
+ mpg multipolygon,
+ gc geometrycollection,
+ gm geometry
+);
+
+SHOW FIELDS FROM t1;
+ALTER TABLE t1 ADD fid INT NOT NULL;
+SHOW FIELDS FROM t1;
+DROP TABLE t1;
+
+SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)'))));
+explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)'))));
+SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+explain extended SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101));
+#select ST_issimple(MultiPoint(Point(3, 6), Point(4, 10))), ST_issimple(Point(3, 6)),ST_issimple(ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),ST_issimple(ST_GeometryFromText('POINT(1 4)')), ST_issimple(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')));
+explain extended select ST_issimple(MultiPoint(Point(3, 6), Point(4, 10))), ST_issimple(Point(3, 6));
+
+create table t1 (a geometry not null);
+insert into t1 values (ST_GeomFromText('Point(1 2)'));
+-- error 1416
+insert into t1 values ('Garbage');
+-- error 1416
+insert IGNORE into t1 values ('Garbage');
+alter table t1 add spatial index(a);
+
+drop table t1;
+
+#
+# Bug #5219: problem with range optimizer
+#
+
+create table t1(a geometry not null, spatial index(a));
+insert into t1 values
+(ST_GeomFromText('POINT(1 1)')), (ST_GeomFromText('POINT(3 3)')),
+(ST_GeomFromText('POINT(4 4)')), (ST_GeomFromText('POINT(6 6)'));
+select ST_AsText(a) from t1 where
+ MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+ or
+ MBRContains(ST_GeomFromText('Polygon((2 2, 2 5, 5 5, 5 2, 2 2))'), a);
+select ST_AsText(a) from t1 where
+ MBRContains(ST_GeomFromText('Polygon((0 0, 0 2, 2 2, 2 0, 0 0))'), a)
+ and
+ MBRContains(ST_GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a);
+drop table t1;
+
+CREATE TABLE t1 (Coordinates POINT NOT NULL, SPATIAL INDEX(Coordinates));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(383293632 1754448)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(564952612 157516260)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(903994614 180726515)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(98128178 141127631)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(862547902 799334546)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(341989013 850270906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(803302376 93039099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(857439153 817431356)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(319757546 343162742)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(826341972 717484432)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(305066789 201736238)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(626068992 616241497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(55789424 755830108)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(802874458 312435220)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(153795660 551723671)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(242207428 537089292)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(553478119 807160039)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(694605552 457472733)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(987886554 792733729)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(598600363 850434457)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(592068275 940589376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(700705362 395370650)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(33628474 558144514)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(212802006 353386020)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(901307256 39143977)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(70870451 206374045)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(240880214 696939443)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(822615542 296669638)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(452769551 625489999)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(609104858 606565210)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(177213669 851312285)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(143654501 730691787)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(658472325 838260052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(188164520 646358878)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(630993781 786764883)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(496793334 223062055)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(727354258 197498696)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(618432704 760982731)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(755643210 831234710)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(114368751 656950466)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(870378686 185239202)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(863324511 111258900)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(882178645 685940052)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(407928538 334948195)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(311430051 17033395)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941513405 488643719)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(868345680 85167906)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(219335507 526818004)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(923427958 407500026)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(173176882 554421738)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(194264908 669970217)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(777483793 921619165)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(867468912 395916497)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(682601897 623112122)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(227151206 796970647)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(280062588 97529892)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(982209849 143387099)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(208788792 864388493)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(829327151 616717329)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(199336688 140757201)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(633750724 140850093)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(629400920 502096404)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(226017998 848736426)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(28914408 149445955)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(256236452 202091290)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(703867693 450501360)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(872061506 481351486)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(372120524 739530418)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(877267982 54722420)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(362642540 104419188)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(851693067 642705127)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(201949080 833902916)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(786092225 410737872)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(698291409 615419376)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(27455201 897628096)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(756176576 661205925)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(38478189 385577496)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(163302328 264496186)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(234313922 192216735)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(413942141 490550373)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(394308025 117809834)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(941051732 266369530)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(599161319 313172256)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(5899948 476429301)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(367894677 368542487)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(580848489 219587743)'));
+INSERT INTO t1 VALUES(ST_GeomFromText('POINT(11247614 782797569)'));
+drop table t1;
+
+create table t1 select ST_GeomFromWKB(POINT(1,3));
+show create table t1;
+drop table t1;
+
+SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
+CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo`
+geometry NOT NULL default '');
+SET sql_mode = default;
+
+insert into t1 values ('85984',ST_GeomFromText('MULTIPOLYGON(((-115.006363
+36.305435,-114.992394 36.305202,-114.991219 36.305975,-114.991163
+36.306845,-114.989432 36.309452,-114.978275 36.312642,-114.977363
+36.311978,-114.975327 36.312344,-114.96502 36.31597,-114.963364
+36.313629,-114.961723 36.313721,-114.956398 36.316057,-114.951882
+36.320979,-114.947073 36.323475,-114.945207 36.326451,-114.945207
+36.326451,-114.944132 36.326061,-114.94003 36.326588,-114.924017
+36.334484,-114.923281 36.334146,-114.92564 36.331504,-114.94072
+36.319282,-114.945348 36.314812,-114.948091 36.314762,-114.951755
+36.316211,-114.952446 36.313883,-114.952644 36.309488,-114.944725
+36.313083,-114.93706 36.32043,-114.932478 36.323497,-114.924556
+36.327708,-114.922608 36.329715,-114.92009 36.328695,-114.912105
+36.323566,-114.901647 36.317952,-114.897436 36.313968,-114.895344
+36.309573,-114.891699 36.304398,-114.890569 36.303551,-114.886356
+36.302702,-114.885141 36.301351,-114.885709 36.297391,-114.892499
+36.290893,-114.902142 36.288974,-114.904941 36.288838,-114.905308
+36.289845,-114.906325 36.290395,-114.909916 36.289549,-114.914527
+36.287535,-114.918797 36.284423,-114.922982 36.279731,-114.924113
+36.277282,-114.924057 36.275817,-114.927733 36.27053,-114.929354
+36.269029,-114.929354 36.269029,-114.950856 36.268715,-114.950768
+36.264324,-114.960206 36.264293,-114.960301 36.268943,-115.006662
+36.268929,-115.008583 36.265619,-115.00665 36.264247,-115.006659
+36.246873,-115.006659 36.246873,-115.006838 36.247697,-115.010764
+36.247774,-115.015609 36.25113,-115.015765 36.254505,-115.029517
+36.254619,-115.038573 36.249317,-115.038573 36.249317,-115.023403
+36.25841,-115.023873 36.258994,-115.031845 36.259829,-115.03183
+36.261053,-115.025561 36.261095,-115.036417 36.274632,-115.033729
+36.276041,-115.032217 36.274851,-115.029845 36.273959,-115.029934
+36.274966,-115.025763 36.274896,-115.025406 36.281044,-115.028731
+36.284471,-115.036497 36.290377,-115.042071 36.291039,-115.026759
+36.298478,-115.008995 36.301966,-115.006363 36.305435),(-115.079835
+36.244369,-115.079735 36.260186,-115.076435 36.262369,-115.069758
+36.265,-115.070235 36.268757,-115.064542 36.268655,-115.061843
+36.269857,-115.062676 36.270693,-115.06305 36.272344,-115.059051
+36.281023,-115.05918 36.283008,-115.060591 36.285246,-115.061913
+36.290022,-115.062499 36.306353,-115.062499 36.306353,-115.060918
+36.30642,-115.06112 36.289779,-115.05713 36.2825,-115.057314
+36.279446,-115.060779 36.274659,-115.061366 36.27209,-115.057858
+36.26557,-115.055805 36.262883,-115.054688 36.262874,-115.047335
+36.25037,-115.044234 36.24637,-115.052434 36.24047,-115.061734
+36.23507,-115.061934 36.22677,-115.061934 36.22677,-115.061491
+36.225267,-115.062024 36.218194,-115.060134 36.218278,-115.060133
+36.210771,-115.057833 36.210771,-115.057433 36.196271,-115.062233
+36.196271,-115.062233 36.190371,-115.062233 36.190371,-115.065533
+36.190371,-115.071333 36.188571,-115.098331 36.188275,-115.098331
+36.188275,-115.098435 36.237569,-115.097535 36.240369,-115.097535
+36.240369,-115.093235 36.240369,-115.089135 36.240469,-115.083135
+36.240569,-115.083135 36.240569,-115.079835
+36.244369)))')),('85998',ST_GeomFromText('MULTIPOLYGON(((-115.333107
+36.264587,-115.333168 36.280638,-115.333168 36.280638,-115.32226
+36.280643,-115.322538 36.274311,-115.327222 36.274258,-115.32733
+36.263026,-115.330675 36.262984,-115.332132 36.264673,-115.333107
+36.264587),(-115.247239 36.247066,-115.247438 36.218267,-115.247438
+36.218267,-115.278525 36.219263,-115.278525 36.219263,-115.301545
+36.219559,-115.332748 36.219197,-115.332757 36.220041,-115.332757
+36.220041,-115.332895 36.233514,-115.349023 36.233479,-115.351489
+36.234475,-115.353681 36.237021,-115.357106 36.239789,-115.36519
+36.243331,-115.368156 36.243487,-115.367389 36.244902,-115.364553
+36.246014,-115.359219 36.24616,-115.356186 36.248025,-115.353347
+36.248004,-115.350813 36.249507,-115.339673 36.25387,-115.333069
+36.255018,-115.333069 36.255018,-115.333042 36.247767,-115.279039
+36.248666,-115.263639 36.247466,-115.263839 36.252766,-115.261439
+36.252666,-115.261439 36.247366,-115.247239 36.247066)))'));
+
+# Expected result is 115.31877315203187, but IA64 returns 115.31877315203188
+# due to fused multiply-add instructions.
+--replace_result 115.31877315203188 115.31877315203187
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85998;
+
+# Expected result is 36.3310176346905, but IA64 returns 36.3310176346904
+# due to fused multiply-add instructions.
+--replace_result 36.3310176346904 36.3310176346905 -114.87787186923326 -114.87787186923313 36.33101763469053 36.33101763469059 36.33101763469043 36.33101763469059
+select object_id, ST_geometrytype(geo), ST_ISSIMPLE(GEO), ST_ASTEXT(ST_centroid(geo)) from
+t1 where object_id=85984;
+
+drop table t1;
+
+create table t1 (fl geometry not null);
+--error 1416
+insert into t1 values (1);
+--error 1416
+insert into t1 values (1.11);
+--error 1416
+insert into t1 values ("qwerty");
+--error 1048
+# --error ER_GIS_INVALID_DATA
+insert into t1 values (ST_pointfromtext('point(1,1)'));
+
+drop table t1;
+
+select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000))));
+select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440))));
+
+--enable_metadata
+create table t1 (g GEOMETRY);
+select * from t1;
+select ST_asbinary(g) from t1;
+--disable_metadata
+drop table t1;
+
+create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
+alter table t1 disable keys;
+--error 1263
+load data infile '../../std_data/bad_gis_data.dat' into table t1;
+alter table t1 enable keys;
+drop table t1;
+
+#
+# Bug #26038: is null and bad data
+#
+
+create table t1 (a int, b blob);
+insert into t1 values (1, ''), (2, NULL), (3, '1');
+select * from t1;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+select
+ ST_geometryfromtext(b) IS NULL, ST_geometryfromwkb(b) IS NULL, ST_astext(b) IS NULL,
+ ST_aswkb(b) IS NULL, ST_geometrytype(b) IS NULL, ST_centroid(b) IS NULL,
+ ST_envelope(b) IS NULL, ST_startpoint(b) IS NULL, ST_endpoint(b) IS NULL,
+ ST_exteriorring(b) IS NULL, ST_pointn(b, 1) IS NULL, ST_geometryn(b, 1) IS NULL,
+ ST_interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, ST_isempty(b) IS NULL,
+ ST_issimple(b) IS NULL, ST_isclosed(b) IS NULL, ST_dimension(b) IS NULL,
+ ST_numgeometries(b) IS NULL, ST_numinteriorrings(b) IS NULL, ST_numpoints(b) IS NULL,
+ ST_area(b) IS NULL, ST_length(b) IS NULL, ST_srid(b) IS NULL, ST_x(b) IS NULL,
+ ST_y(b) IS NULL
+from t1;
+
+# --error ER_GIS_INVALID_DATA
+select
+ MBRwithin(b, b) IS NULL, MBRcontains(b, b) IS NULL, MBRoverlaps(b, b) IS NULL,
+ MBRequals(b, b) IS NULL, MBRdisjoint(b, b) IS NULL, ST_touches(b, b) IS NULL,
+ MBRintersects(b, b) IS NULL, ST_crosses(b, b) IS NULL
+from t1;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+select
+ point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
+ multilinestring(b) IS NULL, multipolygon(b) IS NULL,
+ geometrycollection(b) IS NULL
+from t1;
+
+drop table t1;
+
+#
+# Bug #27164: Crash when mixing InnoDB and MyISAM Geospatial tables
+#
+CREATE TABLE t1(a POINT) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (NULL);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+#
+# Bug #30955 ST_geomfromtext() crasher
+#
+CREATE TABLE `t1` ( `col9` set('a'), `col89` date);
+INSERT IGNORE INTO `t1` VALUES ('','0000-00-00');
+# --error ER_GIS_INVALID_DATA
+select ST_geomfromtext(col9,col89) as a from t1;
+DROP TABLE t1;
+
+#
+# Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data)
+#
+
+CREATE TABLE t1 (
+ geomdata polygon NOT NULL,
+ SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+
+CREATE TABLE t2 (
+ geomdata polygon NOT NULL,
+ SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+
+CREATE TABLE t3
+select
+ ST_aswkb(ws.geomdata) AS geomdatawkb
+ from
+ t1 ws
+union
+ select
+ ST_aswkb(ws.geomdata) AS geomdatawkb
+ from
+ t2 ws;
+
+describe t3;
+
+drop table t1;
+drop table t2;
+drop table t3;
+
+#
+# Bug #30284 spatial key corruption
+#
+
+create table t1(col1 geometry default null,col15 geometrycollection not
+null,spatial index(col15),index(col1(15)))engine=innodb;
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+insert into t1 set col15 = ST_GeomFromText('POINT(6 5)');
+check table t1 extended;
+drop table t1;
+
+--echo End of 4.1 tests
+
+#
+# Bug #12281 (Geometry: crash in trigger)
+#
+
+create table t1 (s1 geometry not null,s2 char(100));
+create trigger t1_bu before update on t1 for each row set new.s1 = null;
+--error 1048
+insert into t1 values (null,null);
+drop table t1;
+
+#
+# Bug #10499 (function creation with GEOMETRY datatype)
+#
+--disable_warnings
+drop procedure if exists fn3;
+--enable_warnings
+create function fn3 () returns point deterministic return ST_GeomFromText("point(1 1)");
+show create function fn3;
+select ST_astext(fn3());
+drop function fn3;
+
+#
+# Bug #12267 (primary key over GIS)
+#
+create table t1(pt POINT);
+alter table t1 add primary key pti(pt);
+drop table t1;
+create table t1(pt GEOMETRY);
+--error 1170
+alter table t1 add primary key pti(pt);
+alter table t1 add primary key pti(pt(20));
+drop table t1;
+
+
+create table t1 select ST_GeomFromText('point(1 1)');
+desc t1;
+drop table t1;
+
+#
+# Bug #20691 (DEFAULT over NOT NULL field)
+#
+create table t1 (g geometry not null);
+--error ER_CANT_CREATE_GEOMETRY_OBJECT
+insert into t1 values(default);
+drop table t1;
+
+#
+# Bug #27300: create view with geometry functions lost columns types
+#
+CREATE TABLE t1 (a GEOMETRY);
+CREATE VIEW v1 AS SELECT ST_GeomFromwkb(ST_ASBINARY(a)) FROM t1;
+CREATE VIEW v2 AS SELECT a FROM t1;
+DESCRIBE v1;
+DESCRIBE v2;
+
+DROP VIEW v1,v2;
+DROP TABLE t1;
+
+#
+# Bug#24563: MBROverlaps does not seem to function propertly
+# Bug#54888: MBROverlaps missing in 5.1?
+#
+
+# Test all MBR* functions and their non-MBR-prefixed aliases,
+# using shifted squares to verify the spatial relations.
+
+create table t1 (name VARCHAR(100), square GEOMETRY);
+
+INSERT INTO t1 VALUES("center", ST_GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
+
+INSERT INTO t1 VALUES("small", ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+
+INSERT INTO t1 VALUES("up", ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", ST_GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+
+INSERT INTO t1 VALUES("down", ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", ST_GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+
+INSERT INTO t1 VALUES("right", ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", ST_GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+
+INSERT INTO t1 VALUES("left", ST_GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", ST_GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrtouches FROM t1 a1 JOIN t1 a2 ON MBRTouches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRequals FROM t1 a1 JOIN t1 a2 ON MBREquals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRoverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS ST_touches FROM t1 a1 JOIN t1 a2 ON ST_Touches( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS MBRwithin FROM t1 a1 JOIN t1 a2 ON MBRWithin( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
+
+# MBROverlaps needs a few more tests, with point and line dimensions
+
+# --error ER_GIS_INVALID_DATA
+SET @vert1 = ST_GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz1 = ST_GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz2 = ST_GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz3 = ST_GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+# --error ER_GIS_INVALID_DATA
+SET @point1 = ST_GeomFromText('POLYGON ((0 0))');
+# --error ER_GIS_INVALID_DATA
+SET @point2 = ST_GeomFromText('POLYGON ((-2 0))');
+
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @vert1) GROUP BY a1.name;
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @horiz1) GROUP BY a1.name;
+SELECT MBROverlaps(@horiz1, @vert1) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @horiz2) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @horiz3) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @point1) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @point2) FROM DUAL;
+
+DROP TABLE t1;
+
+#
+# Bug#28763: Selecting geometry fields in UNION caused server crash.
+#
+create table t1(f1 geometry, f2 polygon, f3 linestring);
+select f1 from t1 union select f1 from t1;
+insert into t1 (f2,f3) values (ST_GeomFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))'), ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'));
+select ST_AsText(f2),ST_AsText(f3) from t1;
+select ST_AsText(a) from (select f2 as a from t1 union select f3 from t1) t;
+create table t2 as select f2 as a from t1 union select f3 from t1;
+desc t2;
+select ST_AsText(a) from t2;
+drop table t1, t2;
+
+#
+# Bug #29166: MYsql crash when query is run
+#
+
+# The test query itself is not logged : too large output.
+# The real test is the second query : see if the first hasn't crashed the
+# server
+--disable_query_log
+--disable_result_log
+SELECT ST_AsText(ST_GeometryFromText(CONCAT(
+ 'MULTIPOLYGON(((',
+ REPEAT ('-0.00000000001234567890123456789012 -0.123456789012345678,', 1000),
+ '-0.00000000001234567890123456789012 -0.123456789012345678',
+ ')))'
+))) AS a;
+--enable_result_log
+--enable_query_log
+SELECT 1;
+
+-- source include/gis_keys.inc
+
+#
+# Bug #31155 gis types in union'd select cause crash
+#
+
+create table `t1` (`col002` point)engine=innodb;
+insert into t1 values (),(),();
+# --error ER_WRONG_ARGUMENTS
+select min(`col002`) from t1 union select `col002` from t1;
+drop table t1;
+
+--echo #
+--echo # Bug #47780: crash when comparing GIS items from subquery
+--echo #
+
+CREATE TABLE t1(a INT, b MULTIPOLYGON);
+INSERT INTO t1 VALUES
+ (0,
+ ST_GEOMFROMTEXT(
+ 'multipolygon(((1 2,3 4,5 6,7 8,9 8,1 2,1 2),(7 6,5 4,3 2,1 2,3 4,7 6)))'));
+
+--echo # must not crash
+SELECT 1 FROM t1 WHERE a <> (SELECT ST_GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
+
+DROP TABLE t1;
+
+--echo #
+--echo # Bug #49250 : spatial btree index corruption and crash
+--echo # Part one : spatial syntax check
+--echo #
+
+--error ER_PARSE_ERROR
+CREATE TABLE t1(col1 MULTIPOLYGON NOT NULL,
+ SPATIAL INDEX USING BTREE (col1));
+CREATE TABLE t2(col1 MULTIPOLYGON NOT NULL);
+--error ER_PARSE_ERROR
+CREATE SPATIAL INDEX USING BTREE ON t2(col);
+--error ER_PARSE_ERROR
+ALTER TABLE t2 ADD SPATIAL INDEX USING BTREE (col1);
+
+DROP TABLE t2;
+
+--echo End of 5.0 tests
+
+
+#
+# Bug #11335 View redefines column types
+#
+create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
+create view v1 as select * from t1;
+desc v1;
+drop view v1;
+drop table t1;
+
+#
+# Bug#44684: valgrind reports invalid reads in
+# Item_func_spatial_collection::val_str
+#
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+SELECT MultiPoint(12345,'');
+#SELECT MultiPoint(123451,'');
+#SELECT MultiPoint(1234512,'');
+#SELECT MultiPoint(12345123,'');
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+#SELECT MultiLineString(12345,'');
+#SELECT MultiLineString(123451,'');
+#SELECT MultiLineString(1234512,'');
+#SELECT MultiLineString(12345123,'');
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+#SELECT LineString(12345,'');
+#SELECT LineString(123451,'');
+#SELECT LineString(1234512,'');
+#SELECT LineString(12345123,'');
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+#SELECT Polygon(12345,'');
+#SELECT Polygon(123451,'');
+#SELECT Polygon(1234512,'');
+#SELECT Polygon(12345123,'');
+
+#
+# Bug55531 crash with conversions of geometry types / strings
+#
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+SELECT 1 FROM (SELECT GREATEST(1,GEOMETRYCOLLECTION('00000','00000')) b FROM DUAL) AS d WHERE (LINESTRING(d.b));
+
+
+--echo #
+--echo # BUG#51875: crash when loading data into geometry function ST_polyfromwkb
+--echo #
+SET @a=0x00000000030000000100000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+# --error ER_GIS_INVALID_DATA
+SET @a=ST_POLYFROMWKB(@a);
+SET @a=0x00000000030000000000000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
+# --error ER_GIS_INVALID_DATA
+SET @a=ST_POLYFROMWKB(@a);
+
+
+#
+# Bug #57321 crashes and valgrind errors from spatial types
+#
+
+create table t1(a polygon NOT NULL)engine=innodb;
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+insert into t1 values (ST_geomfromtext("point(0 1)"));
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+insert into t1 values (ST_geomfromtext("point(1 0)"));
+select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
+drop table t1;
+
+
+--echo #
+--echo # Test for bug #59888 "debug assertion when attempt to create spatial index
+--echo # on char > 31 bytes".
+--echo #
+create table t1(a char(32) not null) engine=innodb;
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+create spatial index i on t1 (a);
+drop table t1;
+
+
+--echo End of 5.1 tests
+
+#
+# Bug #50574 5.5.ST_x allows spatial indexes on non-spatial
+# columns, causing crashes!
+# Bug#11767480 SPATIAL INDEXES ON NON-SPATIAL COLUMNS
+# CAUSE CRASHES.
+#
+CREATE TABLE t0 (a BINARY(32) NOT NULL);
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+CREATE SPATIAL INDEX i on t0 (a);
+INSERT INTO t0 VALUES (1);
+
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+CREATE TABLE t1(
+ col0 BINARY NOT NULL,
+ col2 TIMESTAMP,
+ SPATIAL INDEX i1 (col0)
+) ENGINE=MyISAM;
+
+# Test other ways to add indices
+CREATE TABLE t1 (
+ col0 BINARY NOT NULL,
+ col2 TIMESTAMP
+) ENGINE=MyISAM;
+
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+CREATE SPATIAL INDEX idx0 ON t1(col0);
+
+# --error ER_SPATIAL_MUST_HAVE_GEOM_COL
+--error ER_WRONG_ARGUMENTS
+ALTER TABLE t1 ADD SPATIAL INDEX i1 (col0);
+
+CREATE TABLE t2 (
+ col0 INTEGER NOT NULL,
+ col1 POINT,
+ col2 POINT
+);
+
+# --error ER_TOO_MANY_KEY_PARTS
+--error ER_WRONG_ARGUMENTS
+CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
+
+# --error ER_TOO_MANY_KEY_PARTS
+--error ER_WRONG_ARGUMENTS
+CREATE TABLE t3 (
+ col0 INTEGER NOT NULL,
+ col1 POINT,
+ col2 LINESTRING,
+ SPATIAL INDEX i1 (col1, col2)
+);
+
+# cleanup
+DROP TABLE t0, t1, t2;
+
+
+--echo #
+--echo # BUG#12414917 - ST_ISCLOSED() CRASHES ON 64-BIT BUILDS
+--echo #
+# --error ER_GIS_DATA_WRONG_ENDIANESS
+SELECT ST_ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)));
+
+--echo #
+--echo # BUG#12537203 - CRASH WHEN SUBSELECTING GLOBAL VARIABLES IN
+--echo # GEOMETRY FUNCTION ARGUMENTS
+--echo #
+--replace_regex /non geometric .* value/non geometric '' value/
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+SELECT GEOMETRYCOLLECTION((SELECT @@OLD));
+
+
+--echo End of 5.1 tests
+
+
+--echo #
+--echo # Bug#11908153: CRASH AND/OR VALGRIND ERRORS IN FIELD_BLOB::GET_KEY_IMAGE
+--echo #
+
+CREATE TABLE g1
+(a geometry NOT NULL, UNIQUE KEY i (a(151))) engine=innodb;
+
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 1)'));
+INSERT INTO g1 VALUES (ST_geomfromtext('point(1 2)'));
+
+FLUSH TABLES;
+
+SELECT 1 FROM g1
+FORCE INDEX(i) WHERE a = date_sub(now(), interval 2808.4 year_month)
+;
+
+DROP TABLE g1;
+
+--echo #
+--echo # Bug#13013970 MORE CRASHES IN FIELD_BLOB::GET_KEY_IMAGE
+--echo #
+
+CREATE TABLE g1(a TEXT NOT NULL, KEY(a(255)));
+
+INSERT INTO g1 VALUES ('a'),('a');
+# --error ER_GIS_INVALID_DATA
+SELECT 1 FROM g1 WHERE a >= ANY
+(SELECT 1 FROM g1 WHERE a = ST_geomfromtext('') OR a) ;
+
+DROP TABLE g1;
+
+--echo End of 5.5 tests
+
+
+# Conformance tests
+#
+# C.3.3 Geometry types and functions
+#
+
+--disable_warnings
+DROP DATABASE IF EXISTS gis_ogs;
+--enable_warnings
+
+CREATE DATABASE gis_ogs;
+USE gis_ogs;
+
+--echo #
+--echo # C.3.3.1 Geometry types and functions schema construction
+--echo #
+
+# TODO: WL#2377
+#CREATE TABLE spatial_ref_sys (
+#ST_srid INTEGER NOT NULL PRIMARY KEY,
+#auth_name CHARACTER VARYING,
+#auth_srid INTEGER,
+#srtext CHARACTER VARYING(2048));
+
+CREATE TABLE lakes (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ shore POLYGON);
+
+CREATE TABLE road_segments (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ aliases CHARACTER VARYING(64),
+ num_lanes INTEGER,
+ centerline LINESTRING);
+
+CREATE TABLE divided_routes (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ num_lanes INTEGER,
+ centerlines MULTILINESTRING);
+
+CREATE TABLE forests (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ boundary MULTIPOLYGON);
+
+CREATE TABLE bridges (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ position POINT);
+
+CREATE TABLE streams (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ centerline LINESTRING);
+
+CREATE TABLE buildings (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ address CHARACTER VARYING(64),
+ position POINT,
+ footprint POLYGON);
+
+CREATE TABLE ponds (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ type CHARACTER VARYING(64),
+ shores MULTIPOLYGON);
+
+CREATE TABLE named_places (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ name CHARACTER VARYING(64),
+ boundary POLYGON);
+
+CREATE TABLE map_neatlines (
+ fid INTEGER NOT NULL PRIMARY KEY,
+ neatline POLYGON);
+
+--echo #
+--echo # C.3.3.2 Geometry types and functions schema data loading
+--echo #
+
+# TODO: WL#2377
+#-- Spatial Reference System
+#INSERT INTO spatial_ref_sys VALUES
+#(101, 'POSC', 32214, 'PROJCS["UTM_ZONE_14N",
+#GEOGCS["World Geodetic System 72",
+#DATUM["WGS_72",
+#ELLIPSOID["NWL_10D", 6378135, 298.26]],
+#PRIMEM["Greenwich", 0],
+#UNIT["Meter", 1.0]],
+#PROJECTION["Transverse_Mercator"],
+#PARAMETER["False_Easting", 500000.0],
+#PARAMETER["False_Northing", 0.0],
+#PARAMETER["Central_Meridian", -99.0],
+#PARAMETER["Scale_Factor", 0.9996],
+#PARAMETER["Latitude_of_origin", 0.0],
+#UNIT["Meter", 1.0]]');
+
+--echo # Lakes
+INSERT INTO lakes VALUES (
+101, 'BLUE LAKE',
+ST_PolyFromText(
+'POLYGON(
+(52 18,66 23,73 9,48 6,52 18),
+(59 18,67 18,67 13,59 13,59 18)
+)',
+101));
+
+
+--echo # Road Segments
+
+INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+
+INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+ST_LineFromText(
+'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+
+INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+ST_LineFromText(
+'LINESTRING( 70 38, 72 48 )' ,101));
+
+INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+ST_LineFromText(
+'LINESTRING( 70 38, 84 42 )' ,101));
+
+INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+1,
+ST_LineFromText(
+'LINESTRING( 28 26, 28 0 )',101));
+
+--echo # DividedRoutes
+
+INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+ST_MLineFromText(
+'MULTILINESTRING((10 48,10 21,10 0),
+(16 0,16 23,16 48))', 101));
+
+--echo # Forests
+
+INSERT INTO forests VALUES(109, 'Green Forest',
+ST_MPolyFromText(
+'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+101));
+
+--echo # Bridges
+
+INSERT INTO bridges VALUES(110, 'Cam Bridge', ST_PointFromText(
+'POINT( 44 31 )', 101));
+
+--echo # Streams
+
+INSERT INTO streams VALUES(111, 'Cam Stream',
+ST_LineFromText(
+'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+
+INSERT INTO streams VALUES(112, NULL,
+ST_LineFromText(
+'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+
+--echo # Buildings
+
+INSERT INTO buildings VALUES(113, '123 Main Street',
+ST_PointFromText(
+'POINT( 52 30 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+
+INSERT INTO buildings VALUES(114, '215 Main Street',
+ST_PointFromText(
+'POINT( 64 33 )', 101),
+ST_PolyFromText(
+'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+
+
+--echo # Ponds
+
+INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+ST_MPolyFromText(
+'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+
+--echo # Named Places
+
+INSERT INTO named_places VALUES(117, 'Ashton',
+ST_PolyFromText(
+'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+
+INSERT INTO named_places VALUES(118, 'Goose Island',
+ST_PolyFromText(
+'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+
+--echo # Map Neatlines
+
+INSERT INTO map_neatlines VALUES(115,
+ST_PolyFromText(
+'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+
+--echo #
+--echo # C.3.3.3 Geometry types and functions schema test queries
+--echo
+
+# TODO: WL#2377
+#--echo # Conformance Item T1
+#SELECT f_table_name
+#FROM geometry_columns;
+#
+#--echo # Conformance Item T2
+#SELECT f_geometry_column
+#FROM geometry_columns
+#WHERE f_table_name = 'streams';
+#
+#--echo # Conformance Item T3
+#SELECT coord_dimension
+#FROM geometry_columns
+#WHERE f_table_name = 'streams';
+#
+#--echo # Conformance Item T4
+#
+#SELECT ST_srid
+#FROM geometry_columns
+#WHERE f_table_name = 'streams';
+#
+#--echo # Conformance Item T5
+#
+#SELECT srtext
+#FROM SPATIAL_REF_SYS
+#WHERE ST_SRID = 101;
+#
+
+
+--echo # Conformance Item T6
+# TODO: ST_Dimension() alias
+SELECT ST_Dimension(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T7
+# TODO: ST_GeometryType() alias
+SELECT ST_GeometryType(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T8
+# TODO: ST_AsText() alias
+SELECT ST_AsText(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T9
+# TODO: ST_AsBinary(), ST_PolyFromWKB() aliases
+SELECT ST_AsText(ST_PolyFromWKB(ST_AsBinary(boundary),101))
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T10
+# TODO: ST_SRID() alias
+SELECT ST_SRID(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T11
+# TODO: ST_IsEmpty() alias
+SELECT ST_IsEmpty(centerline)
+FROM road_segments
+WHERE name = 'Route 5'
+AND aliases = 'Main Street';
+
+# FIXME: get wrong result:0, expected 1.
+#--echo # Conformance Item T12
+# TODO: ST_IsSimple() alias
+#SELECT ST_IsSimple(shore)
+#FROM lakes
+#WHERE name = 'Blue Lake';
+
+# TODO: WL#2377
+#--echo # Conformance Item T13
+#SELECT ST_AsText(Boundary((boundary),101)
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+--echo # Conformance Item T14
+# TODO: ST_Envelope( ) alias
+# FIXME: we get anticlockwise, GIS suggests clockwise
+SELECT ST_AsText(ST_Envelope(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T15
+# TODO: ST_X() alias
+SELECT ST_X(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+
+--echo # Conformance Item T16
+# TODO: ST_Y() alias
+SELECT ST_Y(position)
+FROM bridges
+WHERE name = 'Cam Bridge';
+
+--echo # Conformance Item T17
+# TODO: ST_StartPoint() alias
+SELECT ST_AsText(ST_StartPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+
+--echo # Conformance Item T18
+# TODO: ST_EndPoint
+SELECT ST_AsText(ST_EndPoint(centerline))
+FROM road_segments
+WHERE fid = 102;
+
+# TODO: WL#2377
+#--echo # Conformance Item T19
+# TODO: ST_LineFromWKB() alias
+#SELECT ST_IsClosed(LineFromWKB(ST_AsBinary(Boundary(boundary)),ST_SRID(boundary)))
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+# TODO: WL#2377
+#--echo # Conformance Item T20
+#SELECT IsRing(LineFromWKB(ST_AsBinary(Boundary(boundary)),ST_SRID(boundary)))
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+--echo # Conformance Item T21
+# TODO: ST_Length() alias
+SELECT ST_Length(centerline)
+FROM road_segments
+WHERE fid = 106;
+
+--echo # Conformance Item T22
+# TODO: ST_NumPoints() alias
+SELECT ST_NumPoints(centerline)
+FROM road_segments
+WHERE fid = 102;
+
+--echo # Conformance Item T23
+# TODO: ST_PointN() alias
+SELECT ST_AsText(ST_PointN(centerline, 1))
+FROM road_segments
+WHERE fid = 102;
+
+--echo # Conformance Item T24
+# TODO: ST_Centroid() alias
+SELECT ST_AsText(ST_Centroid(boundary))
+FROM named_places
+WHERE name = 'Goose Island';
+
+# TODO: WL#2377
+#--echo # Conformance Item T25
+#SELECT MBRContains(boundary, PointOnSurface(boundary))
+#FROM named_places
+#WHERE name = 'Goose Island';
+
+--echo # Conformance Item T26
+# TODO: ST_Area() alias
+SELECT ST_Area(boundary)
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T27
+# TODO: ST_ExteriorRing() alias
+SELECT ST_AsText(ST_ExteriorRing(shore))
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T28
+# TODO: ST_NumInteriorRings() alias
+SELECT ST_NumInteriorRings(shore)
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T29
+# TODO: ST_InteriorRingN() alias
+SELECT ST_AsText(ST_InteriorRingN(shore, 1))
+FROM lakes
+WHERE name = 'Blue Lake';
+
+--echo # Conformance Item T30
+# TODO: ST_NumGeometries() alias
+SELECT ST_NumGeometries(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T31
+# TODO: ST_GeometryN() alias
+SELECT ST_AsText(ST_GeometryN(centerlines, 2))
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T32
+# TODO: ST_IsClosed() alias
+SELECT ST_IsClosed(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T33
+# TODO: ST_Length() alias
+SELECT ST_Length(centerlines)
+FROM divided_routes
+WHERE name = 'Route 75';
+
+--echo # Conformance Item T34
+# TODO: ST_Centroid() alias
+SELECT ST_AsText(ST_Centroid(shores))
+FROM ponds
+WHERE fid = 120;
+
+# TODO: WL#2377
+#--echo # Conformance Item T35
+#SELECT MBRContains(shores, PointOnSurface(shores))
+#FROM ponds
+#WHERE fid = 120;
+
+--echo # Conformance Item T36
+# TODO: ST_Area() alias
+SELECT ST_Area(shores)
+FROM ponds
+WHERE fid = 120;
+
+--echo # Conformance Item T37
+# TODO: ST_PolyFromText() alias
+SELECT ST_Equals(boundary,
+ST_PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',101))
+FROM named_places
+WHERE name = 'Goose Island';
+
+--echo # Conformance Item T38
+SELECT ST_Disjoint(centerlines, boundary)
+FROM divided_routes, named_places
+WHERE divided_routes.name = 'Route 75'
+AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T39
+SELECT ST_Touches(centerline, shore)
+FROM streams, lakes
+WHERE streams.name = 'Cam Stream'
+AND lakes.name = 'Blue Lake';
+
+# FIXME: wrong result: get 0, expected 1
+#--echo # Conformance Item T40
+#SELECT ST_Within(boundary, footprint)
+#FROM named_places, buildings
+#WHERE named_places.name = 'Ashton'
+#AND buildings.address = '215 Main Street';
+
+# FIXME: wrong result: get 0, expected 1
+#--echo # Conformance Item T41
+#SELECT ST_Overlaps(forests.boundary, named_places.boundary)
+#FROM forests, named_places
+#WHERE forests.name = 'Green Forest'
+#AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T42
+# FIXME: TODO: ST_Crosses() alias
+SELECT ST_Crosses(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+
+--echo # Conformance Item T43
+SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+FROM road_segments, divided_routes
+WHERE road_segments.fid = 102
+AND divided_routes.name = 'Route 75';
+
+--echo # Conformance Item T44
+SELECT ST_Contains(forests.boundary, named_places.boundary)
+FROM forests, named_places
+WHERE forests.name = 'Green Forest'
+AND named_places.name = 'Ashton';
+
+# TODO: WL#2377
+#--echo # Conformance Item T45
+#SELECT Relate(forests.boundary, named_places.boundary, 'TTTTTTTTT')
+#FROM forests, named_places
+#WHERE forests.name = 'Green Forest'
+#AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T46
+SELECT ST_Distance(position, boundary)
+FROM bridges, named_places
+WHERE bridges.name = 'Cam Bridge'
+AND named_places.name = 'Ashton';
+
+# FIXME: wrong result: NULL, expected 12
+#--echo # Conformance Item T47
+#SELECT ST_AsText(ST_Intersection(centerline, shore))
+#FROM streams, lakes
+#WHERE streams.name = 'Cam Stream'
+#AND lakes.name = 'Blue Lake';
+
+--echo # Conformance Item T48
+SELECT ST_AsText(ST_Difference(named_places.boundary, forests.boundary))
+FROM named_places, forests
+WHERE named_places.name = 'Ashton'
+AND forests.name = 'Green Forest';
+
+#--echo # Conformance Item T49
+SELECT ST_AsText(ST_Union(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Goose Island';
+
+--echo # Conformance Item T50
+SELECT ST_AsText(ST_SymDifference(shore, boundary))
+FROM lakes, named_places
+WHERE lakes.name = 'Blue Lake'
+AND named_places.name = 'Ashton';
+
+--echo # Conformance Item T51
+SELECT count(*)
+FROM buildings, bridges
+WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+
+# TODO: WL#2377
+#--echo # Conformance Item T52
+#SELECT ST_AsText(ConvexHull(shore))
+#FROM lakes
+#WHERE lakes.name = 'Blue Lake';
+
+DROP DATABASE gis_ogs;
+
+--echo #
+--echo # Bug#13362660 ASSERTION `FIELD_POS < FIELD_COUNT' FAILED. IN PROTOCOL_TEXT::STORE
+--echo #
+
+# --error ER_GIS_INVALID_DATA
+SELECT ST_Union('', ''), md5(1);
diff --git a/mysql-test/suite/innodb_gis/t/precise.test b/mysql-test/suite/innodb_gis/t/precise.test
new file mode 100644
index 00000000000..43cd906782e
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/precise.test
@@ -0,0 +1,144 @@
+-- source include/have_innodb.inc
+-- source include/have_geometry.inc
+
+
+#
+# Spatial objects
+#
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), ST_GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))'));
+select 0, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))'));
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POINT(10 10)'));
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+select 0, ST_Within(ST_GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+select 1, ST_Within(ST_GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), ST_GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))'));
+
+
+create table t1 (g point)engine=innodb;
+insert into t1 values
+(ST_GeomFromText('POINT(2 2)')), (ST_GeomFromText('POINT(2 4)')), (ST_GeomFromText('POINT(2 6)')), (ST_GeomFromText('POINT(2 8)')),
+(ST_GeomFromText('POINT(4 2)')), (ST_GeomFromText('POINT(4 4)')), (ST_GeomFromText('POINT(4 6)')), (ST_GeomFromText('POINT(4 8)')),
+(ST_GeomFromText('POINT(6 2)')), (ST_GeomFromText('POINT(6 4)')), (ST_GeomFromText('POINT(6 6)')), (ST_GeomFromText('POINT(6 8)')),
+(ST_GeomFromText('POINT(8 2)')), (ST_GeomFromText('POINT(8 4)')), (ST_GeomFromText('POINT(8 6)')), (ST_GeomFromText('POINT(8 8)'));
+
+select ST_astext(g) from t1 where ST_Within(g, ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'));
+select 'Contains';
+select ST_astext(g) from t1 where ST_Contains(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
+select 'Intersects';
+select ST_astext(g) from t1 where ST_Intersects(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
+select 'Contains';
+select ST_astext(g) from t1 where ST_Contains(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
+select 'Contains2';
+select ST_astext(g) from t1 where ST_Contains(ST_GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1), (5.01 3.01, 6 5, 9 5, 8 3, 5.01 3.01))'), g);
+
+DROP TABLE t1;
+
+select 0, ST_Within(ST_GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+select 1, ST_Within(ST_GeomFromText('LINESTRING(15 15, 16 16)'), ST_GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
+
+
+select 1, ST_Intersects(ST_GeomFromText('LINESTRING(15 15, 50 50)'), ST_GeomFromText('LINESTRING(50 15, 15 50)'));
+select 1, ST_Intersects(ST_GeomFromText('LINESTRING(15 15, 50 50)'), ST_GeomFromText('LINESTRING(16 16, 51 51)'));
+
+select 1, ST_Intersects(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'));
+
+select ST_astext(ST_Union(ST_geometryfromtext('point(1 1)'), ST_geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')));
+select ST_astext(ST_Intersection(ST_geometryfromtext('point(1 1)'), ST_geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')));
+
+select ST_Intersects(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'));
+select ST_contains(ST_GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), ST_GeomFromText('POINT(5 10)'));
+select ST_Disjoint(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))'));
+select ST_Disjoint(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'));
+select ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'));
+select ST_Overlaps(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))'));
+
+# Distance tests
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), ST_geomfromtext('linestring(0 1, 1 0)'));
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
+select ST_DISTANCE(ST_geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), ST_geomfromtext('point(3 3)'));
+select ST_DISTANCE(ST_geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), ST_geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
+
+
+# Operations tests
+--replace_result 23.85542168674699 23.855421686746986
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')));
+--replace_result 23.85542168674699 23.855421686746986
+select ST_astext(ST_Intersection(ST_GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), ST_GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)')));
+select ST_astext(ST_Intersection(ST_GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), ST_GeomFromText('LINESTRING(50 5, 55 10, 0 45)')));
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('POINT(20 20)')));
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200)')));
+select ST_astext(ST_Intersection(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
+select ST_astext(ST_UNION(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
+
+select ST_astext(ST_intersection(ST_geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), ST_geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')));
+
+select ST_astext(ST_symdifference(ST_geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), ST_geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')));
+select ST_astext(ST_UNION(ST_GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), ST_GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
+
+# Buffer() tests
+--replace_regex /([0-9]+\.[0-9]{4})[0-9]*/\1/
+select ST_astext(ST_buffer(ST_geometryfromtext('point(1 1)'), 1));
+create table t1(geom geometrycollection)engine=innodb;
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# insert into t1 values (ST_geomfromtext('POLYGON((0 0, 10 10, 0 8, 0 0))'));
+# --error ER_CANT_CREATE_GEOMETRY_OBJECT
+# insert into t1 values (ST_geomfromtext('POLYGON((1 1, 10 10, 0 8, 1 1))'));
+--replace_regex /([0-9]+\.[0-9]{4})[0-9]*/\1/
+select ST_astext(geom), ST_area(geom),ST_area(ST_buffer(geom,2)) from t1;
+select ST_NUMPOINTS(ST_EXTERIORRING(ST_buffer(geom,2))) from t1;
+
+set @geom=ST_geomfromtext('LINESTRING(2 1, 4 2, 2 3, 2 5)');
+set @buff=ST_buffer(@geom,1);
+select ST_NUMPOINTS(ST_EXTERIORRING(@buff)) from t1;
+
+# cleanup
+DROP TABLE t1;
+
+#ST_Touches tests
+select st_touches(ST_geomfromtext('point(0 0)'), ST_geomfromtext('point(1 1)'));
+select st_touches(ST_geomfromtext('point(1 1)'), ST_geomfromtext('point(1 1)'));
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 1)'));
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 0)'));
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('point(1 2)'));
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))'));
+select st_touches(ST_geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), ST_geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))'));
+
+#Equals test
+SELECT ST_Equals(ST_PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),ST_PolyFromText('POLYGON((67 13, 67 18, 59 19, 59 13, 59 13, 67 13) )')) as result;
+SELECT ST_Equals(ST_PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),ST_PolyFromText('POLYGON((67 13, 67 18, 59 18, 59 13, 59 13, 67 13) )')) as result;
+SELECT ST_Equals(ST_PointFromText('POINT (12 13)'),ST_PointFromText('POINT (12 13)')) as result;
+
+
+--echo #
+--echo # BUG#11755628/47429: INTERSECTION FUNCTION CRASHED MYSQLD
+--echo # BUG#11759650/51979: UNION/INTERSECTION OF POLYGONS CRASHES MYSQL
+--echo #
+
+# --error ER_GIS_INVALID_DATA
+SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((525000 183300,525400
+183300,525400 18370, 525000 183700,525000 183300))'),
+ST_geomfromtext('POLYGON((525298.67 183511.53,525296.57
+183510.39,525296.42 183510.31,525289.11 183506.62,525283.17
+183503.47,525280.98 183502.26,525278.63 183500.97,525278.39
+183500.84,525276.79 183500,525260.7 183491.55,525263.95
+183484.75,525265.58 183481.95,525278.97 183488.73,525276.5
+183493.45,525275.5 183495.7,525280.35 183498.2,525282.3
+183499.1,525282.2 183499.3,525283.55 183500,525301.75
+183509.35,525304.45 183504.25,525307.85 183504.95,525304.5
+183510.83,525302.81 183513.8,525298.67 183511.53),(525275.06
+183489.89,525272.06 183488.37,525268.94 183494.51,525271.94
+183496.03,525275.06 183489.89),(525263.26 183491.55,525266.15
+183493.04,525269.88 183485.82,525266.99 183484.33,525263.26
+183491.55))'))) st_u;
+
+SET @a=0x0000000001030000000200000005000000000000000000000000000000000000000000000000002440000000000000000000000000000024400000000000002440000000000000000000000000000024400000000000000000000000000000000000000000000000000000F03F000000000000F03F0000000000000040000000000000F03F00000000000000400000000000000040000000000000F03F0000000000000040000000000000F03F000000000000F03F;
+# --error ER_GIS_INVALID_DATA
+SELECT ST_ASTEXT(ST_TOUCHES(@a, ST_GEOMFROMTEXT('point(0 0)'))) t;
+
+
+--source include/gis_debug.inc
diff --git a/mysql-test/suite/innodb_gis/t/rt_precise.test b/mysql-test/suite/innodb_gis/t/rt_precise.test
new file mode 100644
index 00000000000..8049ff02ff1
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/rt_precise.test
@@ -0,0 +1,74 @@
+#*****************************************************************
+# This was a Myisam testcase, converted to InnoDB
+# Since Innodb does not support the spatial key, hence converted
+# Orginal name of the testcase : gis_rt_precise.test
+#*****************************************************************
+--source include/have_innodb.inc
+-- source include/have_geometry.inc
+SET default_storage_engine=InnoDB;
+
+#
+# test of rtree (using with spatial data)
+#
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+CREATE TABLE t1 (
+ fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ g GEOMETRY NOT NULL,
+ KEY gis_key(g(5))
+) ENGINE=InnoDB;
+
+SHOW CREATE TABLE t1;
+
+--disable_query_log
+let $1=150;
+let $2=150;
+while ($1)
+{
+ eval INSERT INTO t1 (g) VALUES (ST_GeomFromText('LineString($1 $1, $2 $2)'));
+ dec $1;
+ inc $2;
+}
+--enable_query_log
+
+SELECT count(*) FROM t1;
+
+ANALYZE TABLE t1;
+
+--replace_column 10 #
+EXPLAIN SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g, ST_GeomFromText('Polygon((140 140,160 140,160 160,140 140))'));
+SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g, ST_GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))')) ORDER BY fid;
+
+DROP TABLE t1;
+
+CREATE TABLE t1 (
+ fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ g GEOMETRY NOT NULL
+) ENGINE=InnoDB;
+
+--disable_query_log
+let $1=10;
+while ($1)
+{
+ let $2=10;
+ while ($2)
+ {
+ eval INSERT INTO t1 (g) VALUES (LineString(Point($1 * 10 - 9, $2 * 10 - 9), Point($1 * 10, $2 * 10)));
+ dec $2;
+ }
+ dec $1;
+}
+--enable_query_log
+
+#--error 1464
+ALTER TABLE t1 ADD SPATIAL KEY(g);
+SHOW CREATE TABLE t1;
+SELECT count(*) FROM t1;
+SELECT fid, ST_AsText(g) FROM t1 WHERE ST_Within(g,
+ ST_GeomFromText('Polygon((40 40,60 40,60 60,40 40))')) ORDER BY fid;
+
+DROP TABLE t1;
+
+--echo End of 5.5 tests.
diff --git a/mysql-test/suite/innodb_gis/t/rtree.test b/mysql-test/suite/innodb_gis/t/rtree.test
new file mode 100644
index 00000000000..3a0e5311b32
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/rtree.test
@@ -0,0 +1,236 @@
+# WL#6745 InnoDB R-tree support
+# This test case will test basic R-tree support features.
+
+# Not supported in embedded
+--source include/not_embedded.inc
+
+--source include/have_innodb.inc
+
+# Create table with R-tree index.
+create table t1 (i int, g geometry not null, spatial index (g))engine=innodb;
+
+# Insert values.
+insert into t1 values (1, POINT(1,1));
+insert into t1 values (1, POINT(1.5,1.5));
+insert into t1 values (1, POINT(3,3));
+insert into t1 values (1, POINT(3.1,3.1));
+insert into t1 values (1, POINT(5,5));
+
+analyze table t1;
+
+# Select by R-tree index.
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+explain select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+
+# Delete values.
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+delete from t1 where MBRWithin(t1.g, @g1);
+check table t1;
+
+select ST_astext(t1.g) from t1;
+
+# Update values.
+set @g1 = ST_GeomFromText('Polygon((5 5,5 5,5 5,5 5,5 5))');
+update t1 set g = POINT(2,2) where MBRWithin(t1.g, @g1);
+check table t1;
+
+select ST_astext(t1.g) from t1;
+
+# Show index.
+--replace_column 7 #
+show indexes from t1;
+
+# Cleanup.
+drop table t1;
+
+# Test functions.
+create table t1 (name VARCHAR(100), square GEOMETRY not null, spatial index (square))engine=innodb;
+
+
+INSERT INTO t1 VALUES("small", ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
+INSERT INTO t1 VALUES("big", ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
+
+INSERT INTO t1 VALUES("up", ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
+INSERT INTO t1 VALUES("up2", ST_GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
+INSERT INTO t1 VALUES("up3", ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
+
+INSERT INTO t1 VALUES("down", ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
+INSERT INTO t1 VALUES("down2", ST_GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
+INSERT INTO t1 VALUES("down3", ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
+
+INSERT INTO t1 VALUES("right", ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
+INSERT INTO t1 VALUES("right2", ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
+INSERT INTO t1 VALUES("right3", ST_GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
+
+INSERT INTO t1 VALUES("left", ST_GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
+INSERT INTO t1 VALUES("left2", ST_GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
+INSERT INTO t1 VALUES("left3", ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
+
+SET @p = ST_GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))');
+SELECT name, ST_AsText(square) from t1 where MBRContains(@p, square);
+SELECT name, ST_AsText(square) from t1 where MBRDisjoint(@p, square);
+SELECT name, ST_AsText(square) from t1 where MBREquals(@p, square);
+SELECT name, ST_AsText(square) from t1 where MBRIntersects(@p, square);
+SELECT name, ST_AsText(square) from t1 where MBROverlaps(@p, square);
+SELECT name, ST_AsText(square) from t1 where MBRTouches(@p, square);
+SELECT name, ST_AsText(square) from t1 where MBRWithin(@p, square);
+
+# MBROverlaps needs a few more tests, with point and line dimensions
+
+# --error ER_GIS_INVALID_DATA
+SET @vert1 = ST_GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz1 = ST_GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz2 = ST_GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
+# --error ER_GIS_INVALID_DATA
+SET @horiz3 = ST_GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
+# --error ER_GIS_INVALID_DATA
+SET @point1 = ST_GeomFromText('POLYGON ((0 0))');
+# --error ER_GIS_INVALID_DATA
+SET @point2 = ST_GeomFromText('POLYGON ((-2 0))');
+
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @vert1) GROUP BY a1.name;
+SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS MBRoverlaps FROM t1 a1 WHERE MBROverlaps(a1.square, @horiz1) GROUP BY a1.name;
+SELECT MBROverlaps(@horiz1, @vert1) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @horiz2) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @horiz3) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @point1) FROM DUAL;
+SELECT MBROverlaps(@horiz1, @point2) FROM DUAL;
+
+DROP TABLE t1;
+
+# Inplace create spatial index is not supported
+create table t1 (i int not null, g geometry not null)engine=innodb;
+
+# Insert values.
+insert into t1 values (1, POINT(1,1));
+insert into t1 values (2, POINT(1.5,1.5));
+insert into t1 values (3, POINT(3,3));
+insert into t1 values (4, POINT(3.1,3.1));
+insert into t1 values (5, POINT(5,5));
+
+# alter table t1 add primary key(i), algorithm=inplace;
+alter table t1 add primary key(i);
+alter table t1 drop primary key;
+
+# create spatial index idx on t1(g) algorithm=inplace;
+create spatial index idx on t1(g);
+
+create spatial index idx2 on t1(g);
+
+# alter table t1 add primary key(i), algorithm=inplace;
+alter table t1 add primary key(i);
+
+show create table t1;
+
+drop index idx on t1;
+
+drop table t1;
+
+#Test multi pk table.
+create table t1 (i int, i2 char(10), g geometry not null, primary key (i, i2), spatial index (g))engine=innodb;
+
+# Insert values.
+insert into t1 values (1, "111", POINT(1,1));
+insert into t1 values (2, "222", POINT(1.5,1.5));
+insert into t1 values (3, "333", POINT(3,3));
+insert into t1 values (4, "444", POINT(3.1,3.1));
+insert into t1 values (5, "555", POINT(5,5));
+
+analyze table t1;
+
+# Select by R-tree index.
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+explain select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+select ST_astext(t1.g) from t1 where MBRWithin(t1.g, @g1);
+
+# Delete values.
+set @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
+delete from t1 where MBRWithin(t1.g, @g1);
+check table t1;
+
+select ST_astext(t1.g) from t1;
+
+# Update values.
+set @g1 = ST_GeomFromText('Polygon((5 5,5 5,5 5,5 5,5 5))');
+update t1 set g = POINT(2,2) where MBRWithin(t1.g, @g1);
+check table t1;
+
+select ST_astext(t1.g) from t1;
+
+# Show index.
+--replace_column 7 #
+show indexes from t1;
+
+# Cleanup.
+drop table t1;
+
+CREATE TABLE `t1` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `way` geometry NOT NULL,
+ PRIMARY KEY (`id`),
+ SPATIAL KEY `way` (`way`)
+) ENGINE=InnoDB;
+
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(1 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(2 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(3 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(4 5)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 1)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 2)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 3)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 4)');
+INSERT INTO t1 SET way = ST_GeomFromText('POINT(5 5)');
+
+SELECT COUNT(*)
+ FROM t1
+ WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((2 2,4 2, 4 4, 2 4, 2 2))'),way);
+
+OPTIMIZE TABLE t1;
+
+SELECT COUNT(*)
+ FROM t1
+ WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((2 2,4 2, 4 4, 2 4, 2 2))'),way);
+
+
+DROP TABLE t1;
+
+# Check the update with unchanged MBR optimization.
+# Create table with R-tree index.
+CREATE TABLE t1( i INT, g GEOMETRY NOT NULL, SPATIAL INDEX (g)) ENGINE=InnoDB;
+
+# Insert values.
+INSERT INTO t1 VALUES(1, LINESTRING(POINT(1,1), POINT(4, 4)));
+INSERT INTO t1 VALUES(2, LINESTRING(POINT(2,2), POINT(5, 5)));
+
+# Update value.
+UPDATE t1 SET g = LINESTRING(POINT(1,1), POINT(2,2), POINT(3,3), POINT(4,4))
+ WHERE i = 1;
+UPDATE t1 SET g = LINESTRING(POINT(1,1), POINT(2,2), POINT(3,3), POINT(8,8))
+ WHERE i = 2;
+
+
+CHECK TABLE t1;
+
+DELETE FROM t1
+ WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((0 0,4 0, 4 4, 0 4, 0 0))'),g);
+
+DROP TABLE t1;
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 9a1a5c62b5b..fb8aaf3d8f3 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -6655,6 +6655,7 @@ static Native_func_registry func_array[] =
{ { C_STRING_WITH_LEN("MBRCONTAINS") }, GEOM_BUILDER(Create_func_mbr_contains)},
{ { C_STRING_WITH_LEN("MBRDISJOINT") }, GEOM_BUILDER(Create_func_mbr_disjoint)},
{ { C_STRING_WITH_LEN("MBREQUAL") }, GEOM_BUILDER(Create_func_mbr_equals)},
+ { { C_STRING_WITH_LEN("MBREQUALS") }, GEOM_BUILDER(Create_func_mbr_equals)},
{ { C_STRING_WITH_LEN("MBRINTERSECTS") }, GEOM_BUILDER(Create_func_mbr_intersects)},
{ { C_STRING_WITH_LEN("MBROVERLAPS") }, GEOM_BUILDER(Create_func_mbr_overlaps)},
{ { C_STRING_WITH_LEN("MBRTOUCHES") }, GEOM_BUILDER(Create_func_touches)},
diff --git a/storage/innobase/include/fil0fil.ic b/storage/innobase/include/fil0fil.ic
index ae350333a16..8f8a4194c0d 100644
--- a/storage/innobase/include/fil0fil.ic
+++ b/storage/innobase/include/fil0fil.ic
@@ -63,6 +63,8 @@ fil_get_page_type_name(
return (const char*)"PAGE_COMPRESSED";
case FIL_PAGE_INDEX:
return (const char*)"INDEX";
+ case FIL_PAGE_RTREE:
+ return (const char*)"RTREE";
case FIL_PAGE_UNDO_LOG:
return (const char*)"UNDO LOG";
case FIL_PAGE_INODE:
@@ -130,6 +132,7 @@ fil_page_type_validate(
if (!((page_type == FIL_PAGE_PAGE_COMPRESSED ||
page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED ||
page_type == FIL_PAGE_INDEX ||
+ page_type == FIL_PAGE_RTREE ||
page_type == FIL_PAGE_UNDO_LOG ||
page_type == FIL_PAGE_INODE ||
page_type == FIL_PAGE_IBUF_FREE_LIST ||
@@ -169,6 +172,7 @@ fil_page_type_validate(
ut_ad(page_type == FIL_PAGE_PAGE_COMPRESSED ||
page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED ||
page_type == FIL_PAGE_INDEX ||
+ page_type == FIL_PAGE_RTREE ||
page_type == FIL_PAGE_UNDO_LOG ||
page_type == FIL_PAGE_INODE ||
page_type == FIL_PAGE_IBUF_FREE_LIST ||