diff options
author | unknown <davi@mysql.com/endora.local> | 2008-02-28 11:34:08 -0300 |
---|---|---|
committer | unknown <davi@mysql.com/endora.local> | 2008-02-28 11:34:08 -0300 |
commit | 1164e2bc7a6dc18b33e401f0a9f6949c6f2ff6ea (patch) | |
tree | 5b1788366dab7561e122e3742019bf6d0429c289 /mysql-test | |
parent | b43f8f695c152849f47b1a33e54ba0009144bc10 (diff) | |
download | mariadb-git-1164e2bc7a6dc18b33e401f0a9f6949c6f2ff6ea.tar.gz |
Bug#33851 Passing UNSIGNED param to EXECUTE returns ERROR 1210
The problem is that passing anything other than a integer to a limit
clause in a prepared statement would fail. This limitation was introduced
to avoid replication problems (e.g: replicating the statement with a
string argument would cause a parse failure in the slave).
The solution is to convert arguments to the limit clause to a integer
value and use this converted value when persisting the query to the log.
mysql-test/r/limit.result:
Update test case result.
mysql-test/r/ps.result:
Add test case result for Bug#33851
mysql-test/r/rpl_user_variables.result:
Test case result for replication of prepared statement with
limit clause.
mysql-test/t/limit.test:
Test parameters to limit clause.
mysql-test/t/ps.test:
Add test case for Bug#33851
mysql-test/t/rpl_user_variables.test:
Test replication of a parameter which value is converted.
sql/item.cc:
Convert value to integer if it's a parameter to a limit clause.
sql/item.h:
Flag signal that item is a parameter to a limit clause.
sql/item_func.cc:
Const member functions, object is not mutated.
sql/sql_class.h:
Const member functions, object is not mutated.
sql/sql_yacc.yy:
Flag that item is a parameter to a limit clause.
Diffstat (limited to 'mysql-test')
-rw-r--r-- | mysql-test/r/limit.result | 9 | ||||
-rw-r--r-- | mysql-test/r/ps.result | 30 | ||||
-rw-r--r-- | mysql-test/r/rpl_user_variables.result | 16 | ||||
-rw-r--r-- | mysql-test/t/limit.test | 17 | ||||
-rw-r--r-- | mysql-test/t/ps.test | 19 | ||||
-rw-r--r-- | mysql-test/t/rpl_user_variables.test | 17 |
6 files changed, 103 insertions, 5 deletions
diff --git a/mysql-test/r/limit.result b/mysql-test/r/limit.result index 01d7d7ca218..2acf74162a4 100644 --- a/mysql-test/r/limit.result +++ b/mysql-test/r/limit.result @@ -94,6 +94,9 @@ drop table t1; prepare s from "select 1 limit ?"; set @a='qwe'; execute s using @a; +1 +set @a=-1; +execute s using @a; ERROR HY000: Incorrect arguments to EXECUTE prepare s from "select 1 limit 1, ?"; execute s using @a; @@ -101,4 +104,10 @@ ERROR HY000: Incorrect arguments to EXECUTE prepare s from "select 1 limit ?, ?"; execute s using @a, @a; ERROR HY000: Incorrect arguments to EXECUTE +set @a=14632475938453979136; +execute s using @a, @a; +1 +set @a=-14632475938453979136; +execute s using @a, @a; +ERROR HY000: Incorrect arguments to EXECUTE End of 5.0 tests diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 32f48a688e2..9aef58d5702 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -1861,4 +1861,34 @@ prepare stmt from "create view v1 as select * from t1"; ERROR 42S02: Table 'test.t1' doesn't exist prepare stmt from "create view v1 as select * from `t1` `b`"; ERROR 42S02: Table 'test.t1' doesn't exist +prepare stmt from "select ?"; +set @arg= 123456789.987654321; +select @arg; +@arg +123456789.987654321 +execute stmt using @arg; +? +123456789.987654321 +set @arg= "string"; +select @arg; +@arg +string +execute stmt using @arg; +? +string +set @arg= 123456; +select @arg; +@arg +123456 +execute stmt using @arg; +? +123456 +set @arg= cast(-12345.54321 as decimal(20, 10)); +select @arg; +@arg +-12345.5432100000 +execute stmt using @arg; +? +-12345.5432100000 +deallocate prepare stmt; End of 5.0 tests. diff --git a/mysql-test/r/rpl_user_variables.result b/mysql-test/r/rpl_user_variables.result index 26ac2b26aaa..b8032a9c362 100644 --- a/mysql-test/r/rpl_user_variables.result +++ b/mysql-test/r/rpl_user_variables.result @@ -290,6 +290,22 @@ select * from t1; a b 2 1 drop table t1; +create table t1(a int); +insert into t1 values (1),(2); +prepare s1 from 'insert into t1 select a from t1 limit ?'; +set @x='1.1'; +execute s1 using @x; +select * from t1; +a +1 +2 +1 +select * from t1; +a +1 +2 +1 +drop table t1; End of 5.0 tests. DROP FUNCTION IF EXISTS f1; DROP FUNCTION IF EXISTS f2; diff --git a/mysql-test/t/limit.test b/mysql-test/t/limit.test index 286c04785ff..9cccca1adc3 100644 --- a/mysql-test/t/limit.test +++ b/mysql-test/t/limit.test @@ -76,15 +76,22 @@ drop table t1; # Bug #28464: a string argument to 'limit ?' PS # -prepare s from "select 1 limit ?"; -set @a='qwe'; ---error 1210 +prepare s from "select 1 limit ?"; +set @a='qwe'; +execute s using @a; +set @a=-1; +--error ER_WRONG_ARGUMENTS execute s using @a; prepare s from "select 1 limit 1, ?"; ---error 1210 +--error ER_WRONG_ARGUMENTS execute s using @a; prepare s from "select 1 limit ?, ?"; ---error 1210 +--error ER_WRONG_ARGUMENTS +execute s using @a, @a; +set @a=14632475938453979136; +execute s using @a, @a; +set @a=-14632475938453979136; +--error ER_WRONG_ARGUMENTS execute s using @a, @a; --echo End of 5.0 tests diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 58ba901d82b..6c3f98f6a1a 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -1947,4 +1947,23 @@ prepare stmt from "create view v1 as select * from t1"; --error ER_NO_SUCH_TABLE prepare stmt from "create view v1 as select * from `t1` `b`"; +# +# Bug#33851: Passing UNSIGNED param to EXECUTE returns ERROR 1210 +# + +prepare stmt from "select ?"; +set @arg= 123456789.987654321; +select @arg; +execute stmt using @arg; +set @arg= "string"; +select @arg; +execute stmt using @arg; +set @arg= 123456; +select @arg; +execute stmt using @arg; +set @arg= cast(-12345.54321 as decimal(20, 10)); +select @arg; +execute stmt using @arg; +deallocate prepare stmt; + --echo End of 5.0 tests. diff --git a/mysql-test/t/rpl_user_variables.test b/mysql-test/t/rpl_user_variables.test index 8f8f0accbd1..70b708be258 100644 --- a/mysql-test/t/rpl_user_variables.test +++ b/mysql-test/t/rpl_user_variables.test @@ -337,6 +337,23 @@ select * from t1; connection master; drop table t1; +# +# Bug#33851: Passing UNSIGNED param to EXECUTE returns ERROR 1210 +# + +connection master; +create table t1(a int); +insert into t1 values (1),(2); +prepare s1 from 'insert into t1 select a from t1 limit ?'; +set @x='1.1'; +execute s1 using @x; +select * from t1; +sync_slave_with_master; +connection slave; +select * from t1; +connection master; +drop table t1; + --echo End of 5.0 tests. # This test uses a stored function that uses user-defined variables to return data |