Bug#50574 5.5.x allows spatial indexes on non-spatial columns,
causing crashes! Adding a SPATIAL INDEX on a non-geometrical column caused a segmentation fault when the table was subsequently inserted into. A test was added in mysql_prepare_create_table to explicitly check whether non-geometrical columns are used in a spatial index, and throw an error if so.
This commit is contained in:
parent
b2ddac5563
commit
5f2c8caea9
@ -1058,3 +1058,33 @@ SELECT Polygon(12345123,'');
|
|||||||
Polygon(12345123,'')
|
Polygon(12345123,'')
|
||||||
NULL
|
NULL
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
CREATE TABLE t1(
|
||||||
|
col0 BINARY NOT NULL,
|
||||||
|
col2 TIMESTAMP,
|
||||||
|
SPATIAL INDEX i1 (col0)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
col0 BINARY NOT NULL,
|
||||||
|
col2 TIMESTAMP
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
CREATE SPATIAL INDEX idx0 ON t1(col0);
|
||||||
|
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||||
|
ALTER TABLE t1 ADD SPATIAL INDEX i1 (col0);
|
||||||
|
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
col0 INTEGER NOT NULL,
|
||||||
|
col1 POINT,
|
||||||
|
col2 POINT
|
||||||
|
);
|
||||||
|
CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
|
||||||
|
ERROR HY000: Incorrect arguments to SPATIAL INDEX
|
||||||
|
CREATE TABLE t3 (
|
||||||
|
col0 INTEGER NOT NULL,
|
||||||
|
col1 POINT,
|
||||||
|
col2 LINESTRING,
|
||||||
|
SPATIAL INDEX i1 (col1, col2)
|
||||||
|
);
|
||||||
|
ERROR HY000: Incorrect arguments to SPATIAL INDEX
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP TABLE t2;
|
||||||
|
@ -723,3 +723,48 @@ SELECT Polygon(1234512,'');
|
|||||||
SELECT Polygon(12345123,'');
|
SELECT Polygon(12345123,'');
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #50574 5.5.x allows spatial indexes on non-spatial
|
||||||
|
# columns, causing crashes!
|
||||||
|
#
|
||||||
|
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||||
|
CREATE TABLE t1(
|
||||||
|
col0 BINARY NOT NULL,
|
||||||
|
col2 TIMESTAMP,
|
||||||
|
SPATIAL INDEX i1 (col0)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
# Test other ways to add indices
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
col0 BINARY NOT NULL,
|
||||||
|
col2 TIMESTAMP
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||||
|
CREATE SPATIAL INDEX idx0 ON t1(col0);
|
||||||
|
|
||||||
|
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||||
|
ALTER TABLE t1 ADD SPATIAL INDEX i1 (col0);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
col0 INTEGER NOT NULL,
|
||||||
|
col1 POINT,
|
||||||
|
col2 POINT
|
||||||
|
);
|
||||||
|
|
||||||
|
--error ER_WRONG_ARGUMENTS
|
||||||
|
CREATE SPATIAL INDEX idx0 ON t2 (col1, col2);
|
||||||
|
|
||||||
|
--error ER_WRONG_ARGUMENTS
|
||||||
|
CREATE TABLE t3 (
|
||||||
|
col0 INTEGER NOT NULL,
|
||||||
|
col1 POINT,
|
||||||
|
col2 LINESTRING,
|
||||||
|
SPATIAL INDEX i1 (col1, col2)
|
||||||
|
);
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
@ -6260,3 +6260,5 @@ ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD
|
|||||||
eng "Field '%-.192s' is of a not allowed type for this type of partitioning"
|
eng "Field '%-.192s' is of a not allowed type for this type of partitioning"
|
||||||
ER_PARTITION_FIELDS_TOO_LONG
|
ER_PARTITION_FIELDS_TOO_LONG
|
||||||
eng "The total length of the partitioning fields is too large"
|
eng "The total length of the partitioning fields is too large"
|
||||||
|
ER_SPATIAL_MUST_HAVE_GEOM_COL 42000
|
||||||
|
eng "A SPATIAL index may only contain a geometrical type column"
|
||||||
|
@ -3193,11 +3193,19 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
{
|
{
|
||||||
column->length*= sql_field->charset->mbmaxlen;
|
column->length*= sql_field->charset->mbmaxlen;
|
||||||
|
|
||||||
if (key->type == Key::SPATIAL && column->length)
|
if (key->type == Key::SPATIAL)
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_SUB_KEY, MYF(0));
|
if (column->length)
|
||||||
DBUG_RETURN(TRUE);
|
{
|
||||||
}
|
my_error(ER_WRONG_SUB_KEY, MYF(0));
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
|
if (!f_is_geom(sql_field->pack_flag))
|
||||||
|
{
|
||||||
|
my_error(ER_SPATIAL_MUST_HAVE_GEOM_COL, MYF(0));
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (f_is_blob(sql_field->pack_flag) ||
|
if (f_is_blob(sql_field->pack_flag) ||
|
||||||
(f_is_geom(sql_field->pack_flag) && key->type != Key::SPATIAL))
|
(f_is_geom(sql_field->pack_flag) && key->type != Key::SPATIAL))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user