diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2023-03-06 16:06:52 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2023-03-06 16:06:52 +0200 |
commit | c5fdb988b7419ec953f2365a1ecff2fe6ccb3200 (patch) | |
tree | 0cb9783ae9dfc275cbe3bcff0fd97aba05d93284 | |
parent | 2d6a806367a8284fe3636d3aa5a89850081c4a8a (diff) | |
parent | 9267160c11aea65c4734141547354b23053e284f (diff) | |
download | mariadb-git-c5fdb988b7419ec953f2365a1ecff2fe6ccb3200.tar.gz |
Merge 10.11 into 11.0
31 files changed, 233 insertions, 158 deletions
diff --git a/include/m_ctype.h b/include/m_ctype.h index 554a7de8e56..708107ff120 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -96,7 +96,7 @@ typedef struct casefold_info_char_t struct casefold_info_st { my_wc_t maxchar; - MY_CASEFOLD_CHARACTER **page; + const MY_CASEFOLD_CHARACTER * const *page; }; diff --git a/mysql-test/include/not_valgrind_build.inc b/mysql-test/include/not_valgrind_build.inc index 2b60f11bfc7..b62a1bc953b 100644 --- a/mysql-test/include/not_valgrind_build.inc +++ b/mysql-test/include/not_valgrind_build.inc @@ -1,4 +1,4 @@ -if (`select version() like '%valgrind%'`) +if (`select version() like '%valgrind%' || version() like '%asan%'`) { - skip Does not run with binaries built with valgrind; + skip Does not run with binaries built with valgrind or asan; } diff --git a/mysql-test/suite/sys_vars/t/innodb_log_checkpoint_now_basic.test b/mysql-test/suite/sys_vars/t/innodb_log_checkpoint_now_basic.test index 331803fff86..f59ebf649c3 100644 --- a/mysql-test/suite/sys_vars/t/innodb_log_checkpoint_now_basic.test +++ b/mysql-test/suite/sys_vars/t/innodb_log_checkpoint_now_basic.test @@ -1,5 +1,7 @@ --source include/have_innodb.inc --source include/have_debug.inc +# Valgrind builds may block on this one +--source include/not_valgrind.inc SET @start_global_value = @@global.innodb_log_checkpoint_now; SELECT @start_global_value; diff --git a/mysys/mulalloc.c b/mysys/mulalloc.c index 357f9315f2b..51f8d61b574 100644 --- a/mysys/mulalloc.c +++ b/mysys/mulalloc.c @@ -17,6 +17,11 @@ #include "mysys_priv.h" #include <stdarg.h> +#ifndef DBUG_OFF +/* Put a protected barrier after every element when using my_multi_malloc() */ +#define ALLOC_BARRIER +#endif + /* Malloc many pointers at the same time Only ptr1 can be free'd, and doing this will free all @@ -45,6 +50,9 @@ void* my_multi_malloc(PSI_memory_key key, myf myFlags, ...) { length=va_arg(args,uint); tot_length+=ALIGN_SIZE(length); +#ifdef ALLOC_BARRIER + tot_length+= ALIGN_SIZE(1); +#endif } va_end(args); @@ -58,6 +66,10 @@ void* my_multi_malloc(PSI_memory_key key, myf myFlags, ...) *ptr=res; length=va_arg(args,uint); res+=ALIGN_SIZE(length); +#ifdef ALLOC_BARRIER + TRASH_FREE(res, ALIGN_SIZE(1)); + res+= ALIGN_SIZE(1); +#endif } va_end(args); DBUG_RETURN((void*) start); @@ -89,6 +101,9 @@ void *my_multi_malloc_large(PSI_memory_key key, myf myFlags, ...) { length=va_arg(args,ulonglong); tot_length+=ALIGN_SIZE(length); +#ifdef ALLOC_BARRIER + tot_length+= ALIGN_SIZE(1); +#endif } va_end(args); @@ -102,6 +117,10 @@ void *my_multi_malloc_large(PSI_memory_key key, myf myFlags, ...) *ptr=res; length=va_arg(args,ulonglong); res+=ALIGN_SIZE(length); +#ifdef ALLOC_BARRIER + TRASH_FREE(res, ALIGN_SIZE(1)); + res+= ALIGN_SIZE(1); +#endif } va_end(args); DBUG_RETURN((void*) start); diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c index a5b855f9604..43f26751f27 100644 --- a/mysys/my_alloc.c +++ b/mysys/my_alloc.c @@ -28,6 +28,11 @@ #undef EXTRA_DEBUG #define EXTRA_DEBUG +#ifndef DBUG_OFF +/* Put a protected barrier after every element when using multi_alloc_root() */ +#define ALLOC_BARRIER +#endif + /* data packed in MEM_ROOT -> min_malloc */ /* Don't allocate too small blocks */ @@ -396,6 +401,9 @@ void *multi_alloc_root(MEM_ROOT *root, ...) { length= va_arg(args, uint); tot_length+= ALIGN_SIZE(length); +#ifdef ALLOC_BARRIER + tot_length+= ALIGN_SIZE(1); +#endif } va_end(args); @@ -409,6 +417,10 @@ void *multi_alloc_root(MEM_ROOT *root, ...) *ptr= res; length= va_arg(args, uint); res+= ALIGN_SIZE(length); +#ifdef ALLOC_BARRIER + TRASH_FREE(res, ALIGN_SIZE(1)); + res+= ALIGN_SIZE(1); +#endif } va_end(args); DBUG_RETURN((void*) start); diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index c6bbf611da9..34cc25f9058 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -4306,6 +4306,7 @@ bool setup_sj_materialization_part1(JOIN_TAB *sjm_tab) } sjm->sjm_table_param.field_count= subq_select->item_list.elements; + sjm->sjm_table_param.func_count= sjm->sjm_table_param.field_count; sjm->sjm_table_param.force_not_null_cols= TRUE; if (!(sjm->table= create_tmp_table(thd, &sjm->sjm_table_param, @@ -5922,14 +5923,14 @@ TABLE *create_dummy_tmp_table(THD *thd) DBUG_ENTER("create_dummy_tmp_table"); TABLE *table; TMP_TABLE_PARAM sjm_table_param; - sjm_table_param.init(); - sjm_table_param.field_count= 1; List<Item> sjm_table_cols; const LEX_CSTRING dummy_name= { STRING_WITH_LEN("dummy") }; Item *column_item= new (thd->mem_root) Item_int(thd, 1); if (!column_item) DBUG_RETURN(NULL); + sjm_table_param.init(); + sjm_table_param.field_count= sjm_table_param.func_count= 1; sjm_table_cols.push_back(column_item, thd->mem_root); if (!(table= create_tmp_table(thd, &sjm_table_param, sjm_table_cols, (ORDER*) 0, diff --git a/sql/select_handler.cc b/sql/select_handler.cc index 795ed8eb641..b0b8e58623d 100644 --- a/sql/select_handler.cc +++ b/sql/select_handler.cc @@ -51,18 +51,19 @@ select_handler::~select_handler() TABLE *select_handler::create_tmp_table(THD *thd, SELECT_LEX *select) { - DBUG_ENTER("select_handler::create_tmp_table"); List<Item> types; TMP_TABLE_PARAM tmp_table_param; + TABLE *table; + DBUG_ENTER("select_handler::create_tmp_table"); + if (select->master_unit()->join_union_item_types(thd, types, 1)) DBUG_RETURN(NULL); tmp_table_param.init(); - tmp_table_param.field_count= types.elements; - - TABLE *table= ::create_tmp_table(thd, &tmp_table_param, types, - (ORDER *) 0, false, 0, - TMP_TABLE_ALL_COLUMNS, 1, - &empty_clex_str, true, false); + tmp_table_param.field_count= tmp_table_param.func_count= types.elements; + table= ::create_tmp_table(thd, &tmp_table_param, types, + (ORDER *) 0, false, 0, + TMP_TABLE_ALL_COLUMNS, 1, + &empty_clex_str, true, false); DBUG_RETURN(table); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 79db032c937..c6a929d6fea 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -4285,6 +4285,7 @@ create_result_table(THD *thd_arg, List<Item> *column_types, { DBUG_ASSERT(table == 0); tmp_table_param.field_count= column_types->elements; + tmp_table_param.func_count= tmp_table_param.field_count; tmp_table_param.bit_fields_as_long= bit_fields_as_long; if (! (table= create_tmp_table(thd_arg, &tmp_table_param, *column_types, diff --git a/sql/sql_class.h b/sql/sql_class.h index bbadff29110..089b9ce5dbe 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -6300,6 +6300,7 @@ public: @see opt_sum_query, count_field_types */ uint sum_func_count; + uint copy_func_count; // Allocated copy fields uint hidden_field_count; uint group_parts,group_length,group_null_parts; diff --git a/sql/sql_expression_cache.cc b/sql/sql_expression_cache.cc index bc44ecd79fa..69d85f3343d 100644 --- a/sql/sql_expression_cache.cc +++ b/sql/sql_expression_cache.cc @@ -114,7 +114,7 @@ void Expression_cache_tmptable::init() cache_table_param.init(); /* dependent items and result */ - cache_table_param.field_count= items.elements; + cache_table_param.field_count= cache_table_param.func_count= items.elements; /* postpone table creation to index description */ cache_table_param.skip_create_table= 1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 78d59493f97..ae732dcd817 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3590,7 +3590,8 @@ bool JOIN::make_aggr_tables_info() if (gbh) { - if (!(pushdown_query= new (thd->mem_root) Pushdown_query(select_lex, gbh))) + if (!(pushdown_query= new (thd->mem_root) Pushdown_query(select_lex, + gbh))) DBUG_RETURN(1); /* We must store rows in the tmp table if we need to do an ORDER BY @@ -3610,6 +3611,7 @@ bool JOIN::make_aggr_tables_info() if (!(curr_tab->tmp_table_param= new TMP_TABLE_PARAM(tmp_table_param))) DBUG_RETURN(1); + curr_tab->tmp_table_param->func_count= all_fields.elements; TABLE* table= create_tmp_table(thd, curr_tab->tmp_table_param, all_fields, NULL, distinct, @@ -20663,6 +20665,7 @@ TABLE *Create_tmp_table::start(THD *thd, */ if (param->precomputed_group_by) copy_func_count+= param->sum_func_count; + param->copy_func_count= copy_func_count; init_sql_alloc(key_memory_TABLE, &own_root, TABLE_ALLOC_BLOCK_SIZE, 0, MYF(MY_THREAD_SPECIFIC)); @@ -20869,8 +20872,9 @@ bool Create_tmp_table::add_fields(THD *thd, We here distinguish between UNION and multi-table-updates by the fact that in the later case group is set to the row pointer. - The test for item->marker == 4 is ensure we don't create a group-by - key over a bit field as heap tables can't handle that. + The test for item->marker == MARKER_NULL_KEY is ensure we + don't create a group-by key over a bit field as heap tables + can't handle that. */ DBUG_ASSERT(!param->schema_table); Field *new_field= @@ -20937,6 +20941,7 @@ bool Create_tmp_table::add_fields(THD *thd, new_field->flags|= FIELD_PART_OF_TMP_UNIQUE; } } + DBUG_ASSERT(fieldnr == m_field_count[other] + m_field_count[distinct]); DBUG_ASSERT(m_blob_count == m_blobs_count[other] + m_blobs_count[distinct]); share->fields= fieldnr; @@ -20945,6 +20950,8 @@ bool Create_tmp_table::add_fields(THD *thd, share->blob_field[m_blob_count]= 0; // End marker copy_func[0]= 0; // End marker param->func_count= (uint) (copy_func - param->items_to_copy); + DBUG_ASSERT(param->func_count <= param->copy_func_count); + share->column_bitmap_size= bitmap_buffer_size(share->fields); thd->mem_root= mem_root_save; @@ -28485,6 +28492,11 @@ bool JOIN::rollup_init() Item **ref_array; tmp_table_param.quick_group= 0; // Can't create groups in tmp table + /* + Each group can potentially be replaced with Item_func_rollup_const() which + needs a copy_func placeholder. + */ + tmp_table_param.func_count+= send_group_parts; rollup.state= ROLLUP::STATE_INITED; /* @@ -28509,7 +28521,6 @@ bool JOIN::rollup_init() ref_array= (Item**) (rollup.ref_pointer_arrays+send_group_parts); - /* Prepare space for field list for the different levels These will be filled up in rollup_make_fields() @@ -28673,7 +28684,6 @@ bool JOIN::rollup_make_fields(List<Item> &fields_arg, List<Item> &sel_fields, /* Point to first hidden field */ uint ref_array_ix= fields_arg.elements-1; - /* Remember where the sum functions ends for the previous level */ sum_funcs_end[pos+1]= *func; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index e4bef08f314..8879d5f61c1 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -8403,27 +8403,34 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) TABLE *table; ST_SCHEMA_TABLE *schema_table= table_list->schema_table; ST_FIELD_INFO *fields= schema_table->fields_info; - bool need_all_fieds= table_list->schema_table_reformed || // SHOW command + bool need_all_fields= table_list->schema_table_reformed || // SHOW command thd->lex->only_view_structure(); // need table structure + bool keep_row_order; + TMP_TABLE_PARAM *tmp_table_param; + SELECT_LEX *select_lex; DBUG_ENTER("create_schema_table"); for (; !fields->end_marker(); fields++) field_count++; - TMP_TABLE_PARAM *tmp_table_param = new (thd->mem_root) TMP_TABLE_PARAM; + tmp_table_param = new (thd->mem_root) TMP_TABLE_PARAM; tmp_table_param->init(); tmp_table_param->table_charset= system_charset_info; tmp_table_param->field_count= field_count; tmp_table_param->schema_table= 1; - SELECT_LEX *select_lex= table_list->select_lex; - bool keep_row_order= is_show_command(thd); - if (!(table= create_tmp_table_for_schema(thd, tmp_table_param, *schema_table, - (select_lex->options | thd->variables.option_bits | TMP_TABLE_ALL_COLUMNS), - table_list->alias, !need_all_fieds, keep_row_order))) + select_lex= table_list->select_lex; + keep_row_order= is_show_command(thd); + if (!(table= + create_tmp_table_for_schema(thd, tmp_table_param, *schema_table, + (select_lex->options | + thd->variables.option_bits | + TMP_TABLE_ALL_COLUMNS), + table_list->alias, !need_all_fields, + keep_row_order))) DBUG_RETURN(0); my_bitmap_map* bitmaps= (my_bitmap_map*) thd->alloc(bitmap_buffer_size(field_count)); - my_bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count); + my_bitmap_init(&table->def_read_set, bitmaps, field_count); table->read_set= &table->def_read_set; bitmap_clear_all(table->read_set); table_list->schema_table_param= tmp_table_param; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 75b7790f557..c1f28baeb25 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -344,6 +344,7 @@ select_unit::create_result_table(THD *thd_arg, List<Item> *column_types, DBUG_ASSERT(table == 0); tmp_table_param.init(); tmp_table_param.field_count= column_types->elements; + tmp_table_param.func_count= tmp_table_param.field_count; tmp_table_param.bit_fields_as_long= bit_fields_as_long; tmp_table_param.hidden_field_count= hidden; @@ -382,7 +383,8 @@ select_union_recursive::create_result_table(THD *thd_arg, return true; incr_table_param.init(); - incr_table_param.field_count= column_types->elements; + incr_table_param.field_count= incr_table_param.func_count= + column_types->elements; incr_table_param.bit_fields_as_long= bit_fields_as_long; if (! (incr_table= create_tmp_table(thd_arg, &incr_table_param, *column_types, (ORDER*) 0, false, 1, diff --git a/sql/temporary_tables.cc b/sql/temporary_tables.cc index b43a38e7fa2..c69059f8712 100644 --- a/sql/temporary_tables.cc +++ b/sql/temporary_tables.cc @@ -921,9 +921,8 @@ bool THD::has_temporary_tables() uint THD::create_tmp_table_def_key(char *key, const char *db, const char *table_name) { - DBUG_ENTER("THD::create_tmp_table_def_key"); - uint key_length; + DBUG_ENTER("THD::create_tmp_table_def_key"); key_length= tdc_create_key(key, db, table_name); int4store(key + key_length, variables.server_id); @@ -1172,11 +1171,10 @@ TABLE *THD::open_temporary_table(TMP_TABLE_SHARE *share, */ bool THD::find_and_use_tmp_table(const TABLE_LIST *tl, TABLE **out_table) { - DBUG_ENTER("THD::find_and_use_tmp_table"); - char key[MAX_DBKEY_LENGTH]; uint key_length; bool result; + DBUG_ENTER("THD::find_and_use_tmp_table"); key_length= create_tmp_table_def_key(key, tl->get_db_name(), tl->get_table_name()); diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 36dc578dc7f..2941a765fa4 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -969,9 +969,10 @@ dberr_t btr_cur_t::search_leaf(const dtuple_t *tuple, page_cur_mode_t mode, # ifdef UNIV_SEARCH_PERF_STAT info->n_searches++; # endif + bool ahi_enabled= btr_search_enabled; /* We do a dirty read of btr_search_enabled below, and btr_search_guess_on_hash() will have to check it again. */ - if (!btr_search_enabled); + if (!ahi_enabled); else if (btr_search_guess_on_hash(index(), info, tuple, mode, latch_mode, this, mtr)) { @@ -1224,7 +1225,7 @@ release_tree: reached_latched_leaf: #ifdef BTR_CUR_HASH_ADAPT - if (btr_search_enabled && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG)) + if (ahi_enabled && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG)) { if (page_cur_search_with_match_bytes(tuple, mode, &up_match, &up_bytes, diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index a571de04f2f..2799750ee01 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -1106,6 +1106,8 @@ public: ut_ad(!dict_operation); ut_ad(!apply_online_log); ut_ad(!is_not_inheriting_locks()); + ut_ad(check_foreigns); + ut_ad(check_unique_secondary); } /** This has to be invoked on SAVEPOINT or at the end of a statement. diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 75116a0201a..05d17f9b883 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -398,7 +398,7 @@ static dberr_t srv_undo_delete_old_tablespaces() } /** Recreate the undo log tablespaces */ -static dberr_t srv_undo_tablespaces_reinit() +ATTRIBUTE_COLD static dberr_t srv_undo_tablespaces_reinit() { mtr_t mtr; dberr_t err; @@ -431,6 +431,15 @@ static dberr_t srv_undo_tablespaces_reinit() if (!first_rseg_hdr) goto func_exit; + if (UNIV_UNLIKELY(mach_read_from_4(TRX_RSEG + TRX_RSEG_FORMAT + + first_rseg_hdr->page.frame))) + trx_rseg_format_upgrade(first_rseg_hdr, &mtr); + + mtr.write<8,mtr_t::MAYBE_NOP>(*first_rseg_hdr, + TRX_RSEG + TRX_RSEG_MAX_TRX_ID + + first_rseg_hdr->page.frame, + trx_sys.get_max_trx_id() - 1); + /* Reset TRX_SYS page */ err= trx_sys.reset_page(&mtr); diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 0a896411658..841b014019b 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -394,6 +394,7 @@ static dberr_t trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr) { mtr.commit(); + log_free_check(); mtr.start(); const page_id_t hdr_page_id{rseg->space->id, hdr_addr.page}; @@ -401,54 +402,48 @@ trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr) buf_block_t *rseg_hdr= rseg->get(&mtr, &err); if (!rseg_hdr) return err; - if (buf_block_t *block= buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH, - nullptr, BUF_GET_POSSIBLY_FREED, - &mtr, &err)) - { - while (!fseg_free_step_not_header(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + - block->page.frame, &mtr)) - { - rseg_hdr->fix(); - block->fix(); - mtr.commit(); - mtr.start(); - rseg_hdr->page.lock.x_lock(); - block->page.lock.x_lock(); - mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX); - mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); - } + buf_block_t *block= buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH, + nullptr, BUF_GET_POSSIBLY_FREED, + &mtr, &err); + if (!block) + return err; + + const uint32_t seg_size= + flst_get_len(TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + block->page.frame); + + err= trx_purge_remove_log_hdr(rseg_hdr, block, hdr_addr.boffset, &mtr); + if (UNIV_UNLIKELY(err != DB_SUCCESS)) + return err; + + ut_ad(rseg->curr_size >= seg_size); + rseg->curr_size-= seg_size; + rseg->history_size--; + + byte *hist= TRX_RSEG + TRX_RSEG_HISTORY_SIZE + rseg_hdr->page.frame; + ut_ad(mach_read_from_4(hist) >= seg_size); + mtr.write<4>(*rseg_hdr, hist, mach_read_from_4(hist) - seg_size); - /* The page list may now be inconsistent, but the length field - stored in the list base node tells us how big it was before we - started the freeing. */ - const uint32_t seg_size= - flst_get_len(TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + block->page.frame); - - /* We may free the undo log segment header page; it must be freed - within the same mtr as the undo log header is removed from the - history list: otherwise, in case of a database crash, the segment - could become inaccessible garbage in the file space. */ - err= trx_purge_remove_log_hdr(rseg_hdr, block, hdr_addr.boffset, &mtr); - if (UNIV_UNLIKELY(err != DB_SUCCESS)) - return err; - byte *hist= TRX_RSEG + TRX_RSEG_HISTORY_SIZE + rseg_hdr->page.frame; - if (UNIV_UNLIKELY(mach_read_from_4(hist) < seg_size)) - return DB_CORRUPTION; - mtr.write<4>(*rseg_hdr, hist, mach_read_from_4(hist) - seg_size); - - /* Here we assume that a file segment with just the header page - can be freed in a few steps, so that the buffer pool is not - flooded with bufferfixed pages: see the note in fsp0fsp.cc. */ - while (!fseg_free_step(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + - block->page.frame, &mtr)); - - ut_ad(rseg->curr_size >= seg_size); - - rseg->history_size--; - rseg->curr_size -= seg_size; + while (!fseg_free_step_not_header(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + + block->page.frame, &mtr)) + { + block->fix(); + mtr.commit(); + /* NOTE: If the server is killed after the log that was produced + up to this point was written, and before the log from the mtr.commit() + in our caller is written, then the pages belonging to the + undo log will become unaccessible garbage. + + This does not matters when using multiple innodb_undo_tablespaces; + innodb_undo_log_truncate=ON will be able to reclaim the space. */ + log_free_check(); + mtr.start(); + block->page.lock.x_lock(); + mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); } - return err; + while (!fseg_free_step(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + + block->page.frame, &mtr)); + return DB_SUCCESS; } /** Remove unnecessary history data from a rollback segment. diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 43dc262c46c..ce7a252aa01 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -385,9 +385,10 @@ void trx_t::free() dict_operation= false; trx_sys.deregister_trx(this); + check_unique_secondary= true; + check_foreigns= true; assert_freed(); trx_sys.rw_trx_hash.put_pins(this); - mysql_thd= nullptr; // FIXME: We need to avoid this heap free/alloc for each commit. @@ -1377,6 +1378,8 @@ void trx_t::commit_cleanup() state= TRX_STATE_NOT_STARTED; mod_tables.clear(); + check_foreigns= true; + check_unique_secondary= true; assert_freed(); trx_init(this); mutex.wr_unlock(); diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 81262578765..f82823dba2b 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -2733,10 +2733,14 @@ int ha_maria::info(uint flag) key < key_end ; key++) { ulong *to= key->rec_per_key; - for (ulong *end= to+ key->user_defined_key_parts ; - to < end ; - to++, from++) - *to= (ulong) (*from + 0.5); + /* Some temporary tables does not allocate rec_per_key */ + if (to) + { + for (ulong *end= to+ key->user_defined_key_parts ; + to < end ; + to++, from++) + *to= (ulong) (*from + 0.5); + } } } /* diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index 744b0f656b5..c56721a2359 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -2780,7 +2780,8 @@ static my_bool write_block_record(MARIA_HA *info, const uchar *field_pos; ulong length; if ((record[column->null_pos] & column->null_bit) || - (row->empty_bits[column->empty_pos] & column->empty_bit)) + (column->empty_bit && + (row->empty_bits[column->empty_pos] & column->empty_bit))) continue; field_pos= record + column->offset; @@ -4887,7 +4888,8 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record, uchar *field_pos= record + column->offset; /* First check if field is present in record */ if ((record[column->null_pos] & column->null_bit) || - (cur_row->empty_bits[column->empty_pos] & column->empty_bit)) + (column->empty_bit && + (cur_row->empty_bits[column->empty_pos] & column->empty_bit))) { bfill(record + column->offset, column->fill_length, type == FIELD_SKIP_ENDSPACE ? ' ' : 0); @@ -4970,8 +4972,9 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record, { uint size_length; if ((record[blob_field->null_pos] & blob_field->null_bit) || - (cur_row->empty_bits[blob_field->empty_pos] & - blob_field->empty_bit)) + (blob_field->empty_bit & + (cur_row->empty_bits[blob_field->empty_pos] & + blob_field->empty_bit))) continue; size_length= blob_field->length - portable_sizeof_char_ptr; blob_lengths+= _ma_calc_blob_length(size_length, length_data); @@ -5827,7 +5830,8 @@ static size_t fill_insert_undo_parts(MARIA_HA *info, const uchar *record, const uchar *column_pos; size_t column_length; if ((record[column->null_pos] & column->null_bit) || - cur_row->empty_bits[column->empty_pos] & column->empty_bit) + (column->empty_bit && + cur_row->empty_bits[column->empty_pos] & column->empty_bit)) continue; column_pos= record+ column->offset; @@ -6008,7 +6012,8 @@ static size_t fill_update_undo_parts(MARIA_HA *info, const uchar *oldrec, */ continue; } - if (old_row->empty_bits[column->empty_pos] & column->empty_bit) + if (column->empty_bit && + (old_row->empty_bits[column->empty_pos] & column->empty_bit)) { if (new_row->empty_bits[column->empty_pos] & column->empty_bit) continue; /* Both are empty; skip */ @@ -6024,8 +6029,9 @@ static size_t fill_update_undo_parts(MARIA_HA *info, const uchar *oldrec, log the original value */ new_column_is_empty= ((newrec[column->null_pos] & column->null_bit) || - (new_row->empty_bits[column->empty_pos] & - column->empty_bit)); + (column->empty_bit && + (new_row->empty_bits[column->empty_pos] & + column->empty_bit))); old_column_pos= oldrec + column->offset; new_column_pos= newrec + column->offset; @@ -7198,7 +7204,8 @@ my_bool _ma_apply_undo_row_delete(MARIA_HA *info, LSN undo_lsn, column++, null_field_lengths++) { if ((record[column->null_pos] & column->null_bit) || - row.empty_bits[column->empty_pos] & column->empty_bit) + (column->empty_bit && + row.empty_bits[column->empty_pos] & column->empty_bit)) { if (column->type != FIELD_BLOB) *null_field_lengths= 0; diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index 2d9174b4380..7702355b7d1 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -117,7 +117,7 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share, &info.blobs,sizeof(MARIA_BLOB)*share->base.blobs, &info.buff,(share->base.max_key_block_length*2+ share->base.max_key_length), - &info.lastkey_buff,share->base.max_key_length*2+1, + &info.lastkey_buff,share->base.max_key_length*3, &info.first_mbr_key, share->base.max_key_length, &info.maria_rtree_recursion_state, share->have_rtree ? 1024 : 0, diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index c644a74ceb6..ef01b45aec0 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -187,7 +187,7 @@ static const uchar sort_order_big5[]= }; -static MY_CASEFOLD_CHARACTER cA2[256]= +static const MY_CASEFOLD_CHARACTER cA2[256]= { /* A200-A20F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -380,7 +380,7 @@ static MY_CASEFOLD_CHARACTER cA2[256]= }; -static MY_CASEFOLD_CHARACTER cA3[256]= +static const MY_CASEFOLD_CHARACTER cA3[256]= { /* A300-A30F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -573,7 +573,7 @@ static MY_CASEFOLD_CHARACTER cA3[256]= }; -static MY_CASEFOLD_CHARACTER cC7[256]= +static const MY_CASEFOLD_CHARACTER cC7[256]= { /* C700-C70F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -766,7 +766,7 @@ static MY_CASEFOLD_CHARACTER cC7[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_big5[256]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_big5[256]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c index dfc7621b89d..0f1e8457072 100644 --- a/strings/ctype-cp932.c +++ b/strings/ctype-cp932.c @@ -197,7 +197,7 @@ static const uchar sort_order_cp932[]= #define cp932code(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d)) -static MY_CASEFOLD_CHARACTER c81[256]= +static const MY_CASEFOLD_CHARACTER c81[256]= { /* 8100-810F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -407,7 +407,7 @@ static MY_CASEFOLD_CHARACTER c81[256]= }; -static MY_CASEFOLD_CHARACTER c82[256]= +static const MY_CASEFOLD_CHARACTER c82[256]= { /* 8200-820F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -615,7 +615,7 @@ static MY_CASEFOLD_CHARACTER c82[256]= }; -static MY_CASEFOLD_CHARACTER c83[256]= +static const MY_CASEFOLD_CHARACTER c83[256]= { /* 8300-830F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -825,7 +825,7 @@ static MY_CASEFOLD_CHARACTER c83[256]= }; -static MY_CASEFOLD_CHARACTER c84[256]= +static const MY_CASEFOLD_CHARACTER c84[256]= { /* 8400-840F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1035,7 +1035,7 @@ static MY_CASEFOLD_CHARACTER c84[256]= }; -static MY_CASEFOLD_CHARACTER c87[256]= +static const MY_CASEFOLD_CHARACTER c87[256]= { /* 8700-870F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1245,7 +1245,7 @@ static MY_CASEFOLD_CHARACTER c87[256]= }; -static MY_CASEFOLD_CHARACTER cEE[256]= +static const MY_CASEFOLD_CHARACTER cEE[256]= { /* EE00-EE0F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1456,7 +1456,7 @@ static MY_CASEFOLD_CHARACTER cEE[256]= }; -static MY_CASEFOLD_CHARACTER cFA[256]= +static const MY_CASEFOLD_CHARACTER cFA[256]= { /* FA00-FA0F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1666,7 +1666,7 @@ static MY_CASEFOLD_CHARACTER cFA[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_cp932[256]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_cp932[256]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 583919330c9..ab27074f20d 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -213,7 +213,7 @@ static const uchar sort_order_euc_kr[]= #include "ctype-mb.inl" -static MY_CASEFOLD_CHARACTER cA3[256]= +static const MY_CASEFOLD_CHARACTER cA3[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -418,7 +418,7 @@ static MY_CASEFOLD_CHARACTER cA3[256]= }; -static MY_CASEFOLD_CHARACTER cA5[256]= +static const MY_CASEFOLD_CHARACTER cA5[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -623,7 +623,7 @@ static MY_CASEFOLD_CHARACTER cA5[256]= }; -static MY_CASEFOLD_CHARACTER cA7[256]= +static const MY_CASEFOLD_CHARACTER cA7[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -828,7 +828,7 @@ static MY_CASEFOLD_CHARACTER cA7[256]= }; -static MY_CASEFOLD_CHARACTER cA8[256]= +static const MY_CASEFOLD_CHARACTER cA8[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1033,7 +1033,7 @@ static MY_CASEFOLD_CHARACTER cA8[256]= }; -static MY_CASEFOLD_CHARACTER cA9[256]= +static const MY_CASEFOLD_CHARACTER cA9[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1238,7 +1238,7 @@ static MY_CASEFOLD_CHARACTER cA9[256]= }; -static MY_CASEFOLD_CHARACTER cAC[256]= +static const MY_CASEFOLD_CHARACTER cAC[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1443,7 +1443,7 @@ static MY_CASEFOLD_CHARACTER cAC[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_euckr[256]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_euckr[256]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index f784ca8720f..1812c74d465 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -250,7 +250,7 @@ static const uchar sort_order_eucjpms[]= /* Case info pages for JIS-X-0208 range */ -static MY_CASEFOLD_CHARACTER cA2[256]= +static const MY_CASEFOLD_CHARACTER cA2[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -371,7 +371,7 @@ static MY_CASEFOLD_CHARACTER cA2[256]= }; -static MY_CASEFOLD_CHARACTER cA3[256]= +static const MY_CASEFOLD_CHARACTER cA3[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -492,7 +492,7 @@ static MY_CASEFOLD_CHARACTER cA3[256]= }; -static MY_CASEFOLD_CHARACTER cA6[256]= +static const MY_CASEFOLD_CHARACTER cA6[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -613,7 +613,7 @@ static MY_CASEFOLD_CHARACTER cA6[256]= }; -static MY_CASEFOLD_CHARACTER cA7[256]= +static const MY_CASEFOLD_CHARACTER cA7[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -734,7 +734,7 @@ static MY_CASEFOLD_CHARACTER cA7[256]= }; -static MY_CASEFOLD_CHARACTER cAD[256]= +static const MY_CASEFOLD_CHARACTER cAD[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -857,7 +857,7 @@ static MY_CASEFOLD_CHARACTER cAD[256]= /* Case info pages for JIS-X-0212 range */ -static MY_CASEFOLD_CHARACTER c8FA6[256]= +static const MY_CASEFOLD_CHARACTER c8FA6[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -978,7 +978,7 @@ static MY_CASEFOLD_CHARACTER c8FA6[256]= }; -static MY_CASEFOLD_CHARACTER c8FA7[256]= +static const MY_CASEFOLD_CHARACTER c8FA7[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1099,7 +1099,7 @@ static MY_CASEFOLD_CHARACTER c8FA7[256]= }; -static MY_CASEFOLD_CHARACTER c8FA9[256]= +static const MY_CASEFOLD_CHARACTER c8FA9[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1220,7 +1220,7 @@ static MY_CASEFOLD_CHARACTER c8FA9[256]= }; -static MY_CASEFOLD_CHARACTER c8FAA[256]= +static const MY_CASEFOLD_CHARACTER c8FAA[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1341,7 +1341,7 @@ static MY_CASEFOLD_CHARACTER c8FAA[256]= }; -static MY_CASEFOLD_CHARACTER c8FAB[256]= +static const MY_CASEFOLD_CHARACTER c8FAB[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1462,7 +1462,7 @@ static MY_CASEFOLD_CHARACTER c8FAB[256]= }; -static MY_CASEFOLD_CHARACTER c8FF3[256]= +static const MY_CASEFOLD_CHARACTER c8FF3[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1583,7 +1583,7 @@ static MY_CASEFOLD_CHARACTER c8FF3[256]= }; -static MY_CASEFOLD_CHARACTER c8FF4[256]= +static const MY_CASEFOLD_CHARACTER c8FF4[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1704,7 +1704,7 @@ static MY_CASEFOLD_CHARACTER c8FF4[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_eucjpms[512]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_eucjpms[512]= { /* JIS-X-0208 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 6499a081181..9e6ed3cfabe 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -177,7 +177,7 @@ static const uchar sort_order_gb2312[]= #include "ctype-mb.inl" -static MY_CASEFOLD_CHARACTER cA2[256]= +static const MY_CASEFOLD_CHARACTER cA2[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -298,7 +298,7 @@ static MY_CASEFOLD_CHARACTER cA2[256]= }; -static MY_CASEFOLD_CHARACTER cA3[256]= +static const MY_CASEFOLD_CHARACTER cA3[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -419,7 +419,7 @@ static MY_CASEFOLD_CHARACTER cA3[256]= }; -static MY_CASEFOLD_CHARACTER cA6[256]= +static const MY_CASEFOLD_CHARACTER cA6[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -540,7 +540,7 @@ static MY_CASEFOLD_CHARACTER cA6[256]= }; -static MY_CASEFOLD_CHARACTER cA7[256]= +static const MY_CASEFOLD_CHARACTER cA7[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -661,7 +661,7 @@ static MY_CASEFOLD_CHARACTER cA7[256]= }; -static MY_CASEFOLD_CHARACTER cA8[256]= +static const MY_CASEFOLD_CHARACTER cA8[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -782,7 +782,7 @@ static MY_CASEFOLD_CHARACTER cA8[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_gb2312[256]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_gb2312[256]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 1287602b12b..a81e2465157 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -147,7 +147,7 @@ static const uchar to_upper_gbk[]= }; -static MY_CASEFOLD_CHARACTER cA2[256]= +static const MY_CASEFOLD_CHARACTER cA2[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -351,7 +351,7 @@ static MY_CASEFOLD_CHARACTER cA2[256]= {0xA2FF,0xA2FF} }; -static MY_CASEFOLD_CHARACTER cA3[256]= +static const MY_CASEFOLD_CHARACTER cA3[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -556,7 +556,7 @@ static MY_CASEFOLD_CHARACTER cA3[256]= }; -static MY_CASEFOLD_CHARACTER cA6[256]= +static const MY_CASEFOLD_CHARACTER cA6[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -761,7 +761,7 @@ static MY_CASEFOLD_CHARACTER cA6[256]= }; -static MY_CASEFOLD_CHARACTER cA7[256]= +static const MY_CASEFOLD_CHARACTER cA7[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -966,7 +966,7 @@ static MY_CASEFOLD_CHARACTER cA7[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_gbk[256]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_gbk[256]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 88df11ca29e..88dd36312ea 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -63,10 +63,10 @@ size_t my_casedn_str_mb(CHARSET_INFO * cs, char *str) } -static inline MY_CASEFOLD_CHARACTER* +static inline const MY_CASEFOLD_CHARACTER* get_case_info_for_ch(CHARSET_INFO *cs, uint page, uint offs) { - MY_CASEFOLD_CHARACTER *p; + const MY_CASEFOLD_CHARACTER *p; return cs->casefold && (p= cs->casefold->page[page]) ? &p[offs] : NULL; } @@ -97,7 +97,7 @@ my_casefold_mb(CHARSET_INFO *cs, size_t mblen= my_ismbchar(cs, src, srcend); if (mblen) { - MY_CASEFOLD_CHARACTER *ch; + const MY_CASEFOLD_CHARACTER *ch; if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1]))) { int code= is_upper ? ch->toupper : ch->tolower; diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 5378601e07f..1e3ef16bdb5 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -198,7 +198,7 @@ static const uchar sort_order_sjis[]= #define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d)) -static MY_CASEFOLD_CHARACTER c81[256]= +static const MY_CASEFOLD_CHARACTER c81[256]= { /* 8100-810F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -408,7 +408,7 @@ static MY_CASEFOLD_CHARACTER c81[256]= }; -static MY_CASEFOLD_CHARACTER c82[256]= +static const MY_CASEFOLD_CHARACTER c82[256]= { /* 8200-820F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -616,7 +616,7 @@ static MY_CASEFOLD_CHARACTER c82[256]= }; -static MY_CASEFOLD_CHARACTER c83[256]= +static const MY_CASEFOLD_CHARACTER c83[256]= { /* 8300-830F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -826,7 +826,7 @@ static MY_CASEFOLD_CHARACTER c83[256]= }; -static MY_CASEFOLD_CHARACTER c84[256]= +static const MY_CASEFOLD_CHARACTER c84[256]= { /* 8400-840F */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -1036,7 +1036,7 @@ static MY_CASEFOLD_CHARACTER c84[256]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_sjis[256]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_sjis[256]= { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 58be36f3040..76f000e9ed6 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -65976,7 +65976,7 @@ my_wc_mb_euc_jp(CHARSET_INFO *cs __attribute__((unused)), /* Case info pages for JIS-X-0208 range */ -static MY_CASEFOLD_CHARACTER cA2[256]= +static const MY_CASEFOLD_CHARACTER cA2[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66097,7 +66097,7 @@ static MY_CASEFOLD_CHARACTER cA2[256]= }; -static MY_CASEFOLD_CHARACTER cA3[256]= +static const MY_CASEFOLD_CHARACTER cA3[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66218,7 +66218,7 @@ static MY_CASEFOLD_CHARACTER cA3[256]= }; -static MY_CASEFOLD_CHARACTER cA6[256]= +static const MY_CASEFOLD_CHARACTER cA6[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66339,7 +66339,7 @@ static MY_CASEFOLD_CHARACTER cA6[256]= }; -static MY_CASEFOLD_CHARACTER cA7[256]= +static const MY_CASEFOLD_CHARACTER cA7[256]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66461,7 +66461,7 @@ static MY_CASEFOLD_CHARACTER cA7[256]= /* Case info pages for JIS-X-0212 range */ -static MY_CASEFOLD_CHARACTER c8FA6[]= +static const MY_CASEFOLD_CHARACTER c8FA6[]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66582,7 +66582,7 @@ static MY_CASEFOLD_CHARACTER c8FA6[]= }; -static MY_CASEFOLD_CHARACTER c8FA7[]= +static const MY_CASEFOLD_CHARACTER c8FA7[]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66703,7 +66703,7 @@ static MY_CASEFOLD_CHARACTER c8FA7[]= }; -static MY_CASEFOLD_CHARACTER c8FA9[]= +static const MY_CASEFOLD_CHARACTER c8FA9[]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66824,7 +66824,7 @@ static MY_CASEFOLD_CHARACTER c8FA9[]= }; -static MY_CASEFOLD_CHARACTER c8FAA[]= +static const MY_CASEFOLD_CHARACTER c8FAA[]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -66945,7 +66945,7 @@ static MY_CASEFOLD_CHARACTER c8FAA[]= }; -static MY_CASEFOLD_CHARACTER c8FAB[]= +static const MY_CASEFOLD_CHARACTER c8FAB[]= { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* xx00 */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, @@ -67066,7 +67066,7 @@ static MY_CASEFOLD_CHARACTER c8FAB[]= }; -static MY_CASEFOLD_CHARACTER *my_casefold_pages_ujis[512]= +static const MY_CASEFOLD_CHARACTER *my_casefold_pages_ujis[512]= { /* JIS-X-0208 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */ @@ -67155,10 +67155,10 @@ static MY_CASEFOLD_INFO my_casefold_info_ujis= UJIS and EUCJPMS share the same UPPER/LOWER functions. */ -static MY_CASEFOLD_CHARACTER* +static const MY_CASEFOLD_CHARACTER* get_case_info_for_ch(CHARSET_INFO *cs, uint plane, uint page, uint offs) { - MY_CASEFOLD_CHARACTER *p; + const MY_CASEFOLD_CHARACTER *p; return (p= cs->casefold->page[page + plane * 256]) ? &p[offs & 0xFF] : NULL; } @@ -67180,7 +67180,7 @@ my_casefold_ujis(CHARSET_INFO *cs, size_t mblen= my_ismbchar(cs, src, srcend); if (mblen) { - MY_CASEFOLD_CHARACTER *ch; + const MY_CASEFOLD_CHARACTER *ch; ch= (mblen == 2) ? get_case_info_for_ch(cs, 0, (uchar) src[0], (uchar) src[1]) : get_case_info_for_ch(cs, 1, (uchar) src[1], (uchar) src[2]); |