Bug#44664: valgrind warning for COMMIT_AND_CHAIN and ROLLBACK_AND_CHAIN
The problem is that the internal variable used to specify a transaction with consistent read was being used outside the processing context of a START TRANSACTION WITH CONSISTENT SNAPSHOT statement. The practical consequence was that a consistent snapshot specification could leak to unrelated transactions on the same session. The solution is to ensure a consistent snapshot clause is only relied upon for the START TRANSACTION statement. This is already fixed in a similar way on 6.0. mysql-test/r/consistent_snapshot.result: Add test case result for Bug#44664 mysql-test/t/consistent_snapshot.test: Add test case for Bug#44664 sql/sql_parse.cc: The WITH CONSISTENT SNAPSHOT clause is only valid for the START TRANSACTION statement.
This commit is contained in:
parent
9320c933be
commit
d37aa50557
@ -1,6 +1,9 @@
|
|||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
# Establish connection con1 (user=root)
|
# Establish connection con1 (user=root)
|
||||||
# Establish connection con2 (user=root)
|
# Establish connection con2 (user=root)
|
||||||
|
### Test 1:
|
||||||
|
### - While a consistent snapshot transaction is executed,
|
||||||
|
### no external inserts should be visible to the transaction.
|
||||||
# Switch to connection con1
|
# Switch to connection con1
|
||||||
CREATE TABLE t1 (a INT) ENGINE=innodb;
|
CREATE TABLE t1 (a INT) ENGINE=innodb;
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
@ -10,6 +13,9 @@ INSERT INTO t1 VALUES(1);
|
|||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
a
|
a
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
### Test 2:
|
||||||
|
### - For any non-consistent snapshot transaction, external
|
||||||
|
### committed inserts should be visible to the transaction.
|
||||||
DELETE FROM t1;
|
DELETE FROM t1;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
# Switch to connection con2
|
# Switch to connection con2
|
||||||
@ -19,5 +25,18 @@ SELECT * FROM t1;
|
|||||||
a
|
a
|
||||||
1
|
1
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
### Test 3:
|
||||||
|
### - Bug#44664: valgrind warning for COMMIT_AND_CHAIN and ROLLBACK_AND_CHAIN
|
||||||
|
### Chaining a transaction does not retain consistency level.
|
||||||
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
DELETE FROM t1;
|
||||||
|
COMMIT WORK AND CHAIN;
|
||||||
|
# Switch to connection con2
|
||||||
|
INSERT INTO t1 VALUES(1);
|
||||||
|
# Switch to connection con1
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
COMMIT;
|
||||||
# Switch to connection default + close connections con1 and con2
|
# Switch to connection default + close connections con1 and con2
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -12,9 +12,9 @@ connect (con1,localhost,root,,);
|
|||||||
--echo # Establish connection con2 (user=root)
|
--echo # Establish connection con2 (user=root)
|
||||||
connect (con2,localhost,root,,);
|
connect (con2,localhost,root,,);
|
||||||
|
|
||||||
### Test 1:
|
--echo ### Test 1:
|
||||||
### - While a consistent snapshot transaction is executed,
|
--echo ### - While a consistent snapshot transaction is executed,
|
||||||
### no external inserts should be visible to the transaction.
|
--echo ### no external inserts should be visible to the transaction.
|
||||||
|
|
||||||
--echo # Switch to connection con1
|
--echo # Switch to connection con1
|
||||||
connection con1;
|
connection con1;
|
||||||
@ -31,9 +31,9 @@ SELECT * FROM t1; # if consistent snapshot was set as expected, we
|
|||||||
# should see nothing.
|
# should see nothing.
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
### Test 2:
|
--echo ### Test 2:
|
||||||
### - For any non-consistent snapshot transaction, external
|
--echo ### - For any non-consistent snapshot transaction, external
|
||||||
### committed inserts should be visible to the transaction.
|
--echo ### committed inserts should be visible to the transaction.
|
||||||
|
|
||||||
DELETE FROM t1;
|
DELETE FROM t1;
|
||||||
START TRANSACTION; # Now we omit WITH CONSISTENT SNAPSHOT
|
START TRANSACTION; # Now we omit WITH CONSISTENT SNAPSHOT
|
||||||
@ -48,6 +48,24 @@ SELECT * FROM t1; # if consistent snapshot was not set, as expected, we
|
|||||||
# should see 1.
|
# should see 1.
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
--echo ### Test 3:
|
||||||
|
--echo ### - Bug#44664: valgrind warning for COMMIT_AND_CHAIN and ROLLBACK_AND_CHAIN
|
||||||
|
--echo ### Chaining a transaction does not retain consistency level.
|
||||||
|
|
||||||
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
DELETE FROM t1;
|
||||||
|
COMMIT WORK AND CHAIN;
|
||||||
|
|
||||||
|
--echo # Switch to connection con2
|
||||||
|
connection con2;
|
||||||
|
INSERT INTO t1 VALUES(1);
|
||||||
|
|
||||||
|
--echo # Switch to connection con1
|
||||||
|
connection con1;
|
||||||
|
SELECT * FROM t1; # if consistent snapshot was not set, as expected, we
|
||||||
|
# should see 1.
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
--echo # Switch to connection default + close connections con1 and con2
|
--echo # Switch to connection default + close connections con1 and con2
|
||||||
connection default;
|
connection default;
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
|
@ -198,8 +198,6 @@ bool begin_trans(THD *thd)
|
|||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
thd->options|= OPTION_BEGIN;
|
thd->options|= OPTION_BEGIN;
|
||||||
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
||||||
if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT)
|
|
||||||
error= ha_start_consistent_snapshot(thd);
|
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -4027,6 +4025,11 @@ end_with_restore_list:
|
|||||||
}
|
}
|
||||||
if (begin_trans(thd))
|
if (begin_trans(thd))
|
||||||
goto error;
|
goto error;
|
||||||
|
if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT)
|
||||||
|
{
|
||||||
|
if (ha_start_consistent_snapshot(thd))
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
break;
|
break;
|
||||||
case SQLCOM_COMMIT:
|
case SQLCOM_COMMIT:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user