Loading mysql-test/t/select.test +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 sql/item.cc +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading sql/sql_lex.cc +2 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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() Loading @@ -1110,6 +1110,7 @@ void st_select_lex::init_select() select_limit= HA_POS_ERROR; offset_limit= 0; with_sum_func= 0; } /* Loading sql/sql_select.cc +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
mysql-test/t/select.test +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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
sql/item.cc +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading
sql/sql_lex.cc +2 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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() Loading @@ -1110,6 +1110,7 @@ void st_select_lex::init_select() select_limit= HA_POS_ERROR; offset_limit= 0; with_sum_func= 0; } /* Loading
sql/sql_select.cc +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading