Commit 897810e9 authored by unknown's avatar unknown
Browse files

BUG#17138: Crash in stored procedure after fatal error that wasn't a real fatal error


sql/handler.h:
  Handle HA_ERR_FOUND_DUPP_KEY and HA_ERR_FOUND_DUPP_UNIQUE similarly
sql/item_sum.cc:
  fix
sql/sql_select.cc:
  fix
parent a70567c1
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -977,6 +977,9 @@ class handler :public Sql_alloc
    ignorable than others. E.g. the partition handler can get inserts
    into a range where there is no partition and this is an ignorable
    error.
    HA_ERR_FOUND_DUPP_UNIQUE is a special case in MyISAM that means the
    same thing as HA_ERR_FOUND_DUPP_KEY but can in some cases lead to
    a slightly different error message.
  */
#define HA_CHECK_DUPP_KEY 1
#define HA_CHECK_DUPP_UNIQUE 2
@@ -985,9 +988,8 @@ class handler :public Sql_alloc
  {
    if (!error ||
        ((flags & HA_CHECK_DUPP_KEY) &&
         error == HA_ERR_FOUND_DUPP_KEY) ||
         ((flags & HA_CHECK_DUPP_UNIQUE) &&
          error == HA_ERR_FOUND_DUPP_UNIQUE))
         (error == HA_ERR_FOUND_DUPP_KEY ||
          error == HA_ERR_FOUND_DUPP_UNIQUE)))
      return FALSE;
    return TRUE;
  }
+1 −2
Original line number Diff line number Diff line
@@ -2663,8 +2663,7 @@ bool Item_sum_count_distinct::add()
    return tree->unique_add(table->record[0] + table->s->null_bytes);
  }
  if ((error= table->file->ha_write_row(table->record[0])) &&
      error != HA_ERR_FOUND_DUPP_KEY &&
      error != HA_ERR_FOUND_DUPP_UNIQUE)
      table->file->cannot_ignore_error(error, HA_CHECK_DUPP))
    return TRUE;
  return FALSE;
}
+4 −5
Original line number Diff line number Diff line
@@ -9354,8 +9354,8 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
  /* copy row that filled HEAP table */
  if ((write_err=new_table.file->write_row(table->record[0])))
  {
    if (write_err != HA_ERR_FOUND_DUPP_KEY &&
	write_err != HA_ERR_FOUND_DUPP_UNIQUE || !ignore_last_dupp_key_error)
    if (new_table.file->cannot_ignore_error(write_err, HA_CHECK_DUPP) ||
	!ignore_last_dupp_key_error)
      goto err;
  }

@@ -10777,8 +10777,7 @@ end_write(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
      join->found_records++;
      if ((error=table->file->write_row(table->record[0])))
      {
	if (error == HA_ERR_FOUND_DUPP_KEY ||
	    error == HA_ERR_FOUND_DUPP_UNIQUE)
        if (table->file->cannot_ignore_error(error, HA_CHECK_DUPP))
	  goto end;
	if (create_myisam_from_heap(join->thd, table, &join->tmp_table_param,
				    error,1))