Skip to content

Commit 9e76d94

Browse files
author
Alexey Botchkov
committed
MDEV-19177: Geometry support by the partition feature.
Remove the limitation, add tests.
1 parent bc6b6cf commit 9e76d94

File tree

5 files changed

+221
-4
lines changed

5 files changed

+221
-4
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#
2+
# MDEV-19177: Geometry support for partition feature
3+
# Test partition/geometry type cross-compatibility for the 4 storage engines that support
4+
# geometries (Aria, MyISAM, InnoDB, Archive)
5+
# Geometries to test - point, multipolygon, geometry collection
6+
# Note: Archive does not support additional indices.
7+
#
8+
SET @point = Point(3,3);
9+
SET @poly = MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))));
10+
SET @collection = GeometryCollection(Point(1,1), Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))));
11+
#
12+
# Aria engine
13+
#
14+
CREATE TABLE t1 (
15+
`id` int(11) NOT NULL AUTO_INCREMENT,
16+
`geom` geometry NOT NULL,
17+
PRIMARY KEY (id),
18+
SPATIAL INDEX(geom)
19+
) Engine=Aria PARTITION BY HASH (id)
20+
PARTITIONS 10;
21+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
22+
SELECT ST_AsGeoJSON(geom) FROM t1;
23+
ST_AsGeoJSON(geom)
24+
{"type": "Point", "coordinates": [3, 3]}
25+
{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]}
26+
{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]}
27+
SHOW CREATE TABLE t1;
28+
Table Create Table
29+
t1 CREATE TABLE `t1` (
30+
`id` int(11) NOT NULL AUTO_INCREMENT,
31+
`geom` geometry NOT NULL,
32+
PRIMARY KEY (`id`),
33+
SPATIAL KEY `geom` (`geom`)
34+
) ENGINE=Aria AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
35+
PARTITION BY HASH (`id`)
36+
PARTITIONS 10
37+
DROP TABLE t1;
38+
#
39+
# MyISAM engine
40+
#
41+
CREATE TABLE t1 (
42+
`id` int(11) NOT NULL AUTO_INCREMENT,
43+
`geom` geometry NOT NULL,
44+
PRIMARY KEY (id),
45+
SPATIAL INDEX(geom)
46+
) Engine=myisam PARTITION BY HASH (id)
47+
PARTITIONS 10;
48+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
49+
SELECT ST_AsGeoJSON(geom) FROM t1;
50+
ST_AsGeoJSON(geom)
51+
{"type": "Point", "coordinates": [3, 3]}
52+
{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]}
53+
{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]}
54+
SHOW CREATE TABLE t1;
55+
Table Create Table
56+
t1 CREATE TABLE `t1` (
57+
`id` int(11) NOT NULL AUTO_INCREMENT,
58+
`geom` geometry NOT NULL,
59+
PRIMARY KEY (`id`),
60+
SPATIAL KEY `geom` (`geom`)
61+
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
62+
PARTITION BY HASH (`id`)
63+
PARTITIONS 10
64+
DROP TABLE t1;
65+
#
66+
# InnoDB engine
67+
#
68+
CREATE TABLE t1 (
69+
`id` int(11) NOT NULL AUTO_INCREMENT,
70+
`geom` geometry NOT NULL,
71+
PRIMARY KEY (id),
72+
SPATIAL INDEX(geom)
73+
) Engine=innodb PARTITION BY HASH (id)
74+
PARTITIONS 10;
75+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
76+
SELECT ST_AsGeoJSON(geom) FROM t1;
77+
ST_AsGeoJSON(geom)
78+
{"type": "Point", "coordinates": [3, 3]}
79+
{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]}
80+
{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]}
81+
SHOW CREATE TABLE t1;
82+
Table Create Table
83+
t1 CREATE TABLE `t1` (
84+
`id` int(11) NOT NULL AUTO_INCREMENT,
85+
`geom` geometry NOT NULL,
86+
PRIMARY KEY (`id`),
87+
SPATIAL KEY `geom` (`geom`)
88+
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
89+
PARTITION BY HASH (`id`)
90+
PARTITIONS 10
91+
DROP TABLE t1;
92+
#
93+
# Archive engine
94+
#
95+
INSTALL SONAME 'ha_archive';
96+
CREATE TABLE t1 (
97+
`id` int(11) NOT NULL AUTO_INCREMENT,
98+
`geom` geometry,
99+
SPATIAL INDEX(geom)
100+
) Engine=archive PARTITION BY HASH (id)
101+
PARTITIONS 10;
102+
ERROR HY000: The storage engine partition doesn't support SPATIAL indexes
103+
CREATE TABLE t1 (
104+
`id` int(11) NOT NULL AUTO_INCREMENT,
105+
`geom` geometry,
106+
PRIMARY KEY (id)
107+
) Engine=archive PARTITION BY HASH (id)
108+
PARTITIONS 10;
109+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
110+
SELECT ST_AsGeoJSON(geom) FROM t1;
111+
ST_AsGeoJSON(geom)
112+
{"type": "Point", "coordinates": [3, 3]}
113+
{"type": "MultiPolygon", "coordinates": [[[[0, 3], [3, 3], [3, 0], [0, 3]]]]}
114+
{"type": "GeometryCollection", "geometries": [{"type": "Point", "coordinates": [1, 1]}, {"type": "Polygon", "coordinates": [[[0, 3], [3, 3], [3, 0], [0, 3]]]}]}
115+
SHOW CREATE TABLE t1;
116+
Table Create Table
117+
t1 CREATE TABLE `t1` (
118+
`id` int(11) NOT NULL AUTO_INCREMENT,
119+
`geom` geometry DEFAULT NULL,
120+
PRIMARY KEY (`id`)
121+
) ENGINE=ARCHIVE AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
122+
PARTITION BY HASH (`id`)
123+
PARTITIONS 10
124+
DROP TABLE t1;
125+
UNINSTALL SONAME 'ha_archive';
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
-- source include/have_geometry.inc
2+
3+
if (!$HA_ARCHIVE_SO) {
4+
skip Needs Archive plugin;
5+
}
6+
7+
--echo #
8+
--echo # MDEV-19177: Geometry support for partition feature
9+
--echo # Test partition/geometry type cross-compatibility for the 4 storage engines that support
10+
--echo # geometries (Aria, MyISAM, InnoDB, Archive)
11+
--echo # Geometries to test - point, multipolygon, geometry collection
12+
--echo # Note: Archive does not support additional indices.
13+
--echo #
14+
SET @point = Point(3,3);
15+
SET @poly = MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))));
16+
SET @collection = GeometryCollection(Point(1,1), Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))));
17+
18+
--source include/have_partition.inc
19+
20+
--echo #
21+
--echo # Aria engine
22+
--echo #
23+
CREATE TABLE t1 (
24+
`id` int(11) NOT NULL AUTO_INCREMENT,
25+
`geom` geometry NOT NULL,
26+
PRIMARY KEY (id),
27+
SPATIAL INDEX(geom)
28+
) Engine=Aria PARTITION BY HASH (id)
29+
PARTITIONS 10;
30+
31+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
32+
SELECT ST_AsGeoJSON(geom) FROM t1;
33+
SHOW CREATE TABLE t1;
34+
DROP TABLE t1;
35+
36+
--echo #
37+
--echo # MyISAM engine
38+
--echo #
39+
CREATE TABLE t1 (
40+
`id` int(11) NOT NULL AUTO_INCREMENT,
41+
`geom` geometry NOT NULL,
42+
PRIMARY KEY (id),
43+
SPATIAL INDEX(geom)
44+
) Engine=myisam PARTITION BY HASH (id)
45+
PARTITIONS 10;
46+
47+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
48+
SELECT ST_AsGeoJSON(geom) FROM t1;
49+
SHOW CREATE TABLE t1;
50+
DROP TABLE t1;
51+
52+
--echo #
53+
--echo # InnoDB engine
54+
--echo #
55+
--source include/have_innodb.inc
56+
CREATE TABLE t1 (
57+
`id` int(11) NOT NULL AUTO_INCREMENT,
58+
`geom` geometry NOT NULL,
59+
PRIMARY KEY (id),
60+
SPATIAL INDEX(geom)
61+
) Engine=innodb PARTITION BY HASH (id)
62+
PARTITIONS 10;
63+
64+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
65+
SELECT ST_AsGeoJSON(geom) FROM t1;
66+
SHOW CREATE TABLE t1;
67+
DROP TABLE t1;
68+
69+
--echo #
70+
--echo # Archive engine
71+
--echo #
72+
73+
INSTALL SONAME 'ha_archive';
74+
--error ER_TABLE_CANT_HANDLE_SPKEYS
75+
CREATE TABLE t1 (
76+
`id` int(11) NOT NULL AUTO_INCREMENT,
77+
`geom` geometry,
78+
SPATIAL INDEX(geom)
79+
) Engine=archive PARTITION BY HASH (id)
80+
PARTITIONS 10;
81+
CREATE TABLE t1 (
82+
`id` int(11) NOT NULL AUTO_INCREMENT,
83+
`geom` geometry,
84+
PRIMARY KEY (id)
85+
) Engine=archive PARTITION BY HASH (id)
86+
PARTITIONS 10;
87+
88+
INSERT INTO t1 VALUES (NULL, @point), (NULL, @poly), (NULL, @collection);
89+
SELECT ST_AsGeoJSON(geom) FROM t1;
90+
SHOW CREATE TABLE t1;
91+
DROP TABLE t1;
92+
UNINSTALL SONAME 'ha_archive';
93+

mysql-test/suite/innodb_gis/r/geometry.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,7 @@ PARTITION pNorth VALUES IN (10,20,30) ,
10931093
PARTITION pEast VALUES IN (40,50,60) ,
10941094
PARTITION pWest VALUES IN (70,80,100)
10951095
);
1096-
ERROR 42000: The storage engine for the table doesn't support GEOMETRY
1096+
ERROR HY000: A BLOB field is not allowed in partition function
10971097
#check start transaction commit & Rollback
10981098
START TRANSACTION;
10991099
DELETE FROM tab3;

mysql-test/suite/innodb_gis/t/geometry.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ CREATE TABLE child (id GEOMETRY, parent_id GEOMETRY,
648648
) ENGINE=INNODB;
649649

650650
--echo #check partition table support
651-
--error 1178
651+
--error ER_BLOB_FIELD_IN_PART_FUNC_ERROR
652652
CREATE TABLE emp2(
653653
id GEOMETRY NOT NULL,
654654
store_name VARCHAR(30),

sql/ha_partition.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@
7575
HA_REC_NOT_IN_SEQ | \
7676
HA_CAN_REPAIR | \
7777
HA_REUSES_FILE_NAMES)
78-
#define PARTITION_DISABLED_TABLE_FLAGS (HA_CAN_GEOMETRY | \
79-
HA_DUPLICATE_POS | \
78+
#define PARTITION_DISABLED_TABLE_FLAGS (HA_DUPLICATE_POS | \
8079
HA_CAN_INSERT_DELAYED | \
8180
HA_READ_BEFORE_WRITE_REMOVAL |\
8281
HA_CAN_TABLES_WITHOUT_ROLLBACK)

0 commit comments

Comments
 (0)