summaryrefslogtreecommitdiff
path: root/sql/item_geofunc.cc
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2004-03-12 12:04:00 +0400
committerunknown <hf@deer.(none)>2004-03-12 12:04:00 +0400
commitf84ec3c062d62a2ed623461a51e7106af0a8ae22 (patch)
treecb3e50fde9831da43587ba8f7d68c19837d201a3 /sql/item_geofunc.cc
parent188535bba0964652678c3ce82b2dae3a1ef8bb25 (diff)
downloadmariadb-git-f84ec3c062d62a2ed623461a51e7106af0a8ae22.tar.gz
Spatial code changed to get rid of inconsistent this->* operation
Now we use virtual calls instead and redirect VMT pointer of the geometry object with 'new' operation sql/field.cc: Usage of the Geometry class changed sql/item_geofunc.cc: Usage of the Geometry class changed sql/spatial.cc: Now we rewrite the real VMT of the object with new operation sql/spatial.h: No need for the VMT-like structure and pointers to it sql/sql_yacc.yy: enum items was renamed accordingly to coding standards
Diffstat (limited to 'sql/item_geofunc.cc')
-rw-r--r--sql/item_geofunc.cc253
1 files changed, 141 insertions, 112 deletions
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index cbf286a2101..02c0f5829fd 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -30,7 +30,8 @@
String *Item_func_geometry_from_text::val_str(String *str)
{
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
String arg_val;
String *wkt= args[0]->val_str(&arg_val);
Gis_read_stream trs(wkt->c_ptr(), wkt->length());
@@ -43,7 +44,8 @@ String *Item_func_geometry_from_text::val_str(String *str)
return 0;
str->length(0);
str->q_append(srid);
- if ((null_value=(args[0]->null_value || geom.create_from_wkt(&trs, str, 0))))
+ if ((null_value=(args[0]->null_value ||
+ !(geom= Geometry::create_from_wkt(&buffer, &trs, str, 0)))))
return 0;
return str;
}
@@ -59,7 +61,8 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
{
String arg_val;
String *wkb= args[0]->val_str(&arg_val);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
uint32 srid= 0;
if ((arg_count == 2) && !args[1]->null_value)
@@ -69,9 +72,10 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
return 0;
str->length(0);
str->q_append(srid);
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(wkb->ptr(), wkb->length()))) ||
- str->append(*wkb))
+ if ((null_value=
+ (args[0]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, wkb->ptr(), wkb->length())) ||
+ str->append(*wkb))))
return 0;
return str;
}
@@ -87,16 +91,18 @@ String *Item_func_as_wkt::val_str(String *str)
{
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom= NULL;
const char *dummy;
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE))))
+ if ((null_value=
+ (args[0]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)))))
return 0;
str->length(0);
- if ((null_value= geom.as_wkt(str, &dummy)))
+ if ((null_value= geom->as_wkt(str, &dummy)))
return 0;
return str;
@@ -113,11 +119,13 @@ String *Item_func_as_wkb::val_str(String *str)
{
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE))))
+ if ((null_value=
+ (args[0]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)))))
return 0;
str->copy(swkb->ptr() + SRID_SIZE, swkb->length() - SRID_SIZE,
@@ -135,15 +143,17 @@ void Item_func_as_wkb::fix_length_and_dec()
String *Item_func_geometry_type::val_str(String *str)
{
String *swkb= args[0]->val_str(str);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom= NULL;
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE))))
+ if ((null_value=
+ (args[0]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)))))
return 0;
/* String will not move */
- str->set(geom.get_class_info()->m_name.str,
- geom.get_class_info()->m_name.length,
+ str->set(geom->get_class_info()->m_name.str,
+ geom->get_class_info()->m_name.length,
default_charset());
return str;
}
@@ -153,12 +163,14 @@ String *Item_func_envelope::val_str(String *str)
{
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom= NULL;
uint32 srid;
- if ((null_value= args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE)))
+ if ((null_value=
+ args[0]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE))))
return 0;
srid= uint4korr(swkb->ptr());
@@ -166,7 +178,7 @@ String *Item_func_envelope::val_str(String *str)
if (str->reserve(SRID_SIZE, 512))
return 0;
str->q_append(srid);
- return (null_value= geom.envelope(str)) ? 0 : str;
+ return (null_value= geom->envelope(str)) ? 0 : str;
}
@@ -174,13 +186,13 @@ String *Item_func_centroid::val_str(String *str)
{
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom= NULL;
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= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE))))
return 0;
if (str->reserve(SRID_SIZE, 512))
@@ -189,7 +201,7 @@ String *Item_func_centroid::val_str(String *str)
srid= uint4korr(swkb->ptr());
str->q_append(srid);
- return (null_value= test(geom.centroid(str))) ? 0 : str;
+ return (null_value= test(geom->centroid(str))) ? 0 : str;
}
@@ -201,12 +213,14 @@ String *Item_func_spatial_decomp::val_str(String *str)
{
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom= NULL;
uint32 srid;
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE))))
+ if ((null_value=
+ (args[0]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)))))
return 0;
srid= uint4korr(swkb->ptr());
@@ -216,17 +230,17 @@ String *Item_func_spatial_decomp::val_str(String *str)
str->q_append(srid);
switch (decomp_func) {
case SP_STARTPOINT:
- if (!GEOM_METHOD_PRESENT(geom,start_point) || geom.start_point(str))
+ if (geom->start_point(str))
goto err;
break;
case SP_ENDPOINT:
- if (!GEOM_METHOD_PRESENT(geom,end_point) || geom.end_point(str))
+ if (geom->end_point(str))
goto err;
break;
case SP_EXTERIORRING:
- if (!GEOM_METHOD_PRESENT(geom,exterior_ring) || geom.exterior_ring(str))
+ if (geom->exterior_ring(str))
goto err;
break;
@@ -246,12 +260,14 @@ String *Item_func_spatial_decomp_n::val_str(String *str)
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
long n= (long) args[1]->val_int();
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom= NULL;
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))))
+ if ((null_value=
+ (args[0]->null_value || args[1]->null_value ||
+ !(geom= Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)))))
return 0;
if (str->reserve(SRID_SIZE, 512))
@@ -262,18 +278,17 @@ String *Item_func_spatial_decomp_n::val_str(String *str)
switch (decomp_func_n)
{
case SP_POINTN:
- if (!GEOM_METHOD_PRESENT(geom,point_n) || geom.point_n(n,str))
+ if (geom->point_n(n,str))
goto err;
break;
case SP_GEOMETRYN:
- if (!GEOM_METHOD_PRESENT(geom,geometry_n) || geom.geometry_n(n,str))
+ if (geom->geometry_n(n,str))
goto err;
break;
case SP_INTERIORRINGN:
- if (!GEOM_METHOD_PRESENT(geom,interior_ring_n) ||
- geom.interior_ring_n(n,str))
+ if (geom->interior_ring_n(n,str))
goto err;
break;
@@ -309,8 +324,8 @@ String *Item_func_point::val_str(String *str)
return 0;
str->length(0);
- str->q_append((char)Geometry::wkbNDR);
- str->q_append((uint32)Geometry::wkbPoint);
+ str->q_append((char)Geometry::wkb_ndr);
+ str->q_append((uint32)Geometry::wkb_point);
str->q_append(x);
str->q_append(y);
return str;
@@ -336,7 +351,7 @@ String *Item_func_spatial_collection::val_str(String *str)
if (str->reserve(1 + 4 + 4, 512))
goto err;
- str->q_append((char) Geometry::wkbNDR);
+ str->q_append((char) Geometry::wkb_ndr);
str->q_append((uint32) coll_type);
str->q_append((uint32) arg_count);
@@ -346,7 +361,7 @@ String *Item_func_spatial_collection::val_str(String *str)
if (args[i]->null_value)
goto err;
- if (coll_type == Geometry::wkbGeometryCollection)
+ if (coll_type == Geometry::wkb_geometrycollection)
{
/*
In the case of GeometryCollection we don't need any checkings
@@ -375,19 +390,19 @@ String *Item_func_spatial_collection::val_str(String *str)
goto err;
switch (coll_type) {
- case Geometry::wkbMultiPoint:
- case Geometry::wkbMultiLineString:
- case Geometry::wkbMultiPolygon:
+ case Geometry::wkb_multipoint:
+ case Geometry::wkb_multilinestring:
+ case Geometry::wkb_multipolygon:
if (len < WKB_HEADER_SIZE ||
str->append(data-WKB_HEADER_SIZE, len+WKB_HEADER_SIZE, 512))
goto err;
break;
- case Geometry::wkbLineString:
+ case Geometry::wkb_linestring:
if (str->append(data, POINT_DATA_SIZE, 512))
goto err;
break;
- case Geometry::wkbPolygon:
+ case Geometry::wkb_polygon:
{
uint32 n_points;
double x1, y1, x2, y2;
@@ -439,18 +454,20 @@ longlong Item_func_spatial_rel::val_int()
{
String *res1= args[0]->val_str(&tmp_value1);
String *res2= args[1]->val_str(&tmp_value2);
- Geometry g1, g2;
+ Geometry_buffer buffer1, buffer2;
+ Geometry *g1, *g2;
MBR mbr1, mbr2;
const char *dummy;
- if ((null_value= (args[0]->null_value ||
- args[1]->null_value ||
- g1.create_from_wkb(res1->ptr() + SRID_SIZE,
- res1->length() - SRID_SIZE) ||
- g2.create_from_wkb(res2->ptr() + SRID_SIZE,
- res2->length() - SRID_SIZE) ||
- g1.get_mbr(&mbr1, &dummy) ||
- g2.get_mbr(&mbr2, &dummy))))
+ if ((null_value=
+ (args[0]->null_value ||
+ args[1]->null_value ||
+ !(g1= Geometry::create_from_wkb(&buffer1, res1->ptr() + SRID_SIZE,
+ res1->length() - SRID_SIZE)) ||
+ !(g2= Geometry::create_from_wkb(&buffer2, res2->ptr() + SRID_SIZE,
+ res2->length() - SRID_SIZE)) ||
+ g1->get_mbr(&mbr1, &dummy) ||
+ g2->get_mbr(&mbr2, &dummy))))
return 0;
switch (spatial_rel) {
@@ -503,15 +520,16 @@ longlong Item_func_isclosed::val_int()
{
String tmp;
String *swkb= args[0]->val_str(&tmp);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
int isclosed= 0; // In case of error
null_value= (!swkb ||
args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom,is_closed) ||
- geom.is_closed(&isclosed));
+ !(geom=
+ Geometry::create_from_wkb(&buffer, swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->is_closed(&isclosed));
return (longlong) isclosed;
}
@@ -525,14 +543,16 @@ longlong Item_func_dimension::val_int()
{
uint32 dim= 0; // In case of error
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ 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, &dummy));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->dimension(&dim, &dummy));
return (longlong) dim;
}
@@ -541,13 +561,14 @@ longlong Item_func_numinteriorring::val_int()
{
uint32 num= 0; // In case of error
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
null_value= (!swkb ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, num_interior_ring) ||
- geom.num_interior_ring(&num));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->num_interior_ring(&num));
return (longlong) num;
}
@@ -556,13 +577,14 @@ longlong Item_func_numgeometries::val_int()
{
uint32 num= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
null_value= (!swkb ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, num_geometries) ||
- geom.num_geometries(&num));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->num_geometries(&num));
return (longlong) num;
}
@@ -571,14 +593,15 @@ longlong Item_func_numpoints::val_int()
{
uint32 num= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
null_value= (!swkb ||
args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, num_points) ||
- geom.num_points(&num));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->num_points(&num));
return (longlong) num;
}
@@ -587,13 +610,14 @@ double Item_func_x::val()
{
double res= 0.0; // In case of errors
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
null_value= (!swkb ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, get_x) ||
- geom.get_x(&res));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->get_x(&res));
return res;
}
@@ -602,13 +626,14 @@ double Item_func_y::val()
{
double res= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
null_value= (!swkb ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, get_y) ||
- geom.get_y(&res));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->get_y(&res));
return res;
}
@@ -617,14 +642,15 @@ double Item_func_area::val()
{
double res= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ 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, &dummy));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->area(&res, &dummy));
return res;
}
@@ -632,24 +658,27 @@ double Item_func_glength::val()
{
double res= 0; // In case of errors
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
null_value= (!swkb ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE) ||
- !GEOM_METHOD_PRESENT(geom, length) ||
- geom.length(&res));
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE)) ||
+ geom->length(&res));
return res;
}
longlong Item_func_srid::val_int()
{
String *swkb= args[0]->val_str(&value);
- Geometry geom;
+ Geometry_buffer buffer;
+ Geometry *geom;
- null_value= (!swkb ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE));
+ null_value= !swkb ||
+ !(geom= Geometry::create_from_wkb(&buffer,
+ swkb->ptr() + SRID_SIZE,
+ swkb->length() - SRID_SIZE));
if (null_value)
return 0;