Commit 487f5536 authored by unknown's avatar unknown

Merge mysql.com:/usr/local/bk/mysql-5.0

into  mysql.com:/usr/home/pem/mysql-5.1-new


mysql-test/r/sp.result:
  Auto merged
sql/field.cc:
  Auto merged
sql/item.cc:
  Auto merged
sql/item.h:
  Auto merged
sql/item_func.cc:
  Auto merged
sql/item_sum.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents de74f787 3b94510a
......@@ -337,7 +337,7 @@ set @precision=10000000000;
select rand(),
cast(rand(10)*@precision as unsigned integer) from t1;
rand() cast(rand(10)*@precision as unsigned integer)
- 6570515219
- 6570515220
- 1282061302
- 6698761160
- 9647622201
......@@ -348,23 +348,23 @@ prepare stmt from
set @var=1;
execute stmt using @var;
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(?)*@precision as unsigned integer)
- 6570515219 -
- 6570515220 -
- 1282061302 -
- 6698761160 -
- 9647622201 -
set @var=2;
execute stmt using @var;
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(?)*@precision as unsigned integer)
- 6570515219 6555866465
- 1282061302 1223466192
- 6698761160 6449731873
- 6570515220 6555866465
- 1282061302 1223466193
- 6698761160 6449731874
- 9647622201 8578261098
set @var=3;
execute stmt using @var;
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(?)*@precision as unsigned integer)
- 6570515219 9057697559
- 6570515220 9057697560
- 1282061302 3730790581
- 6698761160 1480860534
- 6698761160 1480860535
- 9647622201 6211931236
drop table t1;
deallocate prepare stmt;
......
......@@ -4070,4 +4070,33 @@ a
3
drop procedure bug14304|
drop table t3, t4|
drop procedure if exists bug14376|
create procedure bug14376()
begin
declare x int default x;
end|
call bug14376()|
ERROR 42S22: Unknown column 'x' in 'field list'
drop procedure bug14376|
create procedure bug14376()
begin
declare x int default 42;
begin
declare x int default x;
select x;
end;
end|
call bug14376()|
x
42
drop procedure bug14376|
create procedure bug14376(x int)
begin
declare x int default x;
select x;
end|
call bug14376(4711)|
x
4711
drop procedure bug14376|
drop table t1,t2;
......@@ -17,7 +17,7 @@ while ($1)
SET @rnd= RAND();
SET @id = CAST(@rnd * @rnd_max AS UNSIGNED);
SET @id_rev= @rnd_max - @id;
SET @grp= CAST(128.0 * @rnd AS UNSIGNED);
SET @grp= CAST(127.0 * @rnd AS UNSIGNED);
INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev);
dec $1;
}
......
......@@ -4855,6 +4855,51 @@ call bug14304()|
drop procedure bug14304|
drop table t3, t4|
#
# BUG#14376: MySQL crash on scoped variable (re)initialization
#
--disable_warnings
drop procedure if exists bug14376|
--enable_warnings
create procedure bug14376()
begin
declare x int default x;
end|
# Not the error we want, but that's what we got for now...
--error ER_BAD_FIELD_ERROR
call bug14376()|
drop procedure bug14376|
create procedure bug14376()
begin
declare x int default 42;
begin
declare x int default x;
select x;
end;
end|
call bug14376()|
drop procedure bug14376|
create procedure bug14376(x int)
begin
declare x int default x;
select x;
end|
call bug14376(4711)|
drop procedure bug14376|
#
# BUG#NNNN: New bug synopsis
#
......
......@@ -3958,7 +3958,7 @@ longlong Field_float::val_int(void)
else
#endif
memcpy_fixed((byte*) &j,ptr,sizeof(j));
return ((longlong) j);
return (longlong) rint(j);
}
......@@ -4246,7 +4246,7 @@ longlong Field_double::val_int(void)
else
#endif
doubleget(j,ptr);
return ((longlong) j);
return (longlong) rint(j);
}
......
......@@ -2460,7 +2460,7 @@ longlong Item_param::val_int()
{
switch (state) {
case REAL_VALUE:
return (longlong) (value.real + (value.real > 0 ? 0.5 : -0.5));
return (longlong) rint(value.real);
case INT_VALUE:
return value.integer;
case DECIMAL_VALUE:
......@@ -5483,7 +5483,7 @@ void Item_cache_real::store(Item *item)
longlong Item_cache_real::val_int()
{
DBUG_ASSERT(fixed == 1);
return (longlong) (value+(value > 0 ? 0.5 : -0.5));
return (longlong) rint(value);
}
......
......@@ -159,7 +159,7 @@ struct Hybrid_type_traits
{ val->real/= ulonglong2double(u); }
virtual longlong val_int(Hybrid_type *val, bool unsigned_flag) const
{ return (longlong) val->real; }
{ return (longlong) rint(val->real); }
virtual double val_real(Hybrid_type *val) const { return val->real; }
virtual my_decimal *val_decimal(Hybrid_type *val, my_decimal *buf) const;
virtual String *val_str(Hybrid_type *val, String *buf, uint8 decimals) const;
......@@ -1354,7 +1354,7 @@ class Item_float :public Item_num
{
return LONGLONG_MAX;
}
return (longlong) (value+(value > 0 ? 0.5 : -0.5));
return (longlong) rint(value);
}
String *val_str(String*);
my_decimal *val_decimal(my_decimal *);
......
......@@ -737,7 +737,7 @@ longlong Item_func_numhybrid::val_int()
case INT_RESULT:
return int_op();
case REAL_RESULT:
return (longlong)real_op();
return (longlong) rint(real_op());
case STRING_RESULT:
{
int err_not_used;
......
......@@ -199,7 +199,7 @@ class Item_real_func :public Item_func
String *val_str(String*str);
my_decimal *val_decimal(my_decimal *decimal_value);
longlong val_int()
{ DBUG_ASSERT(fixed == 1); return (longlong) val_real(); }
{ DBUG_ASSERT(fixed == 1); return (longlong) rint(val_real()); }
enum Item_result result_type () const { return REAL_RESULT; }
void fix_length_and_dec()
{ decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
......@@ -943,7 +943,7 @@ class Item_func_udf_float :public Item_udf_func
longlong val_int()
{
DBUG_ASSERT(fixed == 1);
return (longlong) Item_func_udf_float::val_real();
return (longlong) rint(Item_func_udf_float::val_real());
}
my_decimal *val_decimal(my_decimal *dec_buf)
{
......
......@@ -465,7 +465,7 @@ longlong Item_sum_sum::val_int()
&result);
return result;
}
return (longlong) val_real();
return (longlong) rint(val_real());
}
......@@ -1308,7 +1308,7 @@ longlong Item_sum_hybrid::val_int()
return sum_int;
}
default:
return (longlong) Item_sum_hybrid::val_real();
return (longlong) rint(Item_sum_hybrid::val_real());
}
}
......@@ -2024,7 +2024,7 @@ double Item_avg_field::val_real()
longlong Item_avg_field::val_int()
{
return (longlong) val_real();
return (longlong) rint(val_real());
}
......
......@@ -126,7 +126,7 @@ class Item_sum_num :public Item_sum
longlong val_int()
{
DBUG_ASSERT(fixed == 1);
return (longlong) val_real(); /* Real as default */
return (longlong) rint(val_real()); /* Real as default */
}
String *val_str(String*str);
my_decimal *val_decimal(my_decimal *);
......@@ -392,7 +392,7 @@ class Item_sum_avg :public Item_sum_sum
bool add();
double val_real();
// In SPs we might force the "wrong" type with select into a declare variable
longlong val_int() { return (longlong)val_real(); }
longlong val_int() { return (longlong) rint(val_real()); }
my_decimal *val_decimal(my_decimal *);
String *val_str(String *str);
void reset_field();
......@@ -421,7 +421,7 @@ class Item_variance_field :public Item_result_field
enum Type type() const {return FIELD_VARIANCE_ITEM; }
double val_real();
longlong val_int()
{ /* can't be fix_fields()ed */ return (longlong) val_real(); }
{ /* can't be fix_fields()ed */ return (longlong) rint(val_real()); }
String *val_str(String*);
my_decimal *val_decimal(my_decimal *);
bool is_null() { (void) val_int(); return null_value; }
......@@ -699,7 +699,7 @@ class Item_sum_udf_float :public Item_udf_sum
longlong val_int()
{
DBUG_ASSERT(fixed == 1);
return (longlong) Item_sum_udf_float::val_real();
return (longlong) rint(Item_sum_udf_float::val_real());
}
double val_real();
String *val_str(String*str);
......
......@@ -52,7 +52,7 @@ sp_cond_check(LEX_STRING *sqlstate)
sp_pcontext::sp_pcontext(sp_pcontext *prev)
: Sql_alloc(), m_psubsize(0), m_csubsize(0), m_hsubsize(0),
m_handlers(0), m_parent(prev)
m_handlers(0), m_parent(prev), m_pboundary(0)
{
VOID(my_init_dynamic_array(&m_pvar, sizeof(sp_pvar_t *), 16, 8));
VOID(my_init_dynamic_array(&m_cond, sizeof(sp_cond_type_t *), 16, 8));
......@@ -150,7 +150,7 @@ sp_pcontext::diff_cursors(sp_pcontext *ctx)
sp_pvar_t *
sp_pcontext::find_pvar(LEX_STRING *name, my_bool scoped)
{
uint i= m_pvar.elements;
uint i= m_pvar.elements - m_pboundary;
while (i--)
{
......
......@@ -174,6 +174,16 @@ class sp_pcontext : public Sql_alloc
sp_pvar_t *
find_pvar(uint offset);
/*
Set the current scope boundary (for default values)
The argument is the number of variables to skip.
*/
inline void
declare_var_boundary(uint n)
{
m_pboundary= n;
}
//
// Labels
//
......@@ -282,6 +292,13 @@ class sp_pcontext : public Sql_alloc
uint m_poffset; // Variable offset for this context
uint m_coffset; // Cursor offset for this context
/*
Boundary for finding variables in this context. This is the number
of variables currently "invisible" to default clauses.
This is normally 0, but will be larger during parsing of
DECLARE ... DEFAULT, to get the scope right for DEFAULT values.
*/
uint m_pboundary;
DYNAMIC_ARRAY m_pvar; // Parameters/variables
DYNAMIC_ARRAY m_cond; // Conditions
......
......@@ -1619,7 +1619,12 @@ sp_decls:
sp_decl:
DECLARE_SYM sp_decl_idents type
{ Lex->sphead->reset_lex(YYTHD); }
{
LEX *lex= Lex;
lex->sphead->reset_lex(YYTHD);
lex->spcont->declare_var_boundary($2);
}
sp_opt_default
{
LEX *lex= Lex;
......@@ -1650,6 +1655,7 @@ sp_decl:
lex->sphead->add_instr(in);
ctx->set_default(off, it);
}
ctx->declare_var_boundary(0);
lex->sphead->restore_lex(YYTHD);
$$.vars= $2;
$$.conds= $$.hndlrs= $$.curs= 0;
......
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