mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 06:44:16 +01:00
8f07794024
and modify some functions to return const pointers. Add const qualifiers to local variable declarations or casts to remove the const qualifier in those places where write access is needed.
140 lines
3.8 KiB
Text
140 lines
3.8 KiB
Text
/******************************************************
|
|
Update of a row
|
|
|
|
(c) 1996 Innobase Oy
|
|
|
|
Created 12/27/1996 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "mtr0log.h"
|
|
#include "trx0trx.h"
|
|
#include "trx0undo.h"
|
|
#include "row0row.h"
|
|
#include "btr0sea.h"
|
|
#include "page0zip.h"
|
|
|
|
/*************************************************************************
|
|
Creates an update vector object. */
|
|
UNIV_INLINE
|
|
upd_t*
|
|
upd_create(
|
|
/*=======*/
|
|
/* out, own: update vector object */
|
|
ulint n, /* in: number of fields */
|
|
mem_heap_t* heap) /* in: heap from which memory allocated */
|
|
{
|
|
upd_t* update;
|
|
ulint i;
|
|
|
|
update = mem_heap_alloc(heap, sizeof(upd_t));
|
|
|
|
update->info_bits = 0;
|
|
update->n_fields = n;
|
|
update->fields = mem_heap_alloc(heap, sizeof(upd_field_t) * n);
|
|
|
|
for (i = 0; i < n; i++) {
|
|
update->fields[i].extern_storage = 0;
|
|
}
|
|
|
|
return(update);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Returns the number of fields in the update vector == number of columns
|
|
to be updated by an update vector. */
|
|
UNIV_INLINE
|
|
ulint
|
|
upd_get_n_fields(
|
|
/*=============*/
|
|
/* out: number of fields */
|
|
upd_t* update) /* in: update vector */
|
|
{
|
|
ut_ad(update);
|
|
|
|
return(update->n_fields);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Returns the nth field of an update vector. */
|
|
UNIV_INLINE
|
|
upd_field_t*
|
|
upd_get_nth_field(
|
|
/*==============*/
|
|
/* out: update vector field */
|
|
upd_t* update, /* in: update vector */
|
|
ulint n) /* in: field position in update vector */
|
|
{
|
|
ut_ad(update);
|
|
ut_ad(n < update->n_fields);
|
|
|
|
return(update->fields + n);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Sets an index field number to be updated by an update vector field. */
|
|
UNIV_INLINE
|
|
void
|
|
upd_field_set_field_no(
|
|
/*===================*/
|
|
upd_field_t* upd_field, /* in: update vector field */
|
|
ulint field_no, /* in: field number in a clustered
|
|
index */
|
|
dict_index_t* index, /* in: index */
|
|
trx_t* trx) /* in: transaction */
|
|
{
|
|
upd_field->field_no = field_no;
|
|
|
|
if (UNIV_UNLIKELY(field_no >= dict_index_get_n_fields(index))) {
|
|
fprintf(stderr,
|
|
"InnoDB: Error: trying to access field %lu in ",
|
|
(ulong) field_no);
|
|
dict_index_name_print(stderr, trx, index);
|
|
fprintf(stderr, "\n"
|
|
"InnoDB: but index only has %lu fields\n",
|
|
(ulong) dict_index_get_n_fields(index));
|
|
}
|
|
|
|
dict_col_copy_type(dict_index_get_nth_col(index, field_no),
|
|
(dtype_t*) dfield_get_type(&(upd_field->new_val)));
|
|
}
|
|
|
|
/*************************************************************************
|
|
Updates the trx id and roll ptr field in a clustered index record when
|
|
a row is updated or marked deleted. */
|
|
UNIV_INLINE
|
|
void
|
|
row_upd_rec_sys_fields(
|
|
/*===================*/
|
|
rec_t* rec, /* in/out: record */
|
|
page_zip_des_t* page_zip,/* in/out: compressed page whose
|
|
uncompressed part will be updated, or NULL */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets,/* in: rec_get_offsets(rec, index) */
|
|
trx_t* trx, /* in: transaction */
|
|
dulint roll_ptr)/* in: roll ptr of the undo log record */
|
|
{
|
|
ut_ad(dict_index_is_clust(index));
|
|
ut_ad(rec_offs_validate(rec, index, offsets));
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
ut_ad(!buf_block_align(rec)->is_hashed
|
|
|| rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
if (UNIV_LIKELY_NULL(page_zip)) {
|
|
ulint pos = dict_index_get_sys_col_pos(index, DATA_TRX_ID);
|
|
page_zip_write_trx_id_and_roll_ptr(page_zip, rec, offsets,
|
|
pos, trx->id, roll_ptr);
|
|
} else {
|
|
ulint offset = index->trx_id_offset;
|
|
|
|
if (!offset) {
|
|
offset = row_get_trx_id_offset(rec, index, offsets);
|
|
}
|
|
|
|
#if DATA_TRX_ID + 1 != DATA_ROLL_PTR
|
|
# error "DATA_TRX_ID + 1 != DATA_ROLL_PTR"
|
|
#endif
|
|
trx_write_trx_id(rec + offset, trx->id);
|
|
trx_write_roll_ptr(rec + offset + DATA_TRX_ID_LEN, roll_ptr);
|
|
}
|
|
}
|