InnoDB Plugin
1.0
|
#include "univ.i"
#include "data0data.h"
#include "row0types.h"
#include "btr0types.h"
#include "dict0types.h"
#include "trx0types.h"
#include "btr0pcur.h"
#include "que0types.h"
#include "pars0types.h"
#include "row0upd.ic"
Go to the source code of this file.
Data Structures | |
struct | upd_field_t |
struct | upd_t |
struct | upd_node_t |
Macros | |
#define | row_upd_changes_ord_field_binary(index, update, thr, row, ext) row_upd_changes_ord_field_binary_func(index,update,thr,row,ext) |
#define | UPD_NODE_MAGIC_N 1579975 |
#define | UPD_NODE_SET_IX_LOCK |
#define | UPD_NODE_UPDATE_CLUSTERED |
#define | UPD_NODE_INSERT_CLUSTERED |
#define | UPD_NODE_INSERT_BLOB |
#define | UPD_NODE_UPDATE_ALL_SEC |
#define | UPD_NODE_UPDATE_SOME_SEC |
#define | UPD_NODE_NO_ORD_CHANGE |
#define | UPD_NODE_NO_SIZE_CHANGE |
Functions | |
UNIV_INLINE upd_t * | upd_create (ulint n, mem_heap_t *heap) |
UNIV_INLINE ulint | upd_get_n_fields (const upd_t *update) |
UNIV_INLINE upd_field_t * | upd_get_nth_field (const upd_t *update, ulint n) |
UNIV_INLINE void | upd_field_set_field_no (upd_field_t *upd_field, ulint field_no, dict_index_t *index, trx_t *trx) |
UNIV_INLINE const upd_field_t * | upd_get_field_by_field_no (const upd_t *update, ulint no)) |
UNIV_INTERN byte * | row_upd_write_sys_vals_to_log (dict_index_t *index, trx_id_t trx_id, roll_ptr_t roll_ptr, byte *log_ptr, mtr_t *mtr) |
UNIV_INLINE void | row_upd_rec_sys_fields (rec_t *rec, page_zip_des_t *page_zip, dict_index_t *index, const ulint *offsets, const trx_t *trx, roll_ptr_t roll_ptr) |
UNIV_INTERN void | row_upd_index_entry_sys_field (dtuple_t *entry, dict_index_t *index, ulint type, ib_uint64_t val) |
UNIV_INTERN upd_node_t * | upd_node_create (mem_heap_t *heap) |
UNIV_INTERN void | row_upd_index_write_log (const upd_t *update, byte *log_ptr, mtr_t *mtr) |
UNIV_INTERN ibool | row_upd_changes_field_size_or_external (dict_index_t *index, const ulint *offsets, const upd_t *update) |
UNIV_INTERN bool | row_upd_changes_disowned_external (const upd_t *update)) |
UNIV_INTERN void | row_upd_rec_in_place (rec_t *rec, dict_index_t *index, const ulint *offsets, const upd_t *update, page_zip_des_t *page_zip) |
UNIV_INTERN upd_t * | row_upd_build_sec_rec_difference_binary (const rec_t *rec, dict_index_t *index, const ulint *offsets, const dtuple_t *entry, mem_heap_t *heap)) |
UNIV_INTERN const upd_t * | row_upd_build_difference_binary (dict_index_t *index, const dtuple_t *entry, const rec_t *rec, const ulint *offsets, bool no_sys, trx_t *trx, mem_heap_t *heap) |
UNIV_INTERN void | row_upd_index_replace_new_col_vals_index_pos (dtuple_t *entry, dict_index_t *index, const upd_t *update, ibool order_only, mem_heap_t *heap)) |
UNIV_INTERN void | row_upd_index_replace_new_col_vals (dtuple_t *entry, dict_index_t *index, const upd_t *update, mem_heap_t *heap)) |
UNIV_INTERN void | row_upd_replace (dtuple_t *row, row_ext_t **ext, const dict_index_t *index, const upd_t *update, mem_heap_t *heap) |
UNIV_INTERN ibool | row_upd_changes_ord_field_binary_func (dict_index_t *index, const upd_t *update, const que_thr_t *thr, const dtuple_t *row, const row_ext_t *ext) |
UNIV_INTERN ulint | row_upd_changes_fts_column (dict_table_t *table, upd_field_t *upd_field) |
UNIV_INTERN bool | row_upd_changes_doc_id (dict_table_t *table, upd_field_t *upd_field)) |
UNIV_INTERN ibool | row_upd_changes_some_index_ord_field_binary (const dict_table_t *table, const upd_t *update) |
UNIV_INTERN que_thr_t * | row_upd_step (que_thr_t *thr) |
UNIV_INTERN byte * | row_upd_parse_sys_vals (byte *ptr, byte *end_ptr, ulint *pos, trx_id_t *trx_id, roll_ptr_t *roll_ptr) |
UNIV_INTERN void | row_upd_rec_sys_fields_in_recovery (rec_t *rec, page_zip_des_t *page_zip, const ulint *offsets, ulint pos, trx_id_t trx_id, roll_ptr_t roll_ptr) |
UNIV_INTERN byte * | row_upd_index_parse (byte *ptr, byte *end_ptr, mem_heap_t *heap, upd_t **update_out) |
Variables | |
UNIV_INTERN const upd_t | warn_unused_result |
Update of a row
Created 12/27/1996 Heikki Tuuri
#define UPD_NODE_INSERT_BLOB |
#define UPD_NODE_INSERT_CLUSTERED |
#define UPD_NODE_NO_ORD_CHANGE |
#define UPD_NODE_NO_SIZE_CHANGE |
#define UPD_NODE_SET_IX_LOCK |
#define UPD_NODE_UPDATE_ALL_SEC |
#define UPD_NODE_UPDATE_CLUSTERED |
#define UPD_NODE_UPDATE_SOME_SEC |
UNIV_INTERN const upd_t* row_upd_build_difference_binary | ( | dict_index_t * | index, |
const dtuple_t * | entry, | ||
const rec_t * | rec, | ||
const ulint * | offsets, | ||
bool | no_sys, | ||
trx_t * | trx, | ||
mem_heap_t * | heap | ||
) |
Builds an update vector from those fields, excluding the roll ptr and trx id fields, which in an index entry differ from a record that has the equal ordering fields. NOTE: we compare the fields as binary strings!
index | in: clustered index |
entry | in: entry to insert |
rec | in: clustered index record |
offsets | in: rec_get_offsets(rec,index), or NULL |
no_sys | in: skip the system columns DB_TRX_ID and DB_ROLL_PTR |
trx | in: transaction (for diagnostics), or NULL |
heap | in: memory heap from which allocated |
UNIV_INTERN upd_t* row_upd_build_sec_rec_difference_binary | ( | const rec_t * | rec, |
dict_index_t * | index, | ||
const ulint * | offsets, | ||
const dtuple_t * | entry, | ||
mem_heap_t * | heap | ||
) |
Builds an update vector from those fields which in a secondary index entry differ from a record that has the equal ordering fields. NOTE: we compare the fields as binary strings!
rec | in: secondary index record |
index | in: index |
offsets | in: rec_get_offsets(rec, index) |
entry | in: entry to insert |
heap | in: memory heap from which allocated |
UNIV_INTERN bool row_upd_changes_disowned_external | ( | const upd_t * | update | ) |
Returns true if row update contains disowned external fields.
update | in: update vector |
UNIV_INTERN bool row_upd_changes_doc_id | ( | dict_table_t * | table, |
upd_field_t * | upd_field | ||
) |
Checks if an FTS Doc ID column is affected by an UPDATE.
table | in: table |
upd_field | in: field to check |
UNIV_INTERN ibool row_upd_changes_field_size_or_external | ( | dict_index_t * | index, |
const ulint * | offsets, | ||
const upd_t * | update | ||
) |
Returns TRUE if row update changes size of some field in index or if some field to be updated is stored externally in rec or update.
index | in: index |
offsets | in: rec_get_offsets(rec, index) |
UNIV_INTERN ulint row_upd_changes_fts_column | ( | dict_table_t * | table, |
upd_field_t * | upd_field | ||
) |
Checks if an FTS indexed column is affected by an UPDATE.
table | in: table |
UNIV_INTERN ibool row_upd_changes_ord_field_binary_func | ( | dict_index_t * | index, |
const upd_t * | update, | ||
const que_thr_t * | thr, | ||
const dtuple_t * | row, | ||
const row_ext_t * | ext | ||
) |
Checks if an update vector changes an ordering field of an index record.
This function is fast if the update vector is short or the number of ordering fields in the index is small. Otherwise, this can be quadratic. NOTE: we compare the fields as binary strings!
index | in: index of the record |
update | in: update vector for the row; NOTE: the field numbers in this MUST be clustered index positions! |
thr | in: query thread |
row | in: old value of row, or NULL if the row and the data values in update are not known when this function is called, e.g., at compile time |
ext | NULL, or prefixes of the externally stored columns in the old row |
UNIV_INTERN ibool row_upd_changes_some_index_ord_field_binary | ( | const dict_table_t * | table, |
const upd_t * | update | ||
) |
Checks if an update vector changes an ordering field of an index record. This function is fast if the update vector is short or the number of ordering fields in the index is small. Otherwise, this can be quadratic. NOTE: we compare the fields as binary strings!
table | in: table |
UNIV_INTERN void row_upd_index_entry_sys_field | ( | dtuple_t * | entry, |
dict_index_t * | index, | ||
ulint | type, | ||
ib_uint64_t | val | ||
) |
Sets the trx id or roll ptr field of a clustered index entry. in: value to write
entry | in/out: index entry, where the memory buffers for sys fields are already allocated: the function just copies the new values to them |
index | in: clustered index |
type | in: DATA_TRX_ID or DATA_ROLL_PTR |
UNIV_INTERN byte* row_upd_index_parse | ( | byte * | ptr, |
byte * | end_ptr, | ||
mem_heap_t * | heap, | ||
upd_t ** | update_out | ||
) |
Parses the log data written by row_upd_index_write_log.
ptr | in: buffer |
end_ptr | in: buffer end |
heap | in: memory heap where update vector is built |
UNIV_INTERN void row_upd_index_replace_new_col_vals | ( | dtuple_t * | entry, |
dict_index_t * | index, | ||
const upd_t * | update, | ||
mem_heap_t * | heap | ||
) |
Replaces the new column values stored in the update vector to the index entry given.
entry | in/out: index entry where replaced; the clustered index record must be covered by a lock or a page latch to prevent deletion (rollback or purge) |
index | in: index; NOTE that this may also be a non-clustered index |
update | in: an update vector built for the CLUSTERED index so that the field number in an upd_field is the clustered index position |
heap | in: memory heap for allocating and copying the new values |
UNIV_INTERN void row_upd_index_replace_new_col_vals_index_pos | ( | dtuple_t * | entry, |
dict_index_t * | index, | ||
const upd_t * | update, | ||
ibool | order_only, | ||
mem_heap_t * | heap | ||
) |
Replaces the new column values stored in the update vector to the index entry given.
entry | in/out: index entry where replaced; the clustered index record must be covered by a lock or a page latch to prevent deletion (rollback or purge) |
index | in: index; NOTE that this may also be a non-clustered index |
update | in: an update vector built for the index so that the field number in an upd_field is the index position |
order_only | in: if TRUE, limit the replacement to ordering fields of index; note that this does not work for non-clustered indexes. |
heap | in: memory heap for allocating and copying the new values |
Writes to the redo log the new values of the fields occurring in the index. in: mtr into whose log to write
update | in: update vector |
log_ptr | in: pointer to mlog buffer: must contain at least MLOG_BUF_MARGIN bytes of free space; the buffer is closed within this function |
UNIV_INTERN byte* row_upd_parse_sys_vals | ( | byte * | ptr, |
byte * | end_ptr, | ||
ulint * | pos, | ||
trx_id_t * | trx_id, | ||
roll_ptr_t * | roll_ptr | ||
) |
Parses the log data of system field values.
ptr | in: buffer |
end_ptr | in: buffer end |
pos | out: TRX_ID position in record |
trx_id | out: trx id |
UNIV_INTERN void row_upd_rec_in_place | ( | rec_t * | rec, |
dict_index_t * | index, | ||
const ulint * | offsets, | ||
const upd_t * | update, | ||
page_zip_des_t * | page_zip | ||
) |
Replaces the new column values stored in the update vector to the record given. No field size changes are allowed. This function is usually invoked on a clustered index. The only use case for a secondary index is row_ins_sec_index_entry_by_modify() or its counterpart in ibuf_insert_to_index_page(). in: compressed page with enough space available, or NULL
rec | in/out: record where replaced |
index | in: the index the record belongs to |
offsets | in: array returned by rec_get_offsets() |
update | in: update vector |
UNIV_INLINE void row_upd_rec_sys_fields | ( | rec_t * | rec, |
page_zip_des_t * | page_zip, | ||
dict_index_t * | index, | ||
const ulint * | offsets, | ||
const trx_t * | trx, | ||
roll_ptr_t | roll_ptr | ||
) |
Updates the trx id and roll ptr field in a clustered index record when a row is updated or marked deleted. in: roll ptr of the undo log record, can be 0 during IMPORT
Updates the trx id and roll ptr field in a clustered index record when a row is updated or marked deleted.
rec | in/out: record |
page_zip | in/out: compressed page whose uncompressed part will be updated, or NULL |
index | in: clustered index |
offsets | in: rec_get_offsets(rec, index) |
trx | in: transaction |
roll_ptr | in: roll ptr of the undo log record, can be 0 during IMPORT |
UNIV_INTERN void row_upd_rec_sys_fields_in_recovery | ( | rec_t * | rec, |
page_zip_des_t * | page_zip, | ||
const ulint * | offsets, | ||
ulint | pos, | ||
trx_id_t | trx_id, | ||
roll_ptr_t | roll_ptr | ||
) |
Updates the trx id and roll ptr field in a clustered index record in database recovery. in: roll ptr of the undo log record
rec | in/out: record |
page_zip | in/out: compressed page, or NULL |
offsets | in: array returned by rec_get_offsets() |
pos | in: TRX_ID position in rec |
trx_id | in: transaction id |
UNIV_INTERN void row_upd_replace | ( | dtuple_t * | row, |
row_ext_t ** | ext, | ||
const dict_index_t * | index, | ||
const upd_t * | update, | ||
mem_heap_t * | heap | ||
) |
Replaces the new column values stored in the update vector. in: memory heap
row | in/out: row where replaced, indexed by col_no; the clustered index record must be covered by a lock or a page latch to prevent deletion (rollback or purge) |
ext | out, own: NULL, or externally stored column prefixes |
index | in: clustered index |
update | in: an update vector built for the clustered index |
Updates a row in a table. This is a high-level function used in SQL execution graphs.
UNIV_INTERN byte* row_upd_write_sys_vals_to_log | ( | dict_index_t * | index, |
trx_id_t | trx_id, | ||
roll_ptr_t | roll_ptr, | ||
byte * | log_ptr, | ||
mtr_t * | mtr | ||
) |
Writes into the redo log the values of trx id and roll ptr and enough info to determine their positions within a clustered index record.
index | in: clustered index |
trx_id | in: transaction id |
roll_ptr | in: roll ptr of the undo log record |
log_ptr | pointer to a buffer of size > 20 opened in mlog |
UNIV_INLINE upd_t* upd_create | ( | ulint | n, |
mem_heap_t * | heap | ||
) |
Creates an update vector object.
Creates an update vector object.
n | in: number of fields |
heap | in: heap from which memory allocated |
UNIV_INLINE void upd_field_set_field_no | ( | upd_field_t * | upd_field, |
ulint | field_no, | ||
dict_index_t * | index, | ||
trx_t * | trx | ||
) |
Sets an index field number to be updated by an update vector field. in: transaction
Sets an index field number to be updated by an update vector field.
upd_field | in: update vector field |
field_no | in: field number in a clustered index |
index | in: index |
trx | in: transaction |
UNIV_INLINE const upd_field_t* upd_get_field_by_field_no | ( | const upd_t * | update, |
ulint | no | ||
) |
Returns a field of an update vector by field_no.
update | in: update vector |
no | in: field_no |
UNIV_INLINE ulint upd_get_n_fields | ( | const upd_t * | update | ) |
Returns the number of fields in the update vector == number of columns to be updated by an update vector.
Returns the number of fields in the update vector == number of columns to be updated by an update vector.
update | in: update vector |
UNIV_INLINE upd_field_t* upd_get_nth_field | ( | const upd_t * | update, |
ulint | n | ||
) |
Returns the nth field of an update vector.
Returns the nth field of an update vector.
update | in: update vector |
n | in: field position in update vector |
UNIV_INTERN upd_node_t* upd_node_create | ( | mem_heap_t * | heap | ) |
Creates an update node for a query graph.