Commit 6d9bc9c8 authored by unknown's avatar unknown
Browse files

do not register changes of stack variable


sql/item.cc:
  new argument of find_field_in_tables()
sql/mysql_priv.h:
  new argument of find_field_in_tables()
sql/sp.cc:
  new argument of find_field_in_tables()
sql/sql_base.cc:
  new argument of find_field_in_tables()
sql/sql_help.cc:
  new argument of find_field_in_tables()
parent 7e8c3865
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -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)
+2 −1
Original line number Diff line number Diff line
@@ -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,
+3 −2
Original line number Diff line number Diff line
@@ -688,7 +688,8 @@ db_show_routine_status(THD *thd, int type, const char *wild)
					used_field->field_name);
      if (!field ||
          !(used_field->field= find_field_in_tables(thd, field, &tables,
						    0, REPORT_ALL_ERRORS, 1)))
						    0, REPORT_ALL_ERRORS, 1,
                                                    TRUE)))
      {
	res= SP_INTERNAL_ERROR;
	goto err_case1;
+19 −17
Original line number Diff line number Diff line
@@ -2594,6 +2594,8 @@ Field *find_field_in_real_table(THD *thd, TABLE *table,
                            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)
+2 −1
Original line number Diff line number Diff line
@@ -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);
Loading