mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge bk-internal:/home/bk/mysql-5.0-maint
into pilot.blaudden:/home/msvensson/mysql/mysql-5.0-maint
This commit is contained in:
@ -177,4 +177,75 @@ insert into t1 values (pointfromtext('point(1,1)'));
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
# End of 5.0 tests
|
--echo End of 4.1 tests
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#24563: MBROverlaps does not seem to function propertly
|
||||||
|
# Bug#54888: MBROverlaps missing in 5.1?
|
||||||
|
#
|
||||||
|
|
||||||
|
# Test all MBR* functions and their non-MBR-prefixed aliases,
|
||||||
|
# using shifted squares to verify the spatial relations.
|
||||||
|
|
||||||
|
# Primary key is needed for NDB with binlog; bug ARCHIVE doesn't
|
||||||
|
# support AUTO_INCREMENT, so specify id values explicitly
|
||||||
|
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(100), square GEOMETRY);
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES( 1, "center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES( 2, "small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 3, "big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES( 4, "up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES( 5, "up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES( 6, "up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES( 7, "down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES( 8, "down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES( 9, "down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES(10, "right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(11, "right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(12, "right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES(13, "left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(14, "left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(15, "left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
# Overlaps needs a few more tests, with point and line dimensions
|
||||||
|
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -392,7 +392,7 @@ 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;
|
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||||
first second w c o e d t i r
|
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 0 1 0
|
||||||
120 121 0 0 0 0 0 0 1 0
|
120 121 0 0 1 0 0 0 1 0
|
||||||
121 120 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 0 1 0
|
||||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||||
@ -456,3 +456,89 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
|||||||
insert into t1 values (pointfromtext('point(1,1)'));
|
insert into t1 values (pointfromtext('point(1,1)'));
|
||||||
ERROR 23000: Column 'fl' cannot be null
|
ERROR 23000: Column 'fl' cannot be null
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
End of 4.1 tests
|
||||||
|
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(100), square GEOMETRY);
|
||||||
|
INSERT INTO t1 VALUES( 1, "center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 2, "small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 3, "big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 4, "up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES( 5, "up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES( 6, "up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
INSERT INTO t1 VALUES( 7, "down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES( 8, "down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES( 9, "down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
INSERT INTO t1 VALUES(10, "right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(11, "right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(12, "right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
INSERT INTO t1 VALUES(13, "left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(14, "left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(15, "left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrcontains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrdisjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrequal
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrintersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
contains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
disjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
equals
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
intersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @vert1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz2)
|
||||||
|
1
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz3)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point2)
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -392,7 +392,7 @@ 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;
|
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||||
first second w c o e d t i r
|
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 0 1 0
|
||||||
120 121 0 0 0 0 0 0 1 0
|
120 121 0 0 1 0 0 0 1 0
|
||||||
121 120 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 0 1 0
|
||||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||||
@ -456,3 +456,89 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
|||||||
insert into t1 values (pointfromtext('point(1,1)'));
|
insert into t1 values (pointfromtext('point(1,1)'));
|
||||||
ERROR 23000: Column 'fl' cannot be null
|
ERROR 23000: Column 'fl' cannot be null
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
End of 4.1 tests
|
||||||
|
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(100), square GEOMETRY);
|
||||||
|
INSERT INTO t1 VALUES( 1, "center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 2, "small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 3, "big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 4, "up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES( 5, "up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES( 6, "up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
INSERT INTO t1 VALUES( 7, "down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES( 8, "down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES( 9, "down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
INSERT INTO t1 VALUES(10, "right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(11, "right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(12, "right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
INSERT INTO t1 VALUES(13, "left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(14, "left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(15, "left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrcontains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrdisjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrequal
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrintersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
contains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
disjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
equals
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
intersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @vert1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz2)
|
||||||
|
1
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz3)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point2)
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -385,7 +385,7 @@ 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;
|
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||||
first second w c o e d t i r
|
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 0 1 0
|
||||||
120 121 0 0 0 0 0 0 1 0
|
120 121 0 0 1 0 0 0 1 0
|
||||||
121 120 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 0 1 0
|
||||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||||
@ -763,3 +763,88 @@ create table t1 (g geometry not null);
|
|||||||
insert into t1 values(default);
|
insert into t1 values(default);
|
||||||
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
drop table t1;
|
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))'));
|
||||||
|
INSERT INTO t1 VALUES("big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES("up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES("up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES("up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
INSERT INTO t1 VALUES("down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES("down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES("down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
INSERT INTO t1 VALUES("right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES("right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES("right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
INSERT INTO t1 VALUES("left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES("left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES("left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrcontains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrdisjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrequal
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrintersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
contains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
disjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
equals
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
intersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @vert1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz2)
|
||||||
|
1
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz3)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point2)
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -392,7 +392,7 @@ 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;
|
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||||
first second w c o e d t i r
|
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 0 1 0
|
||||||
120 121 0 0 0 0 0 0 1 0
|
120 121 0 0 1 0 0 0 1 0
|
||||||
121 120 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 0 1 0
|
||||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||||
@ -456,3 +456,89 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
|||||||
insert into t1 values (pointfromtext('point(1,1)'));
|
insert into t1 values (pointfromtext('point(1,1)'));
|
||||||
ERROR 23000: Column 'fl' cannot be null
|
ERROR 23000: Column 'fl' cannot be null
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
End of 4.1 tests
|
||||||
|
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(100), square GEOMETRY);
|
||||||
|
INSERT INTO t1 VALUES( 1, "center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 2, "small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 3, "big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 4, "up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES( 5, "up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES( 6, "up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
INSERT INTO t1 VALUES( 7, "down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES( 8, "down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES( 9, "down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
INSERT INTO t1 VALUES(10, "right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(11, "right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(12, "right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
INSERT INTO t1 VALUES(13, "left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(14, "left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(15, "left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrcontains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrdisjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrequal
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrintersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
contains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
disjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
equals
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
intersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @vert1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz2)
|
||||||
|
1
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz3)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point2)
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -392,7 +392,7 @@ 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;
|
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||||
first second w c o e d t i r
|
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 0 1 0
|
||||||
120 121 0 0 0 0 0 0 1 0
|
120 121 0 0 1 0 0 0 1 0
|
||||||
121 120 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 0 1 0
|
||||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||||
@ -456,6 +456,92 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
|||||||
insert into t1 values (pointfromtext('point(1,1)'));
|
insert into t1 values (pointfromtext('point(1,1)'));
|
||||||
ERROR 23000: Column 'fl' cannot be null
|
ERROR 23000: Column 'fl' cannot be null
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
End of 4.1 tests
|
||||||
|
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(100), square GEOMETRY);
|
||||||
|
INSERT INTO t1 VALUES( 1, "center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 2, "small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 3, "big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 4, "up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES( 5, "up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES( 6, "up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
INSERT INTO t1 VALUES( 7, "down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES( 8, "down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES( 9, "down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
INSERT INTO t1 VALUES(10, "right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(11, "right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(12, "right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
INSERT INTO t1 VALUES(13, "left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(14, "left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(15, "left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrcontains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrdisjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrequal
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrintersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
contains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
disjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
equals
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
intersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @vert1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz2)
|
||||||
|
1
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz3)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point2)
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
set engine_condition_pushdown = on;
|
set engine_condition_pushdown = on;
|
||||||
DROP TABLE IF EXISTS t1, gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
|
DROP TABLE IF EXISTS t1, gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
|
||||||
CREATE TABLE gis_point (fid INTEGER, g POINT);
|
CREATE TABLE gis_point (fid INTEGER, g POINT);
|
||||||
@ -850,7 +936,7 @@ 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;
|
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||||
first second w c o e d t i r
|
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 0 1 0
|
||||||
120 121 0 0 0 0 0 0 1 0
|
120 121 0 0 1 0 0 0 1 0
|
||||||
121 120 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 0 1 0
|
||||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||||
@ -914,3 +1000,89 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
|||||||
insert into t1 values (pointfromtext('point(1,1)'));
|
insert into t1 values (pointfromtext('point(1,1)'));
|
||||||
ERROR 23000: Column 'fl' cannot be null
|
ERROR 23000: Column 'fl' cannot be null
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
End of 4.1 tests
|
||||||
|
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(100), square GEOMETRY);
|
||||||
|
INSERT INTO t1 VALUES( 1, "center", GeomFromText('POLYGON (( 0 0, 0 2, 2 2, 2 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 2, "small", GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 3, "big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
INSERT INTO t1 VALUES( 4, "up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES( 5, "up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES( 6, "up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
INSERT INTO t1 VALUES( 7, "down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES( 8, "down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES( 9, "down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
INSERT INTO t1 VALUES(10, "right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(11, "right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(12, "right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
INSERT INTO t1 VALUES(13, "left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES(14, "left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES(15, "left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrcontains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrdisjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrequal
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
mbrintersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
contains
|
||||||
|
center,small
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
disjoint
|
||||||
|
down3,left3,right3,up3
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
equals
|
||||||
|
center
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
intersect
|
||||||
|
big,center,down,down2,left,left2,right,right2,small,up,up2
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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
|
||||||
|
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
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
overlaps
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @vert1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz2)
|
||||||
|
1
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @horiz3)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point1)
|
||||||
|
0
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
Overlaps(@horiz1, @point2)
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -1346,3 +1346,44 @@ t1 CREATE TABLE `t1` (
|
|||||||
`i` int(11) default NULL
|
`i` int(11) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='123456789*123456789*123456789*123456789*123456789*123456789*'
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='123456789*123456789*123456789*123456789*123456789*123456789*'
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set sql_mode= 'traditional';
|
||||||
|
create table t1(col1 tinyint, col2 tinyint unsigned,
|
||||||
|
col3 smallint, col4 smallint unsigned,
|
||||||
|
col5 mediumint, col6 mediumint unsigned,
|
||||||
|
col7 int, col8 int unsigned,
|
||||||
|
col9 bigint, col10 bigint unsigned);
|
||||||
|
insert into t1(col1) values('-');
|
||||||
|
ERROR HY000: Incorrect integer value: '-' for column 'col1' at row 1
|
||||||
|
insert into t1(col2) values('+');
|
||||||
|
ERROR HY000: Incorrect integer value: '+' for column 'col2' at row 1
|
||||||
|
insert into t1(col3) values('-');
|
||||||
|
ERROR HY000: Incorrect integer value: '-' for column 'col3' at row 1
|
||||||
|
insert into t1(col4) values('+');
|
||||||
|
ERROR HY000: Incorrect integer value: '+' for column 'col4' at row 1
|
||||||
|
insert into t1(col5) values('-');
|
||||||
|
ERROR HY000: Incorrect integer value: '-' for column 'col5' at row 1
|
||||||
|
insert into t1(col6) values('+');
|
||||||
|
ERROR HY000: Incorrect integer value: '+' for column 'col6' at row 1
|
||||||
|
insert into t1(col7) values('-');
|
||||||
|
ERROR HY000: Incorrect integer value: '-' for column 'col7' at row 1
|
||||||
|
insert into t1(col8) values('+');
|
||||||
|
ERROR HY000: Incorrect integer value: '+' for column 'col8' at row 1
|
||||||
|
insert into t1(col9) values('-');
|
||||||
|
ERROR HY000: Incorrect integer value: '-' for column 'col9' at row 1
|
||||||
|
insert into t1(col10) values('+');
|
||||||
|
ERROR HY000: Incorrect integer value: '+' for column 'col10' at row 1
|
||||||
|
drop table t1;
|
||||||
|
set sql_mode='traditional';
|
||||||
|
create table t1(a year);
|
||||||
|
insert into t1 values ('-');
|
||||||
|
ERROR HY000: Incorrect integer value: '-' for column 'a' at row 1
|
||||||
|
insert into t1 values ('+');
|
||||||
|
ERROR HY000: Incorrect integer value: '+' for column 'a' at row 1
|
||||||
|
insert into t1 values ('');
|
||||||
|
ERROR HY000: Incorrect integer value: '' for column 'a' at row 1
|
||||||
|
insert into t1 values ('2000a');
|
||||||
|
ERROR 01000: Data truncated for column 'a' at row 1
|
||||||
|
insert into t1 values ('2E3x');
|
||||||
|
ERROR 01000: Data truncated for column 'a' at row 1
|
||||||
|
drop table t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -99,7 +99,7 @@ DROP TABLE t1, t2, t3;
|
|||||||
CREATE TABLE t1 (y YEAR);
|
CREATE TABLE t1 (y YEAR);
|
||||||
INSERT INTO t1 VALUES ('abc');
|
INSERT INTO t1 VALUES ('abc');
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1264 Out of range value adjusted for column 'y' at row 1
|
Warning 1366 Incorrect integer value: 'abc' for column 'y' at row 1
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
y
|
y
|
||||||
0000
|
0000
|
||||||
|
@ -34,3 +34,15 @@ select if(y = now(), 1, 0) from t1;
|
|||||||
if(y = now(), 1, 0)
|
if(y = now(), 1, 0)
|
||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1(a year);
|
||||||
|
insert into t1 values (2000.5), ('2000.5'), ('2001a'), ('2.001E3');
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'a' at row 3
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
2001
|
||||||
|
2001
|
||||||
|
2001
|
||||||
|
2001
|
||||||
|
drop table t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -471,3 +471,71 @@ create table t1 (g geometry not null);
|
|||||||
insert into t1 values(default);
|
insert into t1 values(default);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#24563: MBROverlaps does not seem to function propertly
|
||||||
|
# Bug#54888: MBROverlaps missing in 5.1?
|
||||||
|
#
|
||||||
|
|
||||||
|
# Test all MBR* functions and their non-MBR-prefixed aliases,
|
||||||
|
# using shifted squares to verify the spatial relations.
|
||||||
|
|
||||||
|
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))'));
|
||||||
|
INSERT INTO t1 VALUES("big", GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES("up", GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))'));
|
||||||
|
INSERT INTO t1 VALUES("up2", GeomFromText('POLYGON (( 0 2, 0 4, 2 4, 2 2, 0 2))'));
|
||||||
|
INSERT INTO t1 VALUES("up3", GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES("down", GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))'));
|
||||||
|
INSERT INTO t1 VALUES("down2", GeomFromText('POLYGON (( 0 -2, 0 0, 2 0, 2 -2, 0 -2))'));
|
||||||
|
INSERT INTO t1 VALUES("down3", GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES("right", GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))'));
|
||||||
|
INSERT INTO t1 VALUES("right2", GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))'));
|
||||||
|
INSERT INTO t1 VALUES("right3", GeomFromText('POLYGON (( 3 0, 3 2, 5 2, 5 0, 3 0))'));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES("left", GeomFromText('POLYGON (( -1 0, -1 2, 1 2, 1 0, -1 0))'));
|
||||||
|
INSERT INTO t1 VALUES("left2", GeomFromText('POLYGON (( -2 0, -2 2, 0 2, 0 0, -2 0))'));
|
||||||
|
INSERT INTO t1 VALUES("left3", GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))'));
|
||||||
|
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrcontains FROM t1 a1 JOIN t1 a2 ON MBRContains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrdisjoint FROM t1 a1 JOIN t1 a2 ON MBRDisjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrequal FROM t1 a1 JOIN t1 a2 ON MBREqual( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbrintersect FROM t1 a1 JOIN t1 a2 ON MBRIntersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS mbroverlaps FROM t1 a1 JOIN t1 a2 ON MBROverlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS contains FROM t1 a1 JOIN t1 a2 ON Contains( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS disjoint FROM t1 a1 JOIN t1 a2 ON Disjoint( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS equals FROM t1 a1 JOIN t1 a2 ON Equals( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS intersect FROM t1 a1 JOIN t1 a2 ON Intersects( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a2.name ORDER BY a2.name) AS overlaps FROM t1 a1 JOIN t1 a2 ON Overlaps( a1.square, a2.square) WHERE a1.name = "center" GROUP BY a1.name;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
# Overlaps needs a few more tests, with point and line dimensions
|
||||||
|
|
||||||
|
SET @vert1 = GeomFromText('POLYGON ((0 -2, 0 2, 0 -2))');
|
||||||
|
SET @horiz1 = GeomFromText('POLYGON ((-2 0, 2 0, -2 0))');
|
||||||
|
SET @horiz2 = GeomFromText('POLYGON ((-1 0, 3 0, -1 0))');
|
||||||
|
SET @horiz3 = GeomFromText('POLYGON ((2 0, 3 0, 2 0))');
|
||||||
|
SET @point1 = GeomFromText('POLYGON ((0 0))');
|
||||||
|
SET @point2 = GeomFromText('POLYGON ((-2 0))');
|
||||||
|
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @vert1) GROUP BY a1.name;
|
||||||
|
SELECT GROUP_CONCAT(a1.name ORDER BY a1.name) AS overlaps FROM t1 a1 WHERE Overlaps(a1.square, @horiz1) GROUP BY a1.name;
|
||||||
|
SELECT Overlaps(@horiz1, @vert1) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @horiz2) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @horiz3) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @point1) FROM DUAL;
|
||||||
|
SELECT Overlaps(@horiz1, @point2) FROM DUAL;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -1200,3 +1200,53 @@ create table t1 (i int)
|
|||||||
comment '123456789*123456789*123456789*123456789*123456789*123456789*';
|
comment '123456789*123456789*123456789*123456789*123456789*123456789*';
|
||||||
show create table t1;
|
show create table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #26359: Strings becoming truncated and converted to numbers under STRICT mode
|
||||||
|
#
|
||||||
|
set sql_mode= 'traditional';
|
||||||
|
create table t1(col1 tinyint, col2 tinyint unsigned,
|
||||||
|
col3 smallint, col4 smallint unsigned,
|
||||||
|
col5 mediumint, col6 mediumint unsigned,
|
||||||
|
col7 int, col8 int unsigned,
|
||||||
|
col9 bigint, col10 bigint unsigned);
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col1) values('-');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col2) values('+');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col3) values('-');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col4) values('+');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col5) values('-');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col6) values('+');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col7) values('-');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col8) values('+');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col9) values('-');
|
||||||
|
--error 1366
|
||||||
|
insert into t1(col10) values('+');
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #27176: Assigning a string to an year column has unexpected results
|
||||||
|
#
|
||||||
|
set sql_mode='traditional';
|
||||||
|
create table t1(a year);
|
||||||
|
--error 1366
|
||||||
|
insert into t1 values ('-');
|
||||||
|
--error 1366
|
||||||
|
insert into t1 values ('+');
|
||||||
|
--error 1366
|
||||||
|
insert into t1 values ('');
|
||||||
|
--error 1265
|
||||||
|
insert into t1 values ('2000a');
|
||||||
|
--error 1265
|
||||||
|
insert into t1 values ('2E3x');
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -21,4 +21,12 @@ insert into t1 values (now());
|
|||||||
select if(y = now(), 1, 0) from t1;
|
select if(y = now(), 1, 0) from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
#
|
||||||
|
# Bug #27176: Assigning a string to an year column has unexpected results
|
||||||
|
#
|
||||||
|
create table t1(a year);
|
||||||
|
insert into t1 values (2000.5), ('2000.5'), ('2001a'), ('2.001E3');
|
||||||
|
select * from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -37,7 +37,7 @@ gptr my_malloc(unsigned int size, myf my_flags)
|
|||||||
if (my_flags & MY_FAE)
|
if (my_flags & MY_FAE)
|
||||||
error_handler_hook=fatal_error_handler_hook;
|
error_handler_hook=fatal_error_handler_hook;
|
||||||
if (my_flags & (MY_FAE+MY_WME))
|
if (my_flags & (MY_FAE+MY_WME))
|
||||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),size);
|
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG+ME_NOREFRESH),size);
|
||||||
if (my_flags & MY_FAE)
|
if (my_flags & MY_FAE)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -150,11 +150,11 @@ gptr _mymalloc(uint size, const char *filename, uint lineno, myf MyFlags)
|
|||||||
char buff[SC_MAXWIDTH];
|
char buff[SC_MAXWIDTH];
|
||||||
my_errno=errno;
|
my_errno=errno;
|
||||||
sprintf(buff,"Out of memory at line %d, '%s'", lineno, filename);
|
sprintf(buff,"Out of memory at line %d, '%s'", lineno, filename);
|
||||||
my_message(EE_OUTOFMEMORY,buff,MYF(ME_BELL+ME_WAITTANG));
|
my_message(EE_OUTOFMEMORY, buff, MYF(ME_BELL+ME_WAITTANG+ME_NOREFRESH));
|
||||||
sprintf(buff,"needed %d byte (%ldk), memory in use: %ld bytes (%ldk)",
|
sprintf(buff,"needed %d byte (%ldk), memory in use: %ld bytes (%ldk)",
|
||||||
size, (size + 1023L) / 1024L,
|
size, (size + 1023L) / 1024L,
|
||||||
sf_malloc_max_memory, (sf_malloc_max_memory + 1023L) / 1024L);
|
sf_malloc_max_memory, (sf_malloc_max_memory + 1023L) / 1024L);
|
||||||
my_message(EE_OUTOFMEMORY,buff,MYF(ME_BELL+ME_WAITTANG));
|
my_message(EE_OUTOFMEMORY, buff, MYF(ME_BELL+ME_WAITTANG+ME_NOREFRESH));
|
||||||
}
|
}
|
||||||
DBUG_PRINT("error",("Out of memory, in use: %ld at line %d, '%s'",
|
DBUG_PRINT("error",("Out of memory, in use: %ld at line %d, '%s'",
|
||||||
sf_malloc_max_memory,lineno, filename));
|
sf_malloc_max_memory,lineno, filename));
|
||||||
|
371
sql/field.cc
371
sql/field.cc
@ -963,6 +963,31 @@ static Item_result field_types_result_type [FIELDTYPE_NUM]=
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Test if the given string contains important data:
|
||||||
|
not spaces for character string,
|
||||||
|
or any data for binary string.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
test_if_important_data()
|
||||||
|
cs Character set
|
||||||
|
str String to test
|
||||||
|
strend String end
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
FALSE - If string does not have important data
|
||||||
|
TRUE - If string has some important data
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool
|
||||||
|
test_if_important_data(CHARSET_INFO *cs, const char *str, const char *strend)
|
||||||
|
{
|
||||||
|
if (cs != &my_charset_bin)
|
||||||
|
str+= cs->cset->scan(cs, str, strend, MY_SEQ_SPACES);
|
||||||
|
return (str < strend);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Detect Item_result by given field type of UNION merge result
|
Detect Item_result by given field type of UNION merge result
|
||||||
|
|
||||||
@ -1052,65 +1077,114 @@ void Field_num::prepend_zeros(String *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test if given number is a int (or a fixed format float with .000)
|
Test if given number is a int.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
test_if_int()
|
Field_num::check_int
|
||||||
|
cs Character set
|
||||||
str String to test
|
str String to test
|
||||||
end Pointer to char after last used digit
|
end Pointer to char after last used digit
|
||||||
cs Character set
|
length String length
|
||||||
|
error Error returned by strntoull10rnd()
|
||||||
|
|
||||||
NOTES
|
NOTE
|
||||||
This is called after one has called my_strntol() or similar function.
|
This is called after one has called strntoull10rnd() function.
|
||||||
This is only used to give warnings in ALTER TABLE or LOAD DATA...
|
|
||||||
|
|
||||||
TODO
|
|
||||||
Make this multi-byte-character safe
|
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
0 OK
|
0 ok
|
||||||
1 error. A warning is pushed if field_name != 0
|
1 error: empty string or wrong integer.
|
||||||
|
2 error: garbage at the end of string.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool Field::check_int(const char *str, int length, const char *int_end,
|
int Field_num::check_int(CHARSET_INFO *cs, const char *str, int length,
|
||||||
CHARSET_INFO *cs)
|
const char *int_end, int error)
|
||||||
{
|
{
|
||||||
const char *end;
|
/* Test if we get an empty string or wrong integer */
|
||||||
if (str == int_end)
|
if (str == int_end || error == MY_ERRNO_EDOM)
|
||||||
{
|
{
|
||||||
char buff[128];
|
char buff[128];
|
||||||
String tmp(buff,(uint32) sizeof(buff), system_charset_info);
|
String tmp(buff, (uint32) sizeof(buff), system_charset_info);
|
||||||
tmp.copy(str, length, system_charset_info);
|
tmp.copy(str, length, system_charset_info);
|
||||||
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN,
|
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
|
||||||
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
|
||||||
"integer", tmp.c_ptr(), field_name,
|
"integer", tmp.c_ptr(), field_name,
|
||||||
(ulong) table->in_use->row_count);
|
(ulong) table->in_use->row_count);
|
||||||
return 1; // Empty string
|
return 1;
|
||||||
}
|
}
|
||||||
end= str+length;
|
/* Test if we have garbage at the end of the given string. */
|
||||||
if ((str= int_end) == end)
|
if (test_if_important_data(cs, int_end, str + length))
|
||||||
return 0; // OK; All digits was used
|
|
||||||
|
|
||||||
/* Allow end .0000 */
|
|
||||||
if (*str == '.')
|
|
||||||
{
|
{
|
||||||
for (str++ ; str != end && *str == '0'; str++)
|
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
|
||||||
;
|
return 2;
|
||||||
}
|
|
||||||
/* Allow end space */
|
|
||||||
for ( ; str != end ; str++)
|
|
||||||
{
|
|
||||||
if (!my_isspace(cs,*str))
|
|
||||||
{
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Conver a string to an integer then check bounds.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
Field_num::get_int
|
||||||
|
cs Character set
|
||||||
|
from String to convert
|
||||||
|
len Length of the string
|
||||||
|
rnd OUT longlong value
|
||||||
|
unsigned_max max unsigned value
|
||||||
|
signed_min min signed value
|
||||||
|
signed_max max signed value
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
The function calls strntoull10rnd() to get an integer value then
|
||||||
|
check bounds and errors returned. In case of any error a warning
|
||||||
|
is raised.
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
0 ok
|
||||||
|
1 error
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Field_num::get_int(CHARSET_INFO *cs, const char *from, uint len,
|
||||||
|
longlong *rnd, ulonglong unsigned_max,
|
||||||
|
longlong signed_min, longlong signed_max)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
*rnd= (longlong) cs->cset->strntoull10rnd(cs, from, len, unsigned_flag, &end,
|
||||||
|
&error);
|
||||||
|
if (unsigned_flag)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (((ulonglong) *rnd > unsigned_max) && (*rnd= (longlong) unsigned_max) ||
|
||||||
|
error == MY_ERRNO_ERANGE)
|
||||||
|
{
|
||||||
|
goto out_of_range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (*rnd < signed_min)
|
||||||
|
{
|
||||||
|
*rnd= signed_min;
|
||||||
|
goto out_of_range;
|
||||||
|
}
|
||||||
|
else if (*rnd > signed_max)
|
||||||
|
{
|
||||||
|
*rnd= signed_max;
|
||||||
|
goto out_of_range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (table->in_use->count_cuted_fields && check_int(cs, from, len, end, error))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out_of_range:
|
||||||
|
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Process decimal library return codes and issue warnings for overflow and
|
Process decimal library return codes and issue warnings for overflow and
|
||||||
truncation.
|
truncation.
|
||||||
@ -2506,45 +2580,11 @@ void Field_new_decimal::sql_type(String &str) const
|
|||||||
|
|
||||||
int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
|
int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
char *end;
|
|
||||||
int error;
|
int error;
|
||||||
|
longlong rnd;
|
||||||
if (unsigned_flag)
|
|
||||||
{
|
error= get_int(cs, from, len, &rnd, 255, -128, 127);
|
||||||
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
|
ptr[0]= unsigned_flag ? (char) (ulonglong) rnd : (char) rnd;
|
||||||
if (error == MY_ERRNO_ERANGE || tmp > 255)
|
|
||||||
{
|
|
||||||
set_if_smaller(tmp, 255);
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
ptr[0]= (char) tmp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
|
|
||||||
if (tmp < -128)
|
|
||||||
{
|
|
||||||
tmp= -128;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (tmp >= 128)
|
|
||||||
{
|
|
||||||
tmp= 127;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
ptr[0]= (char) tmp;
|
|
||||||
}
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2709,59 +2749,20 @@ void Field_tiny::sql_type(String &res) const
|
|||||||
|
|
||||||
int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
|
int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
char *end;
|
int store_tmp;
|
||||||
int error;
|
int error;
|
||||||
|
longlong rnd;
|
||||||
if (unsigned_flag)
|
|
||||||
{
|
error= get_int(cs, from, len, &rnd, UINT_MAX16, INT_MIN16, INT_MAX16);
|
||||||
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
|
store_tmp= unsigned_flag ? (int) (ulonglong) rnd : (int) rnd;
|
||||||
if (error == MY_ERRNO_ERANGE || tmp > UINT_MAX16)
|
|
||||||
{
|
|
||||||
set_if_smaller(tmp, UINT_MAX16);
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
if (table->s->db_low_byte_first)
|
if (table->s->db_low_byte_first)
|
||||||
{
|
{
|
||||||
int2store(ptr,tmp);
|
int2store(ptr, store_tmp);
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
shortstore(ptr,(short) tmp);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
|
|
||||||
if (tmp < INT_MIN16)
|
|
||||||
{
|
|
||||||
tmp= INT_MIN16;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (tmp > INT_MAX16)
|
|
||||||
{
|
|
||||||
tmp=INT_MAX16;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
if (table->s->db_low_byte_first)
|
|
||||||
{
|
|
||||||
int2store(ptr,tmp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
shortstore(ptr,(short) tmp);
|
shortstore(ptr, (short) store_tmp);
|
||||||
}
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2989,45 +2990,13 @@ void Field_short::sql_type(String &res) const
|
|||||||
|
|
||||||
int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
|
int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
char *end;
|
int store_tmp;
|
||||||
int error;
|
int error;
|
||||||
|
longlong rnd;
|
||||||
if (unsigned_flag)
|
|
||||||
{
|
error= get_int(cs, from, len, &rnd, UINT_MAX24, INT_MIN24, INT_MAX24);
|
||||||
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
|
store_tmp= unsigned_flag ? (int) (ulonglong) rnd : (int) rnd;
|
||||||
if (error == MY_ERRNO_ERANGE || tmp > UINT_MAX24)
|
int3store(ptr, store_tmp);
|
||||||
{
|
|
||||||
set_if_smaller(tmp, UINT_MAX24);
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
int3store(ptr,tmp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
|
|
||||||
if (tmp < INT_MIN24)
|
|
||||||
{
|
|
||||||
tmp= INT_MIN24;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (tmp > INT_MAX24)
|
|
||||||
{
|
|
||||||
tmp=INT_MAX24;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
int3store(ptr,tmp);
|
|
||||||
}
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3206,45 +3175,10 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||||||
{
|
{
|
||||||
long store_tmp;
|
long store_tmp;
|
||||||
int error;
|
int error;
|
||||||
char *end;
|
longlong rnd;
|
||||||
|
|
||||||
if (unsigned_flag)
|
error= get_int(cs, from, len, &rnd, UINT_MAX32, INT_MIN32, INT_MAX32);
|
||||||
{
|
store_tmp= unsigned_flag ? (long) (ulonglong) rnd : (long) rnd;
|
||||||
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
|
|
||||||
if (error == MY_ERRNO_ERANGE || tmp > (ulonglong) UINT_MAX32)
|
|
||||||
{
|
|
||||||
set_if_smaller(tmp, (ulonglong) UINT_MAX32);
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
store_tmp= (long) tmp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
|
|
||||||
if (tmp < INT_MIN32)
|
|
||||||
{
|
|
||||||
tmp= INT_MIN32;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (tmp > INT_MAX32)
|
|
||||||
{
|
|
||||||
tmp=INT_MAX32;
|
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
|
||||||
error= 1;
|
|
||||||
}
|
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
|
||||||
error= 1;
|
|
||||||
else
|
|
||||||
error= 0;
|
|
||||||
store_tmp= (long) tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
if (table->s->db_low_byte_first)
|
if (table->s->db_low_byte_first)
|
||||||
{
|
{
|
||||||
@ -3490,7 +3424,8 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
||||||
error= 1;
|
error= 1;
|
||||||
}
|
}
|
||||||
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
else if (table->in_use->count_cuted_fields &&
|
||||||
|
check_int(cs, from, len, end, error))
|
||||||
error= 1;
|
error= 1;
|
||||||
else
|
else
|
||||||
error= 0;
|
error= 0;
|
||||||
@ -5008,16 +4943,25 @@ int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
|
|||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
int error;
|
int error;
|
||||||
long nr= my_strntol(cs, from, len, 10, &end, &error);
|
longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
|
||||||
|
|
||||||
if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155 || error)
|
if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155 ||
|
||||||
|
error == MY_ERRNO_ERANGE)
|
||||||
{
|
{
|
||||||
*ptr=0;
|
*ptr=0;
|
||||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
|
if (table->in_use->count_cuted_fields &&
|
||||||
|
(error= check_int(cs, from, len, end, error)))
|
||||||
|
{
|
||||||
|
if (error == 1) /* empty or incorrect string */
|
||||||
|
{
|
||||||
|
*ptr= 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
error= 1;
|
error= 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (nr != 0 || len != 4)
|
if (nr != 0 || len != 4)
|
||||||
{
|
{
|
||||||
@ -5907,31 +5851,6 @@ report_data_too_long(Field_str *field)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Test if the given string contains important data:
|
|
||||||
not spaces for character string,
|
|
||||||
or any data for binary string.
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
test_if_important_data()
|
|
||||||
cs Character set
|
|
||||||
str String to test
|
|
||||||
strend String end
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
FALSE - If string does not have important data
|
|
||||||
TRUE - If string has some important data
|
|
||||||
*/
|
|
||||||
|
|
||||||
static bool
|
|
||||||
test_if_important_data(CHARSET_INFO *cs, const char *str, const char *strend)
|
|
||||||
{
|
|
||||||
if (cs != &my_charset_bin)
|
|
||||||
str+= cs->cset->scan(cs, str, strend, MY_SEQ_SPACES);
|
|
||||||
return (str < strend);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Copy a string and fill with space */
|
/* Copy a string and fill with space */
|
||||||
|
|
||||||
int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
|
int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
|
||||||
|
@ -306,8 +306,6 @@ public:
|
|||||||
virtual void set_derivation(enum Derivation derivation_arg) { }
|
virtual void set_derivation(enum Derivation derivation_arg) { }
|
||||||
bool set_warning(MYSQL_ERROR::enum_warning_level, unsigned int code,
|
bool set_warning(MYSQL_ERROR::enum_warning_level, unsigned int code,
|
||||||
int cuted_increment);
|
int cuted_increment);
|
||||||
bool check_int(const char *str, int length, const char *int_end,
|
|
||||||
CHARSET_INFO *cs);
|
|
||||||
void set_datetime_warning(MYSQL_ERROR::enum_warning_level, uint code,
|
void set_datetime_warning(MYSQL_ERROR::enum_warning_level, uint code,
|
||||||
const char *str, uint str_len,
|
const char *str, uint str_len,
|
||||||
timestamp_type ts_type, int cuted_increment);
|
timestamp_type ts_type, int cuted_increment);
|
||||||
@ -369,6 +367,11 @@ public:
|
|||||||
bool eq_def(Field *field);
|
bool eq_def(Field *field);
|
||||||
int store_decimal(const my_decimal *);
|
int store_decimal(const my_decimal *);
|
||||||
my_decimal *val_decimal(my_decimal *);
|
my_decimal *val_decimal(my_decimal *);
|
||||||
|
int check_int(CHARSET_INFO *cs, const char *str, int length,
|
||||||
|
const char *int_end, int error);
|
||||||
|
bool get_int(CHARSET_INFO *cs, const char *from, uint len,
|
||||||
|
longlong *rnd, ulonglong unsigned_max,
|
||||||
|
longlong signed_min, longlong signed_max);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
66
sql/log.cc
66
sql/log.cc
@ -2229,37 +2229,6 @@ static bool test_if_number(register const char *str,
|
|||||||
} /* test_if_number */
|
} /* test_if_number */
|
||||||
|
|
||||||
|
|
||||||
static void print_buffer_to_file(enum loglevel level, const char *buffer)
|
|
||||||
{
|
|
||||||
time_t skr;
|
|
||||||
struct tm tm_tmp;
|
|
||||||
struct tm *start;
|
|
||||||
DBUG_ENTER("print_buffer_to_file");
|
|
||||||
DBUG_PRINT("enter",("buffer: %s", buffer));
|
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_error_log));
|
|
||||||
|
|
||||||
skr=time(NULL);
|
|
||||||
localtime_r(&skr, &tm_tmp);
|
|
||||||
start=&tm_tmp;
|
|
||||||
fprintf(stderr, "%02d%02d%02d %2d:%02d:%02d [%s] %s\n",
|
|
||||||
start->tm_year % 100,
|
|
||||||
start->tm_mon+1,
|
|
||||||
start->tm_mday,
|
|
||||||
start->tm_hour,
|
|
||||||
start->tm_min,
|
|
||||||
start->tm_sec,
|
|
||||||
(level == ERROR_LEVEL ? "ERROR" : level == WARNING_LEVEL ?
|
|
||||||
"Warning" : "Note"),
|
|
||||||
buffer);
|
|
||||||
|
|
||||||
fflush(stderr);
|
|
||||||
|
|
||||||
VOID(pthread_mutex_unlock(&LOCK_error_log));
|
|
||||||
DBUG_VOID_RETURN;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void sql_perror(const char *message)
|
void sql_perror(const char *message)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_STRERROR
|
#ifdef HAVE_STRERROR
|
||||||
@ -2327,7 +2296,7 @@ void MYSQL_LOG::signal_update()
|
|||||||
|
|
||||||
#ifdef __NT__
|
#ifdef __NT__
|
||||||
static void print_buffer_to_nt_eventlog(enum loglevel level, char *buff,
|
static void print_buffer_to_nt_eventlog(enum loglevel level, char *buff,
|
||||||
uint length, int buffLen)
|
size_t length, size_t buffLen)
|
||||||
{
|
{
|
||||||
HANDLE event;
|
HANDLE event;
|
||||||
char *buffptr= buff;
|
char *buffptr= buff;
|
||||||
@ -2387,10 +2356,41 @@ void vprint_msg_to_log(enum loglevel level __attribute__((unused)),
|
|||||||
va_list argsi __attribute__((unused)))
|
va_list argsi __attribute__((unused)))
|
||||||
{}
|
{}
|
||||||
#else /*!EMBEDDED_LIBRARY*/
|
#else /*!EMBEDDED_LIBRARY*/
|
||||||
|
static void print_buffer_to_file(enum loglevel level, const char *buffer)
|
||||||
|
{
|
||||||
|
time_t skr;
|
||||||
|
struct tm tm_tmp;
|
||||||
|
struct tm *start;
|
||||||
|
DBUG_ENTER("print_buffer_to_file");
|
||||||
|
DBUG_PRINT("enter",("buffer: %s", buffer));
|
||||||
|
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_error_log));
|
||||||
|
|
||||||
|
skr=time(NULL);
|
||||||
|
localtime_r(&skr, &tm_tmp);
|
||||||
|
start=&tm_tmp;
|
||||||
|
fprintf(stderr, "%02d%02d%02d %2d:%02d:%02d [%s] %s\n",
|
||||||
|
start->tm_year % 100,
|
||||||
|
start->tm_mon+1,
|
||||||
|
start->tm_mday,
|
||||||
|
start->tm_hour,
|
||||||
|
start->tm_min,
|
||||||
|
start->tm_sec,
|
||||||
|
(level == ERROR_LEVEL ? "ERROR" : level == WARNING_LEVEL ?
|
||||||
|
"Warning" : "Note"),
|
||||||
|
buffer);
|
||||||
|
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_error_log));
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void vprint_msg_to_log(enum loglevel level, const char *format, va_list args)
|
void vprint_msg_to_log(enum loglevel level, const char *format, va_list args)
|
||||||
{
|
{
|
||||||
char buff[1024];
|
char buff[1024];
|
||||||
uint length;
|
size_t length;
|
||||||
DBUG_ENTER("vprint_msg_to_log");
|
DBUG_ENTER("vprint_msg_to_log");
|
||||||
|
|
||||||
length= my_vsnprintf(buff, sizeof(buff), format, args);
|
length= my_vsnprintf(buff, sizeof(buff), format, args);
|
||||||
|
@ -144,15 +144,46 @@ struct MBR
|
|||||||
return (xmin<x) && (xmax>x) && (ymin<y) && (ymax>y);
|
return (xmin<x) && (xmax>x) && (ymin<y) && (ymax>y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
The dimension maps to an integer as:
|
||||||
|
- Polygon -> 2
|
||||||
|
- Horizontal or vertical line -> 1
|
||||||
|
- Point -> 0
|
||||||
|
- Invalid MBR -> -1
|
||||||
|
*/
|
||||||
|
int dimension() const
|
||||||
|
{
|
||||||
|
int d= 0;
|
||||||
|
|
||||||
|
if (xmin > xmax)
|
||||||
|
return -1;
|
||||||
|
else if (xmin < xmax)
|
||||||
|
d++;
|
||||||
|
|
||||||
|
if (ymin > ymax)
|
||||||
|
return -1;
|
||||||
|
else if (ymin < ymax)
|
||||||
|
d++;
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
int overlaps(const MBR *mbr)
|
int overlaps(const MBR *mbr)
|
||||||
{
|
{
|
||||||
int lb= mbr->inner_point(xmin, ymin);
|
/*
|
||||||
int rb= mbr->inner_point(xmax, ymin);
|
overlaps() requires that some point inside *this is also inside
|
||||||
int rt= mbr->inner_point(xmax, ymax);
|
*mbr, and that both geometries and their intersection are of the
|
||||||
int lt= mbr->inner_point(xmin, ymax);
|
same dimension.
|
||||||
|
*/
|
||||||
|
int d = dimension();
|
||||||
|
|
||||||
int a = lb+rb+rt+lt;
|
if (d != mbr->dimension() || d <= 0 || contains(mbr) || within(mbr))
|
||||||
return (a>0) && (a<4) && (!within(mbr));
|
return 0;
|
||||||
|
|
||||||
|
MBR intersection(max(xmin, mbr->xmin), max(ymin, mbr->ymin),
|
||||||
|
min(xmax, mbr->xmax), min(ymax, mbr->ymax));
|
||||||
|
|
||||||
|
return (d == intersection.dimension());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user