diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 7bcfaf8bdc3ed1ef7484ac45f606e91b26e784f5..bd4e94bd1b32ef0f7f910d26ab458a557ef0c47c 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1940,3 +1940,12 @@ s1 s2 DROP PROCEDURE p1; DROP VIEW v1; DROP TABLE t1; +create table t1 (f1 int, f2 int); +create view v1 as select f1 as f3, f2 as f1 from t1; +insert into t1 values (1,3),(2,1),(3,2); +select * from v1 order by f1; +f3 f1 +2 1 +3 2 +1 3 +drop table t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 6b6b3d8a00f3bfbba4074595c545ece8b18b9670..6b4113c0b052c3e716f74964cae63bd942182684 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1778,3 +1778,12 @@ CALL p1(); DROP PROCEDURE p1; DROP VIEW v1; DROP TABLE t1; + +# +# Test for bug #11709 View was ordered by wrong column +# +create table t1 (f1 int, f2 int); +create view v1 as select f1 as f3, f2 as f1 from t1; +insert into t1 values (1,3),(2,1),(3,2); +select * from v1 order by f1; +drop table t1; diff --git a/sql/item.cc b/sql/item.cc index e53c1ebf73450d2c83dc45f76cfc437e8fd556ba..08395df4b734b3bf174d6f9b9a9123c5d0811b86 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -4499,6 +4499,35 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) return Item_direct_ref::fix_fields(thd, reference); } +/* + Compare view field's name with item's name before call to referenced + item's eq() + + SYNOPSIS + Item_direct_view_ref::eq() + item item to compare with + binary_cmp make binary comparison + + DESCRIPTION + Consider queries: + create view v1 as select t1.f1 as f2, t1.f2 as f1 from t1; + select * from v1 order by f1; + In order to choose right field for sorting we need to compare + given item's name (f1) to view field's name prior to calling + referenced item's eq(). + + RETURN + TRUE Referenced item is equal to given item + FALSE otherwise +*/ + + +bool Item_direct_view_ref::eq(const Item *item, bool binary_cmp) const +{ + Item *it= ((Item *) item)->real_item(); + return (!it->name || !my_strcasecmp(system_charset_info, it->name, + field_name)) && ref && (*ref)->real_item()->eq(it, binary_cmp); +} void Item_null_helper::print(String *str) { diff --git a/sql/item.h b/sql/item.h index 560f1124fb4fcf848a43985c0e149fa7511c1bdb..f748286b2f7e45cff54256901bc7552cf1684d4d 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1516,6 +1516,7 @@ class Item_direct_view_ref :public Item_direct_ref :Item_direct_ref(thd, item) {} bool fix_fields(THD *, Item **); + bool eq(const Item *item, bool binary_cmp) const; };