summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2016-09-22 17:52:05 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2016-09-28 21:12:48 +0200
commit9ff9acb3079b1c48f5be0f0a689cbbdda82b4c0e (patch)
treebcc314b7cd1db32f6d61a400bcea8d81c409d4f0
parentd5dfa0f1c20614ca083a0c4f841534f2f68808dd (diff)
downloadmariadb-git-9ff9acb3079b1c48f5be0f0a689cbbdda82b4c0e.tar.gz
MDEV-10716: Assertion `real_type() != FIELD_ITEM' failed in Item_ref::build_equal_items(THD*, COND_EQUAL*, bool, COND_EQUAL**)
Degenerated condition in AND should be treated in the same way as in WHERE/HAVING alone (i.e reference should be processed as well as fields)
-rw-r--r--mysql-test/r/having.result20
-rw-r--r--mysql-test/t/having.test15
-rw-r--r--sql/item_cmpfunc.cc3
3 files changed, 37 insertions, 1 deletions
diff --git a/mysql-test/r/having.result b/mysql-test/r/having.result
index eda67460205..7fdec5a29cd 100644
--- a/mysql-test/r/having.result
+++ b/mysql-test/r/having.result
@@ -709,3 +709,23 @@ c1 c2
x x
DROP TABLE t1,t2;
End of 10.0 tests
+#
+# MDEV-10716: Assertion `real_type() != FIELD_ITEM' failed in
+# Item_ref::build_equal_items(THD*, COND_EQUAL*, bool, COND_EQUAL**)
+#
+CREATE TABLE t1 (i INT);
+INSERT INTO t1 VALUES (1),(2);
+SELECT i, COUNT(*) FROM t1 GROUP BY i HAVING i<>0 AND 1;
+i COUNT(*)
+1 1
+2 1
+SELECT i-1 A, COUNT(*) FROM t1 GROUP BY i HAVING A AND 1;
+A COUNT(*)
+1 1
+CREATE VIEW v1 as select i, i-1 as A from t1;
+SELECT A, COUNT(*) FROM v1 GROUP BY i HAVING A AND 1;
+A COUNT(*)
+1 1
+DROP VIEW v1;
+DROP TABLE t1;
+End of 10.1 tests
diff --git a/mysql-test/t/having.test b/mysql-test/t/having.test
index 0f6be0b0ec6..f826feff5c0 100644
--- a/mysql-test/t/having.test
+++ b/mysql-test/t/having.test
@@ -743,3 +743,18 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2 HAVING c2 > 'a' ORDER BY c2 LIMIT 1;
DROP TABLE t1,t2;
--echo End of 10.0 tests
+
+--echo #
+--echo # MDEV-10716: Assertion `real_type() != FIELD_ITEM' failed in
+--echo # Item_ref::build_equal_items(THD*, COND_EQUAL*, bool, COND_EQUAL**)
+--echo #
+CREATE TABLE t1 (i INT);
+INSERT INTO t1 VALUES (1),(2);
+SELECT i, COUNT(*) FROM t1 GROUP BY i HAVING i<>0 AND 1;
+SELECT i-1 A, COUNT(*) FROM t1 GROUP BY i HAVING A AND 1;
+CREATE VIEW v1 as select i, i-1 as A from t1;
+SELECT A, COUNT(*) FROM v1 GROUP BY i HAVING A AND 1;
+DROP VIEW v1;
+DROP TABLE t1;
+
+--echo End of 10.1 tests
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index bd1e8b72157..a222335cf97 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -4507,7 +4507,8 @@ Item_cond::fix_fields(THD *thd, Item **ref)
was: <field>
become: <field> = 1
*/
- if (item->type() == FIELD_ITEM)
+ Item::Type type= item->type();
+ if (type == Item::FIELD_ITEM || type == Item::REF_ITEM)
{
Query_arena backup, *arena;
Item *new_item;