Loading mysql-test/r/select.result +42 −0 Original line number Diff line number Diff line Loading @@ -3241,3 +3241,45 @@ f1 f2 Warnings: Warning 1292 Incorrect date value: '2005-09-3a' for column 'f2' at row 1 drop table t1; create table t1 (f1 int, f2 int); insert into t1 values (1, 30), (2, 20), (3, 10); create algorithm=merge view v1 as select f1, f2 from t1; create algorithm=merge view v2 (f2, f1) as select f1, f2 from t1; create algorithm=merge view v3 as select t1.f1 as f2, t1.f2 as f1 from t1; select t1.f1 as x1, f1 from t1 order by t1.f1; x1 f1 1 1 2 2 3 3 select v1.f1 as x1, f1 from v1 order by v1.f1; x1 f1 1 1 2 2 3 3 select v2.f1 as x1, f1 from v2 order by v2.f1; x1 f1 10 10 20 20 30 30 select v3.f1 as x1, f1 from v3 order by v3.f1; x1 f1 10 10 20 20 30 30 select f1, f2, v1.f1 as x1 from v1 order by v1.f1; f1 f2 x1 1 30 1 2 20 2 3 10 3 select f1, f2, v2.f1 as x1 from v2 order by v2.f1; f1 f2 x1 10 3 10 20 2 20 30 1 30 select f1, f2, v3.f1 as x1 from v3 order by v3.f1; f1 f2 x1 10 3 10 20 2 20 30 1 30 drop table t1; drop view v1, v2, v3; mysql-test/t/select.test +20 −0 Original line number Diff line number Diff line Loading @@ -2729,3 +2729,23 @@ select * from t1 where f2 >= '2005-09-3a'; select * from t1 where f2 <= '2005-09-31'; select * from t1 where f2 <= '2005-09-3a'; drop table t1; # # Bug ##14662 ORDER BY on column of a view, with an alias of the same # column causes ambiguous # create table t1 (f1 int, f2 int); insert into t1 values (1, 30), (2, 20), (3, 10); create algorithm=merge view v1 as select f1, f2 from t1; create algorithm=merge view v2 (f2, f1) as select f1, f2 from t1; create algorithm=merge view v3 as select t1.f1 as f2, t1.f2 as f1 from t1; select t1.f1 as x1, f1 from t1 order by t1.f1; select v1.f1 as x1, f1 from v1 order by v1.f1; select v2.f1 as x1, f1 from v2 order by v2.f1; select v3.f1 as x1, f1 from v3 order by v3.f1; select f1, f2, v1.f1 as x1 from v1 order by v1.f1; select f1, f2, v2.f1 as x1 from v2 order by v2.f1; select f1, f2, v3.f1 as x1 from v3 order by v3.f1; drop table t1; drop view v1, v2, v3; sql/item.cc +20 −11 Original line number Diff line number Diff line Loading @@ -4938,8 +4938,7 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) } /* Compare view field's name with item's name before call to referenced item's eq() Compare two view column references for equality. SYNOPSIS Item_direct_view_ref::eq() Loading @@ -4947,12 +4946,13 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) 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(). A view column reference is considered equal to another column reference if the second one is a view column and if both column references point to the same field. For views 'same field' means the same Item_field object in the view translation table, where the view translation table contains all result columns of the view. This definition ensures that view columns are resolved in the same manner as table columns. RETURN TRUE Referenced item is equal to given item Loading @@ -4962,9 +4962,18 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) 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); if (item->type() == REF_ITEM) { Item_ref *item_ref= (Item_ref*) item; if (item_ref->ref_type() == VIEW_REF) { Item *item_ref_ref= *(item_ref->ref); DBUG_ASSERT((*ref)->type() == FIELD_ITEM && (item_ref_ref->type() == FIELD_ITEM)); return (*ref == item_ref_ref); } } return FALSE; } void Item_null_helper::print(String *str) Loading Loading
mysql-test/r/select.result +42 −0 Original line number Diff line number Diff line Loading @@ -3241,3 +3241,45 @@ f1 f2 Warnings: Warning 1292 Incorrect date value: '2005-09-3a' for column 'f2' at row 1 drop table t1; create table t1 (f1 int, f2 int); insert into t1 values (1, 30), (2, 20), (3, 10); create algorithm=merge view v1 as select f1, f2 from t1; create algorithm=merge view v2 (f2, f1) as select f1, f2 from t1; create algorithm=merge view v3 as select t1.f1 as f2, t1.f2 as f1 from t1; select t1.f1 as x1, f1 from t1 order by t1.f1; x1 f1 1 1 2 2 3 3 select v1.f1 as x1, f1 from v1 order by v1.f1; x1 f1 1 1 2 2 3 3 select v2.f1 as x1, f1 from v2 order by v2.f1; x1 f1 10 10 20 20 30 30 select v3.f1 as x1, f1 from v3 order by v3.f1; x1 f1 10 10 20 20 30 30 select f1, f2, v1.f1 as x1 from v1 order by v1.f1; f1 f2 x1 1 30 1 2 20 2 3 10 3 select f1, f2, v2.f1 as x1 from v2 order by v2.f1; f1 f2 x1 10 3 10 20 2 20 30 1 30 select f1, f2, v3.f1 as x1 from v3 order by v3.f1; f1 f2 x1 10 3 10 20 2 20 30 1 30 drop table t1; drop view v1, v2, v3;
mysql-test/t/select.test +20 −0 Original line number Diff line number Diff line Loading @@ -2729,3 +2729,23 @@ select * from t1 where f2 >= '2005-09-3a'; select * from t1 where f2 <= '2005-09-31'; select * from t1 where f2 <= '2005-09-3a'; drop table t1; # # Bug ##14662 ORDER BY on column of a view, with an alias of the same # column causes ambiguous # create table t1 (f1 int, f2 int); insert into t1 values (1, 30), (2, 20), (3, 10); create algorithm=merge view v1 as select f1, f2 from t1; create algorithm=merge view v2 (f2, f1) as select f1, f2 from t1; create algorithm=merge view v3 as select t1.f1 as f2, t1.f2 as f1 from t1; select t1.f1 as x1, f1 from t1 order by t1.f1; select v1.f1 as x1, f1 from v1 order by v1.f1; select v2.f1 as x1, f1 from v2 order by v2.f1; select v3.f1 as x1, f1 from v3 order by v3.f1; select f1, f2, v1.f1 as x1 from v1 order by v1.f1; select f1, f2, v2.f1 as x1 from v2 order by v2.f1; select f1, f2, v3.f1 as x1 from v3 order by v3.f1; drop table t1; drop view v1, v2, v3;
sql/item.cc +20 −11 Original line number Diff line number Diff line Loading @@ -4938,8 +4938,7 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) } /* Compare view field's name with item's name before call to referenced item's eq() Compare two view column references for equality. SYNOPSIS Item_direct_view_ref::eq() Loading @@ -4947,12 +4946,13 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) 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(). A view column reference is considered equal to another column reference if the second one is a view column and if both column references point to the same field. For views 'same field' means the same Item_field object in the view translation table, where the view translation table contains all result columns of the view. This definition ensures that view columns are resolved in the same manner as table columns. RETURN TRUE Referenced item is equal to given item Loading @@ -4962,9 +4962,18 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference) 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); if (item->type() == REF_ITEM) { Item_ref *item_ref= (Item_ref*) item; if (item_ref->ref_type() == VIEW_REF) { Item *item_ref_ref= *(item_ref->ref); DBUG_ASSERT((*ref)->type() == FIELD_ITEM && (item_ref_ref->type() == FIELD_ITEM)); return (*ref == item_ref_ref); } } return FALSE; } void Item_null_helper::print(String *str) Loading