mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
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.
This commit is contained in:
@@ -1940,3 +1940,12 @@ s1 s2
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
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;
|
||||||
|
@@ -1778,3 +1778,12 @@ CALL p1();
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
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
sql/item.cc
29
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);
|
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)
|
void Item_null_helper::print(String *str)
|
||||||
{
|
{
|
||||||
|
@@ -1516,6 +1516,7 @@ public:
|
|||||||
:Item_direct_ref(thd, item) {}
|
:Item_direct_ref(thd, item) {}
|
||||||
|
|
||||||
bool fix_fields(THD *, Item **);
|
bool fix_fields(THD *, Item **);
|
||||||
|
bool eq(const Item *item, bool binary_cmp) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user