Merge lp:~laurynas-biveinis/percona-server/fake-changes-from-fb-5.5 into lp:percona-server/5.5

Proposed by Laurynas Biveinis
Status: Superseded
Proposed branch: lp:~laurynas-biveinis/percona-server/fake-changes-from-fb-5.5
Merge into: lp:percona-server/5.5
Prerequisite: lp:~laurynas-biveinis/percona-server/fake-changes-binlog-5.5
Diff against target: 1756 lines (+1057/-174)
17 files modified
Percona-Server/mysql-test/include/start_fake_changes.inc (+42/-0)
Percona-Server/mysql-test/include/stop_fake_changes.inc (+34/-0)
Percona-Server/mysql-test/r/percona_innodb_fake_changes.result (+485/-40)
Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_898306.result (+37/-3)
Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_917942.result (+101/-0)
Percona-Server/mysql-test/t/percona_innodb_fake_changes.test (+302/-73)
Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_898306.test (+8/-4)
Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_917942.test (+14/-24)
Percona-Server/mysql-test/t/percona_innodb_fake_changes_locks.test (+1/-0)
Percona-Server/sql/sql_insert.cc (+1/-1)
Percona-Server/storage/innobase/btr/btr0cur.c (+10/-10)
Percona-Server/storage/innobase/handler/ha_innodb.cc (+10/-7)
Percona-Server/storage/innobase/handler/handler0alter.cc (+4/-4)
Percona-Server/storage/innobase/lock/lock0lock.c (+4/-4)
Percona-Server/storage/innobase/que/que0que.c (+1/-1)
Percona-Server/storage/innobase/row/row0ins.c (+2/-2)
Percona-Server/storage/innobase/row/row0upd.c (+1/-1)
To merge this branch: bzr merge lp:~laurynas-biveinis/percona-server/fake-changes-from-fb-5.5
Reviewer Review Type Date Requested Status
Laurynas Biveinis (community) Needs Fixing
Registry Administrators Pending
Review via email: mp+174916@code.launchpad.net

This proposal supersedes a proposal from 2013-07-11.

This proposal has been superseded by a proposal from 2013-07-17.

Description of the change

No BT or ST but BT 20439 prerequisite.

2nd MP:

http://jenkins.percona.com/job/percona-server-5.5-param/805/

Added ANALYZE TABLE to start_fake_changes.inc.

1st MP:

http://jenkins.percona.com/job/percona-server-5.5-param/798/

Fix bug 1190604 (Missing branch predictor annotations for fake
changes) by adding likely/unlikely/UNIV_LIKELY/UNIV_LIKELY annotations
to all the fake changes check branches that are missing them.

Fix bug 1200162 (Missing MTR tests for fake changes with BLOBs and
secondary indexes) by reviewing Facebook patch and adding
corresponding tests to our fake changes tests.

At the same time: create two new include files start_fake_changes.inc
and stop_fake_changes.inc. They start or stop fake changes and also
take the snapshot of the server state that should not change during
the fake changes workload. Use these files instead of setting
fake_changes session variable directly where applicable for additional
verification.

To post a comment you must log in.
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote : Posted in a previous version of this proposal

start|stop_fake_changes.inc:

SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS and SHOW INDEXES may cause test instabilities if there is a non-fake-change session workload for the same table running in parallel to the fake change one and the automatic stat recalculation kicks in at a wrong time. This need either ANALYZE TABLE, either disabling auto recalc. Right now the former seems like a better option IMHO.

review: Needs Fixing
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote :

For 5.5 the index cardinality stats are unstable even with ANALYZE TABLE, innodb_stats_on_metadata=OFF, innodb_stats_sample_pages=30000, innodb_stats_auto_update=0. This is bug 1201802, and until it's fixed, the SHOW INDEXES have to be removed from there. 5.6 is OK.

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'Percona-Server/mysql-test/include/start_fake_changes.inc'
2--- Percona-Server/mysql-test/include/start_fake_changes.inc 1970-01-01 00:00:00 +0000
3+++ Percona-Server/mysql-test/include/start_fake_changes.inc 2013-07-16 14:25:48 +0000
4@@ -0,0 +1,42 @@
5+#
6+# Include this file in a session before fake changes workload. It will enable
7+# the fake changes for the current session and save the relevant server state
8+# to variables that will be used by stop_fake_changes.inc that it didn't change.
9+#
10+# Since some of the state checked is global InnoDB counters, do not issue a
11+# non-fake-changes workload in parallel.
12+#
13+
14+# Requires userstat
15+SELECT @@global.userstat = 1 AS should_be_1;
16+
17+# ANALYZE TABLE and SHOW INDEXES below are disabled until
18+# https://bugs.launchpad.net/percona-server/+bug/1201802
19+# is fixed.
20+#
21+# # Have up-to-date stats for the fake changes table, so that, if there is a
22+# # non-fake-changes session running in parallel, it does not trigger an auto
23+# # stat recalc which then fails these checks.
24+#
25+# # Requires large index dive sample pages values
26+# SELECT @@global.innodb_stats_sample_pages = 30000 AS should_be_1;
27+#
28+# eval ANALYZE TABLE $fake_changes_table;
29+
30+let $t_checksum_1= `CHECKSUM TABLE $fake_changes_table EXTENDED`;
31+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
32+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
33+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
34+eval SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE '$fake_changes_table';
35+eval SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE '$fake_changes_table';
36+eval SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE '$fake_changes_table';
37+
38+# Disabled until https://bugs.launchpad.net/percona-server/+bug/1201802 is fixed.
39+#
40+#
41+# Index stats should not change, but it's only possible to inspect them
42+# manually.
43+#
44+# eval SHOW INDEXES IN $fake_changes_table;
45+
46+SET innodb_fake_changes=1;
47
48=== added file 'Percona-Server/mysql-test/include/stop_fake_changes.inc'
49--- Percona-Server/mysql-test/include/stop_fake_changes.inc 1970-01-01 00:00:00 +0000
50+++ Percona-Server/mysql-test/include/stop_fake_changes.inc 2013-07-16 14:25:48 +0000
51@@ -0,0 +1,34 @@
52+#
53+# Include this file in a session after fake changes workload. It will disable the fake
54+# changes and assert that the relevant server state has not changed from the one saved
55+# by a previous start_fake_changes.inc.
56+#
57+SET innodb_fake_changes=0;
58+
59+eval CHECK TABLE $fake_changes_table;
60+
61+let $t_checksum_2= `CHECKSUM TABLE $fake_changes_table EXTENDED`;
62+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
63+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
64+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
65+eval SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE '$fake_changes_table';
66+eval SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE '$fake_changes_table';
67+eval SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE '$fake_changes_table';
68+
69+--disable_query_log
70+eval SELECT "$t_checksum_1" LIKE "$t_checksum_2" AS should_be_1;
71+--enable_query_log
72+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
73+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
74+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
75+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
76+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
77+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
78+
79+# Disabled until https://bugs.launchpad.net/percona-server/+bug/1201802 is fixed.
80+#
81+# #
82+# # Index stats should not change, but it's only possible to inspect them
83+# # manually.
84+# #
85+# eval SHOW INDEXES IN $fake_changes_table;
86
87=== modified file 'Percona-Server/mysql-test/r/percona_innodb_fake_changes.result'
88--- Percona-Server/mysql-test/r/percona_innodb_fake_changes.result 2012-10-17 11:56:00 +0000
89+++ Percona-Server/mysql-test/r/percona_innodb_fake_changes.result 2013-07-16 14:25:48 +0000
90@@ -22,10 +22,18 @@
91 OFF
92 # Explicit COMMIT should fail when innodb_fake_changes is enabled
93 # DML should be fine
94-SET @@GLOBAL.userstat= TRUE;
95+SET @@GLOBAL.userstat=TRUE;
96 CREATE TABLE t1 (a INT) ENGINE=InnoDB;
97 INSERT INTO t1 VALUES (1);
98-SET autocommit=0;
99+SELECT @@global.userstat = 1 AS should_be_1;
100+should_be_1
101+1
102+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
103+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
104+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
105+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
106+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
107+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
108 SET innodb_fake_changes=1;
109 BEGIN;
110 INSERT INTO t1 VALUES (2);
111@@ -36,29 +44,380 @@
112 1
113 COMMIT;
114 ERROR HY000: Got error 131 during COMMIT
115-SET innodb_fake_changes=default;
116-# Verify that the fake changes to t1 did not leak through
117-CHECK TABLE t1;
118-Table Op Msg_type Msg_text
119-test.t1 check status OK
120-should_be_1
121-1
122-should_be_0
123-0
124-should_be_0
125-0
126-should_be_0
127-0
128-should_be_0
129-0
130-should_be_0
131-0
132-should_be_0
133-0
134-DROP TABLE t1;
135+SET innodb_fake_changes=0;
136+CHECK TABLE t1;
137+Table Op Msg_type Msg_text
138+test.t1 check status OK
139+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
140+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
141+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
142+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
143+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
144+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
145+should_be_1
146+1
147+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
148+should_be_0
149+0
150+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
151+should_be_0
152+0
153+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
154+should_be_0
155+0
156+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
157+should_be_0
158+0
159+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
160+should_be_0
161+0
162+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
163+should_be_0
164+0
165+DROP TABLE t1;
166+CREATE TABLE t1 (a INT PRIMARY KEY, b INT, UNIQUE KEY (b)) ENGINE=InnoDB;
167+INSERT INTO t1 VALUES (1,1);
168+SELECT @@global.userstat = 1 AS should_be_1;
169+should_be_1
170+1
171+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
172+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
173+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
174+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
175+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
176+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
177+SET innodb_fake_changes=1;
178+SELECT * FROM t1;
179+ERROR HY000: Got error 131 during COMMIT
180+INSERT INTO t1 VALUES (2,2);
181+ERROR HY000: Got error 131 during COMMIT
182+UPDATE t1 SET a=0 where b=1;
183+ERROR 23000: Duplicate entry '1' for key 'b'
184+UPDATE t1 SET b=0 where a=1;
185+ERROR HY000: Got error 131 during COMMIT
186+UPDATE t1 SET b=0 where a=2;
187+ERROR HY000: Got error 131 during COMMIT
188+DELETE FROM t1 where b=2;
189+ERROR HY000: Got error 131 during COMMIT
190+DELETE FROM t1 where b=1;
191+ERROR HY000: Got error 131 during COMMIT
192+DELETE FROM t1 where a=2;
193+ERROR HY000: Got error 131 during COMMIT
194+DELETE FROM t1 where a=1;
195+ERROR HY000: Got error 131 during COMMIT
196+REPLACE INTO t1 values (2,3);
197+ERROR HY000: Got error 131 during COMMIT
198+BEGIN;
199+SELECT * FROM t1;
200+a b
201+1 1
202+COMMIT;
203+ERROR HY000: Got error 131 during COMMIT
204+BEGIN;
205+INSERT INTO t1 VALUES (2,2);
206+COMMIT;
207+ERROR HY000: Got error 131 during COMMIT
208+BEGIN;
209+UPDATE t1 SET a=0 where b=1;
210+ERROR 23000: Duplicate entry '1' for key 'b'
211+COMMIT;
212+ERROR HY000: Got error 131 during COMMIT
213+BEGIN;
214+UPDATE t1 SET b=0 where a=1;
215+COMMIT;
216+ERROR HY000: Got error 131 during COMMIT
217+BEGIN;
218+UPDATE t1 SET b=0 where a=2;
219+COMMIT;
220+ERROR HY000: Got error 131 during COMMIT
221+BEGIN;
222+DELETE FROM t1 where b=2;
223+COMMIT;
224+ERROR HY000: Got error 131 during COMMIT
225+BEGIN;
226+DELETE FROM t1 where b=1;
227+COMMIT;
228+ERROR HY000: Got error 131 during COMMIT
229+BEGIN;
230+DELETE FROM t1 where a=2;
231+COMMIT;
232+ERROR HY000: Got error 131 during COMMIT
233+BEGIN;
234+DELETE FROM t1 where a=1;
235+COMMIT;
236+ERROR HY000: Got error 131 during COMMIT
237+BEGIN;
238+REPLACE INTO t1 values (2,3);
239+COMMIT;
240+ERROR HY000: Got error 131 during COMMIT
241+INSERT INTO t1 VALUES (1,1) ON DUPLICATE KEY UPDATE b=2;
242+ERROR HY000: Got error 131 during COMMIT
243+CREATE INDEX bx ON t1(b);
244+ERROR HY000: Got error 131 during COMMIT
245+SET innodb_fake_changes=0;
246+CHECK TABLE t1;
247+Table Op Msg_type Msg_text
248+test.t1 check status OK
249+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
250+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
251+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
252+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
253+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
254+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
255+should_be_1
256+1
257+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
258+should_be_0
259+0
260+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
261+should_be_0
262+0
263+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
264+should_be_0
265+0
266+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
267+should_be_0
268+0
269+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
270+should_be_0
271+0
272+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
273+should_be_0
274+0
275+DROP TABLE t1;
276+CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
277+INSERT INTO t2 VALUES (1, 1);
278+SELECT @@global.userstat = 1 AS should_be_1;
279+should_be_1
280+1
281+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
282+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
283+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
284+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2';
285+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2';
286+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2';
287+SET innodb_fake_changes=1;
288+SELECT * FROM t2;
289+ERROR HY000: Got error 131 during COMMIT
290+INSERT INTO t2 VALUES (2,2);
291+ERROR HY000: Got error 131 during COMMIT
292+UPDATE t2 SET b=0 where a=1;
293+ERROR HY000: Got error 131 during COMMIT
294+UPDATE t2 SET b=0 where a=2;
295+ERROR HY000: Got error 131 during COMMIT
296+DELETE FROM t2 where b=2;
297+ERROR HY000: Got error 131 during COMMIT
298+DELETE FROM t2 where b=1;
299+ERROR HY000: Got error 131 during COMMIT
300+DELETE FROM t2 where a=2;
301+ERROR HY000: Got error 131 during COMMIT
302+DELETE FROM t2 where a=1;
303+ERROR HY000: Got error 131 during COMMIT
304+REPLACE INTO t2 values (2,3);
305+ERROR HY000: Got error 131 during COMMIT
306+REPLACE INTO t2 VALUES (1,1);
307+ERROR HY000: Got error 131 during COMMIT
308+REPLACE INTO t2 VALUES (1,2);
309+ERROR HY000: Got error 131 during COMMIT
310+BEGIN;
311+SELECT * FROM t2;
312+a b
313+1 1
314+COMMIT;
315+ERROR HY000: Got error 131 during COMMIT
316+BEGIN;
317+INSERT INTO t2 VALUES (2,2);
318+COMMIT;
319+ERROR HY000: Got error 131 during COMMIT
320+BEGIN;
321+UPDATE t2 SET b=0 where a=1;
322+COMMIT;
323+ERROR HY000: Got error 131 during COMMIT
324+BEGIN;
325+UPDATE t2 SET b=0 where a=2;
326+COMMIT;
327+ERROR HY000: Got error 131 during COMMIT
328+BEGIN;
329+DELETE FROM t2 where b=2;
330+COMMIT;
331+ERROR HY000: Got error 131 during COMMIT
332+BEGIN;
333+DELETE FROM t2 where b=1;
334+COMMIT;
335+ERROR HY000: Got error 131 during COMMIT
336+BEGIN;
337+DELETE FROM t2 where a=2;
338+COMMIT;
339+ERROR HY000: Got error 131 during COMMIT
340+BEGIN;
341+DELETE FROM t2 where a=1;
342+COMMIT;
343+ERROR HY000: Got error 131 during COMMIT
344+BEGIN;
345+REPLACE INTO t2 values (2,3);
346+COMMIT;
347+ERROR HY000: Got error 131 during COMMIT
348+BEGIN;
349+REPLACE INTO t2 VALUES (1,1);
350+COMMIT;
351+ERROR HY000: Got error 131 during COMMIT
352+BEGIN;
353+REPLACE INTO t2 VALUES (1,2);
354+COMMIT;
355+ERROR HY000: Got error 131 during COMMIT
356+BEGIN;
357+REPLACE INTO t2 VALUES (1,2);
358+SELECT * from t2;
359+a b
360+1 1
361+REPLACE INTO t2 VALUES (1,1);
362+SELECT * from t2;
363+a b
364+1 1
365+ROLLBACK;
366+BEGIN;
367+INSERT INTO t2 VALUES (1,1);
368+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
369+INSERT INTO t2 VALUES (1,2);
370+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
371+ROLLBACK;
372+INSERT INTO t2 VALUES (1,1) ON DUPLICATE KEY UPDATE b=2;
373+ERROR HY000: Got error 131 during COMMIT
374+INSERT INTO t2 VALUES (1,1) ON DUPLICATE KEY UPDATE b=b+10;
375+ERROR HY000: Got error 131 during COMMIT
376+INSERT INTO t2 VALUES (1,2) ON DUPLICATE KEY UPDATE b=b+10;
377+ERROR HY000: Got error 131 during COMMIT
378+CREATE INDEX bx ON t2(b);
379+ERROR HY000: Got error 131 during COMMIT
380+SET innodb_fake_changes=0;
381+CHECK TABLE t2;
382+Table Op Msg_type Msg_text
383+test.t2 check status OK
384+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
385+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
386+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
387+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2';
388+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2';
389+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2';
390+should_be_1
391+1
392+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
393+should_be_0
394+0
395+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
396+should_be_0
397+0
398+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
399+should_be_0
400+0
401+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
402+should_be_0
403+0
404+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
405+should_be_0
406+0
407+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
408+should_be_0
409+0
410+DROP TABLE t2;
411+CREATE TABLE t3 (a INT PRIMARY KEY, B TEXT) ENGINE=InnoDB;
412+INSERT INTO t3 VALUES (1, '');
413+SELECT @@global.userstat = 1 AS should_be_1;
414+should_be_1
415+1
416+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
417+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
418+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
419+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
420+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
421+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
422+SET innodb_fake_changes=1;
423+SELECT * FROM t3;
424+ERROR HY000: Got error 131 during COMMIT
425+INSERT INTO t3 VALUES (2,lpad('a',10000, 'b'));
426+ERROR HY000: Got error 131 during COMMIT
427+UPDATE t3 SET a=0 where a=1;
428+ERROR HY000: Got error 131 during COMMIT
429+DELETE FROM t3 where a=2;
430+ERROR HY000: Got error 131 during COMMIT
431+DELETE FROM t3 where a=1;
432+ERROR HY000: Got error 131 during COMMIT
433+REPLACE INTO t3 values (2,lpad('a',9000,'q'));
434+ERROR HY000: Got error 131 during COMMIT
435+INSERT INTO t3 VALUES (1,1) ON DUPLICATE KEY UPDATE b=lpad('b',11000,'c');
436+ERROR HY000: Got error 131 during COMMIT
437+BEGIN;
438+SELECT * FROM t3;
439+a B
440+1
441+COMMIT;
442+ERROR HY000: Got error 131 during COMMIT
443+BEGIN;
444+INSERT INTO t3 VALUES (2,lpad('a',10000, 'b'));
445+COMMIT;
446+ERROR HY000: Got error 131 during COMMIT
447+BEGIN;
448+UPDATE t3 SET a=0 where a=1;
449+COMMIT;
450+ERROR HY000: Got error 131 during COMMIT
451+BEGIN;
452+DELETE FROM t3 where a=2;
453+COMMIT;
454+ERROR HY000: Got error 131 during COMMIT
455+BEGIN;
456+DELETE FROM t3 where a=1;
457+COMMIT;
458+ERROR HY000: Got error 131 during COMMIT
459+BEGIN;
460+REPLACE INTO t3 values (2,lpad('a',9000,'q'));
461+COMMIT;
462+ERROR HY000: Got error 131 during COMMIT
463+BEGIN;
464+INSERT INTO t3 VALUES (1,1) ON DUPLICATE KEY UPDATE b=lpad('b',11000,'c');
465+COMMIT;
466+ERROR HY000: Got error 131 during COMMIT
467+SET innodb_fake_changes=0;
468+CHECK TABLE t3;
469+Table Op Msg_type Msg_text
470+test.t3 check status OK
471+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
472+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
473+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
474+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
475+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
476+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
477+should_be_1
478+1
479+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
480+should_be_0
481+0
482+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
483+should_be_0
484+0
485+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
486+should_be_0
487+0
488+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
489+should_be_0
490+0
491+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
492+should_be_0
493+0
494+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
495+should_be_0
496+0
497+DROP TABLE t3;
498 # DDL must result in error
499 CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
500-SET autocommit=0;
501+SELECT @@global.userstat = 1 AS should_be_1;
502+should_be_1
503+1
504+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
505+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
506+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
507+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
508+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
509+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
510 SET innodb_fake_changes=1;
511 BEGIN;
512 CREATE TABLE t2 (a INT) ENGINE=InnoDB;
513@@ -66,50 +425,136 @@
514 DROP TABLE t1;
515 ERROR 42S02: Unknown table 't1'
516 TRUNCATE TABLE t1;
517-ERROR HY000: Got error 131 during COMMIT
518+ERROR HY000: Table storage engine for 't1' doesn't have this option
519 ALTER TABLE t1 ENGINE=MyISAM;
520 ERROR HY000: Got error 131 during COMMIT
521 ROLLBACK;
522 SET innodb_fake_changes=0;
523+CHECK TABLE t1;
524+Table Op Msg_type Msg_text
525+test.t1 check status OK
526+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
527+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
528+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
529+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
530+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
531+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
532+should_be_1
533+1
534+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
535+should_be_0
536+0
537+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
538+should_be_0
539+0
540+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
541+should_be_0
542+0
543+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
544+should_be_0
545+0
546+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
547+should_be_0
548+0
549+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
550+should_be_0
551+0
552 INSERT INTO t1 VALUES (1), (2);
553-COMMIT;
554 CREATE TABLE t2 (a INT PRIMARY KEY, b INT, INDEX b_ind (b),
555 FOREIGN KEY (b) REFERENCES t1(a) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
556 INSERT INTO t2 VALUES (1, 1);
557 INSERT INTO t2 VALUES (2, 2);
558-COMMIT;
559+SELECT @@global.userstat = 1 AS should_be_1;
560+should_be_1
561+1
562+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
563+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
564+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
565+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
566+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
567+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
568 SET innodb_fake_changes=1;
569+BEGIN;
570 DELETE FROM t1 WHERE a=1;
571 UPDATE t1 SET a=3 WHERE a=2;
572 COMMIT;
573 ERROR HY000: Got error 131 during COMMIT
574+SET innodb_fake_changes=0;
575+CHECK TABLE t1;
576+Table Op Msg_type Msg_text
577+test.t1 check status OK
578+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
579+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
580+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
581+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
582+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
583+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
584 should_be_1
585 1
586-should_be_0
587-0
588-should_be_0
589-0
590-should_be_0
591-0
592-should_be_0
593-0
594-should_be_0
595-0
596-SET innodb_fake_changes=0;
597+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
598+should_be_0
599+0
600+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
601+should_be_0
602+0
603+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
604+should_be_0
605+0
606+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
607+should_be_0
608+0
609+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
610+should_be_0
611+0
612+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
613+should_be_0
614+0
615 DROP TABLE t2;
616 CREATE TABLE t3 (a INT primary key, b text) ENGINE=InnoDB;
617 INSERT INTO t3 VALUES (1,'');
618-COMMIT;
619+SELECT @@global.userstat = 1 AS should_be_1;
620+should_be_1
621+1
622+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
623+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
624+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
625+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
626+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
627+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
628 SET innodb_fake_changes=1;
629+BEGIN;
630 UPDATE t3 set b=lpad('b',11000,'c') where a=1;
631 COMMIT;
632 ERROR HY000: Got error 131 during COMMIT
633-SET innodb_fake_changes=default;
634-# Verify that the fake changes to t3 did not leak through
635+SET innodb_fake_changes=0;
636 CHECK TABLE t3;
637 Table Op Msg_type Msg_text
638 test.t3 check status OK
639+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
640+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
641+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
642+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
643+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
644+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't3';
645 should_be_1
646 1
647+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
648+should_be_0
649+0
650+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
651+should_be_0
652+0
653+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
654+should_be_0
655+0
656+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
657+should_be_0
658+0
659+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
660+should_be_0
661+0
662+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
663+should_be_0
664+0
665 DROP TABLE t1, t3;
666 SET @@GLOBAL.userstat= default;
667
668=== modified file 'Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_898306.result'
669--- Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_898306.result 2012-10-17 11:30:19 +0000
670+++ Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_898306.result 2013-07-16 14:25:48 +0000
671@@ -1,7 +1,17 @@
672 DROP TABLE IF EXISTS t1;
673+SET @@GLOBAL.userstat=ON;
674 CREATE TABLE t1 (a INT primary key, b int, unique key (b)) ENGINE=InnoDB;
675 INSERT INTO t1 VALUES (1,1);
676 SET autocommit=1;
677+SELECT @@global.userstat = 1 AS should_be_1;
678+should_be_1
679+1
680+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
681+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
682+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
683+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
684+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
685+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
686 SET innodb_fake_changes=1;
687 # Confirm that duplicate key errors on REPLACE works
688 REPLACE INTO t1 VALUES (1,1);
689@@ -34,10 +44,34 @@
690 INSERT INTO t1 VALUES (1,2) ON DUPLICATE KEY UPDATE b=b+10;
691 ERROR HY000: Got error 131 during COMMIT
692 SET innodb_fake_changes=0;
693-SELECT * from t1;
694-a b
695-1 1
696 CHECK TABLE t1;
697 Table Op Msg_type Msg_text
698 test.t1 check status OK
699+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
700+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
701+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
702+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
703+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
704+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
705+should_be_1
706+1
707+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
708+should_be_0
709+0
710+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
711+should_be_0
712+0
713+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
714+should_be_0
715+0
716+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
717+should_be_0
718+0
719+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
720+should_be_0
721+0
722+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
723+should_be_0
724+0
725 DROP TABLE t1;
726+SET @@GLOBAL.userstat=default;
727
728=== modified file 'Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_917942.result'
729--- Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_917942.result 2012-10-16 11:18:45 +0000
730+++ Percona-Server/mysql-test/r/percona_innodb_fake_changes_bug_917942.result 2013-07-16 14:25:48 +0000
731@@ -1,7 +1,17 @@
732 DROP TABLE IF EXISTS t1;
733+SET @@GLOBAL.userstat=ON;
734 Test compressed
735 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB KEY_BLOCK_SIZE=8;
736 INSERT INTO t1 VALUES(NULL, LPAD("v", 2, "b"), LPAD("a", 100, "b"));
737+SELECT @@global.userstat = 1 AS should_be_1;
738+should_be_1
739+1
740+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
741+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
742+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
743+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
744+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
745+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
746 SET innodb_fake_changes=1;
747 INSERT INTO t1 VALUES(1, "foo", LPAD("a", 4600, "b")) ON DUPLICATE KEY UPDATE T = VALUES(T);
748 ERROR HY000: Got error 131 during COMMIT
749@@ -11,12 +21,45 @@
750 CHECK TABLE t1;
751 Table Op Msg_type Msg_text
752 test.t1 check status OK
753+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
754+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
755+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
756+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
757+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
758+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
759 should_be_1
760 1
761+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
762+should_be_0
763+0
764+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
765+should_be_0
766+0
767+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
768+should_be_0
769+0
770+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
771+should_be_0
772+0
773+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
774+should_be_0
775+0
776+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
777+should_be_0
778+0
779 DROP TABLE t1;
780 Test for uncompressed
781 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB;
782 INSERT INTO t1 VALUES(NULL, LPAD("v", 2, "b"), LPAD("a", 100, "b"));
783+SELECT @@global.userstat = 1 AS should_be_1;
784+should_be_1
785+1
786+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
787+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
788+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
789+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
790+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
791+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
792 SET innodb_fake_changes=1;
793 ERROR HY000: Got error 131 during COMMIT
794 ERROR HY000: Got error 131 during COMMIT
795@@ -122,11 +165,44 @@
796 CHECK TABLE t1;
797 Table Op Msg_type Msg_text
798 test.t1 check status OK
799+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
800+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
801+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
802+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
803+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
804+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
805 should_be_1
806 1
807+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
808+should_be_0
809+0
810+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
811+should_be_0
812+0
813+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
814+should_be_0
815+0
816+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
817+should_be_0
818+0
819+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
820+should_be_0
821+0
822+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
823+should_be_0
824+0
825 DROP TABLE t1;
826 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB KEY_BLOCK_SIZE=8;
827 INSERT INTO t1 VALUES(2, LPAD("v", 2, "b"), LPAD("a", 200, "b"));
828+SELECT @@global.userstat = 1 AS should_be_1;
829+should_be_1
830+1
831+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
832+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_deleted';
833+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_updated';
834+SELECT ROWS INTO @table_rows_estimate_1 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
835+SELECT ROWS_CHANGED INTO @table_rows_changed_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
836+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_1 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
837 SET innodb_fake_changes=1;
838 INSERT INTO t1 VALUES (3, "foo", LPAD("a", 4600, "b"));
839 ERROR HY000: Got error 131 during COMMIT
840@@ -134,8 +210,32 @@
841 CHECK TABLE t1;
842 Table Op Msg_type Msg_text
843 test.t1 check status OK
844+SELECT VARIABLE_VALUE INTO @innodb_rows_inserted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_rows_inserted';
845+SELECT VARIABLE_VALUE INTO @innodb_rows_deleted_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted';
846+SELECT VARIABLE_VALUE INTO @innodb_rows_updated_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated';
847+SELECT ROWS INTO @table_rows_estimate_2 FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
848+SELECT ROWS_CHANGED INTO @table_rows_changed_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
849+SELECT ROWS_CHANGED_X_INDEXES INTO @table_rows_changed_x_indexes_2 FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1';
850 should_be_1
851 1
852+SELECT @innodb_rows_inserted_2 - @innodb_rows_inserted_1 AS should_be_0;
853+should_be_0
854+0
855+SELECT @innodb_rows_deleted_2 - @innodb_rows_deleted_1 AS should_be_0;
856+should_be_0
857+0
858+SELECT @innodb_rows_updated_2 - @innodb_rows_updated_1 AS should_be_0;
859+should_be_0
860+0
861+SELECT @table_rows_estimate_2 - @table_rows_estimate_1 AS should_be_0;
862+should_be_0
863+0
864+SELECT @table_rows_changed_2 - @table_rows_changed_1 AS should_be_0;
865+should_be_0
866+0
867+SELECT @table_rows_changed_x_indexes_2 - @table_rows_changed_x_indexes_1 AS should_be_0;
868+should_be_0
869+0
870 DROP TABLE t1;
871 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB;
872 INSERT INTO t1 VALUES(2, LPAD("v", 3, "b"), LPAD("a", 100, "b"));
873@@ -149,3 +249,4 @@
874 should_be_1
875 1
876 DROP TABLE t1;
877+SET @@GLOBAL.userstat=default;
878
879=== modified file 'Percona-Server/mysql-test/t/percona_innodb_fake_changes.test'
880--- Percona-Server/mysql-test/t/percona_innodb_fake_changes.test 2012-10-17 11:56:00 +0000
881+++ Percona-Server/mysql-test/t/percona_innodb_fake_changes.test 2013-07-16 14:25:48 +0000
882@@ -4,7 +4,6 @@
883 DROP TABLE IF EXISTS t1, t2, t3;
884 --enable_warnings
885
886-
887 --echo # Checking variables
888 SHOW VARIABLES LIKE 'innodb_fake_changes';
889 SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='innodb_fake_changes';
890@@ -17,20 +16,13 @@
891
892 --echo # Explicit COMMIT should fail when innodb_fake_changes is enabled
893 --echo # DML should be fine
894-SET @@GLOBAL.userstat= TRUE;
895+SET @@GLOBAL.userstat=TRUE;
896 CREATE TABLE t1 (a INT) ENGINE=InnoDB;
897 INSERT INTO t1 VALUES (1);
898
899-let $t1_checksum_1= `CHECKSUM TABLE t1 EXTENDED`;
900-let $innodb_rows_inserted_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_inserted'`;
901-let $innodb_rows_deleted_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
902-let $innodb_rows_updated_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
903-let $table_rows_estimate_1= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
904-let $table_rows_changed_1= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
905-let $table_rows_changed_x_indexes_1= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
906+--let $fake_changes_table=t1
907+--source include/start_fake_changes.inc
908
909-SET autocommit=0;
910-SET innodb_fake_changes=1;
911 BEGIN;
912 INSERT INTO t1 VALUES (2);
913 UPDATE t1 SET a=0;
914@@ -38,102 +30,339 @@
915 SELECT * FROM t1;
916 --error 1180
917 COMMIT;
918-SET innodb_fake_changes=default;
919---echo # Verify that the fake changes to t1 did not leak through
920-CHECK TABLE t1;
921-let $t1_checksum_2= `CHECKSUM TABLE t1 EXTENDED`;
922-let $innodb_rows_inserted_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_inserted'`;
923-let $innodb_rows_deleted_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
924-let $innodb_rows_updated_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
925-let $table_rows_estimate_2= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
926-let $table_rows_changed_2= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
927-let $table_rows_changed_x_indexes_2= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
928---disable_query_log
929-eval SELECT "$t1_checksum_1" LIKE "$t1_checksum_2" AS should_be_1;
930-eval SELECT "$innodb_rows_inserted_2" - "$innodb_rows_inserted_1" AS should_be_0;
931-eval SELECT "$innodb_rows_deleted_2" - "$innodb_rows_deleted_1" AS should_be_0;
932-eval SELECT "$innodb_rows_updated_2" - "$innodb_rows_updated_1" AS should_be_0;
933-eval SELECT "$table_rows_estimate_2" - "$table_rows_estimate_1" AS should_be_0;
934-eval SELECT "$table_rows_changed_2" - "$table_rows_changed_1" AS should_be_0;
935-eval SELECT "$table_rows_changed_x_indexes_2" - "$table_rows_changed_x_indexes_1" AS should_be_0;
936---enable_query_log
937-DROP TABLE t1;
938+
939+--source include/stop_fake_changes.inc
940+
941+DROP TABLE t1;
942+
943+#
944+# Test primary and secondary index access
945+#
946+CREATE TABLE t1 (a INT PRIMARY KEY, b INT, UNIQUE KEY (b)) ENGINE=InnoDB;
947+INSERT INTO t1 VALUES (1,1);
948+
949+--source include/start_fake_changes.inc
950+
951+# Test with autocommit
952+--error ER_ERROR_DURING_COMMIT
953+SELECT * FROM t1;
954+--error ER_ERROR_DURING_COMMIT
955+INSERT INTO t1 VALUES (2,2);
956+--error ER_DUP_ENTRY
957+UPDATE t1 SET a=0 where b=1;
958+--error ER_ERROR_DURING_COMMIT
959+UPDATE t1 SET b=0 where a=1;
960+--error ER_ERROR_DURING_COMMIT
961+UPDATE t1 SET b=0 where a=2;
962+--error ER_ERROR_DURING_COMMIT
963+DELETE FROM t1 where b=2;
964+--error ER_ERROR_DURING_COMMIT
965+DELETE FROM t1 where b=1;
966+--error ER_ERROR_DURING_COMMIT
967+DELETE FROM t1 where a=2;
968+--error ER_ERROR_DURING_COMMIT
969+DELETE FROM t1 where a=1;
970+--error ER_ERROR_DURING_COMMIT
971+REPLACE INTO t1 values (2,3);
972+
973+# Test with transactions
974+BEGIN;
975+SELECT * FROM t1;
976+--error ER_ERROR_DURING_COMMIT
977+COMMIT;
978+
979+BEGIN;
980+INSERT INTO t1 VALUES (2,2);
981+--error ER_ERROR_DURING_COMMIT
982+COMMIT;
983+
984+BEGIN;
985+--error ER_DUP_ENTRY
986+UPDATE t1 SET a=0 where b=1;
987+--error ER_ERROR_DURING_COMMIT
988+COMMIT;
989+
990+BEGIN;
991+UPDATE t1 SET b=0 where a=1;
992+--error ER_ERROR_DURING_COMMIT
993+COMMIT;
994+
995+BEGIN;
996+UPDATE t1 SET b=0 where a=2;
997+--error ER_ERROR_DURING_COMMIT
998+COMMIT;
999+
1000+BEGIN;
1001+DELETE FROM t1 where b=2;
1002+--error ER_ERROR_DURING_COMMIT
1003+COMMIT;
1004+
1005+BEGIN;
1006+DELETE FROM t1 where b=1;
1007+--error ER_ERROR_DURING_COMMIT
1008+COMMIT;
1009+
1010+BEGIN;
1011+DELETE FROM t1 where a=2;
1012+--error ER_ERROR_DURING_COMMIT
1013+COMMIT;
1014+
1015+BEGIN;
1016+DELETE FROM t1 where a=1;
1017+--error ER_ERROR_DURING_COMMIT
1018+COMMIT;
1019+
1020+BEGIN;
1021+REPLACE INTO t1 values (2,3);
1022+--error ER_ERROR_DURING_COMMIT
1023+COMMIT;
1024+
1025+--error ER_ERROR_DURING_COMMIT
1026+INSERT INTO t1 VALUES (1,1) ON DUPLICATE KEY UPDATE b=2;
1027+--error ER_ERROR_DURING_COMMIT
1028+CREATE INDEX bx ON t1(b);
1029+
1030+--source include/stop_fake_changes.inc
1031+
1032+DROP TABLE t1;
1033+
1034+#
1035+# Test all accesses through the primary index
1036+#
1037+CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
1038+INSERT INTO t2 VALUES (1, 1);
1039+
1040+--let $fake_changes_table=t2
1041+--source include/start_fake_changes.inc
1042+
1043+# Test with autocommit
1044+--error ER_ERROR_DURING_COMMIT
1045+SELECT * FROM t2;
1046+--error ER_ERROR_DURING_COMMIT
1047+INSERT INTO t2 VALUES (2,2);
1048+--error ER_ERROR_DURING_COMMIT
1049+UPDATE t2 SET b=0 where a=1;
1050+--error ER_ERROR_DURING_COMMIT
1051+UPDATE t2 SET b=0 where a=2;
1052+--error ER_ERROR_DURING_COMMIT
1053+DELETE FROM t2 where b=2;
1054+--error ER_ERROR_DURING_COMMIT
1055+DELETE FROM t2 where b=1;
1056+--error ER_ERROR_DURING_COMMIT
1057+DELETE FROM t2 where a=2;
1058+--error ER_ERROR_DURING_COMMIT
1059+DELETE FROM t2 where a=1;
1060+--error ER_ERROR_DURING_COMMIT
1061+REPLACE INTO t2 values (2,3);
1062+--error ER_ERROR_DURING_COMMIT
1063+REPLACE INTO t2 VALUES (1,1);
1064+--error ER_ERROR_DURING_COMMIT
1065+REPLACE INTO t2 VALUES (1,2);
1066+
1067+# Test with transactions
1068+BEGIN;
1069+SELECT * FROM t2;
1070+--error ER_ERROR_DURING_COMMIT
1071+COMMIT;
1072+
1073+BEGIN;
1074+INSERT INTO t2 VALUES (2,2);
1075+--error ER_ERROR_DURING_COMMIT
1076+COMMIT;
1077+
1078+BEGIN;
1079+UPDATE t2 SET b=0 where a=1;
1080+--error ER_ERROR_DURING_COMMIT
1081+COMMIT;
1082+
1083+BEGIN;
1084+UPDATE t2 SET b=0 where a=2;
1085+--error ER_ERROR_DURING_COMMIT
1086+COMMIT;
1087+
1088+BEGIN;
1089+DELETE FROM t2 where b=2;
1090+--error ER_ERROR_DURING_COMMIT
1091+COMMIT;
1092+
1093+BEGIN;
1094+DELETE FROM t2 where b=1;
1095+--error ER_ERROR_DURING_COMMIT
1096+COMMIT;
1097+
1098+BEGIN;
1099+DELETE FROM t2 where a=2;
1100+--error ER_ERROR_DURING_COMMIT
1101+COMMIT;
1102+
1103+BEGIN;
1104+DELETE FROM t2 where a=1;
1105+--error ER_ERROR_DURING_COMMIT
1106+COMMIT;
1107+
1108+BEGIN;
1109+REPLACE INTO t2 values (2,3);
1110+--error ER_ERROR_DURING_COMMIT
1111+COMMIT;
1112+
1113+BEGIN;
1114+REPLACE INTO t2 VALUES (1,1);
1115+--error ER_ERROR_DURING_COMMIT
1116+COMMIT;
1117+
1118+BEGIN;
1119+REPLACE INTO t2 VALUES (1,2);
1120+--error ER_ERROR_DURING_COMMIT
1121+COMMIT;
1122+
1123+# Confirm that duplicate key errors are OK
1124+BEGIN;
1125+REPLACE INTO t2 VALUES (1,2);
1126+SELECT * from t2;
1127+REPLACE INTO t2 VALUES (1,1);
1128+SELECT * from t2;
1129+ROLLBACK;
1130+
1131+BEGIN;
1132+--error ER_DUP_ENTRY
1133+INSERT INTO t2 VALUES (1,1);
1134+--error ER_DUP_ENTRY
1135+INSERT INTO t2 VALUES (1,2);
1136+ROLLBACK;
1137+
1138+--error ER_ERROR_DURING_COMMIT
1139+INSERT INTO t2 VALUES (1,1) ON DUPLICATE KEY UPDATE b=2;
1140+--error ER_ERROR_DURING_COMMIT
1141+INSERT INTO t2 VALUES (1,1) ON DUPLICATE KEY UPDATE b=b+10;
1142+--error ER_ERROR_DURING_COMMIT
1143+INSERT INTO t2 VALUES (1,2) ON DUPLICATE KEY UPDATE b=b+10;
1144+--error ER_ERROR_DURING_COMMIT
1145+CREATE INDEX bx ON t2(b);
1146+
1147+--source include/stop_fake_changes.inc
1148+
1149+DROP TABLE t2;
1150+
1151+#
1152+# Test TEXT
1153+#
1154+CREATE TABLE t3 (a INT PRIMARY KEY, B TEXT) ENGINE=InnoDB;
1155+INSERT INTO t3 VALUES (1, '');
1156+
1157+--let $fake_changes_table=t3
1158+--source include/start_fake_changes.inc
1159+
1160+# Test with autocommit
1161+--error ER_ERROR_DURING_COMMIT
1162+SELECT * FROM t3;
1163+--error ER_ERROR_DURING_COMMIT
1164+INSERT INTO t3 VALUES (2,lpad('a',10000, 'b'));
1165+--error ER_ERROR_DURING_COMMIT
1166+UPDATE t3 SET a=0 where a=1;
1167+--error ER_ERROR_DURING_COMMIT
1168+DELETE FROM t3 where a=2;
1169+--error ER_ERROR_DURING_COMMIT
1170+DELETE FROM t3 where a=1;
1171+--error ER_ERROR_DURING_COMMIT
1172+REPLACE INTO t3 values (2,lpad('a',9000,'q'));
1173+--error ER_ERROR_DURING_COMMIT
1174+INSERT INTO t3 VALUES (1,1) ON DUPLICATE KEY UPDATE b=lpad('b',11000,'c');
1175+
1176+# Test with transactions
1177+BEGIN;
1178+SELECT * FROM t3;
1179+--error ER_ERROR_DURING_COMMIT
1180+COMMIT;
1181+
1182+BEGIN;
1183+INSERT INTO t3 VALUES (2,lpad('a',10000, 'b'));
1184+--error ER_ERROR_DURING_COMMIT
1185+COMMIT;
1186+
1187+BEGIN;
1188+UPDATE t3 SET a=0 where a=1;
1189+--error ER_ERROR_DURING_COMMIT
1190+COMMIT;
1191+
1192+BEGIN;
1193+DELETE FROM t3 where a=2;
1194+--error ER_ERROR_DURING_COMMIT
1195+COMMIT;
1196+
1197+BEGIN;
1198+DELETE FROM t3 where a=1;
1199+--error ER_ERROR_DURING_COMMIT
1200+COMMIT;
1201+
1202+BEGIN;
1203+REPLACE INTO t3 values (2,lpad('a',9000,'q'));
1204+--error ER_ERROR_DURING_COMMIT
1205+COMMIT;
1206+
1207+BEGIN;
1208+INSERT INTO t3 VALUES (1,1) ON DUPLICATE KEY UPDATE b=lpad('b',11000,'c');
1209+--error ER_ERROR_DURING_COMMIT
1210+COMMIT;
1211+
1212+--source include/stop_fake_changes.inc
1213+
1214+DROP TABLE t3;
1215
1216 --echo # DDL must result in error
1217 CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
1218-SET autocommit=0;
1219-SET innodb_fake_changes=1;
1220+
1221+--let $fake_changes_table=t1
1222+--source include/start_fake_changes.inc
1223+
1224 BEGIN;
1225 --error 1005
1226 CREATE TABLE t2 (a INT) ENGINE=InnoDB;
1227 --error 1051
1228 DROP TABLE t1;
1229---error 1180
1230+--error 1031
1231 TRUNCATE TABLE t1;
1232 --error 1180
1233 ALTER TABLE t1 ENGINE=MyISAM;
1234 ROLLBACK;
1235
1236+--source include/stop_fake_changes.inc
1237+
1238 # Test stat counters foreign key constraints
1239-SET innodb_fake_changes=0;
1240 INSERT INTO t1 VALUES (1), (2);
1241-COMMIT;
1242+
1243 CREATE TABLE t2 (a INT PRIMARY KEY, b INT, INDEX b_ind (b),
1244 FOREIGN KEY (b) REFERENCES t1(a) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
1245 INSERT INTO t2 VALUES (1, 1);
1246 INSERT INTO t2 VALUES (2, 2);
1247-COMMIT;
1248-
1249-let $t2_checksum_1= `CHECKSUM TABLE t2 EXTENDED`;
1250-let $innodb_rows_deleted_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
1251-let $innodb_rows_updated_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
1252-let $table_rows_estimate_1= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
1253-let $table_rows_changed_1= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
1254-let $table_rows_changed_x_indexes_1= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
1255-
1256-SET innodb_fake_changes=1;
1257+
1258+--let $fake_changes_table=t1
1259+--source include/start_fake_changes.inc
1260+
1261+BEGIN;
1262 DELETE FROM t1 WHERE a=1;
1263 UPDATE t1 SET a=3 WHERE a=2;
1264 --error 1180
1265 COMMIT;
1266
1267-let $t2_checksum_2= `CHECKSUM TABLE t2 EXTENDED`;
1268-let $innodb_rows_deleted_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
1269-let $innodb_rows_updated_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
1270-let $table_rows_estimate_2= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
1271-let $table_rows_changed_2= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
1272-let $table_rows_changed_x_indexes_2= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
1273-
1274---disable_query_log
1275-eval SELECT "$t2_checksum_1" LIKE "$t2_checksum_2" AS should_be_1;
1276-eval SELECT "$innodb_rows_deleted_2" - "$innodb_rows_deleted_1" AS should_be_0;
1277-eval SELECT "$innodb_rows_updated_2" - "$innodb_rows_updated_1" AS should_be_0;
1278-eval SELECT "$table_rows_estimate_2" - "$table_rows_estimate_1" AS should_be_0;
1279-eval SELECT "$table_rows_changed_2" - "$table_rows_changed_1" AS should_be_0;
1280-eval SELECT "$table_rows_changed_x_indexes_2" - "$table_rows_changed_x_indexes_1" AS should_be_0;
1281---enable_query_log
1282-
1283-SET innodb_fake_changes=0;
1284+--source include/stop_fake_changes.inc
1285+
1286 DROP TABLE t2;
1287
1288 # Test for bug 890404: uninitialized value warning in btr_cur_pessimistic_update
1289 CREATE TABLE t3 (a INT primary key, b text) ENGINE=InnoDB;
1290 INSERT INTO t3 VALUES (1,'');
1291-COMMIT;
1292 let $t3_checksum_1= `CHECKSUM TABLE t3 EXTENDED`;
1293-SET innodb_fake_changes=1;
1294-
1295+
1296+--let $fake_changes_table=t3
1297+--source include/start_fake_changes.inc
1298+
1299+BEGIN;
1300 UPDATE t3 set b=lpad('b',11000,'c') where a=1;
1301 --error ER_ERROR_DURING_COMMIT
1302 COMMIT;
1303
1304-SET innodb_fake_changes=default;
1305---echo # Verify that the fake changes to t3 did not leak through
1306-CHECK TABLE t3;
1307-let $t3_checksum_2= `CHECKSUM TABLE t3 EXTENDED`;
1308---disable_query_log
1309-eval SELECT "$t3_checksum_1" LIKE "$t3_checksum_2" AS should_be_1;
1310---enable_query_log
1311+--source include/stop_fake_changes.inc
1312+
1313 DROP TABLE t1, t3;
1314
1315 SET @@GLOBAL.userstat= default;
1316
1317=== modified file 'Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_898306.test'
1318--- Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_898306.test 2012-10-17 11:30:19 +0000
1319+++ Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_898306.test 2013-07-16 14:25:48 +0000
1320@@ -7,11 +7,15 @@
1321 DROP TABLE IF EXISTS t1;
1322 --enable_warnings
1323
1324+SET @@GLOBAL.userstat=ON;
1325+
1326 CREATE TABLE t1 (a INT primary key, b int, unique key (b)) ENGINE=InnoDB;
1327 INSERT INTO t1 VALUES (1,1);
1328
1329 SET autocommit=1;
1330-SET innodb_fake_changes=1;
1331+
1332+--let $fake_changes_table=t1
1333+--source include/start_fake_changes.inc
1334
1335 --echo # Confirm that duplicate key errors on REPLACE works
1336
1337@@ -52,8 +56,8 @@
1338 --error ER_ERROR_DURING_COMMIT
1339 INSERT INTO t1 VALUES (1,2) ON DUPLICATE KEY UPDATE b=b+10;
1340
1341-SET innodb_fake_changes=0;
1342-SELECT * from t1;
1343-CHECK TABLE t1;
1344+--source include/stop_fake_changes.inc
1345
1346 DROP TABLE t1;
1347+
1348+SET @@GLOBAL.userstat=default;
1349
1350=== modified file 'Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_917942.test'
1351--- Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_917942.test 2012-10-17 11:30:19 +0000
1352+++ Percona-Server/mysql-test/t/percona_innodb_fake_changes_bug_917942.test 2013-07-16 14:25:48 +0000
1353@@ -7,6 +7,8 @@
1354 DROP TABLE IF EXISTS t1;
1355 --enable_warnings
1356
1357+SET @@GLOBAL.userstat=ON;
1358+
1359 #
1360 # Confirm that cursor->tree_height is initialized when calling btr_cur_pessimistic_update
1361 # for transactions with innodb_fake_changes set
1362@@ -16,30 +18,25 @@
1363 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB KEY_BLOCK_SIZE=8;
1364
1365 INSERT INTO t1 VALUES(NULL, LPAD("v", 2, "b"), LPAD("a", 100, "b"));
1366-let $t1_checksum_1= `CHECKSUM TABLE t1 EXTENDED`;
1367
1368-SET innodb_fake_changes=1;
1369+--let $fake_changes_table=t1
1370+--source include/start_fake_changes.inc
1371
1372 --error 1180
1373 INSERT INTO t1 VALUES(1, "foo", LPAD("a", 4600, "b")) ON DUPLICATE KEY UPDATE T = VALUES(T);
1374 --error 1180
1375 UPDATE t1 SET T = LPAD("A", 4600, "b");
1376
1377-SET innodb_fake_changes=0;
1378-CHECK TABLE t1;
1379-let $t1_checksum_2= `CHECKSUM TABLE t1 EXTENDED`;
1380---disable_query_log
1381-eval SELECT "$t1_checksum_1" LIKE "$t1_checksum_2" AS should_be_1;
1382---enable_query_log
1383+--source include/stop_fake_changes.inc
1384+
1385 DROP TABLE t1;
1386
1387 --echo Test for uncompressed
1388 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB;
1389
1390 INSERT INTO t1 VALUES(NULL, LPAD("v", 2, "b"), LPAD("a", 100, "b"));
1391-let $t1_checksum_1= `CHECKSUM TABLE t1 EXTENDED`;
1392
1393-SET innodb_fake_changes=1;
1394+--source include/start_fake_changes.inc
1395
1396 --disable_query_log
1397 let $x = 50;
1398@@ -53,12 +50,8 @@
1399 }
1400 --enable_query_log
1401
1402-SET innodb_fake_changes=0;
1403-CHECK TABLE t1;
1404-let $t1_checksum_2= `CHECKSUM TABLE t1 EXTENDED`;
1405---disable_query_log
1406-eval SELECT "$t1_checksum_1" LIKE "$t1_checksum_2" AS should_be_1;
1407---enable_query_log
1408+--source include/stop_fake_changes.inc
1409+
1410 DROP TABLE t1;
1411
1412 #
1413@@ -69,19 +62,14 @@
1414 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB KEY_BLOCK_SIZE=8;
1415
1416 INSERT INTO t1 VALUES(2, LPAD("v", 2, "b"), LPAD("a", 200, "b"));
1417-let $t1_checksum_1= `CHECKSUM TABLE t1 EXTENDED`;
1418
1419-SET innodb_fake_changes=1;
1420+--source include/start_fake_changes.inc
1421
1422 --error 1180
1423 INSERT INTO t1 VALUES (3, "foo", LPAD("a", 4600, "b"));
1424
1425-SET innodb_fake_changes=0;
1426-CHECK TABLE t1;
1427-let $t1_checksum_2= `CHECKSUM TABLE t1 EXTENDED`;
1428---disable_query_log
1429-eval SELECT "$t1_checksum_1" LIKE "$t1_checksum_2" AS should_be_1;
1430---enable_query_log
1431+--source include/stop_fake_changes.inc
1432+
1433 DROP TABLE t1;
1434
1435 CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(200), t TEXT) ENGINE=INNODB;
1436@@ -101,3 +89,5 @@
1437 eval SELECT "$t1_checksum_1" LIKE "$t1_checksum_2" AS should_be_1;
1438 --enable_query_log
1439 DROP TABLE t1;
1440+
1441+SET @@GLOBAL.userstat=default;
1442
1443=== modified file 'Percona-Server/mysql-test/t/percona_innodb_fake_changes_locks.test'
1444--- Percona-Server/mysql-test/t/percona_innodb_fake_changes_locks.test 2012-10-11 14:18:34 +0000
1445+++ Percona-Server/mysql-test/t/percona_innodb_fake_changes_locks.test 2013-07-16 14:25:48 +0000
1446@@ -16,6 +16,7 @@
1447 --connection conn1
1448 --echo # Verifying that X_LOCK not acquired
1449 SET autocommit=0;
1450+# Cannot use start_fake_changes.inc as conn2 issues real workload before reverting
1451 SET innodb_fake_changes=1;
1452 BEGIN;
1453 SELECT * FROM t1 FOR UPDATE;
1454
1455=== modified file 'Percona-Server/sql/sql_insert.cc'
1456--- Percona-Server/sql/sql_insert.cc 2013-06-27 15:35:20 +0000
1457+++ Percona-Server/sql/sql_insert.cc 2013-07-16 14:25:48 +0000
1458@@ -1758,7 +1758,7 @@
1459 2) do nothing on fake delete
1460 3) goto #1
1461 */
1462- if (table->file->is_fake_change_enabled(thd))
1463+ if (unlikely(table->file->is_fake_change_enabled(thd)))
1464 goto ok_or_after_trg_err;
1465 /* Let us attempt do write_row() once more */
1466 }
1467
1468=== modified file 'Percona-Server/storage/innobase/btr/btr0cur.c'
1469--- Percona-Server/storage/innobase/btr/btr0cur.c 2013-06-27 15:35:20 +0000
1470+++ Percona-Server/storage/innobase/btr/btr0cur.c 2013-07-16 14:25:48 +0000
1471@@ -1189,7 +1189,7 @@
1472 rec_t* rec;
1473 roll_ptr_t roll_ptr;
1474
1475- if (thr && thr_get_trx(thr)->fake_changes) {
1476+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1477 /* skip LOCK, UNDO */
1478 return(DB_SUCCESS);
1479 }
1480@@ -1427,7 +1427,7 @@
1481 goto fail_err;
1482 }
1483
1484- if (thr && thr_get_trx(thr)->fake_changes) {
1485+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1486 /* skip CHANGE, LOG */
1487 *big_rec = big_rec_vec;
1488 return(err); /* == DB_SUCCESS */
1489@@ -1641,7 +1641,7 @@
1490 }
1491 }
1492
1493- if (thr && thr_get_trx(thr)->fake_changes) {
1494+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1495 /* skip CHANGE, LOG */
1496 if (n_extents > 0) {
1497 fil_space_release_free_extents(index->space,
1498@@ -1707,7 +1707,7 @@
1499
1500 ut_ad(cursor && update && thr && roll_ptr);
1501
1502- if (thr && thr_get_trx(thr)->fake_changes) {
1503+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1504 /* skip LOCK, UNDO */
1505 return(DB_SUCCESS);
1506 }
1507@@ -1914,7 +1914,7 @@
1508 return(FALSE);
1509 }
1510
1511- if (trx && trx->fake_changes) {
1512+ if (UNIV_UNLIKELY(trx && trx->fake_changes)) {
1513 /* Don't call page_zip_compress_write_log_no_data as that has
1514 assert which would fail. Assume there won't be a compression
1515 failure. */
1516@@ -2021,7 +2021,7 @@
1517 return(err);
1518 }
1519
1520- if (trx->fake_changes) {
1521+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1522 /* skip CHANGE, LOG */
1523 if (UNIV_LIKELY_NULL(heap)) {
1524 mem_heap_free(heap);
1525@@ -2256,7 +2256,7 @@
1526 goto err_exit;
1527 }
1528
1529- if (thr && thr_get_trx(thr)->fake_changes) {
1530+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1531 /* skip CHANGE, LOG */
1532 goto err_exit; /* == DB_SUCCESS */
1533 }
1534@@ -2552,7 +2552,7 @@
1535 ut_ad(flags & BTR_KEEP_POS_FLAG);
1536 }
1537
1538- if (trx->fake_changes) {
1539+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1540 /* skip CHANGE, LOG */
1541 err = DB_SUCCESS;
1542 goto return_after_reservations;
1543@@ -2888,7 +2888,7 @@
1544 ut_ad(dict_index_is_clust(index));
1545 ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets)));
1546
1547- if (thr && thr_get_trx(thr)->fake_changes) {
1548+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1549 /* skip LOCK, UNDO, CHANGE, LOG */
1550 return(DB_SUCCESS);
1551 }
1552@@ -3027,7 +3027,7 @@
1553 rec_t* rec;
1554 ulint err;
1555
1556- if (thr && thr_get_trx(thr)->fake_changes) {
1557+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1558 /* skip LOCK, CHANGE, LOG */
1559 return(DB_SUCCESS);
1560 }
1561
1562=== modified file 'Percona-Server/storage/innobase/handler/ha_innodb.cc'
1563--- Percona-Server/storage/innobase/handler/ha_innodb.cc 2013-07-16 14:25:47 +0000
1564+++ Percona-Server/storage/innobase/handler/ha_innodb.cc 2013-07-16 14:25:48 +0000
1565@@ -3605,7 +3605,10 @@
1566 trx_search_latch_release_if_reserved(trx);
1567 }
1568
1569- if (trx->fake_changes && (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))) {
1570+ if (UNIV_UNLIKELY(trx->fake_changes
1571+ && (all || (!thd_test_options(thd,
1572+ OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))))) {
1573+
1574 innobase_rollback(hton, thd, all); /* rollback implicitly */
1575 thd->stmt_da->reset_diagnostics_area(); /* because debug assertion code complains, if something left */
1576 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1577@@ -8169,7 +8172,7 @@
1578
1579 trx = innobase_trx_allocate(thd);
1580
1581- if (trx->fake_changes) {
1582+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1583 innobase_commit_low(trx);
1584 trx_free_for_mysql(trx);
1585 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1586@@ -8395,7 +8398,7 @@
1587 DBUG_RETURN(HA_ERR_CRASHED);
1588 }
1589
1590- if (prebuilt->trx->fake_changes) {
1591+ if (UNIV_UNLIKELY(prebuilt->trx->fake_changes)) {
1592 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1593 }
1594
1595@@ -8460,7 +8463,7 @@
1596
1597 trx = innobase_trx_allocate(thd);
1598
1599- if (trx->fake_changes) {
1600+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1601 innobase_commit_low(trx);
1602 trx_free_for_mysql(trx);
1603 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1604@@ -8552,13 +8555,13 @@
1605 trx->mysql_thd = NULL;
1606 #else
1607 trx = innobase_trx_allocate(thd);
1608- if (trx->fake_changes) {
1609+#endif
1610+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1611 my_free(namebuf);
1612 innobase_commit_low(trx);
1613 trx_free_for_mysql(trx);
1614 return; /* ignore */
1615 }
1616-#endif
1617 row_drop_database_for_mysql(namebuf, trx);
1618 my_free(namebuf);
1619
1620@@ -8671,7 +8674,7 @@
1621 trx_search_latch_release_if_reserved(parent_trx);
1622
1623 trx = innobase_trx_allocate(thd);
1624- if (trx->fake_changes) {
1625+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1626 innobase_commit_low(trx);
1627 trx_free_for_mysql(trx);
1628 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1629
1630=== modified file 'Percona-Server/storage/innobase/handler/handler0alter.cc'
1631--- Percona-Server/storage/innobase/handler/handler0alter.cc 2013-05-23 08:39:28 +0000
1632+++ Percona-Server/storage/innobase/handler/handler0alter.cc 2013-07-16 14:25:48 +0000
1633@@ -697,7 +697,7 @@
1634 possible adaptive hash latch to avoid deadlocks of threads. */
1635 trx_search_latch_release_if_reserved(prebuilt->trx);
1636
1637- if (prebuilt->trx->fake_changes) {
1638+ if (UNIV_UNLIKELY(prebuilt->trx->fake_changes)) {
1639 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1640 }
1641
1642@@ -742,7 +742,7 @@
1643 /* Create a background transaction for the operations on
1644 the data dictionary tables. */
1645 trx = innobase_trx_allocate(user_thd);
1646- if (trx->fake_changes) {
1647+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1648 mem_heap_free(heap);
1649 trx_general_rollback_for_mysql(trx, NULL);
1650 trx_free_for_mysql(trx);
1651@@ -1116,7 +1116,7 @@
1652 trx_search_latch_release_if_reserved(prebuilt->trx);
1653 trx = prebuilt->trx;
1654
1655- if (trx->fake_changes) {
1656+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1657 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1658 }
1659
1660@@ -1328,7 +1328,7 @@
1661 /* Create a background transaction for the operations on
1662 the data dictionary tables. */
1663 trx = innobase_trx_allocate(user_thd);
1664- if (trx->fake_changes) {
1665+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1666 trx_general_rollback_for_mysql(trx, NULL);
1667 trx_free_for_mysql(trx);
1668 DBUG_RETURN(HA_ERR_WRONG_COMMAND);
1669
1670=== modified file 'Percona-Server/storage/innobase/lock/lock0lock.c'
1671--- Percona-Server/storage/innobase/lock/lock0lock.c 2013-06-26 07:01:13 +0000
1672+++ Percona-Server/storage/innobase/lock/lock0lock.c 2013-07-16 14:25:48 +0000
1673@@ -4019,7 +4019,7 @@
1674
1675 trx = thr_get_trx(thr);
1676
1677- if (trx->fake_changes && mode == LOCK_IX) {
1678+ if (UNIV_UNLIKELY(trx->fake_changes && mode == LOCK_IX)) {
1679 mode = LOCK_IS;
1680 }
1681
1682@@ -5268,7 +5268,7 @@
1683
1684 trx = thr_get_trx(thr);
1685
1686- if (trx->fake_changes) {
1687+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1688 return(DB_SUCCESS);
1689 }
1690
1691@@ -5453,7 +5453,7 @@
1692 return(DB_SUCCESS);
1693 }
1694
1695- if (thr && thr_get_trx(thr)->fake_changes) {
1696+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1697 return(DB_SUCCESS);
1698 }
1699
1700@@ -5515,7 +5515,7 @@
1701 return(DB_SUCCESS);
1702 }
1703
1704- if (thr && thr_get_trx(thr)->fake_changes) {
1705+ if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
1706 return(DB_SUCCESS);
1707 }
1708
1709
1710=== modified file 'Percona-Server/storage/innobase/que/que0que.c'
1711--- Percona-Server/storage/innobase/que/que0que.c 2012-05-10 07:49:14 +0000
1712+++ Percona-Server/storage/innobase/que/que0que.c 2013-07-16 14:25:48 +0000
1713@@ -1417,7 +1417,7 @@
1714
1715 ut_a(trx->error_state == DB_SUCCESS);
1716
1717- if (trx->fake_changes) {
1718+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1719 /* fake_changes should not access to system tables */
1720 fprintf(stderr, "InnoDB: ERROR: innodb_fake_changes tried to access to system tables.\n");
1721 return(DB_ERROR);
1722
1723=== modified file 'Percona-Server/storage/innobase/row/row0ins.c'
1724--- Percona-Server/storage/innobase/row/row0ins.c 2013-06-26 07:01:13 +0000
1725+++ Percona-Server/storage/innobase/row/row0ins.c 2013-07-16 14:25:48 +0000
1726@@ -1512,7 +1512,7 @@
1727 mem_heap_free(heap);
1728 }
1729
1730- if (trx->fake_changes) {
1731+ if (UNIV_UNLIKELY(trx->fake_changes)) {
1732 err = DB_SUCCESS;
1733 }
1734
1735@@ -2214,7 +2214,7 @@
1736 rec_t* rec;
1737 ulint* offsets;
1738
1739- if (thr_get_trx(thr)->fake_changes) {
1740+ if (UNIV_UNLIKELY(thr_get_trx(thr)->fake_changes)) {
1741 /* skip store extern */
1742 if (modify) {
1743 dtuple_big_rec_free(big_rec);
1744
1745=== modified file 'Percona-Server/storage/innobase/row/row0upd.c'
1746--- Percona-Server/storage/innobase/row/row0upd.c 2012-10-29 08:53:24 +0000
1747+++ Percona-Server/storage/innobase/row/row0upd.c 2013-07-16 14:25:48 +0000
1748@@ -1854,7 +1854,7 @@
1749 the previous invocation of this function. Mark the
1750 off-page columns in the entry inherited. */
1751
1752- if (!(trx->fake_changes)) {
1753+ if (UNIV_LIKELY(!trx->fake_changes)) {
1754 change_ownership = row_upd_clust_rec_by_insert_inherit(
1755 NULL, NULL, entry, node->update);
1756 ut_a(change_ownership);

Subscribers

People subscribed via source and target branches