Commit 126ea49d authored by unknown's avatar unknown
Browse files

Additional fix for bug #5136 (Geometry object is corrupted when queried)

CREATE TABLE t1 SELECT POINT(1,2); fixed


mysql-test/r/gis.result:
  Appropriate test result
mysql-test/t/gis.test:
  test case
sql/item_geofunc.cc:
  Item_geometry_func::fix_lengths_and_dec implementation
  several fix_length_and_dec's not needed now
sql/item_geofunc.h:
  Item_geometry_func class presented
parent 871c5c01
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -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;
+7 −18
Original line number Diff line number Diff line
@@ -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)
{
@@ -55,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);
@@ -86,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);
@@ -140,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);
+32 −30
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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)
@@ -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)
@@ -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; 
@@ -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"; }
};