Commit 2b6776d3 authored by tim@white.box's avatar tim@white.box

Add test case for update/replace bug in bdb.

Remove unused argument to ha_berkeley::remove_key().
parent c61f04b0
...@@ -289,3 +289,5 @@ tags ...@@ -289,3 +289,5 @@ tags
tmp/* tmp/*
myisam/test1.MYD myisam/test1.MYD
myisam/test1.MYI myisam/test1.MYI
.gdbinit
.vimrc
...@@ -139,6 +139,8 @@ t1 1 level 1 level A 3 NULL NULL ...@@ -139,6 +139,8 @@ t1 1 level 1 level A 3 NULL NULL
gesuchnr benutzer_id gesuchnr benutzer_id
1 1 1 1
2 1 2 1
id x
1 2
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 optimize status OK test.t1 optimize status OK
a a
......
...@@ -65,6 +65,13 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1); ...@@ -65,6 +65,13 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1);
select * from t1; select * from t1;
drop table t1; drop table t1;
# test for bug in replace with secondary key
create table t1 (id int not null primary key, x int not null, key (x)) type=bdb;
insert into t1 (id, x) values (1, 1);
replace into t1 (id, x) values (1, 2);
select * from t1;
drop table t1;
# #
# test delete using hidden_primary_key # test delete using hidden_primary_key
# #
......
...@@ -888,7 +888,7 @@ int ha_berkeley::write_row(byte * record) ...@@ -888,7 +888,7 @@ int ha_berkeley::write_row(byte * record)
if (changed_keys & 1) if (changed_keys & 1)
{ {
if ((new_error = remove_key(sub_trans, keynr, record, if ((new_error = remove_key(sub_trans, keynr, record,
(DBT*) 0, &prim_key))) &prim_key)))
break; /* purecov: inspected */ break; /* purecov: inspected */
} }
} }
...@@ -970,7 +970,7 @@ int ha_berkeley::update_primary_key(DB_TXN *trans, bool primary_key_changed, ...@@ -970,7 +970,7 @@ int ha_berkeley::update_primary_key(DB_TXN *trans, bool primary_key_changed,
{ {
// Primary key changed or we are updating a key that can have duplicates. // Primary key changed or we are updating a key that can have duplicates.
// Delete the old row and add a new one // Delete the old row and add a new one
if (!(error=remove_key(trans, primary_key, old_row, (DBT *) 0, old_key))) if (!(error=remove_key(trans, primary_key, old_row, old_key)))
{ {
if (!(error=pack_row(&row, new_row, 0))) if (!(error=pack_row(&row, new_row, 0)))
{ {
...@@ -1034,7 +1034,7 @@ int ha_berkeley::restore_keys(DB_TXN *trans, key_map changed_keys, ...@@ -1034,7 +1034,7 @@ int ha_berkeley::restore_keys(DB_TXN *trans, key_map changed_keys,
if (changed_keys & 1) if (changed_keys & 1)
{ {
if (changed_keys != 1 && if (changed_keys != 1 &&
(error = remove_key(trans, keynr, new_row, (DBT*) 0, new_key))) (error = remove_key(trans, keynr, new_row, new_key)))
break; /* purecov: inspected */ break; /* purecov: inspected */
if ((error = key_file[keynr]->put(key_file[keynr], trans, if ((error = key_file[keynr]->put(key_file[keynr], trans,
create_key(&tmp_key, keynr, key_buff2, create_key(&tmp_key, keynr, key_buff2,
...@@ -1105,8 +1105,7 @@ int ha_berkeley::update_row(const byte * old_row, byte * new_row) ...@@ -1105,8 +1105,7 @@ int ha_berkeley::update_row(const byte * old_row, byte * new_row)
continue; continue;
if (key_cmp(keynr, old_row, new_row) || primary_key_changed) if (key_cmp(keynr, old_row, new_row) || primary_key_changed)
{ {
if ((error=remove_key(sub_trans, keynr, old_row, (DBT*) 0, if ((error=remove_key(sub_trans, keynr, old_row, &old_prim_key)))
&old_prim_key)))
{ {
if (using_ignore && /* purecov: inspected */ if (using_ignore && /* purecov: inspected */
(thd_options & OPTION_INTERNAL_SUBTRANSACTIONS)) (thd_options & OPTION_INTERNAL_SUBTRANSACTIONS))
...@@ -1172,11 +1171,9 @@ int ha_berkeley::update_row(const byte * old_row, byte * new_row) ...@@ -1172,11 +1171,9 @@ int ha_berkeley::update_row(const byte * old_row, byte * new_row)
Delete one key Delete one key
This uses key_buff2, when keynr != primary key, so it's important that This uses key_buff2, when keynr != primary key, so it's important that
a function that calls this doesn't use this buffer for anything else. a function that calls this doesn't use this buffer for anything else.
packed_record may be NULL if the key is unique
*/ */
int ha_berkeley::remove_key(DB_TXN *trans, uint keynr, const byte *record, int ha_berkeley::remove_key(DB_TXN *trans, uint keynr, const byte *record,
DBT *packed_record,
DBT *prim_key) DBT *prim_key)
{ {
int error; int error;
...@@ -1208,12 +1205,8 @@ int ha_berkeley::remove_key(DB_TXN *trans, uint keynr, const byte *record, ...@@ -1208,12 +1205,8 @@ int ha_berkeley::remove_key(DB_TXN *trans, uint keynr, const byte *record,
&tmp_cursor, 0))) &tmp_cursor, 0)))
{ {
if (!(error=tmp_cursor->c_get(tmp_cursor, if (!(error=tmp_cursor->c_get(tmp_cursor,
(keynr == primary_key ? create_key(&key, keynr, key_buff2, record),
prim_key : prim_key, DB_GET_BOTH | DB_RMW)))
create_key(&key, keynr, key_buff2, record)),
(keynr == primary_key ?
packed_record : prim_key),
DB_GET_BOTH | DB_RMW)))
{ // This shouldn't happen { // This shouldn't happen
error=tmp_cursor->c_del(tmp_cursor,0); error=tmp_cursor->c_del(tmp_cursor,0);
} }
...@@ -1236,7 +1229,7 @@ int ha_berkeley::remove_keys(DB_TXN *trans, const byte *record, ...@@ -1236,7 +1229,7 @@ int ha_berkeley::remove_keys(DB_TXN *trans, const byte *record,
{ {
if (keys & 1) if (keys & 1)
{ {
int new_error=remove_key(trans, keynr, record, new_record, prim_key); int new_error=remove_key(trans, keynr, record, prim_key);
if (new_error) if (new_error)
{ {
result=new_error; // Return last error /* purecov: inspected */ result=new_error; // Return last error /* purecov: inspected */
......
...@@ -69,8 +69,7 @@ class ha_berkeley: public handler ...@@ -69,8 +69,7 @@ class ha_berkeley: public handler
int key_length = MAX_KEY_LENGTH); int key_length = MAX_KEY_LENGTH);
DBT *pack_key(DBT *key, uint keynr, char *buff, const byte *key_ptr, DBT *pack_key(DBT *key, uint keynr, char *buff, const byte *key_ptr,
uint key_length); uint key_length);
int remove_key(DB_TXN *trans, uint keynr, const byte *record, int remove_key(DB_TXN *trans, uint keynr, const byte *record, DBT *prim_key);
DBT *packed_record, DBT *prim_key);
int remove_keys(DB_TXN *trans,const byte *record, DBT *new_record, int remove_keys(DB_TXN *trans,const byte *record, DBT *new_record,
DBT *prim_key, key_map keys); DBT *prim_key, key_map keys);
int restore_keys(DB_TXN *trans, key_map changed_keys, uint primary_key, int restore_keys(DB_TXN *trans, key_map changed_keys, uint primary_key,
......
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