MySQL 8.0.40
Source Code Documentation
trx0rec.h File Reference

Transaction undo log record. More...

#include "univ.i"
#include "data0data.h"
#include "dict0types.h"
#include "lob0undo.h"
#include "mtr0mtr.h"
#include "page0types.h"
#include "rem0types.h"
#include "row0log.h"
#include "row0types.h"
#include "trx0types.h"
#include "que0types.h"
#include "trx0rec.ic"

Go to the source code of this file.

Classes

struct  type_cmpl_t
 The type and compilation info flag in the undo record for update. More...
 

Functions

static trx_undo_rec_ttrx_undo_rec_copy (const page_t *undo_page, uint32_t undo_offset, mem_heap_t *heap)
 Copies the undo record to the heap. More...
 
static ulint trx_undo_rec_get_type (const trx_undo_rec_t *undo_rec)
 Reads the undo log record type. More...
 
static ulint trx_undo_rec_get_cmpl_info (const trx_undo_rec_t *undo_rec)
 Reads from an undo log record the record compiler info. More...
 
static bool trx_undo_rec_get_extern_storage (const trx_undo_rec_t *undo_rec)
 Returns true if an undo log record contains an extern storage field. More...
 
static undo_no_t trx_undo_rec_get_undo_no (const trx_undo_rec_t *undo_rec)
 Reads the undo log record number. More...
 
table_id_t trx_undo_rec_get_table_id (const trx_undo_rec_t *undo_rec)
 Reads from an undo log record the table ID. More...
 
bytetrx_undo_rec_get_row_ref (byte *ptr, dict_index_t *index, dtuple_t **ref, mem_heap_t *heap)
 Builds a row reference from an undo log record. More...
 
bytetrx_undo_update_rec_get_sys_cols (const byte *ptr, trx_id_t *trx_id, roll_ptr_t *roll_ptr, ulint *info_bits)
 Reads from an undo log update record the system field values of the old version. More...
 
bytetrx_undo_update_rec_get_update (const byte *ptr, const dict_index_t *index, ulint type, trx_id_t trx_id, roll_ptr_t roll_ptr, ulint info_bits, mem_heap_t *heap, upd_t **upd, lob::undo_vers_t *lob_undo, type_cmpl_t &type_cmpl)
 Builds an update vector based on a remaining part of an undo log record. More...
 
bytetrx_undo_rec_get_partial_row (const byte *ptr, dict_index_t *index, dtuple_t **row, bool ignore_prefix, mem_heap_t *heap)
 Builds a partial row from an update undo log record, for purge. More...
 
dberr_t trx_undo_report_row_operation (ulint flags, ulint op_type, que_thr_t *thr, dict_index_t *index, const dtuple_t *clust_entry, const upd_t *update, ulint cmpl_info, const rec_t *rec, const ulint *offsets, roll_ptr_t *roll_ptr)
 Writes information to an undo log about an insert, update, or a delete marking of a clustered index record. More...
 
bool trx_undo_prev_version_build (const rec_t *index_rec, mtr_t *index_mtr, const rec_t *rec, const dict_index_t *index, ulint *offsets, mem_heap_t *heap, rec_t **old_vers, mem_heap_t *v_heap, const dtuple_t **vrow, ulint v_status, lob::undo_vers_t *lob_undo)
 Build a previous version of a clustered index record. More...
 
bytetrx_undo_parse_add_undo_rec (byte *ptr, byte *end_ptr, page_t *page)
 Parses a redo log record of adding an undo log record. More...
 
bytetrx_undo_parse_erase_page_end (byte *ptr, byte *end_ptr, page_t *page, mtr_t *mtr)
 Parses a redo log record of erasing of an undo page end. More...
 
bytetrx_undo_rec_get_col_val (const byte *ptr, const byte **field, ulint *len, ulint *orig_len)
 Read from an undo log record a non-virtual column value. More...
 
void trx_undo_read_v_cols (const dict_table_t *table, const byte *ptr, const dtuple_t *row, bool in_purge, bool online, const ulint *col_map, mem_heap_t *heap)
 Read virtual column value from undo log. More...
 
const bytetrx_undo_read_v_idx (const dict_table_t *table, const byte *ptr, bool first_v_col, bool *is_undo_log, ulint *field_no)
 Read virtual column index from undo log or online log if the log contains such info, and in the undo log case, verify the column is still indexed, and output its position. More...
 
bytetrx_undo_rec_get_pars (trx_undo_rec_t *undo_rec, ulint *type, ulint *cmpl_info, bool *updated_extern, undo_no_t *undo_no, table_id_t *table_id, type_cmpl_t &type_cmpl)
 Reads from an undo log record the general parameters. More...
 
size_t trx_undo_max_free_space ()
 Get the max free space of undo log by assuming it's a fresh new page and the free space doesn't count for the undo log header too. More...
 
bool trx_undo_rec_is_multi_value (const byte *undo_rec)
 Decide if the following undo log record is a multi-value virtual column. More...
 
const bytetrx_undo_rec_get_multi_value (const byte *ptr, dfield_t *field, mem_heap_t *heap)
 Read from an undo log record of a multi-value virtual column. More...
 

Variables

constexpr uint32_t TRX_UNDO_PREV_IN_PURGE = 0x1
 status bit used for trx_undo_prev_version_build() More...
 
constexpr uint32_t TRX_UNDO_GET_OLD_V_VALUE = 0x2
 This tells trx_undo_prev_version_build() to fetch the old value in the undo log (which is the after image for an update) More...
 
constexpr uint32_t TRX_UNDO_INSERT_REC = 11
 fresh insert into clustered index More...
 
constexpr uint32_t TRX_UNDO_UPD_EXIST_REC = 12
 update of a non-delete-marked record More...
 
constexpr uint32_t TRX_UNDO_UPD_DEL_REC = 13
 update of a delete marked record to a not delete marked record; also the fields of the record can change More...
 
constexpr uint32_t TRX_UNDO_DEL_MARK_REC = 14
 
constexpr uint32_t TRX_UNDO_CMPL_INFO_MULT = 16
 compilation info is multiplied by this and ORed to the type above More...
 
constexpr uint32_t TRX_UNDO_MODIFY_BLOB = 64
 If this bit is set in type_cmpl, then the undo log record has support for partial update of BLOBs. More...
 
constexpr uint32_t TRX_UNDO_UPD_EXTERN = 128
 
constexpr uint32_t TRX_UNDO_INSERT_OP = 1
 Operation type flags used in trx_undo_report_row_operation. More...
 
constexpr uint32_t TRX_UNDO_MODIFY_OP = 2
 

Detailed Description

Transaction undo log record.

Created 3/26/1996 Heikki Tuuri

Function Documentation

◆ trx_undo_max_free_space()

size_t trx_undo_max_free_space ( )

Get the max free space of undo log by assuming it's a fresh new page and the free space doesn't count for the undo log header too.

◆ trx_undo_parse_add_undo_rec()

byte * trx_undo_parse_add_undo_rec ( byte ptr,
byte end_ptr,
page_t page 
)

Parses a redo log record of adding an undo log record.

Returns
end of log record or NULL in: page or NULL
end of log record or NULL
Parameters
ptrin: buffer
end_ptrin: buffer end
pagein: page or NULL

◆ trx_undo_parse_erase_page_end()

byte * trx_undo_parse_erase_page_end ( byte ptr,
byte end_ptr,
page_t page,
mtr_t mtr 
)

Parses a redo log record of erasing of an undo page end.

Parameters
[in,out]ptrBuffer.
[in,out]end_ptrBuffer end.
[in,out]pagePage or nullptr.
[in,out]mtrMTR or nullptr.
Returns
end of log record or nullptr

◆ trx_undo_prev_version_build()

bool trx_undo_prev_version_build ( const rec_t index_rec,
mtr_t index_mtr,
const rec_t rec,
const dict_index_t index,
ulint offsets,
mem_heap_t heap,
rec_t **  old_vers,
mem_heap_t v_heap,
const dtuple_t **  vrow,
ulint  v_status,
lob::undo_vers_t lob_undo 
)

Build a previous version of a clustered index record.

The caller must hold a latch on the index page of the clustered index record. If the vrow passed to this function is not null, then this function will store information about virtual columns from the requested version in vrow, unless the change did not affect any secondary index nor ordering field of clustered index (the change has UPD_NODE_NO_ORD_CHANGE flag) in which case the requested information can not be reconstructed from undo log, and the caller may assume that the (virtual) columns of secondary index have the same values they have in the more recent version (the one rec comes from). Equivalently, if the vrow is not returned, it is either because it was not requested, or not available due to UPD_NODE_NO_ORD_CHANGE. Obviously vrow is also not set in case rec is the oldest version in history, in which case we also set old_vers to NULL.

Parameters
[in]index_recclustered index record in the index tree
[in]index_mtrmtr which contains the latch to index_rec page and purge_view
[in]recversion of a clustered index record
[in]indexclustered index
[in,out]offsetsrec_get_offsets(rec, index)
[in]heapmemory heap from which the memory needed is allocated
[out]old_versprevious version, or NULL if rec is the first inserted version, or if history data has been deleted
[in]v_heapmemory heap used to create vrow dtuple if it is not yet created. This heap diffs from "heap" above in that it could be prebuilt->old_vers_heap for selection
[out]vrowvirtual column info, if any
[in]v_statusstatus determine if it is going into this function by purge thread or not. And if we read "after image" of undo log has been rebuilt
[in]lob_undoLOB undo information.
Return values
trueif previous version was built, or if it was an insert or the table has been rebuilt
falseif the previous version is earlier than purge_view, or being purged, which means that it may have been removed

◆ trx_undo_read_v_cols()

void trx_undo_read_v_cols ( const dict_table_t table,
const byte ptr,
const dtuple_t row,
bool  in_purge,
bool  online,
const ulint col_map,
mem_heap_t heap 
)

Read virtual column value from undo log.

Parameters
[in]tablethe table
[in]ptrundo log pointer
[in,out]rowthe dtuple to fill
[in]in_purgecalled by purge thread
[in]onlinetrue if this is from online DDL log
[in]col_maponline rebuild column map
[in,out]heapmemory heap to keep value when necessary

◆ trx_undo_read_v_idx()

const byte * trx_undo_read_v_idx ( const dict_table_t table,
const byte ptr,
bool  first_v_col,
bool *  is_undo_log,
ulint field_no 
)

Read virtual column index from undo log or online log if the log contains such info, and in the undo log case, verify the column is still indexed, and output its position.

Parameters
[in]tablethe table
[in]ptrundo log pointer
[in]first_v_colif this is the first virtual column, which has the version marker
[in,out]is_undo_logthis function is used to parse both undo log, and online log for virtual columns. So check to see if this is undo log. When first_v_col is true, is_undo_log is output, when first_v_col is false, is_undo_log is input
[in,out]field_nothe column number
Returns
remaining part of undo log record after reading these values

◆ trx_undo_rec_copy()

static trx_undo_rec_t * trx_undo_rec_copy ( const page_t undo_page,
uint32_t  undo_offset,
mem_heap_t heap 
)
inlinestatic

Copies the undo record to the heap.

Parameters
[in]undo_pageUndo Page
[in]undo_offsetoffset of the undo record in the page
[in]heapheap where copied
Returns
copy of undo log record

◆ trx_undo_rec_get_cmpl_info()

static ulint trx_undo_rec_get_cmpl_info ( const trx_undo_rec_t undo_rec)
inlinestatic

Reads from an undo log record the record compiler info.

Returns
compiler info in: undo log record

◆ trx_undo_rec_get_col_val()

byte * trx_undo_rec_get_col_val ( const byte ptr,
const byte **  field,
ulint len,
ulint orig_len 
)

Read from an undo log record a non-virtual column value.

Parameters
[in,out]ptrpointer to remaining part of the undo record
[in,out]fieldstored field
[in,out]lenlength of the field, or UNIV_SQL_NULL
[in,out]orig_lenoriginal length of the locally stored part of an externally stored column, or 0
Returns
remaining part of undo log record after reading these values

◆ trx_undo_rec_get_extern_storage()

static bool trx_undo_rec_get_extern_storage ( const trx_undo_rec_t undo_rec)
inlinestatic

Returns true if an undo log record contains an extern storage field.

Returns
true if extern in: undo log record

◆ trx_undo_rec_get_multi_value()

const byte * trx_undo_rec_get_multi_value ( const byte ptr,
dfield_t field,
mem_heap_t heap 
)

Read from an undo log record of a multi-value virtual column.

Parameters
[in]ptrpointer to remaining part of the undo record
[in,out]fieldstored field, nullptr if the col is no longer indexed or existing, in the latter case, this function will only skip the log
[in,out]heapmemory heap
Returns
remaining part of undo log record after reading these values

◆ trx_undo_rec_get_pars()

byte * trx_undo_rec_get_pars ( trx_undo_rec_t undo_rec,
ulint type,
ulint cmpl_info,
bool *  updated_extern,
undo_no_t undo_no,
table_id_t table_id,
type_cmpl_t type_cmpl 
)

Reads from an undo log record the general parameters.

Returns
remaining part of undo log record after reading these values out: type compilation info.
remaining part of undo log record after reading these values
Parameters
undo_recin: undo log record
typeout: undo record type: TRX_UNDO_INSERT_REC, ...
cmpl_infoout: compiler info, relevant only for update type records
updated_externout: true if we updated an externally stored fild
undo_noout: undo log record number
table_idout: table id
type_cmplout: type compilation info

◆ trx_undo_rec_get_partial_row()

byte * trx_undo_rec_get_partial_row ( const byte ptr,
dict_index_t index,
dtuple_t **  row,
bool  ignore_prefix,
mem_heap_t heap 
)

Builds a partial row from an update undo log record, for purge.

It contains the columns which occur as ordering in any index of the table. Any missing columns are indicated by col->mtype == DATA_MISSING.

Returns
pointer to remaining part of undo record in: memory heap from which the memory needed is allocated

It contains the columns which occur as ordering in any index of the table. Any missing columns are indicated by col->mtype == DATA_MISSING.

Returns
pointer to remaining part of undo record
Parameters
ptrin: remaining part in update undo log record of a suitable type, at the start of the stored index columns; NOTE that this copy of the undo log record must be preserved as long as the partial row is used, as we do NOT copy the data in the record!
indexin: clustered index
rowout, own: partial row
ignore_prefixin: flag to indicate if we expect blob prefixes in undo. Used only in the assertion.
heapin: memory heap from which the memory needed is allocated

◆ trx_undo_rec_get_row_ref()

byte * trx_undo_rec_get_row_ref ( byte ptr,
dict_index_t index,
dtuple_t **  ref,
mem_heap_t heap 
)

Builds a row reference from an undo log record.

Returns
pointer to remaining part of undo record in: memory heap from which the memory needed is allocated
pointer to remaining part of undo record
Parameters
ptrin: remaining part of a copy of an undo log record, at the start of the row reference; NOTE that this copy of the undo log record must be preserved as long as the row reference is used, as we do NOT copy the data in the record!
indexin: clustered index
refout, own: row reference
heapin: memory heap from which the memory needed is allocated

◆ trx_undo_rec_get_table_id()

table_id_t trx_undo_rec_get_table_id ( const trx_undo_rec_t undo_rec)

Reads from an undo log record the table ID.

Parameters
[in]undo_recUndo log record
Returns
the table ID

◆ trx_undo_rec_get_type()

static ulint trx_undo_rec_get_type ( const trx_undo_rec_t undo_rec)
inlinestatic

Reads the undo log record type.

Returns
record type in: undo log record

◆ trx_undo_rec_get_undo_no()

static undo_no_t trx_undo_rec_get_undo_no ( const trx_undo_rec_t undo_rec)
inlinestatic

Reads the undo log record number.

Returns
undo no in: undo log record

◆ trx_undo_rec_is_multi_value()

bool trx_undo_rec_is_multi_value ( const byte undo_rec)

Decide if the following undo log record is a multi-value virtual column.

Parameters
[in]undo_recundo log record
Returns
true if this is a multi-value virtual column log, otherwise false

◆ trx_undo_report_row_operation()

dberr_t trx_undo_report_row_operation ( ulint  flags,
ulint  op_type,
que_thr_t thr,
dict_index_t index,
const dtuple_t clust_entry,
const upd_t update,
ulint  cmpl_info,
const rec_t rec,
const ulint offsets,
roll_ptr_t roll_ptr 
)

Writes information to an undo log about an insert, update, or a delete marking of a clustered index record.

This information is used in a rollback of the transaction and in consistent reads that must look to the history of this transaction.

Returns
DB_SUCCESS or error code out: rollback pointer to the inserted undo log record, 0 if BTR_NO_UNDO_LOG flag was specified

This information is used in a rollback of the transaction and in consistent reads that must look to the history of this transaction.

Returns
DB_SUCCESS or error code
Parameters
flagsin: if BTR_NO_UNDO_LOG_FLAG bit is set, does nothing
op_typein: TRX_UNDO_INSERT_OP or TRX_UNDO_MODIFY_OP
thrin: query thread
indexin: clustered index
clust_entryin: in the case of an insert, index entry to insert into the clustered index, otherwise NULL
updatein: in the case of an update, the update vector, otherwise NULL
cmpl_infoin: compiler info on secondary index updates
recin: in case of an update or delete marking, the record in the clustered index, otherwise NULL
offsetsin: rec_get_offsets(rec)
roll_ptrout: rollback pointer to the inserted undo log record, 0 if BTR_NO_UNDO_LOG flag was specified

◆ trx_undo_update_rec_get_sys_cols()

byte * trx_undo_update_rec_get_sys_cols ( const byte ptr,
trx_id_t trx_id,
roll_ptr_t roll_ptr,
ulint info_bits 
)

Reads from an undo log update record the system field values of the old version.

Returns
remaining part of undo log record after reading these values out: info bits state
remaining part of undo log record after reading these values
Parameters
ptrin: remaining part of undo log record after reading general parameters
trx_idout: trx id
roll_ptrout: roll ptr
info_bitsout: info bits state

◆ trx_undo_update_rec_get_update()

byte * trx_undo_update_rec_get_update ( const byte ptr,
const dict_index_t index,
ulint  type,
trx_id_t  trx_id,
roll_ptr_t  roll_ptr,
ulint  info_bits,
mem_heap_t heap,
upd_t **  upd,
lob::undo_vers_t lob_undo,
type_cmpl_t type_cmpl 
)

Builds an update vector based on a remaining part of an undo log record.

Parameters
[in]ptrRemaining part in update undo log record, after reading the row reference. NOTE that this copy of the undo log record must be preserved as long as the update vector is used, as we do NOT copy the data in the record!
[in]indexClustered index.
[in]typeTRX_UNDO_UPD_EXIST_REC, TRX_UNDO_UPD_DEL_REC, or TRX_UNDO_DEL_MARK_REC; in the last case, only trx id and roll ptr fields are added to the update vector.
[in]trx_idTransaction id from this undo record.
[in]roll_ptrRoll pointer from this undo record.
[in]info_bitsInfo bits from this undo record.
[in]heapMemory heap from which the memory needed is allocated.
[out]updUpdate vector.
[out]lob_undoLOB undo information.
[out]type_cmplType compilation info.
Returns
remaining part of the record, NULL if an error detected, which means that the record is corrupted.

Variable Documentation

◆ TRX_UNDO_CMPL_INFO_MULT

constexpr uint32_t TRX_UNDO_CMPL_INFO_MULT = 16
constexpr

compilation info is multiplied by this and ORed to the type above

◆ TRX_UNDO_DEL_MARK_REC

constexpr uint32_t TRX_UNDO_DEL_MARK_REC = 14
constexpr

◆ TRX_UNDO_GET_OLD_V_VALUE

constexpr uint32_t TRX_UNDO_GET_OLD_V_VALUE = 0x2
constexpr

This tells trx_undo_prev_version_build() to fetch the old value in the undo log (which is the after image for an update)

◆ TRX_UNDO_INSERT_OP

constexpr uint32_t TRX_UNDO_INSERT_OP = 1
constexpr

Operation type flags used in trx_undo_report_row_operation.

◆ TRX_UNDO_INSERT_REC

constexpr uint32_t TRX_UNDO_INSERT_REC = 11
constexpr

fresh insert into clustered index

◆ TRX_UNDO_MODIFY_BLOB

constexpr uint32_t TRX_UNDO_MODIFY_BLOB = 64
constexpr

If this bit is set in type_cmpl, then the undo log record has support for partial update of BLOBs.

Also to make the undo log format extensible, introducing a new flag next to the type_cmpl flag.

◆ TRX_UNDO_MODIFY_OP

constexpr uint32_t TRX_UNDO_MODIFY_OP = 2
constexpr

◆ TRX_UNDO_PREV_IN_PURGE

constexpr uint32_t TRX_UNDO_PREV_IN_PURGE = 0x1
constexpr

status bit used for trx_undo_prev_version_build()

TRX_UNDO_PREV_IN_PURGE tells trx_undo_prev_version_build() that it is being called purge view and we would like to get the purge record even it is in the purge view (in normal case, it will return without fetching the purge record

◆ TRX_UNDO_UPD_DEL_REC

constexpr uint32_t TRX_UNDO_UPD_DEL_REC = 13
constexpr

update of a delete marked record to a not delete marked record; also the fields of the record can change

◆ TRX_UNDO_UPD_EXIST_REC

constexpr uint32_t TRX_UNDO_UPD_EXIST_REC = 12
constexpr

update of a non-delete-marked record

◆ TRX_UNDO_UPD_EXTERN

constexpr uint32_t TRX_UNDO_UPD_EXTERN = 128
constexpr