Commit a46e8e23 authored by unknown's avatar unknown

select.test, sql_select.cc, sql_lex.cc, item.cc:

  Bug #7672 after merge fix


sql/item.cc:
  Bug #7672 after merge fix
sql/sql_lex.cc:
  Bug #7672 after merge fix
sql/sql_select.cc:
  Bug #7672 after merge fix
mysql-test/t/select.test:
  Bug #7672 after merge fix
parent b455f7c5
...@@ -2165,7 +2165,7 @@ select found_rows(); ...@@ -2165,7 +2165,7 @@ select found_rows();
DROP TABLE t1; DROP TABLE t1;
# End of 4.1 tests #
# Bug 7672 Unknown column error in order clause # Bug 7672 Unknown column error in order clause
# #
CREATE TABLE t1 (a INT, b INT); CREATE TABLE t1 (a INT, b INT);
...@@ -2174,3 +2174,4 @@ CREATE TABLE t1 (a INT, b INT); ...@@ -2174,3 +2174,4 @@ CREATE TABLE t1 (a INT, b INT);
SELECT a, b AS c FROM t1 ORDER BY c+1; SELECT a, b AS c FROM t1 ORDER BY c+1;
SELECT a, b AS c FROM t1 ORDER BY b+1; SELECT a, b AS c FROM t1 ORDER BY b+1;
drop table t1; drop table t1;
# End of 4.1 tests
...@@ -1760,10 +1760,15 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -1760,10 +1760,15 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
if ((tmp= find_field_in_tables(thd, this, tables, &where, 0)) == if ((tmp= find_field_in_tables(thd, this, tables, &where, 0)) ==
not_found_field) not_found_field)
{ {
if (thd->lex.select_lex.is_item_list_lookup) /* Look up in current select's item_list to find aliased fields */
if (thd->lex->current_select->is_item_list_lookup)
{ {
Item** res= find_item_in_list(this, thd->lex.select_lex.item_list); uint counter;
if (res && *res && (*res)->type() == Item::FIELD_ITEM) bool not_used;
Item** res= find_item_in_list(this, thd->lex->current_select->item_list,
&counter, REPORT_EXCEPT_NOT_FOUND,
&not_used);
if (res != not_found_item && (*res)->type() == Item::FIELD_ITEM)
{ {
set_field((*((Item_field**)res))->field); set_field((*((Item_field**)res))->field);
return 0; return 0;
......
...@@ -160,7 +160,6 @@ void lex_start(THD *thd, uchar *buf,uint length) ...@@ -160,7 +160,6 @@ void lex_start(THD *thd, uchar *buf,uint length)
lex->duplicates= DUP_ERROR; lex->duplicates= DUP_ERROR;
lex->ignore= 0; lex->ignore= 0;
lex->proc_list.first= 0; lex->proc_list.first= 0;
lex->select_lex.is_item_list_lookup= 0;
} }
void lex_end(LEX *lex) void lex_end(LEX *lex)
...@@ -1084,6 +1083,7 @@ void st_select_lex::init_query() ...@@ -1084,6 +1083,7 @@ void st_select_lex::init_query()
prep_where= 0; prep_where= 0;
subquery_in_having= explicit_limit= 0; subquery_in_having= explicit_limit= 0;
parsing_place= NO_MATTER; parsing_place= NO_MATTER;
is_item_list_lookup= 0;
} }
void st_select_lex::init_select() void st_select_lex::init_select()
...@@ -1110,6 +1110,7 @@ void st_select_lex::init_select() ...@@ -1110,6 +1110,7 @@ void st_select_lex::init_select()
select_limit= HA_POS_ERROR; select_limit= HA_POS_ERROR;
offset_limit= 0; offset_limit= 0;
with_sum_func= 0; with_sum_func= 0;
} }
/* /*
......
...@@ -8348,11 +8348,16 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, ...@@ -8348,11 +8348,16 @@ find_order_in_list(THD *thd, Item **ref_pointer_array,
'it' reassigned in if condition because fix_field can change it. 'it' reassigned in if condition because fix_field can change it.
*/ */
thd->lex->current_select->is_item_list_lookup= 1;
if (!it->fixed && if (!it->fixed &&
(it->fix_fields(thd, tables, order->item) || (it->fix_fields(thd, tables, order->item) ||
(it= *order->item)->check_cols(1) || (it= *order->item)->check_cols(1) ||
thd->is_fatal_error)) thd->is_fatal_error))
{
thd->lex->current_select->is_item_list_lookup= 0;
return 1; // Wrong field return 1; // Wrong field
}
thd->lex->current_select->is_item_list_lookup= 0;
uint el= all_fields.elements; uint el= all_fields.elements;
all_fields.push_front(it); // Add new field to field list all_fields.push_front(it); // Add new field to field list
ref_pointer_array[el]= it; ref_pointer_array[el]= it;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment