1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

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.
This commit is contained in:
unknown
2008-02-28 11:34:08 -03:00
parent b43f8f695c
commit 1164e2bc7a
11 changed files with 116 additions and 18 deletions

View File

@ -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

View File

@ -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.

View File

@ -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