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

Removed init that crashed BDB

Fixed newly introduced bug in update
parent 1e56deab
...@@ -174,3 +174,4 @@ support-files/mysql-log-rotate ...@@ -174,3 +174,4 @@ support-files/mysql-log-rotate
support-files/mysql.server support-files/mysql.server
support-files/mysql.spec support-files/mysql.spec
tags tags
libmysql_r/conf_to_src
...@@ -325,9 +325,6 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -325,9 +325,6 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
file->extra(HA_EXTRA_CACHE); /* Quicker reads */ file->extra(HA_EXTRA_CACHE); /* Quicker reads */
} }
if (quick_select)
error=select->quick->init();
if (!error) if (!error)
for (;;) for (;;)
{ {
......
...@@ -1004,10 +1004,10 @@ int ha_berkeley::remove_key(DB_TXN *sub_trans, uint keynr, const byte *record, ...@@ -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 We will never come here with keynr = primary_key
*/ */
dbug_assert(keynr != primary_key && prim_key->data != key_buff2); dbug_assert(keynr != primary_key && prim_key->data != key_buff2);
DBC *cursor; DBC *tmp_cursor;
if (!(error=file->cursor(key_file[keynr], sub_trans, &cursor, 0))) 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 ? (keynr == primary_key ?
prim_key : prim_key :
create_key(&key, keynr, key_buff2, record)), 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, ...@@ -1015,9 +1015,9 @@ int ha_berkeley::remove_key(DB_TXN *sub_trans, uint keynr, const byte *record,
packed_record : prim_key), packed_record : prim_key),
DB_GET_BOTH))) DB_GET_BOTH)))
{ // This shouldn't happen { // 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) if (!error)
error=result; error=result;
} }
...@@ -1661,7 +1661,6 @@ longlong ha_berkeley::get_auto_increment() ...@@ -1661,7 +1661,6 @@ longlong ha_berkeley::get_auto_increment()
else else
{ {
DBT row,old_key; DBT row,old_key;
DBC *auto_cursor;
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
uint key_len; uint key_len;
KEY *key_info= &table->key_info[active_index]; KEY *key_info= &table->key_info[active_index];
...@@ -1673,13 +1672,11 @@ longlong ha_berkeley::get_auto_increment() ...@@ -1673,13 +1672,11 @@ longlong ha_berkeley::get_auto_increment()
/* Store for compare */ /* Store for compare */
memcpy(old_key.data=key_buff2, key_buff, (old_key.size=last_key.size)); memcpy(old_key.data=key_buff2, key_buff, (old_key.size=last_key.size));
error=1; error=1;
if (!(file->cursor(key_file[active_index], transaction, &auto_cursor, 0)))
{ {
/* Modify the compare so that we will find the next key */ /* Modify the compare so that we will find the next key */
key_info->handler.bdb_return_if_eq= 1; key_info->handler.bdb_return_if_eq= 1;
/* We lock the next key as the new key will probl. be on the same page */ /* 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, error=cursor->c_get(cursor, &last_key, &row, DB_SET_RANGE | DB_RMW);
DB_SET_RANGE | DB_RMW);
key_info->handler.bdb_return_if_eq= 0; key_info->handler.bdb_return_if_eq= 0;
if (!error || error == DB_NOTFOUND) if (!error || error == DB_NOTFOUND)
{ {
...@@ -1688,15 +1685,14 @@ longlong ha_berkeley::get_auto_increment() ...@@ -1688,15 +1685,14 @@ longlong ha_berkeley::get_auto_increment()
biggest key with the given prefix biggest key with the given prefix
*/ */
error=1; error=1;
if (!auto_cursor->c_get(auto_cursor, &last_key, &row, DB_PREV | DB_RMW) if (!cursor->c_get(cursor, &last_key, &row, DB_PREV | DB_RMW) &&
&& !berkeley_cmp_packed_key(key_file[active_index], &old_key, !berkeley_cmp_packed_key(key_file[active_index], &old_key,
&last_key)) &last_key))
{ {
error=0; // Found value error=0; // Found value
unpack_key(table->record[1], &last_key, active_index); unpack_key(table->record[1], &last_key, active_index);
} }
} }
auto_cursor->c_close(auto_cursor);
} }
} }
if (!error) if (!error)
...@@ -1712,7 +1708,6 @@ longlong ha_berkeley::get_auto_increment() ...@@ -1712,7 +1708,6 @@ longlong ha_berkeley::get_auto_increment()
Analyzing, checking, and optimizing tables Analyzing, checking, and optimizing tables
****************************************************************************/ ****************************************************************************/
static void print_msg(THD *thd, const char *table_name, const char *op_name, static void print_msg(THD *thd, const char *table_name, const char *op_name,
const char *msg_type, const char *fmt, ...) const char *msg_type, const char *fmt, ...)
{ {
......
...@@ -379,7 +379,7 @@ SQL_SELECT::~SQL_SELECT() ...@@ -379,7 +379,7 @@ SQL_SELECT::~SQL_SELECT()
close_cached_file(&file); 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) QUICK_SELECT::QUICK_SELECT(TABLE *table,uint key_nr,bool no_alloc)
:error(0),index(key_nr),max_used_key_length(0),head(table), :error(0),index(key_nr),max_used_key_length(0),head(table),
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include "sql_acl.h" #include "sql_acl.h"
#define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1));
/* Return 0 if row hasn't changed */ /* Return 0 if row hasn't changed */
static bool compare_record(TABLE *table) static bool compare_record(TABLE *table)
...@@ -76,15 +78,11 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List<Item> &fields, ...@@ -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->timestamp_field->query_id == thd->query_id)
table->time_stamp=0; 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->used_keys=table->keys_in_use;
table->quick_keys=0; table->quick_keys=0;
reg2 Item *item; ulong query_id=thd->query_id;
List_iterator<Item> it(fields); thd->query_id^= MAX_ULONG_BIT;
ulong query_id=thd->query_id-1;
while ((item=it++))
((Item_field*) item)->field->query_id=query_id;
if (setup_fields(thd,table_list,values,0,0) || if (setup_fields(thd,table_list,values,0,0) ||
setup_conds(thd,table_list,&conds)) setup_conds(thd,table_list,&conds))
{ {
...@@ -92,6 +90,13 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List<Item> &fields, ...@@ -92,6 +90,13 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List<Item> &fields,
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */
} }
old_used_keys=table->used_keys; 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 // Don't count on usage of 'only index' when calculating which key to use
table->used_keys=0; table->used_keys=0;
select=make_select(table,0,0,conds,&error); select=make_select(table,0,0,conds,&error);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment