Commit 6c80672c authored by eric@mysql.com's avatar eric@mysql.com

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

into mysql.com:/Users/eric/dev/mysql-5.0
parents 215ecd33 de8b29cd
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
59 Temple Place, Suite 330, Boston, MA 02111 USA. */ 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
#define READLINE_LIBRARY #define READLINE_LIBRARY
#ifndef _XOPEN_SOURCE #if !defined(_XOPEN_SOURCE) && !defined(__FreeBSD__)
#define _XOPEN_SOURCE 500 #define _XOPEN_SOURCE 500
#endif #endif
......
...@@ -225,6 +225,21 @@ select * from t1 where reckey=1.09E2; ...@@ -225,6 +225,21 @@ select * from t1 where reckey=1.09E2;
reckey recdesc reckey recdesc
109 Has 109 as key 109 Has 109 as key
drop table t1; drop table t1;
create table t1 (d double(10,1));
create table t2 (d double(10,9));
insert into t1 values ("100000000.0");
insert into t2 values ("1.23456780");
create table t3 select * from t2 union select * from t1;
select * from t3;
d
1.234567800
100000000.000000000
show create table t3;
Table Create Table
t3 CREATE TABLE `t3` (
`d` double(22,9) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1, t2, t3;
create table t1 (s1 float(0,2)); create table t1 (s1 float(0,2));
ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 's1'). ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 's1').
create table t1 (s1 float(1,2)); create table t1 (s1 float(1,2));
......
...@@ -146,6 +146,19 @@ select * from t1 where reckey=109; ...@@ -146,6 +146,19 @@ select * from t1 where reckey=109;
select * from t1 where reckey=1.09E2; select * from t1 where reckey=1.09E2;
drop table t1; drop table t1;
#
# Bug #13372 (decimal union)
#
create table t1 (d double(10,1));
create table t2 (d double(10,9));
insert into t1 values ("100000000.0");
insert into t2 values ("1.23456780");
create table t3 select * from t2 union select * from t1;
select * from t3;
show create table t3;
drop table t1, t2, t3;
# End of 4.1 tests # End of 4.1 tests
# #
......
...@@ -5705,6 +5705,8 @@ enum_field_types Item_type_holder::get_real_type(Item *item) ...@@ -5705,6 +5705,8 @@ enum_field_types Item_type_holder::get_real_type(Item *item)
bool Item_type_holder::join_types(THD *thd, Item *item) bool Item_type_holder::join_types(THD *thd, Item *item)
{ {
uint max_length_orig= max_length;
uint decimals_orig= decimals;
DBUG_ENTER("Item_type_holder::join_types"); DBUG_ENTER("Item_type_holder::join_types");
DBUG_PRINT("info:", ("was type %d len %d, dec %d name %s", DBUG_PRINT("info:", ("was type %d len %d, dec %d name %s",
fld_type, max_length, decimals, fld_type, max_length, decimals,
...@@ -5731,7 +5733,10 @@ bool Item_type_holder::join_types(THD *thd, Item *item) ...@@ -5731,7 +5733,10 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
} }
else else
max_length= max(max_length, display_length(item)); max_length= max(max_length, display_length(item));
if (Field::result_merge_type(fld_type) == STRING_RESULT)
switch (Field::result_merge_type(fld_type))
{
case STRING_RESULT:
{ {
const char *old_cs, *old_derivation; const char *old_cs, *old_derivation;
old_cs= collation.collation->name; old_cs= collation.collation->name;
...@@ -5745,7 +5750,23 @@ bool Item_type_holder::join_types(THD *thd, Item *item) ...@@ -5745,7 +5750,23 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
"UNION"); "UNION");
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
break;
}
case REAL_RESULT:
{
if (decimals != NOT_FIXED_DEC)
{
int delta1= max_length_orig - decimals_orig;
int delta2= item->max_length - item->decimals;
max_length= min(max(delta1, delta2) + decimals,
(fld_type == MYSQL_TYPE_FLOAT) ? FLT_DIG+6 : DBL_DIG+7);
}
else
max_length= (fld_type == MYSQL_TYPE_FLOAT) ? FLT_DIG+6 : DBL_DIG+7;
break;
} }
default:;
};
maybe_null|= item->maybe_null; maybe_null|= item->maybe_null;
get_full_info(item); get_full_info(item);
......
...@@ -208,7 +208,7 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, TABLE *table) ...@@ -208,7 +208,7 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, TABLE *table)
{ {
byte key[MAX_KEY_LENGTH]; // db, name, optional key length type byte key[MAX_KEY_LENGTH]; // db, name, optional key length type
DBUG_ENTER("db_find_routine_aux"); DBUG_ENTER("db_find_routine_aux");
DBUG_PRINT("enter", ("type: %d name: %*s", DBUG_PRINT("enter", ("type: %d name: %.*s",
type, name->m_name.length, name->m_name.str)); type, name->m_name.length, name->m_name.str));
/* /*
...@@ -275,7 +275,7 @@ db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp) ...@@ -275,7 +275,7 @@ db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp)
ulong sql_mode; ulong sql_mode;
Open_tables_state open_tables_state_backup; Open_tables_state open_tables_state_backup;
DBUG_ENTER("db_find_routine"); DBUG_ENTER("db_find_routine");
DBUG_PRINT("enter", ("type: %d name: %*s", DBUG_PRINT("enter", ("type: %d name: %.*s",
type, name->m_name.length, name->m_name.str)); type, name->m_name.length, name->m_name.str));
*sphp= 0; // In case of errors *sphp= 0; // In case of errors
...@@ -479,7 +479,8 @@ db_create_routine(THD *thd, int type, sp_head *sp) ...@@ -479,7 +479,8 @@ db_create_routine(THD *thd, int type, sp_head *sp)
char olddb[128]; char olddb[128];
bool dbchanged; bool dbchanged;
DBUG_ENTER("db_create_routine"); DBUG_ENTER("db_create_routine");
DBUG_PRINT("enter", ("type: %d name: %*s",type,sp->m_name.length,sp->m_name.str)); DBUG_PRINT("enter", ("type: %d name: %.*s",type,sp->m_name.length,
sp->m_name.str));
dbchanged= FALSE; dbchanged= FALSE;
if ((ret= sp_use_new_db(thd, sp->m_db.str, olddb, sizeof(olddb), if ((ret= sp_use_new_db(thd, sp->m_db.str, olddb, sizeof(olddb),
...@@ -606,7 +607,7 @@ db_drop_routine(THD *thd, int type, sp_name *name) ...@@ -606,7 +607,7 @@ db_drop_routine(THD *thd, int type, sp_name *name)
TABLE *table; TABLE *table;
int ret; int ret;
DBUG_ENTER("db_drop_routine"); DBUG_ENTER("db_drop_routine");
DBUG_PRINT("enter", ("type: %d name: %*s", DBUG_PRINT("enter", ("type: %d name: %.*s",
type, name->m_name.length, name->m_name.str)); type, name->m_name.length, name->m_name.str));
if (!(table= open_proc_table_for_update(thd))) if (!(table= open_proc_table_for_update(thd)))
...@@ -628,7 +629,7 @@ db_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics) ...@@ -628,7 +629,7 @@ db_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics)
int ret; int ret;
bool opened; bool opened;
DBUG_ENTER("db_update_routine"); DBUG_ENTER("db_update_routine");
DBUG_PRINT("enter", ("type: %d name: %*s", DBUG_PRINT("enter", ("type: %d name: %.*s",
type, name->m_name.length, name->m_name.str)); type, name->m_name.length, name->m_name.str));
if (!(table= open_proc_table_for_update(thd))) if (!(table= open_proc_table_for_update(thd)))
...@@ -922,7 +923,7 @@ sp_find_procedure(THD *thd, sp_name *name, bool cache_only) ...@@ -922,7 +923,7 @@ sp_find_procedure(THD *thd, sp_name *name, bool cache_only)
{ {
sp_head *sp; sp_head *sp;
DBUG_ENTER("sp_find_procedure"); DBUG_ENTER("sp_find_procedure");
DBUG_PRINT("enter", ("name: %*s.%*s", DBUG_PRINT("enter", ("name: %.*s.%.*s",
name->m_db.length, name->m_db.str, name->m_db.length, name->m_db.str,
name->m_name.length, name->m_name.str)); name->m_name.length, name->m_name.str));
...@@ -980,7 +981,7 @@ sp_create_procedure(THD *thd, sp_head *sp) ...@@ -980,7 +981,7 @@ sp_create_procedure(THD *thd, sp_head *sp)
{ {
int ret; int ret;
DBUG_ENTER("sp_create_procedure"); DBUG_ENTER("sp_create_procedure");
DBUG_PRINT("enter", ("name: %*s", sp->m_name.length, sp->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", sp->m_name.length, sp->m_name.str));
ret= db_create_routine(thd, TYPE_ENUM_PROCEDURE, sp); ret= db_create_routine(thd, TYPE_ENUM_PROCEDURE, sp);
DBUG_RETURN(ret); DBUG_RETURN(ret);
...@@ -992,7 +993,7 @@ sp_drop_procedure(THD *thd, sp_name *name) ...@@ -992,7 +993,7 @@ sp_drop_procedure(THD *thd, sp_name *name)
{ {
int ret; int ret;
DBUG_ENTER("sp_drop_procedure"); DBUG_ENTER("sp_drop_procedure");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
ret= db_drop_routine(thd, TYPE_ENUM_PROCEDURE, name); ret= db_drop_routine(thd, TYPE_ENUM_PROCEDURE, name);
if (!ret) if (!ret)
...@@ -1006,7 +1007,7 @@ sp_update_procedure(THD *thd, sp_name *name, st_sp_chistics *chistics) ...@@ -1006,7 +1007,7 @@ sp_update_procedure(THD *thd, sp_name *name, st_sp_chistics *chistics)
{ {
int ret; int ret;
DBUG_ENTER("sp_update_procedure"); DBUG_ENTER("sp_update_procedure");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
ret= db_update_routine(thd, TYPE_ENUM_PROCEDURE, name, chistics); ret= db_update_routine(thd, TYPE_ENUM_PROCEDURE, name, chistics);
if (!ret) if (!ret)
...@@ -1020,7 +1021,7 @@ sp_show_create_procedure(THD *thd, sp_name *name) ...@@ -1020,7 +1021,7 @@ sp_show_create_procedure(THD *thd, sp_name *name)
{ {
sp_head *sp; sp_head *sp;
DBUG_ENTER("sp_show_create_procedure"); DBUG_ENTER("sp_show_create_procedure");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
if ((sp= sp_find_procedure(thd, name))) if ((sp= sp_find_procedure(thd, name)))
{ {
...@@ -1072,7 +1073,7 @@ sp_find_function(THD *thd, sp_name *name, bool cache_only) ...@@ -1072,7 +1073,7 @@ sp_find_function(THD *thd, sp_name *name, bool cache_only)
{ {
sp_head *sp; sp_head *sp;
DBUG_ENTER("sp_find_function"); DBUG_ENTER("sp_find_function");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
if (!(sp= sp_cache_lookup(&thd->sp_func_cache, name)) && if (!(sp= sp_cache_lookup(&thd->sp_func_cache, name)) &&
!cache_only) !cache_only)
...@@ -1089,7 +1090,7 @@ sp_create_function(THD *thd, sp_head *sp) ...@@ -1089,7 +1090,7 @@ sp_create_function(THD *thd, sp_head *sp)
{ {
int ret; int ret;
DBUG_ENTER("sp_create_function"); DBUG_ENTER("sp_create_function");
DBUG_PRINT("enter", ("name: %*s", sp->m_name.length, sp->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", sp->m_name.length, sp->m_name.str));
ret= db_create_routine(thd, TYPE_ENUM_FUNCTION, sp); ret= db_create_routine(thd, TYPE_ENUM_FUNCTION, sp);
DBUG_RETURN(ret); DBUG_RETURN(ret);
...@@ -1101,7 +1102,7 @@ sp_drop_function(THD *thd, sp_name *name) ...@@ -1101,7 +1102,7 @@ sp_drop_function(THD *thd, sp_name *name)
{ {
int ret; int ret;
DBUG_ENTER("sp_drop_function"); DBUG_ENTER("sp_drop_function");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
ret= db_drop_routine(thd, TYPE_ENUM_FUNCTION, name); ret= db_drop_routine(thd, TYPE_ENUM_FUNCTION, name);
if (!ret) if (!ret)
...@@ -1115,7 +1116,7 @@ sp_update_function(THD *thd, sp_name *name, st_sp_chistics *chistics) ...@@ -1115,7 +1116,7 @@ sp_update_function(THD *thd, sp_name *name, st_sp_chistics *chistics)
{ {
int ret; int ret;
DBUG_ENTER("sp_update_procedure"); DBUG_ENTER("sp_update_procedure");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
ret= db_update_routine(thd, TYPE_ENUM_FUNCTION, name, chistics); ret= db_update_routine(thd, TYPE_ENUM_FUNCTION, name, chistics);
if (!ret) if (!ret)
...@@ -1129,7 +1130,7 @@ sp_show_create_function(THD *thd, sp_name *name) ...@@ -1129,7 +1130,7 @@ sp_show_create_function(THD *thd, sp_name *name)
{ {
sp_head *sp; sp_head *sp;
DBUG_ENTER("sp_show_create_function"); DBUG_ENTER("sp_show_create_function");
DBUG_PRINT("enter", ("name: %*s", name->m_name.length, name->m_name.str)); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
if ((sp= sp_find_function(thd, name))) if ((sp= sp_find_function(thd, name)))
{ {
......
...@@ -132,7 +132,7 @@ void sp_cache_insert(sp_cache **cp, sp_head *sp) ...@@ -132,7 +132,7 @@ void sp_cache_insert(sp_cache **cp, sp_head *sp)
return; // End of memory error return; // End of memory error
c->version= Cversion; // No need to lock when reading long variable c->version= Cversion; // No need to lock when reading long variable
} }
DBUG_PRINT("info",("sp_cache: inserting: %*s", sp->m_qname.length, DBUG_PRINT("info",("sp_cache: inserting: %.*s", sp->m_qname.length,
sp->m_qname.str)); sp->m_qname.str));
c->insert(sp); c->insert(sp);
*cp= c; // Update *cp if it was NULL *cp= c; // Update *cp if it was NULL
......
...@@ -280,7 +280,7 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, ...@@ -280,7 +280,7 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type,
DBUG_PRINT("info", ("STRING_RESULT: null")); DBUG_PRINT("info", ("STRING_RESULT: null"));
goto return_null_item; goto return_null_item;
} }
DBUG_PRINT("info",("STRING_RESULT: %*s", DBUG_PRINT("info",("STRING_RESULT: %.*s",
s->length(), s->c_ptr_quick())); s->length(), s->c_ptr_quick()));
/* /*
Reuse mechanism in sp_eval_func_item() is only employed for assignments Reuse mechanism in sp_eval_func_item() is only employed for assignments
...@@ -354,7 +354,7 @@ sp_name::init_qname(THD *thd) ...@@ -354,7 +354,7 @@ sp_name::init_qname(THD *thd)
return; return;
m_qname.length= m_sroutines_key.length - 1; m_qname.length= m_sroutines_key.length - 1;
m_qname.str= m_sroutines_key.str + 1; m_qname.str= m_sroutines_key.str + 1;
sprintf(m_qname.str, "%*s.%*s", sprintf(m_qname.str, "%.*s.%.*s",
m_db.length, (m_db.length ? m_db.str : ""), m_db.length, (m_db.length ? m_db.str : ""),
m_name.length, m_name.str); m_name.length, m_name.str);
} }
......
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