mirror of
https://github.com/MariaDB/server.git
synced 2025-02-12 00:15:35 +01:00
![Marko Mäkelä](/assets/img/avatar_default.png)
From the very beginning, the default InnoDB transaction isolation level
REPEATABLE READ does not correspond to any well formed definition.
The main issue is the lack of write/write conflict detection.
To fix that and to make REPEATABLE READ correspond to Snapshot Isolation,
b8a6719889
introduced the Boolean
session variable innodb_snapshot_isolation. It was disabled by default
in order not to break any user applications.
In a new major version of MariaDB Server, we had better enable this
parameter by default.
1419 lines
30 KiB
Text
1419 lines
30 KiB
Text
#
|
|
# WL#6742 - Test the interaction of multiple transactions using
|
|
# different isolation levels to make sure that the value returned
|
|
# by count(*) always reflects the correct view of the table according
|
|
# to the transaction's selected isolation level.
|
|
#
|
|
#
|
|
# Traverse various indexes to get the right counts.
|
|
# This especially tests count(*) which is pushed down to InnoDB in WL#6742.
|
|
#
|
|
CREATE TABLE t1 (
|
|
c1 INT AUTO_INCREMENT PRIMARY KEY,
|
|
c2 INT,
|
|
c3 INT,
|
|
c4 INT,
|
|
INDEX k2(c2)
|
|
) Engine=InnoDB;
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
CREATE TABLE t2 LIKE t1;
|
|
INSERT INTO t2 (SELECT * FROM t1);
|
|
affected rows: 10
|
|
info: Records: 10 Duplicates: 0 Warnings: 0
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
55
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
10
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.5000 10 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Do some DML in the default connection and leave the transaction pending.
|
|
#
|
|
SET innodb_snapshot_isolation=OFF;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
BEGIN;
|
|
UPDATE t1 SET c2 = c2 * 3 WHERE c1 = 1;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
DELETE FROM t1 WHERE c1 = 6;
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
49
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.4444 10 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Start transactions of Repeatable Read, Read Committed, and Read Uncommitted
|
|
#
|
|
# Connection 1 REPEATABLE READ
|
|
#
|
|
connect con1,localhost,root,,;
|
|
SET innodb_snapshot_isolation=OFF;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
BEGIN;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
55
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
10
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.5000 10 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
UPDATE t1 SET c2 = c2 * 5 WHERE c1 = 2;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
DELETE FROM t1 WHERE c1 = 7;
|
|
affected rows: 1
|
|
INSERT INTO t1(c2,c3,c4) VALUES (100, 1, 1);
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
113
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 11 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Test a lock wait timeout during COUNT(*)
|
|
#
|
|
SET innodb_lock_wait_timeout = 1;
|
|
SELECT COUNT(*) FROM t1 FOR UPDATE;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
#
|
|
# Connection 2 READ COMMITTED
|
|
#
|
|
connect con2,localhost,root,,;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
BEGIN;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
55
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
10
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.5000 10 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
UPDATE t1 SET c2 = c2 * 7 WHERE c1 = 3;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
DELETE FROM t1 WHERE c1 = 8;
|
|
affected rows: 1
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1000, 1, 1);
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
1015
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 12 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
9 1
|
|
10 1
|
|
12 1000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Connection 3 READ UNCOMMITTED
|
|
#
|
|
connect con3,localhost,root,,;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
BEGIN;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
57
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
1119
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.3333 12 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
UPDATE t1 SET c2 = c2 * 11 WHERE c1 = 4;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
INSERT INTO t1(c2,c3,c4) VALUES (10000, 1, 1);
|
|
affected rows: 1
|
|
DELETE FROM t1 WHERE c1 in(9);
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection default REPEATABLE READ
|
|
#
|
|
connection default;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
49
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.4444 10 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Commit the 3 extra connections
|
|
#
|
|
# Connection 1 REPEATABLE READ
|
|
#
|
|
connection con1;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
113
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 11 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Connection 2 READ COMMITTED
|
|
#
|
|
connection con2;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
1015
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 12 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
9 1
|
|
10 1
|
|
12 1000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Connection 3 READ UNCOMMITTED
|
|
#
|
|
connection con3;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
COMMIT;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection 2 READ COMMITTED
|
|
#
|
|
connection con2;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
63
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11024
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.3000 13 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
10 1
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
COMMIT;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
63
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11024
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.3000 13 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
10 1
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection 1 REPEATABLE READ
|
|
#
|
|
connection con1;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
113
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 11 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Select the first 5 records FOR UPDATE using count(*) in a subquery.
|
|
# The second record is still pending so we get a lock timeout.
|
|
#
|
|
SET innodb_lock_wait_timeout = 1;
|
|
SELECT c1, c2 FROM t1 WHERE c1 < ((SELECT COUNT(*) FROM t1) / 2) FOR UPDATE;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SELECT COUNT(*) FROM t1 FOR UPDATE;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
COMMIT;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
67
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11127
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7000 13 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Show The EXPLAIN output for these queries;
|
|
#
|
|
EXPLAIN SELECT * FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL #
|
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c1) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c2) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c3) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL #
|
|
EXPLAIN SELECT SUM(c1) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT SUM(c2) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL #
|
|
EXPLAIN SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL # Using where
|
|
2 SUBQUERY t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL # Using where
|
|
2 SUBQUERY t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL # Using where
|
|
2 SUBQUERY t1 index NULL k2 5 NULL # Using index
|
|
#
|
|
# Make all indexes in t2 obsolete to the active repeatable read transaction
|
|
# in the default connection.
|
|
#
|
|
ALTER TABLE t2 row_format=redundant;
|
|
#
|
|
# Connection default REPEATABLE READ
|
|
# Do more DML in the default REPEATABLE READ transaction in order to use recently committed records.
|
|
#
|
|
connection default;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
49
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.4444 10 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
UPDATE t1 SET c4 = c2 * 10;
|
|
affected rows: 9
|
|
info: Rows matched: 9 Changed: 9 Warnings: 0
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 30
|
|
2 5 1 50
|
|
3 7 1 70
|
|
4 11 1 110
|
|
5 1 1 10
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 10
|
|
11 100 1 1000
|
|
12 1000 1 10000
|
|
13 10000 1 100000
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
12
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
12
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
12
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
12
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
85
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11131
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
7.0833 13 1 1.0000 111283
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
7
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
6
|
|
###############################################
|
|
#
|
|
# Table t2 has been altered to a new row format.
|
|
# The index should not be useable.
|
|
#
|
|
SELECT COUNT(*) FROM t2;
|
|
ERROR HY000: Table definition has changed, please retry transaction
|
|
SELECT * FROM t2;
|
|
ERROR HY000: Table definition has changed, please retry transaction
|
|
COMMIT;
|
|
SELECT COUNT(*) FROM t2;
|
|
COUNT(*)
|
|
10
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 30
|
|
2 5 1 50
|
|
3 7 1 70
|
|
4 11 1 110
|
|
5 1 1 10
|
|
10 1 1 10
|
|
11 100 1 1000
|
|
12 1000 1 10000
|
|
13 10000 1 100000
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 111280
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection 2
|
|
#
|
|
connection con2;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 30
|
|
2 5 1 50
|
|
3 7 1 70
|
|
4 11 1 110
|
|
5 1 1 10
|
|
10 1 1 10
|
|
11 100 1 1000
|
|
12 1000 1 10000
|
|
13 10000 1 100000
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 111280
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Try COUNT(*) on a DISCARDED table.
|
|
#
|
|
connection default;
|
|
CREATE TABLE t4 LIKE t1;
|
|
INSERT INTO t4 (SELECT * FROM t1);
|
|
SELECT COUNT(*) FROM t4;
|
|
COUNT(*)
|
|
9
|
|
ALTER TABLE t4 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t4;
|
|
ERROR HY000: Tablespace has been discarded for table `t4`
|
|
#
|
|
# Test the interaction of a repeatable read transaction
|
|
# to changes that happen outside its view.
|
|
#
|
|
CREATE TABLE t5 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, aa INT, bb TEXT) Engine=InnoDB;
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
UPDATE t5 SET aa=a, bb=b;
|
|
CREATE TABLE t6 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, aa INT, bb TEXT) Engine=InnoDB;
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
UPDATE t6 SET aa=a, bb=b;
|
|
CREATE TABLE t7 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, aa INT, bb TEXT) Engine=InnoDB;
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
UPDATE t7 SET aa=a, bb=b;
|
|
BEGIN;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
4
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
4
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
4
|
|
#
|
|
# Connection 1
|
|
#
|
|
connection con1;
|
|
INSERT INTO t5(b) VALUES ("inserted by client 2");
|
|
UPDATE t5 SET a = 10 where a = 1;
|
|
UPDATE t5 SET b = "updated by client 2" where a = 2;
|
|
DELETE FROM t5 WHERE a = 3;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
5 inserted by client 2 NULL NULL
|
|
10 inserted by client 1 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
4
|
|
INSERT INTO t6(b) VALUES ("inserted by client 2");
|
|
UPDATE t6 SET a = 10 where a = 1;
|
|
UPDATE t6 SET b = "updated by client 2" where a = 2;
|
|
DELETE FROM t6 WHERE a = 3;
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
5 inserted by client 2 NULL NULL
|
|
10 inserted by client 1 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
4
|
|
INSERT INTO t7(b) VALUES ("inserted by client 2");
|
|
UPDATE t7 SET a = 10 where a = 1;
|
|
UPDATE t7 SET b = "updated by client 2" where a = 2;
|
|
DELETE FROM t7 WHERE a = 3;
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
5 inserted by client 2 NULL NULL
|
|
10 inserted by client 1 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
4
|
|
#
|
|
# Connection default
|
|
#
|
|
connection default;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
11 inserted by client 1 NULL NULL
|
|
UPDATE t5 SET a = a + 100;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
102 updated by client 2 2 inserted by client 1
|
|
104 inserted by client 1 4 inserted by client 1
|
|
105 inserted by client 2 NULL NULL
|
|
110 inserted by client 1 1 inserted by client 1
|
|
111 inserted by client 1 NULL NULL
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
7
|
|
UPDATE t6 SET b = "updated by client 2";
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 updated by client 2 4 inserted by client 1
|
|
5 updated by client 2 NULL NULL
|
|
10 updated by client 2 1 inserted by client 1
|
|
SELECT * FROM t6 LOCK IN SHARE MODE;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 updated by client 2 4 inserted by client 1
|
|
5 updated by client 2 NULL NULL
|
|
10 updated by client 2 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
6
|
|
DELETE FROM t7;
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
2
|
|
COMMIT;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
102 updated by client 2 2 inserted by client 1
|
|
104 inserted by client 1 4 inserted by client 1
|
|
105 inserted by client 2 NULL NULL
|
|
110 inserted by client 1 1 inserted by client 1
|
|
111 inserted by client 1 NULL NULL
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
5
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 updated by client 2 4 inserted by client 1
|
|
5 updated by client 2 NULL NULL
|
|
10 updated by client 2 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
4
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
0
|
|
#
|
|
# Cleanup
|
|
#
|
|
DROP TABLE t1,t2,t4,t5,t6,t7;
|
|
disconnect con1;
|
|
disconnect con2;
|
|
disconnect con3;
|
|
#
|
|
# Bug #23596760: FORCE INDEX IS SKIPPED WHILE EXECUTING SELECT COUNT(*)
|
|
#
|
|
CREATE TABLE t1(c1 INT NOT NULL PRIMARY KEY,
|
|
c2 INT NOT NULL DEFAULT 1,
|
|
c3 char(20) DEFAULT '',
|
|
KEY c2_idx (c2)) ENGINE=InnoDB STATS_PERSISTENT=0;
|
|
INSERT INTO t1(c1) VALUES (1), (2), (3);
|
|
INSERT INTO t1(c1) SELECT c1 + 10 FROM t1;
|
|
INSERT INTO t1(c1) SELECT c1 + 100 FROM t1;
|
|
CREATE TABLE t2 STATS_PERSISTENT=0 SELECT * FROM t1;
|
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
EXPLAIN SELECT COUNT(*) FROM t1 FORCE INDEX(c2_idx);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
EXPLAIN SELECT COUNT(*) FROM t1, t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using join buffer (flat, BNL join)
|
|
EXPLAIN SELECT COUNT(*) FROM t1 FORCE INDEX(c2_idx), t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using join buffer (flat, BNL join)
|
|
DROP TABLE t1, t2;
|