Merge mysql.com:/home/ram/work/b26038/b26038.4.1
into mysql.com:/home/ram/work/b26038/b26038.5.0 sql/item_geofunc.cc: Auto merged sql/spatial.cc: Auto merged sql/spatial.h: Auto merged mysql-test/r/gis.result: will be fixed after the merging. mysql-test/t/gis.test: merging, the result will be fixed in an after-merge fix CS sql/item_geofunc.h: merging
This commit is contained in:
commit
6842f6b12a
@ -389,7 +389,41 @@ load data infile '../std_data_ln/bad_gis_data.dat' into table t1;
|
|||||||
alter table t1 enable keys;
|
alter table t1 enable keys;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
#
|
||||||
|
# Bug #26038: is null and bad data
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (a int, b blob);
|
||||||
|
insert into t1 values (1, ''), (2, NULL), (3, '1');
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
select
|
||||||
|
geometryfromtext(b) IS NULL, geometryfromwkb(b) IS NULL, astext(b) IS NULL,
|
||||||
|
aswkb(b) IS NULL, geometrytype(b) IS NULL, centroid(b) IS NULL,
|
||||||
|
envelope(b) IS NULL, startpoint(b) IS NULL, endpoint(b) IS NULL,
|
||||||
|
exteriorring(b) IS NULL, pointn(b, 1) IS NULL, geometryn(b, 1) IS NULL,
|
||||||
|
interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, isempty(b) IS NULL,
|
||||||
|
issimple(b) IS NULL, isclosed(b) IS NULL, dimension(b) IS NULL,
|
||||||
|
numgeometries(b) IS NULL, numinteriorrings(b) IS NULL, numpoints(b) IS NULL,
|
||||||
|
area(b) IS NULL, glength(b) IS NULL, srid(b) IS NULL, x(b) IS NULL,
|
||||||
|
y(b) IS NULL
|
||||||
|
from t1;
|
||||||
|
|
||||||
|
select
|
||||||
|
within(b, b) IS NULL, contains(b, b) IS NULL, overlaps(b, b) IS NULL,
|
||||||
|
equals(b, b) IS NULL, disjoint(b, b) IS NULL, touches(b, b) IS NULL,
|
||||||
|
intersects(b, b) IS NULL, crosses(b, b) IS NULL
|
||||||
|
from t1;
|
||||||
|
|
||||||
|
select
|
||||||
|
point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
|
||||||
|
multilinestring(b) IS NULL, multipolygon(b) IS NULL,
|
||||||
|
geometrycollection(b) IS NULL
|
||||||
|
from t1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #12281 (Geometry: crash in trigger)
|
# Bug #12281 (Geometry: crash in trigger)
|
||||||
|
@ -35,6 +35,7 @@ void Item_geometry_func::fix_length_and_dec()
|
|||||||
collation.set(&my_charset_bin);
|
collation.set(&my_charset_bin);
|
||||||
decimals=0;
|
decimals=0;
|
||||||
max_length=MAX_BLOB_WIDTH;
|
max_length=MAX_BLOB_WIDTH;
|
||||||
|
maybe_null= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item_geometry_func::get_geometry_type() const
|
int Item_geometry_func::get_geometry_type() const
|
||||||
@ -121,6 +122,7 @@ String *Item_func_as_wkt::val_str(String *str)
|
|||||||
void Item_func_as_wkt::fix_length_and_dec()
|
void Item_func_as_wkt::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
max_length=MAX_BLOB_WIDTH;
|
max_length=MAX_BLOB_WIDTH;
|
||||||
|
maybe_null= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -386,7 +388,8 @@ String *Item_func_spatial_collection::val_str(String *str)
|
|||||||
for (i= 0; i < arg_count; ++i)
|
for (i= 0; i < arg_count; ++i)
|
||||||
{
|
{
|
||||||
String *res= args[i]->val_str(&arg_value);
|
String *res= args[i]->val_str(&arg_value);
|
||||||
if (args[i]->null_value)
|
uint32 len;
|
||||||
|
if (args[i]->null_value || ((len= res->length()) < WKB_HEADER_SIZE))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (coll_type == Geometry::wkb_geometrycollection)
|
if (coll_type == Geometry::wkb_geometrycollection)
|
||||||
@ -395,13 +398,12 @@ String *Item_func_spatial_collection::val_str(String *str)
|
|||||||
In the case of GeometryCollection we don't need any checkings
|
In the case of GeometryCollection we don't need any checkings
|
||||||
for item types, so just copy them into target collection
|
for item types, so just copy them into target collection
|
||||||
*/
|
*/
|
||||||
if (str->append(res->ptr(), res->length(), (uint32) 512))
|
if (str->append(res->ptr(), len, (uint32) 512))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
enum Geometry::wkbType wkb_type;
|
enum Geometry::wkbType wkb_type;
|
||||||
uint32 len=res->length();
|
|
||||||
const char *data= res->ptr() + 1;
|
const char *data= res->ptr() + 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -409,8 +411,6 @@ String *Item_func_spatial_collection::val_str(String *str)
|
|||||||
are of specific type, let's do this checking now
|
are of specific type, let's do this checking now
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (len < 5)
|
|
||||||
goto err;
|
|
||||||
wkb_type= (Geometry::wkbType) uint4korr(data);
|
wkb_type= (Geometry::wkbType) uint4korr(data);
|
||||||
data+= 4;
|
data+= 4;
|
||||||
len-= 5;
|
len-= 5;
|
||||||
@ -532,9 +532,13 @@ longlong Item_func_spatial_rel::val_int()
|
|||||||
longlong Item_func_isempty::val_int()
|
longlong Item_func_isempty::val_int()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
String tmp;
|
String tmp;
|
||||||
null_value=0;
|
String *swkb= args[0]->val_str(&tmp);
|
||||||
return args[0]->null_value ? 1 : 0;
|
Geometry_buffer buffer;
|
||||||
|
|
||||||
|
null_value= args[0]->null_value ||
|
||||||
|
!(Geometry::construct(&buffer, swkb->ptr(), swkb->length()));
|
||||||
|
return null_value ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -542,10 +546,11 @@ longlong Item_func_issimple::val_int()
|
|||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
String tmp;
|
String tmp;
|
||||||
String *wkb=args[0]->val_str(&tmp);
|
String *swkb= args[0]->val_str(&tmp);
|
||||||
|
Geometry_buffer buffer;
|
||||||
if ((null_value= (!wkb || args[0]->null_value)))
|
|
||||||
return 0;
|
null_value= args[0]->null_value ||
|
||||||
|
!(Geometry::construct(&buffer, swkb->ptr(), swkb->length()));
|
||||||
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */
|
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ public:
|
|||||||
enum_field_types field_type() const { return MYSQL_TYPE_GEOMETRY; }
|
enum_field_types field_type() const { return MYSQL_TYPE_GEOMETRY; }
|
||||||
Field *tmp_table_field(TABLE *t_arg);
|
Field *tmp_table_field(TABLE *t_arg);
|
||||||
virtual int get_geometry_type() const;
|
virtual int get_geometry_type() const;
|
||||||
|
bool is_null() { (void) val_int(); return null_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_geometry_from_text: public Item_geometry_func
|
class Item_func_geometry_from_text: public Item_geometry_func
|
||||||
@ -81,6 +82,7 @@ public:
|
|||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{
|
{
|
||||||
max_length=20; // "GeometryCollection" is the most long
|
max_length=20; // "GeometryCollection" is the most long
|
||||||
|
maybe_null= 1;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -225,6 +227,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
void print(String *str) { Item_func::print(str); }
|
void print(String *str) { Item_func::print(str); }
|
||||||
|
void fix_length_and_dec() { maybe_null= 1; }
|
||||||
|
bool is_null() { (void) val_int(); return null_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_isempty: public Item_bool_func
|
class Item_func_isempty: public Item_bool_func
|
||||||
@ -234,6 +238,7 @@ public:
|
|||||||
longlong val_int();
|
longlong val_int();
|
||||||
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
||||||
const char *func_name() const { return "isempty"; }
|
const char *func_name() const { return "isempty"; }
|
||||||
|
void fix_length_and_dec() { maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_issimple: public Item_bool_func
|
class Item_func_issimple: public Item_bool_func
|
||||||
@ -243,6 +248,7 @@ public:
|
|||||||
longlong val_int();
|
longlong val_int();
|
||||||
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
||||||
const char *func_name() const { return "issimple"; }
|
const char *func_name() const { return "issimple"; }
|
||||||
|
void fix_length_and_dec() { maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_isclosed: public Item_bool_func
|
class Item_func_isclosed: public Item_bool_func
|
||||||
@ -252,6 +258,7 @@ public:
|
|||||||
longlong val_int();
|
longlong val_int();
|
||||||
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
|
||||||
const char *func_name() const { return "isclosed"; }
|
const char *func_name() const { return "isclosed"; }
|
||||||
|
void fix_length_and_dec() { maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_dimension: public Item_int_func
|
class Item_func_dimension: public Item_int_func
|
||||||
@ -261,7 +268,7 @@ public:
|
|||||||
Item_func_dimension(Item *a): Item_int_func(a) {}
|
Item_func_dimension(Item *a): Item_int_func(a) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
const char *func_name() const { return "dimension"; }
|
const char *func_name() const { return "dimension"; }
|
||||||
void fix_length_and_dec() { max_length=10; }
|
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_x: public Item_real_func
|
class Item_func_x: public Item_real_func
|
||||||
@ -271,6 +278,11 @@ public:
|
|||||||
Item_func_x(Item *a): Item_real_func(a) {}
|
Item_func_x(Item *a): Item_real_func(a) {}
|
||||||
double val_real();
|
double val_real();
|
||||||
const char *func_name() const { return "x"; }
|
const char *func_name() const { return "x"; }
|
||||||
|
void fix_length_and_dec()
|
||||||
|
{
|
||||||
|
Item_real_func::fix_length_and_dec();
|
||||||
|
maybe_null= 1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -281,6 +293,11 @@ public:
|
|||||||
Item_func_y(Item *a): Item_real_func(a) {}
|
Item_func_y(Item *a): Item_real_func(a) {}
|
||||||
double val_real();
|
double val_real();
|
||||||
const char *func_name() const { return "y"; }
|
const char *func_name() const { return "y"; }
|
||||||
|
void fix_length_and_dec()
|
||||||
|
{
|
||||||
|
Item_real_func::fix_length_and_dec();
|
||||||
|
maybe_null= 1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -291,7 +308,7 @@ public:
|
|||||||
Item_func_numgeometries(Item *a): Item_int_func(a) {}
|
Item_func_numgeometries(Item *a): Item_int_func(a) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
const char *func_name() const { return "numgeometries"; }
|
const char *func_name() const { return "numgeometries"; }
|
||||||
void fix_length_and_dec() { max_length=10; }
|
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -302,7 +319,7 @@ public:
|
|||||||
Item_func_numinteriorring(Item *a): Item_int_func(a) {}
|
Item_func_numinteriorring(Item *a): Item_int_func(a) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
const char *func_name() const { return "numinteriorrings"; }
|
const char *func_name() const { return "numinteriorrings"; }
|
||||||
void fix_length_and_dec() { max_length=10; }
|
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -313,7 +330,7 @@ public:
|
|||||||
Item_func_numpoints(Item *a): Item_int_func(a) {}
|
Item_func_numpoints(Item *a): Item_int_func(a) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
const char *func_name() const { return "numpoints"; }
|
const char *func_name() const { return "numpoints"; }
|
||||||
void fix_length_and_dec() { max_length=10; }
|
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -324,6 +341,11 @@ public:
|
|||||||
Item_func_area(Item *a): Item_real_func(a) {}
|
Item_func_area(Item *a): Item_real_func(a) {}
|
||||||
double val_real();
|
double val_real();
|
||||||
const char *func_name() const { return "area"; }
|
const char *func_name() const { return "area"; }
|
||||||
|
void fix_length_and_dec()
|
||||||
|
{
|
||||||
|
Item_real_func::fix_length_and_dec();
|
||||||
|
maybe_null= 1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -334,6 +356,11 @@ public:
|
|||||||
Item_func_glength(Item *a): Item_real_func(a) {}
|
Item_func_glength(Item *a): Item_real_func(a) {}
|
||||||
double val_real();
|
double val_real();
|
||||||
const char *func_name() const { return "glength"; }
|
const char *func_name() const { return "glength"; }
|
||||||
|
void fix_length_and_dec()
|
||||||
|
{
|
||||||
|
Item_real_func::fix_length_and_dec();
|
||||||
|
maybe_null= 1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -344,7 +371,7 @@ public:
|
|||||||
Item_func_srid(Item *a): Item_int_func(a) {}
|
Item_func_srid(Item *a): Item_int_func(a) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
const char *func_name() const { return "srid"; }
|
const char *func_name() const { return "srid"; }
|
||||||
void fix_length_and_dec() { max_length= 10; }
|
void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GEOM_NEW(obj_constructor) new obj_constructor
|
#define GEOM_NEW(obj_constructor) new obj_constructor
|
||||||
|
@ -213,23 +213,24 @@ static uint32 wkb_get_uint(const char *ptr, Geometry::wkbByteOrder bo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Geometry::create_from_wkb(Geometry_buffer *buffer,
|
Geometry *Geometry::create_from_wkb(Geometry_buffer *buffer,
|
||||||
const char *wkb, uint32 len, String *res)
|
const char *wkb, uint32 len, String *res)
|
||||||
{
|
{
|
||||||
uint32 geom_type;
|
uint32 geom_type;
|
||||||
Geometry *geom;
|
Geometry *geom;
|
||||||
|
|
||||||
if (len < WKB_HEADER_SIZE)
|
if (len < WKB_HEADER_SIZE)
|
||||||
return 1;
|
return NULL;
|
||||||
geom_type= wkb_get_uint(wkb+1, (wkbByteOrder)wkb[0]);
|
geom_type= wkb_get_uint(wkb+1, (wkbByteOrder)wkb[0]);
|
||||||
if (!(geom= create_by_typeid(buffer, (int) geom_type)) ||
|
if (!(geom= create_by_typeid(buffer, (int) geom_type)) ||
|
||||||
res->reserve(WKB_HEADER_SIZE, 512))
|
res->reserve(WKB_HEADER_SIZE, 512))
|
||||||
return 1;
|
return NULL;
|
||||||
|
|
||||||
res->q_append((char) wkb_ndr);
|
res->q_append((char) wkb_ndr);
|
||||||
res->q_append(geom_type);
|
res->q_append(geom_type);
|
||||||
return geom->init_from_wkb(wkb+WKB_HEADER_SIZE, len - WKB_HEADER_SIZE,
|
|
||||||
(wkbByteOrder) wkb[0], res);
|
return geom->init_from_wkb(wkb + WKB_HEADER_SIZE, len - WKB_HEADER_SIZE,
|
||||||
|
(wkbByteOrder) wkb[0], res) ? geom : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -246,8 +246,8 @@ public:
|
|||||||
static Geometry *create_from_wkt(Geometry_buffer *buffer,
|
static Geometry *create_from_wkt(Geometry_buffer *buffer,
|
||||||
Gis_read_stream *trs, String *wkt,
|
Gis_read_stream *trs, String *wkt,
|
||||||
bool init_stream=1);
|
bool init_stream=1);
|
||||||
static int create_from_wkb(Geometry_buffer *buffer,
|
static Geometry *create_from_wkb(Geometry_buffer *buffer, const char *wkb,
|
||||||
const char *wkb, uint32 len, String *res);
|
uint32 len, String *res);
|
||||||
int as_wkt(String *wkt, const char **end)
|
int as_wkt(String *wkt, const char **end)
|
||||||
{
|
{
|
||||||
uint32 len= get_class_info()->m_name.length;
|
uint32 len= get_class_info()->m_name.length;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user