From: He Zhenxing Date: October 15 2010 10:13am Subject: bzr commit into mysql-5.1-bugteam branch (zhenxing.he:3418) Bug#42415 List-Archive: http://lists.mysql.com/commits/120819 X-Bug: 42415 Message-Id: <201010151013.o9FAD41i014120@hezx-dev.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5556434708931458393==" --===============5556434708931458393== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///media/sdb2/hezx/work/mysql/bzr/b42415/5.1-bugteam/ based on revid:ramil@stripped 3418 He Zhenxing 2010-10-15 Bug #42415 UPDATE/DELETE with LIMIT clause unsafe for SBL even with ORDER BY PK clause Before the patch, when using STATEMENT mode, unsafe warnings were issued for all DML statements (INSERT...SELECT, UPDATE, DELETE) with LIMIT clause due to the possobility of non-deterministic result order, even when they also had a ORDER BY primary_key clause. In which case the order would be deterministic. This patch fixed the problem by checking the ORDER BY clause of the statement, and do not issue the warning if the result is ordered by the primary key (thus deterministic). ****** BUG#42415 UPDATE/DELETE with LIMIT clause unsafe for SBL even with ORDER BY PK clause UPDATE/DELETE/INSERT..SELECT with LIMIT clause were considered unsafe unconditionally, even if there is an ORDER BY PK or WHERE condition that can guarantee the result to be deterministic. The problem is fixed by implementing a algorithm to do more elaborate analyzed on the nature of the query to determine whether the query will cause uncertainty for replication or not. The statement will not be considered unsafe for following cases: - single table UPDATE/DELETE/INSERT..SELECT with ORDER BY - single table UPDATE/DELETE/INSERT..SELECT with WHERE clause that include = , if it is a multi-part key, then it must be = AND = ..., and this condition is ANDed with other conditions if there is any. - single table INSERT..SELECT with WHERE clause that include some parts of the non null unique key compare to const values, and the ORDER BY clause includes all the other key pars of the same non null unique key. for example (a,b) is a non null unique key, then WHERE a= ORDER b will make the query result deterministic. - for INSERT..SELECT ... JOIN ..., the join condition (ON, USING, or WHERE) must include equations between columns of non null unique key of tables from both side of the join. For example t1 JOIN t2 USING (a,b), if (a,b) is not a non null unique key for both t1 and t2, then the result will be non- deterministic. otherwise the result can be deterministic with appropirate WHERE/ORDER clauses, and in this case, the same rule for single table above applys. But there is a difference for INNER JOIN with OUTER JOIN, for OUTER JOIN, only one table of the two JOIN tables will be used when checking the WHERE/ORDER conditions, it's the left table for LEFT JOIN and the right one for RIGHT JOIN when checking the keys. On the other hand, for INNER JOIN, keys from both tables can be used when checking the conditions. For example: INSERT..SELECT * FROM t1 INNER JOIN t2 USING(pk) ORDER BY nnuk LIMIT 1; This can be safe if nnuk is a non null unique key of either t1 or t2. But if we change the INNER JOIN to LEFT JOIN or RIGHT JOIN, then nnuk must be a non null unique key key of t1 (LEFT JOIN) or t2 (RIGHT JOIN) respectively. - If JOIN are nested, the will be handled recursively from inner outside. added: mysql-test/suite/binlog/r/binlog_unsafe_limit.result modified: mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result mysql-test/suite/binlog/r/binlog_unsafe.result sql/sql_delete.cc sql/sql_insert.cc sql/sql_select.cc sql/sql_select.h sql/sql_update.cc === modified file 'mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result' --- a/mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result 2009-07-31 13:00:35 +0000 +++ b/mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result 2010-10-15 10:12:56 +0000 @@ -3,11 +3,7 @@ DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a int, b int, primary key (a)); INSERT INTO t1 VALUES (1,2), (2,3); UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; -Warnings: -Note 1592 Statement may not be safe to log in statement format. UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; -Warnings: -Note 1592 Statement may not be safe to log in statement format. DROP TABLE t1; ### NOT filtered database => assertion: binlog disabled and warnings ARE NOT shown SET SQL_LOG_BIN= 0; === modified file 'mysql-test/suite/binlog/r/binlog_unsafe.result' --- a/mysql-test/suite/binlog/r/binlog_unsafe.result 2010-01-13 09:00:03 +0000 +++ b/mysql-test/suite/binlog/r/binlog_unsafe.result 2010-10-15 10:12:56 +0000 @@ -412,4 +412,53 @@ a 13:46:40 1970-01-12 13:46:40 DROP TABLE t1; +DROP TABLE IF EXISTS t1,t2,t3,t4; +Warnings: +Note 1051 Unknown table 't1' +Note 1051 Unknown table 't2' +Note 1051 Unknown table 't3' +Note 1051 Unknown table 't4' +CREATE TABLE t1 (a INT PRIMARY KEY); +CREATE TABLE t2 (a INT); +CREATE TABLE t3 (a INT); +CREATE TABLE t4 (a INT); +INSERT INTO t1 VALUES (1),(2),(3); +INSERT INTO t2 VALUES (1),(2),(3); +# +# Unsafe statements +# +UPDATE t1 SET a = a+10 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +UPDATE t2 SET a = a+10 ORDER BY a LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +INSERT INTO t3 SELECT * FROM t1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +INSERT INTO t4 SELECT * FROM t2 ORDER BY a LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +INSERT INTO t4 SELECT t1.a FROM t2,t1 ORDER BY t1.a LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +INSERT INTO t4 SELECT t2.a FROM t1,t2 ORDER BY t2.a LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +DELETE FROM t1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +DELETE FROM t2 ORDER BY a LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +# +# Safe statements +# +UPDATE t1 SET a = a+10 ORDER BY a LIMIT 1; +INSERT INTO t3 SELECT * FROM t1 ORDER BY a LIMIT 1; +DELETE FROM t1 ORDER BY a LIMIT 1; +UPDATE t2 SET a = a+10 LIMIT 0; +INSERT INTO t4 SELECT * FROM t2 LIMIT 0; +DELETE FROM t2 LIMIT 0; +DROP TABLE t1, t2, t3, t4; "End of tests" === added file 'mysql-test/suite/binlog/r/binlog_unsafe_limit.result' --- a/mysql-test/suite/binlog/r/binlog_unsafe_limit.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/r/binlog_unsafe_limit.result 2010-10-15 10:12:56 +0000 @@ -0,0 +1,1246 @@ +CREATE TABLE t (nokey INT, pk INT PRIMARY KEY, nnuk INT NOT NULL UNIQUE KEY, nuk INT UNIQUE KEY, nnuk1 INT NOT NULL, nnuk2 INT NOT NULL, UNIQUE KEY(nnuk1, nnuk2)); +CREATE TABLE t1 LIKE t; +CREATE TABLE t2 LIKE t; +CREATE TABLE t3 LIKE t; +CREATE TABLE t4 LIKE t; +CREATE TABLE queries (query VARCHAR(1024) NOT NULL); +CREATE TABLE result_queries (id INT AUTO_INCREMENT PRIMARY KEY, query VARCHAR(1024) NOT NULL); +CREATE TABLE limits (`limit` VARCHAR(256) NOT NULL); +INSERT INTO queries(query) VALUES +('UPDATE t1 SET nokey = nokey + 10 [LIMIT_1]'), +('UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 [LIMIT_1]'), +('UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 [LIMIT_1]'), +('UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 [LIMIT_1]'), +('UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 [LIMIT_1]'), +('DELETE FROM t1 [LIMIT_1]'), +('DELETE FROM t1 WHERE nokey=1 [LIMIT_1]'), +('DELETE FROM t1 WHERE nuk=1 [LIMIT_1]'), +('DELETE FROM t1 WHERE nnuk=1 [LIMIT_1]'), +('DELETE FROM t1 WHERE pk=1 [LIMIT_1]'), +('REPLACE INTO t SELECT * FROM t1 [LIMIT_1]'), +('REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 [LIMIT_1]'), +('REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 [LIMIT_1]'), +('REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 [LIMIT_1]'), +('REPLACE INTO t SELECT * FROM t1 WHERE pk=1 [LIMIT_1]'), +('INSERT INTO t SELECT * FROM t1 [LIMIT_1]'), +('INSERT INTO t SELECT * FROM t1 WHERE nokey=1 [LIMIT_1]'), +('INSERT INTO t SELECT * FROM t1 WHERE nuk=1 [LIMIT_1]'), +('INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 [LIMIT_1]'), +('INSERT INTO t SELECT * FROM t1 WHERE pk=1 [LIMIT_1]'), +('INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) [LIMIT_1]'), +('INSERT INTO t (SELECT * FROM t1 [LIMIT_1]) UNION (SELECT * FROM t2)'), +('INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 [LIMIT_1])'), +('INSERT INTO t (SELECT * FROM t1 [LIMIT_1]) UNION (SELECT * FROM t2 [LIMIT_2])'), +('INSERT INTO t SELECT * FROM (SELECT * FROM t1 [LIMIT_1]) AS subselect [LIMIT_2]'), +('INSERT INTO t SELECT t1.* FROM t1, t2 [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk [LIMIT_1]'), +('INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk [LIMIT_1]'); +INSERT INTO limits (`limit`) VALUES +('LIMIT 0'), +('LIMIT 1'), +('ORDER BY nokey LIMIT 1'), +('ORDER BY nuk LIMIT 1'), +('ORDER BY nnuk1 LIMIT 1'), +('ORDER BY nnuk LIMIT 1'), +('ORDER BY pk LIMIT 1'), +('ORDER BY nnuk1, nnuk2 LIMIT 1'), +('ORDER BY nnuk1, nnuk2, nokey LIMIT 1'), +('ORDER BY nnuk1, nokey, nnuk2 LIMIT 1'); +CREATE PROCEDURE gen_queries() +BEGIN +DECLARE done INT DEFAULT 0; +DECLARE q VARCHAR(1024); +DECLARE limit1, limit2 VARCHAR(256); +DECLARE qcur CURSOR FOR SELECT * FROM queries; +DECLARE lcur1 CURSOR FOR SELECT * FROM limits; +DECLARE lcur2 CURSOR FOR SELECT * FROM limits; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; +OPEN qcur; +FETCH qcur INTO q; +WHILE done <> 1 DO +OPEN lcur1; +FETCH lcur1 INTO limit1; +WHILE done <> 1 DO +IF LOCATE('[LIMIT_2]', q) > 0 THEN +OPEN lcur2; +FETCH lcur2 INTO limit2; +WHILE done <> 1 DO +SELECT REPLACE(REPLACE(q, '[LIMIT_1]', limit1), '[LIMIT_2]', limit2) INTO @query; +FETCH lcur2 INTO limit2; +END WHILE; +CLOSE lcur2; +SET done = 0; +ELSE +SELECT REPLACE(q, '[LIMIT_1]', limit1) INTO @query; +END IF; +INSERT INTO result_queries set query=@query; +FETCH lcur1 INTO limit1; +END WHILE; +CLOSE lcur1; +SET done = 0; +FETCH qcur INTO q; +END WHILE; +CLOSE qcur; +END| +call gen_queries(); +UPDATE t1 SET nokey = nokey + 10 LIMIT 0; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 LIMIT 0; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nokey=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 LIMIT 0; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 LIMIT 0; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE nnuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 LIMIT 0; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +UPDATE t1 SET nokey = nokey + 10 WHERE pk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 LIMIT 0; +ROWS in table t: 2 +DELETE FROM t1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 LIMIT 0; +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nokey=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 LIMIT 0; +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 LIMIT 0; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 LIMIT 0; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +DELETE FROM t1 WHERE pk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 LIMIT 0; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY pk LIMIT 1; +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 3 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 LIMIT 0; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 LIMIT 0; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 LIMIT 0; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 LIMIT 0; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +REPLACE INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY pk LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nokey=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE nnuk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT * FROM t1 WHERE pk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) LIMIT 0; +ROWS in table t: 2 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nnuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nnuk1, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1 LIMIT 0) UNION (SELECT * FROM t2); +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 LIMIT 1) UNION (SELECT * FROM t2); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nokey LIMIT 1) UNION (SELECT * FROM t2); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nuk LIMIT 1) UNION (SELECT * FROM t2); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1 LIMIT 1) UNION (SELECT * FROM t2); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk LIMIT 1) UNION (SELECT * FROM t2); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY pk LIMIT 1) UNION (SELECT * FROM t2); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1, nnuk2 LIMIT 1) UNION (SELECT * FROM t2); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1) UNION (SELECT * FROM t2); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1) UNION (SELECT * FROM t2); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 LIMIT 0); +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nokey LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nuk LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nnuk1 LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nnuk LIMIT 1); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY pk LIMIT 1); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nnuk2 LIMIT 1); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nnuk2, nokey LIMIT 1); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 5 +INSERT INTO t (SELECT * FROM t1 LIMIT 0) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 3 +INSERT INTO t (SELECT * FROM t1 LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nokey LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nuk LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1 LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY pk LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1, nnuk2 LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 4 +INSERT INTO t (SELECT * FROM t1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1) UNION (SELECT * FROM t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1); +ROWS in table t: 4 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 LIMIT 0) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nokey LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nuk LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nnuk1 LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nnuk LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY pk LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nnuk1, nnuk2 LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT * FROM (SELECT * FROM t1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1) AS subselect ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nnuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nnuk1, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nnuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nnuk1, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nokey=t2.nokey ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nnuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nnuk1, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nuk=t2.nuk ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.nnuk=t2.nnuk ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1, t2 WHERE t1.pk=t2.pk ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 NATURAL JOIN t2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 USING(pk) ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk1 AND t1.nnuk2=t2.nnuk2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN t2 ON t1.nnuk1=t2.nnuk2 AND t1.nnuk2=t2.nnuk1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN t3 USING (pk)) USING(pk) ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.pk=t3.pk) ON t1.pk=t4.pk ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nnuk1 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nnuk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY pk LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 JOIN (t2 JOIN (t3 JOIN t4 USING (pk)) ON t2.nnuk=t3.nnuk) ON t1.nnuk1=t4.nnuk1 AND t1.nnuk2=t4.nnuk2 AND t2.pk=1 ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nokey LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nuk LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY pk LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1, nnuk2 LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk LIMIT 0; +ROWS in table t: 2 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nokey LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nuk LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1 LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY pk LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1, nnuk2 LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1, nnuk2, nokey LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +INSERT INTO t SELECT t1.* FROM t1 RIGHT JOIN t2 ON t1.pk=t2.pk ORDER BY nnuk1, nokey, nnuk2 LIMIT 1; +Warnings: +Warning 1048 Column 'pk' cannot be null +Warning 1048 Column 'nnuk' cannot be null +Warning 1048 Column 'nnuk1' cannot be null +Warning 1048 Column 'nnuk2' cannot be null +Note 1592 Statement may not be safe to log in statement format. +ROWS in table t: 3 +DROP TABLE t, t1, t2, t3, t4; +DROP TABLE queries, result_queries, limits; +DROP PROCEDURE gen_queries; === modified file 'sql/sql_delete.cc' --- a/sql/sql_delete.cc 2010-05-14 11:36:27 +0000 +++ b/sql/sql_delete.cc 2010-10-15 10:12:56 +0000 @@ -92,6 +92,18 @@ bool mysql_delete(THD *thd, TABLE_LIST * } } + /* + Statement-based replication of DELETE ... LIMIT is not safe as + order of rows is not defined unless ORDER BY primary_key, so in + mixed mode we go to row-based. + */ + if (thd->lex->current_select->select_limit && + select_lex->select_limit->val_int() && + !is_order_deterministic(table_list, conds, (ORDER*)order->first)) + { + thd->lex->set_stmt_unsafe(); + } + const_cond= (!conds || conds->const_item()); safe_update=test(thd->options & OPTION_SAFE_UPDATES); if (safe_update && const_cond) @@ -475,19 +487,6 @@ int mysql_prepare_delete(THD *thd, TABLE DBUG_ENTER("mysql_prepare_delete"); List all_fields; - /* - Statement-based replication of DELETE ... LIMIT is not safe as order of - rows is not defined, so in mixed mode we go to row-based. - - Note that we may consider a statement as safe if ORDER BY primary_key - is present. However it may confuse users to see very similiar statements - replicated differently. - */ - if (thd->lex->current_select->select_limit) - { - thd->lex->set_stmt_unsafe(); - thd->set_current_stmt_binlog_row_based_if_mixed(); - } thd->lex->allow_sum_func= 0; if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context, &thd->lex->select_lex.top_join_list, === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2010-03-29 02:32:30 +0000 +++ b/sql/sql_insert.cc 2010-10-15 10:12:56 +0000 @@ -2881,19 +2881,6 @@ bool mysql_insert_select_prepare(THD *th DBUG_ENTER("mysql_insert_select_prepare"); /* - Statement-based replication of INSERT ... SELECT ... LIMIT is not safe - as order of rows is not defined, so in mixed mode we go to row-based. - - Note that we may consider a statement as safe if ORDER BY primary_key - is present or we SELECT a constant. However it may confuse users to - see very similiar statements replicated differently. - */ - if (lex->current_select->select_limit) - { - lex->set_stmt_unsafe(); - thd->set_current_stmt_binlog_row_based_if_mixed(); - } - /* SELECT_LEX do not belong to INSERT statement, so we can't add WHERE clause if table is VIEW */ === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-05-27 15:13:53 +0000 +++ b/sql/sql_select.cc 2010-10-15 10:12:56 +0000 @@ -910,6 +910,27 @@ JOIN::optimize() } } + if (thd->lex->sql_command == SQLCOM_INSERT_SELECT || + thd->lex->sql_command == SQLCOM_REPLACE_SELECT) + { + /* + Statement-based replication of INSERT ... SELECT ... LIMIT is + not safe as order of rows is not defined unless ORDER BY + primary_key, so in mixed mode we go to row-based. + + NOTE: When more than one tables are joined in the SELECT part, + it will very hard to figure out whether the result order will be + deterministic or not, so they are always considered unsafe to + simplify the logic. + */ + if (!thd->lex->is_stmt_unsafe() && select_lex->select_limit && + select_lex->select_limit->val_int() && + !is_order_deterministic(join_list, conds, order)) + { + thd->lex->set_stmt_unsafe(); + } + } + #ifdef WITH_PARTITION_STORAGE_ENGINE { TABLE_LIST *tbl; @@ -17162,6 +17183,505 @@ bool JOIN::change_result(select_result * DBUG_RETURN(FALSE); } +bool is_cond_equal(COND *cond) +{ + if (cond->type() == Item::FUNC_ITEM && + (((Item_func*)cond)->functype() == Item_func::EQ_FUNC || + ((Item_func*)cond)->functype() == Item_func::EQUAL_FUNC)) + return TRUE; + return FALSE; +} + +bool is_cond_mult_equal(COND *cond) +{ + if (cond->type() == Item::FUNC_ITEM && + (((Item_func*)cond)->functype() == Item_func::MULT_EQUAL_FUNC)) + return TRUE; + return FALSE; +} + +static bool covers_unique_key(MY_BITMAP *bitmap, TABLE *table) +{ + uint key; + MY_BITMAP key_set; + + if (table->s->primary_key == MAX_KEY && !table->s->uniques) + return FALSE; + + bitmap_init(&key_set, NULL, table->s->fields, FALSE); + for (key=0; key < table->s->keys; key++) + { + if ((table->s->key_info[key].flags & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME) + { + table->mark_columns_used_by_index_no_reset(key, &key_set); + if (bitmap_is_subset(&key_set, bitmap)) + { + bitmap_free(&key_set); + return TRUE; + } + bitmap_clear_all(&key_set); + } + } + bitmap_free(&key_set); + return FALSE; +} + +/* + This class is used to calculate the equation bitmaps for JOIN table + lists. + + When there is an equation 't1.a=t2.b' in the WHERE condition or ON + expression, both the bit of the bitmap for field 'a' in table 't1' + and the bit for field 'b' in table 't2' will be set. The bit will be + first set in the 'tmp_bitmap' when iterating over each item, and + after iterated over all the items of the condition, the value of + 'tmp_bitmap' will be merged if the fields of the equation are from + tables of both side of the JOIN. + + Please check calc_equation_bitmap_* functions for more detail. + */ +class TABLE_BITMAP_LIST { +public: + TABLE_BITMAP_LIST(TABLE_LIST *t) + :table(t->table) + { + bitmap_init(&bitmap, NULL, table->s->fields, FALSE); + bitmap_init(&tmp_bitmap, NULL, table->s->fields, FALSE); + } + + TABLE* get_table() { return table; } + + void set_tmp_bit(uint16 field_index) + { + bitmap_set_bit(&tmp_bitmap, field_index); + } + + void clear_all() + { + bitmap_clear_all(&bitmap); + } + + void clear_tmp_all() + { + bitmap_clear_all(&tmp_bitmap); + } + + void merge_tmp() + { + bitmap_union(&bitmap, &tmp_bitmap); + } + + bool is_owner_of(Field *field) + { + return field->table == table; + } + + bool covers_unique_key() + { + return ::covers_unique_key(&bitmap, table); + } + +private: + TABLE *table; + MY_BITMAP bitmap; + + /* + tmp_bitmap is used to temporary save the result when tranversing + all items of the condition. it will be throw away or merged to + bitmap at the end + */ + MY_BITMAP tmp_bitmap; +}; + +static TABLE_BITMAP_LIST* find_field_owner(List *tbls, + Field *field) +{ + List_iterator it(*tbls); + TABLE_BITMAP_LIST *tbl; + while ((tbl= it++)) + { + if (tbl->is_owner_of(field)) + return tbl; + } + return NULL; +} + +static bool list_covers_unique_key(List *tbls) +{ + List_iterator it(*tbls); + TABLE_BITMAP_LIST *tbl; + while ((tbl= it++)) + { + if(tbl->covers_unique_key()) + return TRUE; + } + return FALSE; +} + +static void list_clear_all(List *tbls) +{ + List_iterator it(*tbls); + TABLE_BITMAP_LIST *tbl; + while ((tbl= it++)) + tbl->clear_all(); +} + +static void list_clear_tmp_all(List *tbls) +{ + List_iterator it(*tbls); + TABLE_BITMAP_LIST *tbl; + while ((tbl= it++)) + tbl->clear_tmp_all(); +} + +static void list_merge_tmp(List *tbls) +{ + List_iterator it(*tbls); + TABLE_BITMAP_LIST *tbl; + while ((tbl= it++)) + tbl->merge_tmp(); +} + +static bool calc_equation_bitmap_for_single_equal(List *first_list, + List *second_list, + COND *cond) +{ + if (is_cond_equal(cond)) + { + uint i; + Item **args= ((Item_func*)cond)->arguments(); + uint arg_count= ((Item_func*)cond)->argument_count(); + bool from_first= FALSE, from_second= FALSE; + + list_clear_tmp_all(first_list); + list_clear_tmp_all(second_list); + + for (i=0; ireal_item()->type() == Item::FIELD_ITEM) + { + TABLE_BITMAP_LIST *tbl= NULL; + Field *field= ((Item_field*)args[i]->real_item())->field; + if ((tbl= find_field_owner(first_list, field))) + { + from_first= TRUE; + tbl->set_tmp_bit(field->field_index); + } + else if ((tbl= find_field_owner(second_list, field))) + { + from_second= TRUE; + tbl->set_tmp_bit(field->field_index); + } + } + } + if (from_first && from_second) + { + list_merge_tmp(first_list); + list_merge_tmp(second_list); + return TRUE; + } + } + return FALSE; +} + +static bool calc_equation_bitmap_for_mult_equal(List *first_list, + List *second_list, + Item_equal *item_equal) +{ + Item_equal_iterator it(*item_equal); + Item_field *item= NULL; + + list_clear_tmp_all(first_list); + list_clear_tmp_all(second_list); + + bool from_first= FALSE, from_second= FALSE; + + while ((item= it++)) + { + Field *field= item->field; + TABLE_BITMAP_LIST *tbl= NULL; + if ((tbl= find_field_owner(first_list, field))) + { + tbl->set_tmp_bit(field->field_index); + from_first= TRUE; + } + else if ((tbl= find_field_owner(second_list, field))) + { + tbl->set_tmp_bit(field->field_index); + from_second= TRUE; + } + } + if(from_first && from_second) + { + list_merge_tmp(first_list); + list_merge_tmp(second_list); + return TRUE; + } + return FALSE; +} + +static bool calc_equation_bitmap_for_cond_equal(List *first_list, + List *second_list, + COND_EQUAL *cond_equal) +{ + if (!cond_equal || cond_equal->current_level.is_empty()) + return FALSE; + + bool ret= FALSE; + while (cond_equal) + { + Item_equal *item_equal; + List_iterator equal_it(cond_equal->current_level); + while ((item_equal= equal_it++)) + { + ret|= calc_equation_bitmap_for_mult_equal(first_list, second_list, item_equal); + } + cond_equal= cond_equal->upper_levels; + } + return ret; +} + +static bool calc_equation_bitmap_for_cond(List *first_list, + List *second_list, + COND *cond); + +static bool calc_equation_bitmap_for_and(List *first_list, + List *second_list, + Item_cond_and *cond_and) +{ + bool ret= calc_equation_bitmap_for_cond_equal(first_list, second_list, + &cond_and->cond_equal); + List *args= cond_and->argument_list(); + List_iterator it(*args); + COND *cond; + while ((cond= it++)) + { + ret|= calc_equation_bitmap_for_cond(first_list, second_list, cond); + } + return ret; +} + +static bool calc_equation_bitmap_for_cond(List *first_list, + List *second_list, + COND *cond) +{ + if (!cond) + return FALSE; + + if (is_cond_equal(cond)) + return calc_equation_bitmap_for_single_equal(first_list, + second_list, + cond); + + if (is_cond_mult_equal(cond)) + return calc_equation_bitmap_for_mult_equal(first_list, + second_list, + (Item_equal*)cond); + + if (is_cond_and(cond)) + return calc_equation_bitmap_for_and(first_list, second_list, + (Item_cond_and*)cond); + return FALSE; +} + + +/* + Mark all the fields in the condition that is an equality comparison + between a field and a const value (i.e. col1=const1 [and col2=const2]). + */ +static void mark_cond_field_const_equations(TABLE *table, + COND *cond, MY_BITMAP *cond_set) +{ + if (is_cond_and(cond)) + { + List *args= ((Item_cond*) cond)->argument_list(); + + List_iterator it(*args); + COND *c; + while ((c= it++)) + { + mark_cond_field_const_equations(table, c, cond_set); + } + } + + if (is_cond_equal(cond)) + { + uint i; + Field *field= NULL; + Item **args= ((Item_func*)cond)->arguments(); + uint arg_count= ((Item_func*)cond)->argument_count(); + bool const_value= FALSE; + + for (i=0; ireal_item()->type() == Item::FIELD_ITEM) + { + field= ((Item_field*)args[i]->real_item())->field; + } + else if (args[i]->real_item()->basic_const_item()) + { + const_value = TRUE; + } + } + if (field && const_value && field->table == table) + bitmap_set_bit(cond_set, field->field_index); + } + else if (is_cond_mult_equal(cond) && + ((Item_equal*)cond)->get_const()) + { + Item_equal_iterator it(*((Item_equal*)cond)); + Item_field *item; + while ((item= it++)) + { + if (item->field->table == table) + bitmap_set_bit(cond_set, item->field->field_index); + } + } + return; +} + +/* + Mark all the columns used by the order clause. + */ +static void mark_order_fields(TABLE *table, ORDER *order, MY_BITMAP *order_set) +{ + for (; order; order=order->next) + { + if ((*order->item)->real_item()->type() == Item::FIELD_ITEM) + { + Field *field=((Item_field*) (*order->item)->real_item())->field; + if (field->table == table) + bitmap_set_bit(order_set, field->field_index); + } + } + return; +} + +inline bool is_nested_join_table(TABLE_LIST *table) +{ + return table->nested_join ? TRUE : FALSE; +} + +static List* join_on_unique_key(TABLE_LIST *table, COND *cond); + +static List* join_on_unique_key(List *join_list, COND *cond) +{ + if (join_list->is_empty()) + return NULL; + + List_iterator it(*join_list); + TABLE_LIST *table= it++; + COND* on_expr= table->on_expr; + uint outer_join= table->outer_join; + + List *first_list, *second_list; + first_list= join_on_unique_key(table, cond); + + if (!first_list) + return NULL; + + if (join_list->elements == 1) + return first_list; + + while ((table= it++)) + { + second_list= join_on_unique_key(table, cond); + if (!second_list) + return NULL; + + list_clear_all(first_list); + list_clear_all(second_list); + + if (!calc_equation_bitmap_for_cond(first_list, second_list, on_expr) && + !calc_equation_bitmap_for_cond(first_list, second_list, cond)) + return NULL; + + if (!list_covers_unique_key(first_list) || + !list_covers_unique_key(second_list)) + return NULL; + if (!outer_join) + first_list->concat(second_list); + } + + if (outer_join) + return second_list; + return first_list; +} + +static List* join_on_unique_key(TABLE_LIST *table, COND *cond) +{ + if (!is_nested_join_table(table)) + { + TABLE_BITMAP_LIST *tbl= new TABLE_BITMAP_LIST(table); + List *tbls= new List; + tbls->push_back(tbl); + return tbls; + } + + return join_on_unique_key(&table->nested_join->join_list, cond); +} + +/* + Helper function to check if the result order is deterministic. + */ +static bool is_order_deterministic(List *tbls, COND *cond, ORDER *order) +{ + if (!tbls || tbls->is_empty()) + return FALSE; + + List_iterator tbls_it(*tbls); + TABLE_BITMAP_LIST *tbl; + while ((tbl= tbls_it++)) + { + MY_BITMAP check_set; + TABLE *table= tbl->get_table(); + bitmap_init(&check_set, NULL, table->s->fields, FALSE); + + if (order) + mark_order_fields(table, order, &check_set); + if (cond) + mark_cond_field_const_equations(table, cond, &check_set); + + bool ret= covers_unique_key(&check_set, table); + + bitmap_free(&check_set); + if (ret) + return ret; + } + return FALSE; +} + +/* + Test if the result order is deterministic for a JOIN table list. + + @retval FALSE not deterministic + @retval TRUE deterministic + */ +bool is_order_deterministic(List* join_list, + COND* cond, ORDER* order) +{ + List *tbls= join_on_unique_key(join_list, cond); + + return is_order_deterministic(tbls, cond, order); +} + +/* + Test if the result order is deterministic for a single table. + + @retval FALSE not deterministic + @retval TRUE deterministic + */ +bool is_order_deterministic(TABLE_LIST *table_list, COND *cond, ORDER *order) +{ + if (order == NULL && cond == NULL) + return FALSE; + + List *tbls= join_on_unique_key(table_list, cond); + + return is_order_deterministic(tbls, cond, order); +} + + /** @} (end of group Query_Optimizer) */ === modified file 'sql/sql_select.h' --- a/sql/sql_select.h 2010-02-26 13:16:46 +0000 +++ b/sql/sql_select.h 2010-10-15 10:12:56 +0000 @@ -794,3 +794,5 @@ inline bool optimizer_flag(THD *thd, uin return (thd->variables.optimizer_switch & flag); } +bool is_order_deterministic(TABLE_LIST *table_list, COND *cond, ORDER *order); +bool is_order_deterministic(List *join_list, COND *cond, ORDER *order); === modified file 'sql/sql_update.cc' --- a/sql/sql_update.cc 2010-05-27 20:07:40 +0000 +++ b/sql/sql_update.cc 2010-10-15 10:12:56 +0000 @@ -248,6 +248,18 @@ int mysql_update(THD *thd, if (mysql_prepare_update(thd, table_list, &conds, order_num, order)) DBUG_RETURN(1); + /* + Statement-based replication of UPDATE ... LIMIT is not safe as + order of rows is not defined unless ORDER BY primary_key, so in + mixed mode we go to row-based. + */ + if (thd->lex->current_select->select_limit && + select_lex->select_limit->val_int() && + !is_order_deterministic(table_list, conds, order)) + { + thd->lex->set_stmt_unsafe(); + } + old_covering_keys= table->covering_keys; // Keys used in WHERE /* Check the fields we are going to modify */ #ifndef NO_EMBEDDED_ACCESS_CHECKS @@ -875,19 +887,6 @@ bool mysql_prepare_update(THD *thd, TABL SELECT_LEX *select_lex= &thd->lex->select_lex; DBUG_ENTER("mysql_prepare_update"); - /* - Statement-based replication of UPDATE ... LIMIT is not safe as order of - rows is not defined, so in mixed mode we go to row-based. - - Note that we may consider a statement as safe if ORDER BY primary_key - is present. However it may confuse users to see very similiar statements - replicated differently. - */ - if (thd->lex->current_select->select_limit) - { - thd->lex->set_stmt_unsafe(); - thd->set_current_stmt_binlog_row_based_if_mixed(); - } #ifndef NO_EMBEDDED_ACCESS_CHECKS table_list->grant.want_privilege= table->grant.want_privilege= (SELECT_ACL & ~table->grant.privilege); --===============5556434708931458393== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/zhenxing.he@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: zhenxing.he@stripped # target_branch: file:///media/sdb2/hezx/work/mysql/bzr/b42415/5.1-\ # bugteam/ # testament_sha1: 76b661470842cf39fb28f22e3798ee1e8a45b956 # timestamp: 2010-10-15 18:13:04 +0800 # base_revision_id: ramil@stripped # # Begin bundle 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 --===============5556434708931458393==--