summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2010-11-09 19:40:02 -0800
committerIgor Babaev <igor@askmonty.org>2010-11-09 19:40:02 -0800
commit6e5bcca7935d3c62f84bb640e5357664a210ee12 (patch)
treed8559bd522bde648c26a1ca380d19e13e1aa6ad8
parent05f21b21e4942efe02fa6dd334094cc64ce0983b (diff)
parent6b67bafc747e10815566178d730b190a84803fb7 (diff)
downloadmariadb-git-6e5bcca7935d3c62f84bb640e5357664a210ee12.tar.gz
Merge
-rw-r--r--mysql-test/suite/innodb/r/innodb_mysql.result38
-rw-r--r--mysql-test/suite/innodb/t/innodb_mysql.test36
-rw-r--r--sql/opt_index_cond_pushdown.cc2
-rw-r--r--sql/sql_select.cc9
4 files changed, 82 insertions, 3 deletions
diff --git a/mysql-test/suite/innodb/r/innodb_mysql.result b/mysql-test/suite/innodb/r/innodb_mysql.result
index e6383fb97fa..4e7ca8b4d8f 100644
--- a/mysql-test/suite/innodb/r/innodb_mysql.result
+++ b/mysql-test/suite/innodb/r/innodb_mysql.result
@@ -2609,5 +2609,41 @@ ref NULL
rows 3
Extra Using index
DROP TABLE t1;
-#
End of 5.1 tests
+#
+# Bug#668644: HAVING + ORDER BY
+#
+CREATE TABLE t1 (
+pk int NOT NULL PRIMARY KEY, i int DEFAULT NULL,
+INDEX idx (i)
+) ENGINE=INNODB;
+INSERT INTO t1 VALUES
+(6,-1636630528),(2,-1097924608),(1,6),(3,6),(4,1148715008),(5,1541734400);
+CREATE TABLE t2 (
+i int DEFAULT NULL,
+pk int NOT NULL PRIMARY KEY,
+INDEX idx (i)
+) ENGINE= INNODB;
+INSERT INTO t2 VALUES
+(-1993998336,20),(-1036582912,1),(-733413376,5),(-538247168,16),
+(-514260992,4),(-249561088,9),(1,2),(1,6),(2,10),(2,19),(4,17),
+(5,14),(5,15),(6,8),(7,13),(8,18),(9,11),(9,12),(257425408,7),
+(576061440,3);
+EXPLAIN
+SELECT t1 .i AS f FROM t1, t2
+WHERE t2.i = t1.pk AND t1.pk BETWEEN 0 AND 224
+HAVING f > 7
+ORDER BY f;
+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 idx idx 5 test.t1.pk 1 Using index
+SELECT t1 .i AS f FROM t1, t2
+WHERE t2.i = t1.pk AND t1.pk BETWEEN 0 AND 224
+HAVING f > 7
+ORDER BY f;
+f
+1148715008
+1541734400
+1541734400
+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 e346d91aaa4..6f278dae538 100644
--- a/mysql-test/suite/innodb/t/innodb_mysql.test
+++ b/mysql-test/suite/innodb/t/innodb_mysql.test
@@ -840,7 +840,41 @@ CREATE INDEX b ON t1(a,b,c,d);
DROP TABLE t1;
+--echo End of 5.1 tests
+
+--echo #
+--echo # Bug#668644: HAVING + ORDER BY
--echo #
+CREATE TABLE t1 (
+ pk int NOT NULL PRIMARY KEY, i int DEFAULT NULL,
+ INDEX idx (i)
+) ENGINE=INNODB;
+INSERT INTO t1 VALUES
+ (6,-1636630528),(2,-1097924608),(1,6),(3,6),(4,1148715008),(5,1541734400);
---echo End of 5.1 tests
+CREATE TABLE t2 (
+ i int DEFAULT NULL,
+ pk int NOT NULL PRIMARY KEY,
+ INDEX idx (i)
+) ENGINE= INNODB;
+INSERT INTO t2 VALUES
+ (-1993998336,20),(-1036582912,1),(-733413376,5),(-538247168,16),
+ (-514260992,4),(-249561088,9),(1,2),(1,6),(2,10),(2,19),(4,17),
+ (5,14),(5,15),(6,8),(7,13),(8,18),(9,11),(9,12),(257425408,7),
+ (576061440,3);
+
+EXPLAIN
+SELECT t1 .i AS f FROM t1, t2
+ WHERE t2.i = t1.pk AND t1.pk BETWEEN 0 AND 224
+ HAVING f > 7
+ ORDER BY f;
+SELECT t1 .i AS f FROM t1, t2
+ WHERE t2.i = t1.pk AND t1.pk BETWEEN 0 AND 224
+ HAVING f > 7
+ ORDER BY f;
+
+DROP TABLE t1, t2;
+
+
+--echo End of 5.3 tests
diff --git a/sql/opt_index_cond_pushdown.cc b/sql/opt_index_cond_pushdown.cc
index 277343b81a5..f6437e04ec5 100644
--- a/sql/opt_index_cond_pushdown.cc
+++ b/sql/opt_index_cond_pushdown.cc
@@ -318,7 +318,7 @@ void push_index_cond(JOIN_TAB *tab, uint keyno, bool other_tbls_ok)
if (idx_cond)
{
Item *idx_remainder_cond= 0;
- tab->pre_idx_push_select_cond= tab->select_cond;
+ tab->pre_idx_push_select_cond= tab->select->cond;
/*
For BKA cache we store condition to special BKA cache field
because evaluation of the condition requires additional operations
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index debd1b07fe5..7c51d0e25bd 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2213,6 +2213,14 @@ JOIN::exec()
DBUG_VOID_RETURN;
curr_table->select->cond->fix_fields(thd, 0);
}
+ if (curr_table->pre_idx_push_select_cond)
+ {
+ 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);
+ }
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,
@@ -6355,6 +6363,7 @@ JOIN::make_simple_join(JOIN *parent, TABLE *temp_table)
join_tab->do_firstmatch= NULL;
join_tab->loosescan_match_tab= NULL;
join_tab->emb_sj_nest= NULL;
+ join_tab->pre_idx_push_select_cond= NULL;
bzero((char*) &join_tab->read_record,sizeof(join_tab->read_record));
temp_table->status=0;
temp_table->null_row=0;