diff options
author | unknown <aivanov@mysql.com> | 2006-03-29 23:04:32 +0400 |
---|---|---|
committer | unknown <aivanov@mysql.com> | 2006-03-29 23:04:32 +0400 |
commit | fd6db50c0b6cd9f150ce0c53bb208ea6cf5ec91d (patch) | |
tree | 78b7b5f8fe975f9280333421e9b343ff4cf20588 /innobase | |
parent | 17d2b065f479aab2162a2d63bc51e3b6638f71d1 (diff) | |
download | mariadb-git-fd6db50c0b6cd9f150ce0c53bb208ea6cf5ec91d.tar.gz |
Applied innodb-5.0-ss368 snapshot
Fixed bugs:
#16814: SHOW INNODB STATUS format error in LATEST FOREIGN KEY ERROR section
dict_foreign_key_error_report(): Always print a newline after invoking
dict_print_info_on_foreign_key_in_create_format().
#16827: Better InnoDB error message if ibdata files omitted from my.cnf.
#17126: CHECK TABLE on InnoDB causes a short hang during check of adaptive hash.
CHECK TABLE blocking other queries, by releasing the btr_search_latch
periodically during the adaptive hash table validation.
#17405: Valgrind: conditional jump or move depends on uninitialised valuesw.
buf_block_init(): Reset magic_n, buf_fix_count, and io_fix to avoid testing
uninitialised variables.
#18077: InnoDB uses full explicit table locks in stored FUNCTION.
#18238: When locks exhaust the buffer pool, InnoDB does not roll back the trx.
Check in pessimistic insert and update if the buffer pool is exhausted by locks.
#18252: Disk space leaks in updates of InnoDB BLOB rows.
btr_cur_pessimistic_update(): Invoke rec_get_offset() after rec_set_field_extern_bits().
btr_store_big_rec_extern_fields(): Note that offsets will no longer be valid
after calling this function.
#18283: When InnoDB returns error 'lock table full', MySQL can write to binlog too much.
#18384: InnoDB memory leak on duplicate key errors if row has many columns.
row_ins_duplicate_error_in_clust(): Call mem_heap_free(heap) at func_exit if needed.
#18350: Use consistent read in CREATE ... SELECT .. if innodb_locks_unsafe_for_binlog is used.
innobase/btr/btr0cur.c:
Applied innodb-5.0-ss368 snapshot
innobase/btr/btr0sea.c:
Applied innodb-5.0-ss368 snapshot
innobase/buf/buf0buf.c:
Applied innodb-5.0-ss368 snapshot
innobase/buf/buf0lru.c:
Applied innodb-5.0-ss368 snapshot
innobase/data/data0type.c:
Applied innodb-5.0-ss368 snapshot
dtype_print(): Fix printing of prtype.
innobase/dict/dict0dict.c:
Applied innodb-5.0-ss368 snapshot
innobase/fil/fil0fil.c:
Applied innodb-5.0-ss368 snapshot
fil_extend_space_to_desired_size(): in UNIV_HOTBACKUP builds,
do not touch srv_data_file_sizes[] or srv_n_data_files.
innobase/ha/ha0ha.c:
Applied innodb-5.0-ss368 snapshot
innobase/include/btr0cur.h:
Applied innodb-5.0-ss368 snapshot
innobase/include/buf0lru.h:
Applied innodb-5.0-ss368 snapshot
innobase/include/ha0ha.h:
Applied innodb-5.0-ss368 snapshot
innobase/include/page0page.ic:
Applied innodb-5.0-ss368 snapshot
Remove UNIV_RELEASE_NOT_YET_STABLE and related checks.
innobase/include/univ.i:
Applied innodb-5.0-ss368 snapshot
Remove UNIV_RELEASES_NOT_YET_STABLE and related checks.
innobase/row/row0ins.c:
Applied innodb-5.0-ss368 snapshot
innobase/row/row0sel.c:
Applied innodb-5.0-ss368 snapshot
Remove UNIV_RELEASE_NOT_YET_STABLE and related checks.
page_rec_is_comp(): Remove the bounds check.
row_sel_field_store_in_mysql_format(): Turn the assertions
on mbminlen, mbmaxlen, and templ->type into debug assertions.
innobase/row/row0upd.c:
Applied innodb-5.0-ss368 snapshot
mysql-test/t/innodb.test:
Applied innodb-5.0-ss368 snapshot
sql/ha_innodb.cc:
Applied innodb-5.0-ss368 snapshot
Fix memory allocation bug (by changing MY_WME to MY_FAE) in get_share.
Also partially fix coding style of the function.
Diffstat (limited to 'innobase')
-rw-r--r-- | innobase/btr/btr0cur.c | 13 | ||||
-rw-r--r-- | innobase/btr/btr0sea.c | 34 | ||||
-rw-r--r-- | innobase/buf/buf0buf.c | 5 | ||||
-rw-r--r-- | innobase/buf/buf0lru.c | 16 | ||||
-rw-r--r-- | innobase/data/data0type.c | 2 | ||||
-rw-r--r-- | innobase/dict/dict0dict.c | 3 | ||||
-rw-r--r-- | innobase/fil/fil0fil.c | 50 | ||||
-rw-r--r-- | innobase/ha/ha0ha.c | 14 | ||||
-rw-r--r-- | innobase/include/btr0cur.h | 5 | ||||
-rw-r--r-- | innobase/include/buf0lru.h | 4 | ||||
-rw-r--r-- | innobase/include/ha0ha.h | 8 | ||||
-rw-r--r-- | innobase/include/page0page.ic | 13 | ||||
-rw-r--r-- | innobase/include/univ.i | 4 | ||||
-rw-r--r-- | innobase/row/row0ins.c | 28 | ||||
-rw-r--r-- | innobase/row/row0sel.c | 10 | ||||
-rw-r--r-- | innobase/row/row0upd.c | 5 |
16 files changed, 143 insertions, 71 deletions
diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index f81cce5b8e9..3d7b6fffb52 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -1915,13 +1915,13 @@ btr_cur_pessimistic_update( ut_a(rec || optim_err != DB_UNDERFLOW); if (rec) { - offsets = rec_get_offsets(rec, index, offsets, - ULINT_UNDEFINED, &heap); - lock_rec_restore_from_page_infimum(rec, page); rec_set_field_extern_bits(rec, index, ext_vect, n_ext_vect, mtr); - + + offsets = rec_get_offsets(rec, index, offsets, + ULINT_UNDEFINED, &heap); + if (!rec_get_deleted_flag(rec, rec_offs_comp(offsets))) { /* The new inserted record owns its possible externally stored fields */ @@ -3329,7 +3329,10 @@ btr_store_big_rec_extern_fields( dict_index_t* index, /* in: index of rec; the index tree MUST be X-latched */ rec_t* rec, /* in: record */ - const ulint* offsets, /* in: rec_get_offsets(rec, index) */ + const ulint* offsets, /* in: rec_get_offsets(rec, index); + the "external storage" flags in offsets + will not correspond to rec when + this function returns */ big_rec_t* big_rec_vec, /* in: vector containing fields to be stored externally */ mtr_t* local_mtr __attribute__((unused))) /* in: mtr diff --git a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c index 32e22aa51bc..937883b58e1 100644 --- a/innobase/btr/btr0sea.c +++ b/innobase/btr/btr0sea.c @@ -1600,14 +1600,29 @@ btr_search_validate(void) ulint n_page_dumps = 0; ibool ok = TRUE; ulint i; + ulint cell_count; mem_heap_t* heap = NULL; ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint* offsets = offsets_; *offsets_ = (sizeof offsets_) / sizeof *offsets_; + + /* How many cells to check before temporarily releasing + btr_search_latch. */ + ulint chunk_size = 10000; rw_lock_x_lock(&btr_search_latch); - for (i = 0; i < hash_get_n_cells(btr_search_sys->hash_index); i++) { + cell_count = hash_get_n_cells(btr_search_sys->hash_index); + + for (i = 0; i < cell_count; i++) { + /* We release btr_search_latch every once in a while to + give other queries a chance to run. */ + if ((i != 0) && ((i % chunk_size) == 0)) { + rw_lock_x_unlock(&btr_search_latch); + os_thread_yield(); + rw_lock_x_lock(&btr_search_latch); + } + node = hash_get_nth_cell(btr_search_sys->hash_index, i)->node; while (node != NULL) { @@ -1660,10 +1675,21 @@ btr_search_validate(void) node = node->next; } } - - if (!ha_validate(btr_search_sys->hash_index)) { - ok = FALSE; + for (i = 0; i < cell_count; i += chunk_size) { + ulint end_index = ut_min(i + chunk_size - 1, cell_count - 1); + + /* We release btr_search_latch every once in a while to + give other queries a chance to run. */ + if (i != 0) { + rw_lock_x_unlock(&btr_search_latch); + os_thread_yield(); + rw_lock_x_lock(&btr_search_latch); + } + + if (!ha_validate(btr_search_sys->hash_index, i, end_index)) { + ok = FALSE; + } } rw_lock_x_unlock(&btr_search_latch); diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c index 3a3b64dd51b..99509a89de0 100644 --- a/innobase/buf/buf0buf.c +++ b/innobase/buf/buf0buf.c @@ -464,12 +464,17 @@ buf_block_init( byte* frame) /* in: pointer to buffer frame, or NULL if in the case of AWE there is no frame */ { + block->magic_n = 0; + block->state = BUF_BLOCK_NOT_USED; block->frame = frame; block->awe_info = NULL; + block->buf_fix_count = 0; + block->io_fix = 0; + block->modify_clock = ut_dulint_zero; block->file_page_was_freed = FALSE; diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c index a0157da2d42..8b135cc5db3 100644 --- a/innobase/buf/buf0lru.c +++ b/innobase/buf/buf0lru.c @@ -294,14 +294,14 @@ buf_LRU_try_free_flushed_blocks(void) } /********************************************************************** -Returns TRUE if less than 15 % of the buffer pool is available. This can be +Returns TRUE if less than 25 % of the buffer pool is available. This can be used in heuristics to prevent huge transactions eating up the whole buffer pool for their locks. */ ibool buf_LRU_buf_pool_running_out(void) /*==============================*/ - /* out: TRUE if less than 15 % of buffer pool + /* out: TRUE if less than 25 % of buffer pool left */ { ibool ret = FALSE; @@ -309,7 +309,7 @@ buf_LRU_buf_pool_running_out(void) mutex_enter(&(buf_pool->mutex)); if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free) - + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 7) { + + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 4) { ret = TRUE; } @@ -340,11 +340,11 @@ loop: mutex_enter(&(buf_pool->mutex)); if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free) - + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 10) { + + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 20) { ut_print_timestamp(stderr); fprintf(stderr, -" InnoDB: ERROR: over 9 / 10 of the buffer pool is occupied by\n" +" InnoDB: ERROR: over 95 percent of the buffer pool is occupied by\n" "InnoDB: lock heaps or the adaptive hash index! Check that your\n" "InnoDB: transactions do not set too many row locks.\n" "InnoDB: Your buffer pool size is %lu MB. Maybe you should make\n" @@ -356,17 +356,17 @@ loop: ut_error; } else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free) - + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 5) { + + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 3) { if (!buf_lru_switched_on_innodb_mon) { - /* Over 80 % of the buffer pool is occupied by lock + /* Over 67 % of the buffer pool is occupied by lock heaps or the adaptive hash index. This may be a memory leak! */ ut_print_timestamp(stderr); fprintf(stderr, -" InnoDB: WARNING: over 4 / 5 of the buffer pool is occupied by\n" +" InnoDB: WARNING: over 67 percent of the buffer pool is occupied by\n" "InnoDB: lock heaps or the adaptive hash index! Check that your\n" "InnoDB: transactions do not set too many row locks.\n" "InnoDB: Your buffer pool size is %lu MB. Maybe you should make\n" diff --git a/innobase/data/data0type.c b/innobase/data/data0type.c index d4264ad2926..8619367e944 100644 --- a/innobase/data/data0type.c +++ b/innobase/data/data0type.c @@ -252,7 +252,7 @@ dtype_print( } else if (prtype == DATA_ENGLISH) { fputs("DATA_ENGLISH", stderr); } else { - fprintf(stderr, "prtype %lu", (ulong) mtype); + fprintf(stderr, "prtype %lu", (ulong) prtype); } } diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 58c4e3ed6a3..653addd9ede 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -2194,8 +2194,9 @@ dict_foreign_error_report( fputs(msg, file); fputs(" Constraint:\n", file); dict_print_info_on_foreign_key_in_create_format(file, NULL, fk, TRUE); + putc('\n', file); if (fk->foreign_index) { - fputs("\nThe index in the foreign key in table is ", file); + fputs("The index in the foreign key in table is ", file); ut_print_name(file, NULL, fk->foreign_index->name); fputs( "\nSee http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n" diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 69c076d78f3..cfd9813101d 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -3557,6 +3557,7 @@ fil_extend_space_to_desired_size( *actual_size = space->size; +#ifndef UNIV_HOTBACKUP if (space_id == 0) { ulint pages_per_mb = (1024 * 1024) / UNIV_PAGE_SIZE; @@ -3566,6 +3567,7 @@ fil_extend_space_to_desired_size( srv_data_file_sizes[srv_n_data_files - 1] = (node->size / pages_per_mb) * pages_per_mb; } +#endif /* !UNIV_HOTBACKUP */ /* printf("Extended %s to %lu, actual size %lu pages\n", space->name, @@ -3821,6 +3823,31 @@ fil_node_complete_io( } /************************************************************************ +Report information about an invalid page access. */ +static +void +fil_report_invalid_page_access( +/*===========================*/ + ulint block_offset, /* in: block offset */ + ulint space_id, /* in: space id */ + const char* space_name, /* in: space name */ + ulint byte_offset, /* in: byte offset */ + ulint len, /* in: I/O length */ + ulint type) /* in: I/O type */ +{ + fprintf(stderr, + "InnoDB: Error: trying to access page number %lu in space %lu,\n" + "InnoDB: space name %s,\n" + "InnoDB: which is outside the tablespace bounds.\n" + "InnoDB: Byte offset %lu, len %lu, i/o type %lu.\n" + "InnoDB: If you get this error at mysqld startup, please check that\n" + "InnoDB: your my.cnf matches the ibdata files that you have in the\n" + "InnoDB: MySQL server.\n", + (ulong) block_offset, (ulong) space_id, space_name, + (ulong) byte_offset, (ulong) len, (ulong) type); +} + +/************************************************************************ Reads or writes data. This operation is asynchronous (aio). */ ulint @@ -3926,14 +3953,8 @@ fil_io( for (;;) { if (node == NULL) { - fprintf(stderr, - "InnoDB: Error: trying to access page number %lu in space %lu,\n" - "InnoDB: space name %s,\n" - "InnoDB: which is outside the tablespace bounds.\n" - "InnoDB: Byte offset %lu, len %lu, i/o type %lu\n", - (ulong) block_offset, (ulong) space_id, - space->name, (ulong) byte_offset, (ulong) len, - (ulong) type); + fil_report_invalid_page_access(block_offset, space_id, + space->name, byte_offset, len, type); ut_error; } @@ -3962,15 +3983,10 @@ fil_io( if (space->purpose == FIL_TABLESPACE && space->id != 0 && node->size <= block_offset) { - fprintf(stderr, - "InnoDB: Error: trying to access page number %lu in space %lu,\n" - "InnoDB: space name %s,\n" - "InnoDB: which is outside the tablespace bounds.\n" - "InnoDB: Byte offset %lu, len %lu, i/o type %lu\n", - (ulong) block_offset, (ulong) space_id, - space->name, (ulong) byte_offset, (ulong) len, - (ulong) type); - ut_a(0); + fil_report_invalid_page_access(block_offset, space_id, + space->name, byte_offset, len, type); + + ut_error; } /* Now we have made the changes in the data structures of system */ diff --git a/innobase/ha/ha0ha.c b/innobase/ha/ha0ha.c index ad1391ff83e..ab565acd64f 100644 --- a/innobase/ha/ha0ha.c +++ b/innobase/ha/ha0ha.c @@ -276,20 +276,26 @@ ha_remove_all_nodes_to_page( } /***************************************************************** -Validates a hash table. */ +Validates a given range of the cells in hash table. */ ibool ha_validate( /*========*/ - /* out: TRUE if ok */ - hash_table_t* table) /* in: hash table */ + /* out: TRUE if ok */ + hash_table_t* table, /* in: hash table */ + ulint start_index, /* in: start index */ + ulint end_index) /* in: end index */ { hash_cell_t* cell; ha_node_t* node; ibool ok = TRUE; ulint i; - for (i = 0; i < hash_get_n_cells(table); i++) { + ut_a(start_index <= end_index); + ut_a(start_index < hash_get_n_cells(table)); + ut_a(end_index < hash_get_n_cells(table)); + + for (i = start_index; i <= end_index; i++) { cell = hash_get_nth_cell(table, i); diff --git a/innobase/include/btr0cur.h b/innobase/include/btr0cur.h index 352d1739b6a..bc528d48fb0 100644 --- a/innobase/include/btr0cur.h +++ b/innobase/include/btr0cur.h @@ -459,7 +459,10 @@ btr_store_big_rec_extern_fields( dict_index_t* index, /* in: index of rec; the index tree MUST be X-latched */ rec_t* rec, /* in: record */ - const ulint* offsets, /* in: rec_get_offsets(rec, index) */ + const ulint* offsets, /* in: rec_get_offsets(rec, index); + the "external storage" flags in offsets + will not correspond to rec when + this function returns */ big_rec_t* big_rec_vec, /* in: vector containing fields to be stored externally */ mtr_t* local_mtr); /* in: mtr containing the latch to diff --git a/innobase/include/buf0lru.h b/innobase/include/buf0lru.h index fb29b44ba98..790bf65c698 100644 --- a/innobase/include/buf0lru.h +++ b/innobase/include/buf0lru.h @@ -26,14 +26,14 @@ void buf_LRU_try_free_flushed_blocks(void); /*==================================*/ /********************************************************************** -Returns TRUE if less than 15 % of the buffer pool is available. This can be +Returns TRUE if less than 25 % of the buffer pool is available. This can be used in heuristics to prevent huge transactions eating up the whole buffer pool for their locks. */ ibool buf_LRU_buf_pool_running_out(void); /*==============================*/ - /* out: TRUE if less than 15 % of buffer pool + /* out: TRUE if less than 25 % of buffer pool left */ /*####################################################################### diff --git a/innobase/include/ha0ha.h b/innobase/include/ha0ha.h index bdaecfcc57a..0f38f30dd38 100644 --- a/innobase/include/ha0ha.h +++ b/innobase/include/ha0ha.h @@ -114,13 +114,15 @@ ha_remove_all_nodes_to_page( ulint fold, /* in: fold value */ page_t* page); /* in: buffer page */ /***************************************************************** -Validates a hash table. */ +Validates a given range of the cells in hash table. */ ibool ha_validate( /*========*/ - /* out: TRUE if ok */ - hash_table_t* table); /* in: hash table */ + /* out: TRUE if ok */ + hash_table_t* table, /* in: hash table */ + ulint start_index, /* in: start index */ + ulint end_index); /* in: end index */ /***************************************************************** Prints info of a hash table. */ diff --git a/innobase/include/page0page.ic b/innobase/include/page0page.ic index 655ff245aa8..fd5281fdbec 100644 --- a/innobase/include/page0page.ic +++ b/innobase/include/page0page.ic @@ -175,19 +175,6 @@ page_rec_is_comp( /* out: nonzero if in compact format */ const rec_t* rec) /* in: record */ { -#ifdef UNIV_RELEASE_NOT_YET_STABLE - if (UNIV_UNLIKELY((ulint)rec < (ulint)(buf_pool->frame_zero)) - || UNIV_UNLIKELY((ulint)rec >= (ulint)(buf_pool->high_end))) { - - ut_print_timestamp(stderr); - fprintf(stderr, -"InnoDB: Error: trying to read a stray page rec %p\n" -"InnoDB: buf pool start is at %p, end at %p\n", - rec, buf_pool->frame_zero, - buf_pool->high_end); - ut_error; - } -#endif return(page_is_comp(ut_align_down((rec_t*) rec, UNIV_PAGE_SIZE))); } diff --git a/innobase/include/univ.i b/innobase/include/univ.i index dd4862b3808..04b254a8221 100644 --- a/innobase/include/univ.i +++ b/innobase/include/univ.i @@ -80,10 +80,6 @@ memory is read outside the allocated blocks. */ /* Make a non-inline debug version */ -/* You can remove this define when the release is stable. This define adds -some consistency checks to code. They use a little CPU time. */ -#define UNIV_RELEASE_NOT_YET_STABLE - /* #define UNIV_DEBUG #define UNIV_MEM_DEBUG diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index be1a48a4b46..33d2aa97531 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -28,6 +28,7 @@ Created 4/20/1996 Heikki Tuuri #include "eval0eval.h" #include "data0data.h" #include "usr0sess.h" +#include "buf0lru.h" #define ROW_INS_PREV 1 #define ROW_INS_NEXT 2 @@ -278,10 +279,17 @@ row_ins_sec_index_entry_by_modify( } } else { ut_a(mode == BTR_MODIFY_TREE); + if (buf_LRU_buf_pool_running_out()) { + + err = DB_LOCK_TABLE_FULL; + + goto func_exit; + } + err = btr_cur_pessimistic_update(BTR_KEEP_SYS_FLAG, cursor, &dummy_big_rec, update, 0, thr, mtr); } - +func_exit: mem_heap_free(heap); return(err); @@ -342,10 +350,16 @@ row_ins_clust_index_entry_by_modify( } } else { ut_a(mode == BTR_MODIFY_TREE); + if (buf_LRU_buf_pool_running_out()) { + + err = DB_LOCK_TABLE_FULL; + + goto func_exit; + } err = btr_cur_pessimistic_update(0, cursor, big_rec, update, 0, thr, mtr); } - +func_exit: mem_heap_free(heap); return(err); @@ -1860,7 +1874,6 @@ row_ins_duplicate_error_in_clust( err = DB_DUPLICATE_KEY; goto func_exit; } - mem_heap_free(heap); } ut_a(!(cursor->index->type & DICT_CLUSTERED)); @@ -1869,6 +1882,9 @@ row_ins_duplicate_error_in_clust( err = DB_SUCCESS; func_exit: + if (UNIV_LIKELY_NULL(heap)) { + mem_heap_free(heap); + } return(err); #else /* UNIV_HOTBACKUP */ /* This function depends on MySQL code that is not included in @@ -2068,6 +2084,12 @@ row_ins_index_entry_low( &insert_rec, &big_rec, thr, &mtr); } else { ut_a(mode == BTR_MODIFY_TREE); + if (buf_LRU_buf_pool_running_out()) { + + err = DB_LOCK_TABLE_FULL; + + goto function_exit; + } err = btr_cur_pessimistic_insert(0, &cursor, entry, &insert_rec, &big_rec, thr, &mtr); } diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index d25023dc6be..1402d3aaba6 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -2358,16 +2358,16 @@ row_sel_field_store_in_mysql_format( } else if (templ->type == DATA_MYSQL) { memcpy(dest, data, len); - ut_a(templ->mysql_col_len >= len); - ut_a(templ->mbmaxlen >= templ->mbminlen); + ut_ad(templ->mysql_col_len >= len); + ut_ad(templ->mbmaxlen >= templ->mbminlen); - ut_a(templ->mbmaxlen > templ->mbminlen + ut_ad(templ->mbmaxlen > templ->mbminlen || templ->mysql_col_len == len); /* The following assertion would fail for old tables containing UTF-8 ENUM columns due to Bug #9526. */ ut_ad(!templ->mbmaxlen || !(templ->mysql_col_len % templ->mbmaxlen)); - ut_a(len * templ->mbmaxlen >= templ->mysql_col_len); + ut_ad(len * templ->mbmaxlen >= templ->mysql_col_len); if (templ->mbminlen != templ->mbmaxlen) { /* Pad with spaces. This undoes the stripping @@ -2377,7 +2377,7 @@ row_sel_field_store_in_mysql_format( memset(dest + len, 0x20, templ->mysql_col_len - len); } } else { - ut_a(templ->type == DATA_CHAR + ut_ad(templ->type == DATA_CHAR || templ->type == DATA_FIXBINARY /*|| templ->type == DATA_SYS_CHILD || templ->type == DATA_SYS*/ diff --git a/innobase/row/row0upd.c b/innobase/row/row0upd.c index ff1ad1dfd05..b7a4b3418c1 100644 --- a/innobase/row/row0upd.c +++ b/innobase/row/row0upd.c @@ -28,6 +28,7 @@ Created 12/27/1996 Heikki Tuuri #include "log0log.h" #include "pars0sym.h" #include "eval0eval.h" +#include "buf0lru.h" /* What kind of latch and lock can we assume when the control comes to @@ -1523,6 +1524,10 @@ row_upd_clust_rec( return(err); } + if (buf_LRU_buf_pool_running_out()) { + + return(DB_LOCK_TABLE_FULL); + } /* We may have to modify the tree structure: do a pessimistic descent down the index tree */ |