summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Glukhov <Sergey.Glukhov@sun.com>2010-03-24 14:45:09 +0400
committerSergey Glukhov <Sergey.Glukhov@sun.com>2010-03-24 14:45:09 +0400
commitfe25ec8f2425cfd0e59d9a20f0094d6fc6e0cd3a (patch)
tree79d297822c1d85981f562b66cc48a7dfcafb8d64
parenta9a2ceae1f360c275ed4db5b093ab65be4f5fb7b (diff)
parentbccf219bfc61bb45d334b40d732651eb9bef5075 (diff)
downloadmariadb-git-fe25ec8f2425cfd0e59d9a20f0094d6fc6e0cd3a.tar.gz
5.0-bugteam->5.1-bugteam merge
-rw-r--r--mysql-test/r/join.result17
-rw-r--r--mysql-test/t/join.test12
-rw-r--r--sql/sql_select.cc13
3 files changed, 41 insertions, 1 deletions
diff --git a/mysql-test/r/join.result b/mysql-test/r/join.result
index 102b39c3992..6ffb4c59481 100644
--- a/mysql-test/r/join.result
+++ b/mysql-test/r/join.result
@@ -1117,6 +1117,23 @@ ON t4.a = t5.a
ON t1.a = t3.a;
a a a a a a
DROP TABLE t1,t2,t3,t4,t5,t6;
+#
+# Bug#48483: crash in get_best_combination()
+#
+CREATE TABLE t1(f1 INT);
+INSERT INTO t1 VALUES (1),(2);
+CREATE VIEW v1 AS SELECT 1 FROM t1 LEFT JOIN t1 AS t2 on 1=1;
+EXPLAIN EXTENDED
+SELECT 1 FROM v1 right join v1 AS v2 ON RAND();
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00
+Warnings:
+Note 1003 select 1 AS `1` from `test`.`t1` left join `test`.`t1` `t2` on((1 = 1)) left join (`test`.`t1` left join `test`.`t1` `t2` on((1 = 1))) on(rand()) where 1
+DROP VIEW v1;
+DROP TABLE t1;
End of 5.0 tests.
CREATE TABLE t1 (f1 int);
CREATE TABLE t2 (f1 int);
diff --git a/mysql-test/t/join.test b/mysql-test/t/join.test
index 761121313e5..c1b35b51563 100644
--- a/mysql-test/t/join.test
+++ b/mysql-test/t/join.test
@@ -784,6 +784,18 @@ FROM
DROP TABLE t1,t2,t3,t4,t5,t6;
+--echo #
+--echo # Bug#48483: crash in get_best_combination()
+--echo #
+
+CREATE TABLE t1(f1 INT);
+INSERT INTO t1 VALUES (1),(2);
+CREATE VIEW v1 AS SELECT 1 FROM t1 LEFT JOIN t1 AS t2 on 1=1;
+EXPLAIN EXTENDED
+SELECT 1 FROM v1 right join v1 AS v2 ON RAND();
+DROP VIEW v1;
+DROP TABLE t1;
+
--echo End of 5.0 tests.
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 618332ae89b..77d63305b19 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -5043,6 +5043,11 @@ greedy_search(JOIN *join,
if (best_extension_by_limited_search(join, remaining_tables, idx, record_count,
read_time, search_depth, prune_level))
DBUG_RETURN(TRUE);
+ /*
+ 'best_read < DBL_MAX' means that optimizer managed to find
+ some plan and updated 'best_positions' array accordingly.
+ */
+ DBUG_ASSERT(join->best_read < DBL_MAX);
if (size_remain <= search_depth)
{
@@ -8824,8 +8829,14 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top)
we still make the inner tables dependent on the outer tables.
It would be enough to set dependency only on one outer table
for them. Yet this is really a rare case.
+ Note:
+ RAND_TABLE_BIT mask should not be counted as it
+ prevents update of inner table dependences.
+ For example it might happen if RAND() function
+ is used in JOIN ON clause.
*/
- if (!(prev_table->on_expr->used_tables() & ~prev_used_tables))
+ if (!((prev_table->on_expr->used_tables() & ~RAND_TABLE_BIT) &
+ ~prev_used_tables))
prev_table->dep_tables|= used_tables;
}
}