summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <igor@rurik.mysql.com>2006-01-06 22:28:26 -0800
committerunknown <igor@rurik.mysql.com>2006-01-06 22:28:26 -0800
commit312c2f4759514c6594e630e6d1237b8875022328 (patch)
treeb8a215a1aea131a3018f2793e26e1c95276ef793
parentbf1ebe98dfe51c7f7b13e783cd13d8362a26afbf (diff)
downloadmariadb-git-312c2f4759514c6594e630e6d1237b8875022328.tar.gz
Fixed bug #16016: MIN/MAX optimization was not applied to views.
mysql-test/r/view.result: Added a test case for bug #16016. mysql-test/t/view.test: Added a test case for bug #16016. sql/opt_sum.cc: Fixed bug #16016: MIN/MAX optimization was not applied to views. The fix employs the standard way of handling direct references to view fields.
-rw-r--r--mysql-test/r/view.result29
-rw-r--r--mysql-test/t/view.test24
-rw-r--r--sql/opt_sum.cc10
3 files changed, 58 insertions, 5 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index b9380dcf033..8b6d0787ada 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -2475,3 +2475,32 @@ alias1 alias2
5 5
drop view v2, v1;
drop table t1;
+CREATE TABLE t1 (a int PRIMARY KEY, b int);
+INSERT INTO t1 VALUES (2,20), (3,10), (1,10), (0,30), (5,10);
+CREATE VIEW v1 AS SELECT * FROM t1;
+SELECT MAX(a) FROM t1;
+MAX(a)
+5
+SELECT MAX(a) FROM v1;
+MAX(a)
+5
+EXPLAIN SELECT MAX(a) FROM t1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+EXPLAIN SELECT MAX(a) FROM v1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+SELECT MIN(a) FROM t1;
+MIN(a)
+0
+SELECT MIN(a) FROM v1;
+MIN(a)
+0
+EXPLAIN SELECT MIN(a) FROM t1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+EXPLAIN SELECT MIN(a) FROM v1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+DROP VIEW v1;
+DROP TABLE t1;
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index db6c12fdacb..5f3678215f2 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -2339,3 +2339,27 @@ order by v2.receipt_id;
drop view v2, v1;
drop table t1;
+
+#
+# Bug#16016: MIN/MAX optimization for views
+#
+
+CREATE TABLE t1 (a int PRIMARY KEY, b int);
+INSERT INTO t1 VALUES (2,20), (3,10), (1,10), (0,30), (5,10);
+
+CREATE VIEW v1 AS SELECT * FROM t1;
+
+SELECT MAX(a) FROM t1;
+SELECT MAX(a) FROM v1;
+
+EXPLAIN SELECT MAX(a) FROM t1;
+EXPLAIN SELECT MAX(a) FROM v1;
+
+SELECT MIN(a) FROM t1;
+SELECT MIN(a) FROM v1;
+
+EXPLAIN SELECT MIN(a) FROM t1;
+EXPLAIN SELECT MIN(a) FROM v1;
+
+DROP VIEW v1;
+DROP TABLE t1;
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index 37acce2934b..ed8e694dcb7 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -180,14 +180,14 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
indexes to find the key.
*/
Item *expr=item_sum->args[0];
- if (expr->type() == Item::FIELD_ITEM)
+ if (expr->real_item()->type() == Item::FIELD_ITEM)
{
byte key_buff[MAX_KEY_LENGTH];
TABLE_REF ref;
uint range_fl, prefix_len;
ref.key_buff= key_buff;
- Item_field *item_field= ((Item_field*) expr);
+ Item_field *item_field= (Item_field*) (expr->real_item());
TABLE *table= item_field->field->table;
/*
@@ -267,14 +267,14 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
indexes to find the key.
*/
Item *expr=item_sum->args[0];
- if (expr->type() == Item::FIELD_ITEM)
+ if (expr->real_item()->type() == Item::FIELD_ITEM)
{
byte key_buff[MAX_KEY_LENGTH];
TABLE_REF ref;
- uint range_fl, prefix_len;
+ uint range_fl, prefix_len;
ref.key_buff= key_buff;
- Item_field *item_field= ((Item_field*) expr);
+ Item_field *item_field= (Item_field*) (expr->real_item());
TABLE *table= item_field->field->table;
/*