MySQL  8.0.22
Source Code Documentation
row0ins.h File Reference

Insert into a table. More...

#include "data0data.h"
#include "dict0types.h"
#include "que0types.h"
#include "row0types.h"
#include "trx0types.h"
#include "univ.i"

Go to the source code of this file.

Classes

struct  ins_node_t
 

Macros

#define INS_NODE_MAGIC_N   15849075
 
#define INS_SEARCHED   0 /* INSERT INTO ... SELECT ... */
 
#define INS_VALUES   1 /* INSERT INTO ... VALUES ... */
 
#define INS_DIRECT
 
#define INS_NODE_SET_IX_LOCK   1 /* we should set an IX lock on table */
 
#define INS_NODE_ALLOC_ROW_ID   2 /* row id should be allocated */
 
#define INS_NODE_INSERT_ENTRIES
 

Functions

dberr_t row_ins_check_foreign_constraint (ibool check_ref, dict_foreign_t *foreign, dict_table_t *table, dtuple_t *entry, que_thr_t *thr)
 Checks if foreign key constraint fails for an index entry. More...
 
ins_node_tins_node_create (ulint ins_type, dict_table_t *table, mem_heap_t *heap)
 Creates an insert node struct. More...
 
void ins_node_set_new_row (ins_node_t *node, dtuple_t *row)
 Sets a new row to insert for an INS_DIRECT node. More...
 
dberr_t row_ins_clust_index_entry_low (uint32_t flags, ulint mode, dict_index_t *index, ulint n_uniq, dtuple_t *entry, que_thr_t *thr, bool dup_chk_only)
 Tries to insert an entry into a clustered index, ignoring foreign key constraints. More...
 
dberr_t row_ins_sec_index_entry_low (uint32_t flags, ulint mode, dict_index_t *index, mem_heap_t *offsets_heap, mem_heap_t *heap, dtuple_t *entry, trx_id_t trx_id, que_thr_t *thr, bool dup_chk_only)
 Tries to insert an entry into a secondary index. More...
 
dberr_t row_ins_index_entry_set_vals (const dict_index_t *index, dtuple_t *entry, const dtuple_t *row)
 Sets the values of the dtuple fields in entry from the values of appropriate columns in row. More...
 
dberr_t row_ins_clust_index_entry (dict_index_t *index, dtuple_t *entry, que_thr_t *thr, bool dup_chk_only)
 Inserts an entry into a clustered index. More...
 
dberr_t row_ins_sec_index_entry (dict_index_t *index, dtuple_t *entry, que_thr_t *thr, bool dup_chk_only)
 Inserts an entry into a secondary index. More...
 
que_thr_trow_ins_step (que_thr_t *thr)
 Inserts a row to a table. More...
 

Detailed Description

Insert into a table.

Created 4/20/1996 Heikki Tuuri

Macro Definition Documentation

◆ INS_DIRECT

#define INS_DIRECT
Value:
2 /* this is for internal use in dict0crea: \
insert the row directly */

◆ INS_NODE_ALLOC_ROW_ID

#define INS_NODE_ALLOC_ROW_ID   2 /* row id should be allocated */

◆ INS_NODE_INSERT_ENTRIES

#define INS_NODE_INSERT_ENTRIES
Value:
3 /* index entries should be built and \
inserted */

◆ INS_NODE_MAGIC_N

#define INS_NODE_MAGIC_N   15849075

◆ INS_NODE_SET_IX_LOCK

#define INS_NODE_SET_IX_LOCK   1 /* we should set an IX lock on table */

◆ INS_SEARCHED

#define INS_SEARCHED   0 /* INSERT INTO ... SELECT ... */

◆ INS_VALUES

#define INS_VALUES   1 /* INSERT INTO ... VALUES ... */

Function Documentation

◆ ins_node_create()

ins_node_t* ins_node_create ( ulint  ins_type,
dict_table_t table,
mem_heap_t heap 
)

Creates an insert node struct.

Returns
own: insert node struct in: mem heap where created
own: insert node struct
Parameters
ins_typein: INS_VALUES, ...
tablein: table where to insert
heapin: mem heap where created

◆ ins_node_set_new_row()

void ins_node_set_new_row ( ins_node_t node,
dtuple_t row 
)

Sets a new row to insert for an INS_DIRECT node.

This function is only used if we have constructed the row separately, which is a rare case; this function is quite slow. in: new row (or first row) for the node

This function is only used if we have constructed the row separately, which is a rare case; this function is quite slow.

Parameters
nodein: insert node
rowin: new row (or first row) for the node

◆ row_ins_check_foreign_constraint()

dberr_t row_ins_check_foreign_constraint ( ibool  check_ref,
dict_foreign_t foreign,
dict_table_t table,
dtuple_t entry,
que_thr_t thr 
)

Checks if foreign key constraint fails for an index entry.

Sets shared locks which lock either the success or the failure of the constraint. NOTE that the caller must have a shared latch on dict_foreign_key_check_lock.

Returns
DB_SUCCESS, DB_LOCK_WAIT, DB_NO_REFERENCED_ROW, or DB_ROW_IS_REFERENCED

Sets shared locks which lock either the success or the failure of the constraint. NOTE that the caller must have a shared latch on dict_operation_lock.

Returns
DB_SUCCESS, DB_NO_REFERENCED_ROW, or DB_ROW_IS_REFERENCED
Parameters
check_refin: TRUE if we want to check that the referenced table is ok, FALSE if we want to check the foreign key table
foreignin: foreign constraint; NOTE that the tables mentioned in it must be in the dictionary cache if they exist at all
tablein: if check_ref is TRUE, then the foreign table, else the referenced table
entryin: index entry for index
thrin: query thread

◆ row_ins_clust_index_entry()

dberr_t row_ins_clust_index_entry ( dict_index_t index,
dtuple_t entry,
que_thr_t thr,
bool  dup_chk_only 
)

Inserts an entry into a clustered index.

Tries first optimistic, then pessimistic descent down the tree. If the entry matches enough to a delete marked record, performs the insert by updating or delete unmarking the delete marked record.

Returns
DB_SUCCESS, DB_LOCK_WAIT, DB_DUPLICATE_KEY, or some other error code
Parameters
indexin: clustered index
entryin/out: index entry to insert
thrin: query thread
dup_chk_onlyin: if true, just do duplicate check and return. don't execute actual insert.

◆ row_ins_clust_index_entry_low()

dberr_t row_ins_clust_index_entry_low ( uint32_t  flags,
ulint  mode,
dict_index_t index,
ulint  n_uniq,
dtuple_t entry,
que_thr_t thr,
bool  dup_chk_only 
)

Tries to insert an entry into a clustered index, ignoring foreign key constraints.

If a record with the same unique key is found, the other record is necessarily marked deleted by a committed transaction, or a unique key violation error occurs. The delete marked record is then updated to an existing record, and we must write an undo log record on the delete marked record.

Return values
DB_SUCCESSon success
DB_LOCK_WAITon lock wait when !(flags & BTR_NO_LOCKING_FLAG)
DB_FAILif retry with BTR_MODIFY_TREE is needed
Returns
error code
Parameters
flagsin: undo logging and locking flags
modein: BTR_MODIFY_LEAF or BTR_MODIFY_TREE, depending on whether we wish optimistic or pessimistic descent down the index tree
indexin: clustered index
n_uniqin: 0 or index->n_uniq
entryin/out: index entry to insert
thrin: query thread, or NULL if flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG) and a duplicate can't occur
dup_chk_onlyin: if true, just do duplicate check and return. don't execute actual insert.

◆ row_ins_index_entry_set_vals()

dberr_t row_ins_index_entry_set_vals ( const dict_index_t index,
dtuple_t entry,
const dtuple_t row 
)

Sets the values of the dtuple fields in entry from the values of appropriate columns in row.

Parameters
[in]indexindex handler
[out]entryindex entry to make
[in]rowrow
Returns
DB_SUCCESS if the set is successful

◆ row_ins_sec_index_entry()

dberr_t row_ins_sec_index_entry ( dict_index_t index,
dtuple_t entry,
que_thr_t thr,
bool  dup_chk_only 
)

Inserts an entry into a secondary index.

Tries first optimistic, then pessimistic descent down the tree. If the entry matches enough to a delete marked record, performs the insert by updating or delete unmarking the delete marked record.

Returns
DB_SUCCESS, DB_LOCK_WAIT, DB_DUPLICATE_KEY, or some other error code
Parameters
indexin: secondary index
entryin/out: index entry to insert
thrin: query thread
dup_chk_onlyin: if true, just do duplicate check and return. don't execute actual insert.

◆ row_ins_sec_index_entry_low()

dberr_t row_ins_sec_index_entry_low ( uint32_t  flags,
ulint  mode,
dict_index_t index,
mem_heap_t offsets_heap,
mem_heap_t heap,
dtuple_t entry,
trx_id_t  trx_id,
que_thr_t thr,
bool  dup_chk_only 
)

Tries to insert an entry into a secondary index.

If a record with exactly the same fields is found, the other record is necessarily marked deleted. It is then unmarked. Otherwise, the entry is just inserted to the index.

Parameters
[in]flagsundo logging and locking flags
[in]modeBTR_MODIFY_LEAF or BTR_MODIFY_TREE, depending on whether we wish optimistic or pessimistic descent down the index tree
[in]indexsecondary index
[in,out]offsets_heapmemory heap that can be emptied
[in,out]heapmemory heap
[in,out]entryindex entry to insert
[in]trx_idPAGE_MAX_TRX_ID during row_log_table_apply(), or trx_id when undo log is disabled during alter copy operation or 0
[in]thrquery thread
[in]dup_chk_onlyTRUE, just do duplicate check and return. don't execute actual insert
Return values
DB_SUCCESSon success
DB_LOCK_WAITon lock wait when !(flags & BTR_NO_LOCKING_FLAG)
DB_FAILif retry with BTR_MODIFY_TREE is needed
Returns
error code

◆ row_ins_step()

que_thr_t* row_ins_step ( que_thr_t thr)

Inserts a row to a table.

This is a high-level function used in SQL execution graphs.

Returns
query thread to run next or NULL in: query thread

This is a high-level function used in SQL execution graphs.

Returns
query thread to run next or NULL
Parameters
thrin: query thread