summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.cc
diff options
context:
space:
mode:
authorunknown <ram@mysql.r18.ru>2003-05-30 15:22:34 +0500
committerunknown <ram@mysql.r18.ru>2003-05-30 15:22:34 +0500
commit7a99669fbcf534d7e4fa869c4d729f21bc625b1b (patch)
tree63740c308f1012b76e837db49fc103d44503c8db /sql/item_strfunc.cc
parent38c5034b196e9a509d27c5dac90edc4a99f9ab69 (diff)
downloadmariadb-git-7a99669fbcf534d7e4fa869c4d729f21bc625b1b.tar.gz
Moved spatial functions to the sql/item_geofunc.cc file.
BitKeeper/etc/ignore: Added libmysqld/item_geofunc.cc to the ignore list
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r--sql/item_strfunc.cc422
1 files changed, 0 insertions, 422 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index ae48aeb115a..06569095018 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2522,428 +2522,6 @@ null:
return 0;
}
-
-/*******************************************************
-General functions for spatial objects
-********************************************************/
-
-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;
-
- if ((arg_count == 2) && !args[1]->null_value)
- srid= 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_wkt(&trs, str, 0))))
- return 0;
- return str;
-}
-
-
-void Item_func_geometry_from_text::fix_length_and_dec()
-{
- max_length=MAX_BLOB_WIDTH;
-}
-
-
-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;
-
- if ((arg_count == 2) && !args[1]->null_value)
- srid= 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()))))
- return 0;
-
- str->append(*wkb);
- return str;
-}
-
-
-void Item_func_geometry_from_wkb::fix_length_and_dec()
-{
- max_length=MAX_BLOB_WIDTH;
-}
-
-
-String *Item_func_as_text::val_str(String *str)
-{
- String arg_val;
- String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
-
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE))))
- return 0;
-
- str->length(0);
-
- if ((null_value= geom.as_wkt(str)))
- return 0;
-
- return str;
-}
-
-void Item_func_as_text::fix_length_and_dec()
-{
- max_length=MAX_BLOB_WIDTH;
-}
-
-String *Item_func_as_wkb::val_str(String *str)
-{
- String arg_val;
- String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
-
- if ((null_value= (args[0]->null_value ||
- geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
- swkb->length() - SRID_SIZE))))
- return 0;
-
- str->copy(swkb->ptr() + SRID_SIZE, swkb->length() - SRID_SIZE,
- &my_charset_bin);
- 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);
- Geometry geom;
-
- if ((null_value= (args[0]->null_value ||
- 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_info);
- return str;
-}
-
-
-String *Item_func_envelope::val_str(String *str)
-{
- String arg_val;
- String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
-
- 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());
- str->length(0);
- if (str->reserve(SRID_SIZE, 512))
- return 0;
- str->q_append(srid);
- return (null_value= geom.envelope(str)) ? 0 : str;
-}
-
-
-String *Item_func_centroid::val_str(String *str)
-{
- String arg_val;
- String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
-
- if ((null_value= args[0]->null_value ||
- 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());
- str->q_append(srid);
-
- return (null_value= geom.centroid(str)) ? 0 : str;
-}
-
-
-/***********************************************
- Spatial decomposition functions
-***********************************************/
-
-String *Item_func_spatial_decomp::val_str(String *str)
-{
- String arg_val;
- String *swkb= args[0]->val_str(&arg_val);
- Geometry geom;
-
- if ((null_value= (args[0]->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;
- str->length(0);
- uint32 srid= uint4korr(swkb->ptr());
- str->q_append(srid);
- switch(decomp_func)
- {
- case SP_STARTPOINT:
- if (!GEOM_METHOD_PRESENT(geom,start_point) || geom.start_point(str))
- goto ret;
- break;
-
- case SP_ENDPOINT:
- if (!GEOM_METHOD_PRESENT(geom,end_point) || geom.end_point(str))
- goto ret;
- break;
-
- case SP_EXTERIORRING:
- if (!GEOM_METHOD_PRESENT(geom,exterior_ring) || geom.exterior_ring(str))
- goto ret;
- break;
-
- default:
- goto ret;
- }
- null_value= 0;
-
-ret:
- return null_value ? 0 : str;
-}
-
-
-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;
-
- 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;
- str->length(0);
- uint32 srid= uint4korr(swkb->ptr());
- str->q_append(srid);
- switch(decomp_func_n)
- {
- case SP_POINTN:
- if (!GEOM_METHOD_PRESENT(geom,point_n) || geom.point_n(n,str))
- goto ret;
- break;
-
- case SP_GEOMETRYN:
- if (!GEOM_METHOD_PRESENT(geom,geometry_n) || geom.geometry_n(n,str))
- goto ret;
- break;
-
- case SP_INTERIORRINGN:
- if (!GEOM_METHOD_PRESENT(geom,interior_ring_n) ||
- geom.interior_ring_n(n,str))
- goto ret;
- break;
-
- default:
- goto ret;
- }
- null_value= 0;
-
-ret:
- return null_value ? 0 : str;
-}
-
-
-
-/***********************************************
-Functions to concatinate various spatial objects
-************************************************/
-
-
-/*
-* Concatinate doubles into Point
-*/
-
-
-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))))
- return 0;
-
- str->length(0);
- str->q_append((char)Geometry::wkbNDR);
- str->q_append((uint32)Geometry::wkbPoint);
- str->q_append(x);
- str->q_append(y);
- return str;
-}
-
-
-/*
- Concatinates various items into various collections
- with checkings for valid wkb type of items.
- For example, MultiPoint can be a collection of Points only.
- coll_type contains wkb type of target collection.
- item_type contains a valid wkb type of items.
- In the case when coll_type is wkbGeometryCollection,
- we do not check wkb type of items, any is valid.
-*/
-
-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;
-
- str->q_append((char) Geometry::wkbNDR);
- str->q_append((uint32) coll_type);
- str->q_append((uint32) arg_count);
-
- for (i= 0; i < arg_count; ++i)
- {
- String *res= args[i]->val_str(&arg_value);
- if (args[i]->null_value)
- goto ret;
-
- 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
- */
- if ((null_value= str->reserve(res->length(), 512)))
- goto ret;
-
- str->q_append(res->ptr(), res->length());
- }
- else
- {
- enum Geometry::wkbType wkb_type;
- uint32 len=res->length();
- 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
- */
-
- if (len < 5)
- goto ret;
- wkb_type= (Geometry::wkbType) uint4korr(data);
- data+= 4;
- len-= 5;
- if (wkb_type != item_type)
- goto ret;
-
- 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);
- break;
-
- case Geometry::wkbLineString:
- if (str->reserve(POINT_DATA_SIZE, 512))
- goto ret;
- str->q_append(data, POINT_DATA_SIZE);
- break;
-
- case Geometry::wkbPolygon:
- {
- uint32 n_points;
- double x1, y1, x2, y2;
-
- if (len < 4 + 2 * POINT_DATA_SIZE)
- goto ret;
-
- uint32 llen= len;
- const char *ldata= data;
-
- n_points= uint4korr(data);
- data+= 4;
- float8get(x1, data);
- data+= 8;
- float8get(y1, data);
- data+= 8;
-
- data+= (n_points - 2) * POINT_DATA_SIZE;
-
- float8get(x2, data);
- float8get(y2, data + 8);
-
- if ((x1 != x2) || (y1 != y2))
- goto ret;
-
- if (str->reserve(llen, 512))
- goto ret;
- str->q_append(ldata, llen);
- }
- break;
-
- default:
- goto ret;
- }
- }
- }
-
- if (str->length() > current_thd->variables.max_allowed_packet)
- goto ret;
-
- null_value = 0;
-
-ret:
- return null_value ? 0 : str;
-}
-
#ifdef HAVE_COMPRESS
#include "../zlib/zlib.h"