~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
source include/master-slave.inc;
2
3
# It is not possible to replicate FOUND_ROWS() using statement-based
4
# replication, but there is a workaround that stores the result of
5
# FOUND_ROWS() into a user variable and then replicates this instead.
6
7
# The purpose of this test case is to test that the workaround
8
# function properly even when inside stored programs (i.e., stored
9
# routines and triggers).
10
11
--echo ==== 0. Setting it all up ====
12
13
SET BINLOG_FORMAT=STATEMENT;
14
15
--echo **** On Master ****
16
connection master;
17
CREATE TABLE t1 (a INT);
18
CREATE TABLE logtbl (sect INT, test INT, count INT);
19
20
INSERT INTO t1 VALUES (1),(2),(3);
21
INSERT INTO t1 SELECT 2*a+3 FROM t1;
22
INSERT INTO t1 SELECT 2*a+3 FROM t1;
23
INSERT INTO t1 SELECT 2*a+3 FROM t1;
24
INSERT INTO t1 SELECT 2*a+3 FROM t1;
25
INSERT INTO t1 SELECT 2*a+3 FROM t1;
26
INSERT INTO t1 SELECT 2*a+3 FROM t1;
27
28
--echo #### 1. Using statement mode ####
29
30
--echo ==== 1.1. Simple test ====
31
32
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
33
34
# Instead of
35
#   INSERT INTO logtbl VALUES(1, 1, FOUND_ROWS());
36
# we write
37
SELECT FOUND_ROWS() INTO @a;
38
INSERT INTO logtbl VALUES(1,1,@a);
39
40
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
41
# Instead of
42
#   INSERT INTO logtbl VALUES(1, 2, FOUND_ROWS());
43
# we write
44
SELECT FOUND_ROWS() INTO @a;
45
INSERT INTO logtbl VALUES(1,2,@a);
46
47
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
48
--echo **** On Slave ****
49
sync_slave_with_master;
50
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
51
52
--echo ==== 1.2. Stored procedure ====
53
54
# Here we do both the calculation and the logging. We also do it twice
55
# to make sure that there are no limitations on how many times it can
56
# be used.
57
58
--echo **** On Master ****
59
connection master;
60
--delimiter $$
61
CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN
62
  DECLARE cnt INT;
63
  SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
64
  SELECT FOUND_ROWS() INTO cnt;
65
  INSERT INTO logtbl VALUES(sect,test,cnt);
66
  SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
67
  SELECT FOUND_ROWS() INTO cnt;
68
  INSERT INTO logtbl VALUES(sect,test+1,cnt);
69
END $$
70
--delimiter ;
71
72
CALL calc_and_log(2,1);
73
74
--delimiter $$
75
CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN
76
  INSERT INTO logtbl VALUES (sect,test,found_rows);
77
END $$
78
--delimiter ;
79
80
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
81
SELECT FOUND_ROWS() INTO @found_rows;
82
CALL just_log(2,3,@found_rows);
83
84
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
85
--echo **** On Slave ****
86
sync_slave_with_master;
87
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
88
89
--echo ==== 1.3. Stored functions ====
90
--echo **** On Master ****
91
connection master;
92
--delimiter $$
93
CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT)
94
  RETURNS INT
95
BEGIN
96
  INSERT INTO logtbl VALUES(sect,test,found_rows);
97
  RETURN found_rows;
98
END $$
99
--delimiter ;
100
101
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
102
SELECT FOUND_ROWS() INTO @found_rows;
103
SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows);
104
105
SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
106
--echo **** On Slave ****
107
sync_slave_with_master;
108
SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
109
110
--echo ==== 1.9. Cleanup ====
111
--echo **** On Master ****
112
connection master;
113
DELETE FROM logtbl;
114
DROP PROCEDURE just_log;
115
DROP PROCEDURE calc_and_log;
116
DROP FUNCTION log_rows;
117
sync_slave_with_master;
118
119
source include/reset_master_and_slave.inc;
120
121
--echo #### 2. Using mixed mode ####
122
123
--echo ==== 2.1. Checking a procedure ====
124
125
--echo **** On Master ****
126
connection master;
127
SET BINLOG_FORMAT=MIXED;
128
129
# We will now check some stuff that will not work in statement-based
130
# replication, but which should cause the binary log to switch to
131
# row-based logging.
132
133
--delimiter $$
134
CREATE PROCEDURE just_log(sect INT, test INT) BEGIN
135
  INSERT INTO logtbl VALUES (sect,test,FOUND_ROWS());
136
END $$
137
--delimiter ;
138
sync_slave_with_master;
139
140
--echo **** On Master 1 ****
141
connection master1;
142
SET BINLOG_FORMAT=MIXED;
143
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
144
CALL just_log(1,1);
145
146
--echo **** On Master ****
147
connection master;
148
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
149
CALL just_log(1,2);
150
151
--echo **** On Master 1 ****
152
153
connection master1;
154
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
155
CALL just_log(1,3);
156
sync_slave_with_master;
157
158
--echo **** On Master ****
159
connection master;
160
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
161
CALL just_log(1,4);
162
sync_slave_with_master;
163
164
connection master;
165
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
166
--echo **** On Slave ****
167
sync_slave_with_master;
168
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
169
170
--echo ==== 2.1. Checking a stored function ====
171
--echo **** On Master ****
172
connection master;
173
--delimiter $$
174
CREATE FUNCTION log_rows(sect INT, test INT)
175
  RETURNS INT
176
BEGIN
177
  DECLARE found_rows INT;
178
  SELECT FOUND_ROWS() INTO found_rows;
179
  INSERT INTO logtbl VALUES(sect,test,found_rows);
180
  RETURN found_rows;
181
END $$
182
--delimiter ;
183
184
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
185
SELECT log_rows(2,1), log_rows(2,2);
186
187
CREATE TABLE t2 (a INT, b INT);
188
189
# Trying with referencing FOUND_ROWS() directly in the trigger.
190
191
--delimiter $$
192
CREATE TRIGGER t2_tr BEFORE INSERT ON t2 FOR EACH ROW
193
BEGIN
194
  INSERT INTO logtbl VALUES (NEW.a, NEW.b, FOUND_ROWS());
195
END $$
196
--delimiter ;
197
198
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
199
INSERT INTO t2 VALUES (2,3), (2,4);
200
201
# Referencing FOUND_ROWS() indirectly.
202
203
DROP TRIGGER t2_tr;
204
205
--delimiter $$
206
CREATE TRIGGER t2_tr BEFORE INSERT ON t2 FOR EACH ROW
207
BEGIN
208
  DECLARE dummy INT;
209
  SELECT log_rows(NEW.a, NEW.b) INTO dummy;
210
END $$
211
--delimiter ;
212
213
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
214
INSERT INTO t2 VALUES (2,5), (2,6);
215
216
# Putting FOUND_ROWS() even lower in the call chain.
217
218
connection master;
219
DROP TRIGGER t2_tr;
220
221
--delimiter $$
222
CREATE PROCEDURE log_me_inner(sect INT, test INT)
223
BEGIN
224
  DECLARE dummy INT;
225
  SELECT log_rows(sect, test) INTO dummy;
226
  SELECT log_rows(sect, test+1) INTO dummy;
227
END $$
228
229
CREATE PROCEDURE log_me(sect INT, test INT)
230
BEGIN
231
  CALL log_me_inner(sect,test);
232
END $$
233
--delimiter ;
234
235
--delimiter $$
236
CREATE TRIGGER t2_tr BEFORE INSERT ON t2 FOR EACH ROW
237
BEGIN
238
  CALL log_me(NEW.a, NEW.b);
239
END $$
240
--delimiter ;
241
242
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
243
INSERT INTO t2 VALUES (2,5), (2,6);
244
245
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
246
sync_slave_with_master;
247
SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
248
249
connection master;
250
DROP TABLE t1, logtbl;
251
DROP PROCEDURE just_log;
252
DROP PROCEDURE log_me;
253
DROP PROCEDURE log_me_inner;
254
DROP FUNCTION log_rows;
255
sync_slave_with_master;
256