diff options
author | Igor Babaev <igor@askmonty.org> | 2014-10-17 12:59:28 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2014-10-17 12:59:28 -0700 |
commit | a4d1783aaeea6a3e4a46084fde161ff7152fd2da (patch) | |
tree | 53114e3a6cd5a3361cc1a092006e40c1153e004c | |
parent | 3c4bb0e8720b84a14fe4822d1986d01290b9ab44 (diff) | |
download | mariadb-git-a4d1783aaeea6a3e4a46084fde161ff7152fd2da.tar.gz |
Fixed bug mdev-6874.
The method subselect_union_engine::no_rows() must take
into account the fact that now unit->fake_select_lex is
NULL for for select_union_direct objects.
-rw-r--r-- | mysql-test/r/union.result | 10 | ||||
-rw-r--r-- | mysql-test/t/union.test | 12 | ||||
-rw-r--r-- | sql/item_subselect.cc | 4 | ||||
-rw-r--r-- | sql/sql_class.h | 5 | ||||
-rw-r--r-- | sql/sql_union.cc | 1 |
5 files changed, 30 insertions, 2 deletions
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 5cfb7e003d2..ac665bb069b 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -1971,3 +1971,13 @@ FOUND_ROWS() 1 DROP TABLE t1, t2; # End of WL1763 tests +# +# Bug mdev-6874: crash with UNION ALL in a subquery +# +CREATE TABLE t1 (a int, b int); +INSERT INTO t1 VALUES (1,1), (2,8); +SELECT * FROM t1 t1_1 LEFT JOIN t1 t1_2 ON ( t1_2.b = t1_1.a ) +WHERE t1_2.b NOT IN ( SELECT 4 UNION ALL SELECT 5 ); +a b a b +1 1 1 1 +DROP TABLE t1; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 057c90b7c41..3305bea5b3b 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -1387,3 +1387,15 @@ DROP TABLE t1, t2; --echo # End of WL1763 tests +--echo # +--echo # Bug mdev-6874: crash with UNION ALL in a subquery +--echo # + +CREATE TABLE t1 (a int, b int); +INSERT INTO t1 VALUES (1,1), (2,8); + +SELECT * FROM t1 t1_1 LEFT JOIN t1 t1_2 ON ( t1_2.b = t1_1.a ) + WHERE t1_2.b NOT IN ( SELECT 4 UNION ALL SELECT 5 ); + +DROP TABLE t1; + diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index affea8d28f8..ef3ebae0521 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -3395,7 +3395,9 @@ bool subselect_union_engine::is_executed() const bool subselect_union_engine::no_rows() { /* Check if we got any rows when reading UNION result from temp. table: */ - return MY_TEST(!unit->fake_select_lex->join->send_records); + return MY_TEST(!(unit->fake_select_lex ? + unit->fake_select_lex->join->send_records : + ((select_union_direct *) result)->send_records)); } diff --git a/sql/sql_class.h b/sql/sql_class.h index 9fe524b5fe6..c27900375e7 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -4397,11 +4397,13 @@ private: ha_rows limit; public: + /* Number of rows in the union */ + ha_rows send_records; select_union_direct(select_result *result, SELECT_LEX *last_select_lex) :result(result), last_select_lex(last_select_lex), done_send_result_set_metadata(false), done_initialize_tables(false), limit_found_rows(0) - {} + { send_records= 0; } bool change_result(select_result *new_result); uint field_count(List<Item> &fields) const { @@ -4432,6 +4434,7 @@ public: and for the results of subquery engines (select_<something>_subselect). */ + send_records= 0; DBUG_ASSERT(false); /* purecov: inspected */ } void set_thd(THD *thd_arg) diff --git a/sql/sql_union.cc b/sql/sql_union.cc index cfc34b0f90a..9b8188b568d 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -246,6 +246,7 @@ int select_union_direct::send_data(List<Item> &items) return false; } + send_records++; fill_record(thd, table, table->field, items, true, false); if (thd->is_error()) return true; /* purecov: inspected */ |