List:Commits« Previous MessageNext Message »
From:ramil Date:March 5 2007 1:12pm
Subject:bk commit into 5.1 tree (ramil:1.2451)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of ram. When ram does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-03-05 17:12:37+04:00, ramil@stripped +10 -0
  Merge mysql.com:/home/ram/work/b26038/b26038.5.0
  into  mysql.com:/home/ram/work/b26038/b26038.5.1
  MERGE: 1.1810.2582.2

  mysql-test/include/gis_generic.inc@stripped, 2007-03-05 17:12:36+04:00, ramil@stripped +1 -2
    manual merge
    MERGE: 1.3.1.1

  mysql-test/r/archive_gis.result@stripped, 2007-03-05 17:12:36+04:00, ramil@stripped +1 -2
    manual merge
    MERGE: 1.2.2.2

  mysql-test/r/gis.result@stripped, 2007-03-05 17:12:36+04:00, ramil@stripped +1 -2
    manual merge
    MERGE: 1.35.1.6

  mysql-test/r/innodb_gis.result@stripped, 2007-03-05 17:12:36+04:00, ramil@stripped +1 -2
    manual merge
    MERGE: 1.2.2.2

  mysql-test/r/ndb_gis.result@stripped, 2007-03-05 17:12:36+04:00, ramil@stripped +2 -4
    manual merge
    MERGE: 1.3.1.2

  mysql-test/t/gis.test@stripped, 2007-03-05 17:04:59+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.29.1.5

  sql/item_geofunc.cc@stripped, 2007-03-05 17:05:00+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.27.2.4

  sql/item_geofunc.h@stripped, 2007-03-05 17:05:00+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.13.1.2

  sql/spatial.cc@stripped, 2007-03-05 17:05:00+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.27.3.2

  sql/spatial.h@stripped, 2007-03-05 17:05:00+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.19.2.3

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	ramil
# Host:	ramil.myoffice.izhnet.ru
# Root:	/home/ram/work/b26038/b26038.5.1/RESYNC

--- 1.32/sql/spatial.cc	2007-03-05 17:12:42 +04:00
+++ 1.33/sql/spatial.cc	2007-03-05 17:12:42 +04:00
@@ -216,23 +216,24 @@ static uint32 wkb_get_uint(const char *p
 }
 
 
-int Geometry::create_from_wkb(Geometry_buffer *buffer,
-                              const char *wkb, uint32 len, String *res)
+Geometry *Geometry::create_from_wkb(Geometry_buffer *buffer,
+                                    const char *wkb, uint32 len, String *res)
 {
   uint32 geom_type;
   Geometry *geom;
 
   if (len < WKB_HEADER_SIZE)
-    return 1;
+    return NULL;
   geom_type= wkb_get_uint(wkb+1, (wkbByteOrder)wkb[0]);
   if (!(geom= create_by_typeid(buffer, (int) geom_type)) ||
       res->reserve(WKB_HEADER_SIZE, 512))
-    return 1;
+    return NULL;
 
   res->q_append((char) wkb_ndr);
   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;
 }
 
 

--- 1.24/sql/spatial.h	2007-03-05 17:12:42 +04:00
+++ 1.25/sql/spatial.h	2007-03-05 17:12:42 +04:00
@@ -246,8 +246,8 @@ public:
   static Geometry *create_from_wkt(Geometry_buffer *buffer,
 				   Gis_read_stream *trs, String *wkt,
 				   bool init_stream=1);
-  static int create_from_wkb(Geometry_buffer *buffer,
-                             const char *wkb, uint32 len, String *res);
+  static Geometry *create_from_wkb(Geometry_buffer *buffer, const char *wkb, 
+                                   uint32 len, String *res);
   int as_wkt(String *wkt, const char **end)
   {
     uint32 len= get_class_info()->m_name.length;

--- 1.4/mysql-test/include/gis_generic.inc	2007-03-05 17:12:42 +04:00
+++ 1.5/mysql-test/include/gis_generic.inc	2007-03-05 17:12:42 +04:00
@@ -166,14 +166,14 @@ insert IGNORE into t1 (a) values ('Garba
 
 drop table t1;
 
-create table t1 (pk integer primary key auto_increment, fl geometry);
+create table t1 (pk integer primary key auto_increment, fl geometry not null);
 --error 1416
 insert into t1 (fl) values (1);
 --error 1416
 insert into t1 (fl) values (1.11);
 --error 1416
 insert into t1 (fl) values ("qwerty");
---error 1416
+--error 1048
 insert into t1 (fl) values (pointfromtext('point(1,1)'));
 
 drop table t1;

--- 1.7/mysql-test/r/archive_gis.result	2007-03-05 17:12:42 +04:00
+++ 1.8/mysql-test/r/archive_gis.result	2007-03-05 17:12:42 +04:00
@@ -450,7 +450,7 @@ ERROR 22003: Cannot get geometry object 
 insert IGNORE into t1 (a) values ('Garbage');
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 drop table t1;
-create table t1 (pk integer primary key auto_increment, fl geometry);
+create table t1 (pk integer primary key auto_increment, fl geometry not null);
 insert into t1 (fl) values (1);
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (1.11);
@@ -458,5 +458,5 @@ ERROR 22003: Cannot get geometry object 
 insert into t1 (fl) values ("qwerty");
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (pointfromtext('point(1,1)'));
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR 23000: Column 'fl' cannot be null
 drop table t1;

--- 1.8/mysql-test/r/innodb_gis.result	2007-03-05 17:12:42 +04:00
+++ 1.9/mysql-test/r/innodb_gis.result	2007-03-05 17:12:42 +04:00
@@ -450,7 +450,7 @@ ERROR 22003: Cannot get geometry object 
 insert IGNORE into t1 (a) values ('Garbage');
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 drop table t1;
-create table t1 (pk integer primary key auto_increment, fl geometry);
+create table t1 (pk integer primary key auto_increment, fl geometry not null);
 insert into t1 (fl) values (1);
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (1.11);
@@ -458,7 +458,7 @@ ERROR 22003: Cannot get geometry object 
 insert into t1 (fl) values ("qwerty");
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (pointfromtext('point(1,1)'));
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR 23000: Column 'fl' cannot be null
 drop table t1;
 create table t1 (g geometry not null, spatial gk(g)) engine=innodb;
 ERROR HY000: The used table type doesn't support SPATIAL indexes

--- 1.13/mysql-test/r/ndb_gis.result	2007-03-05 17:12:42 +04:00
+++ 1.14/mysql-test/r/ndb_gis.result	2007-03-05 17:12:42 +04:00
@@ -450,7 +450,7 @@ ERROR 22003: Cannot get geometry object 
 insert IGNORE into t1 (a) values ('Garbage');
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 drop table t1;
-create table t1 (pk integer primary key auto_increment, fl geometry);
+create table t1 (pk integer primary key auto_increment, fl geometry not null);
 insert into t1 (fl) values (1);
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (1.11);
@@ -458,7 +458,7 @@ ERROR 22003: Cannot get geometry object 
 insert into t1 (fl) values ("qwerty");
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (pointfromtext('point(1,1)'));
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR 23000: Column 'fl' cannot be null
 drop table t1;
 set engine_condition_pushdown = on;
 DROP TABLE IF EXISTS t1, gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
@@ -912,7 +912,7 @@ ERROR 22003: Cannot get geometry object 
 insert IGNORE into t1 (a) values ('Garbage');
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 drop table t1;
-create table t1 (pk integer primary key auto_increment, fl geometry);
+create table t1 (pk integer primary key auto_increment, fl geometry not null);
 insert into t1 (fl) values (1);
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (1.11);
@@ -920,5 +920,5 @@ ERROR 22003: Cannot get geometry object 
 insert into t1 (fl) values ("qwerty");
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 (fl) values (pointfromtext('point(1,1)'));
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR 23000: Column 'fl' cannot be null
 drop table t1;

--- 1.42/mysql-test/r/gis.result	2007-03-05 17:12:42 +04:00
+++ 1.43/mysql-test/r/gis.result	2007-03-05 17:12:42 +04:00
@@ -578,7 +578,7 @@ create table t1 select GeomFromWKB(POINT
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
-  `GeomFromWKB(POINT(1,3))` geometry NOT NULL DEFAULT ''
+  `GeomFromWKB(POINT(1,3))` geometry DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 drop table t1;
 CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo`
@@ -657,7 +657,7 @@ t1 where object_id=85984;
 object_id	geometrytype(geo)	ISSIMPLE(GEO)	ASTEXT(centroid(geo))
 85984	MULTIPOLYGON	0	POINT(-114.87787186923 36.33101763469)
 drop table t1;
-create table t1 (fl geometry);
+create table t1 (fl geometry not null);
 insert into t1 values (1);
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 values (1.11);
@@ -665,7 +665,7 @@ ERROR 22003: Cannot get geometry object 
 insert into t1 values ("qwerty");
 ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
 insert into t1 values (pointfromtext('point(1,1)'));
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR 23000: Column 'fl' cannot be null
 drop table t1;
 select (asWKT(geomfromwkb((0x000000000140240000000000004024000000000000))));
 (asWKT(geomfromwkb((0x000000000140240000000000004024000000000000))))
@@ -689,6 +689,48 @@ load data infile '../std_data_ln/bad_gis
 ERROR 22004: Column set to default value; NULL supplied to NOT NULL column 'b' at row 1
 alter table t1 enable keys;
 drop table t1;
+create table t1 (a int, b blob);
+insert into t1 values (1, ''), (2, NULL), (3, '1');
+select * from t1;
+a	b
+1	
+2	NULL
+3	1
+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;
+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
+1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1
+1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1
+1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1
+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;
+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
+1	1	1	1	1	1	1	1
+1	1	1	1	1	1	1	1
+1	1	1	1	1	1	1	1
+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;
+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
+0	1	1	1	1	1	1
+1	1	1	1	1	1	1
+0	1	1	1	1	1	1
+drop table t1;
+End of 4.1 tests
 create table t1 (s1 geometry not null,s2 char(100));
 create trigger t1_bu before update on t1 for each row set new.s1 = null;
 insert into t1 values (null,null);
@@ -716,7 +758,7 @@ drop table t1;
 create table t1 select GeomFromText('point(1 1)');
 desc t1;
 Field	Type	Null	Key	Default	Extra
-GeomFromText('point(1 1)')	geometry	NO			
+GeomFromText('point(1 1)')	geometry	YES		NULL	
 drop table t1;
 create table t1 (g geometry not null);
 insert into t1 values(default);

--- 1.34/mysql-test/t/gis.test	2007-03-05 17:12:42 +04:00
+++ 1.35/mysql-test/t/gis.test	2007-03-05 17:12:42 +04:00
@@ -360,14 +360,14 @@ t1 where object_id=85984;
 
 drop table t1;
 
-create table t1 (fl geometry);
+create table t1 (fl geometry not null);
 --error 1416
 insert into t1 values (1);
 --error 1416
 insert into t1 values (1.11);
 --error 1416
 insert into t1 values ("qwerty");
---error 1416
+--error 1048
 insert into t1 values (pointfromtext('point(1,1)'));
 
 drop table t1;
@@ -389,7 +389,41 @@ load data infile '../std_data_ln/bad_gis
 alter table t1 enable keys;
 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)

--- 1.32/sql/item_geofunc.cc	2007-03-05 17:12:42 +04:00
+++ 1.33/sql/item_geofunc.cc	2007-03-05 17:12:42 +04:00
@@ -38,6 +38,7 @@ void Item_geometry_func::fix_length_and_
   collation.set(&my_charset_bin);
   decimals=0;
   max_length=MAX_BLOB_WIDTH;
+  maybe_null= 1;
 }
 
 int Item_geometry_func::get_geometry_type() const
@@ -66,11 +67,8 @@ String *Item_func_geometry_from_text::va
     return 0;
   str->length(0);
   str->q_append(srid);
-  if (!Geometry::create_from_wkt(&buffer, &trs, str, 0))
-    /* We shouldn't return NULL here as NULL is a legal spatial object     */
-    /*  Geometry::bad_spatial_data will produce error message beeing stored*/
-    /*  in GEOMETRY field                                                  */
-    return &Geometry::bad_geometry_data;
+  if ((null_value= !Geometry::create_from_wkt(&buffer, &trs, str, 0)))
+    return 0;
   return str;
 }
 
@@ -124,6 +122,7 @@ String *Item_func_as_wkt::val_str(String
 void Item_func_as_wkt::fix_length_and_dec()
 {
   max_length=MAX_BLOB_WIDTH;
+  maybe_null= 1;
 }
 
 
@@ -389,7 +388,8 @@ String *Item_func_spatial_collection::va
   for (i= 0; i < arg_count; ++i)
   {
     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;
 
     if (coll_type == Geometry::wkb_geometrycollection)
@@ -398,13 +398,12 @@ String *Item_func_spatial_collection::va
 	In the case of GeometryCollection we don't need any checkings
 	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;
     }
     else
     {
       enum Geometry::wkbType wkb_type;
-      uint32 len=res->length();
       const char *data= res->ptr() + 1;
 
       /*
@@ -412,8 +411,6 @@ String *Item_func_spatial_collection::va
 	are of specific type, let's do this checking now
       */
 
-      if (len < 5)
-        goto err;
       wkb_type= (Geometry::wkbType) uint4korr(data);
       data+= 4;
       len-= 5;
@@ -535,9 +532,13 @@ longlong Item_func_spatial_rel::val_int(
 longlong Item_func_isempty::val_int()
 {
   DBUG_ASSERT(fixed == 1);
-  String tmp; 
-  null_value=0;
-  return args[0]->null_value ? 1 : 0;
+  String tmp;
+  String *swkb= args[0]->val_str(&tmp);
+  Geometry_buffer buffer;
+  
+  null_value= args[0]->null_value ||
+              !(Geometry::construct(&buffer, swkb->ptr(), swkb->length()));
+  return null_value ? 1 : 0;
 }
 
 
@@ -545,10 +546,11 @@ longlong Item_func_issimple::val_int()
 {
   DBUG_ASSERT(fixed == 1);
   String tmp;
-  String *wkb=args[0]->val_str(&tmp);
-
-  if ((null_value= (!wkb || args[0]->null_value)))
-    return 0;
+  String *swkb= args[0]->val_str(&tmp);
+  Geometry_buffer buffer;
+  
+  null_value= args[0]->null_value ||
+              !(Geometry::construct(&buffer, swkb->ptr(), swkb->length()));
   /* TODO: Ramil or Holyfoot, add real IsSimple calculation */
   return 0;
 }

--- 1.16/sql/item_geofunc.h	2007-03-05 17:12:42 +04:00
+++ 1.17/sql/item_geofunc.h	2007-03-05 17:12:42 +04:00
@@ -34,6 +34,7 @@ public:
   enum_field_types field_type() const  { return MYSQL_TYPE_GEOMETRY; }
   Field *tmp_table_field(TABLE *t_arg);
   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
@@ -81,6 +82,7 @@ public:
   void fix_length_and_dec() 
   {
      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 fix_length_and_dec() { maybe_null= 1; }
+  bool is_null() { (void) val_int(); return null_value; }
 };
 
 class Item_func_isempty: public Item_bool_func
@@ -234,6 +238,7 @@ public:
   longlong val_int();
   optimize_type select_optimize() const { return OPTIMIZE_NONE; }
   const char *func_name() const { return "isempty"; }
+  void fix_length_and_dec() { maybe_null= 1; }
 };
 
 class Item_func_issimple: public Item_bool_func
@@ -243,6 +248,7 @@ public:
   longlong val_int();
   optimize_type select_optimize() const { return OPTIMIZE_NONE; }
   const char *func_name() const { return "issimple"; }
+  void fix_length_and_dec() { maybe_null= 1; }
 };
 
 class Item_func_isclosed: public Item_bool_func
@@ -252,6 +258,7 @@ public:
   longlong val_int();
   optimize_type select_optimize() const { return OPTIMIZE_NONE; }
   const char *func_name() const { return "isclosed"; }
+  void fix_length_and_dec() { maybe_null= 1; }
 };
 
 class Item_func_dimension: public Item_int_func
@@ -261,7 +268,7 @@ public:
   Item_func_dimension(Item *a): Item_int_func(a) {}
   longlong val_int();
   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
@@ -271,6 +278,11 @@ public:
   Item_func_x(Item *a): Item_real_func(a) {}
   double val_real();
   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) {}
   double val_real();
   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) {}
   longlong val_int();
   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) {}
   longlong val_int();
   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) {}
   longlong val_int();
   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) {}
   double val_real();
   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) {}
   double val_real();
   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) {}
   longlong val_int();
   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(thd, obj_constructor) new (thd->mem_root) obj_constructor
Thread
bk commit into 5.1 tree (ramil:1.2451)ramil5 Mar