mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge of updated 51-bugteam before pushing...
This commit is contained in:
78
mysql-test/include/wait_show_condition.inc
Normal file
78
mysql-test/include/wait_show_condition.inc
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# include/wait_show_condition.inc
|
||||||
|
#
|
||||||
|
# SUMMARY
|
||||||
|
#
|
||||||
|
# Waits until the show statement ($show_statement) has at least within one of
|
||||||
|
# the rows of the result set for the field ($field) a value which fulfils
|
||||||
|
# a condition ($condition), or the operation times out.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# USAGE
|
||||||
|
#
|
||||||
|
# let $show_statement= SHOW PROCESSLIST;
|
||||||
|
# let $field= State;
|
||||||
|
# let $condition= = 'Updating';
|
||||||
|
# --source include/wait_show_condition.inc
|
||||||
|
#
|
||||||
|
# OR
|
||||||
|
#
|
||||||
|
# let $wait_timeout= 60; # Override default of 30 seconds with 60.
|
||||||
|
# let $show_statement= SHOW PROCESSLIST;
|
||||||
|
# let $field= State;
|
||||||
|
# let $condition= = 'Updating';
|
||||||
|
# --source include/wait_show_condition.inc
|
||||||
|
#
|
||||||
|
# Please do not use this use routine if you can replace the SHOW statement
|
||||||
|
# with a select. In such a case include/wait_condition.inc is recommended.
|
||||||
|
#
|
||||||
|
# Created: 2009-02-18 mleich
|
||||||
|
#
|
||||||
|
|
||||||
|
let $max_run_time= 30;
|
||||||
|
if ($wait_timeout)
|
||||||
|
{
|
||||||
|
let $max_run_time= $wait_timeout;
|
||||||
|
}
|
||||||
|
# Reset $wait_timeout so that its value won't be used on subsequent
|
||||||
|
# calls, and default will be used instead.
|
||||||
|
let $wait_timeout= 0;
|
||||||
|
|
||||||
|
# The smallest timespan till UNIX_TIMESTAMP() gets incremented is ~0 seconds.
|
||||||
|
# We add one second to avoid the case that somebody measures timespans on a
|
||||||
|
# real clock with fractions of seconds, detects that n seconds are sufficient,
|
||||||
|
# assigns n to this routine and suffers because he sometimes gets n - 1
|
||||||
|
# seconds in reality.
|
||||||
|
inc $max_run_time;
|
||||||
|
|
||||||
|
let $found= 0;
|
||||||
|
let $max_end_time= `SELECT UNIX_TIMESTAMP() + $max_run_time`;
|
||||||
|
while (`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`)
|
||||||
|
{
|
||||||
|
# Sleep a bit to avoid too heavy load.
|
||||||
|
real_sleep 0.2;
|
||||||
|
let $rowno= 1;
|
||||||
|
let $process_result= 1;
|
||||||
|
while (`SELECT $process_result = 1 AND $found = 0`)
|
||||||
|
{
|
||||||
|
let $field_value= query_get_value($show_statement, $field, $rowno);
|
||||||
|
if (`SELECT '$field_value' $condition`)
|
||||||
|
{
|
||||||
|
let $found= 1;
|
||||||
|
}
|
||||||
|
if (`SELECT '$field_value' = 'No such row'`)
|
||||||
|
{
|
||||||
|
# We are behind the last row of the result set.
|
||||||
|
let $process_result= 0;
|
||||||
|
}
|
||||||
|
inc $rowno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$found)
|
||||||
|
{
|
||||||
|
echo # Timeout in include/wait_show_condition.inc for $wait_condition;
|
||||||
|
echo # show_statement : $show_statement;
|
||||||
|
echo # field : $field;
|
||||||
|
echo # condition : $condition;
|
||||||
|
echo # max_run_time : $max_run_time;
|
||||||
|
}
|
||||||
|
|
17
mysql-test/r/innodb_bug42419.result
Normal file
17
mysql-test/r/innodb_bug42419.result
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE = InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
||||||
|
COMMIT;
|
||||||
|
SET AUTOCOMMIT = 0;
|
||||||
|
CREATE TEMPORARY TABLE t1_tmp ( b INT );
|
||||||
|
INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 3;
|
||||||
|
INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 2;
|
||||||
|
SET AUTOCOMMIT = 0;
|
||||||
|
CREATE TEMPORARY TABLE t2_tmp ( a int, new_a int );
|
||||||
|
INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
|
||||||
|
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
|
||||||
|
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
|
||||||
|
INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 1;
|
||||||
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||||
|
Reap the server message for connection user2 UPDATE t1 ...
|
||||||
|
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
|
||||||
|
DROP TABLE t1;
|
@ -1683,24 +1683,6 @@ CREATE INDEX i1 on t1 (a(3));
|
|||||||
SELECT * FROM t1 WHERE a = 'abcde';
|
SELECT * FROM t1 WHERE a = 'abcde';
|
||||||
a
|
a
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
connect(localhost,root,,test,12500,/home/kgeorge/mysql/work/B42419-merge-5.1-bugteam/mysql-test/var/tmp/mysqld.1.sock);
|
|
||||||
connect(localhost,root,,test,12500,/home/kgeorge/mysql/work/B42419-merge-5.1-bugteam/mysql-test/var/tmp/mysqld.1.sock);
|
|
||||||
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT)
|
|
||||||
ENGINE=InnoDB;
|
|
||||||
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
|
||||||
SET AUTOCOMMIT = 0;
|
|
||||||
CREATE TEMPORARY TABLE t1_tmp (b INT);
|
|
||||||
INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 3;
|
|
||||||
INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 2;
|
|
||||||
SET AUTOCOMMIT = 0;
|
|
||||||
CREATE TEMPORARY TABLE t2_tmp ( a INT, new_a INT);
|
|
||||||
INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
|
|
||||||
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
|
|
||||||
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
|
|
||||||
INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 1;
|
|
||||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
|
||||||
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
|
|
||||||
DROP TABLE t1;
|
|
||||||
CREATE TABLE foo (a int, b int, c char(10),
|
CREATE TABLE foo (a int, b int, c char(10),
|
||||||
PRIMARY KEY (c(3)),
|
PRIMARY KEY (c(3)),
|
||||||
KEY b (b)
|
KEY b (b)
|
||||||
|
77
mysql-test/t/innodb_bug42419.test
Normal file
77
mysql-test/t/innodb_bug42419.test
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#
|
||||||
|
# Testcase for InnoDB
|
||||||
|
# Bug#42419 Server crash with "Pure virtual method called" on two concurrent connections
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
let $innodb_lock_wait_timeout= query_get_value(SHOW VARIABLES LIKE 'innodb_lock_wait_timeout%', Value, 1);
|
||||||
|
if (`SELECT $innodb_lock_wait_timeout < 10`)
|
||||||
|
{
|
||||||
|
--echo # innodb_lock_wait_timeout must be >= 10 seconds
|
||||||
|
--echo # so that this test can work all time fine on an overloaded testing box
|
||||||
|
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Save the initial number of concurrent sessions
|
||||||
|
--source include/count_sessions.inc
|
||||||
|
|
||||||
|
# First session
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
|
||||||
|
--enable_warnings
|
||||||
|
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE = InnoDB;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
||||||
|
COMMIT;
|
||||||
|
SET AUTOCOMMIT = 0;
|
||||||
|
|
||||||
|
CREATE TEMPORARY TABLE t1_tmp ( b INT );
|
||||||
|
|
||||||
|
INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 3;
|
||||||
|
INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 2;
|
||||||
|
|
||||||
|
# Second session
|
||||||
|
connect (user2,localhost,root,,,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||||
|
|
||||||
|
SET AUTOCOMMIT = 0;
|
||||||
|
|
||||||
|
CREATE TEMPORARY TABLE t2_tmp ( a int, new_a int );
|
||||||
|
INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
|
||||||
|
|
||||||
|
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
|
||||||
|
send
|
||||||
|
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
|
||||||
|
|
||||||
|
# The last update will wait for a lock held by the first session
|
||||||
|
|
||||||
|
# First session
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
# Poll till the UPDATE of the second session waits for lock
|
||||||
|
let $show_statement= SHOW PROCESSLIST;
|
||||||
|
let $field= State;
|
||||||
|
let $condition= = 'Updating';
|
||||||
|
--source include/wait_show_condition.inc
|
||||||
|
|
||||||
|
# If the testing box is overloadeded and innodb_lock_wait_timeout is too small
|
||||||
|
# we might get here ER_LOCK_WAIT_TIMEOUT.
|
||||||
|
--error ER_LOCK_DEADLOCK
|
||||||
|
INSERT INTO t1_tmp (b) SELECT b FROM t1 WHERE a = 1;
|
||||||
|
|
||||||
|
# Second session
|
||||||
|
connection user2;
|
||||||
|
--echo Reap the server message for connection user2 UPDATE t1 ...
|
||||||
|
reap;
|
||||||
|
|
||||||
|
# The server crashed when executing this UPDATE or the succeeding SQL command.
|
||||||
|
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
disconnect user2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
# Wait till all disconnects are completed
|
||||||
|
--source include/wait_until_count_sessions.inc
|
@ -1 +1 @@
|
|||||||
--innodb-lock-wait-timeout=3
|
--innodb-lock-wait-timeout=2
|
||||||
|
@ -54,57 +54,6 @@ CREATE INDEX i1 on t1 (a(3));
|
|||||||
SELECT * FROM t1 WHERE a = 'abcde';
|
SELECT * FROM t1 WHERE a = 'abcde';
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
#
|
|
||||||
# Bug #42419: Server crash with "Pure virtual method called" on two
|
|
||||||
# concurrent connections
|
|
||||||
#
|
|
||||||
|
|
||||||
connect (c1, localhost, root,,);
|
|
||||||
connect (c2, localhost, root,,);
|
|
||||||
|
|
||||||
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT)
|
|
||||||
ENGINE=InnoDB;
|
|
||||||
|
|
||||||
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
|
||||||
|
|
||||||
connection c1;
|
|
||||||
|
|
||||||
SET AUTOCOMMIT = 0;
|
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE t1_tmp (b INT);
|
|
||||||
|
|
||||||
INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 3;
|
|
||||||
INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 2;
|
|
||||||
|
|
||||||
connection c2;
|
|
||||||
|
|
||||||
SET AUTOCOMMIT = 0;
|
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE t2_tmp ( a INT, new_a INT);
|
|
||||||
INSERT INTO t2_tmp VALUES (1,51),(2,52),(3,53);
|
|
||||||
|
|
||||||
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 1;
|
|
||||||
|
|
||||||
--send
|
|
||||||
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 2;
|
|
||||||
|
|
||||||
--sleep 3
|
|
||||||
|
|
||||||
connection c1;
|
|
||||||
|
|
||||||
--error ER_LOCK_DEADLOCK
|
|
||||||
INSERT INTO t1_tmp SELECT b FROM t1 WHERE a = 1;
|
|
||||||
|
|
||||||
connection c2;
|
|
||||||
|
|
||||||
--reap
|
|
||||||
UPDATE t1 SET a = (SELECT new_a FROM t2_tmp WHERE t2_tmp.a = t1.a) WHERE a = 3;
|
|
||||||
|
|
||||||
connection default;
|
|
||||||
disconnect c1;
|
|
||||||
disconnect c2;
|
|
||||||
DROP TABLE t1;
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #37742: HA_EXTRA_KEYREAD flag is set when key contains only prefix of
|
# Bug #37742: HA_EXTRA_KEYREAD flag is set when key contains only prefix of
|
||||||
# requested column
|
# requested column
|
||||||
|
@ -1758,7 +1758,6 @@ bool agg_item_set_converter(DTCollation &coll, const char *fname,
|
|||||||
bool agg_item_charsets(DTCollation &coll, const char *fname,
|
bool agg_item_charsets(DTCollation &coll, const char *fname,
|
||||||
Item **args, uint nargs, uint flags, int item_sep)
|
Item **args, uint nargs, uint flags, int item_sep)
|
||||||
{
|
{
|
||||||
Item **arg, *safe_args[2];
|
|
||||||
if (agg_item_collations(coll, fname, args, nargs, flags, item_sep))
|
if (agg_item_collations(coll, fname, args, nargs, flags, item_sep))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user