Commit 2ecd39c9 authored by Nayuta Yanagisawa's avatar Nayuta Yanagisawa

MDEV-27240 SIGSEGV in ha_spider::store_lock on LOCK TABLE

The commit e954d9de gave different lifetime to wide_share and
partition_handler_share. This introduced the possibility that
partition_handler_share could be accessed even after it was freed.

We stop sharing partitoiin_handler_share and make it belong to
a single wide_handler to fix the problem.
parent 8535c260
/* Copyright (C) 2008-2019 Kentoku Shiba /* Copyright (C) 2008-2019 Kentoku Shiba
Copyright (C) 2019 MariaDB corp Copyright (C) 2019-2022 MariaDB corp
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -88,8 +88,7 @@ ha_spider::ha_spider( ...@@ -88,8 +88,7 @@ ha_spider::ha_spider(
#endif #endif
search_link_query_id = 0; search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
partition_handler_share = NULL; partition_handler = NULL;
pt_handler_share_owner = FALSE;
#endif #endif
#ifdef HA_MRR_USE_DEFAULT_IMPL #ifdef HA_MRR_USE_DEFAULT_IMPL
multi_range_keys = NULL; multi_range_keys = NULL;
...@@ -192,8 +191,7 @@ ha_spider::ha_spider( ...@@ -192,8 +191,7 @@ ha_spider::ha_spider(
#endif #endif
search_link_query_id = 0; search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
partition_handler_share = NULL; partition_handler = NULL;
pt_handler_share_owner = FALSE;
#endif #endif
#ifdef HA_MRR_USE_DEFAULT_IMPL #ifdef HA_MRR_USE_DEFAULT_IMPL
multi_range_keys = NULL; multi_range_keys = NULL;
...@@ -280,12 +278,7 @@ ha_spider::~ha_spider() ...@@ -280,12 +278,7 @@ ha_spider::~ha_spider()
DBUG_ENTER("ha_spider::~ha_spider"); DBUG_ENTER("ha_spider::~ha_spider");
DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider this=%p", this));
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (pt_handler_share_owner) partition_handler = NULL;
{
spider_free(spider_current_trx, partition_handler_share, MYF(0));
pt_handler_share_owner = FALSE;
}
partition_handler_share = NULL;
#endif #endif
if (wide_handler_owner) if (wide_handler_owner)
{ {
...@@ -343,13 +336,8 @@ int ha_spider::open( ...@@ -343,13 +336,8 @@ int ha_spider::open(
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
uint part_num; uint part_num;
bool pt_handler_share_alloc = FALSE; bool pt_handler_share_alloc = FALSE;
bool pt_handler_mutex = FALSE; ha_spider **wide_handler_handlers = NULL;
ha_spider **pt_handler_share_handlers = NULL;
ha_partition *clone_source; ha_partition *clone_source;
ha_spider *pt_handler_share_key;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type hash_value;
#endif
#endif #endif
DBUG_ENTER("ha_spider::open"); DBUG_ENTER("ha_spider::open");
DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider this=%p", this));
...@@ -360,18 +348,14 @@ int ha_spider::open( ...@@ -360,18 +348,14 @@ int ha_spider::open(
table->file->get_no_parts("", &part_num); table->file->get_no_parts("", &part_num);
if (part_num) if (part_num)
{ {
pt_handler_share_handlers = wide_handler_handlers =
(ha_spider **) ((ha_partition *) table->file)->get_child_handlers(); (ha_spider **) ((ha_partition *) table->file)->get_child_handlers();
spider = pt_handler_share_handlers[0]; spider = wide_handler_handlers[0];
owner = pt_handler_share_handlers[part_num - 1]; owner = wide_handler_handlers[part_num - 1];
clone_source = ((ha_partition *) table->file)->get_clone_source(); clone_source = ((ha_partition *) table->file)->get_clone_source();
if (clone_source) if (clone_source)
{ {
pt_handler_share_key = (ha_spider *)
clone_source->get_child_handlers()[0];
is_clone = TRUE; is_clone = TRUE;
} else {
pt_handler_share_key = spider;
} }
} else { } else {
#endif #endif
...@@ -379,7 +363,6 @@ int ha_spider::open( ...@@ -379,7 +363,6 @@ int ha_spider::open(
owner = this; owner = this;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
clone_source = NULL; clone_source = NULL;
pt_handler_share_key = this;
} }
#endif #endif
if (!spider->wide_handler) if (!spider->wide_handler)
...@@ -408,6 +391,10 @@ int ha_spider::open( ...@@ -408,6 +391,10 @@ int ha_spider::open(
(uint) sizeof(uchar) * no_bytes_in_map(table->read_set), (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
&rnd_write_bitmap, &rnd_write_bitmap,
(uint) sizeof(uchar) * no_bytes_in_map(table->read_set), (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
#ifdef WITH_PARTITION_STORAGE_ENGINE
&partition_handler,
(uint) sizeof(SPIDER_PARTITION_HANDLER),
#endif
NullS)) NullS))
) { ) {
error_num = HA_ERR_OUT_OF_MEM; error_num = HA_ERR_OUT_OF_MEM;
...@@ -422,6 +409,9 @@ int ha_spider::open( ...@@ -422,6 +409,9 @@ int ha_spider::open(
wide_handler->idx_write_bitmap = idx_write_bitmap; wide_handler->idx_write_bitmap = idx_write_bitmap;
wide_handler->rnd_read_bitmap = rnd_read_bitmap; wide_handler->rnd_read_bitmap = rnd_read_bitmap;
wide_handler->rnd_write_bitmap = rnd_write_bitmap; wide_handler->rnd_write_bitmap = rnd_write_bitmap;
#ifdef WITH_PARTITION_STORAGE_ENGINE
wide_handler->partition_handler = partition_handler;
#endif
wide_handler->owner = owner; wide_handler->owner = owner;
if (table_share->tmp_table == NO_TMP_TABLE) if (table_share->tmp_table == NO_TMP_TABLE)
wide_handler->top_share = table->s; wide_handler->top_share = table->s;
...@@ -431,81 +421,37 @@ int ha_spider::open( ...@@ -431,81 +421,37 @@ int ha_spider::open(
memset(wide_handler->searched_bitmap, 0, memset(wide_handler->searched_bitmap, 0,
no_bytes_in_map(table->read_set)); no_bytes_in_map(table->read_set));
wide_handler_alloc = TRUE; wide_handler_alloc = TRUE;
} else {
wide_handler = spider->wide_handler;
}
if (!share && !spider_get_share(name, table, thd, this, &error_num)) if (!share && !spider_get_share(name, table, thd, this, &error_num))
goto error_get_share; goto error_get_share;
wide_share = share->wide_share; wide_share = share->wide_share;
if (wide_handler_alloc)
{
thr_lock_data_init(&wide_share->lock, &wide_handler->lock, NULL);
}
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (!wide_handler->partition_handler_share) DBUG_PRINT("info",("spider create partition_handler"));
{
pt_handler_mutex = TRUE;
pthread_mutex_lock(&wide_share->pt_handler_mutex);
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
hash_value = my_calc_hash(&wide_share->pt_handler_hash,
(uchar*) pt_handler_share_key, sizeof(ha_spider *));
if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*)
my_hash_search_using_hash_value(&wide_share->pt_handler_hash,
hash_value, (uchar*) pt_handler_share_key, sizeof(ha_spider *))))
#else
if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*)
my_hash_search(&wide_share->pt_handler_hash,
(uchar*) pt_handler_share_key, sizeof(ha_spider *))))
#endif
{
if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE *)
spider_bulk_malloc(spider_current_trx, 15, MYF(MY_WME | MY_ZEROFILL),
&partition_handler_share, sizeof(SPIDER_PARTITION_HANDLER_SHARE),
NullS))
) {
error_num = HA_ERR_OUT_OF_MEM;
goto error_partition_handler_share_alloc;
}
DBUG_PRINT("info",("spider create partition_handler_share"));
DBUG_PRINT("info",("spider table=%p", table)); DBUG_PRINT("info",("spider table=%p", table));
partition_handler_share->table = table; partition_handler->table = table;
partition_handler_share->table_hash_value = hash_value; partition_handler->no_parts = part_num;
partition_handler_share->no_parts = part_num; partition_handler->owner = owner;
partition_handler_share->owner = owner; partition_handler->parallel_search_query_id = 0;
partition_handler_share->parallel_search_query_id = 0; spider->partition_handler = partition_handler;
spider->partition_handler_share = partition_handler_share; owner->partition_handler = partition_handler;
owner->partition_handler_share = partition_handler_share; partition_handler->handlers = wide_handler_handlers;
owner->pt_handler_share_owner = TRUE;
partition_handler_share->handlers = pt_handler_share_handlers;
uint old_elements = wide_share->pt_handler_hash.array.max_element;
#ifdef HASH_UPDATE_WITH_HASH_VALUE
if (my_hash_insert_with_hash_value(&wide_share->pt_handler_hash,
hash_value, (uchar*) partition_handler_share))
#else
if (my_hash_insert(&wide_share->pt_handler_hash,
(uchar*) partition_handler_share))
#endif
{
error_num = HA_ERR_OUT_OF_MEM;
goto error_hash_insert;
}
if (wide_share->pt_handler_hash.array.max_element > old_elements)
{
spider_alloc_calc_mem(spider_current_trx,
wide_share->pt_handler_hash,
(wide_share->pt_handler_hash.array.max_element -
old_elements) *
wide_share->pt_handler_hash.array.size_of_element);
}
}
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
pt_handler_mutex = FALSE;
pt_handler_share_alloc = TRUE; pt_handler_share_alloc = TRUE;
} else { } else {
partition_handler_share = wide_handler->partition_handler_share; wide_handler = spider->wide_handler;
partition_handler = wide_handler->partition_handler;
if (!share && !spider_get_share(name, table, thd, this, &error_num))
goto error_get_share;
wide_share= share->wide_share;
} }
if (wide_handler_alloc)
{
thr_lock_data_init(&wide_share->lock, &wide_handler->lock, NULL);
}
#endif #endif
init_sql_alloc_size = init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
...@@ -572,10 +518,10 @@ int ha_spider::open( ...@@ -572,10 +518,10 @@ int ha_spider::open(
{ {
for (roop_count = 0; roop_count < (int) part_num; roop_count++) for (roop_count = 0; roop_count < (int) part_num; roop_count++)
{ {
if (partition_handler_share->handlers[roop_count]->share == share) if (partition_handler->handlers[roop_count]->share == share)
{ {
pt_clone_source_handler = pt_clone_source_handler =
partition_handler_share->handlers[roop_count]; partition_handler->handlers[roop_count];
break; break;
} }
} }
...@@ -589,10 +535,10 @@ int ha_spider::open( ...@@ -589,10 +535,10 @@ int ha_spider::open(
{ {
wide_handler->lock_mode = wide_handler->lock_mode =
pt_clone_source_handler->wide_handler->lock_mode; pt_clone_source_handler->wide_handler->lock_mode;
if (!partition_handler_share->clone_bitmap_init) if (!partition_handler->clone_bitmap_init)
{ {
pt_clone_source_handler->set_select_column_mode(); pt_clone_source_handler->set_select_column_mode();
partition_handler_share->clone_bitmap_init = TRUE; partition_handler->clone_bitmap_init = TRUE;
} }
set_clone_searched_bitmap(); set_clone_searched_bitmap();
wide_handler->position_bitmap_init = FALSE; wide_handler->position_bitmap_init = FALSE;
...@@ -623,31 +569,13 @@ int ha_spider::open( ...@@ -623,31 +569,13 @@ int ha_spider::open(
error_init_blob_buff: error_init_blob_buff:
error_init_result_list: error_init_result_list:
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
error_hash_insert:
if (pt_handler_share_alloc) if (pt_handler_share_alloc)
{ {
wide_share = share->wide_share; wide_share = share->wide_share;
if (!pt_handler_mutex) spider->partition_handler = NULL;
pthread_mutex_lock(&wide_share->pt_handler_mutex); owner->partition_handler = NULL;
#ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value(&wide_share->pt_handler_hash,
partition_handler_share->table_hash_value,
(uchar*) partition_handler_share);
#else
my_hash_delete(&wide_share->pt_handler_hash,
(uchar*) partition_handler_share);
#endif
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
pt_handler_mutex = FALSE;
spider_free(spider_current_trx, partition_handler_share, MYF(0));
spider->partition_handler_share = NULL;
owner->partition_handler_share = NULL;
owner->pt_handler_share_owner = FALSE;
} }
error_partition_handler_share_alloc: partition_handler = NULL;
if (pt_handler_mutex)
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
partition_handler_share = NULL;
#endif #endif
spider_free_share(share); spider_free_share(share);
share = NULL; share = NULL;
...@@ -661,9 +589,9 @@ int ha_spider::open( ...@@ -661,9 +589,9 @@ int ha_spider::open(
{ {
spider_free(spider_current_trx, wide_handler, MYF(0)); spider_free(spider_current_trx, wide_handler, MYF(0));
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (pt_handler_share_handlers) if (wide_handler_handlers)
{ {
pt_handler_share_handlers[0]->wide_handler = NULL; wide_handler_handlers[0]->wide_handler = NULL;
} }
#endif #endif
spider->wide_handler = NULL; spider->wide_handler = NULL;
...@@ -679,7 +607,6 @@ int ha_spider::close() ...@@ -679,7 +607,6 @@ int ha_spider::close()
{ {
int error_num = 0, roop_count, error_num2; int error_num = 0, roop_count, error_num2;
THD *thd = ha_thd(); THD *thd = ha_thd();
SPIDER_WIDE_SHARE *wide_share;
backup_error_status(); backup_error_status();
DBUG_ENTER("ha_spider::close"); DBUG_ENTER("ha_spider::close");
DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider this=%p", this));
...@@ -769,23 +696,7 @@ int ha_spider::close() ...@@ -769,23 +696,7 @@ int ha_spider::close()
conn_keys = NULL; conn_keys = NULL;
} }
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (pt_handler_share_owner) partition_handler = NULL;
{
wide_share = share->wide_share;
pthread_mutex_lock(&wide_share->pt_handler_mutex);
#ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value(&wide_share->pt_handler_hash,
partition_handler_share->table_hash_value,
(uchar*) partition_handler_share);
#else
my_hash_delete(&wide_share->pt_handler_hash,
(uchar*) partition_handler_share);
#endif
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
spider_free(spider_current_trx, partition_handler_share, MYF(0));
pt_handler_share_owner = FALSE;
}
partition_handler_share = NULL;
#endif #endif
if (wide_handler_owner) if (wide_handler_owner)
{ {
...@@ -1169,14 +1080,14 @@ THR_LOCK_DATA **ha_spider::store_lock( ...@@ -1169,14 +1080,14 @@ THR_LOCK_DATA **ha_spider::store_lock(
) { ) {
wide_handler->lock_table_type = 1; wide_handler->lock_table_type = 1;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
uint roop_count; uint roop_count;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if (unlikely((store_error_num = if (unlikely((store_error_num =
partition_handler_share->handlers[roop_count]-> partition_handler->handlers[roop_count]->
append_lock_tables_list()))) append_lock_tables_list())))
{ {
break; break;
...@@ -1204,15 +1115,15 @@ THR_LOCK_DATA **ha_spider::store_lock( ...@@ -1204,15 +1115,15 @@ THR_LOCK_DATA **ha_spider::store_lock(
) { ) {
wide_handler->lock_table_type = 2; wide_handler->lock_table_type = 2;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
uint roop_count; uint roop_count;
for (roop_count = 0; for (roop_count = 0;
roop_count < partition_handler_share->no_parts; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if (unlikely((store_error_num = if (unlikely((store_error_num =
partition_handler_share->handlers[roop_count]-> partition_handler->handlers[roop_count]->
append_lock_tables_list()))) append_lock_tables_list())))
{ {
break; break;
...@@ -1333,14 +1244,14 @@ int ha_spider::external_lock( ...@@ -1333,14 +1244,14 @@ int ha_spider::external_lock(
/* lock/unlock tables */ /* lock/unlock tables */
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
uint roop_count; uint roop_count;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if (unlikely((error_num = if (unlikely((error_num =
partition_handler_share->handlers[roop_count]->lock_tables()))) partition_handler->handlers[roop_count]->lock_tables())))
{ {
DBUG_RETURN(error_num); DBUG_RETURN(error_num);
} }
...@@ -1574,7 +1485,7 @@ int ha_spider::reset() ...@@ -1574,7 +1485,7 @@ int ha_spider::reset()
use_pre_action = FALSE; use_pre_action = FALSE;
pre_bitmap_checked = FALSE; pre_bitmap_checked = FALSE;
bulk_insert = FALSE; bulk_insert = FALSE;
partition_handler_share->clone_bitmap_init = FALSE; partition_handler->clone_bitmap_init = FALSE;
result_list.tmp_table_join = FALSE; result_list.tmp_table_join = FALSE;
result_list.use_union = FALSE; result_list.use_union = FALSE;
result_list.use_both_key = FALSE; result_list.use_both_key = FALSE;
...@@ -7489,7 +7400,7 @@ int ha_spider::rnd_next_internal( ...@@ -7489,7 +7400,7 @@ int ha_spider::rnd_next_internal(
) { ) {
int error_num; int error_num;
ha_spider *direct_limit_offset_spider = ha_spider *direct_limit_offset_spider =
(ha_spider *) partition_handler_share->owner; (ha_spider *) partition_handler->owner;
backup_error_status(); backup_error_status();
DBUG_ENTER("ha_spider::rnd_next_internal"); DBUG_ENTER("ha_spider::rnd_next_internal");
DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider this=%p", this));
...@@ -7529,7 +7440,7 @@ int ha_spider::rnd_next_internal( ...@@ -7529,7 +7440,7 @@ int ha_spider::rnd_next_internal(
DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE)); DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE));
} }
if ( if (
partition_handler_share->handlers && partition_handler->handlers &&
direct_limit_offset_spider->direct_current_offset > 0 direct_limit_offset_spider->direct_current_offset > 0
) { ) {
longlong table_count = this->records(); longlong table_count = this->records();
...@@ -12488,11 +12399,11 @@ int ha_spider::info_push( ...@@ -12488,11 +12399,11 @@ int ha_spider::info_push(
break; break;
} }
wide_handler->hs_pushed_strref_num++; wide_handler->hs_pushed_strref_num++;
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
size_t roop_count; size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers; ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if ((error_num = handlers[roop_count]->push_back_hs_upds( if ((error_num = handlers[roop_count]->push_back_hs_upds(
...@@ -12512,11 +12423,11 @@ int ha_spider::info_push( ...@@ -12512,11 +12423,11 @@ int ha_spider::info_push(
case INFO_KIND_HS_CLEAR_STRING_REF: case INFO_KIND_HS_CLEAR_STRING_REF:
DBUG_PRINT("info",("spider INFO_KIND_HS_CLEAR_STRING_REF")); DBUG_PRINT("info",("spider INFO_KIND_HS_CLEAR_STRING_REF"));
wide_handler->hs_pushed_strref_num = 0; wide_handler->hs_pushed_strref_num = 0;
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
size_t roop_count; size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers; ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if ((error_num = handlers[roop_count]->reset_hs_upds( if ((error_num = handlers[roop_count]->reset_hs_upds(
...@@ -12580,11 +12491,11 @@ int ha_spider::info_push( ...@@ -12580,11 +12491,11 @@ int ha_spider::info_push(
#ifdef HA_CAN_BULK_ACCESS #ifdef HA_CAN_BULK_ACCESS
case INFO_KIND_BULK_ACCESS_BEGIN: case INFO_KIND_BULK_ACCESS_BEGIN:
DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_BEGIN")); DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_BEGIN"));
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
size_t roop_count; size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers; ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if ((error_num = handlers[roop_count]->bulk_access_begin(info))) if ((error_num = handlers[roop_count]->bulk_access_begin(info)))
...@@ -12601,11 +12512,11 @@ int ha_spider::info_push( ...@@ -12601,11 +12512,11 @@ int ha_spider::info_push(
break; break;
case INFO_KIND_BULK_ACCESS_CURRENT: case INFO_KIND_BULK_ACCESS_CURRENT:
DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_CURRENT")); DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_CURRENT"));
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
size_t roop_count; size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers; ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
if ((error_num = handlers[roop_count]->bulk_access_current(info))) if ((error_num = handlers[roop_count]->bulk_access_current(info)))
...@@ -12622,11 +12533,11 @@ int ha_spider::info_push( ...@@ -12622,11 +12533,11 @@ int ha_spider::info_push(
break; break;
case INFO_KIND_BULK_ACCESS_END: case INFO_KIND_BULK_ACCESS_END:
DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_END")); DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_END"));
if (partition_handler_share && partition_handler_share->handlers) if (partition_handler && partition_handler->handlers)
{ {
size_t roop_count; size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers; ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts; for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count) ++roop_count)
{ {
handlers[roop_count]->bulk_access_end(); handlers[roop_count]->bulk_access_end();
...@@ -13123,7 +13034,7 @@ void ha_spider::check_distinct_key_query() ...@@ -13123,7 +13034,7 @@ void ha_spider::check_distinct_key_query()
{ {
DBUG_ENTER( "ha_spider::check_distinct_key_query" ); DBUG_ENTER( "ha_spider::check_distinct_key_query" );
if ( result_list.direct_distinct && !partition_handler_share->handlers && if ( result_list.direct_distinct && !partition_handler->handlers &&
result_list.keyread && result_list.check_direct_order_limit ) result_list.keyread && result_list.check_direct_order_limit )
{ {
// SELECT DISTINCT query using an index in a non-partitioned configuration // SELECT DISTINCT query using an index in a non-partitioned configuration
...@@ -13923,9 +13834,9 @@ void ha_spider::check_pre_call( ...@@ -13923,9 +13834,9 @@ void ha_spider::check_pre_call(
} }
if ( if (
use_parallel && use_parallel &&
thd->query_id != partition_handler_share->parallel_search_query_id thd->query_id != partition_handler->parallel_search_query_id
) { ) {
partition_handler_share->parallel_search_query_id = thd->query_id; partition_handler->parallel_search_query_id = thd->query_id;
++wide_handler->trx->parallel_search_count; ++wide_handler->trx->parallel_search_count;
} }
use_pre_call = use_parallel; use_pre_call = use_parallel;
......
/* Copyright (C) 2008-2019 Kentoku Shiba /* Copyright (C) 2008-2019 Kentoku Shiba
Copyright (C) 2019 MariaDB corp Copyright (C) 2019-2022 MariaDB corp
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -92,8 +92,7 @@ class ha_spider final : public handler ...@@ -92,8 +92,7 @@ class ha_spider final : public handler
SPIDER_POSITION *pushed_pos; SPIDER_POSITION *pushed_pos;
SPIDER_POSITION pushed_pos_buf; SPIDER_POSITION pushed_pos_buf;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
bool pt_handler_share_owner = FALSE; SPIDER_PARTITION_HANDLER *partition_handler;
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share;
#endif #endif
bool wide_handler_owner = FALSE; bool wide_handler_owner = FALSE;
SPIDER_WIDE_HANDLER *wide_handler = NULL; SPIDER_WIDE_HANDLER *wide_handler = NULL;
......
for master_1
for child2
for child3
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE tbl_a (a INT KEY) ENGINE=SPIDER;
SELECT a.z FROM tbl_a AS a,tbl_a b WHERE a.z=b.z;
ERROR 42S22: Unknown column 'a.z' in 'field list'
ALTER TABLE tbl_a CHANGE c c INT;
ERROR 42S22: Unknown column 'c' in 'tbl_a'
LOCK TABLE tbl_a READ;
ERROR HY000: Unable to connect to foreign data source: localhost
DROP DATABASE auto_test_local;
for master_1
for child2
for child3
!include include/default_mysqld.cnf
!include ../my_1_1.cnf
--disable_warnings
--disable_query_log
--disable_result_log
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
--enable_warnings
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE tbl_a (a INT KEY) ENGINE=SPIDER;
--error ER_BAD_FIELD_ERROR
SELECT a.z FROM tbl_a AS a,tbl_a b WHERE a.z=b.z;
--error ER_BAD_FIELD_ERROR
ALTER TABLE tbl_a CHANGE c c INT;
--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
LOCK TABLE tbl_a READ;
DROP DATABASE auto_test_local;
--disable_warnings
--disable_query_log
--disable_result_log
--source ../../t/test_deinit.inc
--enable_result_log
--enable_query_log
--enable_warnings
/* Copyright (C) 2008-2020 Kentoku Shiba /* Copyright (C) 2008-2020 Kentoku Shiba
Copyright (C) 2019-2020 MariaDB corp Copyright (C) 2019-2022 MariaDB corp
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -676,18 +676,15 @@ typedef struct st_spider_lgtm_tblhnd_share ...@@ -676,18 +676,15 @@ typedef struct st_spider_lgtm_tblhnd_share
} SPIDER_LGTM_TBLHND_SHARE; } SPIDER_LGTM_TBLHND_SHARE;
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
typedef struct st_spider_patition_handler_share typedef struct st_spider_patition_handler
{ {
bool clone_bitmap_init; bool clone_bitmap_init;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type table_hash_value;
#endif
query_id_t parallel_search_query_id; query_id_t parallel_search_query_id;
uint no_parts; uint no_parts;
TABLE *table; TABLE *table;
ha_spider *owner; ha_spider *owner;
ha_spider **handlers; ha_spider **handlers;
} SPIDER_PARTITION_HANDLER_SHARE; } SPIDER_PARTITION_HANDLER;
#endif #endif
typedef struct st_spider_wide_share typedef struct st_spider_wide_share
...@@ -701,12 +698,6 @@ typedef struct st_spider_wide_share ...@@ -701,12 +698,6 @@ typedef struct st_spider_wide_share
THR_LOCK lock; THR_LOCK lock;
pthread_mutex_t sts_mutex; pthread_mutex_t sts_mutex;
pthread_mutex_t crd_mutex; pthread_mutex_t crd_mutex;
pthread_mutex_t pt_handler_mutex;
HASH pt_handler_hash;
uint pt_handler_hash_id;
const char *pt_handler_hash_func_name;
const char *pt_handler_hash_file_name;
ulong pt_handler_hash_line_no;
volatile bool sts_init; volatile bool sts_init;
volatile bool crd_init; volatile bool crd_init;
...@@ -751,7 +742,7 @@ typedef struct st_spider_wide_handler ...@@ -751,7 +742,7 @@ typedef struct st_spider_wide_handler
#endif #endif
#endif #endif
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share; SPIDER_PARTITION_HANDLER *partition_handler;
#endif #endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
List<Item> *direct_update_fields; List<Item> *direct_update_fields;
......
/* Copyright (C) 2008-2020 Kentoku Shiba /* Copyright (C) 2008-2020 Kentoku Shiba
Copyright (C) 2019-2020 MariaDB corp Copyright (C) 2019-2022 MariaDB corp
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -432,7 +432,7 @@ uchar *spider_wide_share_get_key( ...@@ -432,7 +432,7 @@ uchar *spider_wide_share_get_key(
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
uchar *spider_pt_handler_share_get_key( uchar *spider_pt_handler_share_get_key(
SPIDER_PARTITION_HANDLER_SHARE *share, SPIDER_PARTITION_HANDLER *share,
size_t *length, size_t *length,
my_bool not_used __attribute__ ((unused)) my_bool not_used __attribute__ ((unused))
) { ) {
...@@ -6436,34 +6436,8 @@ SPIDER_WIDE_SHARE *spider_get_wide_share( ...@@ -6436,34 +6436,8 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
goto error_init_crd_mutex; goto error_init_crd_mutex;
} }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&wide_share->pt_handler_mutex,
MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_pt_handler,
&wide_share->pt_handler_mutex, MY_MUTEX_INIT_FAST))
#endif
{
*error_num = HA_ERR_OUT_OF_MEM;
goto error_init_pt_handler_mutex;
}
if(
my_hash_init(PSI_INSTRUMENT_ME, &wide_share->pt_handler_hash, spd_charset_utf8mb3_bin,
32, 0, 0, (my_hash_get_key) spider_pt_handler_share_get_key, 0, 0)
) {
*error_num = HA_ERR_OUT_OF_MEM;
goto error_init_pt_handler_hash;
}
thr_lock_init(&wide_share->lock); thr_lock_init(&wide_share->lock);
spider_alloc_calc_mem_init(wide_share->pt_handler_hash, 142);
spider_alloc_calc_mem(spider_current_trx,
wide_share->pt_handler_hash,
wide_share->pt_handler_hash.array.max_element *
wide_share->pt_handler_hash.array.size_of_element);
uint old_elements = spider_open_wide_share.array.max_element; uint old_elements = spider_open_wide_share.array.max_element;
#ifdef HASH_UPDATE_WITH_HASH_VALUE #ifdef HASH_UPDATE_WITH_HASH_VALUE
if (my_hash_insert_with_hash_value(&spider_open_wide_share, if (my_hash_insert_with_hash_value(&spider_open_wide_share,
...@@ -6491,14 +6465,6 @@ SPIDER_WIDE_SHARE *spider_get_wide_share( ...@@ -6491,14 +6465,6 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
DBUG_RETURN(wide_share); DBUG_RETURN(wide_share);
error_hash_insert: error_hash_insert:
spider_free_mem_calc(spider_current_trx,
wide_share->pt_handler_hash_id,
wide_share->pt_handler_hash.array.max_element *
wide_share->pt_handler_hash.array.size_of_element);
my_hash_free(&wide_share->pt_handler_hash);
error_init_pt_handler_hash:
pthread_mutex_destroy(&wide_share->pt_handler_mutex);
error_init_pt_handler_mutex:
pthread_mutex_destroy(&wide_share->crd_mutex); pthread_mutex_destroy(&wide_share->crd_mutex);
error_init_crd_mutex: error_init_crd_mutex:
pthread_mutex_destroy(&wide_share->sts_mutex); pthread_mutex_destroy(&wide_share->sts_mutex);
...@@ -6523,12 +6489,6 @@ int spider_free_wide_share( ...@@ -6523,12 +6489,6 @@ int spider_free_wide_share(
#else #else
my_hash_delete(&spider_open_wide_share, (uchar*) wide_share); my_hash_delete(&spider_open_wide_share, (uchar*) wide_share);
#endif #endif
spider_free_mem_calc(spider_current_trx,
wide_share->pt_handler_hash_id,
wide_share->pt_handler_hash.array.max_element *
wide_share->pt_handler_hash.array.size_of_element);
my_hash_free(&wide_share->pt_handler_hash);
pthread_mutex_destroy(&wide_share->pt_handler_mutex);
pthread_mutex_destroy(&wide_share->crd_mutex); pthread_mutex_destroy(&wide_share->crd_mutex);
pthread_mutex_destroy(&wide_share->sts_mutex); pthread_mutex_destroy(&wide_share->sts_mutex);
spider_free(spider_current_trx, wide_share, MYF(0)); spider_free(spider_current_trx, wide_share, MYF(0));
...@@ -8036,15 +7996,15 @@ int spider_get_sts( ...@@ -8036,15 +7996,15 @@ int spider_get_sts(
if (error_num) if (error_num)
{ {
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share = SPIDER_PARTITION_HANDLER *partition_handler =
spider->partition_handler_share; spider->partition_handler;
if ( if (
!share->wide_share->sts_init && !share->wide_share->sts_init &&
sts_sync >= sts_sync_level && sts_sync >= sts_sync_level &&
get_type > 1 && get_type > 1 &&
partition_handler_share && partition_handler &&
partition_handler_share->handlers && partition_handler->handlers &&
partition_handler_share->handlers[0] == spider partition_handler->handlers[0] == spider
) { ) {
int roop_count; int roop_count;
ha_spider *tmp_spider; ha_spider *tmp_spider;
...@@ -8054,11 +8014,11 @@ int spider_get_sts( ...@@ -8054,11 +8014,11 @@ int spider_get_sts(
int tmp_sts_sync; int tmp_sts_sync;
THD *thd = spider->wide_handler->trx->thd; THD *thd = spider->wide_handler->trx->thd;
for (roop_count = 1; for (roop_count = 1;
roop_count < (int) partition_handler_share->no_parts; roop_count < (int) partition_handler->no_parts;
roop_count++) roop_count++)
{ {
tmp_spider = tmp_spider =
(ha_spider *) partition_handler_share->handlers[roop_count]; (ha_spider *) partition_handler->handlers[roop_count];
tmp_share = tmp_spider->share; tmp_share = tmp_spider->share;
tmp_sts_interval = spider_param_sts_interval(thd, share->sts_interval); tmp_sts_interval = spider_param_sts_interval(thd, share->sts_interval);
tmp_sts_mode = spider_param_sts_mode(thd, share->sts_mode); tmp_sts_mode = spider_param_sts_mode(thd, share->sts_mode);
...@@ -8187,15 +8147,15 @@ int spider_get_crd( ...@@ -8187,15 +8147,15 @@ int spider_get_crd(
if (error_num) if (error_num)
{ {
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share = SPIDER_PARTITION_HANDLER *partition_handler =
spider->partition_handler_share; spider->partition_handler;
if ( if (
!share->wide_share->crd_init && !share->wide_share->crd_init &&
crd_sync >= crd_sync_level && crd_sync >= crd_sync_level &&
get_type > 1 && get_type > 1 &&
partition_handler_share && partition_handler &&
partition_handler_share->handlers && partition_handler->handlers &&
partition_handler_share->handlers[0] == spider partition_handler->handlers[0] == spider
) { ) {
int roop_count; int roop_count;
ha_spider *tmp_spider; ha_spider *tmp_spider;
...@@ -8205,11 +8165,11 @@ int spider_get_crd( ...@@ -8205,11 +8165,11 @@ int spider_get_crd(
int tmp_crd_sync; int tmp_crd_sync;
THD *thd = spider->wide_handler->trx->thd; THD *thd = spider->wide_handler->trx->thd;
for (roop_count = 1; for (roop_count = 1;
roop_count < (int) partition_handler_share->no_parts; roop_count < (int) partition_handler->no_parts;
roop_count++) roop_count++)
{ {
tmp_spider = tmp_spider =
(ha_spider *) partition_handler_share->handlers[roop_count]; (ha_spider *) partition_handler->handlers[roop_count];
tmp_share = tmp_spider->share; tmp_share = tmp_spider->share;
tmp_crd_interval = spider_param_crd_interval(thd, share->crd_interval); tmp_crd_interval = spider_param_crd_interval(thd, share->crd_interval);
tmp_crd_mode = spider_param_crd_mode(thd, share->crd_mode); tmp_crd_mode = spider_param_crd_mode(thd, share->crd_mode);
...@@ -9348,10 +9308,10 @@ int spider_set_direct_limit_offset( ...@@ -9348,10 +9308,10 @@ int spider_set_direct_limit_offset(
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if ( if (
spider->partition_handler_share && spider->partition_handler &&
!spider->pt_handler_share_owner !spider->wide_handler_owner
) { ) {
if (spider->partition_handler_share->owner-> if (spider->partition_handler->owner->
result_list.direct_limit_offset == TRUE) result_list.direct_limit_offset == TRUE)
{ {
spider->result_list.direct_limit_offset = TRUE; spider->result_list.direct_limit_offset = TRUE;
......
/* Copyright (C) 2008-2019 Kentoku Shiba /* Copyright (C) 2008-2019 Kentoku Shiba
Copyright (C) 2019 MariaDB corp Copyright (C) 2019-2022 MariaDB corp
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -321,7 +321,7 @@ uchar *spider_wide_share_get_key( ...@@ -321,7 +321,7 @@ uchar *spider_wide_share_get_key(
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
uchar *spider_pt_handler_share_get_key( uchar *spider_pt_handler_share_get_key(
SPIDER_PARTITION_HANDLER_SHARE *share, SPIDER_PARTITION_HANDLER *share,
size_t *length, size_t *length,
my_bool not_used __attribute__ ((unused)) my_bool not_used __attribute__ ((unused))
); );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment