Commit 61a5fac1 authored by unknown's avatar unknown
Browse files

Bug #6172 RAND(a) should only accept constant values as arguments(2nd version)

  Argument of RAND function can be constant value only

parent f53de1f2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -140,3 +140,8 @@ drop table t1;
select abs(-2) * -2;
abs(-2) * -2
-4
create table t1 (i int);
insert into t1 values (1);
select rand(i) from t1;
ERROR HY000: Incorrect arguments to RAND
drop table t1;
+21 −23
Original line number Diff line number Diff line
@@ -334,39 +334,37 @@ create table t1 (a int);
insert into t1 (a) values (1), (2), (3), (4);
set @precision=10000000000;
select rand(), 
cast(rand(10)*@precision as unsigned integer),
cast(rand(a)*@precision as unsigned integer) from t1;
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(a)*@precision as unsigned integer)
-	6570515219	-
-	1282061302	-
-	6698761160	-
-	9647622201	-
cast(rand(10)*@precision as unsigned integer) from t1;
rand()	cast(rand(10)*@precision as unsigned integer)
-	6570515219
-	1282061302
-	6698761160
-	9647622201
prepare stmt from
"select rand(), 
        cast(rand(10)*@precision as unsigned integer),
        cast(rand(a)*@precision as unsigned integer),
        cast(rand(?)*@precision as unsigned integer) from t1";
set @var=1;
execute stmt using @var;
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(a)*@precision as unsigned integer)	cast(rand(?)*@precision as unsigned integer)
-	6570515219	-	4054035371
-	1282061302	-	8716141803
-	6698761160	-	1418603212
-	9647622201	-	944590960
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(?)*@precision as unsigned integer)
-	6570515219	-
-	1282061302	-
-	6698761160	-
-	9647622201	-
set @var=2;
execute stmt using @var;
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(a)*@precision as unsigned integer)	cast(rand(?)*@precision as unsigned integer)
-	6570515219	1559528654	6555866465
-	1282061302	6238114970	1223466192
-	6698761160	6511989195	6449731873
-	9647622201	3845601374	8578261098
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(?)*@precision as unsigned integer)
-	6570515219	6555866465
-	1282061302	1223466192
-	6698761160	6449731873
-	9647622201	8578261098
set @var=3;
execute stmt using @var;
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(a)*@precision as unsigned integer)	cast(rand(?)*@precision as unsigned integer)
-	6570515219	1559528654	9057697559
-	1282061302	6238114970	3730790581
-	6698761160	6511989195	1480860534
-	9647622201	3845601374	6211931236
rand()	cast(rand(10)*@precision as unsigned integer)	cast(rand(?)*@precision as unsigned integer)
-	6570515219	9057697559
-	1282061302	3730790581
-	6698761160	1480860534
-	9647622201	6211931236
drop table t1;
deallocate prepare stmt;
create database mysqltest1;
+9 −0
Original line number Diff line number Diff line
@@ -77,4 +77,13 @@ drop table t1;
#
select abs(-2) * -2;

#
# Bug #6172 RAND(a) should only accept constant values as arguments
#
create table t1 (i int);
insert into t1 values (1);
--error 1210
select rand(i) from t1;
drop table t1;

# End of 4.1 tests
+1 −3
Original line number Diff line number Diff line
@@ -368,12 +368,10 @@ insert into t1 (a) values (1), (2), (3), (4);
set @precision=10000000000;
--replace_column 1 - 3 -
select rand(), 
       cast(rand(10)*@precision as unsigned integer),
       cast(rand(a)*@precision as unsigned integer) from t1;
       cast(rand(10)*@precision as unsigned integer) from t1;
prepare stmt from
"select rand(), 
        cast(rand(10)*@precision as unsigned integer),
        cast(rand(a)*@precision as unsigned integer),
        cast(rand(?)*@precision as unsigned integer) from t1";
set @var=1;
--replace_column 1 - 3 -
+5 −0
Original line number Diff line number Diff line
@@ -1038,6 +1038,11 @@ bool Item_func_rand::fix_fields(THD *thd, struct st_table_list *tables,
  used_tables_cache|= RAND_TABLE_BIT;
  if (arg_count)
  {					// Only use argument once in query
    if (!args[0]->const_during_execution())
    {
      my_error(ER_WRONG_ARGUMENTS, MYF(0), "RAND");
      return TRUE;
    }
    /*
      Allocate rand structure once: we must use thd->current_arena
      to create rand in proper mem_root if it's a prepared statement or