SRID support.
GeomertyFromWKB() function. SRID() function. ::store() methods for Field_geom. Code cleanup. myisam/sp_key.c: SRID support. mysql-test/r/gis.result: We should use GeometryFromWKB(). mysql-test/t/gis.test: We should use GeometryFromWKB(). sql/field.cc: SRID support. ::store() methods for Field_geom. Code cleanup. sql/field.h: SRID support. ::store() methods for Field_geom. Code cleanup. sql/item_cmpfunc.cc: SRID support. Code cleanup. sql/item_create.cc: Code cleanup. sql/item_create.h: Code cleanup. sql/item_func.cc: SRID support. Code cleanup. sql/item_func.h: SRID support. sql/item_strfunc.cc: SRID support. GeometryFromWKB() function. Code cleanup. sql/item_strfunc.h: SRID support. GeometryFromWKB() function. Code cleanup. sql/lex.h: GeometryFromWKB() function. SRID() function. sql/spatial.cc: Code cleanup. sql/spatial.h: Code cleanup. sql/sql_yacc.yy: Fix for xxxFromText() functions. GeometryFromWKB() function.
This commit is contained in:
parent
1c1f407dd3
commit
3ccd93c704
@ -47,7 +47,7 @@ uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||||||
|
|
||||||
dlen = _mi_calc_blob_length(keyseg->bit_start, pos);
|
dlen = _mi_calc_blob_length(keyseg->bit_start, pos);
|
||||||
memcpy_fixed(&dptr, pos + keyseg->bit_start, sizeof(char*));
|
memcpy_fixed(&dptr, pos + keyseg->bit_start, sizeof(char*));
|
||||||
sp_mbr_from_wkb(dptr, dlen, SPDIMS, mbr);
|
sp_mbr_from_wkb(dptr + 4, dlen - 4, SPDIMS, mbr); /* SRID */
|
||||||
|
|
||||||
for (i = 0, keyseg = keyinfo->seg; keyseg->type; keyseg++, i++)
|
for (i = 0, keyseg = keyinfo->seg; keyseg->type; keyseg++, i++)
|
||||||
{
|
{
|
||||||
|
@ -15,26 +15,26 @@ INSERT INTO pt VALUES
|
|||||||
INSERT INTO ls VALUES
|
INSERT INTO ls VALUES
|
||||||
(105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
|
(105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
|
||||||
(106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
|
(106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
|
||||||
(107, LineString(Point(10, 10), Point(40, 10)));
|
(107, GeometryFromWKB(LineString(Point(10, 10), Point(40, 10))));
|
||||||
INSERT INTO p VALUES
|
INSERT INTO p VALUES
|
||||||
(108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
|
(108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
|
||||||
(109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
|
(109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
|
||||||
(110, Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))));
|
(110, GeometryFromWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0)))));
|
||||||
INSERT INTO mpt VALUES
|
INSERT INTO mpt VALUES
|
||||||
(111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
|
(111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
|
||||||
(112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
|
(112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
|
||||||
(113, MultiPoint(Point(3, 6), Point(4, 10)));
|
(113, GeometryFromWKB(MultiPoint(Point(3, 6), Point(4, 10))));
|
||||||
INSERT INTO mls VALUES
|
INSERT INTO mls VALUES
|
||||||
(114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
|
(114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
|
||||||
(115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
|
(115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
|
||||||
(116, MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))));
|
(116, GeometryFromWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7)))));
|
||||||
INSERT INTO mp VALUES
|
INSERT INTO mp VALUES
|
||||||
(117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
(117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
||||||
(118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
(118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
||||||
(119, MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))));
|
(119, GeometryFromWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))))));
|
||||||
INSERT INTO gc VALUES
|
INSERT INTO gc VALUES
|
||||||
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
||||||
(121, GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))));
|
(121, GeometryFromWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))));
|
||||||
INSERT into geo SELECT * FROM pt;
|
INSERT into geo SELECT * FROM pt;
|
||||||
INSERT into geo SELECT * FROM ls;
|
INSERT into geo SELECT * FROM ls;
|
||||||
INSERT into geo SELECT * FROM p;
|
INSERT into geo SELECT * FROM p;
|
||||||
|
@ -24,32 +24,32 @@ INSERT INTO pt VALUES
|
|||||||
INSERT INTO ls VALUES
|
INSERT INTO ls VALUES
|
||||||
(105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
|
(105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
|
||||||
(106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
|
(106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
|
||||||
(107, LineString(Point(10, 10), Point(40, 10)));
|
(107, GeometryFromWKB(LineString(Point(10, 10), Point(40, 10))));
|
||||||
|
|
||||||
INSERT INTO p VALUES
|
INSERT INTO p VALUES
|
||||||
(108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
|
(108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
|
||||||
(109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
|
(109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
|
||||||
(110, Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))));
|
(110, GeometryFromWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0)))));
|
||||||
|
|
||||||
INSERT INTO mpt VALUES
|
INSERT INTO mpt VALUES
|
||||||
(111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
|
(111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
|
||||||
(112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
|
(112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
|
||||||
(113, MultiPoint(Point(3, 6), Point(4, 10)));
|
(113, GeometryFromWKB(MultiPoint(Point(3, 6), Point(4, 10))));
|
||||||
|
|
||||||
INSERT INTO mls VALUES
|
INSERT INTO mls VALUES
|
||||||
(114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
|
(114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
|
||||||
(115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
|
(115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
|
||||||
(116, MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))));
|
(116, GeometryFromWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7)))));
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO mp VALUES
|
INSERT INTO mp VALUES
|
||||||
(117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
(117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
||||||
(118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
(118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
|
||||||
(119, MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))));
|
(119, GeometryFromWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3))))));
|
||||||
|
|
||||||
INSERT INTO gc VALUES
|
INSERT INTO gc VALUES
|
||||||
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
||||||
(121, GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))));
|
(121, GeometryFromWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))));
|
||||||
|
|
||||||
INSERT into geo SELECT * FROM pt;
|
INSERT into geo SELECT * FROM pt;
|
||||||
INSERT into geo SELECT * FROM ls;
|
INSERT into geo SELECT * FROM ls;
|
||||||
|
89
sql/field.cc
89
sql/field.cc
@ -4525,7 +4525,7 @@ void Field_blob::get_key_image(char *buff,uint length,
|
|||||||
|
|
||||||
MBR mbr;
|
MBR mbr;
|
||||||
Geometry gobj;
|
Geometry gobj;
|
||||||
gobj.create_from_wkb(blob,blob_length);
|
gobj.create_from_wkb(blob + SRID_SIZE, blob_length - SRID_SIZE);
|
||||||
gobj.get_mbr(&mbr);
|
gobj.get_mbr(&mbr);
|
||||||
float8store(buff, mbr.xmin);
|
float8store(buff, mbr.xmin);
|
||||||
float8store(buff+8, mbr.xmax);
|
float8store(buff+8, mbr.xmax);
|
||||||
@ -4555,35 +4555,6 @@ void Field_blob::set_key_image(char *buff,uint length, CHARSET_INFO *cs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Field_geom::get_key_image(char *buff,uint length,CHARSET_INFO *cs,
|
|
||||||
imagetype type)
|
|
||||||
{
|
|
||||||
length-=HA_KEY_BLOB_LENGTH;
|
|
||||||
ulong blob_length=get_length(ptr);
|
|
||||||
char *blob;
|
|
||||||
get_ptr(&blob);
|
|
||||||
|
|
||||||
MBR mbr;
|
|
||||||
Geometry gobj;
|
|
||||||
gobj.create_from_wkb(blob,blob_length);
|
|
||||||
gobj.get_mbr(&mbr);
|
|
||||||
float8store(buff, mbr.xmin);
|
|
||||||
float8store(buff+8, mbr.xmax);
|
|
||||||
float8store(buff+16, mbr.ymin);
|
|
||||||
float8store(buff+24, mbr.ymax);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Field_geom::set_key_image(char *buff,uint length,CHARSET_INFO *cs)
|
|
||||||
{
|
|
||||||
Field_blob::set_key_image(buff, length, cs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Field_geom::sql_type(String &res) const
|
|
||||||
{
|
|
||||||
res.set("geometry", 8, &my_charset_latin1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length)
|
int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length)
|
||||||
{
|
{
|
||||||
char *blob1;
|
char *blob1;
|
||||||
@ -4776,6 +4747,64 @@ uint Field_blob::max_packed_col_length(uint max_length)
|
|||||||
return (max_length > 255 ? 2 : 1)+max_length;
|
return (max_length > 255 ? 2 : 1)+max_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Field_geom::get_key_image(char *buff, uint length, CHARSET_INFO *cs,
|
||||||
|
imagetype type)
|
||||||
|
{
|
||||||
|
length-= HA_KEY_BLOB_LENGTH;
|
||||||
|
ulong blob_length= get_length(ptr);
|
||||||
|
char *blob;
|
||||||
|
get_ptr(&blob);
|
||||||
|
|
||||||
|
MBR mbr;
|
||||||
|
Geometry gobj;
|
||||||
|
gobj.create_from_wkb(blob + SRID_SIZE, blob_length - SRID_SIZE);
|
||||||
|
gobj.get_mbr(&mbr);
|
||||||
|
float8store(buff, mbr.xmin);
|
||||||
|
float8store(buff + 8, mbr.xmax);
|
||||||
|
float8store(buff + 16, mbr.ymin);
|
||||||
|
float8store(buff + 24, mbr.ymax);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Field_geom::set_key_image(char *buff, uint length, CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
Field_blob::set_key_image(buff, length, cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Field_geom::sql_type(String &res) const
|
||||||
|
{
|
||||||
|
res.set("geometry", 8, &my_charset_latin1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
if (!length)
|
||||||
|
{
|
||||||
|
bzero(ptr, Field_blob::pack_length());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Should check given WKB
|
||||||
|
if (length < 4 + 1 + 4 + 8 + 8) // SRID + WKB_HEADER + X + Y
|
||||||
|
return 1;
|
||||||
|
uint32 wkb_type= uint4korr(from + 5);
|
||||||
|
if (wkb_type < 1 || wkb_type > 7)
|
||||||
|
return 1;
|
||||||
|
Field_blob::store_length(length);
|
||||||
|
if (table->copy_blobs || length <= MAX_FIELD_WIDTH)
|
||||||
|
{ // Must make a copy
|
||||||
|
value.copy(from, length, cs);
|
||||||
|
from= value.ptr();
|
||||||
|
}
|
||||||
|
bmove(ptr + packlength, (char*) &from, sizeof(char*));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
** enum type.
|
** enum type.
|
||||||
** This is a string which only can have a selection of different values.
|
** This is a string which only can have a selection of different values.
|
||||||
|
@ -843,9 +843,10 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
class Field_blob :public Field_str {
|
class Field_blob :public Field_str {
|
||||||
|
bool geom_flag;
|
||||||
|
protected:
|
||||||
uint packlength;
|
uint packlength;
|
||||||
String value; // For temporaries
|
String value; // For temporaries
|
||||||
bool geom_flag;
|
|
||||||
public:
|
public:
|
||||||
Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
|
Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
|
||||||
enum utype unireg_check_arg, const char *field_name_arg,
|
enum utype unireg_check_arg, const char *field_name_arg,
|
||||||
@ -855,7 +856,7 @@ public:
|
|||||||
struct st_table *table_arg, CHARSET_INFO *cs)
|
struct st_table *table_arg, CHARSET_INFO *cs)
|
||||||
:Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0,
|
:Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0,
|
||||||
NONE, field_name_arg, table_arg, cs),
|
NONE, field_name_arg, table_arg, cs),
|
||||||
packlength(3), geom_flag(true)
|
geom_flag(true), packlength(3)
|
||||||
{
|
{
|
||||||
flags|= BLOB_FLAG;
|
flags|= BLOB_FLAG;
|
||||||
}
|
}
|
||||||
@ -942,6 +943,9 @@ public:
|
|||||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; }
|
enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; }
|
||||||
enum_field_types type() const { return FIELD_TYPE_GEOMETRY; }
|
enum_field_types type() const { return FIELD_TYPE_GEOMETRY; }
|
||||||
void sql_type(String &str) const;
|
void sql_type(String &str) const;
|
||||||
|
int store(const char *to, uint length, CHARSET_INFO *charset);
|
||||||
|
int store(double nr) { return 1; }
|
||||||
|
int store(longlong nr) { return 1; }
|
||||||
|
|
||||||
void get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type);
|
void get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type);
|
||||||
void set_key_image(char *buff,uint length, CHARSET_INFO *cs);
|
void set_key_image(char *buff,uint length, CHARSET_INFO *cs);
|
||||||
|
@ -2207,8 +2207,10 @@ longlong Item_func_spatial_rel::val_int()
|
|||||||
|
|
||||||
if ((null_value= (args[0]->null_value ||
|
if ((null_value= (args[0]->null_value ||
|
||||||
args[1]->null_value ||
|
args[1]->null_value ||
|
||||||
g1.create_from_wkb(res1->ptr(),res1->length()) ||
|
g1.create_from_wkb(res1->ptr() + SRID_SIZE,
|
||||||
g2.create_from_wkb(res2->ptr(),res2->length()) ||
|
res1->length() - SRID_SIZE) ||
|
||||||
|
g2.create_from_wkb(res2->ptr() + SRID_SIZE,
|
||||||
|
res2->length() - SRID_SIZE) ||
|
||||||
g1.get_mbr(&mbr1) ||
|
g1.get_mbr(&mbr1) ||
|
||||||
g2.get_mbr(&mbr2))))
|
g2.get_mbr(&mbr2))))
|
||||||
return 0;
|
return 0;
|
||||||
@ -2260,13 +2262,14 @@ longlong Item_func_issimple::val_int()
|
|||||||
longlong Item_func_isclosed::val_int()
|
longlong Item_func_isclosed::val_int()
|
||||||
{
|
{
|
||||||
String tmp;
|
String tmp;
|
||||||
String *wkb=args[0]->val_str(&tmp);
|
String *swkb= args[0]->val_str(&tmp);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
int isclosed;
|
int isclosed;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
args[0]->null_value ||
|
args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom,is_closed) ||
|
!GEOM_METHOD_PRESENT(geom,is_closed) ||
|
||||||
geom.is_closed(&isclosed));
|
geom.is_closed(&isclosed));
|
||||||
|
|
||||||
|
@ -480,16 +480,16 @@ Item *create_func_quote(Item* a)
|
|||||||
return new Item_func_quote(a);
|
return new Item_func_quote(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
Item *create_func_geometry_from_text(Item* a)
|
|
||||||
{
|
|
||||||
return new Item_func_geometry_from_text(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
Item *create_func_as_text(Item *a)
|
Item *create_func_as_text(Item *a)
|
||||||
{
|
{
|
||||||
return new Item_func_as_text(a);
|
return new Item_func_as_text(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Item *create_func_srid(Item *a)
|
||||||
|
{
|
||||||
|
return new Item_func_srid(a);
|
||||||
|
}
|
||||||
|
|
||||||
Item *create_func_startpoint(Item *a)
|
Item *create_func_startpoint(Item *a)
|
||||||
{
|
{
|
||||||
return new Item_func_spatial_decomp(a, Item_func::SP_STARTPOINT);
|
return new Item_func_spatial_decomp(a, Item_func::SP_STARTPOINT);
|
||||||
|
@ -104,6 +104,7 @@ Item *create_func_quote(Item* a);
|
|||||||
|
|
||||||
Item *create_func_geometry_from_text(Item *a);
|
Item *create_func_geometry_from_text(Item *a);
|
||||||
Item *create_func_as_text(Item *a);
|
Item *create_func_as_text(Item *a);
|
||||||
|
Item *create_func_srid(Item *a);
|
||||||
Item *create_func_startpoint(Item *a);
|
Item *create_func_startpoint(Item *a);
|
||||||
Item *create_func_endpoint(Item *a);
|
Item *create_func_endpoint(Item *a);
|
||||||
Item *create_func_exteriorring(Item *a);
|
Item *create_func_exteriorring(Item *a);
|
||||||
@ -138,4 +139,3 @@ Item *create_func_numinteriorring(Item* a);
|
|||||||
Item *create_func_numgeometries(Item *a);
|
Item *create_func_numgeometries(Item *a);
|
||||||
|
|
||||||
Item *create_func_point(Item *a, Item *b);
|
Item *create_func_point(Item *a, Item *b);
|
||||||
|
|
||||||
|
@ -2706,115 +2706,129 @@ longlong Item_func_is_free_lock::val_int()
|
|||||||
longlong Item_func_dimension::val_int()
|
longlong Item_func_dimension::val_int()
|
||||||
{
|
{
|
||||||
uint32 dim;
|
uint32 dim;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
args[0]->null_value ||
|
args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
geom.dimension(&dim));
|
geom.dimension(&dim));
|
||||||
|
|
||||||
return (longlong) dim;
|
return (longlong) dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
longlong Item_func_numinteriorring::val_int()
|
longlong Item_func_numinteriorring::val_int()
|
||||||
{
|
{
|
||||||
uint32 num;
|
uint32 num;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, num_interior_ring) ||
|
!GEOM_METHOD_PRESENT(geom, num_interior_ring) ||
|
||||||
geom.num_interior_ring(&num));
|
geom.num_interior_ring(&num));
|
||||||
|
|
||||||
return (longlong) num;
|
return (longlong) num;
|
||||||
}
|
}
|
||||||
|
|
||||||
longlong Item_func_numgeometries::val_int()
|
longlong Item_func_numgeometries::val_int()
|
||||||
{
|
{
|
||||||
uint32 num= 0;
|
uint32 num= 0;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, num_geometries) ||
|
!GEOM_METHOD_PRESENT(geom, num_geometries) ||
|
||||||
geom.num_geometries(&num));
|
geom.num_geometries(&num));
|
||||||
|
|
||||||
return (longlong) num;
|
return (longlong) num;
|
||||||
}
|
}
|
||||||
|
|
||||||
longlong Item_func_numpoints::val_int()
|
longlong Item_func_numpoints::val_int()
|
||||||
{
|
{
|
||||||
uint32 num=0;
|
uint32 num;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
args[0]->null_value ||
|
args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, num_points) ||
|
!GEOM_METHOD_PRESENT(geom, num_points) ||
|
||||||
geom.num_points(&num));
|
geom.num_points(&num));
|
||||||
|
|
||||||
return (longlong) num;
|
return (longlong) num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Item_func_x::val()
|
double Item_func_x::val()
|
||||||
{
|
{
|
||||||
double res=0;
|
double res;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, get_x) ||
|
!GEOM_METHOD_PRESENT(geom, get_x) ||
|
||||||
geom.get_x(&res));
|
geom.get_x(&res));
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Item_func_y::val()
|
double Item_func_y::val()
|
||||||
{
|
{
|
||||||
double res=0;
|
double res;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, get_y) ||
|
!GEOM_METHOD_PRESENT(geom, get_y) ||
|
||||||
geom.get_y(&res));
|
geom.get_y(&res));
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Item_func_area::val()
|
double Item_func_area::val()
|
||||||
{
|
{
|
||||||
double res=0;
|
double res;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, area) ||
|
!GEOM_METHOD_PRESENT(geom, area) ||
|
||||||
geom.area(&res));
|
geom.area(&res));
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Item_func_glength::val()
|
double Item_func_glength::val()
|
||||||
{
|
{
|
||||||
double res=0;
|
double res;
|
||||||
String *wkb=args[0]->val_str(&value);
|
String *swkb= args[0]->val_str(&value);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value= (!wkb ||
|
null_value= (!swkb ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE) ||
|
||||||
!GEOM_METHOD_PRESENT(geom, length) ||
|
!GEOM_METHOD_PRESENT(geom, length) ||
|
||||||
geom.length(&res));
|
geom.length(&res));
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
longlong Item_func_srid::val_int()
|
||||||
|
{
|
||||||
|
String *swkb= args[0]->val_str(&value);
|
||||||
|
Geometry geom;
|
||||||
|
|
||||||
|
null_value= (!swkb ||
|
||||||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE));
|
||||||
|
uint32 res= uint4korr(swkb->ptr());
|
||||||
|
return (longlong) res;
|
||||||
|
}
|
||||||
|
@ -1112,6 +1112,17 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Item_func_srid: public Item_int_func
|
||||||
|
{
|
||||||
|
String value;
|
||||||
|
public:
|
||||||
|
Item_func_srid(Item *a): Item_int_func(a) {}
|
||||||
|
longlong val_int();
|
||||||
|
const char *func_name() const { return "srid"; }
|
||||||
|
void fix_length_and_dec() { max_length= 10; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_match_nl :public Item_func_match
|
class Item_func_match_nl :public Item_func_match
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -2511,8 +2511,17 @@ String *Item_func_geometry_from_text::val_str(String *str)
|
|||||||
String arg_val;
|
String arg_val;
|
||||||
String *wkt= args[0]->val_str(&arg_val);
|
String *wkt= args[0]->val_str(&arg_val);
|
||||||
GTextReadStream trs(wkt->ptr(), wkt->length());
|
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->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.create_from_wkt(&trs, str, 0))))
|
||||||
return 0;
|
return 0;
|
||||||
return str;
|
return str;
|
||||||
@ -2525,14 +2534,46 @@ void Item_func_geometry_from_text::fix_length_and_dec()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 *Item_func_as_text::val_str(String *str)
|
||||||
{
|
{
|
||||||
String arg_val;
|
String arg_val;
|
||||||
String *wkt = args[0]->val_str(&arg_val);
|
String *swkb= args[0]->val_str(&arg_val);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
if ((null_value= (args[0]->null_value ||
|
if ((null_value= (args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkt->ptr(),wkt->length()))))
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE))))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
str->length(0);
|
str->length(0);
|
||||||
@ -2550,11 +2591,12 @@ void Item_func_as_text::fix_length_and_dec()
|
|||||||
|
|
||||||
String *Item_func_geometry_type::val_str(String *str)
|
String *Item_func_geometry_type::val_str(String *str)
|
||||||
{
|
{
|
||||||
String *wkt = args[0]->val_str(str);
|
String *swkb= args[0]->val_str(str);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
if ((null_value= (args[0]->null_value ||
|
if ((null_value= (args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkt->ptr(),wkt->length()))))
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE))))
|
||||||
return 0;
|
return 0;
|
||||||
str->copy(geom.get_class_info()->m_name,
|
str->copy(geom.get_class_info()->m_name,
|
||||||
strlen(geom.get_class_info()->m_name),
|
strlen(geom.get_class_info()->m_name),
|
||||||
@ -2569,10 +2611,15 @@ String *Item_func_envelope::val_str(String *str)
|
|||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
if ((null_value= args[0]->null_value ||
|
if ((null_value= args[0]->null_value ||
|
||||||
geom.create_from_wkb(res->ptr(),res->length())))
|
geom.create_from_wkb(res->ptr() + SRID_SIZE,
|
||||||
|
res->length() - SRID_SIZE)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
uint32 srid= uint4korr(res->ptr());
|
||||||
|
if (res->reserve(SRID_SIZE, 512))
|
||||||
|
return 0;
|
||||||
res->length(0);
|
res->length(0);
|
||||||
|
res->q_append(srid);
|
||||||
return (null_value= geom.envelope(res)) ? 0 : res;
|
return (null_value= geom.envelope(res)) ? 0 : res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2580,15 +2627,22 @@ String *Item_func_envelope::val_str(String *str)
|
|||||||
String *Item_func_centroid::val_str(String *str)
|
String *Item_func_centroid::val_str(String *str)
|
||||||
{
|
{
|
||||||
String arg_val;
|
String arg_val;
|
||||||
String *wkb = args[0]->val_str(&arg_val);
|
String *swkb= args[0]->val_str(&arg_val);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
null_value = args[0]->null_value ||
|
if ((null_value= args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
!GEOM_METHOD_PRESENT(geom,centroid) ||
|
swkb->length() - SRID_SIZE) ||
|
||||||
geom.centroid(str);
|
!GEOM_METHOD_PRESENT(geom, centroid)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return null_value ? 0: str;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2599,15 +2653,20 @@ String *Item_func_centroid::val_str(String *str)
|
|||||||
String *Item_func_spatial_decomp::val_str(String *str)
|
String *Item_func_spatial_decomp::val_str(String *str)
|
||||||
{
|
{
|
||||||
String arg_val;
|
String arg_val;
|
||||||
String *wkb = args[0]->val_str(&arg_val);
|
String *swkb= args[0]->val_str(&arg_val);
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
if ((null_value= (args[0]->null_value ||
|
if ((null_value= (args[0]->null_value ||
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()))))
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
|
swkb->length() - SRID_SIZE))))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
null_value= 1;
|
null_value= 1;
|
||||||
|
if (str->reserve(SRID_SIZE, 512))
|
||||||
|
return 0;
|
||||||
str->length(0);
|
str->length(0);
|
||||||
|
uint32 srid= uint4korr(swkb->ptr());
|
||||||
|
str->q_append(srid);
|
||||||
switch(decomp_func)
|
switch(decomp_func)
|
||||||
{
|
{
|
||||||
case SP_STARTPOINT:
|
case SP_STARTPOINT:
|
||||||
@ -2638,28 +2697,30 @@ ret:
|
|||||||
String *Item_func_spatial_decomp_n::val_str(String *str)
|
String *Item_func_spatial_decomp_n::val_str(String *str)
|
||||||
{
|
{
|
||||||
String arg_val;
|
String arg_val;
|
||||||
String *wkb = args[0]->val_str(&arg_val);
|
String *swkb= args[0]->val_str(&arg_val);
|
||||||
long n= (long) args[1]->val_int();
|
long n= (long) args[1]->val_int();
|
||||||
Geometry geom;
|
Geometry geom;
|
||||||
|
|
||||||
if ((null_value = (args[0]->null_value ||
|
if ((null_value= (args[0]->null_value || args[1]->null_value ||
|
||||||
args[1]->null_value ||
|
geom.create_from_wkb(swkb->ptr() + SRID_SIZE,
|
||||||
geom.create_from_wkb(wkb->ptr(),wkb->length()) )))
|
swkb->length() - SRID_SIZE))))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
null_value= 1;
|
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)
|
switch(decomp_func_n)
|
||||||
{
|
{
|
||||||
case SP_POINTN:
|
case SP_POINTN:
|
||||||
if (!GEOM_METHOD_PRESENT(geom,point_n) ||
|
if (!GEOM_METHOD_PRESENT(geom,point_n) || geom.point_n(n,str))
|
||||||
geom.point_n(n,str))
|
|
||||||
goto ret;
|
goto ret;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SP_GEOMETRYN:
|
case SP_GEOMETRYN:
|
||||||
if (!GEOM_METHOD_PRESENT(geom,geometry_n) ||
|
if (!GEOM_METHOD_PRESENT(geom,geometry_n) || geom.geometry_n(n,str))
|
||||||
geom.geometry_n(n,str))
|
|
||||||
goto ret;
|
goto ret;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2727,7 +2788,7 @@ String *Item_func_spatial_collection::val_str(String *str)
|
|||||||
null_value= 1;
|
null_value= 1;
|
||||||
|
|
||||||
str->length(0);
|
str->length(0);
|
||||||
if (str->reserve(9,512))
|
if (str->reserve(1 + 4 + 4, 512))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
str->q_append((char) Geometry::wkbNDR);
|
str->q_append((char) Geometry::wkbNDR);
|
||||||
@ -2747,7 +2808,7 @@ String *Item_func_spatial_collection::val_str(String *str)
|
|||||||
any checkings for item types, so just copy them
|
any checkings for item types, so just copy them
|
||||||
into target collection
|
into target collection
|
||||||
*/
|
*/
|
||||||
if ((null_value=(str->reserve(res->length(),512))))
|
if ((null_value= str->reserve(res->length(), 512)))
|
||||||
goto ret;
|
goto ret;
|
||||||
|
|
||||||
str->q_append(res->ptr(), res->length());
|
str->q_append(res->ptr(), res->length());
|
||||||
|
@ -632,15 +632,28 @@ public:
|
|||||||
Spatial functions
|
Spatial functions
|
||||||
********************************************************/
|
********************************************************/
|
||||||
|
|
||||||
|
#define SRID_SIZE sizeof(uint32)
|
||||||
|
|
||||||
class Item_func_geometry_from_text :public Item_str_func
|
class Item_func_geometry_from_text :public Item_str_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Item_func_geometry_from_text(Item *a) :Item_str_func(a) {}
|
Item_func_geometry_from_text(Item *a) :Item_str_func(a) {}
|
||||||
|
Item_func_geometry_from_text(Item *a, Item *srid) :Item_str_func(a, srid) {}
|
||||||
const char *func_name() const { return "geometryfromtext"; }
|
const char *func_name() const { return "geometryfromtext"; }
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec();
|
void fix_length_and_dec();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Item_func_geometry_from_wkb: public Item_str_func
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Item_func_geometry_from_wkb(Item *a) :Item_str_func(a) {}
|
||||||
|
Item_func_geometry_from_wkb(Item *a, Item *srid) :Item_str_func(a, srid) {}
|
||||||
|
const char *func_name() const { return "geometryfromwkb"; }
|
||||||
|
String *val_str(String *);
|
||||||
|
void fix_length_and_dec();
|
||||||
|
};
|
||||||
|
|
||||||
class Item_func_as_text :public Item_str_func
|
class Item_func_as_text :public Item_str_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -684,6 +697,7 @@ class Item_func_point :public Item_str_func
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Item_func_point(Item *a, Item *b) :Item_str_func(a, b) {}
|
Item_func_point(Item *a, Item *b) :Item_str_func(a, b) {}
|
||||||
|
Item_func_point(Item *a, Item *b, Item *srid) :Item_str_func(a, b, srid) {}
|
||||||
const char *func_name() const { return "point"; }
|
const char *func_name() const { return "point"; }
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;}
|
void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;}
|
||||||
|
@ -495,6 +495,8 @@ static SYMBOL sql_functions[] = {
|
|||||||
{ "GEOMCOLLFROMTEXT", SYM(GEOMCOLLFROMTEXT),0,0},
|
{ "GEOMCOLLFROMTEXT", SYM(GEOMCOLLFROMTEXT),0,0},
|
||||||
{ "GEOMFROMTEXT", SYM(GEOMFROMTEXT),0,0},
|
{ "GEOMFROMTEXT", SYM(GEOMFROMTEXT),0,0},
|
||||||
{ "GEOMETRYFROMTEXT", SYM(GEOMFROMTEXT),0,0},
|
{ "GEOMETRYFROMTEXT", SYM(GEOMFROMTEXT),0,0},
|
||||||
|
{ "GEOMFROMWKB", SYM(GEOMFROMWKB),0,0},
|
||||||
|
{ "GEOMETRYFROMWKB", SYM(GEOMFROMWKB),0,0},
|
||||||
{ "GLENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_glength)},
|
{ "GLENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_glength)},
|
||||||
{ "GREATEST", SYM(GREATEST_SYM),0,0},
|
{ "GREATEST", SYM(GREATEST_SYM),0,0},
|
||||||
{ "GROUP_UNIQUE_USERS", SYM(GROUP_UNIQUE_USERS),0,0},
|
{ "GROUP_UNIQUE_USERS", SYM(GROUP_UNIQUE_USERS),0,0},
|
||||||
@ -578,6 +580,7 @@ static SYMBOL sql_functions[] = {
|
|||||||
{ "SOUNDEX", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_soundex)},
|
{ "SOUNDEX", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_soundex)},
|
||||||
{ "SPACE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_space)},
|
{ "SPACE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_space)},
|
||||||
{ "SQRT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sqrt)},
|
{ "SQRT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sqrt)},
|
||||||
|
{ "SRID", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_srid)},
|
||||||
{ "STARTPOINT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_startpoint)},
|
{ "STARTPOINT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_startpoint)},
|
||||||
{ "STD", SYM(STD_SYM),0,0},
|
{ "STD", SYM(STD_SYM),0,0},
|
||||||
{ "STDDEV", SYM(STD_SYM),0,0},
|
{ "STDDEV", SYM(STD_SYM),0,0},
|
||||||
|
@ -80,13 +80,13 @@ int Geometry::create_from_wkb(const char *data, uint32 data_len)
|
|||||||
|
|
||||||
if (data_len < 1 + 4)
|
if (data_len < 1 + 4)
|
||||||
return 1;
|
return 1;
|
||||||
data += sizeof(char);
|
data++;
|
||||||
|
|
||||||
//FIXME: check byte ordering
|
//FIXME: check byte ordering
|
||||||
geom_type= uint4korr(data);
|
geom_type= uint4korr(data);
|
||||||
data+= 4;
|
data+= 4;
|
||||||
m_vmt= find_class(geom_type);
|
m_vmt= find_class(geom_type);
|
||||||
if (!m_vmt) return -1;
|
if (!m_vmt)
|
||||||
|
return -1;
|
||||||
m_data= data;
|
m_data= data;
|
||||||
m_data_end= data + data_len;
|
m_data_end= data + data_len;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -225,7 +225,6 @@ public:
|
|||||||
wkbNDR = 1 /* Little Endian */
|
wkbNDR = 1 /* Little Endian */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class GClassInfo
|
class GClassInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -458,6 +458,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
|
|||||||
%token FROM_UNIXTIME
|
%token FROM_UNIXTIME
|
||||||
%token GEOMCOLLFROMTEXT
|
%token GEOMCOLLFROMTEXT
|
||||||
%token GEOMFROMTEXT
|
%token GEOMFROMTEXT
|
||||||
|
%token GEOMFROMWKB
|
||||||
%token GEOMETRYCOLLECTION
|
%token GEOMETRYCOLLECTION
|
||||||
%token GROUP_UNIQUE_USERS
|
%token GROUP_UNIQUE_USERS
|
||||||
%token HOUR_MINUTE_SYM
|
%token HOUR_MINUTE_SYM
|
||||||
@ -2256,7 +2257,11 @@ simple_expr:
|
|||||||
| GEOMFROMTEXT '(' expr ')'
|
| GEOMFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| GEOMFROMTEXT '(' expr ',' expr ')'
|
| GEOMFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
|
| GEOMFROMWKB '(' expr ')'
|
||||||
|
{ $$= new Item_func_geometry_from_wkb($3); }
|
||||||
|
| GEOMFROMWKB '(' expr ',' expr ')'
|
||||||
|
{ $$= new Item_func_geometry_from_wkb($3, $5); }
|
||||||
| GEOMETRYCOLLECTION '(' expr_list ')'
|
| GEOMETRYCOLLECTION '(' expr_list ')'
|
||||||
{ $$= new Item_func_spatial_collection(* $3,
|
{ $$= new Item_func_spatial_collection(* $3,
|
||||||
Geometry::wkbGeometryCollection,
|
Geometry::wkbGeometryCollection,
|
||||||
@ -2302,7 +2307,7 @@ simple_expr:
|
|||||||
| GEOMCOLLFROMTEXT '(' expr ')'
|
| GEOMCOLLFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| GEOMCOLLFROMTEXT '(' expr ',' expr ')'
|
| GEOMCOLLFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| GREATEST_SYM '(' expr ',' expr_list ')'
|
| GREATEST_SYM '(' expr ',' expr_list ')'
|
||||||
{ $5->push_front($3); $$= new Item_func_max(*$5); }
|
{ $5->push_front($3); $$= new Item_func_max(*$5); }
|
||||||
| LEAST_SYM '(' expr ',' expr_list ')'
|
| LEAST_SYM '(' expr ',' expr_list ')'
|
||||||
@ -2314,7 +2319,7 @@ simple_expr:
|
|||||||
| LINEFROMTEXT '(' expr ')'
|
| LINEFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| LINEFROMTEXT '(' expr ',' expr ')'
|
| LINEFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| MASTER_POS_WAIT '(' expr ',' expr ')'
|
| MASTER_POS_WAIT '(' expr ',' expr ')'
|
||||||
{
|
{
|
||||||
$$= new Item_master_pos_wait($3, $5);
|
$$= new Item_master_pos_wait($3, $5);
|
||||||
@ -2337,15 +2342,15 @@ simple_expr:
|
|||||||
| MLINEFROMTEXT '(' expr ')'
|
| MLINEFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| MLINEFROMTEXT '(' expr ',' expr ')'
|
| MLINEFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| MPOINTFROMTEXT '(' expr ')'
|
| MPOINTFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| MPOINTFROMTEXT '(' expr ',' expr ')'
|
| MPOINTFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| MPOLYFROMTEXT '(' expr ')'
|
| MPOLYFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| MPOLYFROMTEXT '(' expr ',' expr ')'
|
| MPOLYFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| MULTIPOINT '(' expr_list ')'
|
| MULTIPOINT '(' expr_list ')'
|
||||||
{ $$= new Item_func_spatial_collection(* $3,
|
{ $$= new Item_func_spatial_collection(* $3,
|
||||||
Geometry::wkbMultiPoint, Geometry::wkbPoint); }
|
Geometry::wkbMultiPoint, Geometry::wkbPoint); }
|
||||||
@ -2365,11 +2370,11 @@ simple_expr:
|
|||||||
| POINTFROMTEXT '(' expr ')'
|
| POINTFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| POINTFROMTEXT '(' expr ',' expr ')'
|
| POINTFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| POLYFROMTEXT '(' expr ')'
|
| POLYFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| POLYFROMTEXT '(' expr ',' expr ')'
|
| POLYFROMTEXT '(' expr ',' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3, $5); }
|
||||||
| POLYGON '(' expr_list ')'
|
| POLYGON '(' expr_list ')'
|
||||||
{ $$= new Item_func_spatial_collection(* $3,
|
{ $$= new Item_func_spatial_collection(* $3,
|
||||||
Geometry::wkbPolygon, Geometry::wkbLineString); }
|
Geometry::wkbPolygon, Geometry::wkbLineString); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user