Commit 6249d57d authored by unknown's avatar unknown

Fox for bug #28509: strange behaviour: passing a decimal value to PS

Set parameter's type to Item::DECIMAL_ITEM assigning a decimal value.


mysql-test/r/ps.result:
  Fox for bug #28509: strange behaviour: passing a decimal value to PS
    - test result.
mysql-test/t/ps.test:
  Fox for bug #28509: strange behaviour: passing a decimal value to PS
    - test case.
sql/item.cc:
  Fox for bug #28509: strange behaviour: passing a decimal value to PS
    - set Item_param::item_type to Item::DECIMAL_ITEM in case of DECIMAL_RESULT variable.
    - removed redundant item_result_type assignments as it's set before.
parent 8ab53d5f
...@@ -1661,4 +1661,13 @@ execute stmt; ...@@ -1661,4 +1661,13 @@ execute stmt;
ERROR 42S22: Unknown column 'y.value' in 'field list' ERROR 42S22: Unknown column 'y.value' in 'field list'
deallocate prepare stmt; deallocate prepare stmt;
drop tables t1; drop tables t1;
prepare stmt from "create table t1 select ?";
set @a=1.0;
execute stmt using @a;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`?` decimal(2,1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
End of 5.0 tests. End of 5.0 tests.
...@@ -1773,5 +1773,13 @@ execute stmt; ...@@ -1773,5 +1773,13 @@ execute stmt;
deallocate prepare stmt; deallocate prepare stmt;
drop tables t1; drop tables t1;
#
# Bug #28509: strange behaviour: passing a decimal value to PS
#
prepare stmt from "create table t1 select ?";
set @a=1.0;
execute stmt using @a;
show create table t1;
drop table t1;
--echo End of 5.0 tests. --echo End of 5.0 tests.
...@@ -2506,16 +2506,14 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry) ...@@ -2506,16 +2506,14 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
if (entry && entry->value) if (entry && entry->value)
{ {
item_result_type= entry->type; item_result_type= entry->type;
switch (entry->type) { switch (item_result_type) {
case REAL_RESULT: case REAL_RESULT:
set_double(*(double*)entry->value); set_double(*(double*)entry->value);
item_type= Item::REAL_ITEM; item_type= Item::REAL_ITEM;
item_result_type= REAL_RESULT;
break; break;
case INT_RESULT: case INT_RESULT:
set_int(*(longlong*)entry->value, MY_INT64_NUM_DECIMAL_DIGITS); set_int(*(longlong*)entry->value, MY_INT64_NUM_DECIMAL_DIGITS);
item_type= Item::INT_ITEM; item_type= Item::INT_ITEM;
item_result_type= INT_RESULT;
break; break;
case STRING_RESULT: case STRING_RESULT:
{ {
...@@ -2537,7 +2535,6 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry) ...@@ -2537,7 +2535,6 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
charset of connection, so we have to set it later. charset of connection, so we have to set it later.
*/ */
item_type= Item::STRING_ITEM; item_type= Item::STRING_ITEM;
item_result_type= STRING_RESULT;
if (set_str((const char *)entry->value, entry->length)) if (set_str((const char *)entry->value, entry->length))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -2551,6 +2548,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry) ...@@ -2551,6 +2548,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
decimals= ent_value->frac; decimals= ent_value->frac;
max_length= my_decimal_precision_to_length(ent_value->precision(), max_length= my_decimal_precision_to_length(ent_value->precision(),
decimals, unsigned_flag); decimals, unsigned_flag);
item_type= Item::DECIMAL_ITEM;
break; break;
} }
default: default:
......
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