diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2023-03-06 13:39:12 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2023-03-06 13:39:12 +0200 |
commit | 9267160c11aea65c4734141547354b23053e284f (patch) | |
tree | 76f6f123c9d72df2719806dfe86405e19ed52f9e | |
parent | 077425a65989e62149df1a23a73e50d0c793fb0f (diff) | |
parent | 4ccb2be65fc1d392602473d50f8d9df29635a3eb (diff) | |
download | mariadb-git-9267160c11aea65c4734141547354b23053e284f.tar.gz |
Merge 10.10 into 10.11
31 files changed, 240 insertions, 167 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 3e2531b90cd..e91b2ad14c3 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -4186,6 +4186,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, @@ -5801,14 +5802,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 d433e5ea7e6..e0c6c15a3e2 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -4286,6 +4286,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 eeece09d489..54a213d8553 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -6297,6 +6297,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 f98878e46bf..51bef49277e 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3546,7 +3546,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 @@ -3566,6 +3567,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, @@ -19600,6 +19602,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)); @@ -19805,8 +19808,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= @@ -19873,6 +19877,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; @@ -19881,6 +19886,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; @@ -27337,6 +27344,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; /* @@ -27361,7 +27373,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() @@ -27525,7 +27536,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 8e7b5becc66..320f9f4f97c 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -8402,27 +8402,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 0a92422676a..6f96069e46a 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; @@ -384,7 +385,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 ec1b72244b4..8d19064a658 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -1011,9 +1011,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 && !index()->is_ibuf(); /* 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)) { @@ -1335,7 +1336,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 0450be89cfb..7d2c3297769 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -1109,6 +1109,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/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 4072ba2f440..867126adc0e 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -397,6 +397,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}; @@ -404,61 +405,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)) - { - /* Mark the last undo log totally purged, so that if the system - crashes, the tail of the undo log will not get accessed again. The - list of pages in the undo log tail gets inconsistent during the - freeing of the segment, and therefore purge should not try to - access them again. */ - mtr.write<2,mtr_t::MAYBE_NOP>(*block, block->page.frame + - hdr_addr.boffset + TRX_UNDO_NEEDS_PURGE, 0U); - 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 3352447ea63..454afba4321 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 21d9a00b94e..c245dcea036 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -2690,12 +2690,22 @@ int ha_maria::info(uint flag) share->db_record_offset= maria_info.record_offset; if (share->key_parts) { - ulong *to= table->key_info[0].rec_per_key, *end; double *from= maria_info.rec_per_key; - for (end= to+ share->key_parts ; to < end ; to++, from++) - *to= (ulong) (*from + 0.5); + KEY *key, *key_end; + for (key= table->key_info, key_end= key + share->keys; + key < key_end ; key++) + { + ulong *to= key->rec_per_key; + /* 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); + } + } } - /* Set data_file_name and index_file_name to point at the symlink value if table is symlinked (Ie; Real name is not same as generated name) diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index baa777edcf0..98ef5c21e55 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); @@ -5825,7 +5828,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; @@ -6006,7 +6010,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 */ @@ -6022,8 +6027,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; @@ -7196,7 +7202,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/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index a1de9edd997..c0419da7e71 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -2144,9 +2144,17 @@ int ha_myisam::info(uint flag) share->keys_for_keyread.intersect(share->keys_in_use); share->db_record_offset= misam_info.record_offset; if (share->key_parts) - memcpy((char*) table->key_info[0].rec_per_key, - (char*) misam_info.rec_per_key, - sizeof(table->key_info[0].rec_per_key[0])*share->key_parts); + { + ulong *from= misam_info.rec_per_key; + KEY *key, *key_end; + for (key= table->key_info, key_end= key + share->keys; + key < key_end ; key++) + { + memcpy(key->rec_per_key, from, + key->user_defined_key_parts * sizeof(*from)); + from+= key->user_defined_key_parts; + } + } if (table_share->tmp_table == NO_TMP_TABLE) mysql_mutex_unlock(&table_share->LOCK_share); } 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]); |