diff options
author | unknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru> | 2007-02-28 12:13:46 +0400 |
---|---|---|
committer | unknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru> | 2007-02-28 12:13:46 +0400 |
commit | 6842f6b12ab03b25b9fee9e0aa11ba6eccc98e1f (patch) | |
tree | 512ba10b1044d921271065de17ad13876346eb22 /sql/item_geofunc.cc | |
parent | 92584188d41b7c9b8f95d60eeb5c9fad07a2ea93 (diff) | |
parent | cbb38476e19e8c5582d7d14ce98a8889132110d4 (diff) | |
download | mariadb-git-6842f6b12ab03b25b9fee9e0aa11ba6eccc98e1f.tar.gz |
Merge mysql.com:/home/ram/work/b26038/b26038.4.1
into mysql.com:/home/ram/work/b26038/b26038.5.0
sql/item_geofunc.cc:
Auto merged
sql/spatial.cc:
Auto merged
sql/spatial.h:
Auto merged
mysql-test/r/gis.result:
will be fixed after the merging.
mysql-test/t/gis.test:
merging, the result will be fixed in an after-merge fix CS
sql/item_geofunc.h:
merging
Diffstat (limited to 'sql/item_geofunc.cc')
-rw-r--r-- | sql/item_geofunc.cc | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 676b3bc9b36..955ba0ef67a 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -35,6 +35,7 @@ void Item_geometry_func::fix_length_and_dec() collation.set(&my_charset_bin); decimals=0; max_length=MAX_BLOB_WIDTH; + maybe_null= 1; } int Item_geometry_func::get_geometry_type() const @@ -121,6 +122,7 @@ String *Item_func_as_wkt::val_str(String *str) void Item_func_as_wkt::fix_length_and_dec() { max_length=MAX_BLOB_WIDTH; + maybe_null= 1; } @@ -386,7 +388,8 @@ String *Item_func_spatial_collection::val_str(String *str) for (i= 0; i < arg_count; ++i) { String *res= args[i]->val_str(&arg_value); - if (args[i]->null_value) + uint32 len; + if (args[i]->null_value || ((len= res->length()) < WKB_HEADER_SIZE)) goto err; if (coll_type == Geometry::wkb_geometrycollection) @@ -395,13 +398,12 @@ String *Item_func_spatial_collection::val_str(String *str) In the case of GeometryCollection we don't need any checkings for item types, so just copy them into target collection */ - if (str->append(res->ptr(), res->length(), (uint32) 512)) + if (str->append(res->ptr(), len, (uint32) 512)) goto err; } else { enum Geometry::wkbType wkb_type; - uint32 len=res->length(); const char *data= res->ptr() + 1; /* @@ -409,8 +411,6 @@ String *Item_func_spatial_collection::val_str(String *str) are of specific type, let's do this checking now */ - if (len < 5) - goto err; wkb_type= (Geometry::wkbType) uint4korr(data); data+= 4; len-= 5; @@ -532,9 +532,13 @@ longlong Item_func_spatial_rel::val_int() longlong Item_func_isempty::val_int() { DBUG_ASSERT(fixed == 1); - String tmp; - null_value=0; - return args[0]->null_value ? 1 : 0; + String tmp; + String *swkb= args[0]->val_str(&tmp); + Geometry_buffer buffer; + + null_value= args[0]->null_value || + !(Geometry::construct(&buffer, swkb->ptr(), swkb->length())); + return null_value ? 1 : 0; } @@ -542,10 +546,11 @@ longlong Item_func_issimple::val_int() { DBUG_ASSERT(fixed == 1); String tmp; - String *wkb=args[0]->val_str(&tmp); - - if ((null_value= (!wkb || args[0]->null_value))) - return 0; + String *swkb= args[0]->val_str(&tmp); + Geometry_buffer buffer; + + null_value= args[0]->null_value || + !(Geometry::construct(&buffer, swkb->ptr(), swkb->length())); /* TODO: Ramil or Holyfoot, add real IsSimple calculation */ return 0; } |