summaryrefslogtreecommitdiff
path: root/sql/item_geofunc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/item_geofunc.cc')
-rw-r--r--sql/item_geofunc.cc226
1 files changed, 114 insertions, 112 deletions
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index 6934ad9d3b0..cbf286a2101 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -27,18 +27,17 @@
#include "sql_acl.h"
#include <m_ctype.h>
+
String *Item_func_geometry_from_text::val_str(String *str)
{
Geometry geom;
String arg_val;
String *wkt= args[0]->val_str(&arg_val);
- GTextReadStream trs(wkt->ptr(), wkt->length());
- uint32 srid;
+ Gis_read_stream trs(wkt->c_ptr(), wkt->length());
+ uint32 srid= 0;
if ((arg_count == 2) && !args[1]->null_value)
srid= (uint32)args[1]->val_int();
- else
- srid= 0;
if (str->reserve(SRID_SIZE, 512))
return 0;
@@ -61,22 +60,19 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
String arg_val;
String *wkb= args[0]->val_str(&arg_val);
Geometry geom;
- uint32 srid;
+ uint32 srid= 0;
if ((arg_count == 2) && !args[1]->null_value)
srid= (uint32)args[1]->val_int();
- else
- srid= 0;
if (str->reserve(SRID_SIZE, 512))
return 0;
str->length(0);
str->q_append(srid);
if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(wkb->ptr(), wkb->length()))))
+ geom.create_from_wkb(wkb->ptr(), wkb->length()))) ||
+ str->append(*wkb))
return 0;
-
- str->append(*wkb);
return str;
}
@@ -92,6 +88,7 @@ String *Item_func_as_wkt::val_str(String *str)
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
Geometry geom;
+ const char *dummy;
if ((null_value= (args[0]->null_value ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
@@ -99,18 +96,19 @@ String *Item_func_as_wkt::val_str(String *str)
return 0;
str->length(0);
-
- if ((null_value= geom.as_wkt(str)))
+ if ((null_value= geom.as_wkt(str, &dummy)))
return 0;
return str;
}
+
void Item_func_as_wkt::fix_length_and_dec()
{
max_length=MAX_BLOB_WIDTH;
}
+
String *Item_func_as_wkb::val_str(String *str)
{
String arg_val;
@@ -127,11 +125,13 @@ String *Item_func_as_wkb::val_str(String *str)
return str;
}
+
void Item_func_as_wkb::fix_length_and_dec()
{
max_length= MAX_BLOB_WIDTH;
}
+
String *Item_func_geometry_type::val_str(String *str)
{
String *swkb= args[0]->val_str(str);
@@ -141,9 +141,10 @@ String *Item_func_geometry_type::val_str(String *str)
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE))))
return 0;
- str->copy(geom.get_class_info()->m_name,
- strlen(geom.get_class_info()->m_name),
- default_charset());
+ /* String will not move */
+ str->set(geom.get_class_info()->m_name.str,
+ geom.get_class_info()->m_name.length,
+ default_charset());
return str;
}
@@ -153,13 +154,14 @@ String *Item_func_envelope::val_str(String *str)
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
Geometry geom;
+ uint32 srid;
if ((null_value= args[0]->null_value ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE)))
return 0;
- uint32 srid= uint4korr(swkb->ptr());
+ srid= uint4korr(swkb->ptr());
str->length(0);
if (str->reserve(SRID_SIZE, 512))
return 0;
@@ -173,20 +175,21 @@ String *Item_func_centroid::val_str(String *str)
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
Geometry geom;
+ uint32 srid;
if ((null_value= args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, centroid)))
+ geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE) ||
+ !GEOM_METHOD_PRESENT(geom, centroid)))
return 0;
if (str->reserve(SRID_SIZE, 512))
return 0;
str->length(0);
- uint32 srid= uint4korr(swkb->ptr());
+ srid= uint4korr(swkb->ptr());
str->q_append(srid);
- return (null_value= geom.centroid(str)) ? 0 : str;
+ return (null_value= test(geom.centroid(str))) ? 0 : str;
}
@@ -199,42 +202,42 @@ String *Item_func_spatial_decomp::val_str(String *str)
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
Geometry geom;
+ uint32 srid;
if ((null_value= (args[0]->null_value ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE))))
return 0;
- null_value= 1;
+ srid= uint4korr(swkb->ptr());
if (str->reserve(SRID_SIZE, 512))
- return 0;
+ goto err;
str->length(0);
- uint32 srid= uint4korr(swkb->ptr());
str->q_append(srid);
- switch(decomp_func)
- {
+ switch (decomp_func) {
case SP_STARTPOINT:
if (!GEOM_METHOD_PRESENT(geom,start_point) || geom.start_point(str))
- goto ret;
+ goto err;
break;
case SP_ENDPOINT:
if (!GEOM_METHOD_PRESENT(geom,end_point) || geom.end_point(str))
- goto ret;
+ goto err;
break;
case SP_EXTERIORRING:
if (!GEOM_METHOD_PRESENT(geom,exterior_ring) || geom.exterior_ring(str))
- goto ret;
+ goto err;
break;
default:
- goto ret;
+ goto err;
}
- null_value= 0;
+ return str;
-ret:
- return null_value ? 0 : str;
+err:
+ null_value= 1;
+ return 0;
}
@@ -244,43 +247,44 @@ String *Item_func_spatial_decomp_n::val_str(String *str)
String *swkb= args[0]->val_str(&arg_val);
long n= (long) args[1]->val_int();
Geometry geom;
+ uint32 srid;
if ((null_value= (args[0]->null_value || args[1]->null_value ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE))))
return 0;
- null_value= 1;
if (str->reserve(SRID_SIZE, 512))
- return 0;
+ goto err;
+ srid= uint4korr(swkb->ptr());
str->length(0);
- uint32 srid= uint4korr(swkb->ptr());
str->q_append(srid);
- switch(decomp_func_n)
+ switch (decomp_func_n)
{
case SP_POINTN:
if (!GEOM_METHOD_PRESENT(geom,point_n) || geom.point_n(n,str))
- goto ret;
+ goto err;
break;
case SP_GEOMETRYN:
if (!GEOM_METHOD_PRESENT(geom,geometry_n) || geom.geometry_n(n,str))
- goto ret;
+ goto err;
break;
case SP_INTERIORRINGN:
if (!GEOM_METHOD_PRESENT(geom,interior_ring_n) ||
geom.interior_ring_n(n,str))
- goto ret;
+ goto err;
break;
default:
- goto ret;
+ goto err;
}
- null_value= 0;
+ return str;
-ret:
- return null_value ? 0 : str;
+err:
+ null_value=1;
+ return 0;
}
@@ -299,9 +303,9 @@ String *Item_func_point::val_str(String *str)
double x= args[0]->val();
double y= args[1]->val();
- if ( (null_value= (args[0]->null_value ||
- args[1]->null_value ||
- str->realloc(1 + 4 + 8 + 8))))
+ if ((null_value= (args[0]->null_value ||
+ args[1]->null_value ||
+ str->realloc(1 + 4 + SIZEOF_STORED_DOUBLE*2))))
return 0;
str->length(0);
@@ -328,11 +332,9 @@ String *Item_func_spatial_collection::val_str(String *str)
String arg_value;
uint i;
- null_value= 1;
-
str->length(0);
if (str->reserve(1 + 4 + 4, 512))
- return 0;
+ goto err;
str->q_append((char) Geometry::wkbNDR);
str->q_append((uint32) coll_type);
@@ -342,19 +344,16 @@ String *Item_func_spatial_collection::val_str(String *str)
{
String *res= args[i]->val_str(&arg_value);
if (args[i]->null_value)
- goto ret;
+ goto err;
- if ( coll_type == Geometry::wkbGeometryCollection )
+ if (coll_type == Geometry::wkbGeometryCollection)
{
/*
- In the case of GeometryCollection we don't need
- any checkings for item types, so just copy them
- into target collection
+ In the case of GeometryCollection we don't need any checkings
+ for item types, so just copy them into target collection
*/
- if ((null_value= str->reserve(res->length(), 512)))
- goto ret;
-
- str->q_append(res->ptr(), res->length());
+ if (str->append(res->ptr(), res->length(), (uint32) 512))
+ goto err;
}
else
{
@@ -363,86 +362,75 @@ String *Item_func_spatial_collection::val_str(String *str)
const char *data= res->ptr() + 1;
/*
- In the case of named collection we must to
- check that items are of specific type, let's
- do this checking now
+ In the case of named collection we must to check that items
+ are of specific type, let's do this checking now
*/
if (len < 5)
- goto ret;
+ goto err;
wkb_type= (Geometry::wkbType) uint4korr(data);
data+= 4;
len-= 5;
if (wkb_type != item_type)
- goto ret;
+ goto err;
switch (coll_type) {
case Geometry::wkbMultiPoint:
case Geometry::wkbMultiLineString:
case Geometry::wkbMultiPolygon:
- if (len < WKB_HEADER_SIZE)
- goto ret;
-
- data-= WKB_HEADER_SIZE;
- len+= WKB_HEADER_SIZE;
- if (str->reserve(len, 512))
- goto ret;
- str->q_append(data, len);
+ if (len < WKB_HEADER_SIZE ||
+ str->append(data-WKB_HEADER_SIZE, len+WKB_HEADER_SIZE, 512))
+ goto err;
break;
case Geometry::wkbLineString:
- if (str->reserve(POINT_DATA_SIZE, 512))
- goto ret;
- str->q_append(data, POINT_DATA_SIZE);
+ if (str->append(data, POINT_DATA_SIZE, 512))
+ goto err;
break;
-
case Geometry::wkbPolygon:
{
uint32 n_points;
double x1, y1, x2, y2;
+ const char *org_data= data;
if (len < 4 + 2 * POINT_DATA_SIZE)
- goto ret;
-
- uint32 llen= len;
- const char *ldata= data;
+ goto err;
n_points= uint4korr(data);
data+= 4;
float8get(x1, data);
- data+= 8;
+ data+= SIZEOF_STORED_DOUBLE;
float8get(y1, data);
- data+= 8;
+ data+= SIZEOF_STORED_DOUBLE;
data+= (n_points - 2) * POINT_DATA_SIZE;
float8get(x2, data);
- float8get(y2, data + 8);
+ float8get(y2, data + SIZEOF_STORED_DOUBLE);
- if ((x1 != x2) || (y1 != y2))
- goto ret;
-
- if (str->reserve(llen, 512))
- goto ret;
- str->q_append(ldata, llen);
+ if ((x1 != x2) || (y1 != y2) ||
+ str->append(org_data, len, 512))
+ goto err;
}
break;
default:
- goto ret;
+ goto err;
}
}
}
-
if (str->length() > current_thd->variables.max_allowed_packet)
- goto ret;
+ goto err;
null_value = 0;
+ return str;
-ret:
- return null_value ? 0 : str;
+err:
+ null_value= 1;
+ return 0;
}
+
/*
Functions for spatial relations
*/
@@ -453,6 +441,7 @@ longlong Item_func_spatial_rel::val_int()
String *res2= args[1]->val_str(&tmp_value2);
Geometry g1, g2;
MBR mbr1, mbr2;
+ const char *dummy;
if ((null_value= (args[0]->null_value ||
args[1]->null_value ||
@@ -460,12 +449,11 @@ longlong Item_func_spatial_rel::val_int()
res1->length() - SRID_SIZE) ||
g2.create_from_wkb(res2->ptr() + SRID_SIZE,
res2->length() - SRID_SIZE) ||
- g1.get_mbr(&mbr1) ||
- g2.get_mbr(&mbr2))))
+ g1.get_mbr(&mbr1, &dummy) ||
+ g2.get_mbr(&mbr2, &dummy))))
return 0;
- switch (spatial_rel)
- {
+ switch (spatial_rel) {
case SP_CONTAINS_FUNC:
return mbr1.contains(&mbr2);
case SP_WITHIN_FUNC:
@@ -490,6 +478,7 @@ longlong Item_func_spatial_rel::val_int()
return 0;
}
+
longlong Item_func_isempty::val_int()
{
String tmp;
@@ -497,23 +486,25 @@ longlong Item_func_isempty::val_int()
return args[0]->null_value ? 1 : 0;
}
+
longlong Item_func_issimple::val_int()
{
String tmp;
String *wkb=args[0]->val_str(&tmp);
- if ((null_value= (!wkb || args[0]->null_value )))
+ if ((null_value= (!wkb || args[0]->null_value)))
return 0;
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */
return 0;
}
+
longlong Item_func_isclosed::val_int()
{
String tmp;
String *swkb= args[0]->val_str(&tmp);
Geometry geom;
- int isclosed;
+ int isclosed= 0; // In case of error
null_value= (!swkb ||
args[0]->null_value ||
@@ -529,23 +520,26 @@ longlong Item_func_isclosed::val_int()
Numerical functions
*/
+
longlong Item_func_dimension::val_int()
{
- uint32 dim;
+ uint32 dim= 0; // In case of error
String *swkb= args[0]->val_str(&value);
Geometry geom;
+ const char *dummy;
null_value= (!swkb ||
args[0]->null_value ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE) ||
- geom.dimension(&dim));
+ geom.dimension(&dim, &dummy));
return (longlong) dim;
}
+
longlong Item_func_numinteriorring::val_int()
{
- uint32 num;
+ uint32 num= 0; // In case of error
String *swkb= args[0]->val_str(&value);
Geometry geom;
@@ -557,9 +551,10 @@ longlong Item_func_numinteriorring::val_int()
return (longlong) num;
}
+
longlong Item_func_numgeometries::val_int()
{
- uint32 num= 0;
+ uint32 num= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
Geometry geom;
@@ -571,9 +566,10 @@ longlong Item_func_numgeometries::val_int()
return (longlong) num;
}
+
longlong Item_func_numpoints::val_int()
{
- uint32 num;
+ uint32 num= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
Geometry geom;
@@ -586,9 +582,10 @@ longlong Item_func_numpoints::val_int()
return (longlong) num;
}
+
double Item_func_x::val()
{
- double res;
+ double res= 0.0; // In case of errors
String *swkb= args[0]->val_str(&value);
Geometry geom;
@@ -600,9 +597,10 @@ double Item_func_x::val()
return res;
}
+
double Item_func_y::val()
{
- double res;
+ double res= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
Geometry geom;
@@ -614,23 +612,25 @@ double Item_func_y::val()
return res;
}
+
double Item_func_area::val()
{
- double res;
+ double res= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
Geometry geom;
+ const char *dummy;
null_value= (!swkb ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE) ||
!GEOM_METHOD_PRESENT(geom, area) ||
- geom.area(&res));
+ geom.area(&res, &dummy));
return res;
}
double Item_func_glength::val()
{
- double res;
+ double res= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
Geometry geom;
@@ -650,8 +650,10 @@ longlong Item_func_srid::val_int()
null_value= (!swkb ||
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
swkb->length() - SRID_SIZE));
- uint32 res= uint4korr(swkb->ptr());
- return (longlong) res;
+ if (null_value)
+ return 0;
+
+ return (longlong) (uint4korr(swkb->ptr()));
}
#endif /*HAVE_SPATIAL*/