diff --git a/sql/item.cc b/sql/item.cc index d62ac38e943..766d40f209e 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2837,7 +2837,8 @@ bool Item_field::fix_fields(THD *thd, Item **reference) reference, IGNORE_EXCEPT_NON_UNIQUE, !any_privileges && - context->check_privileges)) == + context->check_privileges, + TRUE)) == not_found_field) { /* @@ -2880,7 +2881,8 @@ bool Item_field::fix_fields(THD *thd, Item **reference) reference, IGNORE_EXCEPT_NON_UNIQUE, outer_context-> - check_privileges)) != + check_privileges, + TRUE)) != not_found_field) { if (from_field) @@ -2953,7 +2955,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference) find_field_in_tables(thd, this, context->table_list, reference, REPORT_ALL_ERRORS, !any_privileges && - context->check_privileges); + context->check_privileges, TRUE); } goto error; } @@ -4102,7 +4104,8 @@ bool Item_ref::fix_fields(THD *thd, Item **reference) outer_context->table_list, reference, IGNORE_EXCEPT_NON_UNIQUE, - outer_context->check_privileges); + outer_context->check_privileges, + TRUE); if (! from_field) goto error; if (from_field == view_ref_found) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index ecd32ef35af..9a3684c3865 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -758,7 +758,8 @@ enum find_item_error_report_type {REPORT_ALL_ERRORS, REPORT_EXCEPT_NOT_FOUND, Field *find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, Item **ref, find_item_error_report_type report_error, - bool check_privileges); + bool check_privileges, + bool register_tree_change); Field * find_field_in_table(THD *thd, TABLE_LIST *table_list, const char *name, const char *item_name, diff --git a/sql/sp.cc b/sql/sp.cc index f376c9b5ed2..456248db66b 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -687,8 +687,9 @@ db_show_routine_status(THD *thd, int type, const char *wild) "mysql", "proc", used_field->field_name); if (!field || - !(used_field->field= find_field_in_tables(thd, field, &tables, - 0, REPORT_ALL_ERRORS, 1))) + !(used_field->field= find_field_in_tables(thd, field, &tables, + 0, REPORT_ALL_ERRORS, 1, + TRUE))) { res= SP_INTERNAL_ERROR; goto err_case1; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 7cc0c4fecf1..ef3ccf794b0 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2581,19 +2581,21 @@ Field *find_field_in_real_table(THD *thd, TABLE *table, SYNOPSIS find_field_in_tables() - thd Pointer to current thread structure - item Field item that should be found - tables Tables to be searched for item - ref If 'item' is resolved to a view field, ref is set to - point to the found view field - report_error Degree of error reporting: - - IGNORE_ERRORS then do not report any error - - IGNORE_EXCEPT_NON_UNIQUE report only non-unique - fields, suppress all other errors - - REPORT_EXCEPT_NON_UNIQUE report all other errors - except when non-unique fields were found - - REPORT_ALL_ERRORS - check_privileges need to check privileges + thd Pointer to current thread structure + item Field item that should be found + tables Tables to be searched for item + ref If 'item' is resolved to a view field, ref is set to + point to the found view field + report_error Degree of error reporting: + - IGNORE_ERRORS then do not report any error + - IGNORE_EXCEPT_NON_UNIQUE report only non-unique + fields, suppress all other errors + - REPORT_EXCEPT_NON_UNIQUE report all other errors + except when non-unique fields were found + - REPORT_ALL_ERRORS + check_privileges need to check privileges + register_tree_change TRUE if ref is not stack variable and we + need register changes in item tree RETURN VALUES 0 If error: the found field is not unique, or there are @@ -2609,7 +2611,7 @@ Field *find_field_in_real_table(THD *thd, TABLE *table, Field * find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, Item **ref, find_item_error_report_type report_error, - bool check_privileges) + bool check_privileges, bool register_tree_change) { Field *found=0; const char *db=item->db_name; @@ -2651,7 +2653,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, (test(table->grant.want_privilege) && check_privileges), 1, &(item->cached_field_index), - TRUE); + register_tree_change); } if (found) { @@ -2707,7 +2709,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, (test(tables->grant.want_privilege) && check_privileges), 1, &(item->cached_field_index), - TRUE); + register_tree_change); if (find) { item->cached_table= tables; @@ -2775,7 +2777,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, check_privileges), allow_rowid, &(item->cached_field_index), - TRUE); + register_tree_change); if (field) { if (field == WRONG_GRANT) diff --git a/sql/sql_help.cc b/sql/sql_help.cc index 3f151934e55..6780beec258 100644 --- a/sql/sql_help.cc +++ b/sql/sql_help.cc @@ -91,7 +91,8 @@ static bool init_fields(THD *thd, TABLE_LIST *tables, "mysql", find_fields->table_name, find_fields->field_name); if (!(find_fields->field= find_field_in_tables(thd, field, tables, - 0, REPORT_ALL_ERRORS, 1))) + 0, REPORT_ALL_ERRORS, 1, + TRUE))) DBUG_RETURN(1); } DBUG_RETURN(0); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d41b503575f..d7ef692e8c3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -11890,7 +11890,8 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, order_item_type == Item::REF_ITEM) { from_field= find_field_in_tables(thd, (Item_ident*) order_item, tables, - &view_ref, IGNORE_ERRORS, TRUE); + &view_ref, IGNORE_ERRORS, TRUE, + FALSE); if(!from_field) from_field= (Field*) not_found_field; }