diff --git a/mysql-test/suite/innodb/r/innodb_mysql.result b/mysql-test/suite/innodb/r/innodb_mysql.result index 193dff3c742..987359a82cb 100644 --- a/mysql-test/suite/innodb/r/innodb_mysql.result +++ b/mysql-test/suite/innodb/r/innodb_mysql.result @@ -2737,4 +2737,26 @@ f 1541734400 1541734400 DROP TABLE t1, t2; +# +# Bug#702322: HAVING with two ANDed predicates + ORDER BY +# +CREATE TABLE t1 (pk int PRIMARY KEY, a int, KEY (a)) ENGINE=InnoDB; +CREATE TABLE t2 (a int, KEY (a)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +(18,0),(9,10),(8,11),(2,15),(7,19),(1,20); +SET SESSION join_cache_level = 0; +EXPLAIN +SELECT t1.a FROM t1 LEFT JOIN t2 ON t1.pk = t2.a +WHERE t1.pk >= 6 HAVING t1.a<> 0 AND t1.a <> 11 +ORDER BY t1.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 3 Using where; Using filesort +1 SIMPLE t2 ref a a 5 test.t1.pk 1 Using index +SELECT t1.a FROM t1 LEFT JOIN t2 ON t1.pk = t2.a +WHERE t1.pk >= 6 HAVING t1.a<> 0 AND t1.a <> 11 +ORDER BY t1.a; +a +10 +19 +DROP TABLE t1,t2; End of 5.3 tests diff --git a/mysql-test/suite/innodb/t/innodb_mysql.test b/mysql-test/suite/innodb/t/innodb_mysql.test index cec4085e9a5..5ebc839d7cb 100644 --- a/mysql-test/suite/innodb/t/innodb_mysql.test +++ b/mysql-test/suite/innodb/t/innodb_mysql.test @@ -938,4 +938,26 @@ SELECT t1 .i AS f FROM t1, t2 DROP TABLE t1, t2; +--echo # +--echo # Bug#702322: HAVING with two ANDed predicates + ORDER BY +--echo # + +CREATE TABLE t1 (pk int PRIMARY KEY, a int, KEY (a)) ENGINE=InnoDB; +CREATE TABLE t2 (a int, KEY (a)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES + (18,0),(9,10),(8,11),(2,15),(7,19),(1,20); + +SET SESSION join_cache_level = 0; + +EXPLAIN +SELECT t1.a FROM t1 LEFT JOIN t2 ON t1.pk = t2.a + WHERE t1.pk >= 6 HAVING t1.a<> 0 AND t1.a <> 11 + ORDER BY t1.a; +SELECT t1.a FROM t1 LEFT JOIN t2 ON t1.pk = t2.a + WHERE t1.pk >= 6 HAVING t1.a<> 0 AND t1.a <> 11 + ORDER BY t1.a; + +DROP TABLE t1,t2; + --echo End of 5.3 tests diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 9e496cde197..8b654a6dde4 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2315,16 +2315,23 @@ JOIN::exec() new Item_cond_and(curr_table->select->cond, sort_table_cond))) DBUG_VOID_RETURN; - curr_table->select->cond->fix_fields(thd, 0); } if (curr_table->pre_idx_push_select_cond) { + if (sort_table_cond->type() == Item::COND_ITEM && + sort_table_cond != curr_table->select->cond) + sort_table_cond= sort_table_cond->copy_andor_structure(thd); if (!(curr_table->pre_idx_push_select_cond= new Item_cond_and(curr_table->pre_idx_push_select_cond, sort_table_cond))) DBUG_VOID_RETURN; - curr_table->pre_idx_push_select_cond->fix_fields(thd, 0); } + if (curr_table->select->cond && !curr_table->select->cond->fixed) + curr_table->select->cond->fix_fields(thd, 0); + if (curr_table->pre_idx_push_select_cond && + !curr_table->pre_idx_push_select_cond->fixed) + curr_table->pre_idx_push_select_cond->fix_fields(thd, 0); + curr_table->set_select_cond(curr_table->select->cond, __LINE__); curr_table->select_cond->top_level_item(); DBUG_EXECUTE("where",print_where(curr_table->select->cond,