Hi Joro,
It would be good to add this assertion:
void Item_singlerow_subselect::store(uint i, Item *item)
{
DBUG_ASSERT(i < max_columns);
row[i]->store(item);
row[i]->cache_value();
}
Ok to push.
Regards, Evgen.
On 04/15/10 18:04, Georgi Kodinov wrote:
> #At file:///home/kgeorge/mysql/work/B52711-5.1-bugteam/ based on
> revid:joro@stripped
>
> 3454 Georgi Kodinov 2010-04-15
> Bug #52711: Segfault when doing EXPLAIN SELECT with
> union...order by (select... where...)
>
> The problem is mysql is trying to materialize and
> cache the scalar sub-queries at JOIN::optimize
> even for EXPLAIN where the number of columns is
> totally different from what's expected.
> Fixed by not executing the scalar subqueries
> for EXPLAIN.
>
> modified:
> mysql-test/r/subselect.result
> mysql-test/t/subselect.test
> sql/sql_select.cc
> === modified file 'mysql-test/r/subselect.result'
> --- a/mysql-test/r/subselect.result 2010-04-12 10:12:20 +0000
> +++ b/mysql-test/r/subselect.result 2010-04-15 14:04:24 +0000
> @@ -4717,3 +4717,20 @@ t1_id total_amount
> DROP TABLE t3;
> DROP TABLE t2;
> DROP TABLE t1;
> +#
> +# Bug #52711: Segfault when doing EXPLAIN SELECT with
> +# union...order by (select... where...)
> +#
> +CREATE TABLE t1 (a VARCHAR(10), FULLTEXT KEY a (a));
> +INSERT INTO t1 VALUES (1),(2);
> +CREATE TABLE t2 (b INT);
> +INSERT INTO t2 VALUES (1),(2);
> +# Should not crash
> +EXPLAIN
> +SELECT * FROM t2 UNION SELECT * FROM t2
> +ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
> +# Should not crash
> +SELECT * FROM t2 UNION SELECT * FROM t2
> +ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
> +DROP TABLE t1,t2;
> +End of 5.1 tests
>
> === modified file 'mysql-test/t/subselect.test'
> --- a/mysql-test/t/subselect.test 2010-04-12 10:12:20 +0000
> +++ b/mysql-test/t/subselect.test 2010-04-15 14:04:24 +0000
> @@ -3701,3 +3701,28 @@ GROUP BY
> DROP TABLE t3;
> DROP TABLE t2;
> DROP TABLE t1;
> +
> +
> +--echo #
> +--echo # Bug #52711: Segfault when doing EXPLAIN SELECT with
> +--echo # union...order by (select... where...)
> +--echo #
> +
> +CREATE TABLE t1 (a VARCHAR(10), FULLTEXT KEY a (a));
> +INSERT INTO t1 VALUES (1),(2);
> +CREATE TABLE t2 (b INT);
> +INSERT INTO t2 VALUES (1),(2);
> +
> +--echo # Should not crash
> +--disable_result_log
> +EXPLAIN
> +SELECT * FROM t2 UNION SELECT * FROM t2
> + ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
> +
> +--echo # Should not crash
> +SELECT * FROM t2 UNION SELECT * FROM t2
> + ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
> +DROP TABLE t1,t2;
> +--enable_result_log
> +
> +--echo End of 5.1 tests
>
> === modified file 'sql/sql_select.cc'
> --- a/sql/sql_select.cc 2010-04-12 10:12:20 +0000
> +++ b/sql/sql_select.cc 2010-04-15 14:04:24 +0000
> @@ -7210,7 +7210,8 @@ remove_const(JOIN *join,ORDER *first_ord
> *simple_order=0; // Must do a temp table to sort
> else if (!(order_tables& not_const_tables))
> {
> - if (order->item[0]->with_subselect)
> + if (order->item[0]->with_subselect&&
> + !(join->select_lex->options& SELECT_DESCRIBE))
> order->item[0]->val_str(&order->item[0]->str_value);
> DBUG_PRINT("info",("removing: %s", order->item[0]->full_name()));
> continue; // skip const item
>
>
>
>
>