diff --git a/mysql-test/r/gis.result b/mysql-test/r/gis.result
index 61394409947fc1efab85ecef30143068dbbf88f9..cab55b2d7bae424c9e40dd0adb8a6051fcb9b733 100644
--- a/mysql-test/r/gis.result
+++ b/mysql-test/r/gis.result
@@ -680,7 +680,7 @@ def	test	t1	t1	g	g	255	4294967295	0	Y	144	0	63
 g
 select asbinary(g) from t1;
 Catalog	Database	Table	Table_alias	Column	Column_alias	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
-def					asbinary(g)	252	16777216	0	Y	128	0	63
+def					asbinary(g)	252	4294967295	0	Y	128	0	63
 asbinary(g)
 drop table t1;
 create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
@@ -742,6 +742,30 @@ select geomfromtext(col9,col89) as a from t1;
 a
 NULL
 DROP TABLE t1;
+CREATE TABLE t1 (
+geomdata polygon NOT NULL,
+SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+CREATE TABLE t2 (
+geomdata polygon NOT NULL,
+SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+CREATE TABLE t3
+select 
+aswkb(ws.geomdata) AS geomdatawkb 
+from 
+t1 ws
+union 
+select 
+aswkb(ws.geomdata) AS geomdatawkb 
+from 
+t2 ws;
+describe t3;
+Field	Type	Null	Key	Default	Extra
+geomdatawkb	longblob	YES		NULL	
+drop table t1;
+drop table t2;
+drop table t3;
 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;
diff --git a/mysql-test/t/gis.test b/mysql-test/t/gis.test
index b4c515d2e8c3130d84f1b8222f64289eaa86f9a8..15ae98354d23a7b0db3002c0789ec709bf0bce4c 100644
--- a/mysql-test/t/gis.test
+++ b/mysql-test/t/gis.test
@@ -440,6 +440,37 @@ INSERT INTO `t1` VALUES ('','0000-00-00');
 select geomfromtext(col9,col89) as a from t1;
 DROP TABLE t1;
 
+#
+# Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data) 
+#
+
+CREATE TABLE t1 (
+  geomdata polygon NOT NULL,
+  SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+
+CREATE TABLE t2 (
+  geomdata polygon NOT NULL,
+  SPATIAL KEY index_geom (geomdata)
+) ENGINE=MyISAM DEFAULT CHARSET=latin2 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED;
+
+CREATE TABLE t3
+select 
+    aswkb(ws.geomdata) AS geomdatawkb 
+  from 
+    t1 ws
+union 
+  select 
+    aswkb(ws.geomdata) AS geomdatawkb 
+  from 
+    t2 ws;
+
+describe t3;
+
+drop table t1;
+drop table t2;
+drop table t3;
+
 --echo End of 4.1 tests
 
 #
diff --git a/sql/field.h b/sql/field.h
index d0d867d0b326f6fb1f0001ff3bb1a2d7c7ee31b7..f4314720e86ed9e6c09a01f31e267dde9e536443 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -25,6 +25,7 @@
 
 #define NOT_FIXED_DEC			31
 #define DATETIME_DEC                     6
+const uint32 max_field_size= (uint32) 4294967295U;
 
 class Send_field;
 class Protocol;
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index 332e88c950d8f874c88c1170565d6dd6cc5770d1..2da5965c94d73d532e5750506d34bad78494a35c 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -37,7 +37,7 @@ void Item_geometry_func::fix_length_and_dec()
 {
   collation.set(&my_charset_bin);
   decimals=0;
-  max_length=MAX_BLOB_WIDTH;
+  max_length= max_field_size;
   maybe_null= 1;
 }