MySQL 9.1.0
Source Code Documentation
trx0rec.cc File Reference

Transaction undo log record. More...

#include "trx0rec.h"
#include <sys/types.h>
#include "fsp0fsp.h"
#include "mach0data.h"
#include "mtr0log.h"
#include "trx0undo.h"
#include "ut0dbg.h"
#include "dict0dict.h"
#include "fsp0sysspace.h"
#include "ha_prototypes.h"
#include "lob0index.h"
#include "lob0inf.h"
#include "lob0lob.h"
#include "que0que.h"
#include "read0read.h"
#include "row0ext.h"
#include "row0mysql.h"
#include "row0row.h"
#include "row0upd.h"
#include "trx0purge.h"
#include "trx0rseg.h"
#include "ut0mem.h"
#include "my_dbug.h"

Namespaces

namespace  dd
 The version of the current data dictionary table definitions.
 

Macros

#define ATTRIB_USED_ONLY_IN_DEBUG
 

Functions

static void trx_undof_page_add_undo_rec_log (page_t *undo_page, ulint old_free, ulint new_free, mtr_t *mtr)
 Writes the mtr log entry of the inserted undo log record on the undo log page. More...
 
const bytetrx_undo_parse_add_undo_rec (const byte *ptr, const byte *end_ptr, page_t *page)
 Parses a redo log record of adding an undo log record. More...
 
static ulint trx_undo_left (const page_t *page, const byte *ptr)
 Calculates the free space left for extending an undo log record. 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...
 
static ulint trx_undo_page_set_next_prev_and_add (page_t *undo_page, byte *ptr, mtr_t *mtr)
 Set the next and previous pointers in the undo page for the undo record that was written to ptr. 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...
 
static bytetrx_undo_log_v_idx (page_t *undo_page, const dict_table_t *table, ulint pos, byte *ptr, bool first_v_col)
 Write virtual column index info (index id and column position in index) to the undo log. More...
 
static const bytetrx_undo_read_v_idx_low (const dict_table_t *table, const byte *ptr, ulint *col_pos)
 Read virtual column index from undo log, and verify the column is still indexed, and return its position. 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...
 
static bool trx_undo_store_multi_value (page_t *undo_page, const dfield_t *vfield, byte **ptr)
 Store the multi-value column information for undo log. More...
 
static bool trx_undo_report_insert_virtual (page_t *undo_page, dict_table_t *table, const dtuple_t *row, byte **ptr)
 Reports in the undo log of an insert of virtual columns. More...
 
static ulint trx_undo_page_report_insert (page_t *undo_page, trx_t *trx, dict_index_t *index, const dtuple_t *clust_entry, mtr_t *mtr)
 Reports in the undo log of an insert of a clustered index record. More...
 
const 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...
 
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...
 
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...
 
const 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...
 
const bytetrx_undo_rec_get_row_ref (const byte *ptr, dict_index_t *index, dtuple_t **ref, mem_heap_t *heap)
 Builds a row reference from an undo log record. More...
 
static const bytetrx_undo_rec_skip_row_ref (const byte *ptr, const dict_index_t *index)
 Skips a row reference from an undo log record. More...
 
static bytetrx_undo_page_fetch_ext (trx_t *trx, dict_index_t *index, byte *ext_buf, ulint prefix_len, const page_size_t &page_size, const byte *field, bool is_sdi, ulint *len)
 Fetch a prefix of an externally stored column, for writing to the undo log of an update or delete marking of a clustered index record. More...
 
static bytetrx_undo_page_report_modify_ext_func (trx_t *trx, dict_index_t *index, byte *ptr, byte *ext_buf, ulint prefix_len, const page_size_t &page_size, const byte **field, ulint *len, bool is_sdi, spatial_status_t spatial_status)
 Writes to the undo log a prefix of an externally stored column. More...
 
static bytetrx_undo_page_report_modify_ext (trx_t *trx, dict_index_t *index, byte *ptr, byte *ext_buf, ulint prefix_len, const page_size_t &page_size, const byte **field, ulint *len, bool is_sdi, spatial_status_t spatial_status)
 
static void trx_undo_get_mbr_from_ext (trx_t *trx, dict_index_t *index, double *mbr, const page_size_t &page_size, const byte *field, ulint *len, const dd::Spatial_reference_system *srs)
 Get MBR from a Geometry column stored externally. More...
 
static const bytetrx_undo_read_blob_update (const byte *undo_ptr, upd_field_t *uf, lob::undo_vers_t *lob_undo)
 
static bytetrx_undo_report_blob_update (page_t *undo_page, dict_index_t *index, byte *undo_ptr, const byte *field, ulint flen, const upd_t *update, upd_field_t *fld, mtr_t *mtr)
 Write the partial update information about LOBs to the undo log record. More...
 
static ulint trx_undo_page_report_modify (page_t *undo_page, trx_t *trx, dict_index_t *index, const rec_t *rec, const ulint *offsets, const upd_t *update, ulint cmpl_info, const dtuple_t *row, mtr_t *mtr)
 Reports in the undo log of an update or delete marking of a clustered index record. More...
 
const 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...
 
const 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...
 
const 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...
 
static bool trx_undo_erase_page_end (page_t *undo_page, mtr_t *mtr)
 Erases the unused undo log page end. More...
 
const bytetrx_undo_parse_erase_page_end (const byte *ptr, const byte *end_ptr, page_t *page, mtr_t *mtr)
 Parses a redo log record of erasing of an undo page end. 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...
 
static trx_undo_rec_ttrx_undo_get_undo_rec_low (roll_ptr_t roll_ptr, mem_heap_t *heap, bool is_temp)
 Copies an undo record to heap. More...
 
static bool trx_undo_get_undo_rec (roll_ptr_t roll_ptr, trx_id_t trx_id, mem_heap_t *heap, bool is_temp, const table_name_t &name, trx_undo_rec_t **undo_rec)
 Copies an undo record to heap. More...
 
bool trx_undo_prev_version_build (const rec_t *index_rec, mtr_t *index_mtr, const rec_t *rec, const dict_index_t *const 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...
 
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...
 

Variables

static const ulint VIRTUAL_COL_UNDO_FORMAT_1 = 0xF1
 Virtual column undo log version. More...
 

Detailed Description

Transaction undo log record.

Created 3/26/1996 Heikki Tuuri

Macro Definition Documentation

◆ ATTRIB_USED_ONLY_IN_DEBUG

#define ATTRIB_USED_ONLY_IN_DEBUG

Function Documentation

◆ trx_undo_erase_page_end()

static bool trx_undo_erase_page_end ( page_t undo_page,
mtr_t mtr 
)
static

Erases the unused undo log page end.

Returns
true if the page contained something, false if it was empty
Parameters
undo_pagein/out: undo page whose end to erase
mtrin/out: mini-transaction

◆ trx_undo_get_mbr_from_ext()

static void trx_undo_get_mbr_from_ext ( trx_t trx,
dict_index_t index,
double *  mbr,
const page_size_t page_size,
const byte field,
ulint len,
const dd::Spatial_reference_system srs 
)
static

Get MBR from a Geometry column stored externally.

Parameters
[in]trxtransaction object
[in]indexthe clustered index object
[out]mbrMBR to fill
[in]page_sizetable pagesize
[in]fieldfield contain the geometry data
[in,out]lenlength of field, in bytes
[in]srsSpatial reference system of R-tree.

◆ trx_undo_get_undo_rec()

static bool trx_undo_get_undo_rec ( roll_ptr_t  roll_ptr,
trx_id_t  trx_id,
mem_heap_t heap,
bool  is_temp,
const table_name_t name,
trx_undo_rec_t **  undo_rec 
)
static

Copies an undo record to heap.

Parameters
[in]roll_ptrroll pointer to record
[in]trx_idid of the trx that generated the roll pointer: it points to an undo log of this transaction
[in]heapmemory heap where copied
[in]is_temptrue if temporary, no-redo rseg.
[in]nametable name
[out]undo_recown: copy of the record
Return values
trueif the undo log has been truncated and we cannot fetch the old version
falseif the undo log record is available NOTE: the caller must have latches on the clustered index page.

◆ trx_undo_get_undo_rec_low()

static trx_undo_rec_t * trx_undo_get_undo_rec_low ( roll_ptr_t  roll_ptr,
mem_heap_t heap,
bool  is_temp 
)
static

Copies an undo record to heap.

This function can be called if we know that the undo log record exists.

Returns
own: copy of the record
Parameters
roll_ptrin: roll pointer to record
heapin: memory heap where copied
is_tempin: true if temp undo rec.

◆ trx_undo_left()

static ulint trx_undo_left ( const page_t page,
const byte ptr 
)
inlinestatic

Calculates the free space left for extending an undo log record.

Returns
bytes left
Parameters
pagein: undo log page
ptrin: pointer to page

◆ trx_undo_log_v_idx()

static byte * trx_undo_log_v_idx ( page_t undo_page,
const dict_table_t table,
ulint  pos,
byte ptr,
bool  first_v_col 
)
static

Write virtual column index info (index id and column position in index) to the undo log.

Parameters
[in,out]undo_pageundo log page
[in]tablethe table
[in]posthe virtual column position
[in]ptrundo log record being written
[in]first_v_colwhether this is the first virtual column which could start with a version marker
Returns
new undo log pointer

◆ 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_page_fetch_ext()

static byte * trx_undo_page_fetch_ext ( trx_t trx,
dict_index_t index,
byte ext_buf,
ulint  prefix_len,
const page_size_t page_size,
const byte field,
bool  is_sdi,
ulint len 
)
static

Fetch a prefix of an externally stored column, for writing to the undo log of an update or delete marking of a clustered index record.

Parameters
[in]trxtransaction object
[in]indexthe clustered index object
[out]ext_bufbuffer to hold the prefix data and BLOB pointer
[in]prefix_lenprefix size to store in the undo log
[in]page_sizepage size
[in]fieldan externally stored column
[in]is_sditrue for SDI indexes
[in,out]leninput: length of field; output: used length of ext_buf
Returns
ext_buf

◆ trx_undo_page_report_insert()

static ulint trx_undo_page_report_insert ( page_t undo_page,
trx_t trx,
dict_index_t index,
const dtuple_t clust_entry,
mtr_t mtr 
)
static

Reports in the undo log of an insert of a clustered index record.

Returns
offset of the inserted entry on the page if succeed, 0 if fail
Parameters
undo_pagein: undo log page
trxin: transaction
indexin: clustered index
clust_entryin: index entry which will be inserted to the clustered index
mtrin: mtr

◆ trx_undo_page_report_modify()

static ulint trx_undo_page_report_modify ( page_t undo_page,
trx_t trx,
dict_index_t index,
const rec_t rec,
const ulint offsets,
const upd_t update,
ulint  cmpl_info,
const dtuple_t row,
mtr_t mtr 
)
static

Reports in the undo log of an update or delete marking of a clustered index record.

Returns
byte offset of the inserted undo log entry on the page if succeed, 0 if fail
Parameters
undo_pagein: undo log page
trxin: transaction
indexin: clustered index where update or delete marking is done
recin: clustered index record which has NOT yet been modified
offsetsin: rec_get_offsets(rec, index)
updatein: update vector which tells the columns to be updated; in the case of a delete, this should be set to NULL
cmpl_infoin: compiler info on secondary index updates
rowin: clustered index row contains virtual column info
mtrin: mtr

◆ trx_undo_page_report_modify_ext()

static byte * trx_undo_page_report_modify_ext ( trx_t trx,
dict_index_t index,
byte ptr,
byte ext_buf,
ulint  prefix_len,
const page_size_t page_size,
const byte **  field,
ulint len,
bool  is_sdi,
spatial_status_t  spatial_status 
)
inlinestatic

◆ trx_undo_page_report_modify_ext_func()

static byte * trx_undo_page_report_modify_ext_func ( trx_t trx,
dict_index_t index,
byte ptr,
byte ext_buf,
ulint  prefix_len,
const page_size_t page_size,
const byte **  field,
ulint len,
bool  is_sdi,
spatial_status_t  spatial_status 
)
static

Writes to the undo log a prefix of an externally stored column.

Parameters
[in]trxtransaction object
[in]indexthe clustered index object
[out]ptrundo log position, at least 15 bytes must be available
[out]ext_bufa buffer of DICT_MAX_FIELD_LEN_BY_FORMAT() size, or NULL when should not fetch a longer prefix
[in]prefix_lenprefix size to store in the undo log
[in]page_sizepage size
[in,out]fieldthe locally stored part of the externally stored column
[in,out]lenlength of field, in bytes
[in]is_sditrue for SDI indexes
[in]spatial_statuswhether the column is used by spatial index or regular index
Returns
undo log position

◆ trx_undo_page_set_next_prev_and_add()

static ulint trx_undo_page_set_next_prev_and_add ( page_t undo_page,
byte ptr,
mtr_t mtr 
)
static

Set the next and previous pointers in the undo page for the undo record that was written to ptr.

Update the first free value by the number of bytes written for this undo record.

Returns
offset of the inserted entry on the page if succeeded, 0 if fail

< offset within undo_page

< offset within undo_page

Parameters
undo_pagein/out: undo log page
ptrin: ptr up to where data has been written on this undo page.
mtrin: mtr

◆ trx_undo_parse_add_undo_rec()

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

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

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

◆ trx_undo_parse_erase_page_end()

const byte * trx_undo_parse_erase_page_end ( const byte ptr,
const 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_blob_update()

static const byte * trx_undo_read_blob_update ( const byte undo_ptr,
upd_field_t uf,
lob::undo_vers_t lob_undo 
)
static

◆ 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_read_v_idx_low()

static const byte * trx_undo_read_v_idx_low ( const dict_table_t table,
const byte ptr,
ulint col_pos 
)
static

Read virtual column index from undo log, and verify the column is still indexed, and return its position.

Parameters
[in]tablethe table
[in]ptrundo log pointer
[out]col_posthe column number or ULINT_UNDEFINED if the column is not indexed any more
Returns
remaining part of undo log record after reading these values

◆ trx_undo_rec_get_col_val()

const 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_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()

const 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
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()

const 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
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()

const byte * trx_undo_rec_get_row_ref ( const 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
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_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_rec_skip_row_ref()

static const byte * trx_undo_rec_skip_row_ref ( const byte ptr,
const dict_index_t index 
)
static

Skips a row reference from an undo log record.

Returns
pointer to remaining part of undo record
Parameters
ptrin: remaining part in update undo log record, at the start of the row reference
indexin: clustered index

◆ trx_undo_report_blob_update()

static byte * trx_undo_report_blob_update ( page_t undo_page,
dict_index_t index,
byte undo_ptr,
const byte field,
ulint  flen,
const upd_t update,
upd_field_t fld,
mtr_t mtr 
)
static

Write the partial update information about LOBs to the undo log record.

Parameters
[in]undo_pagethe undo page
[in]indexthe clustered index where LOBs are modified.
[in]undo_ptrthe location within undo page where next part of undo record is to be written.
[in]fieldthe LOB data
[in]flenlength of LOB data in bytes
[in]updatethe update vector containing partial update information on LOBs.
[in]fldthe field to which the LOB belongs.
[in]mtrthe mini-transaction context.
Returns
the undo record pointer where new data can be written.
nullptr when there is not enough space in undo page.

◆ trx_undo_report_insert_virtual()

static bool trx_undo_report_insert_virtual ( page_t undo_page,
dict_table_t table,
const dtuple_t row,
byte **  ptr 
)
static

Reports in the undo log of an insert of virtual columns.

Parameters
[in]undo_pageundo log page
[in]tablethe table
[in]rowdtuple contains the virtual columns
[in,out]ptrlog ptr
Returns
true if write goes well, false if out of space

◆ 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
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_store_multi_value()

static bool trx_undo_store_multi_value ( page_t undo_page,
const dfield_t vfield,
byte **  ptr 
)
static

Store the multi-value column information for undo log.

Parameters
[in,out]undo_pageundo page to store the information
[in]vfieldmulti-value field information
[in,out]ptrpointer where to store the information
Returns
true if stored successfully, false if space is not enough

◆ trx_undo_update_rec_get_sys_cols()

const 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
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()

const 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.

◆ trx_undof_page_add_undo_rec_log()

static void trx_undof_page_add_undo_rec_log ( page_t undo_page,
ulint  old_free,
ulint  new_free,
mtr_t mtr 
)
inlinestatic

Writes the mtr log entry of the inserted undo log record on the undo log page.

Parameters
undo_pagein: undo log page
old_freein: start offset of the inserted entry
new_freein: end offset of the entry
mtrin: mtr

Variable Documentation

◆ VIRTUAL_COL_UNDO_FORMAT_1

const ulint VIRTUAL_COL_UNDO_FORMAT_1 = 0xF1
static

Virtual column undo log version.

To distinguish it from a length value in 5.7.8 undo log, it starts with 0xF1