11
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
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
14
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15
Place, Suite 330, Boston, MA 02111-1307 USA
17
17
*****************************************************************************/
95
95
((str1_len) == sizeof(str2_onstack) \
96
96
&& memcmp(str1, str2_onstack, sizeof(str2_onstack)) == 0)
98
/*******************************************************************//**
99
Determine if the given name is a name reserved for MySQL system tables.
100
@return TRUE if name is a MySQL system table name */
103
row_mysql_is_system_table(
104
/*======================*/
107
if (strncmp(name, "mysql/", 6) != 0) {
112
return(0 == strcmp(name + 6, "host")
113
|| 0 == strcmp(name + 6, "user")
114
|| 0 == strcmp(name + 6, "db"));
98
117
/*********************************************************************//**
99
118
If a table is not yet in the drop list, adds the table to the list of tables
100
119
which the master thread drops in background. We need this on Unix because in
251
270
/**************************************************************//**
252
Pad a column with spaces. */
257
ulint mbminlen, /*!< in: minimum size of a character,
259
byte* pad, /*!< out: padded buffer */
260
ulint len) /*!< in: number of bytes to pad */
264
switch (UNIV_EXPECT(mbminlen, 1)) {
269
memset(pad, 0x20, len);
278
} while (pad < pad_end);
281
/* space=0x00000020 */
289
} while (pad < pad_end);
294
/**************************************************************//**
295
271
Stores a non-SQL-NULL field given in the MySQL format in the InnoDB format.
296
272
The counterpart of this function is row_sel_field_store_in_mysql_format() in
383
359
/* Remove trailing spaces from old style VARCHAR
386
/* Handle Unicode strings differently. */
362
/* Handle UCS2 strings differently. */
387
363
ulint mbminlen = dtype_get_mbminlen(dtype);
389
365
ptr = mysql_data;
395
/* space=0x00000020 */
396
/* Trim "half-chars", just in case. */
400
&& ptr[col_len - 4] == 0x00
401
&& ptr[col_len - 3] == 0x00
402
&& ptr[col_len - 2] == 0x00
403
&& ptr[col_len - 1] == 0x20) {
408
368
/* space=0x0020 */
409
369
/* Trim "half-chars", just in case. */
914
863
if (counter > 2000000000
915
864
|| ((ib_int64_t)counter > 16 + table->stat_n_rows / 16)) {
917
dict_update_statistics(table, FALSE /* update even if stats
866
dict_update_statistics(table);
922
870
/*********************************************************************//**
923
Unlocks AUTO_INC type locks that were possibly reserved by a trx. This
924
function should be called at the the end of an SQL statement, by the
925
connection thread that owns the transaction (trx->mysql_thd). */
871
Unlocks AUTO_INC type locks that were possibly reserved by a trx. */
928
874
row_unlock_table_autoinc_for_mysql(
929
875
/*===============================*/
930
876
trx_t* trx) /*!< in/out: transaction */
932
if (lock_trx_holds_autoinc_locks(trx)) {
933
mutex_enter(&kernel_mutex);
935
lock_release_autoinc_locks(trx);
937
mutex_exit(&kernel_mutex);
878
mutex_enter(&kernel_mutex);
880
lock_release_autoinc_locks(trx);
882
mutex_exit(&kernel_mutex);
941
885
/*********************************************************************//**
1066
1010
trx_start_if_not_started(trx);
1069
err = lock_table(0, table, static_cast<lock_mode>(mode), thr);
1013
err = lock_table(0, table, mode, thr);
1071
1015
err = lock_table(0, prebuilt->table,
1072
static_cast<lock_mode>(prebuilt->select_lock_type), thr);
1016
prebuilt->select_lock_type, thr);
1075
1019
trx->error_state = err;
1498
1427
/*********************************************************************//**
1499
This can only be used when srv_locks_unsafe_for_binlog is TRUE or this
1500
session is using a READ COMMITTED or READ UNCOMMITTED isolation level.
1501
Before calling this function row_search_for_mysql() must have
1502
initialized prebuilt->new_rec_locks to store the information which new
1503
record locks really were set. This function removes a newly set
1504
clustered index record lock under prebuilt->pcur or
1505
prebuilt->clust_pcur. Thus, this implements a 'mini-rollback' that
1506
releases the latest clustered index record lock we set.
1507
@return error code or DB_SUCCESS */
1428
This can only be used when srv_locks_unsafe_for_binlog is TRUE or
1429
this session is using a READ COMMITTED isolation level. Before
1430
calling this function we must use trx_reset_new_rec_lock_info() and
1431
trx_register_new_rec_lock() to store the information which new record locks
1432
really were set. This function removes a newly set lock under prebuilt->pcur,
1433
and also under prebuilt->clust_pcur. Currently, this is only used and tested
1434
in the case of an UPDATE or a DELETE statement, where the row lock is of the
1436
Thus, this implements a 'mini-rollback' that releases the latest record
1438
@return error code or DB_SUCCESS */
1510
1441
row_unlock_for_mysql(
1511
1442
/*=================*/
1512
row_prebuilt_t* prebuilt, /*!< in/out: prebuilt struct in MySQL
1443
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct in MySQL
1514
ibool has_latches_on_recs)/*!< in: TRUE if called so
1515
that we have the latches on
1516
the records under pcur and
1517
clust_pcur, and we do not need
1518
to reposition the cursors. */
1445
ibool has_latches_on_recs)/*!< TRUE if called so that we have
1446
the latches on the records under pcur
1447
and clust_pcur, and we do not need to
1448
reposition the cursors. */
1520
1450
btr_pcur_t* pcur = prebuilt->pcur;
1521
1451
btr_pcur_t* clust_pcur = prebuilt->clust_pcur;
1601
if (rec_trx_id != trx->id) {
1531
if (ut_dulint_cmp(rec_trx_id, trx->id) != 0) {
1602
1532
/* We did not update the record: unlock it */
1604
1534
rec = btr_pcur_get_rec(pcur);
1605
1535
index = btr_pcur_get_btr_cur(pcur)->index;
1607
1537
lock_rec_unlock(trx, btr_pcur_get_block(pcur),
1608
rec, static_cast<lock_mode>(prebuilt->select_lock_type));
1538
rec, prebuilt->select_lock_type);
1610
1540
if (prebuilt->new_rec_locks >= 2) {
1611
1541
rec = btr_pcur_get_rec(clust_pcur);
1644
1574
trx = thr_get_trx(thr);
1646
/* Increment fk_cascade_depth to record the recursive call depth on
1647
a single update/delete that affects multiple tables chained
1648
together with foreign key relations. */
1649
thr->fk_cascade_depth++;
1651
if (thr->fk_cascade_depth > FK_MAX_CASCADE_DEL) {
1652
return (DB_FOREIGN_EXCEED_MAX_CASCADE);
1655
1576
thr->run_node = node;
1656
1577
thr->prev_node = node;
1658
1579
row_upd_step(thr);
1660
/* The recursive call for cascading update/delete happens
1661
in above row_upd_step(), reset the counter once we come
1662
out of the recursive call, so it does not accumulate for
1663
different row deletes */
1664
thr->fk_cascade_depth = 0;
1666
1581
err = trx->error_state;
1668
1583
/* Note that the cascade node is a subnode of another InnoDB
1730
1645
/*********************************************************************//**
1646
Calculates the key number used inside MySQL for an Innobase index. We have
1647
to take into account if we generated a default clustered index for the table
1648
@return the key number used inside MySQL */
1651
row_get_mysql_key_number_for_index(
1652
/*===============================*/
1653
const dict_index_t* index) /*!< in: index */
1655
const dict_index_t* ind;
1661
ind = dict_table_get_first_index(index->table);
1663
while (index != ind) {
1664
ind = dict_table_get_next_index(ind);
1668
if (row_table_got_default_clust_index(index->table)) {
1676
/*********************************************************************//**
1731
1677
Locks the data dictionary in shared mode from modifications, for performing
1732
1678
foreign key check, rollback, or other operation invisible to MySQL. */
1846
1794
trx->op_info = "creating table";
1796
if (row_mysql_is_system_table(table->name)) {
1799
"InnoDB: Error: trying to create a MySQL system"
1800
" table %s of type InnoDB.\n"
1801
"InnoDB: MySQL system tables must be"
1802
" of the MyISAM type!\n",
1807
/* Check that no reserved column names are used. */
1808
for (i = 0; i < dict_table_get_n_user_cols(table); i++) {
1809
if (dict_col_name_is_reserved(
1810
dict_table_get_col_name(table, i))) {
1848
1816
trx_start_if_not_started(trx);
1850
1818
/* The table name is prefixed with the database name and a '/'.
1913
1881
thr = pars_complete_graph_for_exec(node, trx, heap);
1915
ut_a(thr == que_fork_start_command(static_cast<que_fork_t *>(que_node_get_parent(thr))));
1883
ut_a(thr == que_fork_start_command(que_node_get_parent(thr)));
1916
1884
que_run_threads(thr);
1918
1886
err = trx->error_state;
1888
if (UNIV_UNLIKELY(err != DB_SUCCESS)) {
1889
trx->error_state = DB_SUCCESS;
1890
trx_general_rollback_for_mysql(trx, FALSE, NULL);
1923
1894
case DB_OUT_OF_FILE_SPACE:
1924
trx->error_state = DB_SUCCESS;
1925
trx_general_rollback_for_mysql(trx, NULL);
1927
1895
ut_print_timestamp(stderr);
1928
1896
fputs(" InnoDB: Warning: cannot create table ",
1940
1908
case DB_DUPLICATE_KEY:
1909
ut_print_timestamp(stderr);
1910
fputs(" InnoDB: Error: table ", stderr);
1911
ut_print_name(stderr, trx, TRUE, table->name);
1912
fputs(" already exists in InnoDB internal\n"
1913
"InnoDB: data dictionary. Have you deleted"
1915
"InnoDB: and not used DROP TABLE?"
1916
" Have you used DROP DATABASE\n"
1917
"InnoDB: for InnoDB tables in"
1918
" MySQL version <= 3.23.43?\n"
1919
"InnoDB: See the Restrictions section"
1920
" of the InnoDB manual.\n"
1921
"InnoDB: You can drop the orphaned table"
1922
" inside InnoDB by\n"
1923
"InnoDB: creating an InnoDB table with"
1924
" the same name in another\n"
1925
"InnoDB: database and copying the .frm file"
1926
" to the current database.\n"
1927
"InnoDB: Then MySQL thinks the table exists,"
1928
" and DROP TABLE will\n"
1929
"InnoDB: succeed.\n"
1930
"InnoDB: You can look for further help from\n"
1931
"InnoDB: " REFMAN "innodb-troubleshooting.html\n",
1942
1934
/* We may also get err == DB_ERROR if the .ibd file for the
1943
1935
table already exists */
1945
trx->error_state = DB_SUCCESS;
1946
trx_general_rollback_for_mysql(trx, NULL);
1947
dict_mem_table_free(table);
2124
2112
trx_set_dict_operation(trx, TRX_DICT_OP_TABLE);
2126
err = dict_create_foreign_constraints(trx, sql_string, sql_length,
2114
err = dict_create_foreign_constraints(trx, sql_string, name,
2128
2116
if (err == DB_SUCCESS) {
2129
2117
/* Check that also referencing constraints are ok */
2130
err = dict_load_foreigns(name, FALSE, TRUE);
2118
err = dict_load_foreigns(name, TRUE);
2133
2121
if (err != DB_SUCCESS) {
2831
2819
dict_index_t* index;
2833
dict_hdr_get_new_id(NULL, NULL, &space);
2835
/* Lock all index trees for this table. We must
2836
do so after dict_hdr_get_new_id() to preserve
2838
dict_table_x_lock_indexes(table);
2840
if (space == ULINT_UNDEFINED
2841
|| fil_create_new_single_table_tablespace(
2842
space, table->name, FALSE, flags,
2823
if (fil_create_new_single_table_tablespace(
2824
&space, table->name, FALSE, flags,
2843
2825
FIL_IBD_FILE_INITIAL_SIZE) != DB_SUCCESS) {
2844
dict_table_x_unlock_indexes(table);
2845
2826
ut_print_timestamp(stderr);
2846
2827
fprintf(stderr,
2847
2828
" InnoDB: TRUNCATE TABLE %s failed to"
2870
2851
FIL_IBD_FILE_INITIAL_SIZE, &mtr);
2871
2852
mtr_commit(&mtr);
2874
/* Lock all index trees for this table, as we will
2875
truncate the table/index and possibly change their metadata.
2876
All DML/DDL are blocked by table level lock, with
2877
a few exceptions such as queries into information schema
2878
about the table, MySQL could try to access index stats
2879
for this kind of query, we need to use index locks to
2881
dict_table_x_lock_indexes(table);
2884
2856
/* scan SYS_INDEXES for all indexes of the table */
2955
2927
mem_heap_free(heap);
2957
/* Done with index truncation, release index tree locks,
2958
subsequent work relates to table level metadata change */
2959
dict_table_x_unlock_indexes(table);
2961
dict_hdr_get_new_id(&new_id, NULL, NULL);
2929
new_id = dict_hdr_get_new_id(DICT_HDR_TABLE_ID);
2963
2931
info = pars_info_create();
2965
2933
pars_info_add_int4_literal(info, "space", (lint) table->space);
2966
pars_info_add_ull_literal(info, "old_id", table->id);
2967
pars_info_add_ull_literal(info, "new_id", new_id);
2934
pars_info_add_dulint_literal(info, "old_id", table->id);
2935
pars_info_add_dulint_literal(info, "new_id", new_id);
2969
2937
err = que_eval_sql(info,
2970
2938
"PROCEDURE RENUMBER_TABLESPACE_PROC () IS\n"
3214
3181
if (table->n_foreign_key_checks_running > 0) {
3216
const char* i_table_name = table->name;
3183
const char* table_name = table->name;
3219
added = row_add_table_to_background_drop_list(i_table_name);
3186
added = row_add_table_to_background_drop_list(table_name);
3222
3189
ut_print_timestamp(stderr);
3223
3190
fputs(" InnoDB: You are trying to drop table ",
3225
ut_print_name(stderr, trx, TRUE, i_table_name);
3192
ut_print_name(stderr, trx, TRUE, table_name);
3227
3194
"InnoDB: though there is a"
3228
3195
" foreign key check running on it.\n"
3341
3314
space_id = table->space;
3343
3316
if (table->dir_path_of_temp_table != NULL) {
3344
3318
name_or_path = mem_heap_strdup(
3345
3319
heap, table->dir_path_of_temp_table);
3348
3322
name_or_path = name;
3349
is_temp = (table->flags >> DICT_TF2_SHIFT)
3350
& DICT_TF2_TEMPORARY;
3353
3325
dict_table_remove_from_cache(table);
3355
if (dict_load_table(name, TRUE) != NULL) {
3327
if (dict_load_table(name) != NULL) {
3356
3328
ut_print_timestamp(stderr);
3357
3329
fputs(" InnoDB: Error: not able to remove table ",
3399
3371
mem_heap_free(heap);
3402
case DB_TOO_MANY_CONCURRENT_TRXS:
3403
/* Cannot even find a free slot for the
3404
the undo log. We can directly exit here
3405
and return the DB_TOO_MANY_CONCURRENT_TRXS
3409
case DB_OUT_OF_FILE_SPACE:
3410
err = DB_MUST_GET_MORE_FILE_SPACE;
3412
row_mysql_handle_errors(&err, trx, NULL, NULL);
3414
/* Fall through to raise error */
3417
/* No other possible error returns */
3423
3375
if (locked_dictionary) {
3433
3385
return((int) err);
3436
/*********************************************************************//**
3437
Drop all temporary tables during crash recovery. */
3440
row_mysql_drop_temp_tables(void)
3441
/*============================*/
3448
trx = trx_allocate_for_background();
3449
trx->op_info = "dropping temporary tables";
3450
row_mysql_lock_data_dictionary(trx);
3452
heap = mem_heap_create(200);
3456
btr_pcur_open_at_index_side(
3458
dict_table_get_first_index(dict_sys->sys_tables),
3459
BTR_SEARCH_LEAF, &pcur, TRUE, &mtr);
3465
const char* table_name;
3466
dict_table_t* table;
3468
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
3470
if (!btr_pcur_is_on_user_rec(&pcur)) {
3474
rec = btr_pcur_get_rec(&pcur);
3475
field = rec_get_nth_field_old(rec, 4/*N_COLS*/, &len);
3476
if (len != 4 || !(mach_read_from_4(field) & 0x80000000UL)) {
3480
/* Because this is not a ROW_FORMAT=REDUNDANT table,
3481
the is_temp flag is valid. Examine it. */
3483
field = rec_get_nth_field_old(rec, 7/*MIX_LEN*/, &len);
3485
|| !(mach_read_from_4(field) & DICT_TF2_TEMPORARY)) {
3489
/* This is a temporary table. */
3490
field = rec_get_nth_field_old(rec, 0/*NAME*/, &len);
3491
if (len == UNIV_SQL_NULL || len == 0) {
3492
/* Corrupted SYS_TABLES.NAME */
3496
table_name = mem_heap_strdupl(heap, (const char*) field, len);
3498
btr_pcur_store_position(&pcur, &mtr);
3499
btr_pcur_commit_specify_mtr(&pcur, &mtr);
3501
table = dict_load_table(table_name, TRUE);
3504
row_drop_table_for_mysql(table_name, trx, FALSE);
3505
trx_commit_for_mysql(trx);
3509
btr_pcur_restore_position(BTR_SEARCH_LEAF,
3513
btr_pcur_close(&pcur);
3515
mem_heap_free(heap);
3516
row_mysql_unlock_data_dictionary(trx);
3517
trx_free_for_background(trx);
3520
3388
/*******************************************************************//**
3521
3389
Drop all foreign keys in a database, see Bug#18942.
3522
3390
Called at the end of row_drop_database_for_mysql().
4066
3944
constraint is not broken, and calculates the number of index entries
4067
3945
in the read view of the current transaction.
4068
3946
@return TRUE if ok */
4071
row_check_index_for_mysql(
4072
/*======================*/
4073
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct
4075
const dict_index_t* index, /*!< in: index */
4076
ulint* n_rows) /*!< out: number of entries
4077
seen in the consistent read */
3949
row_scan_and_check_index(
3950
/*=====================*/
3951
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct in MySQL */
3952
dict_index_t* index, /*!< in: index */
3953
ulint* n_rows) /*!< out: number of entries seen in the
3954
current consistent read */
4079
3956
dtuple_t* prev_entry = NULL;
4080
3957
ulint matched_fields;
4098
buf = static_cast<byte *>(mem_alloc(UNIV_PAGE_SIZE));
3975
if (!row_merge_is_index_usable(prebuilt->trx, index)) {
3976
/* A newly created index may lack some delete-marked
3977
records that may exist in the read view of
3978
prebuilt->trx. Thus, such indexes must not be
3979
accessed by consistent read. */
3983
buf = mem_alloc(UNIV_PAGE_SIZE);
4099
3984
heap = mem_heap_create(100);
3986
/* Make a dummy template in prebuilt, which we will use
3987
in scanning the index entries */
3989
prebuilt->index = index;
3990
/* row_merge_is_index_usable() was already checked above. */
3991
prebuilt->index_usable = TRUE;
3992
prebuilt->sql_stat_start = TRUE;
3993
prebuilt->template_type = ROW_MYSQL_DUMMY_TEMPLATE;
3994
prebuilt->n_template = 0;
3995
prebuilt->need_to_access_clustered = FALSE;
3997
dtuple_set_n_fields(prebuilt->search_tuple, 0);
3999
prebuilt->select_lock_type = LOCK_NONE;
4103
4002
ret = row_search_for_mysql(buf, PAGE_CUR_G, prebuilt, 0, 0);
4218
4117
/*********************************************************************//**
4118
Checks a table for corruption.
4119
@return DB_ERROR or DB_SUCCESS */
4122
row_check_table_for_mysql(
4123
/*======================*/
4124
row_prebuilt_t* prebuilt) /*!< in: prebuilt struct in MySQL
4127
dict_table_t* table = prebuilt->table;
4128
dict_index_t* index;
4130
ulint n_rows_in_table = ULINT_UNDEFINED;
4131
ulint ret = DB_SUCCESS;
4132
ulint old_isolation_level;
4134
if (table->ibd_file_missing) {
4135
ut_print_timestamp(stderr);
4136
fprintf(stderr, " InnoDB: Error:\n"
4137
"InnoDB: MySQL is trying to use a table handle"
4138
" but the .ibd file for\n"
4139
"InnoDB: table %s does not exist.\n"
4140
"InnoDB: Have you deleted the .ibd file"
4141
" from the database directory under\n"
4142
"InnoDB: the MySQL datadir, or have you"
4143
" used DISCARD TABLESPACE?\n"
4144
"InnoDB: Look from\n"
4145
"InnoDB: " REFMAN "innodb-troubleshooting.html\n"
4146
"InnoDB: how you can resolve the problem.\n",
4151
prebuilt->trx->op_info = "checking table";
4153
old_isolation_level = prebuilt->trx->isolation_level;
4155
/* We must run the index record counts at an isolation level
4156
>= READ COMMITTED, because a dirty read can see a wrong number
4157
of records in some index; to play safe, we use always
4158
REPEATABLE READ here */
4160
prebuilt->trx->isolation_level = TRX_ISO_REPEATABLE_READ;
4162
/* Enlarge the fatal lock wait timeout during CHECK TABLE. */
4163
mutex_enter(&kernel_mutex);
4164
srv_fatal_semaphore_wait_threshold += 7200; /* 2 hours */
4165
mutex_exit(&kernel_mutex);
4167
index = dict_table_get_first_index(table);
4169
while (index != NULL) {
4170
/* fputs("Validating index ", stderr);
4171
ut_print_name(stderr, trx, FALSE, index->name);
4172
putc('\n', stderr); */
4174
if (!btr_validate_index(index, prebuilt->trx)) {
4177
if (!row_scan_and_check_index(prebuilt,index, &n_rows)){
4181
if (trx_is_interrupted(prebuilt->trx)) {
4185
/* fprintf(stderr, "%lu entries in index %s\n", n_rows,
4188
if (index == dict_table_get_first_index(table)) {
4189
n_rows_in_table = n_rows;
4190
} else if (n_rows != n_rows_in_table) {
4194
fputs("Error: ", stderr);
4195
dict_index_name_print(stderr,
4196
prebuilt->trx, index);
4198
" contains %lu entries,"
4201
(ulong) n_rows_in_table);
4205
index = dict_table_get_next_index(index);
4208
/* Restore the original isolation level */
4209
prebuilt->trx->isolation_level = old_isolation_level;
4211
/* We validate also the whole adaptive hash index for all tables
4212
at every CHECK TABLE */
4214
if (!btr_search_validate()) {
4219
/* Restore the fatal lock wait timeout after CHECK TABLE. */
4220
mutex_enter(&kernel_mutex);
4221
srv_fatal_semaphore_wait_threshold -= 7200; /* 2 hours */
4222
mutex_exit(&kernel_mutex);
4224
prebuilt->trx->op_info = "";
4229
/*********************************************************************//**
4219
4230
Determines if a table is a magic monitor table.
4220
4231
@return TRUE if monitor table */