diff --git a/mysql-test/main/partition_geometries.result b/mysql-test/main/partition_geometries.result new file mode 100644 index 00000000000..ec63b92b3da --- /dev/null +++ b/mysql-test/main/partition_geometries.result @@ -0,0 +1,125 @@ +# +# MDEV-19177: Geometry support for partition feature +# Test partition/geometry type cross-compatibility for the 4 storage engines that support +# geometries (Aria, MyISAM, InnoDB, Archive) +# Geometries to test - point, multipolygon, geometry collection +# Note: Archive does not support additional indices. +# +SET @point = Point(3,3); +SET @poly = MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))); +SET @collection = GeometryCollection(Point(1,1), Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))); +# +# Aria engine +# +CREATE TABLE t1 ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`geom` geometry NOT NULL, +PRIMARY KEY (id), +SPATIAL INDEX(geom) +) Engine=Aria PARTITION BY HASH (id) +PARTITIONS 10; +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +ST_AsGeoJSON(geom) +{"type": "Point", "coordinates": [3, 3]} +{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]} +{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]} +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `geom` (`geom`) +) ENGINE=Aria AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`id`) +PARTITIONS 10 +DROP TABLE t1; +# +# MyISAM engine +# +CREATE TABLE t1 ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`geom` geometry NOT NULL, +PRIMARY KEY (id), +SPATIAL INDEX(geom) +) Engine=myisam PARTITION BY HASH (id) +PARTITIONS 10; +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +ST_AsGeoJSON(geom) +{"type": "Point", "coordinates": [3, 3]} +{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]} +{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]} +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `geom` (`geom`) +) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`id`) +PARTITIONS 10 +DROP TABLE t1; +# +# InnoDB engine +# +CREATE TABLE t1 ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`geom` geometry NOT NULL, +PRIMARY KEY (id), +SPATIAL INDEX(geom) +) Engine=innodb PARTITION BY HASH (id) +PARTITIONS 10; +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +ST_AsGeoJSON(geom) +{"type": "Point", "coordinates": [3, 3]} +{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]} +{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]} +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `geom` (`geom`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`id`) +PARTITIONS 10 +DROP TABLE t1; +# +# Archive engine +# +INSTALL SONAME 'ha_archive'; +CREATE TABLE t1 ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`geom` geometry, +SPATIAL INDEX(geom) +) Engine=archive PARTITION BY HASH (id) +PARTITIONS 10; +ERROR HY000: The storage engine partition doesn't support SPATIAL indexes +CREATE TABLE t1 ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`geom` geometry, +PRIMARY KEY (id) +) Engine=archive PARTITION BY HASH (id) +PARTITIONS 10; +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +ST_AsGeoJSON(geom) +{"type": "Point", "coordinates": [3, 3]} +{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]} +{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]} +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=ARCHIVE AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`id`) +PARTITIONS 10 +DROP TABLE t1; +UNINSTALL SONAME 'ha_archive'; diff --git a/mysql-test/main/partition_geometries.test b/mysql-test/main/partition_geometries.test new file mode 100644 index 00000000000..34e72463058 --- /dev/null +++ b/mysql-test/main/partition_geometries.test @@ -0,0 +1,93 @@ +-- source include/have_geometry.inc + +if (!$HA_ARCHIVE_SO) { + skip Needs Archive plugin; +} + +--echo # +--echo # MDEV-19177: Geometry support for partition feature +--echo # Test partition/geometry type cross-compatibility for the 4 storage engines that support +--echo # geometries (Aria, MyISAM, InnoDB, Archive) +--echo # Geometries to test - point, multipolygon, geometry collection +--echo # Note: Archive does not support additional indices. +--echo # +SET @point = Point(3,3); +SET @poly = MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))); +SET @collection = GeometryCollection(Point(1,1), Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))); + +--source include/have_partition.inc + +--echo # +--echo # Aria engine +--echo # +CREATE TABLE t1 ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry NOT NULL, + PRIMARY KEY (id), + SPATIAL INDEX(geom) +) Engine=Aria PARTITION BY HASH (id) +PARTITIONS 10; + +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # MyISAM engine +--echo # +CREATE TABLE t1 ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry NOT NULL, + PRIMARY KEY (id), + SPATIAL INDEX(geom) +) Engine=myisam PARTITION BY HASH (id) +PARTITIONS 10; + +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # InnoDB engine +--echo # +--source include/have_innodb.inc +CREATE TABLE t1 ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry NOT NULL, + PRIMARY KEY (id), + SPATIAL INDEX(geom) +) Engine=innodb PARTITION BY HASH (id) +PARTITIONS 10; + +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # Archive engine +--echo # + +INSTALL SONAME 'ha_archive'; +--error ER_TABLE_CANT_HANDLE_SPKEYS +CREATE TABLE t1 ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry, + SPATIAL INDEX(geom) +) Engine=archive PARTITION BY HASH (id) +PARTITIONS 10; +CREATE TABLE t1 ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `geom` geometry, + PRIMARY KEY (id) +) Engine=archive PARTITION BY HASH (id) +PARTITIONS 10; + +INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection); +SELECT ST_AsGeoJSON(geom) FROM t1; +SHOW CREATE TABLE t1; +DROP TABLE t1; +UNINSTALL SONAME 'ha_archive'; + diff --git a/mysql-test/suite/innodb_gis/r/geometry.result b/mysql-test/suite/innodb_gis/r/geometry.result index c38e9e28d85..d4d4abe0c93 100644 --- a/mysql-test/suite/innodb_gis/r/geometry.result +++ b/mysql-test/suite/innodb_gis/r/geometry.result @@ -1093,7 +1093,7 @@ PARTITION pNorth VALUES IN (10,20,30) , PARTITION pEast VALUES IN (40,50,60) , PARTITION pWest VALUES IN (70,80,100) ); -ERROR 42000: The storage engine for the table doesn't support GEOMETRY +ERROR HY000: A BLOB field is not allowed in partition function #check start transaction commit & Rollback START TRANSACTION; DELETE FROM tab3; diff --git a/mysql-test/suite/innodb_gis/t/geometry.test b/mysql-test/suite/innodb_gis/t/geometry.test index 4e8f0f729b5..fe19deb3b7a 100644 --- a/mysql-test/suite/innodb_gis/t/geometry.test +++ b/mysql-test/suite/innodb_gis/t/geometry.test @@ -648,7 +648,7 @@ CREATE TABLE child (id GEOMETRY, parent_id GEOMETRY, ) ENGINE=INNODB; --echo #check partition table support ---error 1178 +--error ER_BLOB_FIELD_IN_PART_FUNC_ERROR CREATE TABLE emp2( id GEOMETRY NOT NULL, store_name VARCHAR(30), diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index f8d8868913b..3b04e5c0c2d 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -75,8 +75,7 @@ HA_REC_NOT_IN_SEQ | \ HA_CAN_REPAIR | \ HA_REUSES_FILE_NAMES) -#define PARTITION_DISABLED_TABLE_FLAGS (HA_CAN_GEOMETRY | \ - HA_DUPLICATE_POS | \ +#define PARTITION_DISABLED_TABLE_FLAGS (HA_DUPLICATE_POS | \ HA_CAN_INSERT_DELAYED | \ HA_READ_BEFORE_WRITE_REMOVAL |\ HA_CAN_TABLES_WITHOUT_ROLLBACK)