mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	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.
		
			
				
	
	
		
			338 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			338 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
stop slave;
 | 
						|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 | 
						|
reset master;
 | 
						|
reset slave;
 | 
						|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 | 
						|
start slave;
 | 
						|
reset master;
 | 
						|
create table t1(n char(30));
 | 
						|
set @i1:=12345678901234, @i2:=-12345678901234, @i3:=0, @i4:=-1;
 | 
						|
set @s1:='This is a test', @r1:=12.5, @r2:=-12.5;
 | 
						|
set @n1:=null;
 | 
						|
set @s2:='', @s3:='abc\'def', @s4:= 'abc\\def', @s5:= 'abc''def';
 | 
						|
insert into t1 values (@i1), (@i2), (@i3), (@i4);
 | 
						|
insert into t1 values (@r1), (@r2);
 | 
						|
insert into t1 values (@s1), (@s2), (@s3), (@s4), (@s5);
 | 
						|
insert into t1 values (@n1);
 | 
						|
insert into t1 values (@n2);
 | 
						|
insert into t1 values (@a:=0), (@a:=@a+1), (@a:=@a+1);
 | 
						|
insert into t1 values (@a+(@b:=@a+1));
 | 
						|
set @q:='abc';
 | 
						|
insert t1 values (@q), (@q:=concat(@q, 'n1')), (@q:=concat(@q, 'n2'));
 | 
						|
set @a:=5;
 | 
						|
insert into t1 values (@a),(@a);
 | 
						|
insert into t1 values (@a),(@a),(@a*5);
 | 
						|
select * from t1;
 | 
						|
n
 | 
						|
12345678901234
 | 
						|
-12345678901234
 | 
						|
0
 | 
						|
-1
 | 
						|
12.5
 | 
						|
-12.5
 | 
						|
This is a test
 | 
						|
 | 
						|
abc'def
 | 
						|
abc\def
 | 
						|
abc'def
 | 
						|
NULL
 | 
						|
NULL
 | 
						|
0
 | 
						|
1
 | 
						|
2
 | 
						|
5
 | 
						|
abc
 | 
						|
abcn1
 | 
						|
abcn1n2
 | 
						|
5
 | 
						|
5
 | 
						|
NULL
 | 
						|
NULL
 | 
						|
NULL
 | 
						|
select * from t1;
 | 
						|
n
 | 
						|
12345678901234
 | 
						|
-12345678901234
 | 
						|
0
 | 
						|
-1
 | 
						|
12.5
 | 
						|
-12.5
 | 
						|
This is a test
 | 
						|
 | 
						|
abc'def
 | 
						|
abc\def
 | 
						|
abc'def
 | 
						|
NULL
 | 
						|
NULL
 | 
						|
0
 | 
						|
1
 | 
						|
2
 | 
						|
5
 | 
						|
abc
 | 
						|
abcn1
 | 
						|
abcn1n2
 | 
						|
5
 | 
						|
5
 | 
						|
NULL
 | 
						|
NULL
 | 
						|
NULL
 | 
						|
show binlog events from 98;
 | 
						|
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; create table t1(n char(30))
 | 
						|
slave-bin.000001	#	User var	2	#	@`i1`=12345678901234
 | 
						|
slave-bin.000001	#	User var	2	#	@`i2`=-12345678901234
 | 
						|
slave-bin.000001	#	User var	2	#	@`i3`=0
 | 
						|
slave-bin.000001	#	User var	2	#	@`i4`=-1
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@i1), (@i2), (@i3), (@i4)
 | 
						|
slave-bin.000001	#	User var	2	#	@`r1`=12.5
 | 
						|
slave-bin.000001	#	User var	2	#	@`r2`=-12.5
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@r1), (@r2)
 | 
						|
slave-bin.000001	#	User var	2	#	@`s1`=_latin1 0x5468697320697320612074657374 COLLATE latin1_swedish_ci
 | 
						|
slave-bin.000001	#	User var	2	#	@`s2`=_latin1 "" COLLATE latin1_swedish_ci
 | 
						|
slave-bin.000001	#	User var	2	#	@`s3`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci
 | 
						|
slave-bin.000001	#	User var	2	#	@`s4`=_latin1 0x6162635C646566 COLLATE latin1_swedish_ci
 | 
						|
slave-bin.000001	#	User var	2	#	@`s5`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@s1), (@s2), (@s3), (@s4), (@s5)
 | 
						|
slave-bin.000001	#	User var	2	#	@`n1`=NULL
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@n1)
 | 
						|
slave-bin.000001	#	User var	2	#	@`n2`=NULL
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@n2)
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@a:=0), (@a:=@a+1), (@a:=@a+1)
 | 
						|
slave-bin.000001	#	User var	2	#	@`a`=2
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@a+(@b:=@a+1))
 | 
						|
slave-bin.000001	#	User var	2	#	@`q`=_latin1 0x616263 COLLATE latin1_swedish_ci
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert t1 values (@q), (@q:=concat(@q, 'n1')), (@q:=concat(@q, 'n2'))
 | 
						|
slave-bin.000001	#	User var	2	#	@`a`=5
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@a),(@a)
 | 
						|
slave-bin.000001	#	User var	2	#	@`a`=NULL
 | 
						|
slave-bin.000001	#	Query	1	#	use `test`; insert into t1 values (@a),(@a),(@a*5)
 | 
						|
insert into t1 select * FROM (select @var1 union  select @var2) AS t2;
 | 
						|
drop table t1;
 | 
						|
End of 4.1 tests.
 | 
						|
DROP TABLE IF EXISTS t20;
 | 
						|
DROP TABLE IF EXISTS t21;
 | 
						|
DROP PROCEDURE IF EXISTS test.insert;
 | 
						|
CREATE TABLE t20 (a VARCHAR(20));
 | 
						|
CREATE TABLE t21 (a VARCHAR(20));
 | 
						|
CREATE PROCEDURE test.insert()
 | 
						|
BEGIN
 | 
						|
IF (@VAR)
 | 
						|
THEN
 | 
						|
INSERT INTO test.t20 VALUES ('SP_TRUE');
 | 
						|
ELSE
 | 
						|
INSERT INTO test.t20 VALUES ('SP_FALSE');
 | 
						|
END IF;
 | 
						|
END|
 | 
						|
CREATE TRIGGER test.insert_bi BEFORE INSERT
 | 
						|
ON test.t20 FOR EACH ROW
 | 
						|
BEGIN
 | 
						|
IF (@VAR)
 | 
						|
THEN
 | 
						|
INSERT INTO test.t21 VALUES ('TRIG_TRUE');
 | 
						|
ELSE
 | 
						|
INSERT INTO test.t21 VALUES ('TRIG_FALSE');
 | 
						|
END IF;
 | 
						|
END|
 | 
						|
SET @VAR=0;
 | 
						|
CALL test.insert();
 | 
						|
SET @VAR=1;
 | 
						|
CALL test.insert();
 | 
						|
On master: Check the tables for correct data
 | 
						|
SELECT * FROM t20;
 | 
						|
a
 | 
						|
SP_FALSE
 | 
						|
SP_TRUE
 | 
						|
SELECT * FROM t21;
 | 
						|
a
 | 
						|
TRIG_FALSE
 | 
						|
TRIG_TRUE
 | 
						|
On slave: Check the tables for correct data and it matches master
 | 
						|
SELECT * FROM t20;
 | 
						|
a
 | 
						|
SP_FALSE
 | 
						|
SP_TRUE
 | 
						|
SELECT * FROM t21;
 | 
						|
a
 | 
						|
TRIG_FALSE
 | 
						|
TRIG_TRUE
 | 
						|
DROP TABLE t20;
 | 
						|
DROP TABLE t21;
 | 
						|
DROP PROCEDURE test.insert;
 | 
						|
DROP TABLE IF EXISTS t1;
 | 
						|
DROP FUNCTION IF EXISTS test.square;
 | 
						|
CREATE TABLE t1 (i INT);
 | 
						|
CREATE FUNCTION test.square() RETURNS INTEGER DETERMINISTIC RETURN (@var * @var);
 | 
						|
SET @var = 1;
 | 
						|
INSERT INTO t1 VALUES (square());
 | 
						|
SET @var = 2;
 | 
						|
INSERT INTO t1 VALUES (square());
 | 
						|
SET @var = 3;
 | 
						|
INSERT INTO t1 VALUES (square());
 | 
						|
SET @var = 4;
 | 
						|
INSERT INTO t1 VALUES (square());
 | 
						|
SET @var = 5;
 | 
						|
INSERT INTO t1 VALUES (square());
 | 
						|
On master: Retrieve the values from the table
 | 
						|
SELECT * FROM t1;
 | 
						|
i
 | 
						|
1
 | 
						|
4
 | 
						|
9
 | 
						|
16
 | 
						|
25
 | 
						|
On slave: Retrieve the values from the table and verify they are the same as on master
 | 
						|
SELECT * FROM t1;
 | 
						|
i
 | 
						|
1
 | 
						|
4
 | 
						|
9
 | 
						|
16
 | 
						|
25
 | 
						|
DROP TABLE t1;
 | 
						|
DROP FUNCTION test.square;
 | 
						|
DROP TABLE IF EXISTS t1;
 | 
						|
DROP FUNCTION IF EXISTS f1;
 | 
						|
DROP FUNCTION IF EXISTS f2;
 | 
						|
CREATE TABLE t1(a int);
 | 
						|
CREATE FUNCTION f1() returns int deterministic
 | 
						|
BEGIN
 | 
						|
return @a;
 | 
						|
END |
 | 
						|
CREATE FUNCTION f2() returns int deterministic
 | 
						|
BEGIN
 | 
						|
IF (@b > 0) then
 | 
						|
SET @c = (@a + @b);
 | 
						|
else
 | 
						|
SET @c = (@a - 1);
 | 
						|
END if;
 | 
						|
return @c;
 | 
						|
END |
 | 
						|
SET @a=500;
 | 
						|
INSERT INTO t1 values(f1());
 | 
						|
SET @b = 125;
 | 
						|
SET @c = 1;
 | 
						|
INSERT INTO t1 values(f2());
 | 
						|
On master: Retrieve the values from the table
 | 
						|
SELECT * from t1;
 | 
						|
a
 | 
						|
500
 | 
						|
625
 | 
						|
On slave: Check the tables for correct data and it matches master
 | 
						|
SELECT * from t1;
 | 
						|
a
 | 
						|
500
 | 
						|
625
 | 
						|
DROP TABLE t1;
 | 
						|
DROP FUNCTION f1;
 | 
						|
DROP FUNCTION f2;
 | 
						|
DROP TABLE IF EXISTS t1;
 | 
						|
DROP TABLE IF EXISTS t2;
 | 
						|
CREATE TABLE t1 (i int);
 | 
						|
CREATE TABLE t2 (k int);
 | 
						|
CREATE trigger t1_bi before INSERT on t1 for each row
 | 
						|
BEGIN
 | 
						|
INSERT INTO t2 values (@a);
 | 
						|
SET @a:=42;
 | 
						|
INSERT INTO t2 values (@a);
 | 
						|
END |
 | 
						|
SET @a:=100;
 | 
						|
INSERT INTO t1 values (5);
 | 
						|
On master: Check to see that data was inserted correctly in both tables
 | 
						|
SELECT * from t1;
 | 
						|
i
 | 
						|
5
 | 
						|
SELECT * from t2;
 | 
						|
k
 | 
						|
100
 | 
						|
42
 | 
						|
On slave: Check the tables for correct data and it matches master
 | 
						|
SELECT * from t1;
 | 
						|
i
 | 
						|
5
 | 
						|
SELECT * from t2;
 | 
						|
k
 | 
						|
100
 | 
						|
42
 | 
						|
drop table t1, t2;
 | 
						|
reset master;
 | 
						|
create table t1 (a int);
 | 
						|
prepare s from "insert into t1 values (@a),(?)";
 | 
						|
set @a=98;
 | 
						|
execute s using @a;
 | 
						|
prepare s from "insert into t1 values (?)";
 | 
						|
set @a=99;
 | 
						|
execute s using @a;
 | 
						|
prepare s from "insert into t1 select 100 limit ?";
 | 
						|
set @a=100;
 | 
						|
execute s using @a;
 | 
						|
show binlog events from 98;
 | 
						|
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 | 
						|
slave-bin.000001	98	Query	1	184	use `test`; create table t1 (a int)
 | 
						|
slave-bin.000001	184	User var	2	226	@`a`=98
 | 
						|
slave-bin.000001	226	Query	1	320	use `test`; insert into t1 values (@a),(98)
 | 
						|
slave-bin.000001	320	Query	1	409	use `test`; insert into t1 values (99)
 | 
						|
slave-bin.000001	409	Query	1	507	use `test`; insert into t1 select 100 limit 100
 | 
						|
select * from t1;
 | 
						|
a
 | 
						|
98
 | 
						|
98
 | 
						|
99
 | 
						|
100
 | 
						|
drop table t1;
 | 
						|
create table t1(a int, b int);
 | 
						|
prepare s1 from 'insert into t1 values (@x:=@x+1, ?)';
 | 
						|
set @x=1;
 | 
						|
execute s1 using @x;
 | 
						|
select * from t1;
 | 
						|
a	b
 | 
						|
2	1
 | 
						|
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;
 | 
						|
CREATE TABLE t1 (i INT);
 | 
						|
CREATE FUNCTION f1() RETURNS INT RETURN @a;
 | 
						|
CREATE FUNCTION f2() RETURNS INT
 | 
						|
BEGIN
 | 
						|
INSERT INTO t1 VALUES (10 + @a);
 | 
						|
RETURN 0;
 | 
						|
END|
 | 
						|
SET @a:=123;
 | 
						|
SELECT f1(), f2();
 | 
						|
f1()	f2()
 | 
						|
123	0
 | 
						|
On master: Check to see that data was inserted correctly 
 | 
						|
INSERT INTO t1 VALUES(f1());
 | 
						|
SELECT * FROM t1;
 | 
						|
i
 | 
						|
133
 | 
						|
123
 | 
						|
On slave: Check the table for correct data and it matches master
 | 
						|
SELECT * FROM t1;
 | 
						|
i
 | 
						|
133
 | 
						|
123
 | 
						|
DROP FUNCTION f1;
 | 
						|
DROP FUNCTION f2;
 | 
						|
DROP TABLE t1;
 | 
						|
stop slave;
 |