Commit a578be33 authored by unknown's avatar unknown
Browse files

Fix bug#11709 View was ordered by wrong column.

When searching column to sort on, item was compared to field under view
column, but not the column itself. Because names of view column and underlaid
field may differ, it leads to possibly choosing wrong column for sorting on.

This patch makes Item_direct_view_ref::eq(Item *item,...) compare
item's name with it's own name proir to comparing to *ref item.


sql/item.cc:
  Fix bug #11709 View was ordered by wrong column
sql/item.h:
  Fix bug #11709 View was ordered by wrong column
mysql-test/t/view.test:
  Test case for bug #11709 View was ordered by wrong column.
mysql-test/r/view.result:
  Test case for bug #11709 View was ordered by wrong column.
parent 995abb0e
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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;
+9 −0
Original line number Diff line number Diff line
@@ -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;
+29 −0
Original line number Diff line number Diff line
@@ -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)
{
+1 −0
Original line number Diff line number Diff line
@@ -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;
};