19
#include "drizzled/internal/my_bit.h"
18
#include <drizzled/server_includes.h>
19
#include <mysys/my_bit.h>
20
20
#include "myisampack.h"
21
21
#include "ha_myisam.h"
22
#include "myisam_priv.h"
23
#include "drizzled/option.h"
24
#include "drizzled/internal/my_bit.h"
25
#include "drizzled/internal/m_string.h"
26
#include "drizzled/util/test.h"
27
#include "drizzled/error.h"
28
#include "drizzled/errmsg_print.h"
29
#include "drizzled/gettext.h"
30
#include "drizzled/session.h"
31
#include "drizzled/set_var.h"
32
#include <drizzled/plugin.h>
33
#include "drizzled/plugin/client.h"
34
#include "drizzled/table.h"
35
#include "drizzled/field/timestamp.h"
36
#include "drizzled/memory/multi_malloc.h"
37
#include "drizzled/plugin/daemon.h"
22
#include "myisamdef.h"
23
#include <drizzled/util/test.h>
24
#include <drizzled/error.h>
25
#include <drizzled/errmsg_print.h>
26
#include <drizzled/gettext.h>
27
#include <drizzled/session.h>
28
#include <drizzled/plugin/protocol.h>
29
#include <drizzled/table.h>
30
#include <drizzled/field/timestamp.h>
42
33
#include <algorithm>
44
35
using namespace std;
45
using namespace drizzled;
47
extern pthread_mutex_t LOCK_global_system_variables;
48
37
static const string engine_name("MyISAM");
39
ulong myisam_recover_options= HA_RECOVER_NONE;
50
40
pthread_mutex_t THR_LOCK_myisam= PTHREAD_MUTEX_INITIALIZER;
52
42
static uint32_t repair_threads;
53
static uint32_t myisam_key_cache_block_size;
54
static uint32_t myisam_key_cache_size;
55
static uint32_t myisam_key_cache_division_limit;
56
static uint32_t myisam_key_cache_age_threshold;
43
static uint32_t block_size;
57
44
static uint64_t max_sort_file_size;
58
45
static uint64_t sort_buffer_size;
47
/* bits in myisam_recover_options */
48
const char *myisam_recover_names[] =
49
{ "DEFAULT", "BACKUP", "FORCE", "QUICK", NULL};
50
TYPELIB myisam_recover_typelib= {array_elements(myisam_recover_names)-1,"",
51
myisam_recover_names, NULL};
53
const char *myisam_stats_method_names[] = {"nulls_unequal", "nulls_equal",
54
"nulls_ignored", NULL};
55
TYPELIB myisam_stats_method_typelib= {
56
array_elements(myisam_stats_method_names) - 1, "",
57
myisam_stats_method_names, NULL};
60
60
/*****************************************************************************
62
62
*****************************************************************************/
70
class MyisamEngine : public plugin::StorageEngine
70
class MyisamEngine : public StorageEngine
73
MyisamEngine(const MyisamEngine&);
74
MyisamEngine& operator=(const MyisamEngine&);
76
explicit MyisamEngine(string name_arg) :
77
plugin::StorageEngine(name_arg,
78
HTON_CAN_INDEX_BLOBS |
79
HTON_STATS_RECORDS_IS_EXACT |
85
HTON_SKIP_STORE_LOCK |
88
pthread_mutex_init(&THR_LOCK_myisam,MY_MUTEX_INIT_FAST);
91
virtual ~MyisamEngine()
93
pthread_mutex_destroy(&THR_LOCK_myisam);
94
end_key_cache(dflt_key_cache, 1); // Can never fail
96
mi_panic(HA_PANIC_CLOSE);
99
virtual Cursor *create(TableShare &table,
100
memory::Root *mem_root)
102
return new (mem_root) ha_myisam(*this, table);
73
MyisamEngine(string name_arg)
74
: StorageEngine(name_arg, HTON_CAN_RECREATE) {}
76
virtual handler *create(TableShare *table,
79
return new (mem_root) ha_myisam(this, table);
105
82
const char **bas_ext() const {
106
83
return ha_myisam_exts;
109
int doCreateTable(Session&,
111
drizzled::TableIdentifier &identifier,
114
int doRenameTable(Session&, TableIdentifier &from, TableIdentifier &to);
116
int doDropTable(Session&, drizzled::TableIdentifier &identifier);
118
int doGetTableDefinition(Session& session,
119
drizzled::TableIdentifier &identifier,
120
message::Table &table_message);
122
/* Temp only engine, so do not return values. */
123
void doGetTableNames(CachedDirectory &, SchemaIdentifier &, set<string>&) { };
125
uint32_t max_supported_keys() const { return MI_MAX_KEY; }
126
uint32_t max_supported_key_length() const { return MI_MAX_KEY_LENGTH; }
127
uint32_t max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; }
129
uint32_t index_flags(enum ha_key_alg) const
131
return (HA_READ_NEXT |
137
bool doDoesTableExist(Session& session, TableIdentifier &identifier);
139
void doGetTableIdentifiers(drizzled::CachedDirectory &directory,
140
drizzled::SchemaIdentifier &schema_identifier,
141
drizzled::TableIdentifiers &set_of_identifiers);
86
int createTableImpl(Session *, const char *table_name,
87
Table *table_arg, HA_CREATE_INFO *ha_create_info);
89
int renameTableImpl(Session*, const char *from, const char *to);
91
int deleteTableImpl(Session*, const string table_name);
144
void MyisamEngine::doGetTableIdentifiers(drizzled::CachedDirectory&,
145
drizzled::SchemaIdentifier&,
146
drizzled::TableIdentifiers&)
150
bool MyisamEngine::doDoesTableExist(Session &session, TableIdentifier &identifier)
152
return session.doesTableMessageExist(identifier);
155
int MyisamEngine::doGetTableDefinition(Session &session,
156
drizzled::TableIdentifier &identifier,
157
message::Table &table_message)
159
if (session.getTableMessage(identifier, table_message))
165
Convert to push_Warnings if you ever care about this, otherwise, it is a no-op.
168
static void mi_check_print_msg(MI_CHECK *, const char* ,
169
const char *, va_list )
94
// collect errors printed by mi_check routines
96
static void mi_check_print_msg(MI_CHECK *param, const char* msg_type,
97
const char *fmt, va_list args)
99
Session* session = (Session*)param->session;
100
Protocol *protocol= session->protocol;
101
uint32_t length, msg_length;
102
char msgbuf[MI_MAX_MSG_BUF];
103
char name[NAME_LEN*2+2];
105
msg_length= vsnprintf(msgbuf, sizeof(msgbuf), fmt, args);
106
msgbuf[sizeof(msgbuf) - 1] = 0; // healthy paranoia
108
if (!session->protocol->isConnected())
110
errmsg_printf(ERRMSG_LVL_ERROR, "%s",msgbuf);
114
if (param->testflag & (T_CREATE_MISSING_KEYS | T_SAFE_REPAIR |
117
my_message(ER_NOT_KEYFILE,msgbuf,MYF(MY_WME));
120
length= sprintf(name,"%s.%s",param->db_name,param->table_name);
123
TODO: switch from protocol to push_warning here. The main reason we didn't
124
it yet is parallel repair. Due to following trace:
125
mi_check_print_msg/push_warning/sql_alloc/my_pthread_getspecific_ptr.
127
Also we likely need to lock mutex here (in both cases with protocol and
130
protocol->prepareForResend();
131
protocol->store(name, length);
132
protocol->store(param->op_name);
133
protocol->store(msg_type);
134
protocol->store(msgbuf, msg_length);
135
if (protocol->write())
136
errmsg_printf(ERRMSG_LVL_ERROR, "Failed on drizzleclient_net_write, writing to stderr instead: %s\n",
658
638
return mi_write(file,buf);
641
int ha_myisam::check(Session* session, HA_CHECK_OPT* check_opt)
643
if (!file) return HA_ADMIN_INTERNAL_ERROR;
646
MYISAM_SHARE* share = file->s;
647
const char *old_proc_info= session->get_proc_info();
649
session->set_proc_info("Checking table");
650
myisamchk_init(¶m);
651
param.session = session;
652
param.op_name = "check";
653
param.db_name= table->s->db.str;
654
param.table_name= table->alias;
655
param.testflag = check_opt->flags | T_CHECK | T_SILENT;
656
param.stats_method= (enum_mi_stats_method)session->variables.myisam_stats_method;
658
if (!(table->db_stat & HA_READ_ONLY))
659
param.testflag|= T_STATISTICS;
660
param.using_global_keycache = 1;
662
if (!mi_is_crashed(file) &&
663
(((param.testflag & T_CHECK_ONLY_CHANGED) &&
664
!(share->state.changed & (STATE_CHANGED | STATE_CRASHED |
665
STATE_CRASHED_ON_REPAIR)) &&
666
share->state.open_count == 0) ||
667
((param.testflag & T_FAST) && (share->state.open_count ==
668
(uint) (share->global_changed ? 1 : 0)))))
669
return HA_ADMIN_ALREADY_DONE;
671
error = chk_status(¶m, file); // Not fatal
672
error = chk_size(¶m, file);
674
error |= chk_del(¶m, file, param.testflag);
676
error = chk_key(¶m, file);
679
if ((!(param.testflag & T_QUICK) &&
681
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ||
682
(param.testflag & (T_EXTEND | T_MEDIUM)))) ||
685
uint32_t old_testflag=param.testflag;
686
param.testflag|=T_MEDIUM;
687
if (!(error= init_io_cache(¶m.read_cache, file->dfile,
688
my_default_record_cache_size, READ_CACHE,
689
share->pack.header_length, 1, MYF(MY_WME))))
691
error= chk_data_link(¶m, file, param.testflag & T_EXTEND);
692
end_io_cache(&(param.read_cache));
694
param.testflag= old_testflag;
699
if ((share->state.changed & (STATE_CHANGED |
700
STATE_CRASHED_ON_REPAIR |
701
STATE_CRASHED | STATE_NOT_ANALYZED)) ||
702
(param.testflag & T_STATISTICS) ||
705
file->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
706
pthread_mutex_lock(&share->intern_lock);
707
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
708
STATE_CRASHED_ON_REPAIR);
709
if (!(table->db_stat & HA_READ_ONLY))
710
error=update_state_info(¶m,file,UPDATE_TIME | UPDATE_OPEN_COUNT |
712
pthread_mutex_unlock(&share->intern_lock);
713
info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE |
717
else if (!mi_is_crashed(file) && !session->killed)
719
mi_mark_crashed(file);
720
file->update |= HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
723
session->set_proc_info(old_proc_info);
724
return error ? HA_ADMIN_CORRUPT : HA_ADMIN_OK;
729
analyze the key distribution in the table
730
As the table may be only locked for read, we have to take into account that
731
two threads may do an analyze at the same time!
734
int ha_myisam::analyze(Session *session,
739
MYISAM_SHARE* share = file->s;
741
myisamchk_init(¶m);
742
param.session = session;
743
param.op_name= "analyze";
744
param.db_name= table->s->db.str;
745
param.table_name= table->alias;
746
param.testflag= (T_FAST | T_CHECK | T_SILENT | T_STATISTICS |
747
T_DONT_CHECK_CHECKSUM);
748
param.using_global_keycache = 1;
749
param.stats_method= (enum_mi_stats_method)session->variables.myisam_stats_method;
751
if (!(share->state.changed & STATE_NOT_ANALYZED))
752
return HA_ADMIN_ALREADY_DONE;
754
error = chk_key(¶m, file);
757
pthread_mutex_lock(&share->intern_lock);
758
error=update_state_info(¶m,file,UPDATE_STAT);
759
pthread_mutex_unlock(&share->intern_lock);
761
else if (!mi_is_crashed(file) && !session->killed)
762
mi_mark_crashed(file);
763
return error ? HA_ADMIN_CORRUPT : HA_ADMIN_OK;
767
int ha_myisam::repair(Session* session, HA_CHECK_OPT *check_opt)
771
ha_rows start_records;
773
if (!file) return HA_ADMIN_INTERNAL_ERROR;
775
myisamchk_init(¶m);
776
param.session = session;
777
param.op_name= "repair";
778
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
779
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
780
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
781
param.sort_buffer_length= (size_t)sort_buffer_size;
783
// Release latches since this can take a long time
784
ha_release_temporary_latches(session);
786
start_records=file->state->records;
787
while ((error=repair(session,param,0)) && param.retry_repair)
789
param.retry_repair=0;
790
if (test_all_bits(param.testflag,
791
(uint) (T_RETRY_WITHOUT_QUICK | T_QUICK)))
793
param.testflag&= ~T_RETRY_WITHOUT_QUICK;
794
errmsg_printf(ERRMSG_LVL_INFO, "Retrying repair of: '%s' without quick",
798
param.testflag&= ~T_QUICK;
799
if ((param.testflag & T_REP_BY_SORT))
801
param.testflag= (param.testflag & ~T_REP_BY_SORT) | T_REP;
802
errmsg_printf(ERRMSG_LVL_INFO, "Retrying repair of: '%s' with keycache",
808
if (!error && start_records != file->state->records &&
809
!(check_opt->flags & T_VERY_SILENT))
811
char llbuff[22],llbuff2[22];
812
errmsg_printf(ERRMSG_LVL_INFO, "Found %s of %s rows when repairing '%s'",
813
llstr(file->state->records, llbuff),
814
llstr(start_records, llbuff2),
820
int ha_myisam::optimize(Session* session, HA_CHECK_OPT *check_opt)
823
if (!file) return HA_ADMIN_INTERNAL_ERROR;
826
myisamchk_init(¶m);
827
param.session = session;
828
param.op_name= "optimize";
829
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
830
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
831
param.sort_buffer_length= (size_t)sort_buffer_size;
832
if ((error= repair(session,param,1)) && param.retry_repair)
834
errmsg_printf(ERRMSG_LVL_WARN, "Warning: Optimize table got errno %d on %s.%s, retrying",
835
my_errno, param.db_name, param.table_name);
836
param.testflag&= ~T_REP_BY_SORT;
837
error= repair(session,param,1);
662
843
int ha_myisam::repair(Session *session, MI_CHECK ¶m, bool do_optimize)
1230
1496
stats.create_time= misam_info.create_time;
1231
1497
ref_length= misam_info.reflength;
1232
1498
share->db_options_in_use= misam_info.options;
1233
stats.block_size= myisam_key_cache_block_size; /* record block size */
1499
stats.block_size= block_size; /* record block size */
1235
1501
/* Update share */
1236
if (share->tmp_table == message::Table::STANDARD)
1502
if (share->tmp_table == NO_TMP_TABLE)
1237
1503
pthread_mutex_lock(&share->mutex);
1238
1504
set_prefix(share->keys_in_use, share->keys);
1240
* Due to bug 394932 (32-bit solaris build failure), we need
1241
* to convert the uint64_t key_map member of the misam_info
1242
* structure in to a std::bitset so that we can logically and
1243
* it with the share->key_in_use key_map.
1246
string binary_key_map;
1247
uint64_t num= misam_info.key_map;
1249
* Convert the uint64_t to a binary
1250
* string representation of it.
1254
uint64_t bin_digit= num % 2;
1258
binary_key_map.append(ostr.str());
1260
* Now we have the binary string representation of the
1261
* flags, we need to fill that string representation out
1262
* with the appropriate number of bits. This is needed
1263
* since key_map is declared as a std::bitset of a certain bit
1264
* width that depends on the MAX_INDEXES variable.
1266
if (MAX_INDEXES <= 64)
1268
size_t len= 72 - binary_key_map.length();
1269
string all_zeros(len, '0');
1270
binary_key_map.insert(binary_key_map.begin(),
1276
size_t len= (MAX_INDEXES + 7) / 8 * 8;
1277
string all_zeros(len, '0');
1278
binary_key_map.insert(binary_key_map.begin(),
1282
key_map tmp_map(binary_key_map);
1283
share->keys_in_use&= tmp_map;
1505
share->keys_in_use&= misam_info.key_map;
1284
1506
share->keys_for_keyread&= share->keys_in_use;
1285
1507
share->db_record_offset= misam_info.record_offset;
1286
1508
if (share->key_parts)
1287
1509
memcpy(table->key_info[0].rec_per_key,
1288
1510
misam_info.rec_per_key,
1289
1511
sizeof(table->key_info[0].rec_per_key)*share->key_parts);
1290
if (share->tmp_table == message::Table::STANDARD)
1512
if (share->tmp_table == NO_TMP_TABLE)
1291
1513
pthread_mutex_unlock(&share->mutex);
1368
1613
MI_KEYDEF *keydef;
1369
1614
MI_COLUMNDEF *recinfo;
1370
1615
MI_CREATE_INFO create_info;
1371
TableShare *share= table_arg.s;
1616
TableShare *share= table_arg->s;
1372
1617
uint32_t options= share->db_options_in_use;
1373
if ((error= table2myisam(&table_arg, &keydef, &recinfo, &create_records)))
1618
if ((error= table2myisam(table_arg, &keydef, &recinfo, &create_records)))
1619
return(error); /* purecov: inspected */
1375
1620
memset(&create_info, 0, sizeof(create_info));
1376
create_info.max_rows= create_proto.options().max_rows();
1377
create_info.reloc_rows= create_proto.options().min_rows();
1621
create_info.max_rows= share->max_rows;
1622
create_info.reloc_rows= share->min_rows;
1378
1623
create_info.with_auto_increment= share->next_number_key_offset == 0;
1379
create_info.auto_increment= (create_proto.options().has_auto_increment_value() ?
1380
create_proto.options().auto_increment_value() -1 :
1624
create_info.auto_increment= (ha_create_info->auto_increment_value ?
1625
ha_create_info->auto_increment_value -1 :
1382
create_info.data_file_length= (create_proto.options().max_rows() *
1383
create_proto.options().avg_row_length());
1384
create_info.data_file_name= NULL;
1385
create_info.index_file_name= NULL;
1627
create_info.data_file_length= ((uint64_t) share->max_rows *
1628
share->avg_row_length);
1629
create_info.data_file_name= ha_create_info->data_file_name;
1630
create_info.index_file_name= ha_create_info->index_file_name;
1386
1631
create_info.language= share->table_charset->number;
1388
if (create_proto.type() == message::Table::TEMPORARY)
1633
if (ha_create_info->options & HA_LEX_CREATE_TMP_TABLE)
1389
1634
create_flags|= HA_CREATE_TMP_TABLE;
1635
if (ha_create_info->options & HA_CREATE_KEEP_FILES)
1636
create_flags|= HA_CREATE_KEEP_FILES;
1390
1637
if (options & HA_OPTION_PACK_RECORD)
1391
1638
create_flags|= HA_PACK_RECORD;
1639
if (options & HA_OPTION_CHECKSUM)
1640
create_flags|= HA_CREATE_CHECKSUM;
1641
if (options & HA_OPTION_DELAY_KEY_WRITE)
1642
create_flags|= HA_CREATE_DELAY_KEY_WRITE;
1393
/* TODO: Check that the following internal::fn_format is really needed */
1394
error= mi_create(internal::fn_format(buff, identifier.getPath().c_str(), "", "",
1395
MY_UNPACK_FILENAME|MY_APPEND_EXT),
1644
/* TODO: Check that the following fn_format is really needed */
1645
error= mi_create(fn_format(buff, table_name, "", "",
1646
MY_UNPACK_FILENAME|MY_APPEND_EXT),
1396
1647
share->keys, keydef,
1397
1648
create_records, recinfo,
1398
1649
0, (MI_UNIQUEDEF*) 0,
1399
1650
&create_info, create_flags);
1400
1651
free((unsigned char*) recinfo);
1402
session.storeTableMessage(identifier, create_proto);
1408
int MyisamEngine::doRenameTable(Session &session, TableIdentifier &from, TableIdentifier &to)
1656
int MyisamEngine::renameTableImpl(Session*, const char *from, const char *to)
1410
session.renameTableMessage(from, to);
1412
return mi_rename(from.getPath().c_str(), to.getPath().c_str());
1658
return mi_rename(from,to);
1502
1748
static MyisamEngine *engine= NULL;
1504
static int myisam_init(plugin::Context &context)
1750
static int myisam_init(PluginRegistry ®istry)
1506
1752
engine= new MyisamEngine(engine_name);
1507
context.add(engine);
1509
/* call ha_init_key_cache() on all key caches to init them */
1510
int error= init_key_cache(dflt_key_cache,
1511
myisam_key_cache_block_size,
1512
myisam_key_cache_size,
1513
myisam_key_cache_division_limit,
1514
myisam_key_cache_age_threshold);
1517
exit(1); /* Memory Allocation Failure */
1753
registry.add(engine);
1755
pthread_mutex_init(&THR_LOCK_myisam,MY_MUTEX_INIT_FAST);
1523
static void sys_var_key_cache_size_update(Session *session, drizzle_sys_var *var, void *, const void *save)
1525
uint32_t tmp= *static_cast<const uint32_t *>(save);
1528
struct option option_limits;
1529
plugin_opt_set_limits(&option_limits, var);
1530
option_limits.name= "myisam_key_cache_size";
1532
if (dflt_key_cache->in_init)
1535
myisam_key_cache_size= static_cast<uint32_t>(fix_unsigned(session, static_cast<uint64_t>(tmp), &option_limits));
1537
/* If key cache didn't existed initialize it, else resize it */
1538
dflt_key_cache->in_init= 1;
1540
error= ! resize_key_cache(dflt_key_cache,
1541
myisam_key_cache_block_size,
1542
myisam_key_cache_size,
1543
myisam_key_cache_division_limit,
1544
myisam_key_cache_age_threshold);
1545
dflt_key_cache->in_init= 0;
1548
static void sys_var_key_cache_block_size_update(Session *session, drizzle_sys_var *var, void *, const void *save)
1550
uint32_t tmp= *static_cast<const uint32_t *>(save);
1553
struct option option_limits;
1554
plugin_opt_set_limits(&option_limits, var);
1555
option_limits.name= "myisam_key_cache_block_size";
1557
if (dflt_key_cache->in_init)
1560
myisam_key_cache_block_size= static_cast<uint32_t>(fix_unsigned(session, static_cast<uint64_t>(tmp), &option_limits));
1562
dflt_key_cache->in_init= 1;
1564
error= ! resize_key_cache(dflt_key_cache,
1565
myisam_key_cache_block_size,
1566
myisam_key_cache_size,
1567
myisam_key_cache_division_limit,
1568
myisam_key_cache_age_threshold);
1570
dflt_key_cache->in_init= 0;
1573
static void sys_var_key_cache_division_limit_update(Session *session, drizzle_sys_var *var, void *, const void *save)
1575
uint32_t tmp= *static_cast<const uint32_t *>(save);
1578
struct option option_limits;
1579
plugin_opt_set_limits(&option_limits, var);
1580
option_limits.name= "myisam_key_cache_division_limit";
1582
if (dflt_key_cache->in_init)
1585
myisam_key_cache_division_limit= static_cast<uint32_t>(fix_unsigned(session, static_cast<uint64_t>(tmp), &option_limits));
1587
dflt_key_cache->in_init= 1;
1589
error= ! resize_key_cache(dflt_key_cache,
1590
myisam_key_cache_block_size,
1591
myisam_key_cache_size,
1592
myisam_key_cache_division_limit,
1593
myisam_key_cache_age_threshold);
1595
dflt_key_cache->in_init= 0;
1598
static void sys_var_key_cache_age_threshold_update(Session *session, drizzle_sys_var *var, void *, const void *save)
1600
uint32_t tmp= *static_cast<const uint32_t *>(save);
1603
struct option option_limits;
1604
plugin_opt_set_limits(&option_limits, var);
1605
option_limits.name= "myisam_key_cache_age_threshold";
1607
if (dflt_key_cache->in_init)
1610
myisam_key_cache_age_threshold= static_cast<uint32_t>(fix_unsigned(session, static_cast<uint64_t>(tmp), &option_limits));
1612
dflt_key_cache->in_init= 1;
1614
error= ! resize_key_cache(dflt_key_cache,
1615
myisam_key_cache_block_size,
1616
myisam_key_cache_size,
1617
myisam_key_cache_division_limit,
1618
myisam_key_cache_age_threshold);
1620
dflt_key_cache->in_init= 0;
1623
static DRIZZLE_SYSVAR_UINT(key_cache_block_size,
1624
myisam_key_cache_block_size,
1625
PLUGIN_VAR_RQCMDARG,
1626
N_("Block size to be used for MyISAM index pages."),
1628
sys_var_key_cache_block_size_update,
1629
KEY_CACHE_BLOCK_SIZE,
1634
static DRIZZLE_SYSVAR_UINT(key_cache_age_threshold, myisam_key_cache_age_threshold,
1635
PLUGIN_VAR_RQCMDARG,
1636
N_("This characterizes the number of hits a hot block has to be untouched "
1637
"until it is considered aged enough to be downgraded to a warm block. "
1638
"This specifies the percentage ratio of that number of hits to the "
1639
"total number of blocks in key cache"),
1641
sys_var_key_cache_age_threshold_update,
1647
static DRIZZLE_SYSVAR_UINT(key_cache_division_limit, myisam_key_cache_division_limit,
1648
PLUGIN_VAR_RQCMDARG,
1649
N_("The minimum percentage of warm blocks in key cache"),
1651
sys_var_key_cache_division_limit_update,
1657
static DRIZZLE_SYSVAR_UINT(key_cache_size,
1658
myisam_key_cache_size,
1659
PLUGIN_VAR_RQCMDARG,
1660
N_("The size of the buffer used for index blocks for MyISAM tables. "
1661
"Increase this to get better index handling (for all reads and multiple "
1662
"writes) to as much as you can afford;"),
1664
sys_var_key_cache_size_update,
1760
int myisam_deinit(PluginRegistry ®istry)
1762
registry.remove(engine);
1765
pthread_mutex_destroy(&THR_LOCK_myisam);
1767
return mi_panic(HA_PANIC_CLOSE);
1771
/****************************************************************************
1772
* MyISAM MRR implementation: use DS-MRR
1773
***************************************************************************/
1775
int ha_myisam::multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
1776
uint32_t n_ranges, uint32_t mode,
1777
HANDLER_BUFFER *buf)
1779
return ds_mrr.dsmrr_init(this, &table->key_info[active_index],
1780
seq, seq_init_param, n_ranges, mode, buf);
1783
int ha_myisam::multi_range_read_next(char **range_info)
1785
return ds_mrr.dsmrr_next(this, range_info);
1788
ha_rows ha_myisam::multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
1789
void *seq_init_param,
1790
uint32_t n_ranges, uint32_t *bufsz,
1791
uint32_t *flags, COST_VECT *cost)
1794
This call is here because there is no location where this->table would
1796
TODO: consider moving it into some per-query initialization call.
1798
ds_mrr.init(this, table);
1799
return ds_mrr.dsmrr_info_const(keyno, seq, seq_init_param, n_ranges, bufsz,
1803
int ha_myisam::multi_range_read_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys,
1804
uint32_t *bufsz, uint32_t *flags, COST_VECT *cost)
1806
ds_mrr.init(this, table);
1807
return ds_mrr.dsmrr_info(keyno, n_ranges, keys, bufsz, flags, cost);
1810
/* MyISAM MRR implementation ends */
1813
/* Index condition pushdown implementation*/
1816
Item *ha_myisam::idx_cond_push(uint32_t keyno_arg, Item* idx_cond_arg)
1818
pushed_idx_cond_keyno= keyno_arg;
1819
pushed_idx_cond= idx_cond_arg;
1820
in_range_check_pushed_down= true;
1821
if (active_index == pushed_idx_cond_keyno)
1822
mi_set_index_cond_func(file, index_cond_func_myisam, this);
1826
static DRIZZLE_SYSVAR_UINT(block_size, block_size,
1827
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
1828
N_("Block size to be used for MyISAM index pages."),
1829
NULL, NULL, MI_KEY_BLOCK_LENGTH, MI_MIN_KEY_BLOCK_LENGTH,
1830
MI_MAX_KEY_BLOCK_LENGTH, 0);
1670
1832
static DRIZZLE_SYSVAR_UINT(repair_threads, repair_threads,
1671
PLUGIN_VAR_RQCMDARG,
1672
N_("Number of threads to use when repairing MyISAM tables. The value of "
1673
"1 disables parallel repair."),
1674
NULL, NULL, 1, 1, UINT32_MAX, 0);
1833
PLUGIN_VAR_RQCMDARG,
1834
N_("Number of threads to use when repairing MyISAM tables. The value of "
1835
"1 disables parallel repair."),
1836
NULL, NULL, 1, 1, UINT32_MAX, 0);
1676
1838
static DRIZZLE_SYSVAR_ULONGLONG(max_sort_file_size, max_sort_file_size,
1677
1839
PLUGIN_VAR_RQCMDARG,