mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Merge mysql.com:/usr/local/bk/mysql-5.0
into mysql.com:/usr/home/pem/mysql-5.1-new
This commit is contained in:
commit
e7a7af07b2
14 changed files with 124 additions and 27 deletions
|
@ -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 @@ public:
|
|||
{
|
||||
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 @@ public:
|
|||
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 @@ public:
|
|||
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 @@ public:
|
|||
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 @@ public:
|
|||
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 @@ private:
|
|||
|
||||
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;
|
||||
|
|
Loading…
Reference in a new issue