#At file:///home/gluh/MySQL/mysql-5.1-bugteam/ based on revid:mikael@dator8-20100916065358-em2dzakdx3n5z4kz
3510 Sergey Glukhov 2010-09-16
Bug#54484 explain + prepared statement: crash and Got error -1 from storage engine
If outer join is replaced with inner join
TABLE_LIST::outer_join value is changed in
simplify_joins() function. On second
execution of PS TABLE::maybe_null is initialized
with changed TABLE_LIST::outer_join value.
It affects list_contains_unique_index() behaviour
and optimizer incorrectly decides to optimize
away GROUP BY clause(see JOIN::optimize).
The fix is to use original outer_join value
for TABLE::maybe_null initialization.
@ mysql-test/r/fulltext.result
test case
@ mysql-test/t/fulltext.test
test case
@ sql/mysql_priv.h
use original value for initialization
@ sql/sql_parse.cc
save original outer_join value
@ sql/sql_yacc.yy
save original outer_join value
@ sql/table.h
new field orig_outer_join
modified:
mysql-test/r/fulltext.result
mysql-test/t/fulltext.test
sql/mysql_priv.h
sql/sql_parse.cc
sql/sql_yacc.yy
sql/table.h
=== modified file 'mysql-test/r/fulltext.result'
--- a/mysql-test/r/fulltext.result 2010-03-25 12:08:21 +0000
+++ b/mysql-test/r/fulltext.result 2010-09-16 11:24:57 +0000
@@ -644,4 +644,39 @@ Table Op Msg_type Msg_text
test.t1 repair status OK
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
DROP TABLE t1;
+#
+# Bug#54484 explain + prepared statement: crash and Got error -1 from storage engine
+#
+CREATE TABLE t1(f1 VARCHAR(6) NOT NULL,
+FULLTEXT KEY(f1),UNIQUE(f1));
+INSERT INTO t1 VALUES ('test');
+PREPARE stmt FROM
+'SELECT 1 FROM t1 WHERE 1 >
+ ALL((SELECT 1 FROM t1 RIGHT OUTER JOIN t1 a
+ ON (MATCH(t1.f1) against (""))
+ WHERE t1.f1 GROUP BY t1.f1)) xor f1 or f1 > 1';
+EXECUTE stmt;
+1
+1
+EXECUTE stmt;
+1
+1
+DEALLOCATE PREPARE stmt;
+PREPARE stmt FROM
+'EXPLAIN SELECT 1 FROM t1
+ WHERE 1 > ALL((SELECT 1 FROM t1 RIGHT OUTER JOIN t1 a
+ ON (MATCH(t1.f1) AGAINST (""))
+ WHERE t1.f1 GROUP BY t1.f1)) XOR f1 or f1 >1';
+EXECUTE stmt;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 system f1_2,f1 NULL NULL NULL 1
+2 DEPENDENT SUBQUERY a system NULL NULL NULL NULL 1 Using temporary; Using filesort
+2 DEPENDENT SUBQUERY t1 fulltext f1 f1 0 1 Using where
+EXECUTE stmt;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 system f1_2,f1 NULL NULL NULL 1
+2 DEPENDENT SUBQUERY a system NULL NULL NULL NULL 1 Using temporary; Using filesort
+2 DEPENDENT SUBQUERY t1 fulltext f1 f1 0 1 Using where
+DEALLOCATE PREPARE stmt;
+DROP TABLE t1;
End of 5.1 tests
=== modified file 'mysql-test/t/fulltext.test'
--- a/mysql-test/t/fulltext.test 2010-03-25 12:08:21 +0000
+++ b/mysql-test/t/fulltext.test 2010-09-16 11:24:57 +0000
@@ -585,4 +585,36 @@ REPAIR TABLE t1;
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
DROP TABLE t1;
+--echo #
+--echo # Bug#54484 explain + prepared statement: crash and Got error -1 from storage engine
+--echo #
+
+CREATE TABLE t1(f1 VARCHAR(6) NOT NULL,
+FULLTEXT KEY(f1),UNIQUE(f1));
+INSERT INTO t1 VALUES ('test');
+
+PREPARE stmt FROM
+'SELECT 1 FROM t1 WHERE 1 >
+ ALL((SELECT 1 FROM t1 RIGHT OUTER JOIN t1 a
+ ON (MATCH(t1.f1) against (""))
+ WHERE t1.f1 GROUP BY t1.f1)) xor f1 or f1 > 1';
+
+EXECUTE stmt;
+EXECUTE stmt;
+
+DEALLOCATE PREPARE stmt;
+
+PREPARE stmt FROM
+'EXPLAIN SELECT 1 FROM t1
+ WHERE 1 > ALL((SELECT 1 FROM t1 RIGHT OUTER JOIN t1 a
+ ON (MATCH(t1.f1) AGAINST (""))
+ WHERE t1.f1 GROUP BY t1.f1)) XOR f1 or f1 >1';
+
+EXECUTE stmt;
+EXECUTE stmt;
+
+DEALLOCATE PREPARE stmt;
+
+DROP TABLE t1;
+
--echo End of 5.1 tests
=== modified file 'sql/mysql_priv.h'
--- a/sql/mysql_priv.h 2010-07-29 03:00:57 +0000
+++ b/sql/mysql_priv.h 2010-09-16 11:24:57 +0000
@@ -2391,7 +2391,7 @@ inline void setup_table_map(TABLE *table
table->const_table= 0;
table->null_row= 0;
table->status= STATUS_NO_RECORD;
- table->maybe_null= table_list->outer_join;
+ table->maybe_null= table_list->orig_outer_join;
TABLE_LIST *embedding= table_list->embedding;
while (!table->maybe_null && embedding)
{
=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc 2010-08-18 04:56:06 +0000
+++ b/sql/sql_parse.cc 2010-09-16 11:24:57 +0000
@@ -6632,7 +6632,7 @@ TABLE_LIST *st_select_lex::convert_right
join_list->push_front(tab2);
join_list->push_front(tab1);
- tab1->outer_join|= JOIN_TYPE_RIGHT;
+ tab1->orig_outer_join= tab1->outer_join|= JOIN_TYPE_RIGHT;
DBUG_RETURN(tab1);
}
=== modified file 'sql/sql_yacc.yy'
--- a/sql/sql_yacc.yy 2010-08-30 22:16:38 +0000
+++ b/sql/sql_yacc.yy 2010-09-16 11:24:57 +0000
@@ -8596,7 +8596,7 @@ join_table:
{
add_join_on($5,$8);
Lex->pop_context();
- $5->outer_join|=JOIN_TYPE_LEFT;
+ $5->orig_outer_join= $5->outer_join|=JOIN_TYPE_LEFT;
$$=$5;
Select->parsing_place= NO_MATTER;
}
@@ -8607,14 +8607,14 @@ join_table:
USING '(' using_list ')'
{
add_join_natural($1,$5,$9,Select);
- $5->outer_join|=JOIN_TYPE_LEFT;
+ $5->orig_outer_join= $5->outer_join|=JOIN_TYPE_LEFT;
$$=$5;
}
| table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor
{
MYSQL_YYABORT_UNLESS($1 && $6);
add_join_natural($1,$6,NULL,Select);
- $6->outer_join|=JOIN_TYPE_LEFT;
+ $6->orig_outer_join= $6->outer_join|=JOIN_TYPE_LEFT;
$$=$6;
}
=== modified file 'sql/table.h'
--- a/sql/table.h 2010-08-02 07:50:15 +0000
+++ b/sql/table.h 2010-09-16 11:24:57 +0000
@@ -1348,7 +1348,7 @@ struct TABLE_LIST
/* call back function for asking handler about caching in query cache */
qc_engine_callback callback_func;
thr_lock_type lock_type;
- uint outer_join; /* Which join type */
+ uint outer_join, orig_outer_join; /* Which join type */
uint shared; /* Used in multi-upd */
size_t db_length;
size_t table_name_length;
Attachment: [text/bzr-bundle] bzr/sergey.glukhov@sun.com-20100916112457-k1n7hhkky236ath3.bundle