mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
Bug #6172 RAND(a) should only accept constant values as arguments(2nd version)
Argument of RAND function can be constant value only
This commit is contained in:
parent
f53de1f247
commit
61a5fac1cc
5 changed files with 43 additions and 28 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
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(?)*@precision as unsigned integer) from t1";
|
||||
set @var=1;
|
||||
execute stmt using @var;
|
||||
rand() cast(rand(10)*@precision as unsigned integer) cast(rand(?)*@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
|
||||
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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 -
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue