Commit b4974dac authored by monty@donna.mysql.com's avatar monty@donna.mysql.com
Browse files

Removed init that crashed BDB

Fixed newly introduced bug in update
parent 1e56deab
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -174,3 +174,4 @@ support-files/mysql-log-rotate
support-files/mysql.server
support-files/mysql.spec
tags
libmysql_r/conf_to_src
+0 −3
Original line number Diff line number Diff line
@@ -325,9 +325,6 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
    file->extra(HA_EXTRA_CACHE);	/* Quicker reads */
  }

  if (quick_select)
    error=select->quick->init();

  if (!error)
  for (;;)
  {
+9 −14
Original line number Diff line number Diff line
@@ -1004,10 +1004,10 @@ int ha_berkeley::remove_key(DB_TXN *sub_trans, uint keynr, const byte *record,
      We will never come here with keynr = primary_key
    */
    dbug_assert(keynr != primary_key && prim_key->data != key_buff2);
    DBC *cursor;
    if (!(error=file->cursor(key_file[keynr], sub_trans, &cursor, 0)))
    DBC *tmp_cursor;
    if (!(error=file->cursor(key_file[keynr], sub_trans, &tmp_cursor, 0)))
    {
      if (!(error=cursor->c_get(cursor,
      if (!(error=cursor->c_get(tmp_cursor,
			       (keynr == primary_key ?
				prim_key :
				create_key(&key, keynr, key_buff2, record)),
@@ -1015,9 +1015,9 @@ int ha_berkeley::remove_key(DB_TXN *sub_trans, uint keynr, const byte *record,
				packed_record :  prim_key),
				DB_GET_BOTH)))
      {					// This shouldn't happen
	error=cursor->c_del(cursor,0);
	error=tmp_cursor->c_del(tmp_cursor,0);
      }
      int result=cursor->c_close(cursor);
      int result=tmp_cursor->c_close(tmp_cursor);
      if (!error)
	error=result;
    }
@@ -1661,7 +1661,6 @@ longlong ha_berkeley::get_auto_increment()
  else
  {
    DBT row,old_key;
    DBC *auto_cursor;
    bzero((char*) &row,sizeof(row));
    uint key_len;
    KEY *key_info= &table->key_info[active_index];
@@ -1673,13 +1672,11 @@ longlong ha_berkeley::get_auto_increment()
    /* Store for compare */
    memcpy(old_key.data=key_buff2, key_buff, (old_key.size=last_key.size));
    error=1;
    if (!(file->cursor(key_file[active_index], transaction, &auto_cursor, 0)))
    {
      /* Modify the compare so that we will find the next key */
      key_info->handler.bdb_return_if_eq= 1;
      /* We lock the next key as the new key will probl. be on the same page */
      error=auto_cursor->c_get(auto_cursor, &last_key, &row,
			       DB_SET_RANGE | DB_RMW);
      error=cursor->c_get(cursor, &last_key, &row, DB_SET_RANGE | DB_RMW);
      key_info->handler.bdb_return_if_eq= 0;
      if (!error || error == DB_NOTFOUND)
      {
@@ -1688,15 +1685,14 @@ longlong ha_berkeley::get_auto_increment()
	  biggest key with the given prefix
	  */
	error=1;
	if (!auto_cursor->c_get(auto_cursor, &last_key, &row, DB_PREV | DB_RMW)
	    && !berkeley_cmp_packed_key(key_file[active_index], &old_key,
	if (!cursor->c_get(cursor, &last_key, &row, DB_PREV | DB_RMW) &&
	    !berkeley_cmp_packed_key(key_file[active_index], &old_key,
				     &last_key))
	{
	  error=0;				// Found value
	  unpack_key(table->record[1], &last_key, active_index);
	}
      }
      auto_cursor->c_close(auto_cursor);
    }
  }
  if (!error)
@@ -1712,7 +1708,6 @@ longlong ha_berkeley::get_auto_increment()
	 Analyzing, checking, and optimizing tables
****************************************************************************/


static void print_msg(THD *thd, const char *table_name, const char *op_name,
		      const char *msg_type, const char *fmt, ...)
{
+1 −1
Original line number Diff line number Diff line
@@ -379,7 +379,7 @@ SQL_SELECT::~SQL_SELECT()
  close_cached_file(&file);
}

#undef index					// Fix or Unixware 7
#undef index					// Fix for Unixware 7

QUICK_SELECT::QUICK_SELECT(TABLE *table,uint key_nr,bool no_alloc)
  :error(0),index(key_nr),max_used_key_length(0),head(table),
+12 −7
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include "mysql_priv.h"
#include "sql_acl.h"

#define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1));

/* Return 0 if row hasn't changed */

static bool compare_record(TABLE *table)
@@ -76,15 +78,11 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List<Item> &fields,
      table->timestamp_field->query_id == thd->query_id)
    table->time_stamp=0;

  /* Reset the query_id string so that ->used_keys is based on the WHERE */

  /* Change query_id so that ->used_keys is based on the WHERE */
  table->used_keys=table->keys_in_use;
  table->quick_keys=0;
  reg2 Item *item;
  List_iterator<Item> it(fields);  
  ulong query_id=thd->query_id-1;
  while ((item=it++))
    ((Item_field*) item)->field->query_id=query_id;
  ulong query_id=thd->query_id;
  thd->query_id^= MAX_ULONG_BIT;
  if (setup_fields(thd,table_list,values,0,0) ||
      setup_conds(thd,table_list,&conds))
  {
@@ -92,6 +90,13 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List<Item> &fields,
    DBUG_RETURN(-1);				/* purecov: inspected */
  }
  old_used_keys=table->used_keys;
  /* Restore query_id for compare_record */
  thd->query_id=query_id;
  List_iterator<Item> it(fields);  
  Item *item;
  while ((item=it++))
    ((Item_field*) item)->field->query_id=query_id;

  // Don't count on usage of 'only index' when calculating which key to use
  table->used_keys=0;
  select=make_select(table,0,0,conds,&error);