mirror of
https://github.com/MariaDB/server.git
synced 2026-04-20 07:15:33 +02:00
MDEV-3819 missing constraints for spatial column types.
Checks added to return and error when inappropriate
geometry type is stored in a field.
This commit is contained in:
parent
2c37ace131
commit
ca29490102
5 changed files with 37 additions and 7 deletions
|
|
@ -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.
|
||||||
# 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
|
||||||
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
|
||||||
(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('
|
||||||
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;
|
||||||
--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);
|
||||||
# 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
|
||||||
|
|
||||||
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
|
||||||
|
|
|
||||||
16
sql/field.cc
16
sql/field.cc
|
|
@ -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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue