2
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
5
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
7
==== 0. Setting it all up ====
8
SET BINLOG_FORMAT=STATEMENT;
10
CREATE TABLE t1 (a INT);
11
CREATE TABLE logtbl (sect INT, test INT, count INT);
12
INSERT INTO t1 VALUES (1),(2),(3);
13
INSERT INTO t1 SELECT 2*a+3 FROM t1;
14
INSERT INTO t1 SELECT 2*a+3 FROM t1;
15
INSERT INTO t1 SELECT 2*a+3 FROM t1;
16
INSERT INTO t1 SELECT 2*a+3 FROM t1;
17
INSERT INTO t1 SELECT 2*a+3 FROM t1;
18
INSERT INTO t1 SELECT 2*a+3 FROM t1;
19
#### 1. Using statement mode ####
20
==== 1.1. Simple test ====
21
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
24
SELECT FOUND_ROWS() INTO @a;
25
INSERT INTO logtbl VALUES(1,1,@a);
26
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
29
SELECT FOUND_ROWS() INTO @a;
30
INSERT INTO logtbl VALUES(1,2,@a);
31
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
36
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
40
==== 1.2. Stored procedure ====
42
CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN
44
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
45
SELECT FOUND_ROWS() INTO cnt;
46
INSERT INTO logtbl VALUES(sect,test,cnt);
47
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
48
SELECT FOUND_ROWS() INTO cnt;
49
INSERT INTO logtbl VALUES(sect,test+1,cnt);
51
CALL calc_and_log(2,1);
56
CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN
57
INSERT INTO logtbl VALUES (sect,test,found_rows);
59
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
62
SELECT FOUND_ROWS() INTO @found_rows;
63
CALL just_log(2,3,@found_rows);
64
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
70
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
75
==== 1.3. Stored functions ====
77
CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT)
80
INSERT INTO logtbl VALUES(sect,test,found_rows);
83
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
86
SELECT FOUND_ROWS() INTO @found_rows;
87
SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows);
88
log_rows(3,1,@found_rows) log_rows(3,2,@found_rows)
90
SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
95
SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
99
==== 1.9. Cleanup ====
102
DROP PROCEDURE just_log;
103
DROP PROCEDURE calc_and_log;
104
DROP FUNCTION log_rows;
105
**** Resetting master and slave ****
110
#### 2. Using mixed mode ####
111
==== 2.1. Checking a procedure ====
113
SET BINLOG_FORMAT=MIXED;
114
CREATE PROCEDURE just_log(sect INT, test INT) BEGIN
115
INSERT INTO logtbl VALUES (sect,test,FOUND_ROWS());
117
**** On Master 1 ****
118
SET BINLOG_FORMAT=MIXED;
119
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
124
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
128
**** On Master 1 ****
129
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
134
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
138
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
145
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
151
==== 2.1. Checking a stored function ====
153
CREATE FUNCTION log_rows(sect INT, test INT)
156
DECLARE found_rows INT;
157
SELECT FOUND_ROWS() INTO found_rows;
158
INSERT INTO logtbl VALUES(sect,test,found_rows);
161
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
164
SELECT log_rows(2,1), log_rows(2,2);
165
log_rows(2,1) log_rows(2,2)
167
CREATE TABLE t2 (a INT, b INT);
168
CREATE TRIGGER t2_tr BEFORE INSERT ON t2 FOR EACH ROW
170
INSERT INTO logtbl VALUES (NEW.a, NEW.b, FOUND_ROWS());
172
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
175
INSERT INTO t2 VALUES (2,3), (2,4);
177
CREATE TRIGGER t2_tr BEFORE INSERT ON t2 FOR EACH ROW
180
SELECT log_rows(NEW.a, NEW.b) INTO dummy;
182
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
185
INSERT INTO t2 VALUES (2,5), (2,6);
187
CREATE PROCEDURE log_me_inner(sect INT, test INT)
190
SELECT log_rows(sect, test) INTO dummy;
191
SELECT log_rows(sect, test+1) INTO dummy;
193
CREATE PROCEDURE log_me(sect INT, test INT)
195
CALL log_me_inner(sect,test);
197
CREATE TRIGGER t2_tr BEFORE INSERT ON t2 FOR EACH ROW
199
CALL log_me(NEW.a, NEW.b);
201
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
204
INSERT INTO t2 VALUES (2,5), (2,6);
205
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
217
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
229
DROP TABLE t1, logtbl;
230
DROP PROCEDURE just_log;
231
DROP PROCEDURE log_me;
232
DROP PROCEDURE log_me_inner;
233
DROP FUNCTION log_rows;