row0ins.h 5.9 KB
Newer Older
Vadim Tkachenko's avatar
Vadim Tkachenko committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*****************************************************************************

Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA

*****************************************************************************/

Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
19 20
/**************************************************//**
@file include/row0ins.h
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
Insert into a table

Created 4/20/1996 Heikki Tuuri
*******************************************************/

#ifndef row0ins_h
#define row0ins_h

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

Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
36
/***************************************************************//**
37 38
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
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
39 40 41
the caller must have a shared latch on dict_foreign_key_check_lock.
@return DB_SUCCESS, DB_LOCK_WAIT, DB_NO_REFERENCED_ROW, or
DB_ROW_IS_REFERENCED */
42 43 44 45
UNIV_INTERN
ulint
row_ins_check_foreign_constraint(
/*=============================*/
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
46
	ibool		check_ref,/*!< in: TRUE If we want to check that
47
				the referenced table is ok, FALSE if we
48
				want to check the foreign key table */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
49
	dict_foreign_t*	foreign,/*!< in: foreign constraint; NOTE that the
50 51
				tables mentioned in it must be in the
				dictionary cache if they exist at all */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
52
	dict_table_t*	table,	/*!< in: if check_ref is TRUE, then the foreign
53
				table, else the referenced table */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
54 55 56 57 58
	dtuple_t*	entry,	/*!< in: index entry for index */
	que_thr_t*	thr);	/*!< in: query thread */
/*********************************************************************//**
Creates an insert node struct.
@return	own: insert node struct */
59 60 61 62
UNIV_INTERN
ins_node_t*
ins_node_create(
/*============*/
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
63 64 65 66
	ulint		ins_type,	/*!< in: INS_VALUES, ... */
	dict_table_t*	table,		/*!< in: table where to insert */
	mem_heap_t*	heap);		/*!< in: mem heap where created */
/*********************************************************************//**
67 68 69 70 71 72 73
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. */
UNIV_INTERN
void
ins_node_set_new_row(
/*=================*/
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
74 75 76
	ins_node_t*	node,	/*!< in: insert node */
	dtuple_t*	row);	/*!< in: new row (or first row) for the node */
/***************************************************************//**
77 78 79
Inserts an index entry to 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
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
80 81
record.
@return	DB_SUCCESS, DB_LOCK_WAIT, DB_DUPLICATE_KEY, or some other error code */
82 83 84 85
UNIV_INTERN
ulint
row_ins_index_entry(
/*================*/
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
86
	dict_index_t*	index,	/*!< in: index */
87
	dtuple_t*	entry,	/*!< in/out: index entry to insert */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
88
	ulint		n_ext,	/*!< in: number of externally stored columns */
89 90
	ibool		foreign,/*!< in: TRUE=check foreign key constraints
				(foreign=FALSE only during CREATE INDEX) */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
91 92
	que_thr_t*	thr);	/*!< in: query thread */
/***********************************************************//**
93
Inserts a row to a table. This is a high-level function used in
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
94 95
SQL execution graphs.
@return	query thread to run next or NULL */
96 97 98 99
UNIV_INTERN
que_thr_t*
row_ins_step(
/*=========*/
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
100 101
	que_thr_t*	thr);	/*!< in: query thread */
/***********************************************************//**
102 103 104 105 106
Creates an entry template for each index of a table. */
UNIV_INTERN
void
ins_node_create_entry_list(
/*=======================*/
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
107
	ins_node_t*	node);	/*!< in: row insert node */
108 109 110 111

/* Insert node structure */

struct ins_node_struct{
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
112
	que_common_t	common;	/*!< node type: QUE_NODE_INSERT */
113
	ulint		ins_type;/* INS_VALUES, INS_SEARCHED, or INS_DIRECT */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
114 115 116
	dtuple_t*	row;	/*!< row to insert */
	dict_table_t*	table;	/*!< table where to insert */
	sel_node_t*	select;	/*!< select in searched insert */
117 118
	que_node_t*	values_list;/* list of expressions to evaluate and
				insert in an INS_VALUES insert */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
119 120
	ulint		state;	/*!< node execution state */
	dict_index_t*	index;	/*!< NULL, or the next index where the index
121
				entry should be inserted */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
122
	dtuple_t*	entry;	/*!< NULL, or entry to insert in the index;
123 124 125 126 127
				after a successful insert of the entry,
				this should be reset to NULL */
	UT_LIST_BASE_NODE_T(dtuple_t)
			entry_list;/* list of entries, one for each index */
	byte*		row_id_buf;/* buffer for the row id sys field in row */
Aleksandr Kuzminsky's avatar
Aleksandr Kuzminsky committed
128
	trx_id_t	trx_id;	/*!< trx id or the last trx which executed the
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
				node */
	byte*		trx_id_buf;/* buffer for the trx id sys field in row */
	mem_heap_t*	entry_sys_heap;
				/* memory heap used as auxiliary storage;
				entry_list and sys fields are stored here;
				if this is NULL, entry list should be created
				and buffers for sys fields in row allocated */
	ulint		magic_n;
};

#define	INS_NODE_MAGIC_N	15849075

/* Insert node types */
#define INS_SEARCHED	0	/* INSERT INTO ... SELECT ... */
#define INS_VALUES	1	/* INSERT INTO ... VALUES ... */
#define INS_DIRECT	2	/* this is for internal use in dict0crea:
				insert the row directly */

/* Node execution states */
#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 3	/* index entries should be built and
					inserted */

#ifndef UNIV_NONINL
#include "row0ins.ic"
#endif

#endif