diff options
-rw-r--r-- | mysql-test/r/gis-rtree.result | 2 | ||||
-rw-r--r-- | mysql-test/r/gis.result | 14 | ||||
-rw-r--r-- | mysql-test/t/gis-rtree.test | 2 | ||||
-rw-r--r-- | mysql-test/t/gis.test | 16 | ||||
-rw-r--r-- | sql/field.cc | 30 | ||||
-rw-r--r-- | sql/field.h | 6 | ||||
-rw-r--r-- | sql/item_geofunc.cc | 7 | ||||
-rw-r--r-- | sql/share/errmsg.txt | 2 | ||||
-rw-r--r-- | sql/spatial.cc | 2 | ||||
-rw-r--r-- | sql/spatial.h | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 5 |
11 files changed, 72 insertions, 16 deletions
diff --git a/mysql-test/r/gis-rtree.result b/mysql-test/r/gis-rtree.result index 0e558e47594..73cde35993e 100644 --- a/mysql-test/r/gis-rtree.result +++ b/mysql-test/r/gis-rtree.result @@ -801,5 +801,5 @@ CREATE TABLE t1 (st varchar(100)); INSERT INTO t1 VALUES ("Fake string"); CREATE TABLE t2 (geom GEOMETRY NOT NULL, SPATIAL KEY gk(geom)); INSERT INTO t2 SELECT GeomFromText(st) FROM t1; -ERROR HY000: Unknown error +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field drop table t1, t2; diff --git a/mysql-test/r/gis.result b/mysql-test/r/gis.result index 3b196a60d68..93216fe2003 100644 --- a/mysql-test/r/gis.result +++ b/mysql-test/r/gis.result @@ -461,9 +461,9 @@ Note 1003 select issimple(multipoint(point(3,6),point(4,10))) AS `issimple(Multi create table t1 (a geometry not null); insert into t1 values (GeomFromText('Point(1 2)')); insert into t1 values ('Garbage'); -ERROR HY000: Unknown error +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field insert IGNORE into t1 values ('Garbage'); -ERROR HY000: Unknown error +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field alter table t1 add spatial index(a); drop table t1; create table t1(a geometry not null, spatial index(a)); @@ -655,3 +655,13 @@ t1 where object_id=85984; object_id geometrytype(geo) ISSIMPLE(GEO) ASTEXT(centroid(geo)) 85984 MULTIPOLYGON 0 POINT(-114.87787186923 36.33101763469) drop table t1; +create table t1 (fl geometry); +insert into t1 values (1); +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field +insert into t1 values (1.11); +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field +insert into t1 values ("qwerty"); +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field +insert into t1 values (pointfromtext('point(1,1)')); +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field +drop table t1; diff --git a/mysql-test/t/gis-rtree.test b/mysql-test/t/gis-rtree.test index da59c6ae5e4..522f7a6f637 100644 --- a/mysql-test/t/gis-rtree.test +++ b/mysql-test/t/gis-rtree.test @@ -168,6 +168,6 @@ drop table t1; CREATE TABLE t1 (st varchar(100)); INSERT INTO t1 VALUES ("Fake string"); CREATE TABLE t2 (geom GEOMETRY NOT NULL, SPATIAL KEY gk(geom)); ---error 1105 +--error 1416 INSERT INTO t2 SELECT GeomFromText(st) FROM t1; drop table t1, t2; diff --git a/mysql-test/t/gis.test b/mysql-test/t/gis.test index 86c34eacbc5..b7071019e9d 100644 --- a/mysql-test/t/gis.test +++ b/mysql-test/t/gis.test @@ -165,9 +165,9 @@ explain extended select issimple(MultiPoint(Point(3, 6), Point(4, 10))), issimpl create table t1 (a geometry not null); insert into t1 values (GeomFromText('Point(1 2)')); --- error 1105 +-- error 1416 insert into t1 values ('Garbage'); --- error 1105 +-- error 1416 insert IGNORE into t1 values ('Garbage'); alter table t1 add spatial index(a); @@ -359,3 +359,15 @@ select object_id, geometrytype(geo), ISSIMPLE(GEO), ASTEXT(centroid(geo)) from t1 where object_id=85984; drop table t1; + +create table t1 (fl geometry); +--error 1416 +insert into t1 values (1); +--error 1416 +insert into t1 values (1.11); +--error 1416 +insert into t1 values ("qwerty"); +--error 1416 +insert into t1 values (pointfromtext('point(1,1)')); + +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index 00f729d5b07..c59d9b63fca 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7267,12 +7267,38 @@ void Field_geom::sql_type(String &res) const } +int Field_geom::store(double nr) +{ + my_message(ER_CANT_CREATE_GEOMETRY_OBJECT, + ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0)); + return -1; +} + + +int Field_geom::store(longlong nr) +{ + my_message(ER_CANT_CREATE_GEOMETRY_OBJECT, + ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0)); + return -1; +} + + +int Field_geom::store_decimal(const my_decimal *) +{ + my_message(ER_CANT_CREATE_GEOMETRY_OBJECT, + ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0)); + return -1; +} + + int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) { if (!length) bzero(ptr, Field_blob::pack_length()); else { + if (from == Geometry::bad_geometry_data.ptr()) + goto err; // Check given WKB uint32 wkb_type; if (length < SRID_SIZE + WKB_HEADER_SIZE + SIZEOF_STORED_DOUBLE*2) @@ -7280,7 +7306,7 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) wkb_type= uint4korr(from + WKB_HEADER_SIZE); if (wkb_type < (uint32) Geometry::wkb_point || wkb_type > (uint32) Geometry::wkb_end) - return -1; + goto err; Field_blob::store_length(length); if (table->copy_blobs || length <= MAX_FIELD_WIDTH) { // Must make a copy @@ -7293,6 +7319,8 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) err: bzero(ptr, Field_blob::pack_length()); + my_message(ER_CANT_CREATE_GEOMETRY_OBJECT, + ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0)); return -1; } diff --git a/sql/field.h b/sql/field.h index 22787850442..0f1cc0b95aa 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1189,9 +1189,9 @@ public: enum_field_types type() const { return FIELD_TYPE_GEOMETRY; } void sql_type(String &str) const; int store(const char *to, uint length, CHARSET_INFO *charset); - int store(double nr) { return 1; } - int store(longlong nr) { return 1; } - int store_decimal(const my_decimal *) { return 1; } + int store(double nr); + int store(longlong nr); + int store_decimal(const my_decimal *); void get_key_image(char *buff,uint length,imagetype type); }; #endif /*HAVE_SPATIAL*/ diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 1a8cb50081b..b9f2ec8a6ca 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -55,8 +55,11 @@ String *Item_func_geometry_from_text::val_str(String *str) return 0; str->length(0); str->q_append(srid); - if ((null_value= !Geometry::create_from_wkt(&buffer, &trs, str, 0))) - return 0; + if (!Geometry::create_from_wkt(&buffer, &trs, str, 0)) + /* We shouldn't return NULL here as NULL is a legal spatial object */ + /* Geometry::bad_spatial_data will produce error message beeing stored*/ + /* in GEOMETRY field */ + return &Geometry::bad_geometry_data; return str; } diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 3a311ff7917..050bbe86948 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5344,3 +5344,5 @@ ER_SP_NOT_VAR_ARG 42000 eng "OUT or INOUT argument %d for routine %s is not a variable" ER_SP_NO_RETSET_IN_FUNC 0A000 eng "Not allowed to return a result set from a function" +ER_CANT_CREATE_GEOMETRY_OBJECT 22003 + eng "Cannot get geometry object from data you send to the GEOMETRY field" diff --git a/sql/spatial.cc b/sql/spatial.cc index bcfefd9dde8..427648850e4 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -22,6 +22,8 @@ /***************************** Gis_class_info *******************************/ +String Geometry::bad_geometry_data("Bad object", &my_charset_bin); + Geometry::Class_info *Geometry::ci_collection[Geometry::wkb_end+1]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL diff --git a/sql/spatial.h b/sql/spatial.h index b96434831a1..438ec171a72 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -173,6 +173,8 @@ public: static void operator delete(void *ptr, void *buffer) {} + static String bad_geometry_data; + enum wkbType { wkb_point= 1, diff --git a/sql/sql_base.cc b/sql/sql_base.cc index d79811aa4e2..ade1fb96b96 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -3858,11 +3858,8 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors) TABLE *table= field->table; if (field == table->next_number_field) table->auto_increment_field_not_null= TRUE; - if ((value->save_in_field(field, 0) < 0) && !ignore_errors) - { - my_message(ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR), MYF(0)); + if (value->save_in_field(field, 0) == -1) DBUG_RETURN(TRUE); - } } DBUG_RETURN(thd->net.report_error); } |