1
/*****************************************************************************
3
Copyright (C) 2005, 2010, Innobase Oy. All Rights Reserved.
5
This program is free software; you can redistribute it and/or modify it under
6
the terms of the GNU General Public License as published by the Free Software
7
Foundation; version 2 of the License.
9
This program is distributed in the hope that it will be useful, but WITHOUT
10
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License along with
14
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
15
St, Fifth Floor, Boston, MA 02110-1301 USA
17
*****************************************************************************/
19
/**************************************************//**
20
@file include/row0merge.h
21
Index build routines using a merge sort
23
Created 13/06/2005 Jan Lindstrom
24
*******************************************************/
30
#include "data0data.h"
31
#include "dict0types.h"
32
#include "trx0types.h"
33
#include "que0types.h"
35
#include "rem0types.h"
37
#include "read0types.h"
38
#include "btr0types.h"
39
#include "row0mysql.h"
40
#include "lock0types.h"
42
/** Index field definition */
43
struct merge_index_field_struct {
44
ulint prefix_len; /*!< column prefix length, or 0
45
if indexing the whole column */
46
const char* field_name; /*!< field name */
49
/** Index field definition */
50
typedef struct merge_index_field_struct merge_index_field_t;
52
/** Definition of an index being created */
53
struct merge_index_def_struct {
54
const char* name; /*!< index name */
55
ulint ind_type; /*!< 0, DICT_UNIQUE,
57
ulint n_fields; /*!< number of fields
59
merge_index_field_t* fields; /*!< field definitions */
62
/** Definition of an index being created */
63
typedef struct merge_index_def_struct merge_index_def_t;
65
/*********************************************************************//**
66
Sets an exclusive lock on a table, for the duration of creating indexes.
67
@return error code or DB_SUCCESS */
72
trx_t* trx, /*!< in/out: transaction */
73
dict_table_t* table, /*!< in: table to lock */
74
enum lock_mode mode); /*!< in: LOCK_X or LOCK_S */
75
/*********************************************************************//**
76
Drop an index from the InnoDB system tables. The data dictionary must
77
have been locked exclusively by the caller, because the transaction
78
will not be committed. */
83
dict_index_t* index, /*!< in: index to be removed */
84
dict_table_t* table, /*!< in: table */
85
trx_t* trx); /*!< in: transaction handle */
86
/*********************************************************************//**
87
Drop those indexes which were created before an error occurred when
88
building an index. The data dictionary must have been locked
89
exclusively by the caller, because the transaction will not be
93
row_merge_drop_indexes(
94
/*===================*/
95
trx_t* trx, /*!< in: transaction */
96
dict_table_t* table, /*!< in: table containing the indexes */
97
dict_index_t** index, /*!< in: indexes to drop */
98
ulint num_created); /*!< in: number of elements in index[] */
99
/*********************************************************************//**
100
Drop all partially created indexes during crash recovery. */
103
row_merge_drop_temp_indexes(void);
104
/*=============================*/
105
/*********************************************************************//**
106
Rename the tables in the data dictionary. The data dictionary must
107
have been locked exclusively by the caller, because the transaction
108
will not be committed.
109
@return error code or DB_SUCCESS */
112
row_merge_rename_tables(
113
/*====================*/
114
dict_table_t* old_table, /*!< in/out: old table, renamed to
116
dict_table_t* new_table, /*!< in/out: new table, renamed to
118
const char* tmp_name, /*!< in: new name for old_table */
119
trx_t* trx); /*!< in: transaction handle */
121
/*********************************************************************//**
122
Create a temporary table for creating a primary key, using the definition
123
of an existing table.
124
@return table, or NULL on error */
127
row_merge_create_temporary_table(
128
/*=============================*/
129
const char* table_name, /*!< in: new table name */
130
const merge_index_def_t*index_def, /*!< in: the index definition
131
of the primary key */
132
const dict_table_t* table, /*!< in: old table definition */
133
trx_t* trx); /*!< in/out: transaction
134
(sets error_state) */
135
/*********************************************************************//**
136
Rename the temporary indexes in the dictionary to permanent ones. The
137
data dictionary must have been locked exclusively by the caller,
138
because the transaction will not be committed.
139
@return DB_SUCCESS if all OK */
142
row_merge_rename_indexes(
143
/*=====================*/
144
trx_t* trx, /*!< in/out: transaction */
145
dict_table_t* table); /*!< in/out: table with new indexes */
146
/*********************************************************************//**
147
Create the index and load in to the dictionary.
148
@return index, or NULL on error */
151
row_merge_create_index(
152
/*===================*/
153
trx_t* trx, /*!< in/out: trx (sets error_state) */
154
dict_table_t* table, /*!< in: the index is on this table */
155
const merge_index_def_t*index_def);
156
/*!< in: the index definition */
157
/*********************************************************************//**
158
Check if a transaction can use an index.
159
@return TRUE if index can be used by the transaction else FALSE */
162
row_merge_is_index_usable(
163
/*======================*/
164
const trx_t* trx, /*!< in: transaction */
165
const dict_index_t* index); /*!< in: index to check */
166
/*********************************************************************//**
167
If there are views that refer to the old table name then we "attach" to
168
the new instance of the table else we drop it immediately.
169
@return DB_SUCCESS or error code */
172
row_merge_drop_table(
173
/*=================*/
174
trx_t* trx, /*!< in: transaction */
175
dict_table_t* table); /*!< in: table instance to drop */
177
/*********************************************************************//**
178
Build indexes on a table by reading a clustered index,
179
creating a temporary file containing index entries, merge sorting
180
these index entries and inserting sorted index entries to indexes.
181
@return DB_SUCCESS or error code */
184
row_merge_build_indexes(
185
/*====================*/
186
trx_t* trx, /*!< in: transaction */
187
dict_table_t* old_table, /*!< in: table where rows are
189
dict_table_t* new_table, /*!< in: table where indexes are
190
created; identical to old_table
191
unless creating a PRIMARY KEY */
192
dict_index_t** indexes, /*!< in: indexes to be created */
193
ulint n_indexes, /*!< in: size of indexes[] */
194
TABLE* table); /*!< in/out: MySQL table, for
195
reporting erroneous key value
197
#endif /* row0merge.h */