Automerge
This commit is contained in:
commit
392bd292e2
@ -456,4 +456,23 @@ NULL
|
|||||||
SELECT POW(10, 309);
|
SELECT POW(10, 309);
|
||||||
POW(10, 309)
|
POW(10, 309)
|
||||||
NULL
|
NULL
|
||||||
|
#
|
||||||
|
# Bug #44768: SIGFPE crash when selecting rand from a view
|
||||||
|
# containing null
|
||||||
|
#
|
||||||
|
CREATE OR REPLACE VIEW v1 AS SELECT NULL AS a;
|
||||||
|
SELECT RAND(a) FROM v1;
|
||||||
|
RAND(a)
|
||||||
|
0.155220427694936
|
||||||
|
DROP VIEW v1;
|
||||||
|
SELECT RAND(a) FROM (SELECT NULL AS a) b;
|
||||||
|
RAND(a)
|
||||||
|
0.155220427694936
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
SELECT RAND(i) FROM t1;
|
||||||
|
RAND(i)
|
||||||
|
0.155220427694936
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -282,4 +282,22 @@ SELECT 1e300 / 1e-300;
|
|||||||
SELECT EXP(750);
|
SELECT EXP(750);
|
||||||
SELECT POW(10, 309);
|
SELECT POW(10, 309);
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #44768: SIGFPE crash when selecting rand from a view
|
||||||
|
--echo # containing null
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE OR REPLACE VIEW v1 AS SELECT NULL AS a;
|
||||||
|
SELECT RAND(a) FROM v1;
|
||||||
|
DROP VIEW v1;
|
||||||
|
|
||||||
|
SELECT RAND(a) FROM (SELECT NULL AS a) b;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
SELECT RAND(i) FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -2143,9 +2143,6 @@ bool Item_func_rand::fix_fields(THD *thd,Item **ref)
|
|||||||
if (!rand && !(rand= (struct rand_struct*)
|
if (!rand && !(rand= (struct rand_struct*)
|
||||||
thd->stmt_arena->alloc(sizeof(*rand))))
|
thd->stmt_arena->alloc(sizeof(*rand))))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (args[0]->const_item())
|
|
||||||
seed_random (args[0]);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2175,8 +2172,21 @@ void Item_func_rand::update_used_tables()
|
|||||||
double Item_func_rand::val_real()
|
double Item_func_rand::val_real()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
if (arg_count && !args[0]->const_item())
|
if (arg_count)
|
||||||
seed_random (args[0]);
|
{
|
||||||
|
if (!args[0]->const_item())
|
||||||
|
seed_random(args[0]);
|
||||||
|
else if (first_eval)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Constantness of args[0] may be set during JOIN::optimize(), if arg[0]
|
||||||
|
is a field item of "constant" table. Thus, we have to evaluate
|
||||||
|
seed_random() for constant arg there but not at the fix_fields method.
|
||||||
|
*/
|
||||||
|
first_eval= FALSE;
|
||||||
|
seed_random(args[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
return my_rnd(rand);
|
return my_rnd(rand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,14 +696,16 @@ public:
|
|||||||
class Item_func_rand :public Item_real_func
|
class Item_func_rand :public Item_real_func
|
||||||
{
|
{
|
||||||
struct rand_struct *rand;
|
struct rand_struct *rand;
|
||||||
|
bool first_eval; // TRUE if val_real() is called 1st time
|
||||||
public:
|
public:
|
||||||
Item_func_rand(Item *a) :Item_real_func(a), rand(0) {}
|
Item_func_rand(Item *a) :Item_real_func(a), rand(0), first_eval(TRUE) {}
|
||||||
Item_func_rand() :Item_real_func() {}
|
Item_func_rand() :Item_real_func() {}
|
||||||
double val_real();
|
double val_real();
|
||||||
const char *func_name() const { return "rand"; }
|
const char *func_name() const { return "rand"; }
|
||||||
bool const_item() const { return 0; }
|
bool const_item() const { return 0; }
|
||||||
void update_used_tables();
|
void update_used_tables();
|
||||||
bool fix_fields(THD *thd, Item **ref);
|
bool fix_fields(THD *thd, Item **ref);
|
||||||
|
void cleanup() { first_eval= TRUE; Item_real_func::cleanup(); }
|
||||||
private:
|
private:
|
||||||
void seed_random (Item * val);
|
void seed_random (Item * val);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user