Commit 85405574 authored by evgen@moonbone.local's avatar evgen@moonbone.local

Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0-opt

into  moonbone.local:/work/autopush/12185-bug-5.0-opt-mysql
parents bcf82284 c875b8eb
...@@ -452,7 +452,7 @@ t2 CREATE TABLE `t2` ( ...@@ -452,7 +452,7 @@ t2 CREATE TABLE `t2` (
`ifnull(h,h)` decimal(5,4) default NULL, `ifnull(h,h)` decimal(5,4) default NULL,
`ifnull(i,i)` year(4) default NULL, `ifnull(i,i)` year(4) default NULL,
`ifnull(j,j)` date default NULL, `ifnull(j,j)` date default NULL,
`ifnull(k,k)` datetime NOT NULL default '0000-00-00 00:00:00', `ifnull(k,k)` timestamp NOT NULL default '0000-00-00 00:00:00',
`ifnull(l,l)` datetime default NULL, `ifnull(l,l)` datetime default NULL,
`ifnull(m,m)` varchar(1) default NULL, `ifnull(m,m)` varchar(1) default NULL,
`ifnull(n,n)` varchar(3) default NULL, `ifnull(n,n)` varchar(3) default NULL,
......
...@@ -1473,8 +1473,8 @@ Error 1146 Table 'test.t4' doesn't exist ...@@ -1473,8 +1473,8 @@ Error 1146 Table 'test.t4' doesn't exist
drop table t1,t2,t3; drop table t1,t2,t3;
create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb; create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb;
insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt'); insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt');
select name2 from t1 union all select name from t1 union all select id from t1; select trim(name2) from t1 union all select trim(name) from t1 union all select trim(id) from t1;
name2 trim(name2)
fff fff
sss sss
ttt ttt
......
...@@ -691,9 +691,9 @@ t1 CREATE TABLE `t1` ( ...@@ -691,9 +691,9 @@ t1 CREATE TABLE `t1` (
`da` datetime default NULL `da` datetime default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT dt from t2 UNION select sc from t2; create table t1 SELECT dt from t2 UNION select trim(sc) from t2;
select * from t1; select trim(dt) from t1;
dt trim(dt)
1972-10-22 11:50:00 1972-10-22 11:50:00
testc testc
show create table t1; show create table t1;
...@@ -732,7 +732,7 @@ tetetetetest ...@@ -732,7 +732,7 @@ tetetetetest
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`dt` longblob `dt` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT sv from t2 UNION select b from t2; create table t1 SELECT sv from t2 UNION select b from t2;
...@@ -743,7 +743,7 @@ tetetetetest ...@@ -743,7 +743,7 @@ tetetetetest
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`sv` longblob `sv` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT i from t2 UNION select d from t2 UNION select b from t2; create table t1 SELECT i from t2 UNION select d from t2 UNION select b from t2;
...@@ -755,7 +755,7 @@ tetetetetest ...@@ -755,7 +755,7 @@ tetetetetest
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`i` longblob `i` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT sv from t2 UNION select tx from t2; create table t1 SELECT sv from t2 UNION select tx from t2;
...@@ -766,7 +766,7 @@ teeeeeeeeeeeest ...@@ -766,7 +766,7 @@ teeeeeeeeeeeest
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`sv` longtext `sv` text
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT b from t2 UNION select tx from t2; create table t1 SELECT b from t2 UNION select tx from t2;
...@@ -777,7 +777,7 @@ teeeeeeeeeeeest ...@@ -777,7 +777,7 @@ teeeeeeeeeeeest
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`b` longblob `b` blob
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1,t2; drop table t1,t2;
create table t1 select 1 union select -1; create table t1 select 1 union select -1;
...@@ -1306,6 +1306,21 @@ id ...@@ -1306,6 +1306,21 @@ id
5 5
99 99
drop table t1; drop table t1;
create table t1(f1 char(1), f2 char(5), f3 binary(1), f4 binary(5), f5 timestamp, f6 varchar(1) character set utf8 collate utf8_general_ci, f7 text);
create table t2 as select *, f6 as f8 from t1 union select *, f7 from t1;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`f1` char(1) default NULL,
`f2` char(5) default NULL,
`f3` binary(1) default NULL,
`f4` binary(5) default NULL,
`f5` timestamp NOT NULL default '0000-00-00 00:00:00',
`f6` varchar(1) character set utf8 default NULL,
`f7` text,
`f8` text character set utf8
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1, t2;
(select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union
(select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union
(select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union (select avg(1)) union
......
...@@ -1079,7 +1079,7 @@ drop table t1,t2,t3; ...@@ -1079,7 +1079,7 @@ drop table t1,t2,t3;
# #
create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb; create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb;
insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt'); insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt');
select name2 from t1 union all select name from t1 union all select id from t1; select trim(name2) from t1 union all select trim(name) from t1 union all select trim(id) from t1;
drop table t1; drop table t1;
# #
......
...@@ -390,8 +390,8 @@ create table t1 SELECT da from t2 UNION select dt from t2; ...@@ -390,8 +390,8 @@ create table t1 SELECT da from t2 UNION select dt from t2;
select * from t1; select * from t1;
show create table t1; show create table t1;
drop table t1; drop table t1;
create table t1 SELECT dt from t2 UNION select sc from t2; create table t1 SELECT dt from t2 UNION select trim(sc) from t2;
select * from t1; select trim(dt) from t1;
show create table t1; show create table t1;
drop table t1; drop table t1;
create table t1 SELECT dt from t2 UNION select sv from t2; create table t1 SELECT dt from t2 UNION select sv from t2;
...@@ -794,6 +794,14 @@ drop table t1; ...@@ -794,6 +794,14 @@ drop table t1;
# End of 4.1 tests # End of 4.1 tests
#
# Bug#12185: Data type aggregation may produce wrong result
#
create table t1(f1 char(1), f2 char(5), f3 binary(1), f4 binary(5), f5 timestamp, f6 varchar(1) character set utf8 collate utf8_general_ci, f7 text);
create table t2 as select *, f6 as f8 from t1 union select *, f7 from t1;
show create table t2;
drop table t1, t2;
# #
# Bug#18175: Union select over 129 tables with a sum function fails. # Bug#18175: Union select over 129 tables with a sum function fails.
# #
......
...@@ -4485,6 +4485,24 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg, ...@@ -4485,6 +4485,24 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
} }
Field_timestamp::Field_timestamp(bool maybe_null_arg,
const char *field_name_arg,
struct st_table *table_arg, CHARSET_INFO *cs)
:Field_str((char*) 0, 19, maybe_null_arg ? (uchar*) "": 0, 0,
NONE, field_name_arg, table_arg, cs)
{
/* For 4.0 MYD and 4.0 InnoDB compatibility */
flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
if (table && !table->timestamp_field &&
unireg_check != NONE)
{
/* This timestamp has auto-update */
table->timestamp_field= this;
flags|=TIMESTAMP_FLAG;
}
}
/* /*
Get auto-set type for TIMESTAMP field. Get auto-set type for TIMESTAMP field.
......
...@@ -782,6 +782,8 @@ public: ...@@ -782,6 +782,8 @@ public:
enum utype unireg_check_arg, const char *field_name_arg, enum utype unireg_check_arg, const char *field_name_arg,
struct st_table *table_arg, struct st_table *table_arg,
CHARSET_INFO *cs); CHARSET_INFO *cs);
Field_timestamp(bool maybe_null_arg, const char *field_name_arg,
struct st_table *table_arg, CHARSET_INFO *cs);
enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;} enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
...@@ -1130,6 +1132,21 @@ public: ...@@ -1130,6 +1132,21 @@ public:
{ {
flags|= BLOB_FLAG; flags|= BLOB_FLAG;
} }
Field_blob(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
struct st_table *table_arg, CHARSET_INFO *cs, bool set_packlength)
:Field_longstr((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0, 0,
NONE, field_name_arg, table_arg, cs)
{
flags|= BLOB_FLAG;
packlength= 4;
if (set_packlength)
{
uint32 char_lengt= len_arg/cs->mbmaxlen;
packlength= char_length <= 255 ? 1 :
char_length <= 65535 ? 2 :
char_length <= 16777215 ? 3 : 4;
}
}
enum_field_types type() const { return FIELD_TYPE_BLOB;} enum_field_types type() const { return FIELD_TYPE_BLOB;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return binary() ? HA_KEYTYPE_VARBINARY2 : HA_KEYTYPE_VARTEXT2; } { return binary() ? HA_KEYTYPE_VARBINARY2 : HA_KEYTYPE_VARTEXT2; }
......
...@@ -3903,7 +3903,9 @@ Field *Item::make_string_field(TABLE *table) ...@@ -3903,7 +3903,9 @@ Field *Item::make_string_field(TABLE *table)
if (max_length/collation.collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB) if (max_length/collation.collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB)
return new Field_blob(max_length, maybe_null, name, table, return new Field_blob(max_length, maybe_null, name, table,
collation.collation); collation.collation);
if (max_length > 0) /* Item_type_holder holds the exact type, do not change it */
if (max_length > 0 &&
(type() != Item::TYPE_HOLDER || field_type() != MYSQL_TYPE_STRING))
return new Field_varstring(max_length, maybe_null, name, table, return new Field_varstring(max_length, maybe_null, name, table,
collation.collation); collation.collation);
return new Field_string(max_length, maybe_null, name, table, return new Field_string(max_length, maybe_null, name, table,
...@@ -3967,6 +3969,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table) ...@@ -3967,6 +3969,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table)
case MYSQL_TYPE_TIME: case MYSQL_TYPE_TIME:
return new Field_time(maybe_null, name, table, &my_charset_bin); return new Field_time(maybe_null, name, table, &my_charset_bin);
case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_TIMESTAMP:
return new Field_timestamp(maybe_null, name, table, &my_charset_bin);
case MYSQL_TYPE_DATETIME: case MYSQL_TYPE_DATETIME:
return new Field_datetime(maybe_null, name, table, &my_charset_bin); return new Field_datetime(maybe_null, name, table, &my_charset_bin);
case MYSQL_TYPE_YEAR: case MYSQL_TYPE_YEAR:
...@@ -3990,7 +3993,11 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table) ...@@ -3990,7 +3993,11 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table)
case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_BLOB: case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_GEOMETRY:
return new Field_blob(max_length, maybe_null, name, table, if (this->type() == Item::TYPE_HOLDER)
return new Field_blob(max_length, maybe_null, name, table,
collation.collation, 1);
else
return new Field_blob(max_length, maybe_null, name, table,
collation.collation); collation.collation);
break; // Blob handled outside of case break; // Blob handled outside of case
} }
...@@ -6151,7 +6158,7 @@ uint32 Item_type_holder::display_length(Item *item) ...@@ -6151,7 +6158,7 @@ uint32 Item_type_holder::display_length(Item *item)
case MYSQL_TYPE_DOUBLE: case MYSQL_TYPE_DOUBLE:
return 53; return 53;
case MYSQL_TYPE_NULL: case MYSQL_TYPE_NULL:
return 4; return 0;
case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_LONGLONG:
return 20; return 20;
case MYSQL_TYPE_INT24: case MYSQL_TYPE_INT24:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment