Commit ac82a2d5 authored by unknown's avatar unknown
Browse files

Setting a variable to CAST(NULL as X) set the result type of the variable to X. (Bug #6598)


mysql-test/r/bigint.result:
  Test to show show that the parser threats big longlong values as unsigned
mysql-test/r/user_var.result:
  Test of CAST(NULL as SIGNED/UNSIGNED)
mysql-test/t/bigint.test:
  Test to show show that the parser threats big longlong values as unsigned
mysql-test/t/user_var.test:
  Test of CAST(NULL as SIGNED/UNSIGNED)
sql/item_func.cc:
  Setting a variable to CAST(NULL as X) set the result type of the variable to X. (Bug #6598)
  Setting a variable to NULL doesn't change the old result type.
sql/item_func.h:
  Detect setting a variable to NULL
sql/unireg.cc:
  Safety fix
parent 8b5b3652
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -128,3 +128,20 @@ t2.value64=t1.value64;
value64	value32	value64	value32
9223372036854775807	2	9223372036854775807	4
drop table t1, t2;
create table t1 select 1 as 'a';
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` bigint(1) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 select 9223372036854775809 as 'a';
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` bigint(19) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
select * from t1;
a
9223372036854775809
drop table t1;
+41 −0
Original line number Diff line number Diff line
@@ -182,3 +182,44 @@ coercibility(@v1) coercibility(@v2) coercibility(@v3) coercibility(@v4)
set session @honk=99;
set one_shot @honk=99;
ERROR HY000: The 'SET ONE_SHOT' syntax is reserved for purposes internal to the MySQL server
set @first_var= NULL;
create table t1 select @first_var;
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `@first_var` longblob
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
set @first_var= cast(NULL as signed integer);
create table t1 select @first_var;
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `@first_var` bigint(20) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
set @first_var= NULL;
create table t1 select @first_var;
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `@first_var` bigint(20) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
set @first_var= concat(NULL);
create table t1 select @first_var;
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `@first_var` longblob
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
set @first_var=1;
set @first_var= cast(NULL as CHAR);
create table t1 select @first_var;
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `@first_var` longtext
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
+10 −0
Original line number Diff line number Diff line
@@ -104,3 +104,13 @@ t2.value64=t1.value64;

drop table t1, t2;

#
# Test of CREATE ... SELECT and unsigned integers
#
create table t1 select 1 as 'a';
show create table t1;
drop table t1;
create table t1 select 9223372036854775809 as 'a';
show create table t1;
select * from t1;
drop table t1;
+26 −0
Original line number Diff line number Diff line
@@ -119,3 +119,29 @@ select coercibility(@v1),coercibility(@v2),coercibility(@v3),coercibility(@v4);
set session @honk=99;
--error 1382
set one_shot @honk=99;

#
# Bug #6598: problem with cast(NULL as signed integer);
#

set @first_var= NULL;
create table t1 select @first_var;
show create table t1;
drop table t1;
set @first_var= cast(NULL as signed integer);
create table t1 select @first_var;
show create table t1;
drop table t1;
set @first_var= NULL;
create table t1 select @first_var;
show create table t1;
drop table t1;
set @first_var= concat(NULL);
create table t1 select @first_var;
show create table t1;
drop table t1;
set @first_var=1;
set @first_var= cast(NULL as CHAR);
create table t1 select @first_var;
show create table t1;
drop table t1;
+11 −4
Original line number Diff line number Diff line
@@ -3271,7 +3271,8 @@ bool Item_func_set_user_var::fix_fields(THD *thd, TABLE_LIST *tables,
    from the argument if the argument is NULL
    and the variable has previously been initialized.
  */
  if (!entry->collation.collation || !args[0]->null_value)
  null_item= (args[0]->type() == NULL_ITEM);
  if (!entry->collation.collation || !null_item)
    entry->collation.set(args[0]->collation.collation, DERIVATION_IMPLICIT);
  collation.set(entry->collation.collation, DERIVATION_IMPLICIT);
  cached_result_type= args[0]->result_type();
@@ -3355,9 +3356,9 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
    if (type == DECIMAL_RESULT)
      ((my_decimal*)entry->value)->fix_buffer_pointer();
    entry->length= length;
    entry->type=type;
    entry->collation.set(cs, dv);
  }
  entry->type=type;
  return 0;
}

@@ -3366,6 +3367,12 @@ bool
Item_func_set_user_var::update_hash(void *ptr, uint length, Item_result type,
                                    CHARSET_INFO *cs, Derivation dv)
{
  /*
    If we set a variable explicitely to NULL then keep the old
    result type of the variable
  */
  if ((null_value= args[0]->null_value) && null_item)
    type= entry->type;                          // Don't change type of item
  if (::update_hash(entry, (null_value= args[0]->null_value),
                    ptr, length, type, cs, dv))
  {
Loading