diff options
Diffstat (limited to 'storage/spider/ha_spider.cc')
-rw-r--r-- | storage/spider/ha_spider.cc | 982 |
1 files changed, 891 insertions, 91 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index fb453ddc637..967d2c6e5de 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2008-2015 Kentoku Shiba +/* Copyright (C) 2008-2018 Kentoku Shiba 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 @@ -18,7 +18,9 @@ #endif #define MYSQL_SERVER 1 +#include <my_global.h> #include "mysql_version.h" +#include "spd_environ.h" #if MYSQL_VERSION_ID < 50500 #include "mysql_priv.h" #include <mysql/plugin.h> @@ -62,6 +64,9 @@ extern HASH spider_open_tables; #endif extern pthread_mutex_t spider_lgtm_tblhnd_share_mutex; +/* UTC time zone for timestamp columns */ +extern Time_zone *UTC; + ha_spider::ha_spider( ) : handler(spider_hton_ptr, NULL) { @@ -107,6 +112,9 @@ ha_spider::ha_spider( sql_kinds = 0; error_mode = 0; use_spatial_index = FALSE; +#ifdef SPIDER_HAS_GROUP_BY_HANDLER + use_fields = FALSE; +#endif use_pre_call = FALSE; use_pre_records = FALSE; #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS @@ -151,6 +159,7 @@ ha_spider::ha_spider( result_list.tmp_tables_created = FALSE; result_list.bgs_working = FALSE; result_list.direct_order_limit = FALSE; + result_list.direct_limit_offset = FALSE; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) result_list.hs_has_result = FALSE; #endif @@ -215,6 +224,9 @@ ha_spider::ha_spider( sql_kinds = 0; error_mode = 0; use_spatial_index = FALSE; +#ifdef SPIDER_HAS_GROUP_BY_HANDLER + use_fields = FALSE; +#endif use_pre_call = FALSE; use_pre_records = FALSE; #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS @@ -259,6 +271,7 @@ ha_spider::ha_spider( result_list.tmp_tables_created = FALSE; result_list.bgs_working = FALSE; result_list.direct_order_limit = FALSE; + result_list.direct_limit_offset = FALSE; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) result_list.hs_has_result = FALSE; #endif @@ -414,6 +427,7 @@ int ha_spider::open( partition_handler_share->rnd_bitmap_is_set = FALSE; partition_handler_share->table_hash_value = hash_value; partition_handler_share->creator = this; + partition_handler_share->parallel_search_query_id = 0; pt_handler_share_creator = this; if (part_num) { @@ -481,6 +495,8 @@ int ha_spider::open( } } #endif + memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(searched_bitmap, 0, no_bytes_in_map(table->read_set)); init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); @@ -1307,6 +1323,7 @@ int ha_spider::external_lock( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -1360,6 +1377,7 @@ int ha_spider::external_lock( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -1392,6 +1410,7 @@ int ha_spider::external_lock( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -1427,6 +1446,7 @@ int ha_spider::external_lock( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -1452,6 +1472,7 @@ int ha_spider::external_lock( if (thd_test_options(trx->thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) trans_register_ha(trx->thd, TRUE, spider_hton_ptr); } + if ((conn_kinds & SPIDER_CONN_KIND_HS_READ)) { SPIDER_CONN *hs_conn; @@ -1533,6 +1554,43 @@ int ha_spider::external_lock( } } #endif + + DBUG_PRINT("info",("spider trx_start=%s", trx->trx_start ? "TRUE" : "FALSE")); + /* need to check after spider_internal_start_trx() */ + if (trx->trx_start) + { + switch (sql_command) + { + case SQLCOM_SELECT: + case SQLCOM_HA_READ: +#ifdef HS_HAS_SQLCOM + case SQLCOM_HS_READ: +#endif + /* nothing to do */ + break; + case SQLCOM_UPDATE: + case SQLCOM_UPDATE_MULTI: +#ifdef HS_HAS_SQLCOM + case SQLCOM_HS_UPDATE: +#endif + case SQLCOM_CREATE_TABLE: + case SQLCOM_INSERT: + case SQLCOM_INSERT_SELECT: + case SQLCOM_DELETE: + case SQLCOM_LOAD: + case SQLCOM_REPLACE: + case SQLCOM_REPLACE_SELECT: + case SQLCOM_DELETE_MULTI: +#ifdef HS_HAS_SQLCOM + case SQLCOM_HS_INSERT: + case SQLCOM_HS_DELETE: +#endif + default: + trx->updated_in_this_trx = TRUE; + DBUG_PRINT("info",("spider trx->updated_in_this_trx=TRUE")); + break; + } + } DBUG_RETURN(0); } @@ -1620,7 +1678,11 @@ int ha_spider::reset() partition_handler_share->rnd_bitmap_is_set = FALSE; } #endif - memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + if (!is_clone) + { + memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(searched_bitmap, 0, no_bytes_in_map(table->read_set)); + } if (!(tmp_trx = spider_get_trx(thd, TRUE, &error_num2))) { DBUG_PRINT("info",("spider get trx error")); @@ -1684,6 +1746,7 @@ int ha_spider::reset() trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -1790,6 +1853,7 @@ int ha_spider::reset() prev_index_rnd_init = SPD_NONE; result_list.have_sql_kind_backup = FALSE; result_list.direct_order_limit = FALSE; + result_list.direct_limit_offset = FALSE; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) if ((error_num2 = reset_hs_strs(SPIDER_SQL_TYPE_UPDATE_HS))) error_num = error_num2; @@ -1797,6 +1861,9 @@ int ha_spider::reset() result_list.set_split_read = FALSE; result_list.insert_dup_update_pushdown = FALSE; use_spatial_index = FALSE; +#ifdef SPIDER_HAS_GROUP_BY_HANDLER + use_fields = FALSE; +#endif error_mode = 0; #ifdef HA_CAN_BULK_ACCESS #ifndef DBUG_OFF @@ -1871,9 +1938,14 @@ int ha_spider::extra( DBUG_RETURN(error_num); break; #endif +#if defined(HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN) || defined(HA_EXTRA_HAS_HA_EXTRA_USE_CMP_REF) +#ifdef HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN + case HA_EXTRA_STARTING_ORDERED_INDEX_SCAN: +#endif #ifdef HA_EXTRA_HAS_HA_EXTRA_USE_CMP_REF case HA_EXTRA_USE_CMP_REF: - DBUG_PRINT("info",("spider HA_EXTRA_USE_CMP_REF")); +#endif + DBUG_PRINT("info",("spider HA_EXTRA_STARTING_ORDERED_INDEX_SCAN")); if (table_share->primary_key != MAX_KEY) { DBUG_PRINT("info",("spider need primary key columns")); @@ -2220,6 +2292,7 @@ int ha_spider::index_read_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2303,6 +2376,7 @@ int ha_spider::index_read_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2336,6 +2410,7 @@ int ha_spider::index_read_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2366,6 +2441,7 @@ int ha_spider::index_read_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2712,6 +2788,7 @@ int ha_spider::index_read_last_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2792,6 +2869,7 @@ int ha_spider::index_read_last_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2825,6 +2903,7 @@ int ha_spider::index_read_last_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -2855,6 +2934,7 @@ int ha_spider::index_read_last_map_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3178,6 +3258,7 @@ int ha_spider::index_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3259,6 +3340,7 @@ int ha_spider::index_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3292,6 +3374,7 @@ int ha_spider::index_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3322,6 +3405,7 @@ int ha_spider::index_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3562,6 +3646,7 @@ int ha_spider::index_last_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3643,6 +3728,7 @@ int ha_spider::index_last_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3676,6 +3762,7 @@ int ha_spider::index_last_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -3706,6 +3793,7 @@ int ha_spider::index_last_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4006,6 +4094,7 @@ int ha_spider::read_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4086,6 +4175,7 @@ int ha_spider::read_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4119,6 +4209,7 @@ int ha_spider::read_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4149,6 +4240,7 @@ int ha_spider::read_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4634,6 +4726,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4719,6 +4812,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4753,6 +4847,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -4785,6 +4880,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -5425,6 +5521,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -5513,6 +5610,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -5553,6 +5651,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -5588,6 +5687,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -5618,6 +5718,7 @@ int ha_spider::read_multi_range_first_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6074,6 +6175,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6159,6 +6261,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6193,6 +6296,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6225,6 +6329,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6869,6 +6974,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6957,6 +7063,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -6997,6 +7104,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7032,6 +7140,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7062,6 +7171,7 @@ int ha_spider::read_multi_range_next( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7268,6 +7378,8 @@ int ha_spider::rnd_init( #endif if (quick_targets[roop_count]) { + spider_db_free_one_quick_result( + (SPIDER_RESULT *) result_list.current); DBUG_ASSERT(quick_targets[roop_count] == conns[roop_count]->quick_target); DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", @@ -7365,6 +7477,8 @@ int ha_spider::rnd_next_internal( uchar *buf ) { int error_num; + ha_spider *direct_limit_offset_spider = + (ha_spider *) partition_handler_share->creator; backup_error_status(); DBUG_ENTER("ha_spider::rnd_next_internal"); DBUG_PRINT("info",("spider this=%p", this)); @@ -7396,6 +7510,42 @@ int ha_spider::rnd_next_internal( #ifdef WITH_PARTITION_STORAGE_ENGINE check_select_column(TRUE); #endif + + if (this->result_list.direct_limit_offset) + { + if (direct_limit_offset_spider->direct_select_limit == 0) + { // mean has got all result + DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE)); + } + if ( + partition_handler_share->handlers && + direct_limit_offset_spider->direct_current_offset > 0 + ) { + longlong table_count = this->records(); + DBUG_PRINT("info",("spider table_count=%lld", table_count)); + if (table_count <= direct_limit_offset_spider->direct_current_offset) + { + // skip this spider(partition) + direct_limit_offset_spider->direct_current_offset -= table_count; + DBUG_PRINT("info",("spider direct_current_offset=%lld", + direct_limit_offset_spider->direct_current_offset)); + DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE)); + } + } + + // make the offset/limit statement + DBUG_PRINT("info",("spider direct_current_offset=%lld", + direct_limit_offset_spider->direct_current_offset)); + result_list.internal_offset = direct_limit_offset_spider->direct_current_offset; + DBUG_PRINT("info",("spider direct_select_limit=%lld", + direct_limit_offset_spider->direct_select_limit)); + result_list.internal_limit = direct_limit_offset_spider->direct_select_limit; + result_list.split_read = direct_limit_offset_spider->direct_select_limit; + + // start with this spider(partition) + direct_limit_offset_spider->direct_current_offset = 0; + } + DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; @@ -7499,6 +7649,7 @@ int ha_spider::rnd_next_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7558,6 +7709,7 @@ int ha_spider::rnd_next_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7591,6 +7743,7 @@ int ha_spider::rnd_next_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7621,6 +7774,7 @@ int ha_spider::rnd_next_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -7646,7 +7800,25 @@ int ha_spider::rnd_next_internal( #endif } rnd_scan_and_first = FALSE; + + if (this->result_list.direct_limit_offset) + { + if (buf && (error_num = spider_db_seek_next(buf, this, search_link_idx, + table))) + DBUG_RETURN(check_error_mode_eof(error_num)); + DBUG_RETURN(0); + } } + + if ( + result_list.direct_limit_offset && + direct_limit_offset_spider->direct_select_offset > 0 + ) { + // limit-- for each got row + direct_limit_offset_spider->direct_select_offset--; + DBUG_RETURN(0); + } + if (buf && (error_num = spider_db_seek_next(buf, this, search_link_idx, table))) DBUG_RETURN(check_error_mode_eof(error_num)); @@ -7793,9 +7965,10 @@ int ha_spider::cmp_ref( *field; field++ ) { - if ((ret = (*field)->cmp_binary_offset((uint)ptr_diff))) + if ((ret = (*field)->cmp_binary_offset((uint) ptr_diff))) { - DBUG_PRINT("info",("spider different at %s", (*field)->field_name)); + DBUG_PRINT("info",("spider different at %s", + SPIDER_field_name_str(*field))); break; } } @@ -7898,6 +8071,7 @@ void ha_spider::ft_end() store_error_num = index_end(); } ft_init_without_index_init = FALSE; + handler::ft_end(); DBUG_VOID_RETURN; } @@ -8097,6 +8271,7 @@ int ha_spider::ft_read_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -8150,6 +8325,7 @@ int ha_spider::ft_read_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -8182,6 +8358,7 @@ int ha_spider::ft_read_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -8212,6 +8389,7 @@ int ha_spider::ft_read_internal( trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -8472,6 +8650,7 @@ int ha_spider::info( trx, trx->thd, share, + search_link_idx, (uint32) share->monitoring_sid[search_link_idx], share->table_name, share->table_name_length, @@ -8519,7 +8698,7 @@ int ha_spider::info( } } #ifndef WITHOUT_SPIDER_BG_SEARCH - } else { + } else if (sts_bg_mode == 1) { /* background */ if (!share->bg_sts_init || share->bg_sts_thd_wait) { @@ -8549,6 +8728,14 @@ int ha_spider::info( } else pthread_cond_signal(&share->bg_sts_cond); } + } else { + share->bg_sts_try_time = tmp_time; + share->bg_sts_interval = sts_interval; + share->bg_sts_mode = sts_mode; +#ifdef WITH_PARTITION_STORAGE_ENGINE + share->bg_sts_sync = sts_sync; +#endif + spider_table_add_share_to_sts_thread(share); } #endif pthread_mutex_unlock(&share->sts_mutex); @@ -8742,6 +8929,7 @@ ha_rows ha_spider::records_in_range( trx, trx->thd, share, + search_link_idx, (uint32) share->monitoring_sid[search_link_idx], share->table_name, share->table_name_length, @@ -8782,7 +8970,7 @@ ha_rows ha_spider::records_in_range( } } #ifndef WITHOUT_SPIDER_BG_SEARCH - } else { + } else if (crd_bg_mode == 1) { /* background */ if (!share->bg_crd_init || share->bg_crd_thd_wait) { @@ -8804,6 +8992,14 @@ ha_rows ha_spider::records_in_range( } else pthread_cond_signal(&share->bg_crd_cond); } + } else { + share->bg_crd_try_time = tmp_time; + share->bg_crd_interval = crd_interval; + share->bg_crd_mode = crd_mode; +#ifdef WITH_PARTITION_STORAGE_ENGINE + share->bg_crd_sync = crd_sync; +#endif + spider_table_add_share_to_crd_thread(share); } #endif pthread_mutex_unlock(&share->crd_mutex); @@ -9033,6 +9229,7 @@ int ha_spider::check_crd() trx, trx->thd, share, + search_link_idx, (uint32) share->monitoring_sid[search_link_idx], share->table_name, share->table_name_length, @@ -9067,7 +9264,7 @@ int ha_spider::check_crd() } } #ifndef WITHOUT_SPIDER_BG_SEARCH - } else { + } else if (crd_bg_mode == 1) { /* background */ if (!share->bg_crd_init || share->bg_crd_thd_wait) { @@ -9088,6 +9285,14 @@ int ha_spider::check_crd() } else pthread_cond_signal(&share->bg_crd_cond); } + } else { + share->bg_crd_try_time = tmp_time; + share->bg_crd_interval = crd_interval; + share->bg_crd_mode = crd_mode; +#ifdef WITH_PARTITION_STORAGE_ENGINE + share->bg_crd_sync = crd_sync; +#endif + spider_table_add_share_to_crd_thread(share); } #endif pthread_mutex_unlock(&share->crd_mutex); @@ -9137,11 +9342,11 @@ ha_rows ha_spider::records() use_pre_records = FALSE; DBUG_RETURN(0); } - if (!(share->additional_table_flags & HA_HAS_RECORDS)) + if (!(share->additional_table_flags & HA_HAS_RECORDS) && !this->result_list.direct_limit_offset) { DBUG_RETURN(handler::records()); } - if (!use_pre_records) + if (!use_pre_records && !this->result_list.direct_limit_offset) { THD *thd = trx->thd; if ( @@ -9192,6 +9397,9 @@ ulonglong ha_spider::table_flags() const HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_PARTIAL_COLUMN_READ | +#ifdef HA_CMP_REF_IS_EXPENSIVE + HA_CMP_REF_IS_EXPENSIVE | +#endif #ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON HA_CAN_TABLE_CONDITION_PUSHDOWN | #endif @@ -9203,6 +9411,9 @@ ulonglong ha_spider::table_flags() const SPIDER_CAN_BG_SEARCH | SPIDER_CAN_BG_INSERT | SPIDER_CAN_BG_UPDATE | +#ifdef HA_CAN_DIRECT_UPDATE_AND_DELETE + HA_CAN_DIRECT_UPDATE_AND_DELETE | +#endif #ifdef HA_CAN_FORCE_BULK_UPDATE (share && share->force_bulk_update ? HA_CAN_FORCE_BULK_UPDATE : 0) | #endif @@ -9564,6 +9775,9 @@ int ha_spider::write_row( DBUG_RETURN(error_num); } #endif +#ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT + ha_statistic_increment(&SSV::ha_write_count); +#endif #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000 #else if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT) @@ -9724,7 +9938,7 @@ bool ha_spider::start_bulk_update( } int ha_spider::exec_bulk_update( - uint *dup_key_found + ha_rows *dup_key_found ) { int error_num; backup_error_status(); @@ -9736,7 +9950,7 @@ int ha_spider::exec_bulk_update( DBUG_RETURN(0); } -void ha_spider::end_bulk_update( +int ha_spider::end_bulk_update( ) { int error_num; backup_error_status(); @@ -9745,26 +9959,43 @@ void ha_spider::end_bulk_update( if ((error_num = check_and_end_bulk_update(SPD_BU_START_BY_BULK_INIT))) { if (check_error_mode(error_num)) - my_errno = error_num; + DBUG_RETURN(error_num); } - DBUG_VOID_RETURN; + DBUG_RETURN(0); } +#ifdef SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA +int ha_spider::bulk_update_row( + const uchar *old_data, + const uchar *new_data, + ha_rows *dup_key_found +) +#else int ha_spider::bulk_update_row( const uchar *old_data, uchar *new_data, - uint *dup_key_found -) { + ha_rows *dup_key_found +) +#endif +{ DBUG_ENTER("ha_spider::bulk_update_row"); DBUG_PRINT("info",("spider this=%p", this)); *dup_key_found = 0; DBUG_RETURN(update_row(old_data, new_data)); } +#ifdef SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA +int ha_spider::update_row( + const uchar *old_data, + const uchar *new_data +) +#else int ha_spider::update_row( const uchar *old_data, uchar *new_data -) { +) +#endif +{ int error_num; THD *thd = ha_thd(); backup_error_status(); @@ -9799,6 +10030,9 @@ int ha_spider::update_row( DBUG_RETURN(error_num); } #endif +#ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT + ha_statistic_increment(&SSV::ha_update_count); +#endif #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS do_direct_update = FALSE; #endif @@ -9851,13 +10085,26 @@ int ha_spider::update_row( } #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS +#ifdef SPIDER_MDEV_16246 int ha_spider::direct_update_rows_init( + List<Item> *update_fields, uint mode, KEY_MULTI_RANGE *ranges, uint range_count, bool sorted, uchar *new_data -) { +) +#else +int ha_spider::direct_update_rows_init( + uint mode, + KEY_MULTI_RANGE *ranges, + uint range_count, + bool sorted, + uchar *new_data +) +#endif +{ #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) int error_num; #endif @@ -9884,8 +10131,13 @@ int ha_spider::direct_update_rows_init( pre_direct_init_result)); DBUG_RETURN(pre_direct_init_result); } +#ifdef SPIDER_MDEV_16246 + DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_update_rows_init( + update_fields, mode, ranges, range_count, sorted, new_data)); +#else DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_update_rows_init( mode, ranges, range_count, sorted, new_data)); +#endif } #endif direct_update_init( @@ -9988,39 +10240,245 @@ int ha_spider::direct_update_rows_init( do_direct_update = FALSE; DBUG_RETURN(HA_ERR_WRONG_COMMAND); } +#else +#ifdef SPIDER_MDEV_16246 +/** + Perform initialization for a direct update request. + + @param update fields Pointer to the list of fields to update. + + @return >0 Error. + 0 Success. +*/ + +int ha_spider::direct_update_rows_init( + List<Item> *update_fields +) +#else +int ha_spider::direct_update_rows_init() +#endif +{ + st_select_lex *select_lex; + longlong select_limit; + longlong offset_limit; + List_iterator<Item> it(*direct_update_fields); + Item *item; + Field *field; + THD *thd = trx->thd; + DBUG_ENTER("ha_spider::direct_update_rows_init"); + DBUG_PRINT("info",("spider this=%p", this)); + if (thd->variables.time_zone != UTC) + { + while ((item = it++)) + { + if (item->type() == Item::FIELD_ITEM) + { + field = ((Item_field *)item)->field; + + if (field->type() == FIELD_TYPE_TIMESTAMP && + field->flags & UNIQUE_KEY_FLAG) + { + /* + Spider cannot perform direct update on unique timestamp fields. + To avoid false duplicate key errors, the table needs to be + updated one row at a time. + */ + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + } + } + } +#ifdef HA_CAN_BULK_ACCESS + if ( + bulk_access_executing && + ( + ( + !is_bulk_access_clone && + bulk_access_link_exec_tgt->called + ) || + bulk_access_pre_called + ) + ) { + if (is_bulk_access_clone) + { + DBUG_PRINT("info",("spider return pre_direct_init_result %d", + pre_direct_init_result)); + DBUG_RETURN(pre_direct_init_result); + } +#ifdef SPIDER_MDEV_16246 + DBUG_RETURN(bulk_access_link_exec_tgt->spider-> + direct_update_rows_init(update_fields)); +#else + DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_update_rows_init()); +#endif + } +#endif + direct_update_init( + thd, + FALSE + ); + if (!condition) + cond_check = FALSE; + spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit); + if (direct_update_fields) + { + if ( +#if MYSQL_VERSION_ID < 50500 + !thd->variables.engine_condition_pushdown || +#else +#ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON +#else + !(thd->variables.optimizer_switch & + OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) || +#endif +#endif + !select_lex || + select_lex->table_list.elements != 1 || + check_update_columns_sql_part() || + spider_db_append_condition(this, NULL, 0, TRUE) + ) { + DBUG_PRINT("info",("spider FALSE by condition")); + do_direct_update = FALSE; + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + if (select_lex->order_list.elements) + { + ORDER *order; + for (order = (ORDER *) select_lex->order_list.first; order; + order = order->next) + { + if (check_item_type_sql((*order->item))) + { + DBUG_PRINT("info",("spider FALSE by order")); + do_direct_update = FALSE; + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + } + result_list.direct_order_limit = TRUE; + } + trx->direct_update_count++; + DBUG_PRINT("info",("spider OK")); + DBUG_RETURN(0); + } + + DBUG_PRINT("info",("spider offset_limit=%lld", offset_limit)); + DBUG_PRINT("info",("spider sql_command=%u", sql_command)); + DBUG_PRINT("info",("spider do_direct_update=%s", + do_direct_update ? "TRUE" : "FALSE")); + if ( + !offset_limit && + do_direct_update + ) { + trx->direct_update_count++; + DBUG_PRINT("info",("spider OK")); + DBUG_RETURN(0); + } + DBUG_PRINT("info",("spider FALSE by default")); + do_direct_update = FALSE; + DBUG_RETURN(HA_ERR_WRONG_COMMAND); +} +#endif #ifdef HA_CAN_BULK_ACCESS +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS +#ifdef SPIDER_MDEV_16246 int ha_spider::pre_direct_update_rows_init( + List<Item> *update_fields, uint mode, KEY_MULTI_RANGE *ranges, uint range_count, bool sorted, uchar *new_data -) { +) +#else +int ha_spider::pre_direct_update_rows_init( + uint mode, + KEY_MULTI_RANGE *ranges, + uint range_count, + bool sorted, + uchar *new_data +) +#endif +{ int error_num; DBUG_ENTER("ha_spider::pre_direct_update_rows_init"); DBUG_PRINT("info",("spider this=%p", this)); if (bulk_access_started) { +#ifdef SPIDER_MDEV_16246 + error_num = bulk_access_link_current->spider-> + pre_direct_update_rows_init( + update_fields, mode, ranges, range_count, sorted, new_data); +#else error_num = bulk_access_link_current->spider-> - ha_pre_direct_update_rows_init( + pre_direct_update_rows_init( mode, ranges, range_count, sorted, new_data); +#endif bulk_access_link_current->spider->bulk_access_pre_called = TRUE; bulk_access_link_current->called = TRUE; DBUG_RETURN(error_num); } +#ifdef SPIDER_MDEV_16246 + pre_direct_init_result = direct_update_rows_init( + update_fields, mode, ranges, range_count, sorted, new_data); +#else pre_direct_init_result = direct_update_rows_init( mode, ranges, range_count, sorted, new_data); +#endif + DBUG_RETURN(pre_direct_init_result); +} +#else +#ifdef SPIDER_MDEV_16246 +/** + Do initialization for performing parallel direct update + for a handlersocket update request. + + @param update fields Pointer to the list of fields to update. + + @return >0 Error. + 0 Success. +*/ + +int ha_spider::pre_direct_update_rows_init( + List<Item> *update_fields +) +#else +int ha_spider::pre_direct_update_rows_init() +#endif +{ + int error_num; + DBUG_ENTER("ha_spider::pre_direct_update_rows_init"); + DBUG_PRINT("info",("spider this=%p", this)); + if (bulk_access_started) + { +#ifdef SPIDER_MDEV_16246 + error_num = bulk_access_link_current->spider-> + pre_direct_update_rows_init(update_fields); +#else + error_num = bulk_access_link_current->spider-> + pre_direct_update_rows_init(); +#endif + bulk_access_link_current->spider->bulk_access_pre_called = TRUE; + bulk_access_link_current->called = TRUE; + DBUG_RETURN(error_num); + } +#ifdef SPIDER_MDEV_16246 + pre_direct_init_result = direct_update_rows_init(update_fields); +#else + pre_direct_init_result = direct_update_rows_init(); +#endif DBUG_RETURN(pre_direct_init_result); } #endif +#endif +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS int ha_spider::direct_update_rows( KEY_MULTI_RANGE *ranges, uint range_count, bool sorted, uchar *new_data, - uint *update_rows + ha_rows *update_rows ) { int error_num; THD *thd = ha_thd(); @@ -10070,20 +10528,83 @@ int ha_spider::direct_update_rows( #endif DBUG_RETURN(0); } +#else +int ha_spider::direct_update_rows( + ha_rows *update_rows +) { + int error_num; + THD *thd = ha_thd(); + backup_error_status(); + DBUG_ENTER("ha_spider::direct_update_rows"); + DBUG_PRINT("info",("spider this=%p", this)); + if (spider_param_read_only_mode(thd, share->read_only_mode)) + { + my_printf_error(ER_SPIDER_READ_ONLY_NUM, ER_SPIDER_READ_ONLY_STR, MYF(0), + table_share->db.str, table_share->table_name.str); + DBUG_RETURN(ER_SPIDER_READ_ONLY_NUM); + } +#ifdef HA_CAN_BULK_ACCESS + if ( + bulk_access_executing && + ( + ( + !is_bulk_access_clone && + bulk_access_link_exec_tgt->called + ) || + bulk_access_pre_called + ) + ) { + if (is_bulk_access_clone) + { + bulk_access_pre_called = FALSE; + DBUG_RETURN(spider_db_bulk_direct_update(this, update_rows)); + } + DBUG_RETURN(bulk_access_link_exec_tgt->spider->ha_direct_update_rows( + update_rows)); + } +#endif + if ( + (active_index != MAX_KEY && (error_num = index_handler_init())) || + (active_index == MAX_KEY && (error_num = rnd_handler_init())) || + (error_num = spider_db_direct_update(this, table, update_rows)) + ) + DBUG_RETURN(check_error_mode(error_num)); #ifdef HA_CAN_BULK_ACCESS + if (bulk_access_executing && is_bulk_access_clone) + { + bulk_req_exec(); + DBUG_RETURN(spider_db_bulk_direct_update(this, update_rows)); + } +#endif + DBUG_RETURN(0); +} +#endif + +#ifdef HA_CAN_BULK_ACCESS +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS int ha_spider::pre_direct_update_rows( KEY_MULTI_RANGE *ranges, uint range_count, bool sorted, uchar *new_data, - uint *update_rows + ha_rows *update_rows ) { DBUG_ENTER("ha_spider::pre_direct_update_rows"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(bulk_access_link_current->spider->ha_direct_update_rows(ranges, range_count, sorted, new_data, update_rows)); } +#else +int ha_spider::pre_direct_update_rows() +{ + uint update_rows; + DBUG_ENTER("ha_spider::pre_direct_update_rows"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(bulk_access_link_current->spider->ha_direct_update_rows( + &update_rows)); +} +#endif #endif #endif @@ -10141,6 +10662,9 @@ int ha_spider::delete_row( DBUG_RETURN(error_num); } #endif +#ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT + ha_statistic_increment(&SSV::ha_delete_count); +#endif #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS do_direct_update = FALSE; #endif @@ -10150,6 +10674,7 @@ int ha_spider::delete_row( } #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS int ha_spider::direct_delete_rows_init( uint mode, KEY_MULTI_RANGE *ranges, @@ -10261,8 +10786,81 @@ int ha_spider::direct_delete_rows_init( do_direct_update = FALSE; DBUG_RETURN(HA_ERR_WRONG_COMMAND); } +#else +int ha_spider::direct_delete_rows_init() +{ + st_select_lex *select_lex; + longlong select_limit; + longlong offset_limit; + THD *thd = trx->thd; + DBUG_ENTER("ha_spider::direct_delete_rows_init"); + DBUG_PRINT("info",("spider this=%p", this)); +#ifdef HA_CAN_BULK_ACCESS + if ( + bulk_access_executing && + ( + ( + !is_bulk_access_clone && + bulk_access_link_exec_tgt->called + ) || + bulk_access_pre_called + ) + ) { + if (is_bulk_access_clone) + { + DBUG_RETURN(pre_direct_init_result); + } + DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_delete_rows_init()); + } +#endif + direct_update_init( + thd, + FALSE + ); + if (!condition) + cond_check = FALSE; + spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit); + if ( +#if MYSQL_VERSION_ID < 50500 + !thd->variables.engine_condition_pushdown || +#else +#ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON +#else + !(thd->variables.optimizer_switch & + OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) || +#endif +#endif + !select_lex || + select_lex->table_list.elements != 1 || + spider_db_append_condition(this, NULL, 0, TRUE) + ) { + DBUG_PRINT("info",("spider FALSE by condition")); + do_direct_update = FALSE; + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + if (select_lex->order_list.elements) + { + ORDER *order; + for (order = (ORDER *) select_lex->order_list.first; order; + order = order->next) + { + if (check_item_type_sql((*order->item))) + { + DBUG_PRINT("info",("spider FALSE by order")); + do_direct_update = FALSE; + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + } + result_list.direct_order_limit = TRUE; + } + trx->direct_delete_count++; + DBUG_PRINT("info",("spider OK")); + DBUG_RETURN(0); +} +#endif #ifdef HA_CAN_BULK_ACCESS +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS int ha_spider::pre_direct_delete_rows_init( uint mode, KEY_MULTI_RANGE *ranges, @@ -10275,7 +10873,7 @@ int ha_spider::pre_direct_delete_rows_init( if (bulk_access_started) { error_num = bulk_access_link_current->spider-> - ha_pre_direct_delete_rows_init( + pre_direct_delete_rows_init( mode, ranges, range_count, sorted); bulk_access_link_current->spider->bulk_access_pre_called = TRUE; bulk_access_link_current->called = TRUE; @@ -10285,13 +10883,32 @@ int ha_spider::pre_direct_delete_rows_init( mode, ranges, range_count, sorted); DBUG_RETURN(pre_direct_init_result); } +#else +int ha_spider::pre_direct_delete_rows_init() +{ + int error_num; + DBUG_ENTER("ha_spider::pre_direct_delete_rows_init"); + DBUG_PRINT("info",("spider this=%p", this)); + if (bulk_access_started) + { + error_num = bulk_access_link_current->spider-> + pre_direct_delete_rows_init(); + bulk_access_link_current->spider->bulk_access_pre_called = TRUE; + bulk_access_link_current->called = TRUE; + DBUG_RETURN(error_num); + } + pre_direct_init_result = direct_delete_rows_init(); + DBUG_RETURN(pre_direct_init_result); +} +#endif #endif +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS int ha_spider::direct_delete_rows( KEY_MULTI_RANGE *ranges, uint range_count, bool sorted, - uint *delete_rows + ha_rows *delete_rows ) { int error_num; THD *thd = ha_thd(); @@ -10341,19 +10958,82 @@ int ha_spider::direct_delete_rows( #endif DBUG_RETURN(0); } +#else +int ha_spider::direct_delete_rows( + ha_rows *delete_rows +) { + int error_num; + THD *thd = ha_thd(); + backup_error_status(); + DBUG_ENTER("ha_spider::direct_delete_rows"); + DBUG_PRINT("info",("spider this=%p", this)); + if (spider_param_read_only_mode(thd, share->read_only_mode)) + { + my_printf_error(ER_SPIDER_READ_ONLY_NUM, ER_SPIDER_READ_ONLY_STR, MYF(0), + table_share->db.str, table_share->table_name.str); + DBUG_RETURN(ER_SPIDER_READ_ONLY_NUM); + } +#ifdef HA_CAN_BULK_ACCESS + if ( + bulk_access_executing && + ( + ( + !is_bulk_access_clone && + bulk_access_link_exec_tgt->called + ) || + bulk_access_pre_called + ) + ) { + if (is_bulk_access_clone) + { + bulk_access_pre_called = FALSE; + DBUG_RETURN(spider_db_bulk_direct_update(this, delete_rows)); + } + DBUG_RETURN(bulk_access_link_exec_tgt->spider->ha_direct_delete_rows( + delete_rows)); + } +#endif + if ( + (active_index != MAX_KEY && (error_num = index_handler_init())) || + (active_index == MAX_KEY && (error_num = rnd_handler_init())) || + (error_num = spider_db_direct_delete(this, table, delete_rows)) + ) + DBUG_RETURN(check_error_mode(error_num)); + +#ifdef HA_CAN_BULK_ACCESS + if (bulk_access_executing && is_bulk_access_clone) + { + bulk_req_exec(); + DBUG_RETURN(spider_db_bulk_direct_update(this, delete_rows)); + } +#endif + DBUG_RETURN(0); +} +#endif #ifdef HA_CAN_BULK_ACCESS +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS int ha_spider::pre_direct_delete_rows( KEY_MULTI_RANGE *ranges, uint range_count, bool sorted, - uint *delete_rows + ha_rows *delete_rows ) { DBUG_ENTER("ha_spider::pre_direct_delete_rows"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(bulk_access_link_current->spider->ha_direct_delete_rows( ranges, range_count, sorted, delete_rows)); } +#else +int ha_spider::pre_direct_delete_rows() +{ + uint delete_rows; + DBUG_ENTER("ha_spider::pre_direct_delete_rows"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(bulk_access_link_current->spider->ha_direct_delete_rows( + &delete_rows)); +} +#endif #endif #endif @@ -10538,7 +11218,17 @@ void ha_spider::print_error( DBUG_ENTER("ha_spider::print_error"); DBUG_PRINT("info",("spider this=%p", this)); if (!current_thd->is_error()) - handler::print_error(error, errflag); + { + switch (error) + { + case ER_SPIDER_CON_COUNT_ERROR: + my_message(error, ER_SPIDER_CON_COUNT_ERROR_STR, MYF(0)); + break; + default: + handler::print_error(error, errflag); + break; + } + } DBUG_VOID_RETURN; } @@ -10570,7 +11260,7 @@ int ha_spider::create( TABLE *form, HA_CREATE_INFO *info ) { - int error_num; + int error_num, dummy; SPIDER_SHARE tmp_share; THD *thd = ha_thd(); uint sql_command = thd_sql_command(thd), roop_count; @@ -10605,7 +11295,7 @@ int ha_spider::create( error_num = ER_SPIDER_ALTER_BEFORE_UNLOCK_NUM; goto error_alter_before_unlock; } - memset(&tmp_share, 0, sizeof(SPIDER_SHARE)); + memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE)); tmp_share.table_name = (char*) name; tmp_share.table_name_length = strlen(name); #ifdef SPIDER_HAS_HASH_VALUE_TYPE @@ -10661,6 +11351,15 @@ int ha_spider::create( ) { goto error; } +#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE + if ( + thd->lex->create_info.or_replace() && + (error_num = spider_delete_tables( + table_tables, tmp_share.table_name, &dummy)) + ) { + goto error; + } +#endif if ( (error_num = spider_insert_tables(table_tables, &tmp_share)) ) { @@ -10695,13 +11394,13 @@ int ha_spider::create( trx->tmp_flg = TRUE; DBUG_PRINT("info", - ("spider alter_info.flags=%u", thd->lex->alter_info.flags)); - if ( - (thd->lex->alter_info.flags & + ("spider alter_info.flags: %llu alter_info.partition_flags: %lu", + thd->lex->alter_info.flags, thd->lex->alter_info.partition_flags)); + if ((thd->lex->alter_info.partition_flags & ( - SPIDER_ALTER_ADD_PARTITION | SPIDER_ALTER_DROP_PARTITION | - SPIDER_ALTER_COALESCE_PARTITION | SPIDER_ALTER_REORGANIZE_PARTITION | - SPIDER_ALTER_TABLE_REORG | SPIDER_ALTER_REBUILD_PARTITION + SPIDER_ALTER_PARTITION_ADD | SPIDER_ALTER_PARTITION_DROP | + SPIDER_ALTER_PARTITION_COALESCE | SPIDER_ALTER_PARTITION_REORGANIZE | + SPIDER_ALTER_PARTITION_TABLE_REORG | SPIDER_ALTER_PARTITION_REBUILD ) ) && memcmp(name + strlen(name) - 5, "#TMP#", 5) @@ -10856,7 +11555,13 @@ int ha_spider::rename_table( /* release table mon list */ for (roop_count = 0; roop_count < old_link_count; roop_count++) - spider_release_ping_table_mon_list(from, from_len, roop_count); + { + if ((error_num = + spider_release_ping_table_mon_list(from, from_len, roop_count))) + { + goto error; + } + } } else if (sql_command == SQLCOM_ALTER_TABLE) { DBUG_PRINT("info",("spider alter_table_from=%p", alter_table_from)); @@ -10885,13 +11590,14 @@ int ha_spider::rename_table( } DBUG_PRINT("info", - ("spider alter_info.flags=%u", thd->lex->alter_info.flags)); + ("spider alter_info.flags: %llu alter_info.partition_flags: %lu", + thd->lex->alter_info.flags, thd->lex->alter_info.partition_flags)); if ( - (thd->lex->alter_info.flags & + (thd->lex->alter_info.partition_flags & ( - SPIDER_ALTER_ADD_PARTITION | SPIDER_ALTER_DROP_PARTITION | - SPIDER_ALTER_COALESCE_PARTITION | SPIDER_ALTER_REORGANIZE_PARTITION | - SPIDER_ALTER_TABLE_REORG | SPIDER_ALTER_REBUILD_PARTITION + SPIDER_ALTER_PARTITION_ADD | SPIDER_ALTER_PARTITION_DROP | + SPIDER_ALTER_PARTITION_COALESCE | SPIDER_ALTER_PARTITION_REORGANIZE | + SPIDER_ALTER_PARTITION_TABLE_REORG | SPIDER_ALTER_PARTITION_REBUILD ) ) ) @@ -10938,9 +11644,21 @@ int ha_spider::rename_table( /* release table mon list */ for (roop_count = 0; roop_count < (int) alter_table_from->all_link_count; roop_count++) - spider_release_ping_table_mon_list(from, from_len, roop_count); + { + if ((error_num = + spider_release_ping_table_mon_list(from, from_len, roop_count))) + { + goto error; + } + } for (roop_count = 0; roop_count < old_link_count; roop_count++) - spider_release_ping_table_mon_list(to, to_len, roop_count); + { + if ((error_num = + spider_release_ping_table_mon_list(to, to_len, roop_count))) + { + goto error; + } + } } /* spider_free_trx_alter_table_alloc(trx, alter_table_from); @@ -11068,19 +11786,26 @@ int ha_spider::delete_table( DBUG_RETURN(0); DBUG_PRINT("info", - ("spider alter_info.flags=%u", thd->lex->alter_info.flags)); + ("spider alter_info.flags: %llu alter_info.partition_flags: %lu", + thd->lex->alter_info.flags, thd->lex->alter_info.partition_flags)); if ( sql_command == SQLCOM_ALTER_TABLE && - (thd->lex->alter_info.flags & + (thd->lex->alter_info.partition_flags & ( - SPIDER_ALTER_ADD_PARTITION | SPIDER_ALTER_DROP_PARTITION | - SPIDER_ALTER_COALESCE_PARTITION | SPIDER_ALTER_REORGANIZE_PARTITION | - SPIDER_ALTER_TABLE_REORG | SPIDER_ALTER_REBUILD_PARTITION + SPIDER_ALTER_PARTITION_ADD | SPIDER_ALTER_PARTITION_DROP | + SPIDER_ALTER_PARTITION_COALESCE | SPIDER_ALTER_PARTITION_REORGANIZE | + SPIDER_ALTER_PARTITION_TABLE_REORG | SPIDER_ALTER_PARTITION_REBUILD ) ) ) need_lock = TRUE; + if ((error_num = spider_sys_delete_table_sts( + current_thd, name, name_len, need_lock))) + goto error; + if ((error_num = spider_sys_delete_table_crd( + current_thd, name, name_len, need_lock))) + goto error; if ( !(table_tables = spider_open_sys_table( current_thd, SPIDER_SYS_TABLES_TABLE_NAME_STR, @@ -11101,7 +11826,11 @@ int ha_spider::delete_table( /* release table mon list */ for (roop_count = 0; roop_count < old_link_count; roop_count++) - spider_release_ping_table_mon_list(name, name_len, roop_count); + { + if ((error_num = + spider_release_ping_table_mon_list(name, name_len, roop_count))) + goto error; + } pthread_mutex_lock(&spider_lgtm_tblhnd_share_mutex); #ifdef SPIDER_HAS_HASH_VALUE_TYPE @@ -11292,15 +12021,18 @@ Field *ha_spider::field_exchange( } #endif DBUG_PRINT("info",("spider in field=%p", field)); + DBUG_PRINT("info",("spider in field->table=%p", field->table)); #ifdef HANDLER_HAS_TOP_TABLE_FIELDS if (set_top_table_fields) { + DBUG_PRINT("info",("spider top_table=%p", top_table)); if (field->table != top_table) DBUG_RETURN(NULL); if (!(field = top_table_field[field->field_index])) DBUG_RETURN(NULL); } else { #endif + DBUG_PRINT("info",("spider table=%p", table)); if (field->table != table) DBUG_RETURN(NULL); #ifdef HANDLER_HAS_TOP_TABLE_FIELDS @@ -11480,6 +12212,7 @@ int ha_spider::info_push( hs_decrement = FALSE; break; #endif +#ifdef INFO_KIND_UPDATE_FIELDS case INFO_KIND_UPDATE_FIELDS: DBUG_PRINT("info",("spider INFO_KIND_UPDATE_FIELDS")); direct_update_fields = (List<Item> *) info; @@ -11489,10 +12222,13 @@ int ha_spider::info_push( keyread = FALSE; #endif break; +#endif +#ifdef INFO_KIND_UPDATE_VALUES case INFO_KIND_UPDATE_VALUES: DBUG_PRINT("info",("spider INFO_KIND_UPDATE_VALUES")); direct_update_values = (List<Item> *) info; break; +#endif #ifdef INFO_KIND_FORCE_LIMIT_BEGIN case INFO_KIND_FORCE_LIMIT_BEGIN: DBUG_PRINT("info",("spider INFO_KIND_FORCE_LIMIT_BEGIN")); @@ -11771,8 +12507,22 @@ void ha_spider::set_searched_bitmap() void ha_spider::set_clone_searched_bitmap() { DBUG_ENTER("ha_spider::set_clone_searched_bitmap"); + DBUG_PRINT("info",("spider searched_bitmap=%p", searched_bitmap)); +#ifndef DBUG_OFF + int roop_count; + for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8); + roop_count++) + DBUG_PRINT("info", ("spider before searched_bitmap is %x", + ((uchar *) searched_bitmap)[roop_count])); +#endif memcpy(searched_bitmap, pt_clone_source_handler->searched_bitmap, (table_share->fields + 7) / 8); +#ifndef DBUG_OFF + for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8); + roop_count++) + DBUG_PRINT("info", ("spider after searched_bitmap is %x", + ((uchar *) searched_bitmap)[roop_count])); +#endif memcpy(ft_discard_bitmap, pt_clone_source_handler->ft_discard_bitmap, (table_share->fields + 7) / 8); DBUG_VOID_RETURN; @@ -12025,7 +12775,7 @@ int ha_spider::check_and_end_bulk_update( spider_bulk_upd_start bulk_upd_start ) { int error_num = 0; - uint dup_key_found = 0; + ha_rows dup_key_found = 0; DBUG_ENTER("ha_spider::check_and_end_bulk_update"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider bulk_update_start=%d", @@ -12077,6 +12827,8 @@ void ha_spider::check_direct_order_limit() sql_kind[roop_count] = SPIDER_SQL_KIND_SQL; } else result_list.direct_order_limit = FALSE; + + spider_set_direct_limit_offset(this); result_list.check_direct_order_limit = TRUE; } DBUG_VOID_RETURN; @@ -12095,27 +12847,27 @@ void ha_spider::check_direct_order_limit() ********************************************************************/ 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 && - result_list.keyread && result_list.check_direct_order_limit ) - { - // SELECT DISTINCT query using an index in a non-partitioned configuration - KEY_PART_INFO* key_part = result_list.key_info->key_part; - Field* key_field = key_part->field; + if ( result_list.direct_distinct && !partition_handler_share->handlers && + result_list.keyread && result_list.check_direct_order_limit ) + { + // SELECT DISTINCT query using an index in a non-partitioned configuration + KEY_PART_INFO* key_part = result_list.key_info->key_part; + Field* key_field = key_part->field; - if ( is_sole_projection_field( key_field->field_index ) ) - { - // Projection list consists solely of the first key prefix column + if ( is_sole_projection_field( key_field->field_index ) ) + { + // Projection list consists solely of the first key prefix column - // Set the internal row retrieval limit to avoid visiting each row - // multiple times. This fixes a Spider performance bug that - // caused each row to be visited multiple times. - result_list.internal_limit = 1; - } + // Set the internal row retrieval limit to avoid visiting each row + // multiple times. This fixes a Spider performance bug that + // caused each row to be visited multiple times. + result_list.internal_limit = 1; } + } - DBUG_VOID_RETURN; + DBUG_VOID_RETURN; } /******************************************************************** @@ -12130,31 +12882,32 @@ void ha_spider::check_distinct_key_query() * solely of the specified column. * FALSE - otherwise. ********************************************************************/ -bool ha_spider::is_sole_projection_field( uint16 field_index ) -{ - // NOTE: It is assumed that spider_db_append_select_columns() has already been called - // to build the bitmap of projection fields - bool is_ha_sole_projection_field; - uint loop_index, dbton_id; - spider_db_handler* dbton_hdl; - DBUG_ENTER( "ha_spider::is_sole_projection_field" ); +bool ha_spider::is_sole_projection_field( + uint16 field_index +) { + // NOTE: It is assumed that spider_db_append_select_columns() has already been called + // to build the bitmap of projection fields + bool is_ha_sole_projection_field; + uint loop_index, dbton_id; + spider_db_handler* dbton_hdl; + DBUG_ENTER( "ha_spider::is_sole_projection_field" ); - for ( loop_index = 0; loop_index < share->use_sql_dbton_count; loop_index++ ) - { - dbton_id = share->use_sql_dbton_ids[ loop_index ]; - dbton_hdl = dbton_handler[ dbton_id ]; + for ( loop_index = 0; loop_index < share->use_sql_dbton_count; loop_index++ ) + { + dbton_id = share->use_sql_dbton_ids[ loop_index ]; + dbton_hdl = dbton_handler[ dbton_id ]; - if ( dbton_hdl->first_link_idx >= 0 ) - { - is_ha_sole_projection_field = dbton_hdl->is_sole_projection_field( field_index ); - if ( !is_ha_sole_projection_field ) - { - DBUG_RETURN( FALSE ); - } - } + if ( dbton_hdl->first_link_idx >= 0 ) + { + is_ha_sole_projection_field = dbton_hdl->is_sole_projection_field( field_index ); + if ( !is_ha_sole_projection_field ) + { + DBUG_RETURN( FALSE ); + } } + } - DBUG_RETURN( TRUE ); + DBUG_RETURN( TRUE ); } int ha_spider::check_ha_range_eof() @@ -12251,6 +13004,7 @@ int ha_spider::drop_tmp_tables() trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -12286,6 +13040,7 @@ int ha_spider::drop_tmp_tables() trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -12405,6 +13160,7 @@ int ha_spider::close_opened_handler( trx, trx->thd, share, + link_idx, (uint32) share->monitoring_sid[link_idx], share->table_name, share->table_name_length, @@ -12440,6 +13196,7 @@ int ha_spider::close_opened_handler( trx, trx->thd, share, + link_idx, (uint32) share->monitoring_sid[link_idx], share->table_name, share->table_name_length, @@ -12481,6 +13238,7 @@ int ha_spider::close_opened_handler( trx, trx->thd, share, + link_idx, (uint32) share->monitoring_sid[link_idx], share->table_name, share->table_name_length, @@ -12582,6 +13340,7 @@ int ha_spider::index_handler_init() trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -12688,6 +13447,7 @@ int ha_spider::rnd_handler_init() trx, trx->thd, share, + roop_count, (uint32) share->monitoring_sid[roop_count], share->table_name, share->table_name_length, @@ -12843,15 +13603,44 @@ int ha_spider::check_error_mode_eof( void ha_spider::check_pre_call( bool use_parallel ) { + THD* thd = ha_thd(); + LEX *lex = thd->lex; + st_select_lex *select_lex = spider_get_select_lex(this); + int skip_parallel_search = + spider_param_skip_parallel_search(thd, share->skip_parallel_search); DBUG_ENTER("ha_spider::check_pre_call"); DBUG_PRINT("info",("spider this=%p", this)); + if ( + ( + (skip_parallel_search & 1) && + lex->sql_command != SQLCOM_SELECT // such like insert .. select .. + ) || + ( + (skip_parallel_search & 2) && +#ifdef SPIDER_SQL_CACHE_IS_IN_LEX + lex->sql_cache == LEX::SQL_NO_CACHE // for mysqldump +#else + select_lex && select_lex->sql_cache == SELECT_LEX::SQL_NO_CACHE // for mysqldump +#endif + ) + ) { + use_pre_call = FALSE; + DBUG_VOID_RETURN; + } + if ( + use_parallel && + thd->query_id != partition_handler_share->parallel_search_query_id + ) { + partition_handler_share->parallel_search_query_id = thd->query_id; + ++trx->parallel_search_count; + } use_pre_call = use_parallel; if (!use_pre_call) { - st_select_lex *select_lex; longlong select_limit; longlong offset_limit; - spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit); + spider_get_select_limit_from_select_lex( + select_lex, &select_limit, &offset_limit); if ( select_lex && (!select_lex->explicit_limit || !select_limit) @@ -14978,12 +15767,23 @@ int ha_spider::mk_bulk_tmp_table_and_bulk_start() dbton_hdl->first_link_idx >= 0 && dbton_hdl->need_copy_for_update(roop_count) ) { +#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor + LEX_CSTRING field_name = {STRING_WITH_LEN("a")}; + if ( + !tmp_table[roop_count] && + !(tmp_table[roop_count] = spider_mk_sys_tmp_table( + trx->thd, table, &result_list.upd_tmp_tbl_prms[roop_count], + &field_name, result_list.update_sqls[roop_count].charset())) + ) +#else if ( !tmp_table[roop_count] && !(tmp_table[roop_count] = spider_mk_sys_tmp_table( trx->thd, table, &result_list.upd_tmp_tbl_prms[roop_count], "a", result_list.update_sqls[roop_count].charset())) - ) { + ) +#endif + { error_num = HA_ERR_OUT_OF_MEM; goto error_2; } @@ -15080,8 +15880,8 @@ int ha_spider::print_item_type( dbton_hdl = dbton_handler[dbton_id]; if ( dbton_hdl->first_link_idx >= 0 && - (error_num = spider_db_print_item_type(item, this, str, - alias, alias_length, dbton_id)) + (error_num = spider_db_print_item_type(item, NULL, this, str, + alias, alias_length, dbton_id, FALSE, NULL)) ) { DBUG_RETURN(error_num); } |