59
59
PSI_mutex_key spd_key_mutex_open_conn;
60
60
PSI_mutex_key spd_key_mutex_allocated_thds;
61
PSI_mutex_key spd_key_mutex_mon_table_cache;
61
62
PSI_mutex_key spd_key_mutex_udf_table_mon;
62
63
PSI_mutex_key spd_key_mutex_mta_conn;
63
64
#ifndef WITHOUT_SPIDER_BG_SEARCH
99
100
{ &spd_key_mutex_open_conn, "open_conn", PSI_FLAG_GLOBAL},
100
101
{ &spd_key_mutex_allocated_thds, "allocated_thds", PSI_FLAG_GLOBAL},
102
{ &spd_key_mutex_mon_table_cache, "mon_table_cache", PSI_FLAG_GLOBAL},
101
103
{ &spd_key_mutex_udf_table_mon, "udf_table_mon", PSI_FLAG_GLOBAL},
102
104
{ &spd_key_mutex_mta_conn, "mta_conn", 0},
103
105
#ifndef WITHOUT_SPIDER_BG_SEARCH
179
181
extern pthread_mutex_t *spider_udf_table_mon_mutexes;
180
182
extern pthread_cond_t *spider_udf_table_mon_conds;
181
183
extern pthread_mutex_t spider_open_conn_mutex;
184
extern pthread_mutex_t spider_mon_table_cache_mutex;
185
extern DYNAMIC_ARRAY spider_mon_table_cache;
183
187
HASH spider_open_tables;
184
188
pthread_mutex_t spider_tbl_mutex;
543
547
my_free(share->tgt_default_groups, MYF(0));
549
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
550
if (share->hs_read_socks)
552
for (roop_count = 0; roop_count < share->hs_read_socks_length;
555
if (share->hs_read_socks[roop_count])
556
my_free(share->hs_read_socks[roop_count], MYF(0));
558
my_free(share->hs_read_socks, MYF(0));
560
if (share->hs_write_socks)
562
for (roop_count = 0; roop_count < share->hs_write_socks_length;
565
if (share->hs_write_socks[roop_count])
566
my_free(share->hs_write_socks[roop_count], MYF(0));
568
my_free(share->hs_write_socks, MYF(0));
545
571
if (share->bka_engine)
546
572
my_free(share->bka_engine, MYF(0));
547
573
if (share->conn_keys)
559
585
if (share->monitoring_kind)
560
586
my_free(share->monitoring_kind, MYF(0));
587
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
588
if (share->use_hs_reads)
589
my_free(share->use_hs_reads, MYF(0));
590
if (share->use_hs_writes)
591
my_free(share->use_hs_writes, MYF(0));
592
if (share->hs_read_ports)
593
my_free(share->hs_read_ports, MYF(0));
594
if (share->hs_write_ports)
595
my_free(share->hs_write_ports, MYF(0));
597
if (share->use_handlers)
598
my_free(share->use_handlers, MYF(0));
561
599
#ifndef WITHOUT_SPIDER_BG_SEARCH
562
600
if (share->monitoring_bg_interval)
563
601
my_free(share->monitoring_bg_interval, MYF(0));
665
703
my_free(share->tgt_default_groups[0], MYF(0));
666
704
share->tgt_default_groups[0] = NULL;
706
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
707
if (share->hs_read_socks && share->hs_read_socks[0])
709
my_free(share->hs_read_socks[0], MYF(0));
710
share->hs_read_socks[0] = NULL;
712
if (share->hs_write_socks && share->hs_write_socks[0])
714
my_free(share->hs_write_socks[0], MYF(0));
715
share->hs_write_socks[0] = NULL;
668
718
if (share->bka_engine)
670
720
my_free(share->bka_engine, MYF(0));
1556
1606
share->auto_increment_mode = -1;
1557
1607
share->use_table_charset = -1;
1558
1608
share->use_pushdown_udf = -1;
1609
share->skip_default_condition = -1;
1559
1610
share->direct_dup_insert = -1;
1611
share->direct_order_limit = -1;
1560
1612
share->bka_mode = -1;
1562
1614
#ifdef WITH_PARTITION_STORAGE_ENGINE
1689
1741
SPIDER_PARAM_INT_WITH_MAX("ddi", direct_dup_insert, 0, 1);
1690
1742
SPIDER_PARAM_STR_LIST("dff", tgt_default_files);
1691
1743
SPIDER_PARAM_STR_LIST("dfg", tgt_default_groups);
1744
SPIDER_PARAM_LONGLONG("dol", direct_order_limit, 0);
1692
1745
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
1693
1746
SPIDER_PARAM_LONG_LIST_WITH_MAX(
1694
1747
"hrp", hs_read_ports, 0, 65535);
1732
1785
SPIDER_PARAM_INT_WITH_MAX("scm", select_column_mode, 0, 1);
1733
1786
SPIDER_PARAM_STR_LIST("scp", tgt_ssl_capaths);
1734
1787
SPIDER_PARAM_STR_LIST("scr", tgt_ssl_certs);
1788
SPIDER_PARAM_INT_WITH_MAX("sdc", skip_default_condition, 0, 1);
1735
1789
SPIDER_PARAM_STR_LIST("sky", tgt_ssl_keys);
1736
1790
SPIDER_PARAM_LONG_LIST_WITH_MAX("svc", tgt_ssl_vscs, 0, 1);
1737
1791
SPIDER_PARAM_INT("srt", scan_rate, 0);
1945
1999
SPIDER_PARAM_LONG_LIST_WITH_MAX(
1946
2000
"monitoring_bg_kind", monitoring_bg_kind, 0, 3);
2002
SPIDER_PARAM_LONGLONG(
2003
"direct_order_limit", direct_order_limit, 0);
1948
2004
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
1949
2005
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
1950
2006
MYF(0), tmp_ptr);
1978
2034
SPIDER_PARAM_LONGLONG_LIST_WITH_MAX(
1979
2035
"monitoring_bg_interval", monitoring_bg_interval, 0, 4294967295);
2037
SPIDER_PARAM_INT_WITH_MAX(
2038
"skip_default_condition", skip_default_condition, 0, 1);
1981
2039
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
1982
2040
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
1983
2041
MYF(0), tmp_ptr);
2957
3015
share->use_table_charset = 1;
2958
3016
if (share->use_pushdown_udf == -1)
2959
3017
share->use_pushdown_udf = 1;
3018
if (share->skip_default_condition == -1)
3019
share->skip_default_condition = 1;
2960
3020
if (share->direct_dup_insert == -1)
2961
3021
share->direct_dup_insert = 0;
3022
if (share->direct_order_limit == -1)
3023
share->direct_order_limit = 0;
2962
3024
if (share->bka_mode == -1)
2963
3025
share->bka_mode = 1;
2964
3026
if (!share->bka_engine)
4403
4468
SPIDER_SHARE tmp_share;
4404
4469
char *db_name, *table_name;
4405
4470
uint db_name_length, table_name_length;
4406
char *tmp_connect_info[15];
4407
uint tmp_connect_info_length[15];
4409
longlong tmp_longlong[3];
4471
char *tmp_connect_info[SPIDER_TMP_SHARE_CHAR_PTR_COUNT];
4472
uint tmp_connect_info_length[SPIDER_TMP_SHARE_UINT_COUNT];
4473
long tmp_long[SPIDER_TMP_SHARE_LONG_COUNT];
4474
longlong tmp_longlong[SPIDER_TMP_SHARE_LONGLONG_COUNT];
4410
4475
SPIDER_CONN *conn, **conns;
4411
4476
ha_spider *spider;
4412
4477
SPIDER_SHARE *share;
4523
4588
if (!(share = (SPIDER_SHARE *)
4524
4589
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
4525
4590
&share, sizeof(*share),
4526
&connect_info, sizeof(char *) * 15,
4527
&connect_info_length, sizeof(uint) * 15,
4528
&long_info, sizeof(long) * 5,
4529
&longlong_info, sizeof(longlong) * 3,
4591
&connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
4592
&connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
4593
&long_info, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
4594
&longlong_info, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
4530
4595
&conns, sizeof(SPIDER_CONN *),
4531
4596
&need_mon, sizeof(int),
4789
4855
pthread_mutex_unlock(&spider_init_error_tbl_mutex);
4790
4856
my_hash_free(&spider_init_error_tables);
4791
4857
my_hash_free(&spider_open_tables);
4858
pthread_mutex_destroy(&spider_mon_table_cache_mutex);
4792
4859
pthread_mutex_destroy(&spider_allocated_thds_mutex);
4793
4860
pthread_mutex_destroy(&spider_open_conn_mutex);
4794
4861
#ifndef WITHOUT_SPIDER_BG_SEARCH
4969
5036
error_num = HA_ERR_OUT_OF_MEM;
4970
5037
goto error_allocated_thds_mutex_init;
5039
#if MYSQL_VERSION_ID < 50500
5040
if (pthread_mutex_init(&spider_mon_table_cache_mutex, MY_MUTEX_INIT_FAST))
5042
if (mysql_mutex_init(spd_key_mutex_mon_table_cache,
5043
&spider_mon_table_cache_mutex, MY_MUTEX_INIT_FAST))
5046
error_num = HA_ERR_OUT_OF_MEM;
5047
goto error_mon_table_cache_mutex_init;
4974
5051
my_hash_init(&spider_open_tables, system_charset_info, 32, 0, 0,
5024
5101
goto error_allocated_thds_hash_init;
5105
my_init_dynamic_array2(&spider_mon_table_cache, sizeof(SPIDER_MON_KEY),
5108
error_num = HA_ERR_OUT_OF_MEM;
5109
goto error_mon_table_cache_array_init;
5027
5112
if (!(spider_udf_table_mon_mutexes = (pthread_mutex_t *)
5028
5113
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
5029
5114
&spider_udf_table_mon_mutexes, sizeof(pthread_mutex_t) *
5101
5186
pthread_mutex_destroy(&spider_udf_table_mon_mutexes[roop_count]);
5102
5187
my_free(spider_udf_table_mon_mutexes, MYF(0));
5103
5188
error_alloc_mon_mutxes:
5189
delete_dynamic(&spider_mon_table_cache);
5190
error_mon_table_cache_array_init:
5104
5191
my_hash_free(&spider_allocated_thds);
5105
5192
error_allocated_thds_hash_init:
5106
5193
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
5119
5206
error_init_error_tables_hash_init:
5120
5207
my_hash_free(&spider_open_tables);
5121
5208
error_open_tables_hash_init:
5209
pthread_mutex_destroy(&spider_mon_table_cache_mutex);
5210
error_mon_table_cache_mutex_init:
5122
5211
pthread_mutex_destroy(&spider_allocated_thds_mutex);
5123
5212
error_allocated_thds_mutex_init:
5124
5213
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
5656
5745
tmp_share->tgt_ssl_keys = &tmp_connect_info[12];
5657
5746
tmp_share->tgt_default_files = &tmp_connect_info[13];
5658
5747
tmp_share->tgt_default_groups = &tmp_connect_info[14];
5748
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
5749
tmp_share->hs_read_socks = &tmp_connect_info[15];
5750
tmp_share->hs_write_socks = &tmp_connect_info[16];
5659
5752
tmp_share->tgt_ports = &tmp_long[0];
5660
5753
tmp_share->tgt_ssl_vscs = &tmp_long[1];
5661
5754
tmp_share->link_statuses = &tmp_long[2];
5663
5756
#ifndef WITHOUT_SPIDER_BG_SEARCH
5664
5757
tmp_share->monitoring_bg_kind = &tmp_long[4];
5759
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
5760
tmp_share->use_hs_reads = &tmp_long[5];
5761
tmp_share->use_hs_writes = &tmp_long[6];
5762
tmp_share->hs_read_ports = &tmp_long[7];
5763
tmp_share->hs_write_ports = &tmp_long[8];
5765
tmp_share->use_handlers = &tmp_long[9];
5666
5766
tmp_share->monitoring_limit = &tmp_longlong[0];
5667
5767
tmp_share->monitoring_sid = &tmp_longlong[1];
5668
5768
#ifndef WITHOUT_SPIDER_BG_SEARCH
5683
5783
tmp_share->tgt_ssl_keys_lengths = &tmp_connect_info_length[12];
5684
5784
tmp_share->tgt_default_files_lengths = &tmp_connect_info_length[13];
5685
5785
tmp_share->tgt_default_groups_lengths = &tmp_connect_info_length[14];
5786
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
5787
tmp_share->hs_read_socks_lengths = &tmp_connect_info_length[15];
5788
tmp_share->hs_write_socks_lengths = &tmp_connect_info_length[16];
5686
5790
tmp_share->server_names_length = 1;
5687
5791
tmp_share->tgt_table_names_length = 1;
5688
5792
tmp_share->tgt_dbs_length = 1;
5710
5814
#ifndef WITHOUT_SPIDER_BG_SEARCH
5711
5815
tmp_share->monitoring_bg_interval_length = 1;
5817
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
5818
tmp_share->hs_read_socks_length = 1;
5819
tmp_share->hs_write_socks_length = 1;
5820
tmp_share->use_hs_reads_length = 1;
5821
tmp_share->use_hs_writes_length = 1;
5822
tmp_share->hs_read_ports_length = 1;
5823
tmp_share->hs_write_ports_length = 1;
5825
tmp_share->use_handlers_length = 1;
5713
5826
tmp_share->net_timeout = -1;
5715
5828
#ifndef WITHOUT_SPIDER_BG_SEARCH
5796
5909
THDVAR(thd, split_read)
5913
bool spider_check_direct_order_limit(
5916
THD *thd = spider->trx->thd;
5917
SPIDER_SHARE *share = spider->share;
5918
longlong direct_order_limit = (THDVAR(thd, direct_order_limit) == -1 ?
5919
share->direct_order_limit : THDVAR(thd, direct_order_limit));
5920
DBUG_ENTER("spider_check_direct_order_limit");
5921
if (direct_order_limit)
5923
st_select_lex *select_lex;
5924
longlong select_limit;
5925
longlong offset_limit;
5926
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
5928
#if MYSQL_VERSION_ID < 50500
5929
!thd->variables.engine_condition_pushdown ||
5931
!(thd->variables.optimizer_switch &
5932
OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) ||
5935
!select_lex->explicit_limit ||
5936
(select_lex->options & OPTION_FOUND_ROWS) ||
5937
select_lex->with_sum_func ||
5938
select_lex->group_list.elements ||
5939
select_lex->having ||
5940
select_lex->table_list.elements != 1 ||
5941
!select_lex->order_list.elements ||
5942
select_limit > direct_order_limit - offset_limit
5944
DBUG_PRINT("info",("spider FALSE by select_lex"));
5948
for (order = (ORDER *) select_lex->order_list.first; order;
5949
order = order->next)
5951
if (spider_db_print_item_type((*order->item), spider, NULL, NULL, 0))
5953
DBUG_PRINT("info",("spider FALSE by order"));
5957
if (spider_db_append_condition(spider, NULL, NULL, 0))
5959
DBUG_PRINT("info",("spider FALSE by condition"));
5962
DBUG_PRINT("info",("spider TRUE"));
5963
spider->trx->direct_order_limit_count++;
5966
DBUG_PRINT("info",("spider FALSE by parameter"));
5970
int spider_compare_for_sort(
5974
DBUG_ENTER("spider_compare_for_sort");
5975
if (a->sort > b->sort)
5977
if (a->sort < b->sort)
5982
ulong spider_calc_for_sort(
5988
va_start(args, count);
5989
DBUG_ENTER("spider_calc_for_sort");
5992
char *start = va_arg(args, char *), *str;
6000
if (*str == wild_prefix && str[1])
6002
else if (*str == wild_many || *str == wild_one)
6004
wild_pos = (uint) (str - start) + 1;
6011
sort = (sort << 8) + wild_pos;