diff options
author | monty@mysql.com <> | 2004-10-29 19:26:52 +0300 |
---|---|---|
committer | monty@mysql.com <> | 2004-10-29 19:26:52 +0300 |
commit | afbe601302fc59c498437321b296ed6c8d360564 (patch) | |
tree | 23bcc9a71fe7237887a111b158e30f5a6bb665d3 /innobase/trx/trx0rec.c | |
parent | 67456bb970cc949ceb5779b230592e455843c35c (diff) | |
parent | 541883f9d89a8d38affba60bf9506289a6232da1 (diff) | |
download | mariadb-git-afbe601302fc59c498437321b296ed6c8d360564.tar.gz |
merge with 4.1
Diffstat (limited to 'innobase/trx/trx0rec.c')
-rw-r--r-- | innobase/trx/trx0rec.c | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/innobase/trx/trx0rec.c b/innobase/trx/trx0rec.c index 382f723a05c..fe429d1cc62 100644 --- a/innobase/trx/trx0rec.c +++ b/innobase/trx/trx0rec.c @@ -770,6 +770,7 @@ trx_undo_update_rec_get_update( dulint trx_id, /* in: transaction id from this undo record */ dulint roll_ptr,/* in: roll pointer from this undo record */ ulint info_bits,/* in: info bits from this undo record */ + trx_t* trx, /* in: transaction */ mem_heap_t* heap, /* in: memory heap from which the memory needed is allocated */ upd_t** upd) /* out, own: update vector */ @@ -803,7 +804,7 @@ trx_undo_update_rec_get_update( upd_field_set_field_no(upd_field, dict_index_get_sys_col_pos(index, DATA_TRX_ID), - index); + index, trx); dfield_set_data(&(upd_field->new_val), buf, DATA_TRX_ID_LEN); upd_field = upd_get_nth_field(update, n_fields + 1); @@ -812,7 +813,7 @@ trx_undo_update_rec_get_update( upd_field_set_field_no(upd_field, dict_index_get_sys_col_pos(index, DATA_ROLL_PTR), - index); + index, trx); dfield_set_data(&(upd_field->new_val), buf, DATA_ROLL_PTR_LEN); /* Store then the updated ordinary columns to the update vector */ @@ -824,13 +825,13 @@ trx_undo_update_rec_get_update( if (field_no >= dict_index_get_n_fields(index)) { fprintf(stderr, "InnoDB: Error: trying to access update undo rec field %lu in ", (ulong) field_no); - dict_index_name_print(stderr, index); + dict_index_name_print(stderr, trx, index); fprintf(stderr, "\n" "InnoDB: but index has only %lu fields\n" "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n" "InnoDB: Run also CHECK TABLE ", (ulong) dict_index_get_n_fields(index)); - ut_print_name(stderr, index->table_name); + ut_print_name(stderr, trx, index->table_name); fprintf(stderr, "\n" "InnoDB: n_fields = %lu, i = %lu, ptr %p\n", (ulong) n_fields, (ulong) i, ptr); @@ -841,7 +842,7 @@ trx_undo_update_rec_get_update( upd_field = upd_get_nth_field(update, i); - upd_field_set_field_no(upd_field, field_no, index); + upd_field_set_field_no(upd_field, field_no, index, trx); if (len != UNIV_SQL_NULL && len >= UNIV_EXTERN_STORAGE_FIELD) { @@ -1257,7 +1258,7 @@ trx_undo_prev_version_build( ibool dummy_extern; byte* buf; ulint err; - ulint i; + #ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); #endif /* UNIV_SYNC_DEBUG */ @@ -1266,12 +1267,11 @@ trx_undo_prev_version_build( mtr_memo_contains(index_mtr, buf_block_align(index_rec), MTR_MEMO_PAGE_X_FIX)); if (!(index->type & DICT_CLUSTERED)) { - fputs("InnoDB: Error: trying to access" - " update undo rec for non-clustered ", stderr); - dict_index_name_print(stderr, index); - fputs("\n" -"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n" - "InnoDB: index record ", stderr); + fprintf(stderr, "InnoDB: Error: trying to access" + " update undo rec for non-clustered index %s\n" + "InnoDB: Submit a detailed bug report to" + " http://bugs.mysql.com\n" + "InnoDB: index record ", index->name); rec_print(stderr, index_rec); fputs("\n" "InnoDB: record version ", stderr); @@ -1309,32 +1309,29 @@ trx_undo_prev_version_build( ptr = trx_undo_rec_skip_row_ref(ptr, index); ptr = trx_undo_update_rec_get_update(ptr, index, type, trx_id, - roll_ptr, info_bits, heap, &update); + roll_ptr, info_bits, NULL, heap, &update); if (ut_dulint_cmp(table_id, index->table->id) != 0) { ptr = NULL; - fputs("InnoDB: Error: trying to access" - " update undo rec for table ", stderr); - ut_print_name(stderr, index->table_name); - fputs("\n" + fprintf(stderr, +"InnoDB: Error: trying to access update undo rec for table %s\n" "InnoDB: but the table id in the undo record is wrong\n" "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n" -"InnoDB: Run also CHECK TABLE ", stderr); - ut_print_name(stderr, index->table_name); - putc('\n', stderr); +"InnoDB: Run also CHECK TABLE %s\n", + index->table_name, index->table_name); } if (ptr == NULL) { /* The record was corrupted, return an error; these printfs should catch an elusive bug in row_vers_old_has_index_entry */ - fputs("InnoDB: ", stderr); - dict_index_name_print(stderr, index); - fprintf(stderr, ", n_uniq %lu\n" + fprintf(stderr, + "InnoDB: table %s, index %s, n_uniq %lu\n" "InnoDB: undo rec address %p, type %lu cmpl_info %lu\n" "InnoDB: undo rec table id %lu %lu, index table id %lu %lu\n" "InnoDB: dump of 150 bytes in undo rec: ", + index->table_name, index->name, (ulong) dict_index_get_n_unique(index), undo_rec, (ulong) type, (ulong) cmpl_info, (ulong) ut_dulint_get_high(table_id), @@ -1366,7 +1363,18 @@ trx_undo_prev_version_build( } if (row_upd_changes_field_size_or_external(rec, index, update)) { - + ulint* ext_vect; + ulint n_ext_vect; + + /* We have to set the appropriate extern storage bits in the + old version of the record: the extern bits in rec for those + fields that update does NOT update, as well as the the bits for + those fields that update updates to become externally stored + fields. Store the info to ext_vect: */ + + ext_vect = mem_alloc(sizeof(ulint) * rec_get_n_fields(rec)); + n_ext_vect = btr_push_update_extern_fields(ext_vect, rec, + update); entry = row_rec_to_index_entry(ROW_COPY_DATA, index, rec, heap); row_upd_index_replace_new_col_vals(entry, index, update, heap); @@ -1374,6 +1382,11 @@ trx_undo_prev_version_build( buf = mem_heap_alloc(heap, rec_get_converted_size(entry)); *old_vers = rec_convert_dtuple_to_rec(buf, entry); + + /* Now set the extern bits in the old version of the record */ + rec_set_field_extern_bits(*old_vers, ext_vect, n_ext_vect, + NULL); + mem_free(ext_vect); } else { buf = mem_heap_alloc(heap, rec_get_size(rec)); @@ -1382,15 +1395,5 @@ trx_undo_prev_version_build( row_upd_rec_in_place(*old_vers, update); } - for (i = 0; i < upd_get_n_fields(update); i++) { - - if (upd_get_nth_field(update, i)->extern_storage) { - - rec_set_nth_field_extern_bit(*old_vers, - upd_get_nth_field(update, i)->field_no, - TRUE, NULL); - } - } - return(DB_SUCCESS); } |