summaryrefslogtreecommitdiff
path: root/storage/spider
diff options
context:
space:
mode:
Diffstat (limited to 'storage/spider')
-rw-r--r--storage/spider/ha_spider.cc268
-rw-r--r--storage/spider/ha_spider.h5
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_27240.result16
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_27240.cnf2
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_27240.test28
-rw-r--r--storage/spider/spd_include.h17
-rw-r--r--storage/spider/spd_table.cc90
-rw-r--r--storage/spider/spd_table.h10
8 files changed, 170 insertions, 266 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index faf5dc5c159..f51e67559b7 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -1,5 +1,5 @@
/* 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
it under the terms of the GNU General Public License as published by
@@ -88,8 +88,7 @@ ha_spider::ha_spider(
#endif
search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
- partition_handler_share = NULL;
- pt_handler_share_owner = FALSE;
+ partition_handler = NULL;
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
multi_range_keys = NULL;
@@ -192,8 +191,7 @@ ha_spider::ha_spider(
#endif
search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
- partition_handler_share = NULL;
- pt_handler_share_owner = FALSE;
+ partition_handler = NULL;
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
multi_range_keys = NULL;
@@ -280,12 +278,7 @@ ha_spider::~ha_spider()
DBUG_ENTER("ha_spider::~ha_spider");
DBUG_PRINT("info",("spider this=%p", this));
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (pt_handler_share_owner)
- {
- spider_free(spider_current_trx, partition_handler_share, MYF(0));
- pt_handler_share_owner = FALSE;
- }
- partition_handler_share = NULL;
+ partition_handler = NULL;
#endif
if (wide_handler_owner)
{
@@ -342,14 +335,9 @@ int ha_spider::open(
SPIDER_WIDE_SHARE *wide_share;
#ifdef WITH_PARTITION_STORAGE_ENGINE
uint part_num;
- bool pt_handler_share_alloc = FALSE;
- bool pt_handler_mutex = FALSE;
- ha_spider **pt_handler_share_handlers = NULL;
+ bool partition_handler_alloc = FALSE;
+ ha_spider **wide_handler_handlers = NULL;
ha_partition *clone_source;
- ha_spider *pt_handler_share_key;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type hash_value;
-#endif
#endif
DBUG_ENTER("ha_spider::open");
DBUG_PRINT("info",("spider this=%p", this));
@@ -360,18 +348,14 @@ int ha_spider::open(
table->file->get_no_parts("", &part_num);
if (part_num)
{
- pt_handler_share_handlers =
+ wide_handler_handlers =
(ha_spider **) ((ha_partition *) table->file)->get_child_handlers();
- spider = pt_handler_share_handlers[0];
- owner = pt_handler_share_handlers[part_num - 1];
+ spider = wide_handler_handlers[0];
+ owner = wide_handler_handlers[part_num - 1];
clone_source = ((ha_partition *) table->file)->get_clone_source();
if (clone_source)
{
- pt_handler_share_key = (ha_spider *)
- clone_source->get_child_handlers()[0];
is_clone = TRUE;
- } else {
- pt_handler_share_key = spider;
}
} else {
#endif
@@ -379,7 +363,6 @@ int ha_spider::open(
owner = this;
#ifdef WITH_PARTITION_STORAGE_ENGINE
clone_source = NULL;
- pt_handler_share_key = this;
}
#endif
if (!spider->wide_handler)
@@ -392,6 +375,7 @@ int ha_spider::open(
uchar *rnd_read_bitmap;
uchar *rnd_write_bitmap;
if (!(wide_handler = (SPIDER_WIDE_HANDLER *)
+#ifdef WITH_PARTITION_STORAGE_ENGINE
spider_bulk_malloc(spider_current_trx, 16, MYF(MY_WME | MY_ZEROFILL),
&wide_handler, sizeof(SPIDER_WIDE_HANDLER),
&searched_bitmap,
@@ -408,7 +392,29 @@ int ha_spider::open(
(uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
&rnd_write_bitmap,
(uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
- NullS))
+ &partition_handler,
+ (uint) sizeof(SPIDER_PARTITION_HANDLER),
+ NullS)
+#else
+ spider_bulk_malloc(spider_current_trx, 16, MYF(MY_WME | MY_ZEROFILL),
+ &wide_handler, sizeof(SPIDER_WIDE_HANDLER),
+ &searched_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ &ft_discard_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ &position_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ &idx_read_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ &idx_write_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ &rnd_read_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ &rnd_write_bitmap,
+ (uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
+ NullS)
+#endif
+ )
) {
error_num = HA_ERR_OUT_OF_MEM;
goto error_wide_handler_alloc;
@@ -422,6 +428,9 @@ int ha_spider::open(
wide_handler->idx_write_bitmap = idx_write_bitmap;
wide_handler->rnd_read_bitmap = rnd_read_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;
if (table_share->tmp_table == NO_TMP_TABLE)
wide_handler->top_share = table->s;
@@ -431,81 +440,37 @@ int ha_spider::open(
memset(wide_handler->searched_bitmap, 0,
no_bytes_in_map(table->read_set));
wide_handler_alloc = TRUE;
- } else {
- wide_handler = spider->wide_handler;
- }
+
if (!share && !spider_get_share(name, table, thd, this, &error_num))
goto error_get_share;
wide_share = share->wide_share;
+
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ DBUG_PRINT("info",("spider create partition_handler"));
+ DBUG_PRINT("info",("spider table=%p", table));
+ partition_handler->table = table;
+ partition_handler->no_parts = part_num;
+ partition_handler->owner = owner;
+ partition_handler->parallel_search_query_id = 0;
+ spider->partition_handler = partition_handler;
+ owner->partition_handler = partition_handler;
+ partition_handler->handlers = wide_handler_handlers;
+ partition_handler_alloc = TRUE;
+ } else {
+ 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);
}
-#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (!wide_handler->partition_handler_share)
- {
- 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));
- partition_handler_share->table = table;
- partition_handler_share->table_hash_value = hash_value;
- partition_handler_share->no_parts = part_num;
- partition_handler_share->owner = owner;
- partition_handler_share->parallel_search_query_id = 0;
- spider->partition_handler_share = partition_handler_share;
- owner->partition_handler_share = partition_handler_share;
- 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;
- } else {
- partition_handler_share = wide_handler->partition_handler_share;
- }
#endif
init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
@@ -572,10 +537,10 @@ int ha_spider::open(
{
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 =
- partition_handler_share->handlers[roop_count];
+ partition_handler->handlers[roop_count];
break;
}
}
@@ -589,10 +554,10 @@ int ha_spider::open(
{
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();
- partition_handler_share->clone_bitmap_init = TRUE;
+ partition_handler->clone_bitmap_init = TRUE;
}
set_clone_searched_bitmap();
wide_handler->position_bitmap_init = FALSE;
@@ -623,31 +588,13 @@ error_reset:
error_init_blob_buff:
error_init_result_list:
#ifdef WITH_PARTITION_STORAGE_ENGINE
-error_hash_insert:
- if (pt_handler_share_alloc)
+ if (partition_handler_alloc)
{
wide_share = share->wide_share;
- if (!pt_handler_mutex)
- 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);
- 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;
+ spider->partition_handler = NULL;
+ owner->partition_handler = NULL;
}
-error_partition_handler_share_alloc:
- if (pt_handler_mutex)
- pthread_mutex_unlock(&wide_share->pt_handler_mutex);
- partition_handler_share = NULL;
+ partition_handler = NULL;
#endif
spider_free_share(share);
share = NULL;
@@ -661,9 +608,9 @@ error_get_share:
{
spider_free(spider_current_trx, wide_handler, MYF(0));
#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
spider->wide_handler = NULL;
@@ -679,7 +626,6 @@ int ha_spider::close()
{
int error_num = 0, roop_count, error_num2;
THD *thd = ha_thd();
- SPIDER_WIDE_SHARE *wide_share;
backup_error_status();
DBUG_ENTER("ha_spider::close");
DBUG_PRINT("info",("spider this=%p", this));
@@ -769,23 +715,7 @@ int ha_spider::close()
conn_keys = NULL;
}
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (pt_handler_share_owner)
- {
- 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;
+ partition_handler = NULL;
#endif
if (wide_handler_owner)
{
@@ -1169,14 +1099,14 @@ THR_LOCK_DATA **ha_spider::store_lock(
) {
wide_handler->lock_table_type = 1;
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (partition_handler_share && partition_handler_share->handlers)
+ if (partition_handler && partition_handler->handlers)
{
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)
{
if (unlikely((store_error_num =
- partition_handler_share->handlers[roop_count]->
+ partition_handler->handlers[roop_count]->
append_lock_tables_list())))
{
break;
@@ -1204,15 +1134,15 @@ THR_LOCK_DATA **ha_spider::store_lock(
) {
wide_handler->lock_table_type = 2;
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (partition_handler_share && partition_handler_share->handlers)
+ if (partition_handler && partition_handler->handlers)
{
uint roop_count;
for (roop_count = 0;
- roop_count < partition_handler_share->no_parts;
+ roop_count < partition_handler->no_parts;
++roop_count)
{
if (unlikely((store_error_num =
- partition_handler_share->handlers[roop_count]->
+ partition_handler->handlers[roop_count]->
append_lock_tables_list())))
{
break;
@@ -1333,14 +1263,14 @@ int ha_spider::external_lock(
/* lock/unlock tables */
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (partition_handler_share && partition_handler_share->handlers)
+ if (partition_handler && partition_handler->handlers)
{
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)
{
if (unlikely((error_num =
- partition_handler_share->handlers[roop_count]->lock_tables())))
+ partition_handler->handlers[roop_count]->lock_tables())))
{
DBUG_RETURN(error_num);
}
@@ -1574,7 +1504,7 @@ int ha_spider::reset()
use_pre_action = FALSE;
pre_bitmap_checked = 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.use_union = FALSE;
result_list.use_both_key = FALSE;
@@ -7489,7 +7419,7 @@ int ha_spider::rnd_next_internal(
) {
int error_num;
ha_spider *direct_limit_offset_spider =
- (ha_spider *) partition_handler_share->owner;
+ (ha_spider *) partition_handler->owner;
backup_error_status();
DBUG_ENTER("ha_spider::rnd_next_internal");
DBUG_PRINT("info",("spider this=%p", this));
@@ -7529,7 +7459,7 @@ int ha_spider::rnd_next_internal(
DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE));
}
if (
- partition_handler_share->handlers &&
+ partition_handler->handlers &&
direct_limit_offset_spider->direct_current_offset > 0
) {
longlong table_count = this->records();
@@ -12488,11 +12418,11 @@ int ha_spider::info_push(
break;
}
wide_handler->hs_pushed_strref_num++;
- if (partition_handler_share && partition_handler_share->handlers)
+ if (partition_handler && partition_handler->handlers)
{
size_t roop_count;
- ha_spider **handlers = partition_handler_share->handlers;
- for (roop_count = 0; roop_count < partition_handler_share->no_parts;
+ ha_spider **handlers = partition_handler->handlers;
+ for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->push_back_hs_upds(
@@ -12512,11 +12442,11 @@ int ha_spider::info_push(
case INFO_KIND_HS_CLEAR_STRING_REF:
DBUG_PRINT("info",("spider INFO_KIND_HS_CLEAR_STRING_REF"));
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;
- ha_spider **handlers = partition_handler_share->handlers;
- for (roop_count = 0; roop_count < partition_handler_share->no_parts;
+ ha_spider **handlers = partition_handler->handlers;
+ for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->reset_hs_upds(
@@ -12580,11 +12510,11 @@ int ha_spider::info_push(
#ifdef HA_CAN_BULK_ACCESS
case 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;
- ha_spider **handlers = partition_handler_share->handlers;
- for (roop_count = 0; roop_count < partition_handler_share->no_parts;
+ ha_spider **handlers = partition_handler->handlers;
+ for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->bulk_access_begin(info)))
@@ -12601,11 +12531,11 @@ int ha_spider::info_push(
break;
case 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;
- ha_spider **handlers = partition_handler_share->handlers;
- for (roop_count = 0; roop_count < partition_handler_share->no_parts;
+ ha_spider **handlers = partition_handler->handlers;
+ for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->bulk_access_current(info)))
@@ -12622,11 +12552,11 @@ int ha_spider::info_push(
break;
case 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;
- ha_spider **handlers = partition_handler_share->handlers;
- for (roop_count = 0; roop_count < partition_handler_share->no_parts;
+ ha_spider **handlers = partition_handler->handlers;
+ for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
handlers[roop_count]->bulk_access_end();
@@ -13123,7 +13053,7 @@ void 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 )
{
// SELECT DISTINCT query using an index in a non-partitioned configuration
@@ -13923,9 +13853,9 @@ void ha_spider::check_pre_call(
}
if (
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;
}
use_pre_call = use_parallel;
diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h
index 5bc58397f28..3036f8d522a 100644
--- a/storage/spider/ha_spider.h
+++ b/storage/spider/ha_spider.h
@@ -1,5 +1,5 @@
/* 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
it under the terms of the GNU General Public License as published by
@@ -92,8 +92,7 @@ public:
SPIDER_POSITION *pushed_pos;
SPIDER_POSITION pushed_pos_buf;
#ifdef WITH_PARTITION_STORAGE_ENGINE
- bool pt_handler_share_owner = FALSE;
- SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share;
+ SPIDER_PARTITION_HANDLER *partition_handler;
#endif
bool wide_handler_owner = FALSE;
SPIDER_WIDE_HANDLER *wide_handler = NULL;
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27240.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_27240.result
new file mode 100644
index 00000000000..9dd247337ee
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27240.result
@@ -0,0 +1,16 @@
+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
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27240.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_27240.cnf
new file mode 100644
index 00000000000..b0853e32654
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27240.cnf
@@ -0,0 +1,2 @@
+!include include/default_mysqld.cnf
+!include ../my_1_1.cnf
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27240.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27240.test
new file mode 100644
index 00000000000..552ce3aa6de
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27240.test
@@ -0,0 +1,28 @@
+--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
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index b1be05c72b2..00389a71b09 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -1,5 +1,5 @@
/* 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
it under the terms of the GNU General Public License as published by
@@ -688,18 +688,15 @@ typedef struct st_spider_lgtm_tblhnd_share
} SPIDER_LGTM_TBLHND_SHARE;
#ifdef WITH_PARTITION_STORAGE_ENGINE
-typedef struct st_spider_patition_handler_share
+typedef struct st_spider_patition_handler
{
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;
uint no_parts;
TABLE *table;
ha_spider *owner;
ha_spider **handlers;
-} SPIDER_PARTITION_HANDLER_SHARE;
+} SPIDER_PARTITION_HANDLER;
#endif
typedef struct st_spider_wide_share
@@ -713,12 +710,6 @@ typedef struct st_spider_wide_share
THR_LOCK lock;
pthread_mutex_t sts_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 crd_init;
@@ -763,7 +754,7 @@ typedef struct st_spider_wide_handler
#endif
#endif
#ifdef WITH_PARTITION_STORAGE_ENGINE
- SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share;
+ SPIDER_PARTITION_HANDLER *partition_handler;
#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
List<Item> *direct_update_fields;
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index a4b16bcb81a..04333d973a3 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -1,5 +1,5 @@
/* 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
it under the terms of the GNU General Public License as published by
@@ -184,7 +184,6 @@ PSI_mutex_key spd_key_mutex_share_auto_increment;
#ifdef WITH_PARTITION_STORAGE_ENGINE
PSI_mutex_key spd_key_mutex_wide_share_sts;
PSI_mutex_key spd_key_mutex_wide_share_crd;
-PSI_mutex_key spd_key_mutex_pt_handler;
#endif
PSI_mutex_key spd_key_mutex_udf_table;
PSI_mutex_key spd_key_mutex_mem_calc;
@@ -244,7 +243,6 @@ static PSI_mutex_info all_spider_mutexes[]=
#ifdef WITH_PARTITION_STORAGE_ENGINE
{ &spd_key_mutex_wide_share_sts, "wide_share_sts", 0},
{ &spd_key_mutex_wide_share_crd, "wide_share_crd", 0},
- { &spd_key_mutex_pt_handler, "pt_handler", 0},
#endif
{ &spd_key_mutex_udf_table, "udf_table", 0},
{ &spd_key_mutex_conn_loop_check, "conn_loop_check", 0},
@@ -430,18 +428,6 @@ uchar *spider_wide_share_get_key(
DBUG_RETURN((uchar*) share->table_name);
}
-#ifdef WITH_PARTITION_STORAGE_ENGINE
-uchar *spider_pt_handler_share_get_key(
- SPIDER_PARTITION_HANDLER_SHARE *share,
- size_t *length,
- my_bool not_used __attribute__ ((unused))
-) {
- DBUG_ENTER("spider_pt_handler_share_get_key");
- *length = sizeof(ha_spider *);
- DBUG_RETURN((uchar*) share->owner);
-}
-#endif
-
uchar *spider_lgtm_tblhnd_share_hash_get_key(
SPIDER_LGTM_TBLHND_SHARE *share,
size_t *length,
@@ -6609,34 +6595,8 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
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);
- 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;
#ifdef HASH_UPDATE_WITH_HASH_VALUE
if (my_hash_insert_with_hash_value(&spider_open_wide_share,
@@ -6664,14 +6624,6 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
DBUG_RETURN(wide_share);
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);
error_init_crd_mutex:
pthread_mutex_destroy(&wide_share->sts_mutex);
@@ -6696,12 +6648,6 @@ int spider_free_wide_share(
#else
my_hash_delete(&spider_open_wide_share, (uchar*) wide_share);
#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->sts_mutex);
spider_free(spider_current_trx, wide_share, MYF(0));
@@ -8210,15 +8156,15 @@ int spider_get_sts(
if (error_num)
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
- SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share =
- spider->partition_handler_share;
+ SPIDER_PARTITION_HANDLER *partition_handler =
+ spider->partition_handler;
if (
!share->wide_share->sts_init &&
sts_sync >= sts_sync_level &&
get_type > 1 &&
- partition_handler_share &&
- partition_handler_share->handlers &&
- partition_handler_share->handlers[0] == spider
+ partition_handler &&
+ partition_handler->handlers &&
+ partition_handler->handlers[0] == spider
) {
int roop_count;
ha_spider *tmp_spider;
@@ -8228,11 +8174,11 @@ int spider_get_sts(
int tmp_sts_sync;
THD *thd = spider->wide_handler->trx->thd;
for (roop_count = 1;
- roop_count < (int) partition_handler_share->no_parts;
+ roop_count < (int) partition_handler->no_parts;
roop_count++)
{
tmp_spider =
- (ha_spider *) partition_handler_share->handlers[roop_count];
+ (ha_spider *) partition_handler->handlers[roop_count];
tmp_share = tmp_spider->share;
tmp_sts_interval = spider_param_sts_interval(thd, share->sts_interval);
tmp_sts_mode = spider_param_sts_mode(thd, share->sts_mode);
@@ -8362,15 +8308,15 @@ int spider_get_crd(
if (error_num)
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
- SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share =
- spider->partition_handler_share;
+ SPIDER_PARTITION_HANDLER *partition_handler =
+ spider->partition_handler;
if (
!share->wide_share->crd_init &&
crd_sync >= crd_sync_level &&
get_type > 1 &&
- partition_handler_share &&
- partition_handler_share->handlers &&
- partition_handler_share->handlers[0] == spider
+ partition_handler &&
+ partition_handler->handlers &&
+ partition_handler->handlers[0] == spider
) {
int roop_count;
ha_spider *tmp_spider;
@@ -8380,11 +8326,11 @@ int spider_get_crd(
int tmp_crd_sync;
THD *thd = spider->wide_handler->trx->thd;
for (roop_count = 1;
- roop_count < (int) partition_handler_share->no_parts;
+ roop_count < (int) partition_handler->no_parts;
roop_count++)
{
tmp_spider =
- (ha_spider *) partition_handler_share->handlers[roop_count];
+ (ha_spider *) partition_handler->handlers[roop_count];
tmp_share = tmp_spider->share;
tmp_crd_interval = spider_param_crd_interval(thd, share->crd_interval);
tmp_crd_mode = spider_param_crd_mode(thd, share->crd_mode);
@@ -9529,10 +9475,10 @@ int spider_set_direct_limit_offset(
DBUG_RETURN(TRUE);
if (
- spider->partition_handler_share &&
- !spider->pt_handler_share_owner
+ spider->partition_handler &&
+ !spider->wide_handler_owner
) {
- if (spider->partition_handler_share->owner->
+ if (spider->partition_handler->owner->
result_list.direct_limit_offset == TRUE)
{
spider->result_list.direct_limit_offset = TRUE;
diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h
index 2b40fb33d5a..dc351e73c61 100644
--- a/storage/spider/spd_table.h
+++ b/storage/spider/spd_table.h
@@ -1,5 +1,5 @@
/* 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
it under the terms of the GNU General Public License as published by
@@ -319,14 +319,6 @@ uchar *spider_wide_share_get_key(
my_bool not_used __attribute__ ((unused))
);
-#ifdef WITH_PARTITION_STORAGE_ENGINE
-uchar *spider_pt_handler_share_get_key(
- SPIDER_PARTITION_HANDLER_SHARE *share,
- size_t *length,
- my_bool not_used __attribute__ ((unused))
-);
-#endif
-
uchar *spider_link_get_key(
SPIDER_LINK_FOR_HASH *link_for_hash,
size_t *length,