summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/func_math.result5
-rw-r--r--mysql-test/r/ps.result44
-rw-r--r--mysql-test/t/func_math.test9
-rw-r--r--mysql-test/t/ps.test4
-rw-r--r--sql/item_func.cc5
5 files changed, 41 insertions, 26 deletions
diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result
index 80b15d1d3c8..b36902d7872 100644
--- a/mysql-test/r/func_math.result
+++ b/mysql-test/r/func_math.result
@@ -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;
diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result
index c17015df757..f5bf3ffa96d 100644
--- a/mysql-test/r/ps.result
+++ b/mysql-test/r/ps.result
@@ -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;
diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test
index ebbc594952c..c75454a96d4 100644
--- a/mysql-test/t/func_math.test
+++ b/mysql-test/t/func_math.test
@@ -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
diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test
index 5a2e469fbc4..c4cb0056763 100644
--- a/mysql-test/t/ps.test
+++ b/mysql-test/t/ps.test
@@ -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 -
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 41573406949..ebb200ec4da 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -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