Commit 6e10a204 authored by unknown's avatar unknown

Bug #26794: 5.1 part

 It was syntactically correct to define 
 spatial keys over parts of columns (e.g.
 ALTER TABLE t1 ADD x GEOMETRY NOT NULL, 
   ADD SPATIAL KEY (x(32))).
 This may lead to undefined results and/or
 interpretation.
 Fixed by not allowing partial column 
 specification in a SPATIAL index definition.


mysql-test/r/alter_table.result:
  Bug #26794: 5.1 part
   test case
mysql-test/r/gis-rtree.result:
  Bug #26794: 5.1 part
   updated the tests to the new syntax
mysql-test/t/alter_table.test:
  Bug #26794: 5.1 part
   test case
mysql-test/t/gis-rtree.test:
  Bug #26794: 5.1 part
   updated the tests to the new syntax
sql/sql_table.cc:
  Bug #26794: 5.1 part
   Disable defining SPATIAL KEYS with sub-key parts
parent d9210613
...@@ -886,7 +886,7 @@ ALTER TABLE t1 ADD b GEOMETRY NOT NULL, ADD SPATIAL INDEX(b); ...@@ -886,7 +886,7 @@ ALTER TABLE t1 ADD b GEOMETRY NOT NULL, ADD SPATIAL INDEX(b);
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` varchar(500) default NULL, `a` varchar(500) DEFAULT NULL,
`b` geometry NOT NULL, `b` geometry NOT NULL,
SPATIAL KEY `b` (`b`) SPATIAL KEY `b` (`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
...@@ -894,7 +894,7 @@ ALTER TABLE t1 ADD KEY(b(50)); ...@@ -894,7 +894,7 @@ ALTER TABLE t1 ADD KEY(b(50));
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` varchar(500) default NULL, `a` varchar(500) DEFAULT NULL,
`b` geometry NOT NULL, `b` geometry NOT NULL,
SPATIAL KEY `b` (`b`), SPATIAL KEY `b` (`b`),
KEY `b_2` (`b`(50)) KEY `b_2` (`b`(50))
...@@ -903,9 +903,9 @@ ALTER TABLE t1 ADD c POINT; ...@@ -903,9 +903,9 @@ ALTER TABLE t1 ADD c POINT;
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` varchar(500) default NULL, `a` varchar(500) DEFAULT NULL,
`b` geometry NOT NULL, `b` geometry NOT NULL,
`c` point default NULL, `c` point DEFAULT NULL,
SPATIAL KEY `b` (`b`), SPATIAL KEY `b` (`b`),
KEY `b_2` (`b`(50)) KEY `b_2` (`b`(50))
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
...@@ -914,6 +914,8 @@ ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used ...@@ -914,6 +914,8 @@ ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used
ALTER TABLE t1 ADD d INT; ALTER TABLE t1 ADD d INT;
ALTER TABLE t1 ADD KEY (d(20)); ALTER TABLE t1 ADD KEY (d(20));
ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys
ALTER TABLE t1 ADD e GEOMETRY NOT NULL, ADD SPATIAL KEY (e(30));
ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (s CHAR(8) BINARY); CREATE TABLE t1 (s CHAR(8) BINARY);
INSERT INTO t1 VALUES ('test'); INSERT INTO t1 VALUES ('test');
......
...@@ -803,7 +803,7 @@ CREATE TABLE t2 (geom GEOMETRY NOT NULL, SPATIAL KEY gk(geom)); ...@@ -803,7 +803,7 @@ CREATE TABLE t2 (geom GEOMETRY NOT NULL, SPATIAL KEY gk(geom));
INSERT INTO t2 SELECT GeomFromText(st) FROM t1; INSERT INTO t2 SELECT GeomFromText(st) FROM t1;
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, t2; drop table t1, t2;
CREATE TABLE t1 (`geometry` geometry NOT NULL default '',SPATIAL KEY `gndx` (`geometry`(32))) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE t1 (`geometry` geometry NOT NULL default '',SPATIAL KEY `gndx` (`geometry`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Warnings: Warnings:
Warning 1101 BLOB/TEXT column 'geometry' can't have a default value Warning 1101 BLOB/TEXT column 'geometry' can't have a default value
INSERT INTO t1 (geometry) VALUES INSERT INTO t1 (geometry) VALUES
...@@ -820,7 +820,7 @@ test.t1 check status OK ...@@ -820,7 +820,7 @@ test.t1 check status OK
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
c1 geometry NOT NULL default '', c1 geometry NOT NULL default '',
SPATIAL KEY i1 (c1(32)) SPATIAL KEY i1 (c1)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Warnings: Warnings:
Warning 1101 BLOB/TEXT column 'c1' can't have a default value Warning 1101 BLOB/TEXT column 'c1' can't have a default value
...@@ -836,7 +836,7 @@ test.t1 check status OK ...@@ -836,7 +836,7 @@ test.t1 check status OK
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
c1 geometry NOT NULL default '', c1 geometry NOT NULL default '',
SPATIAL KEY i1 (c1(32)) SPATIAL KEY i1 (c1)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Warnings: Warnings:
Warning 1101 BLOB/TEXT column 'c1' can't have a default value Warning 1101 BLOB/TEXT column 'c1' can't have a default value
......
...@@ -662,6 +662,10 @@ ALTER TABLE t1 ADD d INT; ...@@ -662,6 +662,10 @@ ALTER TABLE t1 ADD d INT;
--error ER_WRONG_SUB_KEY --error ER_WRONG_SUB_KEY
ALTER TABLE t1 ADD KEY (d(20)); ALTER TABLE t1 ADD KEY (d(20));
# the 5.1 part of the test
--error ER_WRONG_SUB_KEY
ALTER TABLE t1 ADD e GEOMETRY NOT NULL, ADD SPATIAL KEY (e(30));
DROP TABLE t1; DROP TABLE t1;
# #
......
...@@ -172,7 +172,7 @@ CREATE TABLE t2 (geom GEOMETRY NOT NULL, SPATIAL KEY gk(geom)); ...@@ -172,7 +172,7 @@ CREATE TABLE t2 (geom GEOMETRY NOT NULL, SPATIAL KEY gk(geom));
INSERT INTO t2 SELECT GeomFromText(st) FROM t1; INSERT INTO t2 SELECT GeomFromText(st) FROM t1;
drop table t1, t2; drop table t1, t2;
CREATE TABLE t1 (`geometry` geometry NOT NULL default '',SPATIAL KEY `gndx` (`geometry`(32))) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE t1 (`geometry` geometry NOT NULL default '',SPATIAL KEY `gndx` (`geometry`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO t1 (geometry) VALUES INSERT INTO t1 (geometry) VALUES
(PolygonFromText('POLYGON((-18.6086111000 -66.9327777000, -18.6055555000 (PolygonFromText('POLYGON((-18.6086111000 -66.9327777000, -18.6055555000
...@@ -192,7 +192,7 @@ drop table t1; ...@@ -192,7 +192,7 @@ drop table t1;
# #
CREATE TABLE t1 ( CREATE TABLE t1 (
c1 geometry NOT NULL default '', c1 geometry NOT NULL default '',
SPATIAL KEY i1 (c1(32)) SPATIAL KEY i1 (c1)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO t1 (c1) VALUES ( INSERT INTO t1 (c1) VALUES (
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000, PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
...@@ -206,7 +206,7 @@ DROP TABLE t1; ...@@ -206,7 +206,7 @@ DROP TABLE t1;
# #
CREATE TABLE t1 ( CREATE TABLE t1 (
c1 geometry NOT NULL default '', c1 geometry NOT NULL default '',
SPATIAL KEY i1 (c1(32)) SPATIAL KEY i1 (c1)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO t1 (c1) VALUES ( INSERT INTO t1 (c1) VALUES (
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000, PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
......
...@@ -2791,6 +2791,12 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2791,6 +2791,12 @@ static int mysql_prepare_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)
{
my_error(ER_WRONG_SUB_KEY, MYF(0));
DBUG_RETURN(-1);
}
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))
{ {
...@@ -5861,6 +5867,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -5861,6 +5867,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
if (!Field::type_can_have_key_part(cfield->field->type()) || if (!Field::type_can_have_key_part(cfield->field->type()) ||
(!Field::type_can_have_key_part(cfield->sql_type) && (!Field::type_can_have_key_part(cfield->sql_type) &&
!f_is_geom (cfield->pack_flag)) || !f_is_geom (cfield->pack_flag)) ||
/* spatial keys can't have sub-key length */
(key_info->flags & HA_SPATIAL) ||
(cfield->field->field_length == key_part_length && (cfield->field->field_length == key_part_length &&
!f_is_blob(key_part->key_type)) || !f_is_blob(key_part->key_type)) ||
(cfield->length && (cfield->length < key_part_length / (cfield->length && (cfield->length < key_part_length /
......
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