diff options
-rw-r--r-- | mysql-test/r/subselect_mat.result | 23 | ||||
-rw-r--r-- | mysql-test/t/subselect_mat.test | 24 | ||||
-rw-r--r-- | sql/item.h | 1 | ||||
-rw-r--r-- | sql/sql_class.cc | 2 |
4 files changed, 49 insertions, 1 deletions
diff --git a/mysql-test/r/subselect_mat.result b/mysql-test/r/subselect_mat.result index b7d2b5bb270..d7e8b6b6b28 100644 --- a/mysql-test/r/subselect_mat.result +++ b/mysql-test/r/subselect_mat.result @@ -1409,3 +1409,26 @@ f2 3 4 drop table t1, t2, t3; +# +# LPBUG#730604 Assertion `bit < (map)->n_bits' failed in maria-5.3 with +# partial_match_rowid_merge +# +CREATE TABLE t1 (f1 int NOT NULL, f2 int, f3 int) ; +CREATE TABLE t2 (f1 int NOT NULL, f2 int, f3 int) ; +INSERT INTO t1 VALUES (60, 3, null), (61, null, 77); +INSERT INTO t2 VALUES (1000,6,2); +set @@optimizer_switch='materialization=on,partial_match_rowid_merge=on,partial_match_table_scan=off'; +EXPLAIN +SELECT (f1, f2, f3) NOT IN +(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +FROM t2; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using filesort +SELECT (f1, f2, f3) NOT IN +(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +FROM t2; +(f1, f2, f3) NOT IN +(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +1 +drop table t1, t2; diff --git a/mysql-test/t/subselect_mat.test b/mysql-test/t/subselect_mat.test index 2664d2a31b4..c18585d0478 100644 --- a/mysql-test/t/subselect_mat.test +++ b/mysql-test/t/subselect_mat.test @@ -1039,3 +1039,27 @@ SELECT * FROM t2 WHERE (SELECT f3a FROM t3 where f3a > 3) NOT IN (SELECT f1a FRO SELECT * FROM t2 WHERE (SELECT f3a FROM t3 where f3a > 3) NOT IN (SELECT f1a FROM t1); drop table t1, t2, t3; + +--echo # +--echo # LPBUG#730604 Assertion `bit < (map)->n_bits' failed in maria-5.3 with +--echo # partial_match_rowid_merge +--echo # + +CREATE TABLE t1 (f1 int NOT NULL, f2 int, f3 int) ; +CREATE TABLE t2 (f1 int NOT NULL, f2 int, f3 int) ; + +INSERT INTO t1 VALUES (60, 3, null), (61, null, 77); +INSERT INTO t2 VALUES (1000,6,2); + +set @@optimizer_switch='materialization=on,partial_match_rowid_merge=on,partial_match_table_scan=off'; + +EXPLAIN +SELECT (f1, f2, f3) NOT IN + (SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +FROM t2; + +SELECT (f1, f2, f3) NOT IN + (SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +FROM t2; + +drop table t1, t2; diff --git a/sql/item.h b/sql/item.h index 5c84d9f9598..adbf7103de1 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3437,6 +3437,7 @@ public: virtual void store(Item *item); virtual bool cache_value()= 0; + bool is_null() { return null_value; } }; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 7d9f5b5b3ed..f10655c3e51 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3104,7 +3104,7 @@ bool select_materialize_with_stats::send_data(List<Item> &items) while ((cur_item= item_it++)) { - if (cur_item->is_null()) + if (cur_item->is_null_result()) { ++cur_col_stat->null_count; cur_col_stat->max_null_row= count_rows; |