summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <holyfoot/hf@mysql.com/hfmain.(none)>2007-11-13 10:51:47 +0400
committerunknown <holyfoot/hf@mysql.com/hfmain.(none)>2007-11-13 10:51:47 +0400
commiteb347921b736c06651189623b1dcd92a6d6d1039 (patch)
tree7e2b4e01a21459d9a666cbdd1b2b399281a96c25
parent31634a38e8639e487e75150567687c2982cbef58 (diff)
downloadmariadb-git-eb347921b736c06651189623b1dcd92a6d6d1039.tar.gz
Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data)
max_length parameter for BLOB-returning functions must be big enough for any possible content. Otherwise the field created for a table will be too small. mysql-test/r/gis.result: Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data) test result mysql-test/t/gis.test: Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data) test case sql/field.cc: Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data) max_field_size used instead of numeric value sql/field.h: Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data) max_field_size constant defined sql/item_geofunc.cc: Bug #31158 Spatial, Union, LONGBLOB vs BLOB bug (crops data) max_length parameter fixed
-rw-r--r--mysql-test/r/gis.result26
-rw-r--r--mysql-test/t/gis.test31
-rw-r--r--sql/field.cc2
-rw-r--r--sql/field.h1
-rw-r--r--sql/item_geofunc.cc2
5 files changed, 59 insertions, 3 deletions
diff --git a/mysql-test/r/gis.result b/mysql-test/r/gis.result
index 55f70e59fcf..ff4673d4c0f 100644
--- a/mysql-test/r/gis.result
+++ b/mysql-test/r/gis.result
@@ -668,7 +668,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 8192 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));
@@ -730,4 +730,28 @@ 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
diff --git a/mysql-test/t/gis.test b/mysql-test/t/gis.test
index cf5c3b31bc1..3b9514bebbd 100644
--- a/mysql-test/t/gis.test
+++ b/mysql-test/t/gis.test
@@ -427,4 +427,35 @@ 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.cc b/sql/field.cc
index 5b43b9b1955..ed6523e9299 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -6975,7 +6975,7 @@ uint32 Field_blob::max_length()
case 3:
return 16777215 * field_charset->mbmaxlen;
case 4:
- return (uint32) 4294967295U;
+ return max_field_size;
default:
DBUG_ASSERT(0); // we should never go here
return 0;
diff --git a/sql/field.h b/sql/field.h
index 20f1209a439..29be9ef38d4 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -26,6 +26,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 6cb8c790319..7900396e5d8 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -29,7 +29,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;
}