Commit a292b424 authored by unknown's avatar unknown
Browse files

Fix bug #11335 View redefines TinyInt(1) column definition

Item_type_holder doesn't store information about length and exact type of
original item which results in redefining length to max_length and geometry 
type to longtext.

Changed the way derived tables except unions are built. Now they are created
from original field list instead of list of Item_type_holder.


mysql-test/r/subselect.result:
  Fixed wrong test case result. bug#11335
mysql-test/r/view_grant.result:
   Fixed wrong test case result. bug#11335
mysql-test/r/view.result:
  Added test case for bug #11335. Fixed wrong test case result.
mysql-test/t/view.test:
  Test case for bug #11335 View  redefines TinyInt(1) column definition.
sql/sql_union.cc:
  Fix bug #11335 View redefines TinyInt(1) column definition.
  Changed the way derived tables except unions are built. Now they are created from original field list instead of list of Item_type_holders.
sql/sql_select.cc:
  Fix bug #11335 View redefines TinyInt(1) column definition.
  Added special handling of DATE/TIME fields to preserve field's type in tmp field creation.
  In create_tmp_field() for Item_field added special handling of case when item have to be able to store NULLs but underlaid field is NOT NULL.
sql/item_sum.cc:
  Fix bug #11335 View redefines TinyInt(1) column definition.
  Added special handling of DATE/TIME fields to preserve field's type while tmp
  field created in Item_sum_hybrid::create_tmp_field().
parent 10ec1349
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1087,24 +1087,24 @@ CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT 1)) a;
SHOW CREATE TABLE t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` bigint(20) NOT NULL default '0',
  `(SELECT 1)` bigint(20) NOT NULL default '0'
  `a` bigint(1) NOT NULL default '0',
  `(SELECT 1)` bigint(1) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT a)) a;
SHOW CREATE TABLE t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` bigint(20) NOT NULL default '0',
  `(SELECT a)` bigint(20) NOT NULL default '0'
  `a` bigint(1) NOT NULL default '0',
  `(SELECT a)` bigint(1) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
CREATE TABLE t1 SELECT * FROM (SELECT 1 as a,(SELECT a+0)) a;
SHOW CREATE TABLE t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` bigint(20) NOT NULL default '0',
  `(SELECT a+0)` bigint(20) NOT NULL default '0'
  `a` bigint(1) NOT NULL default '0',
  `(SELECT a+0)` bigint(3) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
CREATE TABLE t1 SELECT (SELECT 1 as a UNION SELECT 1+1 limit 1,1) as a;
+12 −1
Original line number Diff line number Diff line
@@ -566,7 +566,7 @@ select * from v1;
col1
describe v1;
Field	Type	Null	Key	Default	Extra
col1	varchar(2)	YES		NULL	
col1	char(2)	YES		NULL	
drop view v1;
drop table `t1a``b`;
create table t1 (col1 char(5),col2 char(5));
@@ -1977,3 +1977,14 @@ A
B
DROP VIEW v1;
DROP TABLE t1;
create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
create view v1 as select * from t1;
desc v1;
Field	Type	Null	Key	Default	Extra
f1	tinyint(1)	YES		NULL	
f2	char(1)	YES		NULL	
f3	varchar(1)	YES		NULL	
f4	geometry	YES		NULL	
f5	datetime	YES		NULL	
drop view v1;
drop table t1;
+4 −4
Original line number Diff line number Diff line
@@ -72,12 +72,12 @@ select c from mysqltest.v4;
c
show columns from mysqltest.v1;
Field	Type	Null	Key	Default	Extra
c	bigint(20)	YES		NULL	
d	bigint(20)	YES		NULL	
c	bigint(12)	YES		NULL	
d	bigint(12)	YES		NULL	
show columns from mysqltest.v2;
Field	Type	Null	Key	Default	Extra
c	bigint(20)	YES		NULL	
d	bigint(20)	YES		NULL	
c	bigint(12)	YES		NULL	
d	bigint(12)	YES		NULL	
explain select c from mysqltest.v1;
ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table
show create view mysqltest.v1;
+9 −0
Original line number Diff line number Diff line
@@ -1815,3 +1815,12 @@ SELECT * FROM t1;

DROP VIEW v1;
DROP TABLE t1;

#
# Bug #11335 View redefines column types
#
create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
create view v1 as select * from t1;
desc v1;
drop view v1;
drop table t1;
+16 −0
Original line number Diff line number Diff line
@@ -321,6 +321,22 @@ Field *Item_sum_hybrid::create_tmp_field(bool group, TABLE *table,
      field->flags&= ~NOT_NULL_FLAG;
    return field;
  }
  /*
    DATE/TIME fields have STRING_RESULT result types.
    In order to preserve field type, it's needed to handle DATE/TIME
    fields creations separately.
  */
  switch (args[0]->field_type()) {
  case MYSQL_TYPE_DATE:
    return new Field_date(maybe_null, name, table, collation.collation);
  case MYSQL_TYPE_TIME:
    return new Field_time(maybe_null, name, table, collation.collation);
  case MYSQL_TYPE_TIMESTAMP:
  case MYSQL_TYPE_DATETIME:
    return new Field_datetime(maybe_null, name, table, collation.collation);
  default:
    break;
  }
  return Item_sum::create_tmp_field(group, table, convert_blob_length);
}

Loading