Loading mysql-test/r/gis.result +7 −0 Original line number Diff line number Diff line Loading @@ -485,3 +485,10 @@ MBRContains(GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a); AsText(a) POINT(1 1) drop table t1; create table t1 select POINT(1,3); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `POINT(1,3)` longblob NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; mysql-test/t/gis.test +4 −0 Original line number Diff line number Diff line Loading @@ -190,3 +190,7 @@ select AsText(a) from t1 where and MBRContains(GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a); drop table t1; create table t1 select POINT(1,3); show create table t1; drop table t1; sql/item_geofunc.cc +15 −18 Original line number Diff line number Diff line Loading @@ -27,6 +27,13 @@ #include "sql_acl.h" #include <m_ctype.h> void Item_geometry_func::fix_length_and_dec() { collation.set(&my_charset_bin); decimals=0; max_length=MAX_BLOB_WIDTH; } String *Item_func_geometry_from_text::val_str(String *str) { Loading @@ -44,6 +51,7 @@ String *Item_func_geometry_from_text::val_str(String *str) if ((arg_count == 2) && !args[1]->null_value) srid= (uint32)args[1]->val_int(); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) return 0; str->length(0); Loading @@ -54,12 +62,6 @@ String *Item_func_geometry_from_text::val_str(String *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) { DBUG_ASSERT(fixed == 1); Loading @@ -71,6 +73,7 @@ String *Item_func_geometry_from_wkb::val_str(String *str) if ((arg_count == 2) && !args[1]->null_value) srid= (uint32)args[1]->val_int(); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) return 0; str->length(0); Loading @@ -84,12 +87,6 @@ String *Item_func_geometry_from_wkb::val_str(String *str) } void Item_func_geometry_from_wkb::fix_length_and_dec() { max_length=MAX_BLOB_WIDTH; } String *Item_func_as_wkt::val_str(String *str) { DBUG_ASSERT(fixed == 1); Loading Loading @@ -138,12 +135,6 @@ String *Item_func_as_wkb::val_str(String *str) } void Item_func_as_wkb::fix_length_and_dec() { max_length= MAX_BLOB_WIDTH; } String *Item_func_geometry_type::val_str(String *str) { DBUG_ASSERT(fixed == 1); Loading Loading @@ -180,6 +171,7 @@ String *Item_func_envelope::val_str(String *str) return 0; srid= uint4korr(swkb->ptr()); str->set_charset(&my_charset_bin); str->length(0); if (str->reserve(SRID_SIZE, 512)) return 0; Loading @@ -202,6 +194,7 @@ String *Item_func_centroid::val_str(String *str) swkb->length() - SRID_SIZE)))) return 0; str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) return 0; str->length(0); Loading Loading @@ -232,6 +225,7 @@ String *Item_func_spatial_decomp::val_str(String *str) return 0; srid= uint4korr(swkb->ptr()); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) goto err; str->length(0); Loading Loading @@ -279,6 +273,7 @@ String *Item_func_spatial_decomp_n::val_str(String *str) swkb->length() - SRID_SIZE))))) return 0; str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) goto err; srid= uint4korr(swkb->ptr()); Loading Loading @@ -333,6 +328,7 @@ String *Item_func_point::val_str(String *str) str->realloc(1 + 4 + SIZEOF_STORED_DOUBLE*2)))) return 0; str->set_charset(&my_charset_bin); str->length(0); str->q_append((char)Geometry::wkb_ndr); str->q_append((uint32)Geometry::wkb_point); Loading @@ -358,6 +354,7 @@ String *Item_func_spatial_collection::val_str(String *str) String arg_value; uint i; str->set_charset(&my_charset_bin); str->length(0); if (str->reserve(1 + 4 + 4, 512)) goto err; Loading sql/item_geofunc.h +32 −30 Original line number Diff line number Diff line Loading @@ -23,24 +23,33 @@ #pragma interface /* gcc class implementation */ #endif class Item_func_geometry_from_text: public Item_str_func class Item_geometry_func: public Item_str_func { public: 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) {} Item_geometry_func() :Item_str_func() {} Item_geometry_func(Item *a) :Item_str_func(a) {} Item_geometry_func(Item *a,Item *b) :Item_str_func(a,b) {} Item_geometry_func(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {} Item_geometry_func(List<Item> &list) :Item_str_func(list) {} void fix_length_and_dec(); }; class Item_func_geometry_from_text: public Item_geometry_func { public: Item_func_geometry_from_text(Item *a) :Item_geometry_func(a) {} Item_func_geometry_from_text(Item *a, Item *srid) :Item_geometry_func(a, srid) {} const char *func_name() const { return "geometryfromtext"; } String *val_str(String *); void fix_length_and_dec(); }; class Item_func_geometry_from_wkb: public Item_str_func class Item_func_geometry_from_wkb: public Item_geometry_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) {} Item_func_geometry_from_wkb(Item *a): Item_geometry_func(a) {} Item_func_geometry_from_wkb(Item *a, Item *srid): Item_geometry_func(a, srid) {} const char *func_name() const { return "geometryfromwkb"; } String *val_str(String *); void fix_length_and_dec(); }; class Item_func_as_wkt: public Item_str_func Loading @@ -52,13 +61,12 @@ class Item_func_as_wkt: public Item_str_func void fix_length_and_dec(); }; class Item_func_as_wkb: public Item_str_func class Item_func_as_wkb: public Item_geometry_func { public: Item_func_as_wkb(Item *a): Item_str_func(a) {} Item_func_as_wkb(Item *a): Item_geometry_func(a) {} const char *func_name() const { return "aswkb"; } String *val_str(String *); void fix_length_and_dec(); }; class Item_func_geometry_type: public Item_str_func Loading @@ -73,40 +81,37 @@ class Item_func_geometry_type: public Item_str_func }; }; class Item_func_centroid: public Item_str_func class Item_func_centroid: public Item_geometry_func { public: Item_func_centroid(Item *a): Item_str_func(a) {} Item_func_centroid(Item *a): Item_geometry_func(a) {} const char *func_name() const { return "centroid"; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_envelope: public Item_str_func class Item_func_envelope: public Item_geometry_func { public: Item_func_envelope(Item *a): Item_str_func(a) {} Item_func_envelope(Item *a): Item_geometry_func(a) {} const char *func_name() const { return "envelope"; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_point: public Item_str_func class Item_func_point: public Item_geometry_func { public: 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) {} Item_func_point(Item *a, Item *b): Item_geometry_func(a, b) {} Item_func_point(Item *a, Item *b, Item *srid): Item_geometry_func(a, b, srid) {} const char *func_name() const { return "point"; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_spatial_decomp: public Item_str_func class Item_func_spatial_decomp: public Item_geometry_func { enum Functype decomp_func; public: Item_func_spatial_decomp(Item *a, Item_func::Functype ft) : Item_str_func(a) { decomp_func = ft; } Item_geometry_func(a) { decomp_func = ft; } const char *func_name() const { switch (decomp_func) Loading @@ -123,15 +128,14 @@ class Item_func_spatial_decomp: public Item_str_func } } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_spatial_decomp_n: public Item_str_func class Item_func_spatial_decomp_n: public Item_geometry_func { enum Functype decomp_func_n; public: Item_func_spatial_decomp_n(Item *a, Item *b, Item_func::Functype ft): Item_str_func(a, b) { decomp_func_n = ft; } Item_geometry_func(a, b) { decomp_func_n = ft; } const char *func_name() const { switch (decomp_func_n) Loading @@ -148,10 +152,9 @@ class Item_func_spatial_decomp_n: public Item_str_func } } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_spatial_collection: public Item_str_func class Item_func_spatial_collection: public Item_geometry_func { String tmp_value; enum Geometry::wkbType coll_type; Loading @@ -159,13 +162,12 @@ class Item_func_spatial_collection: public Item_str_func public: Item_func_spatial_collection( List<Item> &list, enum Geometry::wkbType ct, enum Geometry::wkbType it): Item_str_func(list) Item_geometry_func(list) { coll_type=ct; item_type=it; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} const char *func_name() const { return "multipoint"; } }; Loading Loading
mysql-test/r/gis.result +7 −0 Original line number Diff line number Diff line Loading @@ -485,3 +485,10 @@ MBRContains(GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a); AsText(a) POINT(1 1) drop table t1; create table t1 select POINT(1,3); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `POINT(1,3)` longblob NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1;
mysql-test/t/gis.test +4 −0 Original line number Diff line number Diff line Loading @@ -190,3 +190,7 @@ select AsText(a) from t1 where and MBRContains(GeomFromText('Polygon((0 0, 0 7, 7 7, 7 0, 0 0))'), a); drop table t1; create table t1 select POINT(1,3); show create table t1; drop table t1;
sql/item_geofunc.cc +15 −18 Original line number Diff line number Diff line Loading @@ -27,6 +27,13 @@ #include "sql_acl.h" #include <m_ctype.h> void Item_geometry_func::fix_length_and_dec() { collation.set(&my_charset_bin); decimals=0; max_length=MAX_BLOB_WIDTH; } String *Item_func_geometry_from_text::val_str(String *str) { Loading @@ -44,6 +51,7 @@ String *Item_func_geometry_from_text::val_str(String *str) if ((arg_count == 2) && !args[1]->null_value) srid= (uint32)args[1]->val_int(); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) return 0; str->length(0); Loading @@ -54,12 +62,6 @@ String *Item_func_geometry_from_text::val_str(String *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) { DBUG_ASSERT(fixed == 1); Loading @@ -71,6 +73,7 @@ String *Item_func_geometry_from_wkb::val_str(String *str) if ((arg_count == 2) && !args[1]->null_value) srid= (uint32)args[1]->val_int(); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) return 0; str->length(0); Loading @@ -84,12 +87,6 @@ String *Item_func_geometry_from_wkb::val_str(String *str) } void Item_func_geometry_from_wkb::fix_length_and_dec() { max_length=MAX_BLOB_WIDTH; } String *Item_func_as_wkt::val_str(String *str) { DBUG_ASSERT(fixed == 1); Loading Loading @@ -138,12 +135,6 @@ String *Item_func_as_wkb::val_str(String *str) } void Item_func_as_wkb::fix_length_and_dec() { max_length= MAX_BLOB_WIDTH; } String *Item_func_geometry_type::val_str(String *str) { DBUG_ASSERT(fixed == 1); Loading Loading @@ -180,6 +171,7 @@ String *Item_func_envelope::val_str(String *str) return 0; srid= uint4korr(swkb->ptr()); str->set_charset(&my_charset_bin); str->length(0); if (str->reserve(SRID_SIZE, 512)) return 0; Loading @@ -202,6 +194,7 @@ String *Item_func_centroid::val_str(String *str) swkb->length() - SRID_SIZE)))) return 0; str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) return 0; str->length(0); Loading Loading @@ -232,6 +225,7 @@ String *Item_func_spatial_decomp::val_str(String *str) return 0; srid= uint4korr(swkb->ptr()); str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) goto err; str->length(0); Loading Loading @@ -279,6 +273,7 @@ String *Item_func_spatial_decomp_n::val_str(String *str) swkb->length() - SRID_SIZE))))) return 0; str->set_charset(&my_charset_bin); if (str->reserve(SRID_SIZE, 512)) goto err; srid= uint4korr(swkb->ptr()); Loading Loading @@ -333,6 +328,7 @@ String *Item_func_point::val_str(String *str) str->realloc(1 + 4 + SIZEOF_STORED_DOUBLE*2)))) return 0; str->set_charset(&my_charset_bin); str->length(0); str->q_append((char)Geometry::wkb_ndr); str->q_append((uint32)Geometry::wkb_point); Loading @@ -358,6 +354,7 @@ String *Item_func_spatial_collection::val_str(String *str) String arg_value; uint i; str->set_charset(&my_charset_bin); str->length(0); if (str->reserve(1 + 4 + 4, 512)) goto err; Loading
sql/item_geofunc.h +32 −30 Original line number Diff line number Diff line Loading @@ -23,24 +23,33 @@ #pragma interface /* gcc class implementation */ #endif class Item_func_geometry_from_text: public Item_str_func class Item_geometry_func: public Item_str_func { public: 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) {} Item_geometry_func() :Item_str_func() {} Item_geometry_func(Item *a) :Item_str_func(a) {} Item_geometry_func(Item *a,Item *b) :Item_str_func(a,b) {} Item_geometry_func(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {} Item_geometry_func(List<Item> &list) :Item_str_func(list) {} void fix_length_and_dec(); }; class Item_func_geometry_from_text: public Item_geometry_func { public: Item_func_geometry_from_text(Item *a) :Item_geometry_func(a) {} Item_func_geometry_from_text(Item *a, Item *srid) :Item_geometry_func(a, srid) {} const char *func_name() const { return "geometryfromtext"; } String *val_str(String *); void fix_length_and_dec(); }; class Item_func_geometry_from_wkb: public Item_str_func class Item_func_geometry_from_wkb: public Item_geometry_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) {} Item_func_geometry_from_wkb(Item *a): Item_geometry_func(a) {} Item_func_geometry_from_wkb(Item *a, Item *srid): Item_geometry_func(a, srid) {} const char *func_name() const { return "geometryfromwkb"; } String *val_str(String *); void fix_length_and_dec(); }; class Item_func_as_wkt: public Item_str_func Loading @@ -52,13 +61,12 @@ class Item_func_as_wkt: public Item_str_func void fix_length_and_dec(); }; class Item_func_as_wkb: public Item_str_func class Item_func_as_wkb: public Item_geometry_func { public: Item_func_as_wkb(Item *a): Item_str_func(a) {} Item_func_as_wkb(Item *a): Item_geometry_func(a) {} const char *func_name() const { return "aswkb"; } String *val_str(String *); void fix_length_and_dec(); }; class Item_func_geometry_type: public Item_str_func Loading @@ -73,40 +81,37 @@ class Item_func_geometry_type: public Item_str_func }; }; class Item_func_centroid: public Item_str_func class Item_func_centroid: public Item_geometry_func { public: Item_func_centroid(Item *a): Item_str_func(a) {} Item_func_centroid(Item *a): Item_geometry_func(a) {} const char *func_name() const { return "centroid"; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_envelope: public Item_str_func class Item_func_envelope: public Item_geometry_func { public: Item_func_envelope(Item *a): Item_str_func(a) {} Item_func_envelope(Item *a): Item_geometry_func(a) {} const char *func_name() const { return "envelope"; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_point: public Item_str_func class Item_func_point: public Item_geometry_func { public: 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) {} Item_func_point(Item *a, Item *b): Item_geometry_func(a, b) {} Item_func_point(Item *a, Item *b, Item *srid): Item_geometry_func(a, b, srid) {} const char *func_name() const { return "point"; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_spatial_decomp: public Item_str_func class Item_func_spatial_decomp: public Item_geometry_func { enum Functype decomp_func; public: Item_func_spatial_decomp(Item *a, Item_func::Functype ft) : Item_str_func(a) { decomp_func = ft; } Item_geometry_func(a) { decomp_func = ft; } const char *func_name() const { switch (decomp_func) Loading @@ -123,15 +128,14 @@ class Item_func_spatial_decomp: public Item_str_func } } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_spatial_decomp_n: public Item_str_func class Item_func_spatial_decomp_n: public Item_geometry_func { enum Functype decomp_func_n; public: Item_func_spatial_decomp_n(Item *a, Item *b, Item_func::Functype ft): Item_str_func(a, b) { decomp_func_n = ft; } Item_geometry_func(a, b) { decomp_func_n = ft; } const char *func_name() const { switch (decomp_func_n) Loading @@ -148,10 +152,9 @@ class Item_func_spatial_decomp_n: public Item_str_func } } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} }; class Item_func_spatial_collection: public Item_str_func class Item_func_spatial_collection: public Item_geometry_func { String tmp_value; enum Geometry::wkbType coll_type; Loading @@ -159,13 +162,12 @@ class Item_func_spatial_collection: public Item_str_func public: Item_func_spatial_collection( List<Item> &list, enum Geometry::wkbType ct, enum Geometry::wkbType it): Item_str_func(list) Item_geometry_func(list) { coll_type=ct; item_type=it; } String *val_str(String *); void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} const char *func_name() const { return "multipoint"; } }; Loading