mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
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
This commit is contained in:
@@ -2165,7 +2165,7 @@ select found_rows();
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
#
|
||||
# Bug 7672 Unknown column error in order clause
|
||||
#
|
||||
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 b+1;
|
||||
drop table t1;
|
||||
# End of 4.1 tests
|
||||
|
11
sql/item.cc
11
sql/item.cc
@@ -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)) ==
|
||||
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);
|
||||
if (res && *res && (*res)->type() == Item::FIELD_ITEM)
|
||||
uint counter;
|
||||
bool not_used;
|
||||
Item** res= find_item_in_list(this, thd->lex->current_select->item_list,
|
||||
&counter, REPORT_EXCEPT_NOT_FOUND,
|
||||
¬_used);
|
||||
if (res != not_found_item && (*res)->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
set_field((*((Item_field**)res))->field);
|
||||
return 0;
|
||||
|
@@ -160,7 +160,6 @@ void lex_start(THD *thd, uchar *buf,uint length)
|
||||
lex->duplicates= DUP_ERROR;
|
||||
lex->ignore= 0;
|
||||
lex->proc_list.first= 0;
|
||||
lex->select_lex.is_item_list_lookup= 0;
|
||||
}
|
||||
|
||||
void lex_end(LEX *lex)
|
||||
@@ -1084,6 +1083,7 @@ void st_select_lex::init_query()
|
||||
prep_where= 0;
|
||||
subquery_in_having= explicit_limit= 0;
|
||||
parsing_place= NO_MATTER;
|
||||
is_item_list_lookup= 0;
|
||||
}
|
||||
|
||||
void st_select_lex::init_select()
|
||||
@@ -1110,6 +1110,7 @@ void st_select_lex::init_select()
|
||||
select_limit= HA_POS_ERROR;
|
||||
offset_limit= 0;
|
||||
with_sum_func= 0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -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.
|
||||
*/
|
||||
thd->lex->current_select->is_item_list_lookup= 1;
|
||||
if (!it->fixed &&
|
||||
(it->fix_fields(thd, tables, order->item) ||
|
||||
(it= *order->item)->check_cols(1) ||
|
||||
thd->is_fatal_error))
|
||||
{
|
||||
thd->lex->current_select->is_item_list_lookup= 0;
|
||||
return 1; // Wrong field
|
||||
}
|
||||
thd->lex->current_select->is_item_list_lookup= 0;
|
||||
uint el= all_fields.elements;
|
||||
all_fields.push_front(it); // Add new field to field list
|
||||
ref_pointer_array[el]= it;
|
||||
|
Reference in New Issue
Block a user