mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merging.
This commit is contained in:
@ -134,6 +134,7 @@ SET(LIBMYSQLD_SOURCES libmysqld.c emb_qcache.cc lib_sql.cc
|
||||
../sql/sql_tablespace.cc ../sql/sql_table.cc ../sql/sql_test.cc
|
||||
../sql/sql_trigger.cc ../sql/sql_udf.cc ../sql/sql_union.cc
|
||||
../sql/sql_update.cc ../sql/sql_view.cc ../sql/sql_profile.cc
|
||||
../sql/gcalc_tools.cc ../sql/gcalc_slicescan.cc
|
||||
../sql/strfunc.cc ../sql/table.cc ../sql/thr_malloc.cc
|
||||
../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
|
||||
../sql/partition_info.cc ../sql/sql_connect.cc
|
||||
|
@ -62,6 +62,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
|
||||
opt_sum.cc procedure.cc records.cc sql_acl.cc \
|
||||
sql_load.cc discover.cc sql_locale.cc \
|
||||
sql_profile.cc \
|
||||
gcalc_slicescan.cc gcalc_tools.cc \
|
||||
sql_analyse.cc sql_base.cc sql_cache.cc sql_class.cc \
|
||||
sql_crypt.cc sql_db.cc sql_delete.cc sql_error.cc sql_insert.cc \
|
||||
sql_join_cache.cc \
|
||||
|
@ -236,7 +236,7 @@ explain extended select Dimension(g), GeometryType(g), IsEmpty(g), AsText(Envelo
|
||||
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 dimension(`test`.`gis_geometry`.`g`) AS `Dimension(g)`,geometrytype(`test`.`gis_geometry`.`g`) AS `GeometryType(g)`,isempty(`test`.`gis_geometry`.`g`) AS `IsEmpty(g)`,astext(envelope(`test`.`gis_geometry`.`g`)) AS `AsText(Envelope(g))` from `test`.`gis_geometry`
|
||||
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
|
||||
@ -253,7 +253,7 @@ 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 x(`test`.`gis_point`.`g`) AS `X(g)`,y(`test`.`gis_point`.`g`) AS `Y(g)` from `test`.`gis_point`
|
||||
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)
|
||||
@ -288,7 +288,7 @@ explain extended select AsText(StartPoint(g)),AsText(EndPoint(g)),GLength(g),Num
|
||||
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 astext(startpoint(`test`.`gis_line`.`g`)) AS `AsText(StartPoint(g))`,astext(endpoint(`test`.`gis_line`.`g`)) AS `AsText(EndPoint(g))`,glength(`test`.`gis_line`.`g`) AS `GLength(g)`,numpoints(`test`.`gis_line`.`g`) AS `NumPoints(g)`,astext(pointn(`test`.`gis_line`.`g`,2)) AS `AsText(PointN(g, 2))`,isclosed(`test`.`gis_line`.`g`) AS `IsClosed(g)` from `test`.`gis_line`
|
||||
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)
|
||||
@ -318,7 +318,7 @@ explain extended select AsText(Centroid(g)),Area(g),AsText(ExteriorRing(g)),NumI
|
||||
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 astext(centroid(`test`.`gis_polygon`.`g`)) AS `AsText(Centroid(g))`,area(`test`.`gis_polygon`.`g`) AS `Area(g)`,astext(exteriorring(`test`.`gis_polygon`.`g`)) AS `AsText(ExteriorRing(g))`,numinteriorrings(`test`.`gis_polygon`.`g`) AS `NumInteriorRings(g)`,astext(interiorringn(`test`.`gis_polygon`.`g`,1)) AS `AsText(InteriorRingN(g, 1))` from `test`.`gis_polygon`
|
||||
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
|
||||
@ -357,7 +357,7 @@ 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`,numgeometries(`test`.`gis_multi_point`.`g`) AS `NumGeometries(g)` from `test`.`gis_multi_point`
|
||||
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)
|
||||
@ -385,17 +385,17 @@ 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`,astext(geometryn(`test`.`gis_multi_point`.`g`,2)) AS `AsText(GeometryN(g, 2))` from `test`.`gis_multi_point`
|
||||
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 120 1 1 0 1 0 1 1 1
|
||||
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
|
||||
121 121 1 1 0 1 0 1 1 1
|
||||
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,
|
||||
@ -405,7 +405,7 @@ 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`,within(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,contains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,overlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,equals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,disjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,intersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,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`
|
||||
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`,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 (
|
||||
a INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||
@ -494,7 +494,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
@ -515,7 +515,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
|
436
mysql-test/r/gis-precise.result
Normal file
436
mysql-test/r/gis-precise.result
Normal file
File diff suppressed because one or more lines are too long
49
mysql-test/r/gis-rt-precise.result
Normal file
49
mysql-test/r/gis-rt-precise.result
Normal file
@ -0,0 +1,49 @@
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (
|
||||
fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
g GEOMETRY NOT NULL,
|
||||
SPATIAL KEY(g)
|
||||
) ENGINE=MyISAM;
|
||||
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=MyISAM DEFAULT CHARSET=latin1
|
||||
SELECT count(*) FROM t1;
|
||||
count(*)
|
||||
150
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g, 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 range g g 34 NULL 8 Using where
|
||||
SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
fid AsText(g)
|
||||
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=MyISAM;
|
||||
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=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=latin1
|
||||
SELECT count(*) FROM t1;
|
||||
count(*)
|
||||
100
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 40))'));
|
||||
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 fid, AsText(g) FROM t1 WHERE ST_Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 40))'));
|
||||
fid AsText(g)
|
||||
DROP TABLE t1;
|
||||
End of 5.5 tests.
|
@ -12,6 +12,156 @@ t1 CREATE TABLE `t1` (
|
||||
PRIMARY KEY (`fid`),
|
||||
SPATIAL KEY `g` (`g`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(150 150, 150 150)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(149 149, 151 151)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(148 148, 152 152)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(147 147, 153 153)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(146 146, 154 154)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(145 145, 155 155)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(144 144, 156 156)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(143 143, 157 157)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(142 142, 158 158)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(141 141, 159 159)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(140 140, 160 160)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(139 139, 161 161)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(138 138, 162 162)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(137 137, 163 163)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(136 136, 164 164)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(135 135, 165 165)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(134 134, 166 166)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(133 133, 167 167)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(132 132, 168 168)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(131 131, 169 169)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(130 130, 170 170)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(129 129, 171 171)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(128 128, 172 172)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(127 127, 173 173)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(126 126, 174 174)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(125 125, 175 175)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(124 124, 176 176)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(123 123, 177 177)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(122 122, 178 178)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(121 121, 179 179)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(120 120, 180 180)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(119 119, 181 181)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(118 118, 182 182)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(117 117, 183 183)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(116 116, 184 184)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(115 115, 185 185)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(114 114, 186 186)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(113 113, 187 187)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(112 112, 188 188)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(111 111, 189 189)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(110 110, 190 190)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(109 109, 191 191)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(108 108, 192 192)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(107 107, 193 193)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(106 106, 194 194)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(105 105, 195 195)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(104 104, 196 196)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(103 103, 197 197)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(102 102, 198 198)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(101 101, 199 199)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(100 100, 200 200)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(99 99, 201 201)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(98 98, 202 202)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(97 97, 203 203)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(96 96, 204 204)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(95 95, 205 205)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(94 94, 206 206)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(93 93, 207 207)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(92 92, 208 208)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(91 91, 209 209)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(90 90, 210 210)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(89 89, 211 211)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(88 88, 212 212)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(87 87, 213 213)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(86 86, 214 214)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(85 85, 215 215)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(84 84, 216 216)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(83 83, 217 217)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(82 82, 218 218)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(81 81, 219 219)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(80 80, 220 220)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(79 79, 221 221)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(78 78, 222 222)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(77 77, 223 223)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(76 76, 224 224)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(75 75, 225 225)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(74 74, 226 226)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(73 73, 227 227)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(72 72, 228 228)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(71 71, 229 229)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(70 70, 230 230)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(69 69, 231 231)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(68 68, 232 232)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(67 67, 233 233)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(66 66, 234 234)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(65 65, 235 235)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(64 64, 236 236)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(63 63, 237 237)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(62 62, 238 238)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(61 61, 239 239)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(60 60, 240 240)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(59 59, 241 241)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(58 58, 242 242)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(57 57, 243 243)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(56 56, 244 244)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(55 55, 245 245)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(54 54, 246 246)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(53 53, 247 247)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(52 52, 248 248)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(51 51, 249 249)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(50 50, 250 250)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(49 49, 251 251)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(48 48, 252 252)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(47 47, 253 253)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(46 46, 254 254)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(45 45, 255 255)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(44 44, 256 256)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(43 43, 257 257)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(42 42, 258 258)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(41 41, 259 259)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(40 40, 260 260)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(39 39, 261 261)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(38 38, 262 262)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(37 37, 263 263)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(36 36, 264 264)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(35 35, 265 265)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(34 34, 266 266)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(33 33, 267 267)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(32 32, 268 268)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(31 31, 269 269)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(30 30, 270 270)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(29 29, 271 271)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(28 28, 272 272)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(27 27, 273 273)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(26 26, 274 274)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(25 25, 275 275)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(24 24, 276 276)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(23 23, 277 277)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(22 22, 278 278)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(21 21, 279 279)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(20 20, 280 280)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(19 19, 281 281)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(18 18, 282 282)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(17 17, 283 283)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(16 16, 284 284)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(15 15, 285 285)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(14 14, 286 286)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(13 13, 287 287)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(12 12, 288 288)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(11 11, 289 289)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(10 10, 290 290)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(9 9, 291 291)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(8 8, 292 292)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(7 7, 293 293)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(6 6, 294 294)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(5 5, 295 295)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(4 4, 296 296)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(3 3, 297 297)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(2 2, 298 298)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 1, 299 299)'));
|
||||
SELECT count(*) FROM t1;
|
||||
count(*)
|
||||
150
|
||||
@ -20,22 +170,112 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range g g 34 NULL 8 Using where
|
||||
SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
fid AsText(g)
|
||||
1 LINESTRING(150 150,150 150)
|
||||
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)
|
||||
2 LINESTRING(149 149,151 151)
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t2 (
|
||||
fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
g GEOMETRY NOT NULL
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 10 * 10 - 9), Point(10 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 9 * 10 - 9), Point(10 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 8 * 10 - 9), Point(10 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 7 * 10 - 9), Point(10 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 6 * 10 - 9), Point(10 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 5 * 10 - 9), Point(10 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 4 * 10 - 9), Point(10 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 3 * 10 - 9), Point(10 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 2 * 10 - 9), Point(10 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(10 * 10 - 9, 1 * 10 - 9), Point(10 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 10 * 10 - 9), Point(9 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 9 * 10 - 9), Point(9 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 8 * 10 - 9), Point(9 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 7 * 10 - 9), Point(9 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 6 * 10 - 9), Point(9 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 5 * 10 - 9), Point(9 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 4 * 10 - 9), Point(9 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 3 * 10 - 9), Point(9 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 2 * 10 - 9), Point(9 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(9 * 10 - 9, 1 * 10 - 9), Point(9 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 10 * 10 - 9), Point(8 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 9 * 10 - 9), Point(8 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 8 * 10 - 9), Point(8 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 7 * 10 - 9), Point(8 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 6 * 10 - 9), Point(8 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 5 * 10 - 9), Point(8 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 4 * 10 - 9), Point(8 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 3 * 10 - 9), Point(8 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 2 * 10 - 9), Point(8 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(8 * 10 - 9, 1 * 10 - 9), Point(8 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 10 * 10 - 9), Point(7 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 9 * 10 - 9), Point(7 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 8 * 10 - 9), Point(7 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 7 * 10 - 9), Point(7 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 6 * 10 - 9), Point(7 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 5 * 10 - 9), Point(7 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 4 * 10 - 9), Point(7 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 3 * 10 - 9), Point(7 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 2 * 10 - 9), Point(7 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(7 * 10 - 9, 1 * 10 - 9), Point(7 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 10 * 10 - 9), Point(6 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 9 * 10 - 9), Point(6 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 8 * 10 - 9), Point(6 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 7 * 10 - 9), Point(6 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 6 * 10 - 9), Point(6 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 5 * 10 - 9), Point(6 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 4 * 10 - 9), Point(6 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 3 * 10 - 9), Point(6 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 2 * 10 - 9), Point(6 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(6 * 10 - 9, 1 * 10 - 9), Point(6 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 10 * 10 - 9), Point(5 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 9 * 10 - 9), Point(5 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 8 * 10 - 9), Point(5 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 7 * 10 - 9), Point(5 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 6 * 10 - 9), Point(5 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 5 * 10 - 9), Point(5 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 4 * 10 - 9), Point(5 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 3 * 10 - 9), Point(5 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 2 * 10 - 9), Point(5 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(5 * 10 - 9, 1 * 10 - 9), Point(5 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 10 * 10 - 9), Point(4 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 9 * 10 - 9), Point(4 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 8 * 10 - 9), Point(4 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 7 * 10 - 9), Point(4 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 6 * 10 - 9), Point(4 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 5 * 10 - 9), Point(4 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 4 * 10 - 9), Point(4 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 3 * 10 - 9), Point(4 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 2 * 10 - 9), Point(4 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(4 * 10 - 9, 1 * 10 - 9), Point(4 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 10 * 10 - 9), Point(3 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 9 * 10 - 9), Point(3 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 8 * 10 - 9), Point(3 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 7 * 10 - 9), Point(3 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 6 * 10 - 9), Point(3 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 5 * 10 - 9), Point(3 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 4 * 10 - 9), Point(3 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 3 * 10 - 9), Point(3 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 2 * 10 - 9), Point(3 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(3 * 10 - 9, 1 * 10 - 9), Point(3 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 10 * 10 - 9), Point(2 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 9 * 10 - 9), Point(2 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 8 * 10 - 9), Point(2 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 7 * 10 - 9), Point(2 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 6 * 10 - 9), Point(2 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 5 * 10 - 9), Point(2 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 4 * 10 - 9), Point(2 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 3 * 10 - 9), Point(2 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 2 * 10 - 9), Point(2 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(2 * 10 - 9, 1 * 10 - 9), Point(2 * 10, 1 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 10 * 10 - 9), Point(1 * 10, 10 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 9 * 10 - 9), Point(1 * 10, 9 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 8 * 10 - 9), Point(1 * 10, 8 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 7 * 10 - 9), Point(1 * 10, 7 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 6 * 10 - 9), Point(1 * 10, 6 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 5 * 10 - 9), Point(1 * 10, 5 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 4 * 10 - 9), Point(1 * 10, 4 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 3 * 10 - 9), Point(1 * 10, 3 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 2 * 10 - 9), Point(1 * 10, 2 * 10)));
|
||||
INSERT INTO t2 (g) VALUES (LineString(Point(1 * 10 - 9, 1 * 10 - 9), Point(1 * 10, 1 * 10)));
|
||||
ALTER TABLE t2 ADD SPATIAL KEY(g);
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
@ -51,212 +291,408 @@ count(*)
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 range g g 34 NULL 4 Using where
|
||||
1 SIMPLE t2 range g g 34 NULL 1 Using where
|
||||
SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
fid AsText(g)
|
||||
46 LINESTRING(51 41,60 50)
|
||||
56 LINESTRING(41 41,50 50)
|
||||
45 LINESTRING(51 51,60 60)
|
||||
55 LINESTRING(41 51,50 60)
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 10 * 10 - 9), Point(10 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 9 * 10 - 9), Point(10 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 8 * 10 - 9), Point(10 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 7 * 10 - 9), Point(10 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 6 * 10 - 9), Point(10 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 5 * 10 - 9), Point(10 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 4 * 10 - 9), Point(10 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 3 * 10 - 9), Point(10 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 2 * 10 - 9), Point(10 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(10 * 10 - 9, 1 * 10 - 9), Point(10 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 10 * 10 - 9), Point(9 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 9 * 10 - 9), Point(9 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 8 * 10 - 9), Point(9 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 7 * 10 - 9), Point(9 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 6 * 10 - 9), Point(9 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 5 * 10 - 9), Point(9 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 4 * 10 - 9), Point(9 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 3 * 10 - 9), Point(9 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 2 * 10 - 9), Point(9 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(9 * 10 - 9, 1 * 10 - 9), Point(9 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 10 * 10 - 9), Point(8 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 9 * 10 - 9), Point(8 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 8 * 10 - 9), Point(8 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 7 * 10 - 9), Point(8 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 6 * 10 - 9), Point(8 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 5 * 10 - 9), Point(8 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 4 * 10 - 9), Point(8 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 3 * 10 - 9), Point(8 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 2 * 10 - 9), Point(8 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(8 * 10 - 9, 1 * 10 - 9), Point(8 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 10 * 10 - 9), Point(7 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 9 * 10 - 9), Point(7 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 8 * 10 - 9), Point(7 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 7 * 10 - 9), Point(7 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 6 * 10 - 9), Point(7 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 5 * 10 - 9), Point(7 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 4 * 10 - 9), Point(7 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 3 * 10 - 9), Point(7 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 2 * 10 - 9), Point(7 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(7 * 10 - 9, 1 * 10 - 9), Point(7 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 10 * 10 - 9), Point(6 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 9 * 10 - 9), Point(6 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 8 * 10 - 9), Point(6 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 7 * 10 - 9), Point(6 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 6 * 10 - 9), Point(6 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 5 * 10 - 9), Point(6 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 4 * 10 - 9), Point(6 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 3 * 10 - 9), Point(6 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 2 * 10 - 9), Point(6 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(6 * 10 - 9, 1 * 10 - 9), Point(6 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 10 * 10 - 9), Point(5 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 9 * 10 - 9), Point(5 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 8 * 10 - 9), Point(5 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 7 * 10 - 9), Point(5 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 6 * 10 - 9), Point(5 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 5 * 10 - 9), Point(5 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 4 * 10 - 9), Point(5 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 3 * 10 - 9), Point(5 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 2 * 10 - 9), Point(5 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(5 * 10 - 9, 1 * 10 - 9), Point(5 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 10 * 10 - 9), Point(4 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 9 * 10 - 9), Point(4 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 8 * 10 - 9), Point(4 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 7 * 10 - 9), Point(4 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 6 * 10 - 9), Point(4 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 5 * 10 - 9), Point(4 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 4 * 10 - 9), Point(4 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 3 * 10 - 9), Point(4 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 2 * 10 - 9), Point(4 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(4 * 10 - 9, 1 * 10 - 9), Point(4 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 10 * 10 - 9), Point(3 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 9 * 10 - 9), Point(3 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 8 * 10 - 9), Point(3 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 7 * 10 - 9), Point(3 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 6 * 10 - 9), Point(3 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 5 * 10 - 9), Point(3 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 4 * 10 - 9), Point(3 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 3 * 10 - 9), Point(3 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 2 * 10 - 9), Point(3 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(3 * 10 - 9, 1 * 10 - 9), Point(3 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 10 * 10 - 9), Point(2 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 9 * 10 - 9), Point(2 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 8 * 10 - 9), Point(2 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 7 * 10 - 9), Point(2 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 6 * 10 - 9), Point(2 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 5 * 10 - 9), Point(2 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 4 * 10 - 9), Point(2 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 3 * 10 - 9), Point(2 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 2 * 10 - 9), Point(2 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(2 * 10 - 9, 1 * 10 - 9), Point(2 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 10 * 10 - 9), Point(1 * 10, 10 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 9 * 10 - 9), Point(1 * 10, 9 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 8 * 10 - 9), Point(1 * 10, 8 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 7 * 10 - 9), Point(1 * 10, 7 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 6 * 10 - 9), Point(1 * 10, 6 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 5 * 10 - 9), Point(1 * 10, 5 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 4 * 10 - 9), Point(1 * 10, 4 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 3 * 10 - 9), Point(1 * 10, 3 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 2 * 10 - 9), Point(1 * 10, 2 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(Point(1 * 10 - 9, 1 * 10 - 9), Point(1 * 10, 1 * 10))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
100
|
||||
DROP TABLE t2;
|
||||
|
@ -66,7 +66,9 @@ INSERT INTO gis_multi_polygon VALUES
|
||||
(119, MPolyFromWKB(AsWKB(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(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
|
||||
(122, GeomFromText('GeometryCollection()')),
|
||||
(123, GeomFromText('GeometryCollection EMPTY'));
|
||||
INSERT into gis_geometry SELECT * FROM gis_point;
|
||||
INSERT into gis_geometry SELECT * FROM gis_line;
|
||||
INSERT into gis_geometry SELECT * FROM gis_polygon;
|
||||
@ -109,6 +111,8 @@ SELECT fid, AsText(g) FROM gis_geometrycollection;
|
||||
fid AsText(g)
|
||||
120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
|
||||
121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
|
||||
122 GEOMETRYCOLLECTION EMPTY
|
||||
123 GEOMETRYCOLLECTION EMPTY
|
||||
SELECT fid, AsText(g) FROM gis_geometry;
|
||||
fid AsText(g)
|
||||
101 POINT(10 10)
|
||||
@ -132,6 +136,8 @@ fid AsText(g)
|
||||
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))
|
||||
122 GEOMETRYCOLLECTION EMPTY
|
||||
123 GEOMETRYCOLLECTION EMPTY
|
||||
SELECT fid, Dimension(g) FROM gis_geometry;
|
||||
fid Dimension(g)
|
||||
101 0
|
||||
@ -155,6 +161,8 @@ fid Dimension(g)
|
||||
119 2
|
||||
120 1
|
||||
121 1
|
||||
122 0
|
||||
123 0
|
||||
SELECT fid, GeometryType(g) FROM gis_geometry;
|
||||
fid GeometryType(g)
|
||||
101 POINT
|
||||
@ -178,6 +186,8 @@ fid GeometryType(g)
|
||||
119 MULTIPOLYGON
|
||||
120 GEOMETRYCOLLECTION
|
||||
121 GEOMETRYCOLLECTION
|
||||
122 GEOMETRYCOLLECTION
|
||||
123 GEOMETRYCOLLECTION
|
||||
SELECT fid, IsEmpty(g) FROM gis_geometry;
|
||||
fid IsEmpty(g)
|
||||
101 0
|
||||
@ -201,6 +211,8 @@ fid IsEmpty(g)
|
||||
119 0
|
||||
120 0
|
||||
121 0
|
||||
122 0
|
||||
123 0
|
||||
SELECT fid, AsText(Envelope(g)) FROM gis_geometry;
|
||||
fid AsText(Envelope(g))
|
||||
101 POLYGON((10 10,10 10,10 10,10 10,10 10))
|
||||
@ -224,11 +236,13 @@ fid AsText(Envelope(g))
|
||||
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))
|
||||
122 GEOMETRYCOLLECTION EMPTY
|
||||
123 GEOMETRYCOLLECTION EMPTY
|
||||
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
|
||||
1 SIMPLE gis_geometry ALL NULL NULL NULL NULL 23 100.00
|
||||
Warnings:
|
||||
Note 1003 select dimension(`test`.`gis_geometry`.`g`) AS `Dimension(g)`,geometrytype(`test`.`gis_geometry`.`g`) AS `GeometryType(g)`,isempty(`test`.`gis_geometry`.`g`) AS `IsEmpty(g)`,astext(envelope(`test`.`gis_geometry`.`g`)) AS `AsText(Envelope(g))` from `test`.`gis_geometry`
|
||||
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;
|
||||
fid X(g)
|
||||
101 10
|
||||
@ -245,7 +259,7 @@ 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 x(`test`.`gis_point`.`g`) AS `X(g)`,y(`test`.`gis_point`.`g`) AS `Y(g)` from `test`.`gis_point`
|
||||
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;
|
||||
fid AsText(StartPoint(g))
|
||||
105 POINT(0 0)
|
||||
@ -280,7 +294,7 @@ explain extended select AsText(StartPoint(g)),AsText(EndPoint(g)),GLength(g),Num
|
||||
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 astext(startpoint(`test`.`gis_line`.`g`)) AS `AsText(StartPoint(g))`,astext(endpoint(`test`.`gis_line`.`g`)) AS `AsText(EndPoint(g))`,glength(`test`.`gis_line`.`g`) AS `GLength(g)`,numpoints(`test`.`gis_line`.`g`) AS `NumPoints(g)`,astext(pointn(`test`.`gis_line`.`g`,2)) AS `AsText(PointN(g, 2))`,isclosed(`test`.`gis_line`.`g`) AS `IsClosed(g)` from `test`.`gis_line`
|
||||
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;
|
||||
fid AsText(Centroid(g))
|
||||
108 POINT(15 15)
|
||||
@ -310,7 +324,7 @@ explain extended select AsText(Centroid(g)),Area(g),AsText(ExteriorRing(g)),NumI
|
||||
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 astext(centroid(`test`.`gis_polygon`.`g`)) AS `AsText(Centroid(g))`,area(`test`.`gis_polygon`.`g`) AS `Area(g)`,astext(exteriorring(`test`.`gis_polygon`.`g`)) AS `AsText(ExteriorRing(g))`,numinteriorrings(`test`.`gis_polygon`.`g`) AS `NumInteriorRings(g)`,astext(interiorringn(`test`.`gis_polygon`.`g`,1)) AS `AsText(InteriorRingN(g, 1))` from `test`.`gis_polygon`
|
||||
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;
|
||||
fid IsClosed(g)
|
||||
114 0
|
||||
@ -345,11 +359,13 @@ SELECT fid, NumGeometries(g) from gis_geometrycollection;
|
||||
fid NumGeometries(g)
|
||||
120 2
|
||||
121 2
|
||||
122 0
|
||||
123 0
|
||||
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`,numgeometries(`test`.`gis_multi_point`.`g`) AS `NumGeometries(g)` from `test`.`gis_multi_point`
|
||||
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;
|
||||
fid AsText(GeometryN(g, 2))
|
||||
111 POINT(10 10)
|
||||
@ -369,35 +385,51 @@ SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection;
|
||||
fid AsText(GeometryN(g, 2))
|
||||
120 LINESTRING(0 0,10 10)
|
||||
121 LINESTRING(3 6,7 9)
|
||||
122 NULL
|
||||
123 NULL
|
||||
SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection;
|
||||
fid AsText(GeometryN(g, 1))
|
||||
120 POINT(0 0)
|
||||
121 POINT(44 6)
|
||||
122 NULL
|
||||
123 NULL
|
||||
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`,astext(geometryn(`test`.`gis_multi_point`.`g`,2)) AS `AsText(GeometryN(g, 2))` from `test`.`gis_multi_point`
|
||||
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 120 1 1 0 1 0 1 1 0
|
||||
120 121 0 0 1 0 0 0 1 0
|
||||
120 122 0 1 NULL 0 NULL 0 NULL 0
|
||||
120 123 0 1 NULL 0 NULL 0 NULL 0
|
||||
121 120 0 0 1 0 0 0 1 0
|
||||
121 121 1 1 0 1 0 0 1 0
|
||||
121 121 1 1 0 1 0 1 1 0
|
||||
121 122 0 1 NULL 0 NULL 0 NULL 0
|
||||
121 123 0 1 NULL 0 NULL 0 NULL 0
|
||||
122 120 1 0 NULL 0 NULL 0 NULL 0
|
||||
122 121 1 0 NULL 0 NULL 0 NULL 0
|
||||
122 122 1 1 NULL 1 NULL 0 NULL 0
|
||||
122 123 1 1 NULL 1 NULL 0 NULL 0
|
||||
123 120 1 0 NULL 0 NULL 0 NULL 0
|
||||
123 121 1 0 NULL 0 NULL 0 NULL 0
|
||||
123 122 1 1 NULL 1 NULL 0 NULL 0
|
||||
123 123 1 1 NULL 1 NULL 0 NULL 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)
|
||||
1 SIMPLE g1 ALL NULL NULL NULL NULL 4 100.00 Using temporary; Using filesort
|
||||
1 SIMPLE g2 ALL NULL NULL NULL NULL 4 100.00 Using join buffer (flat, BNL join)
|
||||
Warnings:
|
||||
Note 1003 select `test`.`g1`.`fid` AS `first`,`test`.`g2`.`fid` AS `second`,within(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,contains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,overlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,equals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,disjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,intersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,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`
|
||||
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 (
|
||||
gp point,
|
||||
@ -439,12 +471,12 @@ explain extended SELECT AsText(GeometryFromWKB(AsWKB(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 astext(geometryfromwkb(aswkb(geometryfromtext('POINT(1 4)')))) AS `AsText(GeometryFromWKB(AsWKB(GeometryFromText('POINT(1 4)'))))`
|
||||
Note 1003 select st_astext(st_geometryfromwkb(st_aswkb(st_geometryfromtext('POINT(1 4)')))) AS `AsText(GeometryFromWKB(AsWKB(GeometryFromText('POINT(1 4)'))))`
|
||||
explain extended SELECT AsText(GeometryFromWKB(AsWKB(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 astext(geometryfromwkb(aswkb(geometryfromtext('POINT(1 4)')))) AS `AsText(GeometryFromWKB(AsWKB(PointFromText('POINT(1 4)'))))`
|
||||
Note 1003 select st_astext(st_geometryfromwkb(st_aswkb(st_geometryfromtext('POINT(1 4)')))) AS `AsText(GeometryFromWKB(AsWKB(PointFromText('POINT(1 4)'))))`
|
||||
SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));
|
||||
SRID(GeomFromText('LineString(1 1,2 2)',101))
|
||||
101
|
||||
@ -452,12 +484,12 @@ explain extended SELECT SRID(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(geometryfromtext('LineString(1 1,2 2)',101)) AS `SRID(GeomFromText('LineString(1 1,2 2)',101))`
|
||||
Note 1003 select srid(st_geometryfromtext('LineString(1 1,2 2)',101)) AS `SRID(GeomFromText('LineString(1 1,2 2)',101))`
|
||||
explain extended select issimple(MultiPoint(Point(3, 6), Point(4, 10))), 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 issimple(multipoint(point(3,6),point(4,10))) AS `issimple(MultiPoint(Point(3, 6), Point(4, 10)))`,issimple(point(3,6)) AS `issimple(Point(3, 6))`
|
||||
Note 1003 select st_issimple(st_multipoint(st_point(3,6),st_point(4,10))) AS `issimple(MultiPoint(Point(3, 6), Point(4, 10)))`,st_issimple(st_point(3,6)) AS `issimple(Point(3, 6))`
|
||||
create table t1 (a geometry not null);
|
||||
insert into t1 values (GeomFromText('Point(1 2)'));
|
||||
insert into t1 values ('Garbage');
|
||||
@ -651,11 +683,11 @@ insert into t1 values ('85984',GeomFromText('MULTIPOLYGON(((-115.006363
|
||||
select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from
|
||||
t1 where object_id=85998;
|
||||
object_id geometrytype(geo) ISSIMPLE(GEO) ASTEXT(centroid(geo))
|
||||
85998 MULTIPOLYGON 0 POINT(115.318773152032 -36.2374728210215)
|
||||
85998 MULTIPOLYGON 1 POINT(115.318773152032 -36.2374728210215)
|
||||
select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from
|
||||
t1 where object_id=85984;
|
||||
object_id geometrytype(geo) ISSIMPLE(GEO) ASTEXT(centroid(geo))
|
||||
85984 MULTIPOLYGON 0 POINT(-114.877871869233 36.3310176346905)
|
||||
85984 MULTIPOLYGON 1 POINT(-114.877871869233 36.3310176346905)
|
||||
drop table t1;
|
||||
create table t1 (fl geometry not null);
|
||||
insert into t1 values (1);
|
||||
@ -802,17 +834,6 @@ 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 GeomFromwkb(ASBINARY(a)) FROM t1;
|
||||
CREATE VIEW v2 AS SELECT a FROM t1;
|
||||
DESCRIBE v1;
|
||||
Field Type Null Key Default Extra
|
||||
GeomFromwkb(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", 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))'));
|
||||
@ -846,7 +867,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
@ -867,7 +888,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
@ -1040,6 +1061,400 @@ drop table t1;
|
||||
#
|
||||
create table t1(a char(32) not null) engine=myisam;
|
||||
create spatial index i on t1 (a);
|
||||
ERROR HY000: Can't create table '#sql-temporary' (errno: 140)
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
CREATE TABLE t1(
|
||||
col0 BINARY NOT NULL,
|
||||
col2 TIMESTAMP,
|
||||
SPATIAL INDEX i1 (col0)
|
||||
) ENGINE=MyISAM;
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
CREATE TABLE t1 (
|
||||
col0 BINARY NOT NULL,
|
||||
col2 TIMESTAMP
|
||||
) ENGINE=MyISAM;
|
||||
CREATE SPATIAL INDEX idx0 ON t1(col0);
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
ALTER TABLE t1 ADD SPATIAL INDEX i1 (col0);
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
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 t1;
|
||||
DROP TABLE t2;
|
||||
select ST_AREA(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 31 10, 77 80), POLYGON((0 0,4 7,1 1,0 0)), POINT(20 20))'));
|
||||
ST_AREA(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 31 10, 77 80), POLYGON((0 0,4 7,1 1,0 0)), POINT(20 20))'))
|
||||
1.5
|
||||
select ST_LENGTH(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 100 30, 20 30), POINT(3 3), LINESTRING(20 20, 30 20))'));
|
||||
ST_LENGTH(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 100 30, 20 30), POINT(3 3), LINESTRING(20 20, 30 20))'))
|
||||
160
|
||||
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',
|
||||
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,
|
||||
LineFromText(
|
||||
'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
|
||||
INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
|
||||
LineFromText(
|
||||
'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
|
||||
INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
|
||||
LineFromText(
|
||||
'LINESTRING( 70 38, 72 48 )' ,101));
|
||||
INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
|
||||
LineFromText(
|
||||
'LINESTRING( 70 38, 84 42 )' ,101));
|
||||
INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
|
||||
1,
|
||||
LineFromText(
|
||||
'LINESTRING( 28 26, 28 0 )',101));
|
||||
# DividedRoutes
|
||||
INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
|
||||
MLineFromText(
|
||||
'MULTILINESTRING((10 48,10 21,10 0),
|
||||
(16 0,16 23,16 48))', 101));
|
||||
# Forests
|
||||
INSERT INTO forests VALUES(109, 'Green Forest',
|
||||
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', PointFromText(
|
||||
'POINT( 44 31 )', 101));
|
||||
# Streams
|
||||
INSERT INTO streams VALUES(111, 'Cam Stream',
|
||||
LineFromText(
|
||||
'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
|
||||
INSERT INTO streams VALUES(112, NULL,
|
||||
LineFromText(
|
||||
'LINESTRING( 76 0, 78 4, 73 9 )', 101));
|
||||
# Buildings
|
||||
INSERT INTO buildings VALUES(113, '123 Main Street',
|
||||
PointFromText(
|
||||
'POINT( 52 30 )', 101),
|
||||
PolyFromText(
|
||||
'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
|
||||
INSERT INTO buildings VALUES(114, '215 Main Street',
|
||||
PointFromText(
|
||||
'POINT( 64 33 )', 101),
|
||||
PolyFromText(
|
||||
'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
|
||||
# Ponds
|
||||
INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
|
||||
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',
|
||||
PolyFromText(
|
||||
'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
|
||||
INSERT INTO named_places VALUES(118, 'Goose Island',
|
||||
PolyFromText(
|
||||
'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
|
||||
# Map Neatlines
|
||||
INSERT INTO map_neatlines VALUES(115,
|
||||
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 Dimension(shore)
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
Dimension(shore)
|
||||
2
|
||||
# Conformance Item T7
|
||||
SELECT GeometryType(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
GeometryType(centerlines)
|
||||
MULTILINESTRING
|
||||
# Conformance Item T8
|
||||
SELECT AsText(boundary)
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
AsText(boundary)
|
||||
POLYGON((67 13,67 18,59 18,59 13,67 13))
|
||||
# Conformance Item T9
|
||||
SELECT AsText(PolyFromWKB(AsBinary(boundary),101))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
AsText(PolyFromWKB(AsBinary(boundary),101))
|
||||
POLYGON((67 13,67 18,59 18,59 13,67 13))
|
||||
# Conformance Item T10
|
||||
SELECT SRID(boundary)
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
SRID(boundary)
|
||||
101
|
||||
# Conformance Item T11
|
||||
SELECT IsEmpty(centerline)
|
||||
FROM road_segments
|
||||
WHERE name = 'Route 5'
|
||||
AND aliases = 'Main Street';
|
||||
IsEmpty(centerline)
|
||||
0
|
||||
# Conformance Item T14
|
||||
SELECT AsText(Envelope(boundary))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
AsText(Envelope(boundary))
|
||||
POLYGON((59 13,67 13,67 18,59 18,59 13))
|
||||
# Conformance Item T15
|
||||
SELECT X(position)
|
||||
FROM bridges
|
||||
WHERE name = 'Cam Bridge';
|
||||
X(position)
|
||||
44
|
||||
# Conformance Item T16
|
||||
SELECT Y(position)
|
||||
FROM bridges
|
||||
WHERE name = 'Cam Bridge';
|
||||
Y(position)
|
||||
31
|
||||
# Conformance Item T17
|
||||
SELECT AsText(StartPoint(centerline))
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
AsText(StartPoint(centerline))
|
||||
POINT(0 18)
|
||||
# Conformance Item T18
|
||||
SELECT AsText(EndPoint(centerline))
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
AsText(EndPoint(centerline))
|
||||
POINT(44 31)
|
||||
# Conformance Item T21
|
||||
SELECT GLength(centerline)
|
||||
FROM road_segments
|
||||
WHERE fid = 106;
|
||||
GLength(centerline)
|
||||
26
|
||||
# Conformance Item T22
|
||||
SELECT NumPoints(centerline)
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
NumPoints(centerline)
|
||||
5
|
||||
# Conformance Item T23
|
||||
SELECT AsText(PointN(centerline, 1))
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
AsText(PointN(centerline, 1))
|
||||
POINT(0 18)
|
||||
# Conformance Item T24
|
||||
SELECT AsText(Centroid(boundary))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
AsText(Centroid(boundary))
|
||||
POINT(63 15.5)
|
||||
# Conformance Item T26
|
||||
SELECT Area(boundary)
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
Area(boundary)
|
||||
40
|
||||
# Conformance Item T27
|
||||
SELECT AsText(ExteriorRing(shore))
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
AsText(ExteriorRing(shore))
|
||||
LINESTRING(52 18,66 23,73 9,48 6,52 18)
|
||||
# Conformance Item T28
|
||||
SELECT NumInteriorRings(shore)
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
NumInteriorRings(shore)
|
||||
1
|
||||
# Conformance Item T29
|
||||
SELECT AsText(InteriorRingN(shore, 1))
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
AsText(InteriorRingN(shore, 1))
|
||||
LINESTRING(59 18,67 18,67 13,59 13,59 18)
|
||||
# Conformance Item T30
|
||||
SELECT NumGeometries(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
NumGeometries(centerlines)
|
||||
2
|
||||
# Conformance Item T31
|
||||
SELECT AsText(GeometryN(centerlines, 2))
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
AsText(GeometryN(centerlines, 2))
|
||||
LINESTRING(16 0,16 23,16 48)
|
||||
# Conformance Item T32
|
||||
SELECT IsClosed(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
IsClosed(centerlines)
|
||||
0
|
||||
# Conformance Item T33
|
||||
SELECT GLength(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
GLength(centerlines)
|
||||
96
|
||||
# Conformance Item T34
|
||||
SELECT AsText(Centroid(shores))
|
||||
FROM ponds
|
||||
WHERE fid = 120;
|
||||
AsText(Centroid(shores))
|
||||
POINT(25 42)
|
||||
# Conformance Item T36
|
||||
SELECT Area(shores)
|
||||
FROM ponds
|
||||
WHERE fid = 120;
|
||||
Area(shores)
|
||||
8
|
||||
# Conformance Item T37
|
||||
SELECT ST_Equals(boundary,
|
||||
PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
ST_Equals(boundary,
|
||||
PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
|
||||
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 Crosses(road_segments.centerline, divided_routes.centerlines)
|
||||
FROM road_segments, divided_routes
|
||||
WHERE road_segments.fid = 102
|
||||
AND divided_routes.name = 'Route 75';
|
||||
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 AsText(ST_Difference(named_places.boundary, forests.boundary))
|
||||
FROM named_places, forests
|
||||
WHERE named_places.name = 'Ashton'
|
||||
AND forests.name = 'Green Forest';
|
||||
AsText(ST_Difference(named_places.boundary, forests.boundary))
|
||||
POLYGON((56 34,62 48,84 48,84 42,56 34))
|
||||
SELECT AsText(ST_Union(shore, boundary))
|
||||
FROM lakes, named_places
|
||||
WHERE lakes.name = 'Blue Lake'
|
||||
AND named_places.name = 'Goose Island';
|
||||
AsText(ST_Union(shore, boundary))
|
||||
POLYGON((48 6,52 18,66 23,73 9,48 6))
|
||||
# Conformance Item T50
|
||||
SELECT AsText(ST_SymDifference(shore, boundary))
|
||||
FROM lakes, named_places
|
||||
WHERE lakes.name = 'Blue Lake'
|
||||
AND named_places.name = 'Ashton';
|
||||
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;
|
||||
|
@ -236,7 +236,7 @@ explain extended select Dimension(g), GeometryType(g), IsEmpty(g), AsText(Envelo
|
||||
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 dimension(`test`.`gis_geometry`.`g`) AS `Dimension(g)`,geometrytype(`test`.`gis_geometry`.`g`) AS `GeometryType(g)`,isempty(`test`.`gis_geometry`.`g`) AS `IsEmpty(g)`,astext(envelope(`test`.`gis_geometry`.`g`)) AS `AsText(Envelope(g))` from `test`.`gis_geometry`
|
||||
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
|
||||
@ -253,7 +253,7 @@ 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 x(`test`.`gis_point`.`g`) AS `X(g)`,y(`test`.`gis_point`.`g`) AS `Y(g)` from `test`.`gis_point`
|
||||
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)
|
||||
@ -288,7 +288,7 @@ explain extended select AsText(StartPoint(g)),AsText(EndPoint(g)),GLength(g),Num
|
||||
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 astext(startpoint(`test`.`gis_line`.`g`)) AS `AsText(StartPoint(g))`,astext(endpoint(`test`.`gis_line`.`g`)) AS `AsText(EndPoint(g))`,glength(`test`.`gis_line`.`g`) AS `GLength(g)`,numpoints(`test`.`gis_line`.`g`) AS `NumPoints(g)`,astext(pointn(`test`.`gis_line`.`g`,2)) AS `AsText(PointN(g, 2))`,isclosed(`test`.`gis_line`.`g`) AS `IsClosed(g)` from `test`.`gis_line`
|
||||
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)
|
||||
@ -318,7 +318,7 @@ explain extended select AsText(Centroid(g)),Area(g),AsText(ExteriorRing(g)),NumI
|
||||
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 astext(centroid(`test`.`gis_polygon`.`g`)) AS `AsText(Centroid(g))`,area(`test`.`gis_polygon`.`g`) AS `Area(g)`,astext(exteriorring(`test`.`gis_polygon`.`g`)) AS `AsText(ExteriorRing(g))`,numinteriorrings(`test`.`gis_polygon`.`g`) AS `NumInteriorRings(g)`,astext(interiorringn(`test`.`gis_polygon`.`g`,1)) AS `AsText(InteriorRingN(g, 1))` from `test`.`gis_polygon`
|
||||
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
|
||||
@ -357,7 +357,7 @@ 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`,numgeometries(`test`.`gis_multi_point`.`g`) AS `NumGeometries(g)` from `test`.`gis_multi_point`
|
||||
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)
|
||||
@ -385,17 +385,17 @@ 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`,astext(geometryn(`test`.`gis_multi_point`.`g`,2)) AS `AsText(GeometryN(g, 2))` from `test`.`gis_multi_point`
|
||||
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 120 1 1 0 1 0 1 1 1
|
||||
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
|
||||
121 121 1 1 0 1 0 1 1 1
|
||||
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,
|
||||
@ -405,7 +405,7 @@ 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`,within(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,contains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,overlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,equals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,disjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,intersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,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`
|
||||
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`,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 (
|
||||
a INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||
@ -494,7 +494,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
@ -515,7 +515,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
|
@ -236,7 +236,7 @@ explain extended select Dimension(g), GeometryType(g), IsEmpty(g), AsText(Envelo
|
||||
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 dimension(`test`.`gis_geometry`.`g`) AS `Dimension(g)`,geometrytype(`test`.`gis_geometry`.`g`) AS `GeometryType(g)`,isempty(`test`.`gis_geometry`.`g`) AS `IsEmpty(g)`,astext(envelope(`test`.`gis_geometry`.`g`)) AS `AsText(Envelope(g))` from `test`.`gis_geometry`
|
||||
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
|
||||
@ -253,7 +253,7 @@ 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 x(`test`.`gis_point`.`g`) AS `X(g)`,y(`test`.`gis_point`.`g`) AS `Y(g)` from `test`.`gis_point`
|
||||
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)
|
||||
@ -288,7 +288,7 @@ explain extended select AsText(StartPoint(g)),AsText(EndPoint(g)),GLength(g),Num
|
||||
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 astext(startpoint(`test`.`gis_line`.`g`)) AS `AsText(StartPoint(g))`,astext(endpoint(`test`.`gis_line`.`g`)) AS `AsText(EndPoint(g))`,glength(`test`.`gis_line`.`g`) AS `GLength(g)`,numpoints(`test`.`gis_line`.`g`) AS `NumPoints(g)`,astext(pointn(`test`.`gis_line`.`g`,2)) AS `AsText(PointN(g, 2))`,isclosed(`test`.`gis_line`.`g`) AS `IsClosed(g)` from `test`.`gis_line`
|
||||
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)
|
||||
@ -318,7 +318,7 @@ explain extended select AsText(Centroid(g)),Area(g),AsText(ExteriorRing(g)),NumI
|
||||
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 astext(centroid(`test`.`gis_polygon`.`g`)) AS `AsText(Centroid(g))`,area(`test`.`gis_polygon`.`g`) AS `Area(g)`,astext(exteriorring(`test`.`gis_polygon`.`g`)) AS `AsText(ExteriorRing(g))`,numinteriorrings(`test`.`gis_polygon`.`g`) AS `NumInteriorRings(g)`,astext(interiorringn(`test`.`gis_polygon`.`g`,1)) AS `AsText(InteriorRingN(g, 1))` from `test`.`gis_polygon`
|
||||
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
|
||||
@ -357,7 +357,7 @@ 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`,numgeometries(`test`.`gis_multi_point`.`g`) AS `NumGeometries(g)` from `test`.`gis_multi_point`
|
||||
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)
|
||||
@ -385,17 +385,17 @@ 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`,astext(geometryn(`test`.`gis_multi_point`.`g`,2)) AS `AsText(GeometryN(g, 2))` from `test`.`gis_multi_point`
|
||||
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 120 1 1 0 1 0 1 1 1
|
||||
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
|
||||
121 121 1 1 0 1 0 1 1 1
|
||||
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,
|
||||
@ -405,7 +405,7 @@ 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`,within(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,contains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,overlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,equals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,disjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,intersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,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`
|
||||
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`,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 (
|
||||
a INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||
@ -494,7 +494,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
@ -515,7 +515,7 @@ 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
|
||||
big,center,down,down2,left,left2,right,right2,small,up,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
|
||||
|
@ -168,7 +168,7 @@ count(*)
|
||||
150
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range g g 34 NULL 11 Using where
|
||||
1 SIMPLE t1 ALL g NULL NULL NULL 150 Using where
|
||||
SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
fid AsText(g)
|
||||
1 LINESTRING(150 150,150 150)
|
||||
@ -302,14 +302,10 @@ count(*)
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 range g g 34 NULL 4 Using where
|
||||
1 SIMPLE t2 range g g 34 NULL 1 Using where
|
||||
SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
fid AsText(g)
|
||||
45 LINESTRING(51 51,60 60)
|
||||
46 LINESTRING(51 41,60 50)
|
||||
55 LINESTRING(41 51,50 60)
|
||||
56 LINESTRING(41 41,50 50)
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(LineString(Point(10 * 10 - 9, 10 * 10 - 9), Point(10 * 10, 10 * 10)))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
|
@ -168,7 +168,7 @@ count(*)
|
||||
150
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range g g 34 NULL 11 Using where
|
||||
1 SIMPLE t1 ALL g NULL NULL NULL 150 Using where
|
||||
SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
fid AsText(g)
|
||||
1 LINESTRING(150 150,150 150)
|
||||
@ -302,14 +302,10 @@ count(*)
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 range g g 34 NULL 4 Using where
|
||||
1 SIMPLE t2 range g g 34 NULL 1 Using where
|
||||
SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
fid AsText(g)
|
||||
45 LINESTRING(51 51,60 60)
|
||||
46 LINESTRING(51 41,60 50)
|
||||
55 LINESTRING(41 51,50 60)
|
||||
56 LINESTRING(41 41,50 50)
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(LineString(Point(10 * 10 - 9, 10 * 10 - 9), Point(10 * 10, 10 * 10)))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
|
@ -168,7 +168,7 @@ count(*)
|
||||
150
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range g g 34 NULL 11 Using where
|
||||
1 SIMPLE t1 ALL g NULL NULL NULL 150 Using where
|
||||
SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
fid AsText(g)
|
||||
1 LINESTRING(150 150,150 150)
|
||||
@ -302,14 +302,10 @@ count(*)
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 range g g 34 NULL 4 Using where
|
||||
1 SIMPLE t2 range g g 34 NULL 1 Using where
|
||||
SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
fid AsText(g)
|
||||
45 LINESTRING(51 51,60 60)
|
||||
46 LINESTRING(51 41,60 50)
|
||||
55 LINESTRING(41 51,50 60)
|
||||
56 LINESTRING(41 41,50 50)
|
||||
DELETE FROM t2 WHERE Within(g, Envelope(GeometryFromWKB(LineString(Point(10 * 10 - 9, 10 * 10 - 9), Point(10 * 10, 10 * 10)))));
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
|
@ -95,10 +95,10 @@ drop table t1;
|
||||
if (!$skip_spatial_index_check)
|
||||
{
|
||||
--echo # Error "All parts of a SPATIAL index must be NOT NULL"
|
||||
--error ER_SPATIAL_CANT_HAVE_NULL
|
||||
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||
create table t1 (a int, b int as (a+1) persistent, spatial index (b));
|
||||
create table t1 (a int, b int as (a+1) persistent);
|
||||
--error ER_SPATIAL_CANT_HAVE_NULL
|
||||
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||
alter table t1 add spatial index (b);
|
||||
drop table t1;
|
||||
}
|
||||
|
@ -101,10 +101,10 @@ drop table t1;
|
||||
# SPATIAL INDEX
|
||||
# Error "All parts of a SPATIAL index must be NOT NULL"
|
||||
create table t1 (a int, b int as (a+1) persistent, spatial index (b));
|
||||
ERROR 42000: All parts of a SPATIAL index must be NOT NULL
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
create table t1 (a int, b int as (a+1) persistent);
|
||||
alter table t1 add spatial index (b);
|
||||
ERROR 42000: All parts of a SPATIAL index must be NOT NULL
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
drop table t1;
|
||||
# FOREIGN KEY
|
||||
# Rejected FK options.
|
||||
|
312
mysql-test/t/gis-precise.test
Normal file
312
mysql-test/t/gis-precise.test
Normal file
@ -0,0 +1,312 @@
|
||||
-- source include/have_geometry.inc
|
||||
|
||||
|
||||
#
|
||||
# Spatial objects
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))'));
|
||||
select 0, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))'));
|
||||
select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)'));
|
||||
select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
|
||||
select 0, ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
|
||||
select 1, ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))'));
|
||||
|
||||
|
||||
create table t1 (g point);
|
||||
insert into t1 values
|
||||
(GeomFromText('POINT(2 2)')), (GeomFromText('POINT(2 4)')), (GeomFromText('POINT(2 6)')), (GeomFromText('POINT(2 8)')),
|
||||
(GeomFromText('POINT(4 2)')), (GeomFromText('POINT(4 4)')), (GeomFromText('POINT(4 6)')), (GeomFromText('POINT(4 8)')),
|
||||
(GeomFromText('POINT(6 2)')), (GeomFromText('POINT(6 4)')), (GeomFromText('POINT(6 6)')), (GeomFromText('POINT(6 8)')),
|
||||
(GeomFromText('POINT(8 2)')), (GeomFromText('POINT(8 4)')), (GeomFromText('POINT(8 6)')), (GeomFromText('POINT(8 8)'));
|
||||
|
||||
select astext(g) from t1 where ST_Within(g, GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'));
|
||||
select 'Contains';
|
||||
select astext(g) from t1 where ST_Contains(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
|
||||
select 'Intersects';
|
||||
select astext(g) from t1 where ST_Intersects(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
|
||||
select 'Contains';
|
||||
select astext(g) from t1 where ST_Contains(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g);
|
||||
select 'Contains2';
|
||||
select astext(g) from t1 where ST_Contains(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(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
|
||||
select 1, ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))'));
|
||||
|
||||
|
||||
select 1, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)'));
|
||||
select 0, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)'));
|
||||
|
||||
select 1, ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'));
|
||||
|
||||
select astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')));
|
||||
select astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))')));
|
||||
|
||||
select ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'));
|
||||
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)'));
|
||||
select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))'));
|
||||
select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'));
|
||||
select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))'));
|
||||
select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))'));
|
||||
|
||||
# Distance tests
|
||||
select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
|
||||
select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)'));
|
||||
select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
|
||||
select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)'));
|
||||
select ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))'));
|
||||
|
||||
|
||||
# Operations tests
|
||||
select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')));
|
||||
select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)')));
|
||||
select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)')));
|
||||
select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)')));
|
||||
select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)')));
|
||||
select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
|
||||
select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
|
||||
|
||||
select astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')));
|
||||
|
||||
select astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))')));
|
||||
select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)')));
|
||||
|
||||
# Buffer() tests
|
||||
select astext(ST_buffer(geometryfromtext('point(1 1)'), 1));
|
||||
create table t1(geom geometrycollection);
|
||||
insert into t1 values (geomfromtext('POLYGON((0 0, 10 10, 0 8, 0 0))'));
|
||||
insert into t1 values (geomfromtext('POLYGON((1 1, 10 10, 0 8, 1 1))'));
|
||||
select astext(geom), area(geom),area(ST_buffer(geom,2)) from t1;
|
||||
select astext(ST_buffer(geom,2)) from t1;
|
||||
|
||||
set @geom=geomfromtext('LINESTRING(2 1, 4 2, 2 3, 2 5)');
|
||||
set @buff=ST_buffer(@geom,1);
|
||||
select astext(@buff);
|
||||
|
||||
# cleanup
|
||||
DROP TABLE t1;
|
||||
|
||||
#Touches tests
|
||||
select st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)'));
|
||||
select st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)'));
|
||||
select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)'));
|
||||
select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)'));
|
||||
select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)'));
|
||||
select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))'));
|
||||
select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))'));
|
||||
|
||||
#Equals test
|
||||
SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 19, 59 13, 59 13, 67 13) )')) as result;
|
||||
SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 18, 59 13, 59 13, 67 13) )')) as result;
|
||||
SELECT ST_Equals(PointFromText('POINT (12 13)'),PointFromText('POINT (12 13)')) as result;
|
||||
|
||||
# bug #801243 Assertion `(0)' failed in Gis_geometry_collection::init_from_opresult on ST_UNION
|
||||
|
||||
SELECT astext(ST_UNION (
|
||||
PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'),
|
||||
ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))')))));
|
||||
|
||||
#bug 801189 ST_BUFFER asserts if radius = 0
|
||||
SELECT astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0));
|
||||
|
||||
#bug 801199 Infinite recursion in Gcalc_function::count_internal with ST_BUFFER over MULTIPOINT
|
||||
SELECT Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5);
|
||||
|
||||
#bug 801212 Assertion with ST_INTERSECTION on NULL values
|
||||
SELECT ST_INTERSECTION(NULL, NULL);
|
||||
|
||||
#bug 804305 Crash in wkb_get_double with ST_INTERSECTION
|
||||
SELECT ASTEXT(ST_INTERSECTION(
|
||||
MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((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 0,0 0,0 1,2 1,2 2,0 2,0 5), (1 3,2 3,2 4,1 4,1 3)),
|
||||
((2 2,5 2,4 4,2 8,2 2)))'),
|
||||
MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 4,2 5,3 5)),
|
||||
((2 2,9 2,0 2,2 6,2 2)),
|
||||
((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)),
|
||||
((9 9,6 8,7 0,9 9)))')));
|
||||
|
||||
#bug 804324 Assertion 0 in Gcalc_scan_iterator::pop_suitable_intersection
|
||||
|
||||
SELECT ASTEXT(ST_UNION(
|
||||
MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0),
|
||||
(8 2,1 3,9 0,4 4))'),
|
||||
MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6))')));
|
||||
|
||||
SELECT ST_NUMGEOMETRIES((ST_UNION(ST_UNION(
|
||||
MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 0,4 2,0 2,1 5,0 3,7 0,8 5,5 8),
|
||||
(6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0),
|
||||
(7 8,3 1,0 9,6 0,4 8),
|
||||
(9 3,0 4,5 9,6 4),
|
||||
(8 2,1 3,9 0,4 4))'),
|
||||
MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 0,9 3,2 5,3 6,3 2),
|
||||
(2 5,6 7,9 7,5 2,1 6,3 6))')),
|
||||
MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((7 7,3 7,3 1,7 8,7 7)),
|
||||
((3 5,2 4,2 5,3 5)),
|
||||
((7 7,8 7,3 7,7 7,7 7)),
|
||||
((0 5,3 5,3 4,1 4,1 3,3 3,3 0,0 0,0 5), (1 1,2 1,2 2,1 2,1 1)))'))));
|
||||
|
||||
#bug #805860 Second assertion Assertion `n > 0 && n < SINUSES_CALCULATED*2+1' in get_n_sinco
|
||||
|
||||
SELECT Round(ST_AREA(ST_BUFFER( ST_UNION(
|
||||
POLYGONFROMTEXT('POLYGON((7 7, 7 7, 7 4, 7 7, 7 7))'),
|
||||
POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6);
|
||||
|
||||
|
||||
#bug #804259 Second assertion in Gis_geometry_collection::init_from_opresult
|
||||
|
||||
SELECT AsText(ST_UNION(MultiPolygonFromText('
|
||||
MULTIPOLYGON(((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)),
|
||||
((0 0, 8 3, 7 4, 0 0)),
|
||||
((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)))'),
|
||||
MultiPolygonFromText(' MULTIPOLYGON(((0 0, 1 9, 4 6, 0 0)),
|
||||
((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1)),
|
||||
((7 7, 4 7, 6 3, 7 2, 7 7)),
|
||||
((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1))) ')));
|
||||
|
||||
|
||||
#bug 801217 Assertion `t1->result_range' in Gcalc_operation_reducer::end_couple
|
||||
|
||||
SELECT AsText(ST_SYMDIFFERENCE(
|
||||
MultiLineStringFromText('MULTILINESTRING((7 7, 1 7, 8 5, 7 8, 7 7),
|
||||
(6 3, 3 4, 1 1, 9 9, 9 0, 8 4, 9 9))'),
|
||||
Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)'))));
|
||||
|
||||
#bug 804266 Memory corruption/valgrind warning/crash in move_hole() with ST_UNION
|
||||
|
||||
SELECT AsText(ST_UNION(
|
||||
MultiPolygonFromText('MULTIPOLYGON(((9 9, 7 9, 1 1, 9 9)),
|
||||
((2 2, 1 2, 3 3, 2 2, 2 2)),
|
||||
((0 0, 7 5, 9 6, 0 0)),
|
||||
((7 7, 5 7, 1 5, 7 1, 7 7)))'),
|
||||
MultiPolygonFromText('MULTIPOLYGON(((2 2, 2 2, 1 5, 2 7, 2 2)),
|
||||
((0 5, 3 5, 3 0, 0 0, 0 5), (1 1, 2 1, 2 4, 1 4, 1 1)))')));
|
||||
|
||||
#bug 802376 ST_INTERSECTION returns wrong result on two overlapping linestrings in maria-5.3-gis
|
||||
|
||||
SELECT AsText( ST_INTERSECTION(
|
||||
LinestringFromText('LINESTRING( 3 5, 2 5, 2 4, 3 4, 3 5 ) ') ,
|
||||
LinestringFromText('LINESTRING( 3 5, 2 4, 2 5, 3 5 ) ')
|
||||
));
|
||||
|
||||
#bug 801560 ST_UNION of adjacent polygons includes extra line in maria-5.3-gis
|
||||
|
||||
SELECT AsText( ST_UNION(
|
||||
PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') ,
|
||||
PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) );
|
||||
|
||||
#bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis
|
||||
|
||||
SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')));
|
||||
|
||||
#bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis
|
||||
SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))')));
|
||||
|
||||
#bug 839318 Crash in Gcalc_scan_iterator::point::get_shape with ST_DISTANCE and MULTILINESTRING in maria-5.3-gis
|
||||
SELECT ST_DISTANCE(POINTFROMTEXT('POINT(7 1)'),MULTILINESTRINGFROMTEXT('MULTILINESTRING(
|
||||
(4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))'));
|
||||
|
||||
#bug 839327 Crash in Gcalc_operation_reducer::end_couple with ST_UNION and MULTIPOLYGONs in 5.3-gis
|
||||
SELECT AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))')));
|
||||
|
||||
#bug 841622 Assertion `t->rp->type == Gcalc_function::shape_line' failed in Gcalc_operation_reducer::end_line in maria-5.3-gis
|
||||
|
||||
SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER(ST_UNION(
|
||||
MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 2 5, 7 6, 1 8),(0 0 ,1 6 ,0 1, 8 9, 2 4, 6 1, 3 5, 4 8), (9 3, 5 4, 1 8, 4 2, 5 8, 3 0))' ) ,
|
||||
MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 3 1, 2 7, 4 2, 6 2, 1 5))')
|
||||
), 16)));
|
||||
|
||||
#bug 841625 Assertion `m_poly_borders->next' failed in Gcalc_operation_reducer::count_slice in maria-5.3-gis
|
||||
|
||||
SELECT ST_NUMGEOMETRIES(ST_DIFFERENCE (
|
||||
ST_UNION (
|
||||
MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 4 , 5 0 , 2 9 , 6 2 , 0 2 ) , ( 4 3 , 5 6 , 9 4 , 0 7 , 7 2 , 2 0 , 8 2 ) , ( 5 0 , 1 5 , 3 7 , 7 7 ) , ( 2 3 , 9 5 , 2 0 , 8 1 ) , ( 0 9 , 9 3 , 2 8 , 8 1 , 9 4 ) ) ' ),
|
||||
ST_UNION (
|
||||
MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 7 2 , 6 2 , 2 6 , 2 2 ) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) ,
|
||||
ENVELOPE(
|
||||
MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' )
|
||||
)
|
||||
)
|
||||
),
|
||||
MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 9 , 1 3 , 7 3 , 8 5 ) , ( 5 0 , 8 1 , 2 0 , 7 4 , 1 0 ) , ( 9 2 , 5 2 , 6 5 , 8 8 , 0 2 ) , ( 0 8 , 3 9 , 4 0 , 1 0 ) , ( 0 0 , 7 6 , 8 3 , 0 0 ) ) ' )
|
||||
));
|
||||
|
||||
|
||||
#bug 841745 ssertion `!sp0->is_bottom()' failed in Gcalc_scan_iterator::find_intersections in maria-5.3-gis
|
||||
SELECT ASTEXT(ST_DIFFERENCE (
|
||||
POLYGONFROMTEXT( ' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ' ) ,
|
||||
ST_UNION (
|
||||
MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ' ) ,
|
||||
ST_SYMDIFFERENCE (
|
||||
MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 3 8 , 0 8 , 6 6 , 6 1 , 0 5 , 6 7 , 3 7 ) , ( 5 8 , 7 7 , 9 0 , 8 7 ) , ( 1 5 , 1 8 , 2 3 , 3 9 ) , ( 1 3 , 9 7 , 5 5 , 0 8 , 6 9 ) , ( 3 6 , 6 9 , 8 7 , 0 2 , 4 6 , 9 5 ) ) ' ) ,
|
||||
ST_UNION (
|
||||
MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 9 4 , 2 0 , 2 2 , 7 2 , 6 2 ) , ( 5 2 , 8 2 , 4 8 , 3 4 ) , ( 1 0 , 1 4 , 2 7 , 7 0 , 1 5 ) , ( 2 8 , 4 4 , 5 0 , 7 0 , 4 0 ) ) ' ) ,
|
||||
GEOMETRYFROMTEXT( ' MULTILINESTRING( ( 3 7 , 7 3 , 5 8 , 4 8 ) , ( 3 2 , 5 0 , 9 3 , 4 4 ) , ( 6 0 , 4 2 , 7 8 , 1 3 ) ) ' )
|
||||
)
|
||||
)
|
||||
)
|
||||
));
|
||||
|
||||
#bug 841773 Assertion `t0->rp->type == t1->rp->type' failed in Gcalc_operation_reducer::end_couple in maria-5.3-gis
|
||||
SELECT ST_NUMGEOMETRIES(ST_UNION (
|
||||
MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 0 8 , 1 9 , 5 7 , 2 8 , 5 8 , 6 7 ) , ( 4 5 , 8 4 , 0 3 , 5 1 ) , ( 6 8 , 2 7 , 1 6 , 9 9 , 7 2 ) , ( 9 5 , 2 8 , 1 2 , 9 6 , 2 0 ) ) ' ) ,
|
||||
MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 7 7 , 2 7, 6 8, 7 1 , 7 7 ) ) ) ' )
|
||||
));
|
||||
|
||||
#bug 841662 Third assertion `n > 0 && n < SINUSES_CALCULATED*2+1' in get_n_sincos
|
||||
SELECT ST_BUFFER (
|
||||
LINESTRINGFROMTEXT( ' LINESTRING( 5 4 , 3 8 , 2 6 , 5 5 , 7 9 ) ' ) ,
|
||||
ST_DISTANCE (
|
||||
MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) ,
|
||||
ST_DIFFERENCE (
|
||||
MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) ,
|
||||
MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' )
|
||||
)
|
||||
)
|
||||
) ;
|
||||
SELECT ST_DISTANCE ( ST_DIFFERENCE ( MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) ), MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) ) ;
|
||||
|
||||
#bug 848939 Wrong result with ST_INTERSECTION between linestrings and a polygon in 5.3-gis
|
||||
SELECT ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((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)))'), geomETRYFROMTEXT(' MULTILINESTRING( ( 5 1 , 3 7 , 6 1 , 7 0 ) , ( 1 6 , 8 5 , 7 5 , 5 6 ) )') ));
|
||||
|
||||
#bug 855485 ST_CROSSES returns different result than PostGIS for overlapping polygons
|
||||
|
||||
SELECT ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) '));
|
||||
|
||||
#bug 855487 ST_WITHIN returns wrong result for partially overlapping polygons
|
||||
|
||||
SELECT ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') );
|
||||
|
||||
#bug 855492 ST_WITHIN returns TRUE on point on the edge of a polygon
|
||||
|
||||
SELECT ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) '));
|
||||
|
||||
#bug 855497 ST_ENVELOPE of GEOMETRYCOLLECTION EMPTY returns NULL and not GEOMETRYCOLLECTION EMPTY
|
||||
|
||||
select ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY')));
|
||||
|
||||
#bug 855503 ST_EQUALS reports TRUE between a POLYGON and a MULTILINESTRING
|
||||
|
||||
SELECT ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') );
|
||||
|
||||
#bug 855505 ST_TOUCHES reports TRUE for intersecting polygon and linestring
|
||||
|
||||
SELECT ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') );
|
||||
|
||||
#bug 857051 ST_EQUALS returns TRUE on two nonidentical MULTIPOINTs
|
||||
|
||||
SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') );
|
||||
SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') );
|
||||
|
||||
#bug 857050 ST_WITHIN returns wrong result with MULTIPOINT and POLYGON
|
||||
SELECT ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) '));
|
||||
|
||||
#bug 857087 Wrong result with ST_INTERSECTS and LINESTRINGs
|
||||
|
||||
SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') );
|
||||
|
64
mysql-test/t/gis-rt-precise.test
Normal file
64
mysql-test/t/gis-rt-precise.test
Normal file
@ -0,0 +1,64 @@
|
||||
-- source include/have_geometry.inc
|
||||
|
||||
#
|
||||
# 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,
|
||||
SPATIAL KEY(g)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
--disable_query_log
|
||||
let $1=150;
|
||||
let $2=150;
|
||||
while ($1)
|
||||
{
|
||||
eval INSERT INTO t1 (g) VALUES (GeomFromText('LineString($1 $1, $2 $2)'));
|
||||
dec $1;
|
||||
inc $2;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
SELECT count(*) FROM t1;
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 140))'));
|
||||
SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (
|
||||
fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
g GEOMETRY NOT NULL
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
--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
|
||||
|
||||
ALTER TABLE t1 ADD SPATIAL KEY(g);
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT count(*) FROM t1;
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 40))'));
|
||||
SELECT fid, AsText(g) FROM t1 WHERE ST_Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 40))'));
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.5 tests.
|
@ -17,16 +17,12 @@ SHOW CREATE TABLE t1;
|
||||
|
||||
let $1=150;
|
||||
let $2=150;
|
||||
--disable_query_log
|
||||
begin;
|
||||
while ($1)
|
||||
{
|
||||
eval INSERT INTO t1 (g) VALUES (GeomFromText('LineString($1 $1, $2 $2)'));
|
||||
dec $1;
|
||||
inc $2;
|
||||
}
|
||||
commit;
|
||||
--enable_query_log
|
||||
|
||||
SELECT count(*) FROM t1;
|
||||
EXPLAIN SELECT fid, AsText(g) FROM t1 WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
|
||||
@ -39,8 +35,6 @@ CREATE TABLE t2 (
|
||||
g GEOMETRY NOT NULL
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
--disable_query_log
|
||||
begin;
|
||||
let $1=10;
|
||||
while ($1)
|
||||
{
|
||||
@ -52,8 +46,6 @@ while ($1)
|
||||
}
|
||||
dec $1;
|
||||
}
|
||||
commit;
|
||||
--enable_query_log
|
||||
|
||||
ALTER TABLE t2 ADD SPATIAL KEY(g);
|
||||
SHOW CREATE TABLE t2;
|
||||
@ -63,8 +55,6 @@ EXPLAIN SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
SELECT fid, AsText(g) FROM t2 WHERE Within(g,
|
||||
GeomFromText('Polygon((40 40,60 40,60 60,40 60,40 40))'));
|
||||
|
||||
--disable_query_log
|
||||
begin;
|
||||
let $1=10;
|
||||
while ($1)
|
||||
{
|
||||
@ -77,8 +67,6 @@ while ($1)
|
||||
}
|
||||
dec $1;
|
||||
}
|
||||
commit;
|
||||
--enable_query_log
|
||||
|
||||
DROP TABLE t2;
|
||||
|
||||
|
@ -62,7 +62,9 @@ INSERT INTO gis_multi_polygon VALUES
|
||||
|
||||
INSERT INTO gis_geometrycollection VALUES
|
||||
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
|
||||
(122, GeomFromText('GeometryCollection()')),
|
||||
(123, GeomFromText('GeometryCollection EMPTY'));
|
||||
|
||||
INSERT into gis_geometry SELECT * FROM gis_point;
|
||||
INSERT into gis_geometry SELECT * FROM gis_line;
|
||||
@ -353,6 +355,9 @@ insert into t1 values ('85984',GeomFromText('MULTIPOLYGON(((-115.006363
|
||||
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, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from
|
||||
t1 where object_id=85998;
|
||||
|
||||
@ -535,18 +540,6 @@ create table t1 (g geometry not null);
|
||||
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 GeomFromwkb(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?
|
||||
@ -761,9 +754,586 @@ drop table t1;
|
||||
--echo #
|
||||
create table t1(a char(32) not null) engine=myisam;
|
||||
--replace_regex /'[^']*test\.#sql-[0-9a-f_]*'/'#sql-temporary'/
|
||||
--error ER_CANT_CREATE_TABLE
|
||||
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||
create spatial index i on t1 (a);
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
#
|
||||
# Bug #50574 5.5.x allows spatial indexes on non-spatial
|
||||
# columns, causing crashes!
|
||||
#
|
||||
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||
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
|
||||
CREATE SPATIAL INDEX idx0 ON t1(col0);
|
||||
|
||||
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||
ALTER TABLE t1 ADD SPATIAL INDEX i1 (col0);
|
||||
|
||||
CREATE TABLE t2 (
|
||||
col0 INTEGER NOT NULL,
|
||||
col1 POINT,
|
||||
col2 POINT
|
||||
);
|
||||
|
||||
--error ER_WRONG_ARGUMENTS
|
||||
CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
|
||||
|
||||
--error ER_WRONG_ARGUMENTS
|
||||
CREATE TABLE t3 (
|
||||
col0 INTEGER NOT NULL,
|
||||
col1 POINT,
|
||||
col2 LINESTRING,
|
||||
SPATIAL INDEX i1 (col1, col2)
|
||||
);
|
||||
|
||||
# cleanup
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
#bug 850775 ST_AREA does not work on GEOMETRYCOLLECTIONs in maria-5.3-gis
|
||||
select ST_AREA(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 31 10, 77 80), POLYGON((0 0,4 7,1 1,0 0)), POINT(20 20))'));
|
||||
|
||||
#bug 855336 ST_LENGTH does not work on GEOMETRYCOLLECTIONs
|
||||
select ST_LENGTH(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 100 30, 20 30), POINT(3 3), LINESTRING(20 20, 30 20))'));
|
||||
|
||||
|
||||
# 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 (
|
||||
#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',
|
||||
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,
|
||||
LineFromText(
|
||||
'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
|
||||
|
||||
INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
|
||||
LineFromText(
|
||||
'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
|
||||
|
||||
INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
|
||||
LineFromText(
|
||||
'LINESTRING( 70 38, 72 48 )' ,101));
|
||||
|
||||
INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
|
||||
LineFromText(
|
||||
'LINESTRING( 70 38, 84 42 )' ,101));
|
||||
|
||||
INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
|
||||
1,
|
||||
LineFromText(
|
||||
'LINESTRING( 28 26, 28 0 )',101));
|
||||
|
||||
--echo # DividedRoutes
|
||||
|
||||
INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
|
||||
MLineFromText(
|
||||
'MULTILINESTRING((10 48,10 21,10 0),
|
||||
(16 0,16 23,16 48))', 101));
|
||||
|
||||
--echo # Forests
|
||||
|
||||
INSERT INTO forests VALUES(109, 'Green Forest',
|
||||
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', PointFromText(
|
||||
'POINT( 44 31 )', 101));
|
||||
|
||||
--echo # Streams
|
||||
|
||||
INSERT INTO streams VALUES(111, 'Cam Stream',
|
||||
LineFromText(
|
||||
'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
|
||||
|
||||
INSERT INTO streams VALUES(112, NULL,
|
||||
LineFromText(
|
||||
'LINESTRING( 76 0, 78 4, 73 9 )', 101));
|
||||
|
||||
--echo # Buildings
|
||||
|
||||
INSERT INTO buildings VALUES(113, '123 Main Street',
|
||||
PointFromText(
|
||||
'POINT( 52 30 )', 101),
|
||||
PolyFromText(
|
||||
'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
|
||||
|
||||
INSERT INTO buildings VALUES(114, '215 Main Street',
|
||||
PointFromText(
|
||||
'POINT( 64 33 )', 101),
|
||||
PolyFromText(
|
||||
'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
|
||||
|
||||
|
||||
--echo # Ponds
|
||||
|
||||
INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
|
||||
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',
|
||||
PolyFromText(
|
||||
'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
|
||||
|
||||
INSERT INTO named_places VALUES(118, 'Goose Island',
|
||||
PolyFromText(
|
||||
'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
|
||||
|
||||
--echo # Map Neatlines
|
||||
|
||||
INSERT INTO map_neatlines VALUES(115,
|
||||
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 srid
|
||||
#FROM geometry_columns
|
||||
#WHERE f_table_name = 'streams';
|
||||
#
|
||||
#--echo # Conformance Item T5
|
||||
#
|
||||
#SELECT srtext
|
||||
#FROM SPATIAL_REF_SYS
|
||||
#WHERE SRID = 101;
|
||||
#
|
||||
|
||||
|
||||
--echo # Conformance Item T6
|
||||
# TODO: ST_Dimension() alias
|
||||
SELECT Dimension(shore)
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
|
||||
--echo # Conformance Item T7
|
||||
# TODO: ST_GeometryType() alias
|
||||
SELECT GeometryType(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
|
||||
--echo # Conformance Item T8
|
||||
# TODO: ST_AsText() alias
|
||||
SELECT AsText(boundary)
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T9
|
||||
# TODO: ST_AsBinary(), ST_PolyFromWKB() aliases
|
||||
SELECT AsText(PolyFromWKB(AsBinary(boundary),101))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T10
|
||||
# TODO: ST_SRID() alias
|
||||
SELECT SRID(boundary)
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T11
|
||||
# TODO: ST_IsEmpty() alias
|
||||
SELECT 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 IsSimple(shore)
|
||||
#FROM lakes
|
||||
#WHERE name = 'Blue Lake';
|
||||
|
||||
# TODO: WL#2377
|
||||
#--echo # Conformance Item T13
|
||||
#SELECT 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 AsText(Envelope(boundary))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T15
|
||||
# TODO: ST_X() alias
|
||||
SELECT X(position)
|
||||
FROM bridges
|
||||
WHERE name = 'Cam Bridge';
|
||||
|
||||
--echo # Conformance Item T16
|
||||
# TODO: ST_Y() alias
|
||||
SELECT Y(position)
|
||||
FROM bridges
|
||||
WHERE name = 'Cam Bridge';
|
||||
|
||||
--echo # Conformance Item T17
|
||||
# TODO: ST_StartPoint() alias
|
||||
SELECT AsText(StartPoint(centerline))
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
|
||||
--echo # Conformance Item T18
|
||||
# TODO: ST_EndPoint
|
||||
SELECT AsText(EndPoint(centerline))
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
|
||||
# TODO: WL#2377
|
||||
#--echo # Conformance Item T19
|
||||
# TODO: ST_LineFromWKB() alias
|
||||
#SELECT IsClosed(LineFromWKB(AsBinary(Boundary(boundary)),SRID(boundary)))
|
||||
#FROM named_places
|
||||
#WHERE name = 'Goose Island';
|
||||
|
||||
# TODO: WL#2377
|
||||
#--echo # Conformance Item T20
|
||||
#SELECT IsRing(LineFromWKB(AsBinary(Boundary(boundary)),SRID(boundary)))
|
||||
#FROM named_places
|
||||
#WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T21
|
||||
# TODO: ST_Length() alias
|
||||
SELECT GLength(centerline)
|
||||
FROM road_segments
|
||||
WHERE fid = 106;
|
||||
|
||||
--echo # Conformance Item T22
|
||||
# TODO: ST_NumPoints() alias
|
||||
SELECT NumPoints(centerline)
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
|
||||
--echo # Conformance Item T23
|
||||
# TODO: ST_PointN() alias
|
||||
SELECT AsText(PointN(centerline, 1))
|
||||
FROM road_segments
|
||||
WHERE fid = 102;
|
||||
|
||||
--echo # Conformance Item T24
|
||||
# TODO: ST_Centroid() alias
|
||||
SELECT AsText(Centroid(boundary))
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
|
||||
# TODO: WL#2377
|
||||
#--echo # Conformance Item T25
|
||||
#SELECT Contains(boundary, PointOnSurface(boundary))
|
||||
#FROM named_places
|
||||
#WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T26
|
||||
# TODO: ST_Area() alias
|
||||
SELECT Area(boundary)
|
||||
FROM named_places
|
||||
WHERE name = 'Goose Island';
|
||||
|
||||
--echo # Conformance Item T27
|
||||
# TODO: ST_ExteriorRing() alias
|
||||
SELECT AsText(ExteriorRing(shore))
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
|
||||
--echo # Conformance Item T28
|
||||
# TODO: ST_NumInteriorRings() alias
|
||||
SELECT NumInteriorRings(shore)
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
|
||||
--echo # Conformance Item T29
|
||||
# TODO: ST_InteriorRingN() alias
|
||||
SELECT AsText(InteriorRingN(shore, 1))
|
||||
FROM lakes
|
||||
WHERE name = 'Blue Lake';
|
||||
|
||||
--echo # Conformance Item T30
|
||||
# TODO: ST_NumGeometries() alias
|
||||
SELECT NumGeometries(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
|
||||
--echo # Conformance Item T31
|
||||
# TODO: ST_GeometryN() alias
|
||||
SELECT AsText(GeometryN(centerlines, 2))
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
|
||||
--echo # Conformance Item T32
|
||||
# TODO: ST_IsClosed() alias
|
||||
SELECT IsClosed(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
|
||||
--echo # Conformance Item T33
|
||||
# TODO: ST_Length() alias
|
||||
SELECT GLength(centerlines)
|
||||
FROM divided_routes
|
||||
WHERE name = 'Route 75';
|
||||
|
||||
--echo # Conformance Item T34
|
||||
# TODO: ST_Centroid() alias
|
||||
SELECT AsText(Centroid(shores))
|
||||
FROM ponds
|
||||
WHERE fid = 120;
|
||||
|
||||
# TODO: WL#2377
|
||||
#--echo # Conformance Item T35
|
||||
#SELECT Contains(shores, PointOnSurface(shores))
|
||||
#FROM ponds
|
||||
#WHERE fid = 120;
|
||||
|
||||
--echo # Conformance Item T36
|
||||
# TODO: ST_Area() alias
|
||||
SELECT Area(shores)
|
||||
FROM ponds
|
||||
WHERE fid = 120;
|
||||
|
||||
--echo # Conformance Item T37
|
||||
# TODO: ST_PolyFromText() alias
|
||||
SELECT ST_Equals(boundary,
|
||||
PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
|
||||
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 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 AsText(ST_Intersection(centerline, shore))
|
||||
#FROM streams, lakes
|
||||
#WHERE streams.name = 'Cam Stream'
|
||||
#AND lakes.name = 'Blue Lake';
|
||||
|
||||
--echo # Conformance Item T48
|
||||
SELECT 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 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 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 AsText(ConvexHull(shore))
|
||||
#FROM lakes
|
||||
#WHERE lakes.name = 'Blue Lake';
|
||||
|
||||
DROP DATABASE gis_ogs;
|
||||
|
@ -80,6 +80,7 @@ SET (SQL_SOURCE
|
||||
rpl_rli.cc rpl_mi.cc sql_servers.cc
|
||||
sql_connect.cc scheduler.cc
|
||||
sql_profile.cc event_parse_data.cc opt_table_elimination.cc
|
||||
gcalc_slicescan.cc gcalc_tools.cc
|
||||
multi_range_read.cc
|
||||
opt_subselect.cc
|
||||
opt_index_cond_pushdown.cc
|
||||
|
@ -56,6 +56,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||
sql_map.h sql_string.h unireg.h \
|
||||
sql_error.h field.h handler.h mysqld_suffix.h \
|
||||
sql_profile.h \
|
||||
gcalc_slicescan.h gcalc_tools.h \
|
||||
ha_ndbcluster.h ha_ndbcluster_cond.h \
|
||||
ha_ndbcluster_binlog.h ha_ndbcluster_tables.h \
|
||||
ha_partition.h rpl_constants.h \
|
||||
@ -84,7 +85,8 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||
multi_range_read.h sql_handler.h \
|
||||
sql_join_cache.h \
|
||||
create_options.h \
|
||||
sql_expression_cache.h
|
||||
sql_expression_cache.h \
|
||||
gcalc_slicescan.h gcalc_tools.h plistsort.c
|
||||
|
||||
mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
|
||||
item.cc item_sum.cc item_buff.cc item_func.cc \
|
||||
@ -101,6 +103,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
|
||||
sql_join_cache.cc \
|
||||
sql_base.cc table.cc sql_select.cc sql_insert.cc \
|
||||
sql_profile.cc \
|
||||
gcalc_slicescan.cc gcalc_tools.cc \
|
||||
sql_prepare.cc sql_error.cc sql_locale.cc \
|
||||
sql_update.cc sql_delete.cc uniques.cc sql_do.cc \
|
||||
procedure.cc sql_test.cc \
|
||||
|
@ -8008,7 +8008,7 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
|
||||
goto err;
|
||||
// Check given WKB
|
||||
uint32 wkb_type;
|
||||
if (length < SRID_SIZE + WKB_HEADER_SIZE + SIZEOF_STORED_DOUBLE*2)
|
||||
if (length < SRID_SIZE + WKB_HEADER_SIZE + 4)
|
||||
goto err;
|
||||
wkb_type= uint4korr(from + SRID_SIZE + 1);
|
||||
if (wkb_type < (uint32) Geometry::wkb_point ||
|
||||
|
1961
sql/gcalc_slicescan.cc
Normal file
1961
sql/gcalc_slicescan.cc
Normal file
File diff suppressed because it is too large
Load Diff
588
sql/gcalc_slicescan.h
Normal file
588
sql/gcalc_slicescan.h
Normal file
@ -0,0 +1,588 @@
|
||||
/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (C) 2011 Monty Program Ab.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
|
||||
#ifndef GCALC_SLICESCAN_INCLUDED
|
||||
#define GCALC_SLICESCAN_INCLUDED
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
#define GCALC_CHECK_WITH_FLOAT
|
||||
#else
|
||||
#define GCALC_DBUG_OFF
|
||||
#endif /*DBUG_OFF*/
|
||||
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
#define GCALC_DBUG_PRINT(b) DBUG_PRINT("Gcalc", b)
|
||||
#define GCALC_DBUG_ENTER(a) DBUG_ENTER("Gcalc "a)
|
||||
#define GCALC_DBUG_RETURN(r) DBUG_RETURN(r)
|
||||
#define GCALC_DBUG_VOID_RETURN DBUG_VOID_RETURN
|
||||
#define GCALC_DBUG_ASSERT(r) DBUG_ASSERT(r)
|
||||
#else
|
||||
#define GCALC_DBUG_PRINT(b) do {} while(0)
|
||||
#define GCALC_DBUG_ENTER(a) do {} while(0)
|
||||
#define GCALC_DBUG_RETURN(r) return (r)
|
||||
#define GCALC_DBUG_VOID_RETURN do {} while(0)
|
||||
#define GCALC_DBUG_ASSERT(r) do {} while(0)
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
|
||||
/*
|
||||
Gcalc_dyn_list class designed to manage long lists of same-size objects
|
||||
with the possible efficiency.
|
||||
It allocates fixed-size blocks of memory (blk_size specified at the time
|
||||
of creation). When new object is added to the list, it occupies part of
|
||||
this block until it's full. Then the new block is allocated.
|
||||
Freed objects are chained to the m_free list, and if it's not empty, the
|
||||
newly added object is taken from this list instead the block.
|
||||
*/
|
||||
|
||||
class Gcalc_dyn_list
|
||||
{
|
||||
public:
|
||||
class Item
|
||||
{
|
||||
public:
|
||||
Item *next;
|
||||
};
|
||||
|
||||
Gcalc_dyn_list(size_t blk_size, size_t sizeof_item);
|
||||
~Gcalc_dyn_list();
|
||||
Item *new_item()
|
||||
{
|
||||
Item *result;
|
||||
if (m_free)
|
||||
{
|
||||
result= m_free;
|
||||
m_free= m_free->next;
|
||||
}
|
||||
else
|
||||
result= alloc_new_blk();
|
||||
|
||||
return result;
|
||||
}
|
||||
inline void free_item(Item *item)
|
||||
{
|
||||
item->next= m_free;
|
||||
m_free= item;
|
||||
}
|
||||
inline void free_list(Item **list, Item **hook)
|
||||
{
|
||||
*hook= m_free;
|
||||
m_free= *list;
|
||||
}
|
||||
|
||||
void free_list(Item *list)
|
||||
{
|
||||
Item **hook= &list;
|
||||
while (*hook)
|
||||
hook= &(*hook)->next;
|
||||
free_list(&list, hook);
|
||||
}
|
||||
|
||||
void reset();
|
||||
void cleanup();
|
||||
|
||||
protected:
|
||||
size_t m_blk_size;
|
||||
size_t m_sizeof_item;
|
||||
unsigned int m_points_per_blk;
|
||||
void *m_first_blk;
|
||||
void **m_blk_hook;
|
||||
Item *m_free;
|
||||
Item *m_keep;
|
||||
|
||||
Item *alloc_new_blk();
|
||||
void format_blk(void* block);
|
||||
inline Item *ptr_add(Item *ptr, int n_items)
|
||||
{
|
||||
return (Item *)(((char*)ptr) + n_items * m_sizeof_item);
|
||||
}
|
||||
};
|
||||
|
||||
/* Internal Gcalc coordinates to provide the precise calculations */
|
||||
|
||||
#define GCALC_DIG_BASE 1000000000
|
||||
typedef uint32 gcalc_digit_t;
|
||||
typedef unsigned long long gcalc_coord2;
|
||||
typedef gcalc_digit_t Gcalc_internal_coord;
|
||||
#define GCALC_COORD_BASE 2
|
||||
#define GCALC_COORD_BASE2 4
|
||||
#define GCALC_COORD_BASE3 6
|
||||
#define GCALC_COORD_BASE4 8
|
||||
#define GCALC_COORD_BASE5 10
|
||||
|
||||
typedef gcalc_digit_t Gcalc_coord1[GCALC_COORD_BASE];
|
||||
typedef gcalc_digit_t Gcalc_coord2[GCALC_COORD_BASE*2];
|
||||
typedef gcalc_digit_t Gcalc_coord3[GCALC_COORD_BASE*3];
|
||||
|
||||
|
||||
void gcalc_mul_coord(Gcalc_internal_coord *result, int result_len,
|
||||
const Gcalc_internal_coord *a, int a_len,
|
||||
const Gcalc_internal_coord *b, int b_len);
|
||||
|
||||
void gcalc_add_coord(Gcalc_internal_coord *result, int result_len,
|
||||
const Gcalc_internal_coord *a,
|
||||
const Gcalc_internal_coord *b);
|
||||
|
||||
void gcalc_sub_coord(Gcalc_internal_coord *result, int result_len,
|
||||
const Gcalc_internal_coord *a,
|
||||
const Gcalc_internal_coord *b);
|
||||
|
||||
int gcalc_cmp_coord(const Gcalc_internal_coord *a,
|
||||
const Gcalc_internal_coord *b, int len);
|
||||
|
||||
/* Internal coordinates declarations end. */
|
||||
|
||||
|
||||
typedef uint gcalc_shape_info;
|
||||
|
||||
/*
|
||||
Gcalc_heap represents the 'dynamic list' of Info objects, that
|
||||
contain information about vertexes of all the shapes that take
|
||||
part in some spatial calculation. Can become quite long.
|
||||
After filled, the list is usually sorted and then walked through
|
||||
in the slicescan algorithm.
|
||||
The Gcalc_heap and the algorithm can only operate with two
|
||||
kinds of shapes - polygon and polyline. So all the spatial
|
||||
objects should be represented as sets of these two.
|
||||
*/
|
||||
|
||||
class Gcalc_heap : public Gcalc_dyn_list
|
||||
{
|
||||
public:
|
||||
enum node_type
|
||||
{
|
||||
nt_shape_node,
|
||||
nt_intersection,
|
||||
nt_eq_node
|
||||
};
|
||||
class Info : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
node_type type;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/* nt_shape_node */
|
||||
gcalc_shape_info shape;
|
||||
Info *left;
|
||||
Info *right;
|
||||
double x,y;
|
||||
Gcalc_coord1 ix, iy;
|
||||
int top_node;
|
||||
};
|
||||
struct
|
||||
{
|
||||
/* nt_intersection */
|
||||
/* Line p1-p2 supposed to intersect line p3-p4 */
|
||||
const Info *p1;
|
||||
const Info *p2;
|
||||
const Info *p3;
|
||||
const Info *p4;
|
||||
void *intersection_data;
|
||||
int equal_intersection;
|
||||
};
|
||||
struct
|
||||
{
|
||||
/* nt_eq_node */
|
||||
const Info *node;
|
||||
void *eq_data;
|
||||
};
|
||||
};
|
||||
|
||||
bool is_bottom() const
|
||||
{ GCALC_DBUG_ASSERT(type == nt_shape_node); return !left; }
|
||||
bool is_top() const
|
||||
{ GCALC_DBUG_ASSERT(type == nt_shape_node); return top_node; }
|
||||
bool is_single_node() const
|
||||
{ return is_bottom() && is_top(); }
|
||||
|
||||
void calc_xy(double *x, double *y) const;
|
||||
int equal_pi(const Info *pi) const;
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
void calc_xy_ld(long double *x, long double *y) const;
|
||||
#endif /*GCALC_CHECK_WITH_FLOAT*/
|
||||
|
||||
Info *get_next() { return (Info *)next; }
|
||||
const Info *get_next() const { return (const Info *)next; }
|
||||
};
|
||||
|
||||
Gcalc_heap(size_t blk_size=8192) :
|
||||
Gcalc_dyn_list(blk_size, sizeof(Info)),
|
||||
m_hook(&m_first), m_n_points(0)
|
||||
{}
|
||||
Info *new_point_info(double x, double y, gcalc_shape_info shape);
|
||||
Info *new_intersection(const Info *p1, const Info *p2,
|
||||
const Info *p3, const Info *p4);
|
||||
void prepare_operation();
|
||||
inline bool ready() const { return m_hook == NULL; }
|
||||
Info *get_first() { return (Info *)m_first; }
|
||||
const Info *get_first() const { return (const Info *)m_first; }
|
||||
Gcalc_dyn_list::Item **get_last_hook() { return m_hook; }
|
||||
void reset();
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
long double get_double(const Gcalc_internal_coord *c) const;
|
||||
#endif /*GCALC_CHECK_WITH_FLOAT*/
|
||||
double coord_extent;
|
||||
private:
|
||||
Gcalc_dyn_list::Item *m_first;
|
||||
Gcalc_dyn_list::Item **m_hook;
|
||||
int m_n_points;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
the spatial object has to be represented as a set of
|
||||
simple polygones and polylines to be sent to the slicescan.
|
||||
|
||||
Gcalc_shape_transporter class and his descendants are used to
|
||||
simplify storing the information about the shape into necessary structures.
|
||||
This base class only fills the Gcalc_heap with the information about
|
||||
shapes and vertices.
|
||||
|
||||
Normally the Gcalc_shape_transporter family object is sent as a parameter
|
||||
to the 'get_shapes' method of an 'spatial' object so it can pass
|
||||
the spatial information about itself. The virtual methods are
|
||||
treating this data in a way the caller needs.
|
||||
*/
|
||||
|
||||
class Gcalc_shape_transporter
|
||||
{
|
||||
private:
|
||||
Gcalc_heap::Info *m_first;
|
||||
Gcalc_heap::Info *m_prev;
|
||||
int m_shape_started;
|
||||
void int_complete();
|
||||
protected:
|
||||
Gcalc_heap *m_heap;
|
||||
int int_single_point(gcalc_shape_info Info, double x, double y);
|
||||
int int_add_point(gcalc_shape_info Info, double x, double y);
|
||||
void int_start_line()
|
||||
{
|
||||
DBUG_ASSERT(!m_shape_started);
|
||||
m_shape_started= 1;
|
||||
m_first= m_prev= NULL;
|
||||
}
|
||||
void int_complete_line()
|
||||
{
|
||||
DBUG_ASSERT(m_shape_started== 1);
|
||||
int_complete();
|
||||
m_shape_started= 0;
|
||||
}
|
||||
void int_start_ring()
|
||||
{
|
||||
DBUG_ASSERT(m_shape_started== 2);
|
||||
m_shape_started= 3;
|
||||
m_first= m_prev= NULL;
|
||||
}
|
||||
void int_complete_ring()
|
||||
{
|
||||
DBUG_ASSERT(m_shape_started== 3);
|
||||
int_complete();
|
||||
m_shape_started= 2;
|
||||
}
|
||||
void int_start_poly()
|
||||
{
|
||||
DBUG_ASSERT(!m_shape_started);
|
||||
m_shape_started= 2;
|
||||
}
|
||||
void int_complete_poly()
|
||||
{
|
||||
DBUG_ASSERT(m_shape_started== 2);
|
||||
m_shape_started= 0;
|
||||
}
|
||||
bool line_started() { return m_shape_started == 1; };
|
||||
public:
|
||||
Gcalc_shape_transporter(Gcalc_heap *heap) :
|
||||
m_shape_started(0), m_heap(heap) {}
|
||||
|
||||
virtual int single_point(double x, double y)=0;
|
||||
virtual int start_line()=0;
|
||||
virtual int complete_line()=0;
|
||||
virtual int start_poly()=0;
|
||||
virtual int complete_poly()=0;
|
||||
virtual int start_ring()=0;
|
||||
virtual int complete_ring()=0;
|
||||
virtual int add_point(double x, double y)=0;
|
||||
virtual int start_collection(int n_objects) { return 0; }
|
||||
virtual int empty_shape() { return 0; }
|
||||
int start_simple_poly()
|
||||
{
|
||||
return start_poly() || start_ring();
|
||||
}
|
||||
int complete_simple_poly()
|
||||
{
|
||||
return complete_ring() || complete_poly();
|
||||
}
|
||||
virtual ~Gcalc_shape_transporter() {}
|
||||
};
|
||||
|
||||
|
||||
enum Gcalc_scan_events
|
||||
{
|
||||
scev_none= 0,
|
||||
scev_point= 1, /* Just a new point in thread */
|
||||
scev_thread= 2, /* Start of the new thread */
|
||||
scev_two_threads= 4, /* A couple of new threads started */
|
||||
scev_intersection= 8, /* Intersection happened */
|
||||
scev_end= 16, /* Single thread finished */
|
||||
scev_two_ends= 32, /* A couple of threads finished */
|
||||
scev_single_point= 64 /* Got single point */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Gcalc_scan_iterator incapsulates the slisescan algorithm.
|
||||
It takes filled Gcalc_heap as an datasource. Then can be
|
||||
iterated trought the vertexes and intersection points with
|
||||
the step() method. After the 'step()' one usually observes
|
||||
the current 'slice' to do the necessary calculations, like
|
||||
looking for intersections, calculating the area, whatever.
|
||||
*/
|
||||
|
||||
class Gcalc_scan_iterator : public Gcalc_dyn_list
|
||||
{
|
||||
public:
|
||||
class point : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
Gcalc_coord1 dx;
|
||||
Gcalc_coord1 dy;
|
||||
Gcalc_heap::Info *pi;
|
||||
Gcalc_heap::Info *next_pi;
|
||||
Gcalc_heap::Info *ev_pi;
|
||||
const Gcalc_coord1 *l_border;
|
||||
const Gcalc_coord1 *r_border;
|
||||
point *ev_next;
|
||||
|
||||
Gcalc_scan_events event;
|
||||
|
||||
inline const point *c_get_next() const
|
||||
{ return (const point *)next; }
|
||||
inline bool is_bottom() const { return !next_pi; }
|
||||
gcalc_shape_info get_shape() const { return pi->shape; }
|
||||
inline point *get_next() { return (point *)next; }
|
||||
inline const point *get_next() const { return (const point *)next; }
|
||||
/* Compare the dx_dy parameters regarding the horiz_dir */
|
||||
/* returns -1 if less, 0 if equal, 1 if bigger */
|
||||
static int cmp_dx_dy(const Gcalc_coord1 dx_a,
|
||||
const Gcalc_coord1 dy_a,
|
||||
const Gcalc_coord1 dx_b,
|
||||
const Gcalc_coord1 dy_b);
|
||||
static int cmp_dx_dy(const Gcalc_heap::Info *p1,
|
||||
const Gcalc_heap::Info *p2,
|
||||
const Gcalc_heap::Info *p3,
|
||||
const Gcalc_heap::Info *p4);
|
||||
int cmp_dx_dy(const point *p) const;
|
||||
point **next_ptr() { return (point **) &next; }
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
unsigned int thread;
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
#ifdef GCALC_CHECK_WITH_FLOAT
|
||||
void calc_x(long double *x, long double y, long double ix) const;
|
||||
#endif /*GCALC_CHECK_WITH_FLOAT*/
|
||||
};
|
||||
|
||||
/* That class introduced mostly for the 'typecontrol' reason. */
|
||||
/* only difference from the point classis the get_next() function. */
|
||||
class event_point : public point
|
||||
{
|
||||
public:
|
||||
inline const event_point *get_next() const
|
||||
{ return (const event_point*) ev_next; }
|
||||
int simple_event() const
|
||||
{
|
||||
return !ev_next ? (event & (scev_point | scev_end)) :
|
||||
(!ev_next->ev_next && event == scev_two_ends);
|
||||
}
|
||||
};
|
||||
|
||||
class intersection_info : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
point *edge_a;
|
||||
point *edge_b;
|
||||
|
||||
Gcalc_coord2 t_a;
|
||||
Gcalc_coord2 t_b;
|
||||
int t_calculated;
|
||||
Gcalc_coord3 x_exp;
|
||||
int x_calculated;
|
||||
Gcalc_coord3 y_exp;
|
||||
int y_calculated;
|
||||
void calc_t()
|
||||
{if (!t_calculated) do_calc_t(); }
|
||||
void calc_y_exp()
|
||||
{ if (!y_calculated) do_calc_y(); }
|
||||
void calc_x_exp()
|
||||
{ if (!x_calculated) do_calc_x(); }
|
||||
|
||||
void do_calc_t();
|
||||
void do_calc_x();
|
||||
void do_calc_y();
|
||||
};
|
||||
|
||||
|
||||
class slice_state
|
||||
{
|
||||
public:
|
||||
point *slice;
|
||||
point **event_position_hook;
|
||||
point *event_end;
|
||||
const Gcalc_heap::Info *pi;
|
||||
};
|
||||
|
||||
public:
|
||||
Gcalc_scan_iterator(size_t blk_size= 8192);
|
||||
|
||||
void init(Gcalc_heap *points); /* Iterator can be reused */
|
||||
void reset();
|
||||
int step();
|
||||
|
||||
Gcalc_heap::Info *more_points() { return m_cur_pi; }
|
||||
bool more_trapezoids()
|
||||
{ return m_cur_pi && m_cur_pi->next; }
|
||||
|
||||
const point *get_bottom_points() const
|
||||
{ return m_bottom_points; }
|
||||
const point *get_event_position() const
|
||||
{ return *state.event_position_hook; }
|
||||
const point *get_event_end() const
|
||||
{ return state.event_end; }
|
||||
const event_point *get_events() const
|
||||
{ return (const event_point *)
|
||||
(*state.event_position_hook == state.event_end ?
|
||||
m_bottom_points : *state.event_position_hook); }
|
||||
const point *get_b_slice() const { return state.slice; }
|
||||
double get_h() const;
|
||||
double get_y() const;
|
||||
double get_event_x() const;
|
||||
double get_sp_x(const point *sp) const;
|
||||
int intersection_step() const
|
||||
{ return state.pi->type == Gcalc_heap::nt_intersection; }
|
||||
const Gcalc_heap::Info *get_cur_pi() const
|
||||
{
|
||||
return state.pi;
|
||||
}
|
||||
|
||||
private:
|
||||
Gcalc_heap *m_heap;
|
||||
Gcalc_heap::Info *m_cur_pi;
|
||||
slice_state state;
|
||||
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
unsigned int m_cur_thread;
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
|
||||
point *m_bottom_points;
|
||||
point **m_bottom_hook;
|
||||
|
||||
int node_scan();
|
||||
void eq_scan();
|
||||
void intersection_scan();
|
||||
void remove_bottom_node();
|
||||
int insert_top_node();
|
||||
int add_intersection(point *sp_a, point *sp_b,
|
||||
Gcalc_heap::Info *pi_from);
|
||||
int add_eq_node(Gcalc_heap::Info *node, point *sp);
|
||||
int add_events_for_node(point *sp_node);
|
||||
|
||||
point *new_slice_point()
|
||||
{
|
||||
point *new_point= (point *)new_item();
|
||||
return new_point;
|
||||
}
|
||||
intersection_info *new_intersection_info(point *a, point *b)
|
||||
{
|
||||
intersection_info *ii= (intersection_info *)new_item();
|
||||
ii->edge_a= a;
|
||||
ii->edge_b= b;
|
||||
ii->t_calculated= ii->x_calculated= ii->y_calculated= 0;
|
||||
return ii;
|
||||
}
|
||||
int arrange_event(int do_sorting, int n_intersections);
|
||||
static double get_pure_double(const Gcalc_internal_coord *d, int d_len);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Gcalc_trapezoid_iterator simplifies the calculations on
|
||||
the current slice of the Gcalc_scan_iterator.
|
||||
One can walk through the trapezoids formed between
|
||||
previous and current slices.
|
||||
*/
|
||||
|
||||
#ifdef TMP_BLOCK
|
||||
class Gcalc_trapezoid_iterator
|
||||
{
|
||||
protected:
|
||||
const Gcalc_scan_iterator::point *sp0;
|
||||
const Gcalc_scan_iterator::point *sp1;
|
||||
public:
|
||||
Gcalc_trapezoid_iterator(const Gcalc_scan_iterator *scan_i) :
|
||||
sp0(scan_i->get_b_slice()),
|
||||
sp1(scan_i->get_t_slice())
|
||||
{}
|
||||
|
||||
inline bool more() const { return sp1 && sp1->next; }
|
||||
|
||||
const Gcalc_scan_iterator::point *lt() const { return sp1; }
|
||||
const Gcalc_scan_iterator::point *lb() const { return sp0; }
|
||||
const Gcalc_scan_iterator::point *rb() const
|
||||
{
|
||||
const Gcalc_scan_iterator::point *result= sp0;
|
||||
while ((result= result->c_get_next())->is_bottom())
|
||||
{}
|
||||
return result;
|
||||
}
|
||||
const Gcalc_scan_iterator::point *rt() const
|
||||
{ return sp1->c_get_next(); }
|
||||
|
||||
void operator++()
|
||||
{
|
||||
sp0= rb();
|
||||
sp1= rt();
|
||||
}
|
||||
};
|
||||
#endif /*TMP_BLOCK*/
|
||||
|
||||
|
||||
/*
|
||||
Gcalc_point_iterator simplifies the calculations on
|
||||
the current slice of the Gcalc_scan_iterator.
|
||||
One can walk through the points on the current slice.
|
||||
*/
|
||||
|
||||
class Gcalc_point_iterator
|
||||
{
|
||||
protected:
|
||||
const Gcalc_scan_iterator::point *sp;
|
||||
public:
|
||||
Gcalc_point_iterator(const Gcalc_scan_iterator *scan_i):
|
||||
sp(scan_i->get_b_slice())
|
||||
{}
|
||||
|
||||
inline bool more() const { return sp != NULL; }
|
||||
inline void operator++() { sp= sp->c_get_next(); }
|
||||
inline const Gcalc_scan_iterator::point *point() const { return sp; }
|
||||
inline const Gcalc_heap::Info *get_pi() const { return sp->pi; }
|
||||
inline gcalc_shape_info get_shape() const { return sp->get_shape(); }
|
||||
inline void restart(const Gcalc_scan_iterator *scan_i)
|
||||
{ sp= scan_i->get_b_slice(); }
|
||||
};
|
||||
|
||||
#endif /*GCALC_SLICESCAN_INCLUDED*/
|
||||
|
1427
sql/gcalc_tools.cc
Normal file
1427
sql/gcalc_tools.cc
Normal file
File diff suppressed because it is too large
Load Diff
346
sql/gcalc_tools.h
Normal file
346
sql/gcalc_tools.h
Normal file
@ -0,0 +1,346 @@
|
||||
/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (C) 2011 Monty Program Ab.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
|
||||
#ifndef GCALC_TOOLS_INCLUDED
|
||||
#define GCALC_TOOLS_INCLUDED
|
||||
|
||||
#include "gcalc_slicescan.h"
|
||||
|
||||
|
||||
/*
|
||||
The Gcalc_function class objects are used to check for a binary relation.
|
||||
The relation can be constructed with the prefix notation using predicates as
|
||||
op_not (as !A)
|
||||
op_union ( A || B || C... )
|
||||
op_intersection ( A && B && C ... )
|
||||
op_symdifference ( A+B+C+... == 1 )
|
||||
op_difference ( A && !(B||C||..))
|
||||
with the calls of the add_operation(operation, n_operands) method.
|
||||
The relation is calculated over a set of shapes, that in turn have
|
||||
to be added with the add_new_shape() method. All the 'shapes' can
|
||||
be set to 0 with clear_shapes() method and single value
|
||||
can be changed with the invert_state() method.
|
||||
Then the value of the relation can be calculated with the count() method.
|
||||
Frequently used method is find_function(Gcalc_scan_iterator it) that
|
||||
iterates through the 'it' until the relation becomes TRUE.
|
||||
*/
|
||||
|
||||
class Gcalc_function
|
||||
{
|
||||
private:
|
||||
String shapes_buffer;
|
||||
String function_buffer;
|
||||
int *i_states;
|
||||
int *b_states;
|
||||
uint32 cur_object_id;
|
||||
uint n_shapes;
|
||||
int count_internal(const char *cur_func, uint set_type,
|
||||
const char **end);
|
||||
public:
|
||||
enum value
|
||||
{
|
||||
v_empty= 0x0000000,
|
||||
v_find_t= 0x1000000,
|
||||
v_find_f= 0x2000000,
|
||||
v_t_found= 0x3000000,
|
||||
v_f_found= 0x4000000,
|
||||
v_mask= 0x7000000
|
||||
};
|
||||
enum op_type
|
||||
{
|
||||
op_not= 0x80000000,
|
||||
op_shape= 0x00000000,
|
||||
op_union= 0x10000000,
|
||||
op_intersection= 0x20000000,
|
||||
op_symdifference= 0x30000000,
|
||||
op_difference= 0x40000000,
|
||||
op_repeat= 0x50000000,
|
||||
op_border= 0x60000000,
|
||||
op_internals= 0x70000000,
|
||||
op_false= 0x08000000,
|
||||
op_any= 0x78000000 /* The mask to get any of the operations */
|
||||
};
|
||||
enum shape_type
|
||||
{
|
||||
shape_point= 0,
|
||||
shape_line= 1,
|
||||
shape_polygon= 2,
|
||||
shape_hole= 3
|
||||
};
|
||||
Gcalc_function() : n_shapes(0) {}
|
||||
gcalc_shape_info add_new_shape(uint32 shape_id, shape_type shape_kind);
|
||||
/*
|
||||
Adds the leaf operation that returns the shape value.
|
||||
Also adds the shape to the list of operands.
|
||||
*/
|
||||
int single_shape_op(shape_type shape_kind, gcalc_shape_info *si);
|
||||
void add_operation(uint operation, uint32 n_operands);
|
||||
void add_not_operation(op_type operation, uint32 n_operands);
|
||||
uint32 get_next_expression_pos() { return function_buffer.length(); }
|
||||
void add_operands_to_op(uint32 operation_pos, uint32 n_operands);
|
||||
int repeat_expression(uint32 exp_pos);
|
||||
void set_cur_obj(uint32 cur_obj) { cur_object_id= cur_obj; }
|
||||
int reserve_shape_buffer(uint n_shapes);
|
||||
int reserve_op_buffer(uint n_ops);
|
||||
uint get_nshapes() const { return n_shapes; }
|
||||
shape_type get_shape_kind(gcalc_shape_info si) const
|
||||
{
|
||||
return (shape_type) uint4korr(shapes_buffer.ptr() + (si*4));
|
||||
}
|
||||
|
||||
void set_states(int *shape_states) { i_states= shape_states; }
|
||||
int alloc_states();
|
||||
void invert_i_state(gcalc_shape_info shape) { i_states[shape]^= 1; }
|
||||
void set_i_state(gcalc_shape_info shape) { i_states[shape]= 1; }
|
||||
void clear_i_state(gcalc_shape_info shape) { i_states[shape]= 0; }
|
||||
void set_b_state(gcalc_shape_info shape) { b_states[shape]= 1; }
|
||||
void clear_b_state(gcalc_shape_info shape) { b_states[shape]= 0; }
|
||||
int get_state(gcalc_shape_info shape)
|
||||
{ return i_states[shape] | b_states[shape]; }
|
||||
int get_i_state(gcalc_shape_info shape) { return i_states[shape]; }
|
||||
int get_b_state(gcalc_shape_info shape) { return b_states[shape]; }
|
||||
int count()
|
||||
{ return count_internal(function_buffer.ptr(), 0, 0); }
|
||||
void clear_i_states();
|
||||
void clear_b_states();
|
||||
void reset();
|
||||
|
||||
int check_function(Gcalc_scan_iterator &scan_it);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Gcalc_operation_transporter class extends the Gcalc_shape_transporter.
|
||||
In addition to the parent's functionality, it fills the Gcalc_function
|
||||
object so it has the function that determines the proper shape.
|
||||
For example Multipolyline will be represented as an union of polylines.
|
||||
*/
|
||||
|
||||
class Gcalc_operation_transporter : public Gcalc_shape_transporter
|
||||
{
|
||||
protected:
|
||||
Gcalc_function *m_fn;
|
||||
gcalc_shape_info m_si;
|
||||
public:
|
||||
Gcalc_operation_transporter(Gcalc_function *fn, Gcalc_heap *heap) :
|
||||
Gcalc_shape_transporter(heap), m_fn(fn) {}
|
||||
|
||||
int single_point(double x, double y);
|
||||
int start_line();
|
||||
int complete_line();
|
||||
int start_poly();
|
||||
int complete_poly();
|
||||
int start_ring();
|
||||
int complete_ring();
|
||||
int add_point(double x, double y);
|
||||
int start_collection(int n_objects);
|
||||
int empty_shape();
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
When we calculate the result of an spatial operation like
|
||||
Union or Intersection, we receive vertexes of the result
|
||||
one-by-one, and probably need to treat them in variative ways.
|
||||
So, the Gcalc_result_receiver class designed to get these
|
||||
vertexes and construct shapes/objects out of them.
|
||||
and to store the result in an appropriate format
|
||||
*/
|
||||
|
||||
class Gcalc_result_receiver
|
||||
{
|
||||
String buffer;
|
||||
uint32 n_points;
|
||||
Gcalc_function::shape_type common_shapetype;
|
||||
bool collection_result;
|
||||
uint32 n_shapes;
|
||||
uint32 n_holes;
|
||||
|
||||
Gcalc_function::shape_type cur_shape;
|
||||
uint32 shape_pos;
|
||||
double first_x, first_y, prev_x, prev_y;
|
||||
double shape_area;
|
||||
public:
|
||||
Gcalc_result_receiver() : collection_result(FALSE), n_shapes(0), n_holes(0)
|
||||
{}
|
||||
int start_shape(Gcalc_function::shape_type shape);
|
||||
int add_point(double x, double y);
|
||||
int complete_shape();
|
||||
int single_point(double x, double y);
|
||||
int done();
|
||||
void reset();
|
||||
|
||||
const char *result() { return buffer.ptr(); }
|
||||
uint length() { return buffer.length(); }
|
||||
int get_nshapes() { return n_shapes; }
|
||||
int get_nholes() { return n_holes; }
|
||||
int get_result_typeid();
|
||||
uint32 position() { return buffer.length(); }
|
||||
int move_hole(uint32 dest_position, uint32 source_position,
|
||||
uint32 *position_shift);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Gcalc_operation_reducer class incapsulates the spatial
|
||||
operation functionality. It analyses the slices generated by
|
||||
the slicescan and calculates the shape of the result defined
|
||||
by some Gcalc_function.
|
||||
*/
|
||||
|
||||
class Gcalc_operation_reducer : public Gcalc_dyn_list
|
||||
{
|
||||
public:
|
||||
enum modes
|
||||
{
|
||||
/* Numeric values important here - careful with changing */
|
||||
default_mode= 0,
|
||||
prefer_big_with_holes= 1,
|
||||
polygon_selfintersections_allowed= 2, /* allowed in the result */
|
||||
line_selfintersections_allowed= 4 /* allowed in the result */
|
||||
};
|
||||
|
||||
Gcalc_operation_reducer(size_t blk_size=8192);
|
||||
void init(Gcalc_function *fn, modes mode= default_mode);
|
||||
Gcalc_operation_reducer(Gcalc_function *fn, modes mode= default_mode,
|
||||
size_t blk_size=8192);
|
||||
int count_slice(Gcalc_scan_iterator *si);
|
||||
int count_all(Gcalc_heap *hp);
|
||||
int get_result(Gcalc_result_receiver *storage);
|
||||
void reset();
|
||||
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
int n_res_points;
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
class res_point : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
int intersection_point;
|
||||
union
|
||||
{
|
||||
const Gcalc_heap::Info *pi;
|
||||
res_point *first_poly_node;
|
||||
};
|
||||
union
|
||||
{
|
||||
res_point *outer_poly;
|
||||
uint32 poly_position;
|
||||
};
|
||||
res_point *up;
|
||||
res_point *down;
|
||||
res_point *glue;
|
||||
Gcalc_function::shape_type type;
|
||||
Gcalc_dyn_list::Item **prev_hook;
|
||||
#ifndef GCALC_DBUG_OFF
|
||||
int point_n;
|
||||
#endif /*GCALC_DBUG_OFF*/
|
||||
void set(const Gcalc_scan_iterator *si);
|
||||
res_point *get_next() { return (res_point *)next; }
|
||||
};
|
||||
|
||||
class active_thread : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
res_point *rp;
|
||||
res_point *thread_start;
|
||||
|
||||
const Gcalc_heap::Info *p1, *p2;
|
||||
res_point *enabled() { return rp; }
|
||||
active_thread *get_next() { return (active_thread *)next; }
|
||||
};
|
||||
|
||||
class poly_instance : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
uint32 *after_poly_position;
|
||||
poly_instance *get_next() { return (poly_instance *)next; }
|
||||
};
|
||||
|
||||
class line : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
active_thread *t;
|
||||
int incoming;
|
||||
const Gcalc_scan_iterator::point *p;
|
||||
line *get_next() { return (line *)next; }
|
||||
};
|
||||
|
||||
class poly_border : public Gcalc_dyn_list::Item
|
||||
{
|
||||
public:
|
||||
active_thread *t;
|
||||
int incoming;
|
||||
int prev_state;
|
||||
const Gcalc_scan_iterator::point *p;
|
||||
poly_border *get_next() { return (poly_border *)next; }
|
||||
};
|
||||
|
||||
line *m_lines;
|
||||
Gcalc_dyn_list::Item **m_lines_hook;
|
||||
poly_border *m_poly_borders;
|
||||
Gcalc_dyn_list::Item **m_poly_borders_hook;
|
||||
line *new_line() { return (line *) new_item(); }
|
||||
poly_border *new_poly_border() { return (poly_border *) new_item(); }
|
||||
int add_line(int incoming, active_thread *t,
|
||||
const Gcalc_scan_iterator::point *p);
|
||||
int add_poly_border(int incoming, active_thread *t, int prev_state,
|
||||
const Gcalc_scan_iterator::point *p);
|
||||
|
||||
protected:
|
||||
Gcalc_function *m_fn;
|
||||
Gcalc_dyn_list::Item **m_res_hook;
|
||||
res_point *m_result;
|
||||
int m_mode;
|
||||
|
||||
res_point *result_heap;
|
||||
active_thread *m_first_active_thread;
|
||||
|
||||
res_point *add_res_point(Gcalc_function::shape_type type);
|
||||
active_thread *new_active_thread() { return (active_thread *)new_item(); }
|
||||
|
||||
poly_instance *new_poly() { return (poly_instance *) new_item(); }
|
||||
|
||||
private:
|
||||
int start_line(active_thread *t, const Gcalc_scan_iterator::point *p,
|
||||
const Gcalc_scan_iterator *si);
|
||||
int end_line(active_thread *t, const Gcalc_scan_iterator *si);
|
||||
int connect_threads(int incoming_a, int incoming_b,
|
||||
active_thread *ta, active_thread *tb,
|
||||
const Gcalc_scan_iterator::point *pa,
|
||||
const Gcalc_scan_iterator::point *pb,
|
||||
active_thread *prev_range,
|
||||
const Gcalc_scan_iterator *si,
|
||||
Gcalc_function::shape_type s_t);
|
||||
int add_single_point(const Gcalc_scan_iterator *si);
|
||||
poly_border *get_pair_border(poly_border *b1);
|
||||
int continue_range(active_thread *t, const Gcalc_heap::Info *p,
|
||||
const Gcalc_heap::Info *p_next);
|
||||
int continue_i_range(active_thread *t,
|
||||
const Gcalc_heap::Info *ii);
|
||||
int end_couple(active_thread *t0, active_thread *t1, const Gcalc_heap::Info *p);
|
||||
int get_single_result(res_point *res, Gcalc_result_receiver *storage);
|
||||
int get_result_thread(res_point *cur, Gcalc_result_receiver *storage,
|
||||
int move_upward, res_point *first_poly_node);
|
||||
int get_polygon_result(res_point *cur, Gcalc_result_receiver *storage,
|
||||
res_point *first_poly_node);
|
||||
int get_line_result(res_point *cur, Gcalc_result_receiver *storage);
|
||||
|
||||
void free_result(res_point *res);
|
||||
};
|
||||
|
||||
#endif /*GCALC_TOOLS_INCLUDED*/
|
||||
|
@ -39,6 +39,29 @@ enum Gis_read_stream::enum_tok_types Gis_read_stream::get_next_toc_type()
|
||||
}
|
||||
|
||||
|
||||
bool Gis_read_stream::lookup_next_word(LEX_STRING *res)
|
||||
{
|
||||
const char *cur= m_cur;
|
||||
|
||||
skip_space();
|
||||
res->str= (char*) cur;
|
||||
/* The following will also test for \0 */
|
||||
if ((cur >= m_limit) || !my_isvar_start(&my_charset_bin, *cur))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
We can't combine the following increment with my_isvar() because
|
||||
my_isvar() is a macro that would cause side effects
|
||||
*/
|
||||
cur++;
|
||||
while ((cur < m_limit) && my_isvar(&my_charset_bin, *cur))
|
||||
cur++;
|
||||
|
||||
res->length= (uint32) (cur - res->str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool Gis_read_stream::get_next_word(LEX_STRING *res)
|
||||
{
|
||||
skip_space();
|
||||
|
@ -39,6 +39,7 @@ public:
|
||||
}
|
||||
|
||||
enum enum_tok_types get_next_toc_type();
|
||||
bool lookup_next_word(LEX_STRING *res);
|
||||
bool get_next_word(LEX_STRING *);
|
||||
bool get_next_number(double *);
|
||||
bool check_next_symbol(char);
|
||||
@ -57,6 +58,14 @@ public:
|
||||
m_cur++;
|
||||
return 0;
|
||||
}
|
||||
/* Returns the next notempty character. */
|
||||
char next_symbol()
|
||||
{
|
||||
skip_space();
|
||||
if (m_cur >= m_limit)
|
||||
return 0; /* EOL meet. */
|
||||
return *m_cur;
|
||||
}
|
||||
void set_error_msg(const char *msg);
|
||||
|
||||
// caller should free this pointer
|
||||
|
@ -572,6 +572,19 @@ protected:
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
class Create_func_mbr_contains : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_mbr_contains s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_mbr_contains() {}
|
||||
virtual ~Create_func_mbr_contains() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_contains : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
@ -812,6 +825,19 @@ protected:
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
class Create_func_mbr_disjoint : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_mbr_disjoint s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_mbr_disjoint() {}
|
||||
virtual ~Create_func_mbr_disjoint() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_disjoint : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
@ -823,6 +849,19 @@ protected:
|
||||
Create_func_disjoint() {}
|
||||
virtual ~Create_func_disjoint() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_distance : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_distance s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_distance() {}
|
||||
virtual ~Create_func_distance() {}
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@ -896,6 +935,19 @@ protected:
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
class Create_func_mbr_equals : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_mbr_equals s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_mbr_equals() {}
|
||||
virtual ~Create_func_mbr_equals() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_equals : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
@ -1224,6 +1276,19 @@ protected:
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
class Create_func_mbr_intersects : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_mbr_intersects s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_mbr_intersects() {}
|
||||
virtual ~Create_func_mbr_intersects() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_intersects : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
@ -1235,7 +1300,72 @@ protected:
|
||||
Create_func_intersects() {}
|
||||
virtual ~Create_func_intersects() {}
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
class Create_func_intersection : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_intersection s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_intersection() {}
|
||||
virtual ~Create_func_intersection() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_difference : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_difference s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_difference() {}
|
||||
virtual ~Create_func_difference() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_union : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_union s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_union() {}
|
||||
virtual ~Create_func_union() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_symdifference : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_symdifference s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_symdifference() {}
|
||||
virtual ~Create_func_symdifference() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_buffer : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_buffer s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_buffer() {}
|
||||
virtual ~Create_func_buffer() {}
|
||||
};
|
||||
#endif /*HAVE_SPATIAL*/
|
||||
|
||||
|
||||
class Create_func_is_free_lock : public Create_func_arg1
|
||||
@ -1667,6 +1797,19 @@ protected:
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
class Create_func_mbr_overlaps : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_mbr_overlaps s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_mbr_overlaps() {}
|
||||
virtual ~Create_func_mbr_overlaps() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_overlaps : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
@ -2262,6 +2405,19 @@ protected:
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
class Create_func_mbr_within : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||
|
||||
static Create_func_mbr_within s_singleton;
|
||||
|
||||
protected:
|
||||
Create_func_mbr_within() {}
|
||||
virtual ~Create_func_mbr_within() {}
|
||||
};
|
||||
|
||||
|
||||
class Create_func_within : public Create_func_arg2
|
||||
{
|
||||
public:
|
||||
@ -2953,6 +3109,16 @@ Create_func_connection_id::create_builder(THD *thd)
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
Create_func_mbr_contains Create_func_mbr_contains::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_mbr_contains::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_mbr_rel(arg1, arg2,
|
||||
Item_func::SP_CONTAINS_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_contains Create_func_contains::s_singleton;
|
||||
|
||||
Item*
|
||||
@ -3185,6 +3351,16 @@ Create_func_dimension::create_1_arg(THD *thd, Item *arg1)
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
Create_func_mbr_disjoint Create_func_mbr_disjoint::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_mbr_disjoint::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_mbr_rel(arg1, arg2,
|
||||
Item_func::SP_DISJOINT_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_disjoint Create_func_disjoint::s_singleton;
|
||||
|
||||
Item*
|
||||
@ -3193,6 +3369,15 @@ Create_func_disjoint::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
return new (thd->mem_root) Item_func_spatial_rel(arg1, arg2,
|
||||
Item_func::SP_DISJOINT_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_distance Create_func_distance::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_distance::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_distance(arg1, arg2);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -3288,6 +3473,16 @@ Create_func_envelope::create_1_arg(THD *thd, Item *arg1)
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
Create_func_mbr_equals Create_func_mbr_equals::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_mbr_equals::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_mbr_rel(arg1, arg2,
|
||||
Item_func::SP_EQUALS_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_equals Create_func_equals::s_singleton;
|
||||
|
||||
Item*
|
||||
@ -3683,6 +3878,16 @@ Create_func_interiorringn::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
Create_func_mbr_intersects Create_func_mbr_intersects::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_mbr_intersects::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_mbr_rel(arg1, arg2,
|
||||
Item_func::SP_INTERSECTS_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_intersects Create_func_intersects::s_singleton;
|
||||
|
||||
Item*
|
||||
@ -3691,7 +3896,56 @@ Create_func_intersects::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
return new (thd->mem_root) Item_func_spatial_rel(arg1, arg2,
|
||||
Item_func::SP_INTERSECTS_FUNC);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Create_func_intersection Create_func_intersection::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_intersection::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_operation(arg1, arg2,
|
||||
Gcalc_function::op_intersection);
|
||||
}
|
||||
|
||||
|
||||
Create_func_difference Create_func_difference::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_difference::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_operation(arg1, arg2,
|
||||
Gcalc_function::op_difference);
|
||||
}
|
||||
|
||||
|
||||
Create_func_union Create_func_union::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_union::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_operation(arg1, arg2,
|
||||
Gcalc_function::op_union);
|
||||
}
|
||||
|
||||
|
||||
Create_func_symdifference Create_func_symdifference::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_symdifference::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_operation(arg1, arg2,
|
||||
Gcalc_function::op_symdifference);
|
||||
}
|
||||
|
||||
|
||||
Create_func_buffer Create_func_buffer::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_buffer::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_buffer(arg1, arg2);
|
||||
}
|
||||
#endif /*HAVE_SPATAI*/
|
||||
|
||||
|
||||
Create_func_is_free_lock Create_func_is_free_lock::s_singleton;
|
||||
@ -4151,6 +4405,16 @@ Create_func_ord::create_1_arg(THD *thd, Item *arg1)
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
Create_func_mbr_overlaps Create_func_mbr_overlaps::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_mbr_overlaps::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_mbr_rel(arg1, arg2,
|
||||
Item_func::SP_OVERLAPS_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_overlaps Create_func_overlaps::s_singleton;
|
||||
|
||||
Item*
|
||||
@ -4703,6 +4967,16 @@ Create_func_weekofyear::create_1_arg(THD *thd, Item *arg1)
|
||||
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
Create_func_mbr_within Create_func_mbr_within::s_singleton;
|
||||
|
||||
Item*
|
||||
Create_func_mbr_within::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||
{
|
||||
return new (thd->mem_root) Item_func_spatial_mbr_rel(arg1, arg2,
|
||||
Item_func::SP_WITHIN_FUNC);
|
||||
}
|
||||
|
||||
|
||||
Create_func_within Create_func_within::s_singleton;
|
||||
|
||||
Item*
|
||||
@ -4836,6 +5110,7 @@ static Native_func_registry func_array[] =
|
||||
{ { C_STRING_WITH_LEN("BIN") }, BUILDER(Create_func_bin)},
|
||||
{ { C_STRING_WITH_LEN("BIT_COUNT") }, BUILDER(Create_func_bit_count)},
|
||||
{ { C_STRING_WITH_LEN("BIT_LENGTH") }, BUILDER(Create_func_bit_length)},
|
||||
{ { C_STRING_WITH_LEN("BUFFER") }, GEOM_BUILDER(Create_func_buffer)},
|
||||
{ { C_STRING_WITH_LEN("CEIL") }, BUILDER(Create_func_ceiling)},
|
||||
{ { C_STRING_WITH_LEN("CEILING") }, BUILDER(Create_func_ceiling)},
|
||||
{ { C_STRING_WITH_LEN("CENTROID") }, GEOM_BUILDER(Create_func_centroid)},
|
||||
@ -4863,7 +5138,7 @@ static Native_func_registry func_array[] =
|
||||
{ { C_STRING_WITH_LEN("DES_DECRYPT") }, BUILDER(Create_func_des_decrypt)},
|
||||
{ { C_STRING_WITH_LEN("DES_ENCRYPT") }, BUILDER(Create_func_des_encrypt)},
|
||||
{ { C_STRING_WITH_LEN("DIMENSION") }, GEOM_BUILDER(Create_func_dimension)},
|
||||
{ { C_STRING_WITH_LEN("DISJOINT") }, GEOM_BUILDER(Create_func_disjoint)},
|
||||
{ { C_STRING_WITH_LEN("DISJOINT") }, GEOM_BUILDER(Create_func_mbr_disjoint)},
|
||||
{ { C_STRING_WITH_LEN("ELT") }, BUILDER(Create_func_elt)},
|
||||
{ { C_STRING_WITH_LEN("ENCODE") }, BUILDER(Create_func_encode)},
|
||||
{ { C_STRING_WITH_LEN("ENCRYPT") }, BUILDER(Create_func_encrypt)},
|
||||
@ -4900,7 +5175,7 @@ static Native_func_registry func_array[] =
|
||||
{ { C_STRING_WITH_LEN("INET_NTOA") }, BUILDER(Create_func_inet_ntoa)},
|
||||
{ { C_STRING_WITH_LEN("INSTR") }, BUILDER(Create_func_instr)},
|
||||
{ { C_STRING_WITH_LEN("INTERIORRINGN") }, GEOM_BUILDER(Create_func_interiorringn)},
|
||||
{ { C_STRING_WITH_LEN("INTERSECTS") }, GEOM_BUILDER(Create_func_intersects)},
|
||||
{ { C_STRING_WITH_LEN("INTERSECTS") }, GEOM_BUILDER(Create_func_mbr_intersects)},
|
||||
{ { C_STRING_WITH_LEN("ISCLOSED") }, GEOM_BUILDER(Create_func_isclosed)},
|
||||
{ { C_STRING_WITH_LEN("ISEMPTY") }, GEOM_BUILDER(Create_func_isempty)},
|
||||
{ { C_STRING_WITH_LEN("ISNULL") }, BUILDER(Create_func_isnull)},
|
||||
@ -4929,13 +5204,13 @@ static Native_func_registry func_array[] =
|
||||
{ { C_STRING_WITH_LEN("MAKETIME") }, BUILDER(Create_func_maketime)},
|
||||
{ { C_STRING_WITH_LEN("MAKE_SET") }, BUILDER(Create_func_make_set)},
|
||||
{ { C_STRING_WITH_LEN("MASTER_POS_WAIT") }, BUILDER(Create_func_master_pos_wait)},
|
||||
{ { C_STRING_WITH_LEN("MBRCONTAINS") }, GEOM_BUILDER(Create_func_contains)},
|
||||
{ { C_STRING_WITH_LEN("MBRDISJOINT") }, GEOM_BUILDER(Create_func_disjoint)},
|
||||
{ { C_STRING_WITH_LEN("MBREQUAL") }, GEOM_BUILDER(Create_func_equals)},
|
||||
{ { C_STRING_WITH_LEN("MBRINTERSECTS") }, GEOM_BUILDER(Create_func_intersects)},
|
||||
{ { C_STRING_WITH_LEN("MBROVERLAPS") }, GEOM_BUILDER(Create_func_overlaps)},
|
||||
{ { 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("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)},
|
||||
{ { C_STRING_WITH_LEN("MBRWITHIN") }, GEOM_BUILDER(Create_func_within)},
|
||||
{ { C_STRING_WITH_LEN("MBRWITHIN") }, GEOM_BUILDER(Create_func_mbr_within)},
|
||||
{ { C_STRING_WITH_LEN("MD5") }, BUILDER(Create_func_md5)},
|
||||
{ { C_STRING_WITH_LEN("MLINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("MLINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
@ -4958,7 +5233,7 @@ static Native_func_registry func_array[] =
|
||||
{ { C_STRING_WITH_LEN("OCT") }, BUILDER(Create_func_oct)},
|
||||
{ { C_STRING_WITH_LEN("OCTET_LENGTH") }, BUILDER(Create_func_length)},
|
||||
{ { C_STRING_WITH_LEN("ORD") }, BUILDER(Create_func_ord)},
|
||||
{ { C_STRING_WITH_LEN("OVERLAPS") }, GEOM_BUILDER(Create_func_overlaps)},
|
||||
{ { C_STRING_WITH_LEN("OVERLAPS") }, GEOM_BUILDER(Create_func_mbr_overlaps)},
|
||||
{ { C_STRING_WITH_LEN("PERIOD_ADD") }, BUILDER(Create_func_period_add)},
|
||||
{ { C_STRING_WITH_LEN("PERIOD_DIFF") }, BUILDER(Create_func_period_diff)},
|
||||
{ { C_STRING_WITH_LEN("PI") }, BUILDER(Create_func_pi)},
|
||||
@ -4993,6 +5268,64 @@ static Native_func_registry func_array[] =
|
||||
{ { C_STRING_WITH_LEN("STARTPOINT") }, GEOM_BUILDER(Create_func_startpoint)},
|
||||
{ { C_STRING_WITH_LEN("STRCMP") }, BUILDER(Create_func_strcmp)},
|
||||
{ { C_STRING_WITH_LEN("STR_TO_DATE") }, BUILDER(Create_func_str_to_date)},
|
||||
{ { C_STRING_WITH_LEN("ST_AREA") }, GEOM_BUILDER(Create_func_area)},
|
||||
{ { C_STRING_WITH_LEN("ST_ASBINARY") }, GEOM_BUILDER(Create_func_as_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_ASTEXT") }, GEOM_BUILDER(Create_func_as_wkt)},
|
||||
{ { C_STRING_WITH_LEN("ST_ASWKB") }, GEOM_BUILDER(Create_func_as_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_ASWKT") }, GEOM_BUILDER(Create_func_as_wkt)},
|
||||
{ { C_STRING_WITH_LEN("ST_BUFFER") }, GEOM_BUILDER(Create_func_buffer)},
|
||||
{ { C_STRING_WITH_LEN("ST_CENTROID") }, GEOM_BUILDER(Create_func_centroid)},
|
||||
{ { C_STRING_WITH_LEN("ST_CONTAINS") }, GEOM_BUILDER(Create_func_contains)},
|
||||
{ { C_STRING_WITH_LEN("ST_CROSSES") }, GEOM_BUILDER(Create_func_crosses)},
|
||||
{ { C_STRING_WITH_LEN("ST_DIFFERENCE") }, GEOM_BUILDER(Create_func_difference)},
|
||||
{ { C_STRING_WITH_LEN("ST_DIMENSION") }, GEOM_BUILDER(Create_func_dimension)},
|
||||
{ { C_STRING_WITH_LEN("ST_DISJOINT") }, GEOM_BUILDER(Create_func_disjoint)},
|
||||
{ { C_STRING_WITH_LEN("ST_DISTANCE") }, GEOM_BUILDER(Create_func_distance)},
|
||||
{ { C_STRING_WITH_LEN("ST_ENDPOINT") }, GEOM_BUILDER(Create_func_endpoint)},
|
||||
{ { C_STRING_WITH_LEN("ST_ENVELOPE") }, GEOM_BUILDER(Create_func_envelope)},
|
||||
{ { C_STRING_WITH_LEN("ST_EQUALS") }, GEOM_BUILDER(Create_func_equals)},
|
||||
{ { C_STRING_WITH_LEN("ST_EXTERIORRING") }, GEOM_BUILDER(Create_func_exteriorring)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMCOLLFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMCOLLFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMETRYCOLLECTIONFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMETRYCOLLECTIONFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMETRYFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMETRYFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMETRYN") }, GEOM_BUILDER(Create_func_geometryn)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMETRYTYPE") }, GEOM_BUILDER(Create_func_geometry_type)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_GEOMFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_EQUALS") }, GEOM_BUILDER(Create_func_equals)},
|
||||
{ { C_STRING_WITH_LEN("ST_INTERIORRINGN") }, GEOM_BUILDER(Create_func_interiorringn)},
|
||||
{ { C_STRING_WITH_LEN("ST_INTERSECTS") }, GEOM_BUILDER(Create_func_intersects)},
|
||||
{ { C_STRING_WITH_LEN("ST_INTERSECTION") }, GEOM_BUILDER(Create_func_intersection)},
|
||||
{ { C_STRING_WITH_LEN("ST_ISCLOSED") }, GEOM_BUILDER(Create_func_isclosed)},
|
||||
{ { C_STRING_WITH_LEN("ST_ISEMPTY") }, GEOM_BUILDER(Create_func_isempty)},
|
||||
{ { C_STRING_WITH_LEN("ST_ISSIMPLE") }, GEOM_BUILDER(Create_func_issimple)},
|
||||
{ { C_STRING_WITH_LEN("ST_LENGTH") }, GEOM_BUILDER(Create_func_glength)},
|
||||
{ { C_STRING_WITH_LEN("ST_LINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_LINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_LINESTRINGFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_LINESTRINGFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_NUMGEOMETRIES") }, GEOM_BUILDER(Create_func_numgeometries)},
|
||||
{ { C_STRING_WITH_LEN("ST_NUMINTERIORRINGS") }, GEOM_BUILDER(Create_func_numinteriorring)},
|
||||
{ { C_STRING_WITH_LEN("ST_NUMPOINTS") }, GEOM_BUILDER(Create_func_numpoints)},
|
||||
{ { C_STRING_WITH_LEN("ST_OVERLAPS") }, GEOM_BUILDER(Create_func_overlaps)},
|
||||
{ { C_STRING_WITH_LEN("ST_POINTFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_POINTFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_POINTN") }, GEOM_BUILDER(Create_func_pointn)},
|
||||
{ { C_STRING_WITH_LEN("ST_POLYFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_POLYFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_POLYGONFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
|
||||
{ { C_STRING_WITH_LEN("ST_POLYGONFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
|
||||
{ { C_STRING_WITH_LEN("ST_SRID") }, GEOM_BUILDER(Create_func_srid)},
|
||||
{ { C_STRING_WITH_LEN("ST_STARTPOINT") }, GEOM_BUILDER(Create_func_startpoint)},
|
||||
{ { C_STRING_WITH_LEN("ST_SYMDIFFERENCE") }, GEOM_BUILDER(Create_func_symdifference)},
|
||||
{ { C_STRING_WITH_LEN("ST_TOUCHES") }, GEOM_BUILDER(Create_func_touches)},
|
||||
{ { C_STRING_WITH_LEN("ST_UNION") }, GEOM_BUILDER(Create_func_union)},
|
||||
{ { C_STRING_WITH_LEN("ST_WITHIN") }, GEOM_BUILDER(Create_func_within)},
|
||||
{ { C_STRING_WITH_LEN("ST_X") }, GEOM_BUILDER(Create_func_x)},
|
||||
{ { C_STRING_WITH_LEN("ST_Y") }, GEOM_BUILDER(Create_func_y)},
|
||||
{ { C_STRING_WITH_LEN("SUBSTRING_INDEX") }, BUILDER(Create_func_substr_index)},
|
||||
{ { C_STRING_WITH_LEN("SUBTIME") }, BUILDER(Create_func_subtime)},
|
||||
{ { C_STRING_WITH_LEN("TAN") }, BUILDER(Create_func_tan)},
|
||||
|
1103
sql/item_geofunc.cc
1103
sql/item_geofunc.cc
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,8 @@
|
||||
/* Copyright (c) 2003, 2011, Oracle and/or its affiliates.
|
||||
#ifndef ITEM_GEOFUNC_INCLUDED
|
||||
#define ITEM_GEOFUNC_INCLUDED
|
||||
|
||||
/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (C) 2011 Monty Program Ab.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -10,8 +14,8 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
|
||||
|
||||
|
||||
/* This file defines all spatial functions */
|
||||
@ -22,6 +26,9 @@
|
||||
#pragma interface /* gcc class implementation */
|
||||
#endif
|
||||
|
||||
#include "gcalc_slicescan.h"
|
||||
#include "gcalc_tools.h"
|
||||
|
||||
class Item_geometry_func: public Item_str_func
|
||||
{
|
||||
public:
|
||||
@ -41,7 +48,7 @@ class Item_func_geometry_from_text: public Item_geometry_func
|
||||
public:
|
||||
Item_func_geometry_from_text(Item *a) :Item_geometry_func(a) {}
|
||||
Item_func_geometry_from_text(Item *a, Item *srid) :Item_geometry_func(a, srid) {}
|
||||
const char *func_name() const { return "geometryfromtext"; }
|
||||
const char *func_name() const { return "st_geometryfromtext"; }
|
||||
String *val_str(String *);
|
||||
};
|
||||
|
||||
@ -50,7 +57,7 @@ class Item_func_geometry_from_wkb: public Item_geometry_func
|
||||
public:
|
||||
Item_func_geometry_from_wkb(Item *a): Item_geometry_func(a) {}
|
||||
Item_func_geometry_from_wkb(Item *a, Item *srid): Item_geometry_func(a, srid) {}
|
||||
const char *func_name() const { return "geometryfromwkb"; }
|
||||
const char *func_name() const { return "st_geometryfromwkb"; }
|
||||
String *val_str(String *);
|
||||
};
|
||||
|
||||
@ -58,7 +65,7 @@ class Item_func_as_wkt: public Item_str_func
|
||||
{
|
||||
public:
|
||||
Item_func_as_wkt(Item *a): Item_str_func(a) {}
|
||||
const char *func_name() const { return "astext"; }
|
||||
const char *func_name() const { return "st_astext"; }
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec();
|
||||
};
|
||||
@ -67,7 +74,7 @@ class Item_func_as_wkb: public Item_geometry_func
|
||||
{
|
||||
public:
|
||||
Item_func_as_wkb(Item *a): Item_geometry_func(a) {}
|
||||
const char *func_name() const { return "aswkb"; }
|
||||
const char *func_name() const { return "st_aswkb"; }
|
||||
String *val_str(String *);
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_BLOB; }
|
||||
};
|
||||
@ -77,10 +84,11 @@ class Item_func_geometry_type: public Item_str_func
|
||||
public:
|
||||
Item_func_geometry_type(Item *a): Item_str_func(a) {}
|
||||
String *val_str(String *);
|
||||
const char *func_name() const { return "geometrytype"; }
|
||||
const char *func_name() const { return "st_geometrytype"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
max_length=20; // "GeometryCollection" is the most long
|
||||
// "GeometryCollection" is the longest
|
||||
max_length= 20;
|
||||
maybe_null= 1;
|
||||
};
|
||||
};
|
||||
@ -89,7 +97,7 @@ class Item_func_centroid: public Item_geometry_func
|
||||
{
|
||||
public:
|
||||
Item_func_centroid(Item *a): Item_geometry_func(a) {}
|
||||
const char *func_name() const { return "centroid"; }
|
||||
const char *func_name() const { return "st_centroid"; }
|
||||
String *val_str(String *);
|
||||
Field::geometry_type get_geometry_type() const;
|
||||
};
|
||||
@ -98,7 +106,7 @@ class Item_func_envelope: public Item_geometry_func
|
||||
{
|
||||
public:
|
||||
Item_func_envelope(Item *a): Item_geometry_func(a) {}
|
||||
const char *func_name() const { return "envelope"; }
|
||||
const char *func_name() const { return "st_envelope"; }
|
||||
String *val_str(String *);
|
||||
Field::geometry_type get_geometry_type() const;
|
||||
};
|
||||
@ -108,7 +116,7 @@ class Item_func_point: public Item_geometry_func
|
||||
public:
|
||||
Item_func_point(Item *a, Item *b): Item_geometry_func(a, b) {}
|
||||
Item_func_point(Item *a, Item *b, Item *srid): Item_geometry_func(a, b, srid) {}
|
||||
const char *func_name() const { return "point"; }
|
||||
const char *func_name() const { return "st_point"; }
|
||||
String *val_str(String *);
|
||||
Field::geometry_type get_geometry_type() const;
|
||||
};
|
||||
@ -124,11 +132,11 @@ public:
|
||||
switch (decomp_func)
|
||||
{
|
||||
case SP_STARTPOINT:
|
||||
return "startpoint";
|
||||
return "st_startpoint";
|
||||
case SP_ENDPOINT:
|
||||
return "endpoint";
|
||||
return "st_endpoint";
|
||||
case SP_EXTERIORRING:
|
||||
return "exteriorring";
|
||||
return "st_exteriorring";
|
||||
default:
|
||||
DBUG_ASSERT(0); // Should never happened
|
||||
return "spatial_decomp_unknown";
|
||||
@ -148,11 +156,11 @@ public:
|
||||
switch (decomp_func_n)
|
||||
{
|
||||
case SP_POINTN:
|
||||
return "pointn";
|
||||
return "st_pointn";
|
||||
case SP_GEOMETRYN:
|
||||
return "geometryn";
|
||||
return "st_geometryn";
|
||||
case SP_INTERIORRINGN:
|
||||
return "interiorringn";
|
||||
return "st_interiorringn";
|
||||
default:
|
||||
DBUG_ASSERT(0); // Should never happened
|
||||
return "spatial_decomp_n_unknown";
|
||||
@ -191,57 +199,53 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
const char *func_name() const { return "multipoint"; }
|
||||
const char *func_name() const { return "st_multipoint"; }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Spatial relations
|
||||
*/
|
||||
|
||||
class Item_func_spatial_rel: public Item_bool_func2
|
||||
class Item_func_spatial_mbr_rel: public Item_bool_func2
|
||||
{
|
||||
enum Functype spatial_rel;
|
||||
public:
|
||||
Item_func_spatial_rel(Item *a,Item *b, enum Functype sp_rel) :
|
||||
Item_func_spatial_mbr_rel(Item *a,Item *b, enum Functype sp_rel) :
|
||||
Item_bool_func2(a,b) { spatial_rel = sp_rel; }
|
||||
longlong val_int();
|
||||
enum Functype functype() const
|
||||
{
|
||||
switch (spatial_rel) {
|
||||
case SP_CONTAINS_FUNC:
|
||||
return SP_WITHIN_FUNC;
|
||||
case SP_WITHIN_FUNC:
|
||||
return SP_CONTAINS_FUNC;
|
||||
default:
|
||||
return spatial_rel;
|
||||
}
|
||||
enum Functype rev_functype() const { return spatial_rel; }
|
||||
const char *func_name() const;
|
||||
virtual inline void print(String *str, enum_query_type query_type)
|
||||
{
|
||||
Item_func::print(str, query_type);
|
||||
}
|
||||
void fix_length_and_dec() { maybe_null= 1; }
|
||||
bool is_null() { (void) val_int(); return null_value; }
|
||||
};
|
||||
|
||||
|
||||
class Item_func_spatial_rel: public Item_bool_func2
|
||||
{
|
||||
enum Functype spatial_rel;
|
||||
Gcalc_heap collector;
|
||||
Gcalc_scan_iterator scan_it;
|
||||
Gcalc_function func;
|
||||
String tmp_value1,tmp_value2;
|
||||
public:
|
||||
Item_func_spatial_rel(Item *a,Item *b, enum Functype sp_rel);
|
||||
virtual ~Item_func_spatial_rel();
|
||||
longlong val_int();
|
||||
enum Functype functype() const
|
||||
{
|
||||
return spatial_rel;
|
||||
}
|
||||
enum Functype rev_functype() const { return spatial_rel; }
|
||||
const char *func_name() const
|
||||
{
|
||||
switch (spatial_rel) {
|
||||
case SP_CONTAINS_FUNC:
|
||||
return "contains";
|
||||
case SP_WITHIN_FUNC:
|
||||
return "within";
|
||||
case SP_EQUALS_FUNC:
|
||||
return "equals";
|
||||
case SP_DISJOINT_FUNC:
|
||||
return "disjoint";
|
||||
case SP_INTERSECTS_FUNC:
|
||||
return "intersects";
|
||||
case SP_TOUCHES_FUNC:
|
||||
return "touches";
|
||||
case SP_CROSSES_FUNC:
|
||||
return "crosses";
|
||||
case SP_OVERLAPS_FUNC:
|
||||
return "overlaps";
|
||||
default:
|
||||
DBUG_ASSERT(0); // Should never happened
|
||||
return "sp_unknown";
|
||||
}
|
||||
}
|
||||
|
||||
const char *func_name() const;
|
||||
virtual inline void print(String *str, enum_query_type query_type)
|
||||
{
|
||||
Item_func::print(str, query_type);
|
||||
@ -251,23 +255,109 @@ public:
|
||||
bool is_null() { (void) val_int(); return null_value; }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Spatial operations
|
||||
*/
|
||||
|
||||
class Item_func_spatial_operation: public Item_geometry_func
|
||||
{
|
||||
public:
|
||||
Gcalc_function::op_type spatial_op;
|
||||
Gcalc_heap collector;
|
||||
Gcalc_function func;
|
||||
Gcalc_scan_iterator scan_it;
|
||||
|
||||
Gcalc_result_receiver res_receiver;
|
||||
Gcalc_operation_reducer operation;
|
||||
String tmp_value1,tmp_value2;
|
||||
public:
|
||||
Item_func_spatial_operation(Item *a,Item *b, Gcalc_function::op_type sp_op) :
|
||||
Item_geometry_func(a, b), spatial_op(sp_op)
|
||||
{}
|
||||
virtual ~Item_func_spatial_operation();
|
||||
String *val_str(String *);
|
||||
const char *func_name() const;
|
||||
virtual inline void print(String *str, enum_query_type query_type)
|
||||
{
|
||||
Item_func::print(str, query_type);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Item_func_buffer: public Item_geometry_func
|
||||
{
|
||||
protected:
|
||||
class Transporter : public Gcalc_operation_transporter
|
||||
{
|
||||
int m_npoints;
|
||||
double m_d;
|
||||
double x1,y1,x2,y2;
|
||||
double x00,y00,x01,y01;
|
||||
int add_edge_buffer(double x3, double y3, bool round_p1, bool round_p2);
|
||||
int add_last_edge_buffer();
|
||||
int add_point_buffer(double x, double y);
|
||||
int complete();
|
||||
int m_nshapes;
|
||||
Gcalc_function::op_type buffer_op;
|
||||
int last_shape_pos;
|
||||
bool skip_line;
|
||||
|
||||
public:
|
||||
Transporter(Gcalc_function *fn, Gcalc_heap *heap, double d) :
|
||||
Gcalc_operation_transporter(fn, heap), m_npoints(0), m_d(d),
|
||||
m_nshapes(0), buffer_op((d > 0.0) ? Gcalc_function::op_union :
|
||||
Gcalc_function::op_difference),
|
||||
skip_line(FALSE)
|
||||
{}
|
||||
int single_point(double x, double y);
|
||||
int start_line();
|
||||
int complete_line();
|
||||
int start_poly();
|
||||
int complete_poly();
|
||||
int start_ring();
|
||||
int complete_ring();
|
||||
int add_point(double x, double y);
|
||||
|
||||
int start_collection(int n_objects);
|
||||
};
|
||||
Gcalc_heap collector;
|
||||
Gcalc_function func;
|
||||
Gcalc_scan_iterator scan_it;
|
||||
|
||||
Gcalc_result_receiver res_receiver;
|
||||
Gcalc_operation_reducer operation;
|
||||
String tmp_value;
|
||||
|
||||
public:
|
||||
Item_func_buffer(Item *obj, Item *distance):
|
||||
Item_geometry_func(obj, distance) {}
|
||||
const char *func_name() const { return "st_buffer"; }
|
||||
String *val_str(String *);
|
||||
};
|
||||
|
||||
|
||||
class Item_func_isempty: public Item_bool_func
|
||||
{
|
||||
public:
|
||||
Item_func_isempty(Item *a): Item_bool_func(a) {}
|
||||
longlong val_int();
|
||||
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
||||
const char *func_name() const { return "isempty"; }
|
||||
const char *func_name() const { return "st_isempty"; }
|
||||
void fix_length_and_dec() { maybe_null= 1; }
|
||||
};
|
||||
|
||||
class Item_func_issimple: public Item_bool_func
|
||||
{
|
||||
Gcalc_heap collector;
|
||||
Gcalc_function func;
|
||||
Gcalc_scan_iterator scan_it;
|
||||
String tmp;
|
||||
public:
|
||||
Item_func_issimple(Item *a): Item_bool_func(a) {}
|
||||
longlong val_int();
|
||||
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
||||
const char *func_name() const { return "issimple"; }
|
||||
const char *func_name() const { return "st_issimple"; }
|
||||
void fix_length_and_dec() { maybe_null= 1; }
|
||||
};
|
||||
|
||||
@ -277,7 +367,7 @@ public:
|
||||
Item_func_isclosed(Item *a): Item_bool_func(a) {}
|
||||
longlong val_int();
|
||||
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
||||
const char *func_name() const { return "isclosed"; }
|
||||
const char *func_name() const { return "st_isclosed"; }
|
||||
void fix_length_and_dec() { maybe_null= 1; }
|
||||
};
|
||||
|
||||
@ -287,7 +377,7 @@ class Item_func_dimension: public Item_int_func
|
||||
public:
|
||||
Item_func_dimension(Item *a): Item_int_func(a) {}
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "dimension"; }
|
||||
const char *func_name() const { return "st_dimension"; }
|
||||
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||
};
|
||||
|
||||
@ -297,7 +387,7 @@ class Item_func_x: public Item_real_func
|
||||
public:
|
||||
Item_func_x(Item *a): Item_real_func(a) {}
|
||||
double val_real();
|
||||
const char *func_name() const { return "x"; }
|
||||
const char *func_name() const { return "st_x"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
Item_real_func::fix_length_and_dec();
|
||||
@ -312,7 +402,7 @@ class Item_func_y: public Item_real_func
|
||||
public:
|
||||
Item_func_y(Item *a): Item_real_func(a) {}
|
||||
double val_real();
|
||||
const char *func_name() const { return "y"; }
|
||||
const char *func_name() const { return "st_y"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
Item_real_func::fix_length_and_dec();
|
||||
@ -327,7 +417,7 @@ class Item_func_numgeometries: public Item_int_func
|
||||
public:
|
||||
Item_func_numgeometries(Item *a): Item_int_func(a) {}
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "numgeometries"; }
|
||||
const char *func_name() const { return "st_numgeometries"; }
|
||||
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||
};
|
||||
|
||||
@ -338,7 +428,7 @@ class Item_func_numinteriorring: public Item_int_func
|
||||
public:
|
||||
Item_func_numinteriorring(Item *a): Item_int_func(a) {}
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "numinteriorrings"; }
|
||||
const char *func_name() const { return "st_numinteriorrings"; }
|
||||
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||
};
|
||||
|
||||
@ -349,7 +439,7 @@ class Item_func_numpoints: public Item_int_func
|
||||
public:
|
||||
Item_func_numpoints(Item *a): Item_int_func(a) {}
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "numpoints"; }
|
||||
const char *func_name() const { return "st_numpoints"; }
|
||||
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||
};
|
||||
|
||||
@ -360,7 +450,7 @@ class Item_func_area: public Item_real_func
|
||||
public:
|
||||
Item_func_area(Item *a): Item_real_func(a) {}
|
||||
double val_real();
|
||||
const char *func_name() const { return "area"; }
|
||||
const char *func_name() const { return "st_area"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
Item_real_func::fix_length_and_dec();
|
||||
@ -375,7 +465,7 @@ class Item_func_glength: public Item_real_func
|
||||
public:
|
||||
Item_func_glength(Item *a): Item_real_func(a) {}
|
||||
double val_real();
|
||||
const char *func_name() const { return "glength"; }
|
||||
const char *func_name() const { return "st_length"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
Item_real_func::fix_length_and_dec();
|
||||
@ -394,11 +484,26 @@ public:
|
||||
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||
};
|
||||
|
||||
|
||||
class Item_func_distance: public Item_real_func
|
||||
{
|
||||
String tmp_value1;
|
||||
String tmp_value2;
|
||||
Gcalc_heap collector;
|
||||
Gcalc_function func;
|
||||
Gcalc_scan_iterator scan_it;
|
||||
public:
|
||||
Item_func_distance(Item *a, Item *b): Item_real_func(a, b) {}
|
||||
double val_real();
|
||||
const char *func_name() const { return "st_distance"; }
|
||||
};
|
||||
|
||||
#define GEOM_NEW(thd, obj_constructor) new (thd->mem_root) obj_constructor
|
||||
|
||||
#else /*HAVE_SPATIAL*/
|
||||
|
||||
#define GEOM_NEW(thd, obj_constructor) NULL
|
||||
|
||||
#endif
|
||||
#endif /*HAVE_SPATIAL*/
|
||||
#endif /*ITEM_GEOFUNC_INCLUDED*/
|
||||
|
||||
|
166
sql/plistsort.c
Normal file
166
sql/plistsort.c
Normal file
@ -0,0 +1,166 @@
|
||||
/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
|
||||
/*
|
||||
things to define before including the file:
|
||||
|
||||
#define LS_LIST_ITEM ListItem
|
||||
#define LS_COMPARE_FUNC_DECL compare_func var_name,
|
||||
#define LS_COMPARE_FUNC_CALL(list_el1, list_el2) (*var_name)(list_el1, list_el2)
|
||||
#define LS_NEXT(A) (A)->next
|
||||
#define LS_SET_NEXT(A,val) (A)->next= val
|
||||
#define LS_P_NEXT(A) &(A)->next
|
||||
#define LS_NAME plistsort
|
||||
#define LS_SCOPE static
|
||||
#define LS_STRUCT_NAME ls_struct_name
|
||||
*/
|
||||
|
||||
typedef struct LS_STRUCT_NAME
|
||||
{
|
||||
LS_LIST_ITEM *list1;
|
||||
int list_len;
|
||||
int return_point;
|
||||
} LS_STRUCT_NAME;
|
||||
|
||||
LS_SCOPE LS_LIST_ITEM* LS_NAME(LS_COMPARE_FUNC_DECL LS_LIST_ITEM *list, int list_len)
|
||||
{
|
||||
LS_LIST_ITEM *list_end;
|
||||
LS_LIST_ITEM *sorted_list;
|
||||
|
||||
struct LS_STRUCT_NAME stack[63], *sp= stack;
|
||||
|
||||
if (list_len < 2)
|
||||
return list;
|
||||
|
||||
sp->list_len= list_len;
|
||||
sp->return_point= 2;
|
||||
|
||||
recursion_point:
|
||||
|
||||
if (sp->list_len < 4)
|
||||
{
|
||||
LS_LIST_ITEM *e1, *e2;
|
||||
sorted_list= list;
|
||||
e1= LS_NEXT(sorted_list);
|
||||
list_end= LS_NEXT(e1);
|
||||
if (LS_COMPARE_FUNC_CALL(sorted_list, e1))
|
||||
{
|
||||
sorted_list= e1;
|
||||
e1= list;
|
||||
}
|
||||
if (sp->list_len == 2)
|
||||
{
|
||||
LS_SET_NEXT(sorted_list, e1);
|
||||
LS_SET_NEXT(e1, NULL);
|
||||
goto exit_point;
|
||||
}
|
||||
e2= list_end;
|
||||
list_end= LS_NEXT(e2);
|
||||
if (LS_COMPARE_FUNC_CALL(e1, e2))
|
||||
{
|
||||
{
|
||||
LS_LIST_ITEM *tmp_e= e1;
|
||||
e1= e2;
|
||||
e2= tmp_e;
|
||||
}
|
||||
if (LS_COMPARE_FUNC_CALL(sorted_list, e1))
|
||||
{
|
||||
LS_LIST_ITEM *tmp_e= sorted_list;
|
||||
sorted_list= e1;
|
||||
e1= tmp_e;
|
||||
}
|
||||
}
|
||||
|
||||
LS_SET_NEXT(sorted_list, e1);
|
||||
LS_SET_NEXT(e1, e2);
|
||||
LS_SET_NEXT(e2, NULL);
|
||||
goto exit_point;
|
||||
}
|
||||
|
||||
{
|
||||
register struct LS_STRUCT_NAME *sp0= sp++;
|
||||
sp->list_len= sp0->list_len >> 1;
|
||||
sp0->list_len-= sp->list_len;
|
||||
sp->return_point= 0;
|
||||
}
|
||||
goto recursion_point;
|
||||
return_point0:
|
||||
sp->list1= sorted_list;
|
||||
{
|
||||
register struct LS_STRUCT_NAME *sp0= sp++;
|
||||
list= list_end;
|
||||
sp->list_len= sp0->list_len;
|
||||
sp->return_point= 1;
|
||||
}
|
||||
goto recursion_point;
|
||||
return_point1:
|
||||
{
|
||||
register LS_LIST_ITEM **hook= &sorted_list;
|
||||
register LS_LIST_ITEM *list1= sp->list1;
|
||||
register LS_LIST_ITEM *list2= sorted_list;
|
||||
|
||||
if (LS_COMPARE_FUNC_CALL(list1, list2))
|
||||
{
|
||||
LS_LIST_ITEM *tmp_e= list2;
|
||||
list2= list1;
|
||||
list1= tmp_e;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
*hook= list1;
|
||||
do
|
||||
{
|
||||
if (!(list1= *(hook= LS_P_NEXT(list1))))
|
||||
{
|
||||
*hook= list2;
|
||||
goto exit_point;
|
||||
}
|
||||
} while (LS_COMPARE_FUNC_CALL(list2, list1));
|
||||
|
||||
*hook= list2;
|
||||
do
|
||||
{
|
||||
if (!(list2= *(hook= LS_P_NEXT(list2))))
|
||||
{
|
||||
*hook= list1;
|
||||
goto exit_point;
|
||||
}
|
||||
} while (LS_COMPARE_FUNC_CALL(list1, list2));
|
||||
}
|
||||
}
|
||||
|
||||
exit_point:
|
||||
switch ((sp--)->return_point)
|
||||
{
|
||||
case 0: goto return_point0;
|
||||
case 1: goto return_point1;
|
||||
default:;
|
||||
}
|
||||
|
||||
return sorted_list;
|
||||
}
|
||||
|
||||
|
||||
#undef LS_LIST_ITEM
|
||||
#undef LS_NEXT
|
||||
#undef LS_SET_NEXT
|
||||
#undef LS_P_NEXT
|
||||
#undef LS_NAME
|
||||
#undef LS_STRUCT_NAME
|
||||
#undef LS_SCOPE
|
||||
#undef LS_COMPARE_FUNC_DECL
|
||||
#undef LS_COMPARE_FUNC_CALL
|
||||
|
@ -6288,6 +6288,8 @@ ER_QUERY_CACHE_IS_DISABLED
|
||||
eng "Query cache is disabled (resize or similar command in progress); repeat this command later"
|
||||
ER_QUERY_CACHE_IS_GLOBALY_DISABLED
|
||||
eng "Query cache is globally disabled and you can't enable it only for this session"
|
||||
ER_SPATIAL_MUST_HAVE_GEOM_COL 42000
|
||||
eng "A SPATIAL index may only contain a geometrical type column"
|
||||
ER_VIEW_ORDERBY_IGNORED
|
||||
eng "View '%-.192s'.'%-.192s' ORDER BY clause ignored because there is other ORDER BY clause already."
|
||||
ER_CONNECTION_KILLED 70100
|
||||
|
706
sql/spatial.cc
706
sql/spatial.cc
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002-2006 MySQL AB
|
||||
/* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -10,14 +10,19 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
|
||||
|
||||
#ifndef _spatial_h
|
||||
#define _spatial_h
|
||||
|
||||
#include "sql_string.h" /* String, LEX_STRING */
|
||||
#include <my_compiler.h>
|
||||
|
||||
#ifdef HAVE_SPATIAL
|
||||
|
||||
#include "gcalc_tools.h"
|
||||
|
||||
const uint SRID_SIZE= 4;
|
||||
const uint SIZEOF_STORED_DOUBLE= 8;
|
||||
const uint POINT_DATA_SIZE= SIZEOF_STORED_DOUBLE*2;
|
||||
@ -242,16 +247,19 @@ public:
|
||||
virtual const Class_info *get_class_info() const=0;
|
||||
virtual uint32 get_data_size() const=0;
|
||||
virtual bool init_from_wkt(Gis_read_stream *trs, String *wkb)=0;
|
||||
|
||||
/* returns the length of the wkb that was read */
|
||||
virtual uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo,
|
||||
String *res)=0;
|
||||
virtual uint init_from_opresult(String *bin,
|
||||
const char *opres, uint res_len)
|
||||
{ return init_from_wkb(opres + 4, UINT_MAX32, wkb_ndr, bin) + 4; }
|
||||
|
||||
virtual bool get_data_as_wkt(String *txt, const char **end) const=0;
|
||||
virtual bool get_mbr(MBR *mbr, const char **end) const=0;
|
||||
virtual bool dimension(uint32 *dim, const char **end) const=0;
|
||||
virtual int get_x(double *x) const { return -1; }
|
||||
virtual int get_y(double *y) const { return -1; }
|
||||
virtual int geom_length(double *len) const { return -1; }
|
||||
virtual int geom_length(double *len, const char **end) const { return -1; }
|
||||
virtual int area(double *ar, const char **end) const { return -1;}
|
||||
virtual int is_closed(int *closed) const { return -1; }
|
||||
virtual int num_interior_ring(uint32 *n_int_rings) const { return -1; }
|
||||
@ -264,28 +272,21 @@ public:
|
||||
virtual int point_n(uint32 num, String *result) const { return -1; }
|
||||
virtual int interior_ring_n(uint32 num, String *result) const { return -1; }
|
||||
virtual int geometry_n(uint32 num, String *result) const { return -1; }
|
||||
virtual int store_shapes(Gcalc_shape_transporter *trn) const=0;
|
||||
|
||||
public:
|
||||
static Geometry *create_by_typeid(Geometry_buffer *buffer, int type_id);
|
||||
|
||||
static Geometry *construct(Geometry_buffer *buffer,
|
||||
const char *data, uint32 data_len);
|
||||
static Geometry *create_from_wkt(Geometry_buffer *buffer,
|
||||
Gis_read_stream *trs, String *wkt,
|
||||
bool init_stream=1);
|
||||
static Geometry *create_from_wkb(Geometry_buffer *buffer, const char *wkb,
|
||||
uint32 len, String *res);
|
||||
int as_wkt(String *wkt, const char **end)
|
||||
{
|
||||
uint32 len= (uint) get_class_info()->m_name.length;
|
||||
if (wkt->reserve(len + 2, 512))
|
||||
return 1;
|
||||
wkt->qs_append(get_class_info()->m_name.str, len);
|
||||
wkt->qs_append('(');
|
||||
if (get_data_as_wkt(wkt, end))
|
||||
return 1;
|
||||
wkt->qs_append(')');
|
||||
return 0;
|
||||
}
|
||||
static Geometry *create_from_wkb(Geometry_buffer *buffer,
|
||||
const char *wkb, uint32 len, String *res);
|
||||
static int create_from_opresult(Geometry_buffer *g_buf,
|
||||
String *res, Gcalc_result_receiver &rr);
|
||||
int as_wkt(String *wkt, const char **end);
|
||||
|
||||
inline void set_data_ptr(const char *data, uint32 data_len)
|
||||
{
|
||||
@ -363,12 +364,15 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int geom_length(double *len, const char **end) const;
|
||||
int area(double *ar, const char **end) const;
|
||||
bool dimension(uint32 *dim, const char **end) const
|
||||
{
|
||||
*dim= 0;
|
||||
*end= 0; /* No default end */
|
||||
return 0;
|
||||
}
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
};
|
||||
|
||||
@ -385,7 +389,8 @@ public:
|
||||
uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res);
|
||||
bool get_data_as_wkt(String *txt, const char **end) const;
|
||||
bool get_mbr(MBR *mbr, const char **end) const;
|
||||
int geom_length(double *len) const;
|
||||
int geom_length(double *len, const char **end) const;
|
||||
int area(double *ar, const char **end) const;
|
||||
int is_closed(int *closed) const;
|
||||
int num_points(uint32 *n_points) const;
|
||||
int start_point(String *point) const;
|
||||
@ -397,6 +402,7 @@ public:
|
||||
*end= 0; /* No default end */
|
||||
return 0;
|
||||
}
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
};
|
||||
|
||||
@ -411,6 +417,7 @@ public:
|
||||
uint32 get_data_size() const;
|
||||
bool init_from_wkt(Gis_read_stream *trs, String *wkb);
|
||||
uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res);
|
||||
uint init_from_opresult(String *bin, const char *opres, uint res_len);
|
||||
bool get_data_as_wkt(String *txt, const char **end) const;
|
||||
bool get_mbr(MBR *mbr, const char **end) const;
|
||||
int area(double *ar, const char **end) const;
|
||||
@ -425,6 +432,7 @@ public:
|
||||
*end= 0; /* No default end */
|
||||
return 0;
|
||||
}
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
};
|
||||
|
||||
@ -439,6 +447,7 @@ public:
|
||||
uint32 get_data_size() const;
|
||||
bool init_from_wkt(Gis_read_stream *trs, String *wkb);
|
||||
uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res);
|
||||
uint init_from_opresult(String *bin, const char *opres, uint res_len);
|
||||
bool get_data_as_wkt(String *txt, const char **end) const;
|
||||
bool get_mbr(MBR *mbr, const char **end) const;
|
||||
int num_geometries(uint32 *num) const;
|
||||
@ -449,6 +458,7 @@ public:
|
||||
*end= 0; /* No default end */
|
||||
return 0;
|
||||
}
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
};
|
||||
|
||||
@ -463,11 +473,12 @@ public:
|
||||
uint32 get_data_size() const;
|
||||
bool init_from_wkt(Gis_read_stream *trs, String *wkb);
|
||||
uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res);
|
||||
uint init_from_opresult(String *bin, const char *opres, uint res_len);
|
||||
bool get_data_as_wkt(String *txt, const char **end) const;
|
||||
bool get_mbr(MBR *mbr, const char **end) const;
|
||||
int num_geometries(uint32 *num) const;
|
||||
int geometry_n(uint32 num, String *result) const;
|
||||
int geom_length(double *len) const;
|
||||
int geom_length(double *len, const char **end) const;
|
||||
int is_closed(int *closed) const;
|
||||
bool dimension(uint32 *dim, const char **end) const
|
||||
{
|
||||
@ -475,6 +486,7 @@ public:
|
||||
*end= 0; /* No default end */
|
||||
return 0;
|
||||
}
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
};
|
||||
|
||||
@ -501,7 +513,9 @@ public:
|
||||
*end= 0; /* No default end */
|
||||
return 0;
|
||||
}
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
uint init_from_opresult(String *bin, const char *opres, uint res_len);
|
||||
};
|
||||
|
||||
|
||||
@ -515,11 +529,15 @@ public:
|
||||
uint32 get_data_size() const;
|
||||
bool init_from_wkt(Gis_read_stream *trs, String *wkb);
|
||||
uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res);
|
||||
uint init_from_opresult(String *bin, const char *opres, uint res_len);
|
||||
bool get_data_as_wkt(String *txt, const char **end) const;
|
||||
bool get_mbr(MBR *mbr, const char **end) const;
|
||||
int area(double *ar, const char **end) const;
|
||||
int geom_length(double *len, const char **end) const;
|
||||
int num_geometries(uint32 *num) const;
|
||||
int geometry_n(uint32 num, String *result) const;
|
||||
bool dimension(uint32 *dim, const char **end) const;
|
||||
int store_shapes(Gcalc_shape_transporter *trn) const;
|
||||
const Class_info *get_class_info() const;
|
||||
};
|
||||
|
||||
|
@ -3216,11 +3216,19 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
||||
{
|
||||
column->length*= sql_field->charset->mbmaxlen;
|
||||
|
||||
if (key->type == Key::SPATIAL && column->length)
|
||||
if (key->type == Key::SPATIAL)
|
||||
{
|
||||
if (column->length)
|
||||
{
|
||||
my_error(ER_WRONG_SUB_KEY, MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
if (!f_is_geom(sql_field->pack_flag))
|
||||
{
|
||||
my_error(ER_SPATIAL_MUST_HAVE_GEOM_COL, MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
if (f_is_blob(sql_field->pack_flag) ||
|
||||
(f_is_geom(sql_field->pack_flag) && key->type != Key::SPATIAL))
|
||||
|
Reference in New Issue
Block a user