summaryrefslogtreecommitdiff
path: root/sql/item_geofunc.cc
diff options
context:
space:
mode:
authorunknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru>2007-02-28 12:13:46 +0400
committerunknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru>2007-02-28 12:13:46 +0400
commit6842f6b12ab03b25b9fee9e0aa11ba6eccc98e1f (patch)
tree512ba10b1044d921271065de17ad13876346eb22 /sql/item_geofunc.cc
parent92584188d41b7c9b8f95d60eeb5c9fad07a2ea93 (diff)
parentcbb38476e19e8c5582d7d14ce98a8889132110d4 (diff)
downloadmariadb-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.cc29
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;
}