1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-19177: Geometry support by the partition feature.

Remove the limitation, add tests.
This commit is contained in:
Alexey Botchkov
2023-11-18 21:05:28 +04:00
parent bc6b6cf6a7
commit 9e76d94ef0
5 changed files with 221 additions and 4 deletions

View File

@ -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';

View File

@ -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';

View File

@ -1093,7 +1093,7 @@ PARTITION pNorth VALUES IN (10,20,30) ,
PARTITION pEast VALUES IN (40,50,60) , PARTITION pEast VALUES IN (40,50,60) ,
PARTITION pWest VALUES IN (70,80,100) 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 #check start transaction commit & Rollback
START TRANSACTION; START TRANSACTION;
DELETE FROM tab3; DELETE FROM tab3;

View File

@ -648,7 +648,7 @@ CREATE TABLE child (id GEOMETRY, parent_id GEOMETRY,
) ENGINE=INNODB; ) ENGINE=INNODB;
--echo #check partition table support --echo #check partition table support
--error 1178 --error ER_BLOB_FIELD_IN_PART_FUNC_ERROR
CREATE TABLE emp2( CREATE TABLE emp2(
id GEOMETRY NOT NULL, id GEOMETRY NOT NULL,
store_name VARCHAR(30), store_name VARCHAR(30),

View File

@ -75,8 +75,7 @@
HA_REC_NOT_IN_SEQ | \ HA_REC_NOT_IN_SEQ | \
HA_CAN_REPAIR | \ HA_CAN_REPAIR | \
HA_REUSES_FILE_NAMES) HA_REUSES_FILE_NAMES)
#define PARTITION_DISABLED_TABLE_FLAGS (HA_CAN_GEOMETRY | \ #define PARTITION_DISABLED_TABLE_FLAGS (HA_DUPLICATE_POS | \
HA_DUPLICATE_POS | \
HA_CAN_INSERT_DELAYED | \ HA_CAN_INSERT_DELAYED | \
HA_READ_BEFORE_WRITE_REMOVAL |\ HA_READ_BEFORE_WRITE_REMOVAL |\
HA_CAN_TABLES_WITHOUT_ROLLBACK) HA_CAN_TABLES_WITHOUT_ROLLBACK)