diff options
Diffstat (limited to 'mysql-test/suite/innodb_gis/r/point_basic.result')
-rw-r--r-- | mysql-test/suite/innodb_gis/r/point_basic.result | 1608 |
1 files changed, 1608 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb_gis/r/point_basic.result b/mysql-test/suite/innodb_gis/r/point_basic.result new file mode 100644 index 00000000..f5819839 --- /dev/null +++ b/mysql-test/suite/innodb_gis/r/point_basic.result @@ -0,0 +1,1608 @@ +# +# Test for basic POINT operation +# +CREATE TABLE gis_point(p1 POINT, p2 POINT) ENGINE=InnoDB; +INSERT INTO gis_point VALUES +(ST_PointFromText('POINT(0 0)'), ST_PointFromText('POINT(0 0)')), +(ST_PointFromText('POINT(10 -20)'), ST_PointFromText('POINT(10 -20)')), +(ST_PointFromText('POINT(3.1415926 3.535897)'), ST_PointFromText('POINT(-3.932626 -3.488272)')), +(ST_PointFromText('POINT(-111.9876 234.1357)'), ST_PointFromText('POINT(-957.1914 958.1919)')); +SELECT ST_X(p1), ST_Y(p2) FROM gis_point; +ST_X(p1) ST_Y(p2) +0 0 +10 -20 +3.1415926 -3.488272 +-111.9876 958.1919 +DROP TABLE gis_point; +# +# Test when POINT is not on any indexes +# +CREATE TABLE gis_point(p1 POINT, p2 POINT) ENGINE=InnoDB; +INSERT INTO gis_point VALUES +(ST_PointFromText('POINT(100.32374832 101.23741821)'), ST_PointFromText('POINT(100.32374832 101.23741821)')), +(ST_PointFromText('POINT(105.34523342 103.18492302)'), ST_PointFromText('POINT(100.32374832 101.23741821)')), +(ST_PointFromText('POINT(100.32374832 101.23741821)'), ST_PointFromText('POINT(200.32247328 101.86728201)')), +(ST_PointFromText('POINT(100.32374832 101.23741821)'), ST_PointFromText('POINT(100.32374832 101.98527111)')); +EXPLAIN SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point GROUP BY p1, p2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE gis_point ALL NULL NULL NULL NULL # Using temporary; Using filesort +SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point GROUP BY p1, p2; +ST_AsText(p1) ST_AsText(p2) +POINT(100.32374832 101.23741821) POINT(100.32374832 101.98527111) +POINT(100.32374832 101.23741821) POINT(100.32374832 101.23741821) +POINT(100.32374832 101.23741821) POINT(200.32247328 101.86728201) +POINT(105.34523342 103.18492302) POINT(100.32374832 101.23741821) +SELECT ST_AsText(p1) FROM gis_point WHERE p1 = p2; +ST_AsText(p1) +POINT(100.32374832 101.23741821) +SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point WHERE p1 = ST_PointFromText('POINT(100.32374832 101.23741821)'); +ST_AsText(p1) ST_AsText(p2) +POINT(100.32374832 101.23741821) POINT(100.32374832 101.23741821) +POINT(100.32374832 101.23741821) POINT(200.32247328 101.86728201) +POINT(100.32374832 101.23741821) POINT(100.32374832 101.98527111) +SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point WHERE p2 = ST_PointFromText('POINT(200.32247328 101.86728201)'); +ST_AsText(p1) ST_AsText(p2) +POINT(100.32374832 101.23741821) POINT(200.32247328 101.86728201) +DROP TABLE gis_point; +# +# Test some ALTER TABLE operations on POINT tables +# +CREATE TABLE t1 ( +p POINT NOT NULL, +g GEOMETRY NOT NULL +) ENGINE=InnoDB; +INSERT INTO t1 VALUES(ST_PointFromText('POINT(0 1)'), ST_PointFromText('POINT(10 11)')); +INSERT INTO t1 VALUES(ST_PointFromText('POINT(1 1)'), ST_PointFromText('POINT(10 12)')); +INSERT INTO t1 VALUES(ST_PointFromText('POINT(1 0)'), ST_PointFromText('POINT(10 13)')); +INSERT INTO t1 VALUES(ST_PointFromText('POINT(0 0)'), ST_PointFromText('POINT(10 14)')); +SELECT ST_AsText(p), ST_AsText(g) FROM t1; +ST_AsText(p) ST_AsText(g) +POINT(0 1) POINT(10 11) +POINT(1 1) POINT(10 12) +POINT(1 0) POINT(10 13) +POINT(0 0) POINT(10 14) +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g'); +name mtype prtype len +p 14 1535 12 +g 14 1535 12 +ALTER TABLE t1 ADD COLUMN p1 POINT, ADD COLUMN p2 POINT, ADD KEY(p); +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1','p2'); +name mtype prtype len +p 14 1535 12 +g 14 1535 12 +p1 14 1279 12 +p2 14 1279 12 +# NOT NULL POINT will use '' +SELECT count(*) AS `Expect 4` FROM t1 WHERE p1 = ''; +Expect 4 +0 +SELECT count(*) AS `Expect 4` FROM t1 WHERE p2 = ''; +Expect 4 +0 +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p = p1; +ST_AsText(p) ST_AsText(p1) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p = p2; +ST_AsText(p) ST_AsText(p1) +ALTER TABLE t1 DROP COLUMN p2; +# NULLABLE POINT will use NULL +ALTER TABLE t1 ADD COLUMN p2 POINT, ADD KEY(p2); +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1','p2'); +name mtype prtype len +p 14 1535 12 +g 14 1535 12 +p1 14 1279 12 +p2 14 1279 12 +SELECT count(*) AS `Expect 4` FROM t1 WHERE p2 IS NULL; +Expect 4 +4 +UPDATE t1 SET p2 = ST_PointFromText('POINT(10 20)'); +UPDATE t1 SET p1 = ST_PointFromText('POINT(10 20)'); +ALTER TABLE t1 DROP COLUMN p2; +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1','p2'); +name mtype prtype len +p 14 1535 12 +g 14 1535 12 +p1 14 1279 12 +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p = p1; +ST_AsText(p) ST_AsText(p1) +INSERT INTO t1 VALUES (ST_PointFromText('POINT(0.5 0.5)'), ST_PointFromText('POINT(0 1)'), ST_PointFromText('POINT(10 19)')); +SELECT ST_AsText(p1) FROM t1; +ST_AsText(p1) +POINT(10 20) +POINT(10 20) +POINT(10 20) +POINT(10 20) +POINT(10 19) +DELETE FROM t1 WHERE p1 = ST_PointFromText('POINT(10 19)'); +SELECT ST_AsText(p1) FROM t1; +ST_AsText(p1) +POINT(10 20) +POINT(10 20) +POINT(10 20) +POINT(10 20) +# Add spatial keys on the table +ALTER TABLE t1 ADD SPATIAL(p), ADD SPATIAL(p1); +ERROR 42000: All parts of a SPATIAL index must be NOT NULL +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1'); +name mtype prtype len +p 14 1535 12 +g 14 1535 12 +p1 14 1279 12 +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 30)'); +ST_AsText(p) ST_AsText(p1) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 20)'); +ST_AsText(p) ST_AsText(p1) +POINT(0 1) POINT(10 20) +POINT(1 1) POINT(10 20) +POINT(1 0) POINT(10 20) +POINT(0 0) POINT(10 20) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE MBRWithin(p1, ST_GeomFromText('POLYGON((5 5, 20 5, 20 21, 5 21, 5 5))')); +ST_AsText(p) ST_AsText(p1) +POINT(0 1) POINT(10 20) +POINT(1 1) POINT(10 20) +POINT(1 0) POINT(10 20) +POINT(0 0) POINT(10 20) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE MBRWithin(p, ST_GeomFromText('POLYGON((-1 0.5, -1 -0.5, 1 -0.5, 1 0.5, -1 0.5))')); +ST_AsText(p) ST_AsText(p1) +POINT(0 0) POINT(10 20) +# Drop spatial keys on the table +ALTER TABLE t1 DROP KEY p, DROP KEY p1; +ERROR 42000: Can't DROP INDEX `p1`; check that it exists +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1'); +name mtype prtype len +p 14 1535 12 +g 14 1535 12 +p1 14 1279 12 +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 30)'); +ST_AsText(p) ST_AsText(p1) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 20)'); +ST_AsText(p) ST_AsText(p1) +POINT(0 1) POINT(10 20) +POINT(1 1) POINT(10 20) +POINT(1 0) POINT(10 20) +POINT(0 0) POINT(10 20) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE MBRWithin(p1, ST_GeomFromText('POLYGON((5 5, 20 5, 20 21, 5 21, 5 5))')); +ST_AsText(p) ST_AsText(p1) +POINT(0 1) POINT(10 20) +POINT(1 1) POINT(10 20) +POINT(1 0) POINT(10 20) +POINT(0 0) POINT(10 20) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE MBRWithin(p, ST_GeomFromText('POLYGON((-1 0.5, -1 -0.5, 1 -0.5, 1 0.5, -1 0.5))')); +ST_AsText(p) ST_AsText(p1) +POINT(0 0) POINT(10 20) +TRUNCATE t1; +ALTER TABLE t1 DROP COLUMN p, DROP COLUMN p1; +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1'); +name mtype prtype len +g 14 1535 12 +ALTER TABLE t1 ADD COLUMN p POINT, ADD COLUMN p1 POINT; +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('p','g','p1'); +name mtype prtype len +g 14 1535 12 +p 14 1279 12 +p1 14 1279 12 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` geometry NOT NULL, + `p` point DEFAULT NULL, + `p1` point DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO t1 VALUES(ST_PointFromText('POINT(0.5 0.5)'), ST_PointFromText('POINT(0 1)'), ST_PointFromText('POINT(10 19)')); +INSERT INTO t1 VALUES(ST_PointFromText('POINT(0.6 0.6)'), ST_PointFromText('POINT(1 1)'), ST_PointFromText('POINT(10 20)')); +INSERT INTO t1 VALUES(ST_PointFromText('POINT(0.7 0.7)'), ST_PointFromText('POINT(1 0)'), ST_PointFromText('POINT(10 21)')); +INSERT INTO t1 VALUES(ST_PointFromText('POINT(0.8 0.8)'), ST_PointFromText('POINT(0 0)'), ST_PointFromText('POINT(10 22)')); +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 30)'); +ST_AsText(p) ST_AsText(p1) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 20)'); +ST_AsText(p) ST_AsText(p1) +POINT(1 1) POINT(10 20) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE MBRWithin(p1, ST_GeomFromText('POLYGON((5 5, 20 5, 20 21, 5 21, 5 5))')); +ST_AsText(p) ST_AsText(p1) +POINT(0 1) POINT(10 19) +POINT(1 1) POINT(10 20) +SELECT ST_AsText(p), ST_AsText(p1) FROM t1 WHERE MBRWithin(p, ST_GeomFromText('POLYGON((-1 0.5, -1 -0.5, 1 -0.5, 1 0.5, -1 0.5))')); +ST_AsText(p) ST_AsText(p1) +POINT(0 0) POINT(10 22) +ALTER TABLE t1 DROP COLUMN p1, ADD COLUMN p1 POINT, CHANGE COLUMN p pp POINT AFTER p1; +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('pp','g','p1'); +name mtype prtype len +g 14 1535 12 +p1 14 1279 12 +pp 14 1279 12 +UPDATE t1 SET p1 = ST_PointFromText('POINT(5 5)'); +SELECT ST_AsText(pp), ST_AsText(p1) FROM t1; +ST_AsText(pp) ST_AsText(p1) +POINT(0 1) POINT(5 5) +POINT(1 1) POINT(5 5) +POINT(1 0) POINT(5 5) +POINT(0 0) POINT(5 5) +ALTER TABLE t1 ADD SPATIAL(p1), ADD SPATIAL(pp), ALGORITHM = COPY; +ERROR 42000: All parts of a SPATIAL index must be NOT NULL +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/t1' AND c.name IN ('pp','g','p1'); +name mtype prtype len +g 14 1535 12 +p1 14 1279 12 +pp 14 1279 12 +SELECT ST_AsText(pp), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 30)'); +ST_AsText(pp) ST_AsText(p1) +SELECT ST_AsText(pp), ST_AsText(p1) FROM t1 WHERE p1 = ST_PointFromText('POINT(10 20)'); +ST_AsText(pp) ST_AsText(p1) +SELECT ST_AsText(pp), ST_AsText(p1) FROM t1 WHERE MBRWithin(p1, ST_GeomFromText('POLYGON((5 5, 20 5, 20 21, 5 21, 5 5))')) ORDER BY pp; +ST_AsText(pp) ST_AsText(p1) +SELECT ST_AsText(pp), ST_AsText(p1) FROM t1 WHERE MBRWithin(pp, ST_GeomFromText('POLYGON((-1 0.5, -1 -0.5, 1 -0.5, 1 0.5, -1 0.5))')) ORDER BY pp; +ST_AsText(pp) ST_AsText(p1) +POINT(0 0) POINT(5 5) +DROP TABLE t1; +# +# Test when the POINT is on B-TREE +# +CREATE TABLE gis_point(fid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, p POINT, KEY(p)) ENGINE=InnoDB STATS_PERSISTENT=0; +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)')))); +SELECT ST_AsText(p) FROM gis_point; +ST_AsText(p) +POINT(10 10) +POINT(20 10) +POINT(20 20) +POINT(10 20) +SELECT ST_AsText(p) FROM gis_point WHERE p = ST_PointFromText('POINT(20 20)'); +ST_AsText(p) +POINT(20 20) +INSERT INTO gis_point VALUES +(201, ST_PointFromText('POINT(100.32374832 101.23741821)')), +(202, ST_PointFromText('POINT(102.43287328 100.23489233)')), +(203, ST_PointFromText('POINT(101.43284962 100.45892392)')), +(204, ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(103.43718640 105.248206478)')))), +(205, ST_PointFromText('POINT(101.43284962 100.45892392)')), +(206, ST_PointFromWKB(ST_AsWKB(ST_PointFromText('POINT(103.43718640 105.248206478)')))); +'The ORDER BY will use filesort' +EXPLAIN SELECT ST_AsText(p) FROM gis_point ORDER BY p; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE gis_point ALL NULL NULL NULL NULL # Using filesort +SELECT ST_AsText(p) FROM gis_point ORDER BY p; +ST_AsText(p) +POINT(10 10) +POINT(10 20) +POINT(20 10) +POINT(20 20) +POINT(101.43284962 100.45892392) +POINT(101.43284962 100.45892392) +POINT(100.32374832 101.23741821) +POINT(102.43287328 100.23489233) +POINT(103.4371864 105.248206478) +POINT(103.4371864 105.248206478) +SELECT ST_AsText(p), COUNT(*) FROM gis_point GROUP BY p; +ST_AsText(p) COUNT(*) +POINT(10 10) 1 +POINT(10 20) 1 +POINT(20 10) 1 +POINT(20 20) 1 +POINT(101.43284962 100.45892392) 2 +POINT(100.32374832 101.23741821) 1 +POINT(102.43287328 100.23489233) 1 +POINT(103.4371864 105.248206478) 2 +TRUNCATE gis_point; +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)')))); +# Check if we can create prefix index on POINT +ALTER TABLE gis_point ADD COLUMN g POINT, ADD KEY(g(8)); +INSERT INTO gis_point VALUES +(105, ST_PointFromText('POINT(25 15)'), ST_PointFromText('POINT(100 100)')), +(106, ST_PointFromText('POINT(25 25)'), ST_PointFromText('POINT(110 110)')); +SELECT ST_AsText(p) FROM gis_point; +ST_AsText(p) +POINT(10 10) +POINT(20 10) +POINT(20 20) +POINT(10 20) +POINT(25 15) +POINT(25 25) +SELECT ST_AsText(p), ST_AsText(g) FROM gis_point WHERE g IS NULL; +ST_AsText(p) ST_AsText(g) +POINT(10 10) NULL +POINT(20 10) NULL +POINT(20 20) NULL +POINT(10 20) NULL +UPDATE gis_point SET g = ST_PointFromText('POINT(200 200)') WHERE g IS NULL OR g = ST_PointFromText('POINT(110 110)'); +SELECT ST_AsText(g) FROM gis_point WHERE g IS NULL OR g = ST_PointFromText('POINT(200 200)'); +ST_AsText(g) +POINT(200 200) +POINT(200 200) +POINT(200 200) +POINT(200 200) +POINT(200 200) +# Check the information schema tables +SELECT table_name, column_name, data_type, column_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='gis_point' AND (column_name = 'p' OR column_name = 'g'); +table_name column_name data_type column_type +gis_point p point point +gis_point g point point +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name LIKE 'test/g%' AND c.name IN ('p','g'); +name mtype prtype len +p 14 1279 12 +g 14 1279 12 +SELECT length(p) FROM gis_point; +length(p) +25 +25 +25 +25 +25 +25 +ALTER TABLE gis_point DROP COLUMN g, ALGORITHM = COPY; +TRUNCATE gis_point; +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)')))); +# Check if we can create prefix index on POINT +ALTER TABLE gis_point ADD COLUMN g POINT, ADD KEY(g(8)); +INSERT INTO gis_point VALUES +(105, ST_PointFromText('POINT(25 15)'), ST_PointFromText('POINT(100 100)')), +(106, ST_PointFromText('POINT(25 25)'), ST_PointFromText('POINT(110 110)')); +SELECT ST_AsText(p) FROM gis_point; +ST_AsText(p) +POINT(10 10) +POINT(20 10) +POINT(20 20) +POINT(10 20) +POINT(25 15) +POINT(25 25) +SELECT ST_AsText(p), ST_AsText(g) FROM gis_point WHERE g IS NULL; +ST_AsText(p) ST_AsText(g) +POINT(10 10) NULL +POINT(20 10) NULL +POINT(20 20) NULL +POINT(10 20) NULL +UPDATE gis_point SET g = ST_PointFromText('POINT(200 200)') WHERE g IS NULL OR g = ST_PointFromText('POINT(110 110)'); +SELECT ST_AsText(g) FROM gis_point WHERE g IS NULL OR g = ST_PointFromText('POINT(200 200)'); +ST_AsText(g) +POINT(200 200) +POINT(200 200) +POINT(200 200) +POINT(200 200) +POINT(200 200) +CHECK TABLE gis_point; +Table Op Msg_type Msg_text +test.gis_point check status OK +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/gis_point' AND c.name IN ('p','g'); +name mtype prtype len +p 14 1279 12 +g 14 1279 12 +DROP TABLE gis_point; +# +# Check the mtype of other geometry data types should be 15 +# +CREATE TABLE g ( +geom GEOMETRY NOT NULL, +l LINESTRING NOT NULL, +poly POLYGON NOT NULL, +mp MULTIPOINT NOT NULL, +ml MULTILINESTRING NOT NULL, +mpoly MULTIPOLYGON NOT NULL, +gc GEOMETRYCOLLECTION NOT NULL +) ENGINE=InnoDB; +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/g'; +name mtype prtype len +geom 14 1535 12 +l 14 1535 12 +poly 14 1535 12 +mp 14 1535 12 +ml 14 1535 12 +mpoly 14 1535 12 +gc 14 1535 12 +DROP TABLE g; +# +# check the mtype and len with CREATE TABLE AS +# +CREATE TABLE t1 ( +p POINT NOT NULL, +g GEOMETRY NOT NULL +) ENGINE=InnoDB; +INSERT INTO t1 VALUES(ST_PointFromText('POINT(10 10)'),ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))')); +CREATE TABLE t2 ENGINE=InnoDB AS SELECT * FROM t1; +SELECT t.name, c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name LIKE 'test/t%' AND c.name IN ('p','g'); +name name mtype prtype len +test/t1 p 14 1535 12 +test/t1 g 14 1535 12 +test/t2 p 14 1535 12 +test/t2 g 14 1535 12 +DROP TABLE t1,t2; +# +# Test when POINT is used in spatial index +# +SET @ls1 = ST_GeomFromText('LINESTRING(0 20, 10 0)'); +SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 10 20)'); +SET @ls3 = ST_GeomFromText('LINESTRING(20 -40, 21 -42)'); +SET @ls4 = ST_GeomFromText('LINESTRING(20 -42, 21 -40)'); +SET @poly1 = ST_GeomFromText('POLYGON((2 2, 2 10, 10 10, 10 2, 2 2))'); +SET @poly2 = ST_GeomFromText('POLYGON((0 0, -5 0, -4 -1, -6 -15, -3 -15, 0 0))'); +SET @poly3 = ST_GeomFromText('POLYGON((10.0 10.0, 20.5 20, 20.5 50, 32.0 64.0, 32.3 64.6, 5 60, 10 10))'); +SET @poly4 = ST_GeomFromText('POLYGON((0 10, -10 10, -10 -10, 0 -10, 0 10))'); +SET @p1 = ST_PointFromText('POINT(0 0)'); +SET @mpoly = ST_GeomFromText('MULTIPOLYGON(((3 3, 3 16, 16 16, 16 3, 3 3)), ((10 10, 10 50, 50 50, 50 10, 10 10)))'); +CREATE TABLE gis_point (p1 POINT NOT NULL, p2 POINT NOT NULL, SPATIAL KEY k1 (p1), SPATIAL KEY k2 (p2)) ENGINE=InnoDB; +INSERT INTO gis_point VALUES +(ST_PointFromText('POINT(1 2)'), ST_PointFromText('POINT(-1 -3)')), +(ST_PointFromText('POINT(2 4)'), ST_PointFromText('POINT(-2 -6)')), +(ST_PointFromText('POINT(3 6)'), ST_PointFromText('POINT(-3 -9)')), +(ST_PointFromText('POINT(4 8)'), ST_PointFromText('POINT(-4 -12)')), +(ST_PointFromText('POINT(5 10)'), ST_PointFromText('POINT(-5 -15)')), +(ST_PointFromText('POINT(6 12)'), ST_PointFromText('POINT(-6 -18)')), +(ST_PointFromText('POINT(7 14)'), ST_PointFromText('POINT(-7 -21)')), +(ST_PointFromText('POINT(8 16)'), ST_PointFromText('POINT(0 0)')), +(ST_PointFromText('POINT(9 18)'), ST_PointFromText('POINT(-4 2)')), +(ST_PointFromText('POINT(10 21)'), ST_PointFromText('POINT(-6 3)')), +(ST_PointFromText('POINT(20.5 41)'), ST_PointFromText('POINT(-8 4)')), +(ST_PointFromText('POINT(26.25 57)'), ST_PointFromText('POINT(1 2)')), +(ST_PointFromText('POINT(32.1234 64.2468)'), ST_PointFromText('POINT(-1 -1)')); +CREATE TABLE gis_point1 SELECT * FROM gis_point; +SELECT c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/gis_point' AND c.name IN ('p1','p2'); +name mtype prtype len +p1 14 1535 12 +p2 14 1535 12 +SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point1; +ST_AsText(p1) ST_AsText(p2) +POINT(1 2) POINT(-1 -3) +POINT(2 4) POINT(-2 -6) +POINT(3 6) POINT(-3 -9) +POINT(4 8) POINT(-4 -12) +POINT(5 10) POINT(-5 -15) +POINT(6 12) POINT(-6 -18) +POINT(7 14) POINT(-7 -21) +POINT(8 16) POINT(0 0) +POINT(9 18) POINT(-4 2) +POINT(10 21) POINT(-6 3) +POINT(20.5 41) POINT(-8 4) +POINT(26.25 57) POINT(1 2) +POINT(32.1234 64.2468) POINT(-1 -1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Intersection(@ls1, @ls2) = p1; +ST_AsText(p1) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p2) FROM gis_point1 WHERE ST_Contains(@poly2, p2); +ST_AsText(p2) +POINT(-1 -3) +POINT(-2 -6) +POINT(-3 -9) +POINT(-4 -12) +POINT(-5 -15) +POINT(0 0) +POINT(-1 -1) +SELECT ST_AsText(p2) FROM gis_point1 WHERE ST_Equals(p2, @p1); +ST_AsText(p2) +POINT(0 0) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +ST_AsText(p1) +POINT(20.5 41) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Contains(@mpoly, p1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(10 21) +POINT(20.5 41) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Contains(@mpoly, p1) AND NOT MBRWithin(p1, @mpoly); +ST_AsText(p1) +POINT(3 6) +# Check functions that use MBR, with line type data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @ls1); +ST_AsText(p1) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBREquals(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @ls3); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Crosses(p1, @ls1); +ST_AsText(p1) +# Check functions that use MBR, with polygon type data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Crosses(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @poly1); +ST_AsText(p1) +POINT(1 2) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBREquals(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @poly1); +ST_AsText(p1) +# Check functions that use MBR, with point type data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBREquals(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Crosses(p1, @p1); +ST_AsText(p1) +# Check with MBR functions point type data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRequals(p1, @p1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +# Check with MBR functions point polygon data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRequals(p1, @p1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +# Check with MBR functions polygon type data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @poly1); +ST_AsText(p1) +POINT(1 2) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRequals(p1, @poly1); +ST_AsText(p1) +# Check with MBR functions line type data +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRIntersects(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRWithin(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point1 WHERE ST_Touches(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRDisjoint(p1, @ls1); +ST_AsText(p1) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRequals(p1, @ls1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBROverlaps(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point1 WHERE MBRContains(p1, @ls1); +ST_AsText(p1) +DROP TABLE gis_point1; +SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point; +ST_AsText(p1) ST_AsText(p2) +POINT(1 2) POINT(-1 -3) +POINT(2 4) POINT(-2 -6) +POINT(3 6) POINT(-3 -9) +POINT(4 8) POINT(-4 -12) +POINT(5 10) POINT(-5 -15) +POINT(6 12) POINT(-6 -18) +POINT(7 14) POINT(-7 -21) +POINT(8 16) POINT(0 0) +POINT(9 18) POINT(-4 2) +POINT(10 21) POINT(-6 3) +POINT(20.5 41) POINT(-8 4) +POINT(26.25 57) POINT(1 2) +POINT(32.1234 64.2468) POINT(-1 -1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Intersection(@ls1, @ls2) = p1; +ST_AsText(p1) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p2) FROM gis_point WHERE ST_Contains(@poly2, p2); +ST_AsText(p2) +POINT(-1 -3) +POINT(-2 -6) +POINT(-3 -9) +POINT(-4 -12) +POINT(-5 -15) +POINT(0 0) +POINT(-1 -1) +SELECT ST_AsText(p2) FROM gis_point WHERE ST_Equals(p2, @p1); +ST_AsText(p2) +POINT(0 0) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +ST_AsText(p1) +POINT(20.5 41) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Contains(@mpoly, p1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(10 21) +POINT(20.5 41) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Contains(@mpoly, p1) AND NOT MBRWithin(p1, @mpoly); +ST_AsText(p1) +POINT(3 6) +# Check functions that use MBR, with line type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @ls1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBREquals(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @ls3); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Crosses(p1, @ls1); +ST_AsText(p1) +# Check functions that use MBR, with polygon type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Crosses(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @poly1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +POINT(9 18) +POINT(8 16) +POINT(7 14) +POINT(6 12) +POINT(1 2) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBREquals(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @poly1); +ST_AsText(p1) +# Check functions that use MBR, with point type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBREquals(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +POINT(9 18) +POINT(8 16) +POINT(7 14) +POINT(6 12) +POINT(5 10) +POINT(4 8) +POINT(3 6) +POINT(2 4) +POINT(1 2) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Crosses(p1, @p1); +ST_AsText(p1) +# Check with MBR functions point type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +POINT(9 18) +POINT(8 16) +POINT(7 14) +POINT(6 12) +POINT(5 10) +POINT(4 8) +POINT(3 6) +POINT(2 4) +POINT(1 2) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @p1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +# Check with MBR functions point polygon data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +POINT(9 18) +POINT(8 16) +POINT(7 14) +POINT(6 12) +POINT(5 10) +POINT(4 8) +POINT(3 6) +POINT(2 4) +POINT(1 2) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @p1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +# Check with MBR functions polygon type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @poly1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +POINT(9 18) +POINT(8 16) +POINT(7 14) +POINT(6 12) +POINT(1 2) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @poly1); +ST_AsText(p1) +# Check with MBR functions line type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @ls1); +ST_AsText(p1) +POINT(32.1234 64.2468) +POINT(26.25 57) +POINT(20.5 41) +POINT(10 21) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @ls1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @ls1); +ST_AsText(p1) +# Modify the storage engine to Myisam, Check the spatial functions +ALTER TABLE gis_point ENGINE Myisam; +# Check functions that use MBR, with line type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @ls1); +ST_AsText(p1) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBREquals(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @ls3); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Crosses(p1, @ls1); +ST_AsText(p1) +# Check functions that use MBR, with polygon type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Crosses(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @poly1); +ST_AsText(p1) +POINT(1 2) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBREquals(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @poly1); +ST_AsText(p1) +# Check functions that use MBR, with point type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBREquals(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Crosses(p1, @p1); +ST_AsText(p1) +# Check with MBR functions point type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @p1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +# Check with MBR functions point polygon data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @p1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @p1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @p1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @p1); +ST_AsText(p1) +# Check with MBR functions polygon type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @poly1); +ST_AsText(p1) +POINT(3 6) +POINT(4 8) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @poly1); +ST_AsText(p1) +POINT(2 4) +POINT(5 10) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @poly1); +ST_AsText(p1) +POINT(1 2) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @poly1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @poly1); +ST_AsText(p1) +# Check with MBR functions line type data +SELECT ST_AsText(p1) FROM gis_point WHERE MBRIntersects(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRWithin(p1, @ls1); +ST_AsText(p1) +POINT(1 2) +POINT(2 4) +POINT(3 6) +POINT(4 8) +POINT(5 10) +POINT(6 12) +POINT(7 14) +POINT(8 16) +POINT(9 18) +SELECT ST_AsText(p1) FROM gis_point WHERE ST_Touches(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRDisjoint(p1, @ls1); +ST_AsText(p1) +POINT(10 21) +POINT(20.5 41) +POINT(26.25 57) +POINT(32.1234 64.2468) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRequals(p1, @ls1); +ST_AsText(p1) +# No matching records +SELECT ST_AsText(p1) FROM gis_point WHERE MBROverlaps(p1, @ls1); +ST_AsText(p1) +SELECT ST_AsText(p1) FROM gis_point WHERE MBRContains(p1, @ls1); +ST_AsText(p1) +# Modify the storage engine to InnoDB again, do following testing +ALTER TABLE gis_point ENGINE InnoDB; +CHECK TABLE gis_point; +Table Op Msg_type Msg_text +test.gis_point check status OK +The ORDER BY for spatial index will use filesort +EXPLAIN SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point ORDER BY p1, p2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE gis_point ALL NULL NULL NULL NULL # Using filesort +SELECT ST_AsText(p1), ST_AsText(p2) FROM gis_point ORDER BY p1, p2; +ST_AsText(p1) ST_AsText(p2) +POINT(2 4) POINT(-2 -6) +POINT(3 6) POINT(-3 -9) +POINT(4 8) POINT(-4 -12) +POINT(5 10) POINT(-5 -15) +POINT(6 12) POINT(-6 -18) +POINT(7 14) POINT(-7 -21) +POINT(8 16) POINT(0 0) +POINT(9 18) POINT(-4 2) +POINT(10 21) POINT(-6 3) +POINT(1 2) POINT(-1 -3) +POINT(26.25 57) POINT(1 2) +POINT(20.5 41) POINT(-8 4) +POINT(32.1234 64.2468) POINT(-1 -1) +Try to do IDU on the table and verify the result +DELETE FROM gis_point WHERE ST_Equals(p2, ST_PointFromText('POINT(-8 4)')); +INSERT INTO gis_point VALUES(ST_PointFromText('POINT(20.5 -41)'), ST_PointFromText('POINT(8 -4)')); +SELECT ST_AsText(p1) AS 'Expect (32.1234 64.2468)' FROM gis_point WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +Expect (32.1234 64.2468) +POINT(32.1234 64.2468) +UPDATE gis_point SET p1 = ST_PointFromText('POINT(20.5 41)'), p2 = ST_PointFromText('POINT(-8 4)') WHERE ST_Intersection(@ls3, @ls4) = p1; +SELECT ST_AsText(p1) AS 'Expect (32.1234 64.2468) AND (20.5 41)' FROM gis_point WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +Expect (32.1234 64.2468) AND (20.5 41) +POINT(32.1234 64.2468) +POINT(20.5 41) +CHECK TABLE gis_point; +Table Op Msg_type Msg_text +test.gis_point check status OK +Use a trx to test the IDU on the table and verify the result +START TRANSACTION; +DELETE FROM gis_point WHERE ST_Equals(p2, ST_PointFromText('POINT(-8 4)')); +INSERT INTO gis_point VALUES(ST_PointFromText('POINT(20.5 -41)'), ST_PointFromText('POINT(8 -4)')); +SELECT ST_AsText(p1) AS 'Expect (32.1234 64.2468)' FROM gis_point WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +Expect (32.1234 64.2468) +POINT(32.1234 64.2468) +UPDATE gis_point SET p1 = ST_PointFromText('POINT(20.5 49)'), p2 = ST_PointFromText('POINT(-8 4)') WHERE ST_Intersection(@ls3, @ls4) = p1; +SELECT ST_AsText(p1) AS 'Expect (32.1234 64.2468) AND (20.5 49)' FROM gis_point WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +Expect (32.1234 64.2468) AND (20.5 49) +POINT(32.1234 64.2468) +POINT(20.5 49) +ROLLBACK; +SELECT ST_AsText(p1) AS 'Expect (32.1234 64.2468) AND (20.5 41)' FROM gis_point WHERE ST_Touches(@poly3, p1) AND MBRWithin(p2, @poly4); +Expect (32.1234 64.2468) AND (20.5 41) +POINT(32.1234 64.2468) +POINT(20.5 41) +CHECK TABLE gis_point; +Table Op Msg_type Msg_text +test.gis_point check status OK +DROP TABLE gis_point; +# +# Test inserting/updating different type data into POINT field +# +CREATE TABLE gis_point (i INT, p POINT) ENGINE=InnoDB; +CREATE TABLE geom (i INT, g GEOMETRY NOT NULL, SPATIAL KEY(g)) ENGINE=InnoDB; +INSERT INTO gis_point VALUES(0, ST_PointFromText('POINT(1 1)')); +INSERT INTO gis_point VALUES(1, ST_PointFromText('POINT(2 2)')); +INSERT INTO gis_point VALUES(2, NULL); +ALTER TABLE gis_point ADD COLUMN j INT, ALGORITHM = COPY; +SELECT t.name, c.name, c.mtype, c.prtype, c.len +FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS c +JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t +ON c.table_id = t.table_id +WHERE t.name='test/gis_point' AND c.name='p'; +name name mtype prtype len +test/gis_point p 14 1279 12 +SELECT i, ST_AsText(p) FROM gis_point; +i ST_AsText(p) +0 POINT(1 1) +1 POINT(2 2) +2 NULL +UPDATE gis_point SET p = NULL WHERE p = ST_PointFromText('POINT(1 1)'); +UPDATE gis_point SET p = ST_PointFromText('POINT(1 2)') WHERE p = ST_PointFromText('POINT(2 2)'); +UPDATE gis_point SET p = ST_PointFromText('POINT(1 1)') WHERE p IS NULL; +SELECT i, ST_AsText(p) FROM gis_point; +i ST_AsText(p) +0 POINT(1 1) +1 POINT(1 2) +2 POINT(1 1) +INSERT INTO geom VALUES(0, ST_PointFromText('POINT(0 0)')); +INSERT INTO geom VALUES(1, ST_PointFromText('POINT(10 10)')); +INSERT INTO geom VALUES(2, ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))')); +SELECT ST_AsText(g) FROM geom; +ST_AsText(g) +POINT(0 0) +POINT(10 10) +POLYGON((7 1,6 2,6 3,10 3,10 1,7 1)) +SELECT ST_AsText(p) FROM gis_point; +ST_AsText(p) +POINT(1 1) +POINT(1 2) +POINT(1 1) +DELETE FROM geom WHERE g = ST_GeomFromText('POLYGON((7 1,6 2,6 3,10 3,10 1,7 1))'); +From GEOMETRY to POINT, now ALL the data are POINT +ALTER TABLE geom MODIFY g POINT NOT NULL; +SHOW CREATE TABLE geom; +Table Create Table +geom CREATE TABLE `geom` ( + `i` int(11) DEFAULT NULL, + `g` point NOT NULL, + SPATIAL KEY `g` (`g`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT ST_AsText(g) FROM geom; +ST_AsText(g) +POINT(0 0) +POINT(10 10) +From POINT to GEOMETRY, all data are POINT +ALTER TABLE geom MODIFY g GEOMETRY NOT NULL; +SHOW CREATE TABLE geom; +Table Create Table +geom CREATE TABLE `geom` ( + `i` int(11) DEFAULT NULL, + `g` geometry NOT NULL, + SPATIAL KEY `g` (`g`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +TRUNCATE TABLE geom; +From GEOMETRY to POINT, the table is empty +ALTER TABLE geom MODIFY g POINT NOT NULL; +SHOW CREATE TABLE geom; +Table Create Table +geom CREATE TABLE `geom` ( + `i` int(11) DEFAULT NULL, + `g` point NOT NULL, + SPATIAL KEY `g` (`g`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT ST_AsText(g) FROM geom; +ST_AsText(g) +CHECK TABLE gis_point; +Table Op Msg_type Msg_text +test.gis_point check status OK +CHECK TABLE geom; +Table Op Msg_type Msg_text +test.geom check status OK +DROP TABLE gis_point, geom; +# +# Test when a geom field, such as POINT, is also a primary key +# +CREATE TABLE t1 ( +a INT NOT NULL, +p POINT NOT NULL, +l LINESTRING NOT NULL, +g GEOMETRY NOT NULL, +PRIMARY KEY(p), +SPATIAL KEY `idx2` (p), +SPATIAL KEY `idx3` (l), +SPATIAL KEY `idx4` (g) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES( +1, ST_GeomFromText('POINT(10 10)'), +ST_GeomFromText('LINESTRING(1 1, 5 5, 10 10)'), +ST_GeomFromText('POLYGON((30 30, 40 40, 50 50, 30 50, 30 40, 30 30))')); +INSERT INTO t1 VALUES( +2, ST_GeomFromText('POINT(20 20)'), +ST_GeomFromText('LINESTRING(2 3, 7 8, 9 10, 15 16)'), +ST_GeomFromText('POLYGON((10 30, 30 40, 40 50, 40 30, 30 20, 10 30))')); +SELECT a, ST_AsText(p), ST_AsText(l), ST_AsText(g) FROM t1; +a ST_AsText(p) ST_AsText(l) ST_AsText(g) +1 POINT(10 10) LINESTRING(1 1,5 5,10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) +2 POINT(20 20) LINESTRING(2 3,7 8,9 10,15 16) POLYGON((10 30,30 40,40 50,40 30,30 20,10 30)) +EXPLAIN UPDATE t1 SET p = ST_GeomFromText('POINT(30 30)') WHERE p = ST_GeomFromText('POINT(20 20)'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range PRIMARY PRIMARY 27 NULL # Using where +UPDATE t1 SET p = ST_GeomFromText('POINT(30 30)') WHERE p = ST_GeomFromText('POINT(20 20)'); +SELECT a, ST_AsText(p), ST_AsText(l), ST_AsText(g) FROM t1; +a ST_AsText(p) ST_AsText(l) ST_AsText(g) +1 POINT(10 10) LINESTRING(1 1,5 5,10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) +2 POINT(30 30) LINESTRING(2 3,7 8,9 10,15 16) POLYGON((10 30,30 40,40 50,40 30,30 20,10 30)) +ALTER TABLE t1 DROP PRIMARY KEY; +ALTER TABLE t1 ADD PRIMARY KEY(a); +SELECT a, ST_AsText(p), ST_AsText(l), ST_AsText(g) FROM t1; +a ST_AsText(p) ST_AsText(l) ST_AsText(g) +1 POINT(10 10) LINESTRING(1 1,5 5,10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) +2 POINT(30 30) LINESTRING(2 3,7 8,9 10,15 16) POLYGON((10 30,30 40,40 50,40 30,30 20,10 30)) +ALTER TABLE t1 DROP PRIMARY KEY; +ALTER TABLE t1 ADD PRIMARY KEY(p); +SELECT a, ST_AsText(p), ST_AsText(l), ST_AsText(g) FROM t1; +a ST_AsText(p) ST_AsText(l) ST_AsText(g) +1 POINT(10 10) LINESTRING(1 1,5 5,10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) +2 POINT(30 30) LINESTRING(2 3,7 8,9 10,15 16) POLYGON((10 30,30 40,40 50,40 30,30 20,10 30)) +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `p` point NOT NULL, + `l` linestring NOT NULL, + `g` geometry NOT NULL, + PRIMARY KEY (`p`(25)), + SPATIAL KEY `idx2` (`p`), + SPATIAL KEY `idx3` (`l`), + SPATIAL KEY `idx4` (`g`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT a, ST_AsText(p), ST_AsText(l), ST_AsText(g) FROM t1; +a ST_AsText(p) ST_AsText(l) ST_AsText(g) +1 POINT(10 10) LINESTRING(1 1,5 5,10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) +2 POINT(30 30) LINESTRING(2 3,7 8,9 10,15 16) POLYGON((10 30,30 40,40 50,40 30,30 20,10 30)) +ALTER TABLE t1 DROP PRIMARY KEY; +ALTER TABLE t1 ADD PRIMARY KEY(p); +EXPLAIN SELECT a, ST_AsText(p) FROM t1 WHERE a = 2 AND p = ST_GeomFromText('POINT(30 30)'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 const PRIMARY,idx2 PRIMARY 27 const # +SELECT a, ST_AsText(p) FROM t1 WHERE a = 2 AND p = ST_GeomFromText('POINT(30 30)'); +a ST_AsText(p) +2 POINT(30 30) +SELECT a, ST_AsText(p), ST_AsText(l), ST_AsText(g) FROM t1; +a ST_AsText(p) ST_AsText(l) ST_AsText(g) +1 POINT(10 10) LINESTRING(1 1,5 5,10 10) POLYGON((30 30,40 40,50 50,30 50,30 40,30 30)) +2 POINT(30 30) LINESTRING(2 3,7 8,9 10,15 16) POLYGON((10 30,30 40,40 50,40 30,30 20,10 30)) +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +# +# Test for foreign keys. +# +CREATE TABLE parent(p POINT, PRIMARY KEY(p)) ENGINE=InnoDB; +CREATE TABLE child(p POINT NOT NULL) ENGINE=InnoDB; +ALTER TABLE parent ADD SPATIAL INDEX idx1(p ASC); +ALTER TABLE child ADD SPATIAL INDEX idx2(p ASC); +SHOW CREATE TABLE parent; +Table Create Table +parent CREATE TABLE `parent` ( + `p` point NOT NULL, + PRIMARY KEY (`p`(25)), + SPATIAL KEY `idx1` (`p`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SHOW CREATE TABLE child; +Table Create Table +child CREATE TABLE `child` ( + `p` point NOT NULL, + SPATIAL KEY `idx2` (`p`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p); +ERROR HY000: Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") +show warnings; +Level Code Message +Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. +Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") +Warning 1215 Cannot add foreign key constraint for `child` +ALTER TABLE parent DROP INDEX idx1; +ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p); +Got one of the listed errors +show warnings; +Level Code Message +Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. +Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") +Warning 1215 Cannot add foreign key constraint for `child` +ALTER TABLE child DROP INDEX idx2; +ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p); +Got one of the listed errors +show warnings; +Level Code Message +Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is only prefix index in the referenced table where the referenced columns appear as the first columns. +Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") +Warning 1215 Cannot add foreign key constraint for `child` +DROP TABLE child, parent; +# +# Bug#28763: Selecting geometry fields in UNION caused server crash. +# +CREATE TABLE t1(f1 GEOMETRY, f2 POINT, f3 GEOMETRY) ENGINE=InnoDB; +SELECT f1 FROM t1 UNION SELECT f1 FROM t1; +f1 +INSERT INTO t1 (f2,f3) VALUES (ST_GeomFromText('POINT(1 1)'), +ST_GeomFromText('POINT(2 2)')); +SELECT ST_AsText(f2),ST_AsText(f3) FROM t1; +ST_AsText(f2) ST_AsText(f3) +POINT(1 1) POINT(2 2) +SELECT ST_AsText(a) FROM (SELECT f2 AS a FROM t1 UNION SELECT f3 FROM t1) t; +ST_AsText(a) +POINT(1 1) +POINT(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) +POINT(1 1) +POINT(2 2) +DROP TABLE t1, t2; |