From: Jorgen Loland Date: June 20 2011 2:13pm Subject: bzr commit into mysql-trunk branch (jorgen.loland:3385) Bug#12616131 List-Archive: http://lists.mysql.com/commits/139532 X-Bug: 12616131 Message-Id: <20110620141307.7041C9DF@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3278152694030060552==" --===============3278152694030060552== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/mysql-next-mr-opt-backporting/ based on revid:jorgen.loland@stripped 3385 Jorgen Loland 2011-06-20 Bug#12616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS RETURNED WHEN JCL>=7 Consider a query of the form SELECT * FROM t1 LEFT JOIN t2 on t1_col = t2_col If the BKA UNIQUE algorithm is used on table t2, rows from t1 are read into the join buffer and each row's "key" (i.e., the columns used in the join) are then inserted into a hash table. When the buffer is either full or there are no more rows in t1, join matches are found in t2 using the key values in the hash table. The key value that is inserted into the hash table is created by calling cp_buffer_from_ref(). This effectively formats the key as a t2_col and copies the necessary info from JOIN_REF. The problem in this bug was that in the case where t1_col is nullable but t2_col is not, the information about NULL-values in t1_col was lost in cp_buffer_from_ref(). Thus, if t1_col had a value NULL, key would not be NULL but 0 (not necessarily reliably). The result was that t1 rows with a t1_col value of NULL would be joined with rows in t2 with t2_col=0. Note 1: The information about NULL values in t1_col is not lost as long as t2_col is also nullable. Note 2: If the join condition is <=>, the join correctness is handled by a triggered condition added in pushdown_on_conditions() @ mysql-test/include/join_cache.inc Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl0.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl1.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl2.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl3.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl4.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl5.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl6.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl7.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ mysql-test/r/join_cache_jcl8.result Test case for BUG#52636 no longer functioned as a regression test due to changed execution plan. Fixed Added test for BUG#12616131 @ sql/sql_join_cache.cc For BKA_UNIQUE: Do not add join keys with NULL values into the hash table if join condition is '='. In this case, it is impossible to find a join match to the key. modified: mysql-test/include/join_cache.inc mysql-test/r/join_cache_jcl0.result mysql-test/r/join_cache_jcl1.result mysql-test/r/join_cache_jcl2.result mysql-test/r/join_cache_jcl3.result mysql-test/r/join_cache_jcl4.result mysql-test/r/join_cache_jcl5.result mysql-test/r/join_cache_jcl6.result mysql-test/r/join_cache_jcl7.result mysql-test/r/join_cache_jcl8.result sql/sql_join_cache.cc === modified file 'mysql-test/include/join_cache.inc' --- a/mysql-test/include/join_cache.inc 2011-06-08 13:24:56 +0000 +++ b/mysql-test/include/join_cache.inc 2011-06-20 14:12:56 +0000 @@ -1474,16 +1474,18 @@ INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +let $query= SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; +--eval EXPLAIN $query --sorted_result -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +--eval $query # test crash when no key is worth collecting by BKA for t2's ref delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; + +--eval EXPLAIN $query --sorted_result -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +--eval $query DROP TABLE t1,t2; @@ -1646,4 +1648,45 @@ left join t8 on t3.col582 <= 1; drop table t1,t2,t3,t4,t5,t6,t7,t8; +--echo # +--echo # Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +--echo # RETURNED WHEN JCL>=7 +--echo # + +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); + +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +let $query1= SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +let $query2= SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; + +--echo +--echo # t2b is NULL-able +--echo +--eval EXPLAIN $query1 +--eval $query1 +--echo +--eval EXPLAIN $query2 +--eval $query2 +--echo + +DROP TABLE t2; + +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +--echo +--echo # t2b is NOT NULL +--echo +--eval EXPLAIN $query1 +--eval $query1 +--echo +--eval EXPLAIN $query2 +--eval $query2 +--echo + +DROP TABLE t1,t2; + set @@join_buffer_size=default; === modified file 'mysql-test/r/join_cache_jcl0.result' --- a/mysql-test/r/join_cache_jcl0.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl0.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t2 ref b b 5 test.t1.b 2 -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t2 ref b b 5 test.t1.b 2 -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL 999 NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl1.result' --- a/mysql-test/r/join_cache_jcl1.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl1.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t2 ref b b 5 test.t1.b 2 -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t2 ref b b 5 test.t1.b 2 -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL 999 NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl2.result' --- a/mysql-test/r/join_cache_jcl2.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl2.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t2 ref b b 5 test.t1.b 2 -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t2 ref b b 5 test.t1.b 2 -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL 999 NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl3.result' --- a/mysql-test/r/join_cache_jcl3.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl3.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, regular buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, regular buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL 999 NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl4.result' --- a/mysql-test/r/join_cache_jcl4.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl4.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, incremental buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, incremental buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL 999 NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 NULL NULL NULL +99 3 NULL NULL +99 0 100 0 +99 0 999 0 + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl5.result' --- a/mysql-test/r/join_cache_jcl5.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl5.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, regular buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA, regular buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, regular buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA, regular buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using join buffer (BKA, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where; Using join buffer (BKA, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL 999 NULL +99 3 NULL NULL + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using join buffer (BKA, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where; Using join buffer (BKA, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl6.result' --- a/mysql-test/r/join_cache_jcl6.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl6.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, incremental buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA, incremental buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, incremental buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA, incremental buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using join buffer (BKA, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where; Using join buffer (BKA, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL 999 NULL +99 3 NULL NULL + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using join buffer (BKA, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where; Using join buffer (BKA, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl7.result' --- a/mysql-test/r/join_cache_jcl7.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl7.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, regular buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA_UNIQUE, regular buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, regular buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA_UNIQUE, regular buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using join buffer (BKA_UNIQUE, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where; Using join buffer (BKA_UNIQUE, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL 999 NULL +99 3 NULL NULL + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using join buffer (BKA_UNIQUE, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where; Using join buffer (BKA_UNIQUE, regular buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'mysql-test/r/join_cache_jcl8.result' --- a/mysql-test/r/join_cache_jcl8.result 2011-06-08 13:24:56 +0000 +++ b/mysql-test/r/join_cache_jcl8.result 2011-06-20 14:12:56 +0000 @@ -2133,21 +2133,21 @@ CREATE TABLE t1 (b int); INSERT INTO t1 VALUES (NULL),(3); CREATE TABLE t2 (a int, b int, KEY (b)); INSERT INTO t2 VALUES (100,NULL),(150,200); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, incremental buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA_UNIQUE, incremental buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL delete from t1; INSERT INTO t1 VALUES (NULL),(NULL); -explain SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +EXPLAIN SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL b NULL NULL NULL 2 Using where; Using join buffer (BNL, incremental buffers) -SELECT t2.a FROM t1 LEFT JOIN t2 ON t2.b = t1.b; +1 SIMPLE t2 ref b b 5 test.t1.b 2 Using join buffer (BKA_UNIQUE, incremental buffers) +SELECT t2.a FROM t1 LEFT JOIN t2 FORCE INDEX (b) ON t2.b = t1.b; a NULL NULL @@ -2303,6 +2303,68 @@ left join t8 on t3.col582 <= 1; count(*) 32 drop table t1,t2,t3,t4,t5,t6,t7,t8; +# +# Bug312616131 - JCL: NULL VS DATE + TWICE AS MANY ROWS +# RETURNED WHEN JCL>=7 +# +CREATE TABLE t1 (t1a int, t1b int); +INSERT INTO t1 VALUES (99, NULL),(99, 3),(99,0); +CREATE TABLE t2 (t2a int, t2b int, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0),(999, NULL); + +# t2b is NULL-able + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using join buffer (BKA_UNIQUE, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 5 test.t1.t1b 2 Using where; Using join buffer (BKA_UNIQUE, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL 999 NULL +99 3 NULL NULL + +DROP TABLE t2; +CREATE TABLE t2 (t2a int, t2b int NOT NULL, KEY idx (t2b)); +INSERT INTO t2 VALUES (100,0),(150,200),(999, 0); + +# t2b is NOT NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using join buffer (BKA_UNIQUE, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b = t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +EXPLAIN SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ref idx idx 4 test.t1.t1b 2 Using where; Using join buffer (BKA_UNIQUE, incremental buffers) +SELECT * FROM t1 LEFT JOIN t2 force index (idx) ON t2.t2b <=> t1.t1b; +t1a t1b t2a t2b +99 0 100 0 +99 0 999 0 +99 NULL NULL NULL +99 3 NULL NULL + +DROP TABLE t1,t2; set @@join_buffer_size=default; set optimizer_join_cache_level = default; set optimizer_switch = default; === modified file 'sql/sql_join_cache.cc' --- a/sql/sql_join_cache.cc 2011-06-11 13:20:10 +0000 +++ b/sql/sql_join_cache.cc 2011-06-20 14:12:56 +0000 @@ -748,8 +748,8 @@ bool JOIN_CACHE_BKA::check_emb_key_usage return FALSE; /* If this is changed so that embedded keys may contain nullable - components, get_next_key() willhave to test ref->null_rejecting in the - "embedded keys" case too. + components, get_next_key() and put_record() will have to test + ref->null_rejecting in the "embedded keys" case too. */ } } @@ -2652,27 +2652,35 @@ void JOIN_CACHE_BKA_UNIQUE::reset(bool f bool JOIN_CACHE_BKA_UNIQUE::put_record() { - bool is_full; uchar *key; uint key_len= key_length; uchar *key_ref_ptr; - uchar *link= 0; TABLE_REF *ref= &join_tab->ref; uchar *next_ref_ptr= pos; - pos+= get_size_of_rec_offset(); - /* Write the record into the join buffer */ - if (prev_cache) - link= prev_cache->get_curr_rec_link(); - write_record_data(link, &is_full); + + // Write record to join buffer + bool is_full= JOIN_CACHE::put_record(); if (use_emb_key) - key= get_curr_emb_key(); + { + key= get_curr_emb_key(); + // Embedded is not used if one of the key columns is nullable + } else { /* Build the key over the fields read into the record buffers */ cp_buffer_from_ref(join->thd, join_tab->table, ref); key= ref->key_buff; + /* + If the row just read into the buffer has a NULL-value for one of + the ref-columns and the join comparison function for that column + is '=' (in contrast to '<=>'), it's impossible with a join match + for this row. The key is therefore not inserted into the hash + table. + */ + if (ref->impossible_null_ref()) + return is_full; } /* Look for the key in the hash table */ @@ -3250,54 +3258,19 @@ bool JOIN_CACHE_BKA_UNIQUE::check_all_ma */ uint JOIN_CACHE_BKA_UNIQUE::get_next_key(uchar ** key) -{ - - uint len= 0; +{ + if (curr_key_entry == last_key_entry) + return 0; - /* Read keys until find non-ignorable one or EOF */ - while((curr_key_entry > last_key_entry) && (len == 0)) - { - curr_key_entry-= key_entry_length; + curr_key_entry-= key_entry_length; - *key = use_emb_key ? get_emb_key(curr_key_entry) : curr_key_entry; + *key = use_emb_key ? get_emb_key(curr_key_entry) : curr_key_entry; - DBUG_ASSERT(*key >= buff && *key < hash_table); + DBUG_ASSERT(*key >= buff && *key < hash_table); - len= key_length; - DBUG_ASSERT(len != 0); - const TABLE_REF *ref= &join_tab->ref; - if (ref->null_rejecting != 0) - { - /* - Unlike JOIN_CACHE_BKA::get_next_key(), we have a key just read from - a buffer, not up-to-date fields pointed to by "ref". So we cannot use - ref->null_rejected(), must inspect the key. - */ - const KEY *key_info= join_tab->table->key_info + ref->key; - const uchar *ptr= *key; -#ifndef DBUG_OFF - const uchar *key_end= ptr + key_length; -#endif - for (uint i= 0 ; i < ref->key_parts ; i++) - { - KEY_PART_INFO *key_part= key_info->key_part + i; - if (key_part->null_bit && ptr[0] && (ref->null_rejecting & 1 << i)) - { - DBUG_PRINT("info", ("JOIN_CACHE_BKA_UNIQUE::get_next_key null_rejected")); - len= 0; - break; - } - ptr+= key_part->store_length; - DBUG_ASSERT(ptr <= key_end); - } - if (len != 0) - DBUG_ASSERT(ptr == key_end); /* should have read the full key */ - } - } - return len; + return key_length; } - /** Check matching to a partial join record from the join buffer, an implementation specialized for JOIN_CACHE_BKA_UNIQUE. --===============3278152694030060552== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # g2auznma0gkomdeq # target_branch: file:///export/home/jl208045/mysql/mysql-next-mr-opt-\ # backporting/ # testament_sha1: 16d061c462c62ed330e343c2c216dc6b70d0e760 # timestamp: 2011-06-20 16:13:07 +0200 # base_revision_id: jorgen.loland@stripped\ # yhbq58b26glco915 # # Begin bundle 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 --===============3278152694030060552==--