Commit ca294901 authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-3819 missing constraints for spatial column types.

    Checks added to return and error when inappropriate
    geometry type is stored in a field.
parent 2c37ace1
...@@ -758,7 +758,7 @@ SPATIAL KEY(g) ...@@ -758,7 +758,7 @@ SPATIAL KEY(g)
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 2, 2 3)')),(GeomFromText('LineString(1 2, 2 4)')); INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 2, 2 3)')),(GeomFromText('LineString(1 2, 2 4)'));
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
line LINESTRING NOT NULL, line GEOMETRY NOT NULL,
kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po', kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po',
name VARCHAR(32), name VARCHAR(32),
SPATIAL KEY (line) SPATIAL KEY (line)
...@@ -1553,7 +1553,7 @@ End of 5.0 tests. ...@@ -1553,7 +1553,7 @@ End of 5.0 tests.
# Bug #57323/11764487: myisam corruption with insert ignore # Bug #57323/11764487: myisam corruption with insert ignore
# and invalid spatial data # and invalid spatial data
# #
CREATE TABLE t1(a LINESTRING NOT NULL, b GEOMETRY NOT NULL, CREATE TABLE t1(a POINT NOT NULL, b GEOMETRY NOT NULL,
SPATIAL KEY(a), SPATIAL KEY(b)) ENGINE=MyISAM; SPATIAL KEY(a), SPATIAL KEY(b)) ENGINE=MyISAM;
INSERT INTO t1 VALUES(GEOMFROMTEXT("point (0 0)"), GEOMFROMTEXT("point (1 1)")); INSERT INTO t1 VALUES(GEOMFROMTEXT("point (0 0)"), GEOMFROMTEXT("point (1 1)"));
INSERT IGNORE INTO t1 SET a=GEOMFROMTEXT("point (-6 0)"), b=GEOMFROMTEXT("error"); INSERT IGNORE INTO t1 SET a=GEOMFROMTEXT("point (-6 0)"), b=GEOMFROMTEXT("error");
......
...@@ -1047,7 +1047,7 @@ SET @a=0x00000000030000000100000000000000000000000000144000000000000014400000000 ...@@ -1047,7 +1047,7 @@ SET @a=0x00000000030000000100000000000000000000000000144000000000000014400000000
SET @a=POLYFROMWKB(@a); SET @a=POLYFROMWKB(@a);
SET @a=0x00000000030000000000000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440; SET @a=0x00000000030000000000000000000000000000000000144000000000000014400000000000001840000000000000184000000000000014400000000000001440;
SET @a=POLYFROMWKB(@a); SET @a=POLYFROMWKB(@a);
create table t1(a polygon NOT NULL)engine=myisam; create table t1(a geometry NOT NULL)engine=myisam;
insert into t1 values (geomfromtext("point(0 1)")); insert into t1 values (geomfromtext("point(0 1)"));
insert into t1 values (geomfromtext("point(1 0)")); insert into t1 values (geomfromtext("point(1 0)"));
select * from (select polygon(t1.a) as p from t1 order by t1.a) d; select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
...@@ -1491,4 +1491,11 @@ SELECT 1 FROM g1 WHERE a >= ANY ...@@ -1491,4 +1491,11 @@ SELECT 1 FROM g1 WHERE a >= ANY
(SELECT 1 FROM g1 WHERE a = geomfromtext('') OR a) ; (SELECT 1 FROM g1 WHERE a = geomfromtext('') OR a) ;
1 1
DROP TABLE g1; DROP TABLE g1;
#
# MDEV-3819 missing constraints for spatial column types
#
create table t1 (pt point);
insert into t1 values(Geomfromtext('POLYGON((1 1, 2 2, 2 1, 1 1))'));
ERROR 22007: Incorrect POINT value: 'POLYGON' for column 'pt' at row 1
drop table t1;
End of 5.5 tests End of 5.5 tests
...@@ -120,7 +120,7 @@ INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 2, 2 3)')),(GeomFromText(' ...@@ -120,7 +120,7 @@ INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 2, 2 3)')),(GeomFromText('
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
line LINESTRING NOT NULL, line GEOMETRY NOT NULL,
kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po', kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po',
name VARCHAR(32), name VARCHAR(32),
...@@ -935,7 +935,7 @@ DROP TABLE t1; ...@@ -935,7 +935,7 @@ DROP TABLE t1;
--echo # and invalid spatial data --echo # and invalid spatial data
--echo # --echo #
CREATE TABLE t1(a LINESTRING NOT NULL, b GEOMETRY NOT NULL, CREATE TABLE t1(a POINT NOT NULL, b GEOMETRY NOT NULL,
SPATIAL KEY(a), SPATIAL KEY(b)) ENGINE=MyISAM; SPATIAL KEY(a), SPATIAL KEY(b)) ENGINE=MyISAM;
INSERT INTO t1 VALUES(GEOMFROMTEXT("point (0 0)"), GEOMFROMTEXT("point (1 1)")); INSERT INTO t1 VALUES(GEOMFROMTEXT("point (0 0)"), GEOMFROMTEXT("point (1 1)"));
--error ER_CANT_CREATE_GEOMETRY_OBJECT --error ER_CANT_CREATE_GEOMETRY_OBJECT
......
...@@ -741,7 +741,7 @@ SET @a=POLYFROMWKB(@a); ...@@ -741,7 +741,7 @@ SET @a=POLYFROMWKB(@a);
# Bug #57321 crashes and valgrind errors from spatial types # Bug #57321 crashes and valgrind errors from spatial types
# #
create table t1(a polygon NOT NULL)engine=myisam; create table t1(a geometry NOT NULL)engine=myisam;
insert into t1 values (geomfromtext("point(0 1)")); insert into t1 values (geomfromtext("point(0 1)"));
insert into t1 values (geomfromtext("point(1 0)")); insert into t1 values (geomfromtext("point(1 0)"));
select * from (select polygon(t1.a) as p from t1 order by t1.a) d; select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
...@@ -1358,4 +1358,13 @@ SELECT 1 FROM g1 WHERE a >= ANY ...@@ -1358,4 +1358,13 @@ SELECT 1 FROM g1 WHERE a >= ANY
DROP TABLE g1; DROP TABLE g1;
--echo #
--echo # MDEV-3819 missing constraints for spatial column types
--echo #
create table t1 (pt point);
--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
insert into t1 values(Geomfromtext('POLYGON((1 1, 2 2, 2 1, 1 1))'));
drop table t1;
--echo End of 5.5 tests --echo End of 5.5 tests
...@@ -7580,6 +7580,19 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) ...@@ -7580,6 +7580,19 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
if (wkb_type < (uint32) Geometry::wkb_point || if (wkb_type < (uint32) Geometry::wkb_point ||
wkb_type > (uint32) Geometry::wkb_last) wkb_type > (uint32) Geometry::wkb_last)
goto err; goto err;
if (geom_type != Field::GEOM_GEOMETRY &&
geom_type != Field::GEOM_GEOMETRYCOLLECTION &&
(uint32) geom_type != wkb_type)
{
my_printf_error(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD), MYF(0),
Geometry::ci_collection[geom_type]->m_name.str,
Geometry::ci_collection[wkb_type]->m_name.str, field_name,
(ulong) table->in_use->warning_info->current_row_for_warning());
goto err_exit;
}
Field_blob::store_length(length); Field_blob::store_length(length);
if (table->copy_blobs || length <= MAX_FIELD_WIDTH) if (table->copy_blobs || length <= MAX_FIELD_WIDTH)
{ // Must make a copy { // Must make a copy
...@@ -7591,9 +7604,10 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) ...@@ -7591,9 +7604,10 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
return 0; return 0;
err: err:
bzero(ptr, Field_blob::pack_length());
my_message(ER_CANT_CREATE_GEOMETRY_OBJECT, my_message(ER_CANT_CREATE_GEOMETRY_OBJECT,
ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0)); ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0));
err_exit:
bzero(ptr, Field_blob::pack_length());
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment