1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1
/* Copyright (C) 2000-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
21
17
/* Definitions for parameters to do with handler-routines */
19
#ifdef USE_PRAGMA_INTERFACE
20
#pragma interface /* gcc class implementation */
24
#include <mysys/my_handler.h>
25
#include <storage/myisam/keycache.h>
23
#include <my_handler.h>
24
#include <ft_global.h>
28
28
#define NO_HASH /* Not yet implemented */
147
153
#define HA_PRIMARY_KEY_REQUIRED_FOR_DELETE (1 << 19)
148
154
#define HA_NO_PREFIX_CHAR_KEYS (1 << 20)
155
#define HA_CAN_FULLTEXT (1 << 21)
156
#define HA_CAN_SQL_HANDLER (1 << 22)
149
157
#define HA_NO_AUTO_INCREMENT (1 << 23)
150
158
#define HA_HAS_CHECKSUM (1 << 24)
151
159
/* Table data are stored in separate files (for lower_case_table_names) */
152
160
#define HA_FILE_BASED (1 << 26)
161
#define HA_NO_VARCHAR (1 << 27)
162
#define HA_CAN_BIT_FIELD (1 << 28) /* supports bit fields */
153
163
#define HA_NEED_READ_RANGE_BUFFER (1 << 29) /* for read_multi_range */
154
164
#define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30)
155
#define HA_NO_COPY_ON_ALTER (INT64_C(1) << 31)
156
#define HA_HAS_RECORDS (INT64_C(1) << 32) /* records() gives exact count*/
157
#define HA_MRR_CANT_SORT (INT64_C(1) << 34)
165
#define HA_NO_COPY_ON_ALTER (LL(1) << 31)
166
#define HA_HAS_RECORDS (LL(1) << 32) /* records() gives exact count*/
167
/* Has it's own method of binlog logging */
168
#define HA_HAS_OWN_BINLOGGING (LL(1) << 33)
169
#define HA_MRR_CANT_SORT (LL(1) << 34)
160
172
Engine is capable of row-format and statement-format logging,
163
#define HA_BINLOG_ROW_CAPABLE (INT64_C(1) << 35)
164
#define HA_BINLOG_STMT_CAPABLE (INT64_C(1) << 36)
175
#define HA_BINLOG_ROW_CAPABLE (LL(1) << 35)
176
#define HA_BINLOG_STMT_CAPABLE (LL(1) << 36)
166
#define HA_ONLINE_ALTER (INT64_C(1) << 37)
178
#define HA_ONLINE_ALTER (LL(1) << 37)
169
181
Set of all binlog flags. Currently only contain the capabilities
280
292
enum legacy_db_type
294
DB_TYPE_UNKNOWN=0,DB_TYPE_DIAB_ISAM=1,
295
DB_TYPE_HASH,DB_TYPE_MISAM,DB_TYPE_PISAM,
296
DB_TYPE_RMS_ISAM, DB_TYPE_HEAP, DB_TYPE_ISAM,
297
DB_TYPE_MRG_ISAM, DB_TYPE_MYISAM, DB_TYPE_MRG_MYISAM,
298
DB_TYPE_BERKELEY_DB, DB_TYPE_INNODB,
299
DB_TYPE_GEMINI, DB_TYPE_NDBCLUSTER,
300
DB_TYPE_EXAMPLE_DB, DB_TYPE_ARCHIVE_DB, DB_TYPE_CSV_DB,
301
DB_TYPE_FEDERATED_DB,
302
DB_TYPE_BLACKHOLE_DB,
303
DB_TYPE_PARTITION_DB,
307
DB_TYPE_TABLE_FUNCTION,
283
311
DB_TYPE_FIRST_DYNAMIC=42,
284
312
DB_TYPE_DEFAULT=127 // Must be last
333
359
#define HA_CREATE_USED_DELAY_KEY_WRITE (1L << 14)
334
360
#define HA_CREATE_USED_ROW_FORMAT (1L << 15)
335
361
#define HA_CREATE_USED_COMMENT (1L << 16)
362
#define HA_CREATE_USED_PASSWORD (1L << 17)
336
363
#define HA_CREATE_USED_CONNECTION (1L << 18)
337
364
#define HA_CREATE_USED_KEY_BLOCK_SIZE (1L << 19)
365
#define HA_CREATE_USED_TRANSACTIONAL (1L << 20)
338
366
#define HA_CREATE_USED_PAGE_CHECKSUM (1L << 21)
339
#define HA_CREATE_USED_BLOCK_SIZE (1L << 22)
341
368
typedef uint64_t my_xid; // this line is the same as in log_event.h
342
#define DRIZZLE_XID_PREFIX "MySQLXid"
343
#define DRIZZLE_XID_PREFIX_LEN 8 // must be a multiple of 8
344
#define DRIZZLE_XID_OFFSET (DRIZZLE_XID_PREFIX_LEN+sizeof(server_id))
345
#define DRIZZLE_XID_GTRID_LEN (DRIZZLE_XID_OFFSET+sizeof(my_xid))
369
#define MYSQL_XID_PREFIX "MySQLXid"
370
#define MYSQL_XID_PREFIX_LEN 8 // must be a multiple of 8
371
#define MYSQL_XID_OFFSET (MYSQL_XID_PREFIX_LEN+sizeof(server_id))
372
#define MYSQL_XID_GTRID_LEN (MYSQL_XID_OFFSET+sizeof(my_xid))
347
#define XIDDATASIZE DRIZZLE_XIDDATASIZE
374
#define XIDDATASIZE MYSQL_XIDDATASIZE
348
375
#define MAXGTRIDSIZE 64
349
376
#define MAXBQUALSIZE 64
351
378
#define COMPATIBLE_DATA_YES 0
352
379
#define COMPATIBLE_DATA_NO 1
354
typedef bool (*qc_engine_callback)(THD *thd, char *table_key,
356
uint64_t *engine_data);
359
382
struct xid_t is binary compatible with the XID structure as
360
383
in the X/Open CAE Specification, Distributed Transaction Processing:
361
384
The XA Specification, X/Open Company Ltd., 1991.
362
385
http://www.opengroup.org/bookstore/catalog/c193.htm
364
@see DRIZZLE_XID in mysql/plugin.h
387
@see MYSQL_XID in mysql/plugin.h
389
set(DRIZZLE_XID_PREFIX_LEN, 0, DRIZZLE_XID_PREFIX);
390
memcpy(data+DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id));
412
set(MYSQL_XID_PREFIX_LEN, 0, MYSQL_XID_PREFIX);
413
memcpy(data+MYSQL_XID_PREFIX_LEN, &server_id, sizeof(server_id));
392
memcpy(data+DRIZZLE_XID_OFFSET, &tmp, sizeof(tmp));
393
gtrid_length=DRIZZLE_XID_GTRID_LEN;
415
memcpy(data+MYSQL_XID_OFFSET, &tmp, sizeof(tmp));
416
gtrid_length=MYSQL_XID_GTRID_LEN;
395
418
void set(long g, long b, const char *d)
404
427
my_xid quick_get_my_xid()
407
memcpy(&tmp, data+DRIZZLE_XID_OFFSET, sizeof(tmp));
430
memcpy(&tmp, data+MYSQL_XID_OFFSET, sizeof(tmp));
410
433
my_xid get_my_xid()
412
return gtrid_length == DRIZZLE_XID_GTRID_LEN && bqual_length == 0 &&
413
!memcmp(data+DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id)) &&
414
!memcmp(data, DRIZZLE_XID_PREFIX, DRIZZLE_XID_PREFIX_LEN) ?
435
return gtrid_length == MYSQL_XID_GTRID_LEN && bqual_length == 0 &&
436
!memcmp(data+MYSQL_XID_PREFIX_LEN, &server_id, sizeof(server_id)) &&
437
!memcmp(data, MYSQL_XID_PREFIX, MYSQL_XID_PREFIX_LEN) ?
415
438
quick_get_my_xid() : 0;
419
442
return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+
420
443
gtrid_length+bqual_length;
424
return (unsigned char *)>rid_length;
447
return (uchar *)>rid_length;
426
uint32_t key_length()
428
451
return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length;
434
457
#define MIN_XID_LIST_SIZE 128
435
458
#define MAX_XID_LIST_SIZE (1024*128)
461
These structures are used to pass information from a set of SQL commands
462
on add/drop/change tablespace definitions to the proper hton.
464
#define UNDEF_NODEGROUP 65535
467
TS_CMD_NOT_DEFINED = -1,
468
CREATE_TABLESPACE = 0,
469
ALTER_TABLESPACE = 1,
470
CREATE_LOGFILE_GROUP = 2,
471
ALTER_LOGFILE_GROUP = 3,
473
DROP_LOGFILE_GROUP = 5,
474
CHANGE_FILE_TABLESPACE = 6,
475
ALTER_ACCESS_MODE_TABLESPACE = 7
478
enum ts_alter_tablespace_type
480
TS_ALTER_TABLESPACE_TYPE_NOT_DEFINED = -1,
481
ALTER_TABLESPACE_ADD_FILE = 1,
482
ALTER_TABLESPACE_DROP_FILE = 2
485
enum tablespace_access_mode
490
TS_NOT_ACCESSIBLE = 2
437
493
struct handlerton;
439
/* The handler for a table type. Will be included in the Table structure */
494
class st_alter_tablespace : public Sql_alloc
497
const char *tablespace_name;
498
const char *logfile_group_name;
499
enum ts_command_type ts_cmd_type;
500
enum ts_alter_tablespace_type ts_alter_tablespace_type;
501
const char *data_file_name;
502
const char *undo_file_name;
503
const char *redo_file_name;
504
uint64_t extent_size;
505
uint64_t undo_buffer_size;
506
uint64_t redo_buffer_size;
507
uint64_t initial_size;
508
uint64_t autoextend_size;
511
handlerton *storage_engine;
512
bool wait_until_completed;
513
const char *ts_comment;
514
enum tablespace_access_mode ts_access_mode;
515
st_alter_tablespace()
517
tablespace_name= NULL;
518
logfile_group_name= "DEFAULT_LG"; //Default log file group
519
ts_cmd_type= TS_CMD_NOT_DEFINED;
520
data_file_name= NULL;
521
undo_file_name= NULL;
522
redo_file_name= NULL;
523
extent_size= 1024*1024; //Default 1 MByte
524
undo_buffer_size= 8*1024*1024; //Default 8 MByte
525
redo_buffer_size= 8*1024*1024; //Default 8 MByte
526
initial_size= 128*1024*1024; //Default 128 MByte
527
autoextend_size= 0; //No autoextension as default
528
max_size= 0; //Max size == initial size => no extension
529
storage_engine= NULL;
530
nodegroup_id= UNDEF_NODEGROUP;
531
wait_until_completed= TRUE;
533
ts_access_mode= TS_NOT_DEFINED;
537
/* The handler for a table type. Will be included in the TABLE structure */
540
typedef struct st_table TABLE;
442
541
typedef struct st_table_share TABLE_SHARE;
443
542
struct st_foreign_key_info;
444
543
typedef struct st_foreign_key_info FOREIGN_KEY_INFO;
445
typedef bool (stat_print_fn)(THD *thd, const char *type, uint32_t type_len,
446
const char *file, uint32_t file_len,
447
const char *status, uint32_t status_len);
544
typedef bool (stat_print_fn)(THD *thd, const char *type, uint type_len,
545
const char *file, uint file_len,
546
const char *status, uint status_len);
448
547
enum ha_stat_type { HA_ENGINE_STATUS, HA_ENGINE_LOGS, HA_ENGINE_MUTEX };
449
548
extern st_plugin_int *hton2plugin[MAX_HA];
521
620
int (*commit)(handlerton *hton, THD *thd, bool all);
522
621
int (*rollback)(handlerton *hton, THD *thd, bool all);
523
622
int (*prepare)(handlerton *hton, THD *thd, bool all);
524
int (*recover)(handlerton *hton, XID *xid_list, uint32_t len);
623
int (*recover)(handlerton *hton, XID *xid_list, uint len);
525
624
int (*commit_by_xid)(handlerton *hton, XID *xid);
526
625
int (*rollback_by_xid)(handlerton *hton, XID *xid);
527
626
void *(*create_cursor_read_view)(handlerton *hton, THD *thd);
529
628
void (*close_cursor_read_view)(handlerton *hton, THD *thd, void *read_view);
530
629
handler *(*create)(handlerton *hton, TABLE_SHARE *table, MEM_ROOT *mem_root);
531
630
void (*drop_database)(handlerton *hton, char* path);
631
int (*panic)(handlerton *hton, enum ha_panic_function flag);
532
632
int (*start_consistent_snapshot)(handlerton *hton, THD *thd);
533
633
bool (*flush_logs)(handlerton *hton);
534
634
bool (*show_status)(handlerton *hton, THD *thd, stat_print_fn *print, enum ha_stat_type stat);
635
int (*alter_tablespace)(handlerton *hton, THD *thd, st_alter_tablespace *ts_info);
535
636
int (*fill_files_table)(handlerton *hton, THD *thd,
537
638
class Item *cond);
538
uint32_t flags; /* global handler flags */
639
uint32 flags; /* global handler flags */
539
640
int (*release_temporary_latches)(handlerton *hton, THD *thd);
541
642
int (*discover)(handlerton *hton, THD* thd, const char *db,
542
643
const char *name,
543
unsigned char **frmblob,
545
646
int (*table_exists_in_engine)(handlerton *hton, THD* thd, const char *db,
546
647
const char *name);
547
uint32_t license; /* Flag for Engine License */
648
uint32 license; /* Flag for Engine License */
548
649
void *data; /* Location for engines to keep personal structures */
580
681
* stmt.modified_non_trans_table is used to keep track of
581
682
modified non-transactional tables of top-level statements. At
582
683
the end of the previous statement and at the beginning of the session,
583
it is reset to false. If such functions
684
it is reset to FALSE. If such functions
584
685
as mysql_insert, mysql_update, mysql_delete etc modify a
585
non-transactional table, they set this flag to true. At the
686
non-transactional table, they set this flag to TRUE. At the
586
687
end of the statement, the value of stmt.modified_non_trans_table
587
688
is merged with all.modified_non_trans_table and gets reset.
588
689
* all.modified_non_trans_table is reset at the end of transaction
736
842
uint32_t avg_row_length;
737
843
uint32_t used_fields;
738
844
uint32_t key_block_size;
740
846
handlerton *db_type;
741
847
enum row_type row_type;
742
uint32_t null_bits; /* NULL bits at start of record */
743
uint32_t options; /* OR of HA_CREATE_ options */
744
uint32_t extra_size; /* length of extra data segment */
848
uint null_bits; /* NULL bits at start of record */
849
uint options; /* OR of HA_CREATE_ options */
850
uint merge_insert_method;
851
uint extra_size; /* length of extra data segment */
852
/* 0 not used, 1 if not transactional, 2 if transactional */
853
enum ha_choice transactional;
745
854
bool table_existed; /* 1 in create if table existed */
746
855
bool frm_only; /* 1 if no ha_create_table() */
747
856
bool varchar; /* 1 if table has a VARCHAR */
857
enum ha_storage_media default_storage_media; /* DEFAULT, DISK or MEMORY */
748
858
enum ha_choice page_checksum; /* If we have page_checksums */
749
859
} HA_CREATE_INFO;
751
861
typedef struct st_ha_alter_information
753
863
KEY *key_info_buffer;
755
uint32_t index_drop_count;
756
uint32_t *index_drop_buffer;
757
uint32_t index_add_count;
758
uint32_t *index_add_buffer;
865
uint index_drop_count;
866
uint *index_drop_buffer;
867
uint index_add_count;
868
uint *index_add_buffer;
789
899
TABLEOP_HOOKS() {}
790
900
virtual ~TABLEOP_HOOKS() {}
792
inline void prelock(Table **tables, uint32_t count)
902
inline void prelock(TABLE **tables, uint count)
794
904
do_prelock(tables, count);
797
inline int postlock(Table **tables, uint32_t count)
907
inline int postlock(TABLE **tables, uint count)
799
909
return do_postlock(tables, count);
802
912
/* Function primitive that is called prior to locking tables */
803
virtual void do_prelock(Table **tables __attribute__((unused)),
804
uint32_t count __attribute__((unused)))
913
virtual void do_prelock(TABLE **tables __attribute__((__unused__)),
914
uint count __attribute__((__unused__)))
806
916
/* Default is to do nothing */
1094
1204
typedef uint64_t Table_flags;
1096
1206
struct st_table_share *table_share; /* The table definition */
1097
Table *table; /* The current open table */
1207
struct st_table *table; /* The current open table */
1098
1208
Table_flags cached_table_flags; /* Set on init() and open() */
1100
1210
ha_rows estimation_rows_to_insert;
1102
1212
handlerton *ht; /* storage engine of this handler */
1103
unsigned char *ref; /* Pointer to current row */
1104
unsigned char *dup_ref; /* Pointer to duplicate row */
1213
uchar *ref; /* Pointer to current row */
1214
uchar *dup_ref; /* Pointer to duplicate row */
1106
1216
ha_statistics stats;
1107
1217
/** MultiRangeRead-related members: */
1108
1218
range_seq_t mrr_iter; /* Interator to traverse the range sequence */
1109
1219
RANGE_SEQ_IF mrr_funcs; /* Range sequence traversal functions */
1110
1220
HANDLER_BUFFER *multi_range_buffer; /* MRR buffer info */
1111
uint32_t ranges_in_seq; /* Total number of ranges in the traversed sequence */
1112
/* true <=> source MRR ranges and the output are ordered */
1221
uint ranges_in_seq; /* Total number of ranges in the traversed sequence */
1222
/* TRUE <=> source MRR ranges and the output are ordered */
1113
1223
bool mrr_is_output_sorted;
1115
/** true <=> we're currently traversing a range in mrr_cur_range. */
1225
/** TRUE <=> we're currently traversing a range in mrr_cur_range. */
1116
1226
bool mrr_have_range;
1117
1227
/** Current range (the one we're now returning rows from) */
1118
1228
KEY_MULTI_RANGE mrr_cur_range;
1123
1233
int key_compare_result_on_equal;
1126
true <=> the engine guarantees that returned records are within the range
1236
TRUE <=> the engine guarantees that returned records are within the range
1129
1239
bool in_range_check_pushed_down;
1131
uint32_t errkey; /* Last dup key */
1132
uint32_t key_used_on_scan;
1133
uint32_t active_index;
1241
uint errkey; /* Last dup key */
1242
uint key_used_on_scan;
1134
1244
/** Length of ref (1-8 or the clustered key length) */
1135
uint32_t ref_length;
1246
FT_INFO *ft_handler;
1136
1247
enum {NONE=0, INDEX, RND} inited;
1138
1249
bool implicit_emptied; /* Can be !=0 only if HEAP */
1139
1250
const Item *pushed_cond;
1141
1252
Item *pushed_idx_cond;
1142
uint32_t pushed_idx_cond_keyno; /* The index which the above condition is for */
1253
uint pushed_idx_cond_keyno; /* The index which the above condition is for */
1145
1256
next_insert_id is the next value which should be inserted into the
1167
1278
handler(handlerton *ht_arg, TABLE_SHARE *share_arg)
1168
1279
:table_share(share_arg), table(0),
1169
1280
estimation_rows_to_insert(0), ht(ht_arg),
1170
ref(0), in_range_check_pushed_down(false),
1281
ref(0), in_range_check_pushed_down(FALSE),
1171
1282
key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
1172
1283
ref_length(sizeof(my_off_t)),
1174
locked(false), implicit_emptied(0),
1284
ft_handler(0), inited(NONE),
1285
locked(FALSE), implicit_emptied(0),
1175
1286
pushed_cond(0), pushed_idx_cond(NULL), pushed_idx_cond_keyno(MAX_KEY),
1176
1287
next_insert_id(0), insert_id_for_cur_row(0)
1178
1289
virtual ~handler(void)
1180
assert(locked == false);
1181
/* TODO: assert(inited == NONE); */
1291
DBUG_ASSERT(locked == FALSE);
1292
/* TODO: DBUG_ASSERT(inited == NONE); */
1183
1294
virtual handler *clone(MEM_ROOT *mem_root);
1184
1295
/** This is called after create to allow us to set up cached variables */
1189
1300
/* ha_ methods: pubilc wrappers for private virtual API */
1191
int ha_open(Table *table, const char *name, int mode, int test_if_locked);
1192
int ha_index_init(uint32_t idx, bool sorted)
1302
int ha_open(TABLE *table, const char *name, int mode, int test_if_locked);
1303
int ha_index_init(uint idx, bool sorted)
1195
assert(inited==NONE);
1306
DBUG_ENTER("ha_index_init");
1307
DBUG_ASSERT(inited==NONE);
1196
1308
if (!(result= index_init(idx, sorted)))
1198
1310
end_range= NULL;
1311
DBUG_RETURN(result);
1201
1313
int ha_index_end()
1203
assert(inited==INDEX);
1315
DBUG_ENTER("ha_index_end");
1316
DBUG_ASSERT(inited==INDEX);
1205
1318
end_range= NULL;
1206
return(index_end());
1319
DBUG_RETURN(index_end());
1208
1321
int ha_rnd_init(bool scan)
1211
assert(inited==NONE || (inited==RND && scan));
1324
DBUG_ENTER("ha_rnd_init");
1325
DBUG_ASSERT(inited==NONE || (inited==RND && scan));
1212
1326
inited= (result= rnd_init(scan)) ? NONE: RND;
1327
DBUG_RETURN(result);
1215
1329
int ha_rnd_end()
1217
assert(inited==RND);
1331
DBUG_ENTER("ha_rnd_end");
1332
DBUG_ASSERT(inited==RND);
1334
DBUG_RETURN(rnd_end());
1221
1336
int ha_reset();
1222
1337
/* this is necessary in many places, e.g. in HANDLER command */
1251
1366
estimation_rows_to_insert= 0;
1252
1367
return end_bulk_insert();
1254
int ha_bulk_update_row(const unsigned char *old_data, unsigned char *new_data,
1255
uint32_t *dup_key_found);
1369
int ha_bulk_update_row(const uchar *old_data, uchar *new_data,
1370
uint *dup_key_found);
1256
1371
int ha_delete_all_rows();
1257
1372
int ha_reset_auto_increment(uint64_t value);
1258
1373
int ha_optimize(THD* thd, HA_CHECK_OPT* check_opt);
1259
1374
int ha_analyze(THD* thd, HA_CHECK_OPT* check_opt);
1260
1375
bool ha_check_and_repair(THD *thd);
1261
int ha_disable_indexes(uint32_t mode);
1262
int ha_enable_indexes(uint32_t mode);
1263
int ha_discard_or_import_tablespace(bool discard);
1376
int ha_disable_indexes(uint mode);
1377
int ha_enable_indexes(uint mode);
1378
int ha_discard_or_import_tablespace(my_bool discard);
1264
1379
void ha_prepare_for_alter();
1265
1380
int ha_rename_table(const char *from, const char *to);
1266
1381
int ha_delete_table(const char *name);
1267
1382
void ha_drop_table(const char *name);
1269
int ha_create(const char *name, Table *form, HA_CREATE_INFO *info);
1384
int ha_create(const char *name, TABLE *form, HA_CREATE_INFO *info);
1271
1386
int ha_create_handler_files(const char *name, const char *old_name,
1272
1387
int action_flag, HA_CREATE_INFO *info);
1274
1389
void adjust_next_insert_id_after_explicit_value(uint64_t nr);
1275
1390
int update_auto_increment();
1276
void print_keydup_error(uint32_t key_nr, const char *msg);
1391
void print_keydup_error(uint key_nr, const char *msg);
1277
1392
virtual void print_error(int error, myf errflag);
1278
1393
virtual bool get_error_message(int error, String *buf);
1279
uint32_t get_dup_key(int error);
1280
virtual void change_table_ptr(Table *table_arg, TABLE_SHARE *share)
1394
uint get_dup_key(int error);
1395
virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share)
1282
1397
table= table_arg;
1283
1398
table_share= share;
1285
1400
/* Estimates calculation */
1286
1401
virtual double scan_time(void)
1287
{ return uint64_t2double(stats.data_file_length) / IO_SIZE + 2; }
1288
virtual double read_time(uint32_t index __attribute__((unused)),
1289
uint32_t ranges, ha_rows rows)
1402
{ return ulonglong2double(stats.data_file_length) / IO_SIZE + 2; }
1403
virtual double read_time(uint index __attribute__((__unused__)),
1404
uint ranges, ha_rows rows)
1290
1405
{ return rows2double(ranges+rows); }
1292
virtual double index_only_read_time(uint32_t keynr, double records);
1407
virtual double index_only_read_time(uint keynr, double records);
1294
virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
1409
virtual ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq,
1295
1410
void *seq_init_param,
1296
uint32_t n_ranges, uint32_t *bufsz,
1297
uint32_t *flags, COST_VECT *cost);
1298
virtual int multi_range_read_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys,
1299
uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
1411
uint n_ranges, uint *bufsz,
1412
uint *flags, COST_VECT *cost);
1413
virtual int multi_range_read_info(uint keyno, uint n_ranges, uint keys,
1414
uint *bufsz, uint *flags, COST_VECT *cost);
1300
1415
virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
1301
uint32_t n_ranges, uint32_t mode,
1416
uint n_ranges, uint mode,
1302
1417
HANDLER_BUFFER *buf);
1303
1418
virtual int multi_range_read_next(char **range_info);
1411
1526
row if available. If the key value is null, begin at the first key of the
1414
virtual int index_read_map(unsigned char * buf, const unsigned char * key,
1529
virtual int index_read_map(uchar * buf, const uchar * key,
1415
1530
key_part_map keypart_map,
1416
1531
enum ha_rkey_function find_flag)
1418
uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
1533
uint key_len= calculate_key_len(table, active_index, key, keypart_map);
1419
1534
return index_read(buf, key, key_len, find_flag);
1424
1539
row if available. If the key value is null, begin at the first key of the
1427
virtual int index_read_idx_map(unsigned char * buf, uint32_t index, const unsigned char * key,
1542
virtual int index_read_idx_map(uchar * buf, uint index, const uchar * key,
1428
1543
key_part_map keypart_map,
1429
1544
enum ha_rkey_function find_flag);
1430
virtual int index_next(unsigned char * buf __attribute__((unused)))
1431
{ return HA_ERR_WRONG_COMMAND; }
1432
virtual int index_prev(unsigned char * buf __attribute__((unused)))
1433
{ return HA_ERR_WRONG_COMMAND; }
1434
virtual int index_first(unsigned char * buf __attribute__((unused)))
1435
{ return HA_ERR_WRONG_COMMAND; }
1436
virtual int index_last(unsigned char * buf __attribute__((unused)))
1437
{ return HA_ERR_WRONG_COMMAND; }
1438
virtual int index_next_same(unsigned char *buf __attribute__((unused)),
1439
const unsigned char *key __attribute__((unused)),
1440
uint32_t keylen __attribute__((unused)));
1545
virtual int index_next(uchar * buf __attribute__((__unused__)))
1546
{ return HA_ERR_WRONG_COMMAND; }
1547
virtual int index_prev(uchar * buf __attribute__((__unused__)))
1548
{ return HA_ERR_WRONG_COMMAND; }
1549
virtual int index_first(uchar * buf __attribute__((__unused__)))
1550
{ return HA_ERR_WRONG_COMMAND; }
1551
virtual int index_last(uchar * buf __attribute__((__unused__)))
1552
{ return HA_ERR_WRONG_COMMAND; }
1553
virtual int index_next_same(uchar *buf __attribute__((__unused__)),
1554
const uchar *key __attribute__((__unused__)),
1555
uint keylen __attribute__((__unused__)));
1443
1558
The following functions works like index_read, but it find the last
1444
1559
row with the current key value or prefix.
1446
virtual int index_read_last_map(unsigned char * buf, const unsigned char * key,
1561
virtual int index_read_last_map(uchar * buf, const uchar * key,
1447
1562
key_part_map keypart_map)
1449
uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
1564
uint key_len= calculate_key_len(table, active_index, key, keypart_map);
1450
1565
return index_read_last(buf, key, key_len);
1452
1567
virtual int read_range_first(const key_range *start_key,
1455
1570
virtual int read_range_next();
1456
1571
int compare_key(key_range *range);
1457
1572
int compare_key2(key_range *range);
1458
virtual int rnd_next(unsigned char *buf __attribute__((unused)))=0;
1459
virtual int rnd_pos(unsigned char * buf __attribute__((unused)),
1460
unsigned char *pos __attribute__((unused)))=0;
1573
virtual int ft_init() { return HA_ERR_WRONG_COMMAND; }
1574
void ft_end() { ft_handler=NULL; }
1575
virtual FT_INFO *ft_init_ext(uint flags __attribute__((__unused__)),
1576
uint inx __attribute__((__unused__)),
1577
String *key __attribute__((__unused__)))
1579
virtual int ft_read(uchar *buf __attribute__((__unused__))) { return HA_ERR_WRONG_COMMAND; }
1580
virtual int rnd_next(uchar *buf __attribute__((__unused__)))=0;
1581
virtual int rnd_pos(uchar * buf __attribute__((__unused__)),
1582
uchar *pos __attribute__((__unused__)))=0;
1462
1584
One has to use this method when to find
1463
1585
random position by record as the plain
1464
1586
position() call doesn't work for some
1465
1587
handlers for random position.
1467
virtual int rnd_pos_by_record(unsigned char *record);
1468
virtual int read_first_row(unsigned char *buf, uint32_t primary_key);
1589
virtual int rnd_pos_by_record(uchar *record);
1590
virtual int read_first_row(uchar *buf, uint primary_key);
1470
1592
The following function is only needed for tables that may be temporary
1471
1593
tables during joins.
1473
virtual int restart_rnd_next(unsigned char *buf __attribute__((unused)),
1474
unsigned char *pos __attribute__((unused)))
1475
{ return HA_ERR_WRONG_COMMAND; }
1476
virtual int rnd_same(unsigned char *buf __attribute__((unused)),
1477
uint32_t inx __attribute__((unused)))
1478
{ return HA_ERR_WRONG_COMMAND; }
1479
virtual ha_rows records_in_range(uint32_t inx __attribute__((unused)),
1480
key_range *min_key __attribute__((unused)),
1481
key_range *max_key __attribute__((unused)))
1595
virtual int restart_rnd_next(uchar *buf __attribute__((__unused__)),
1596
uchar *pos __attribute__((__unused__)))
1597
{ return HA_ERR_WRONG_COMMAND; }
1598
virtual int rnd_same(uchar *buf __attribute__((__unused__)),
1599
uint inx __attribute__((__unused__)))
1600
{ return HA_ERR_WRONG_COMMAND; }
1601
virtual ha_rows records_in_range(uint inx __attribute__((__unused__)),
1602
key_range *min_key __attribute__((__unused__)),
1603
key_range *max_key __attribute__((__unused__)))
1482
1604
{ return (ha_rows) 10; }
1483
virtual void position(const unsigned char *record)=0;
1605
virtual void position(const uchar *record)=0;
1484
1606
virtual int info(uint)=0; // see my_base.h for full description
1485
virtual uint32_t calculate_key_hash_value(Field **field_array __attribute__((unused)))
1486
{ assert(0); return 0; }
1487
virtual int extra(enum ha_extra_function operation __attribute__((unused)))
1607
virtual uint32 calculate_key_hash_value(Field **field_array __attribute__((__unused__)))
1608
{ DBUG_ASSERT(0); return 0; }
1609
virtual int extra(enum ha_extra_function operation __attribute__((__unused__)))
1489
1611
virtual int extra_opt(enum ha_extra_function operation,
1490
uint32_t cache_size __attribute__((unused)))
1612
uint32_t cache_size __attribute__((__unused__)))
1491
1613
{ return extra(operation); }
1538
1661
insert_id_for_cur_row;
1541
virtual void update_create_info(HA_CREATE_INFO *create_info __attribute__((unused))) {}
1664
virtual void update_create_info(HA_CREATE_INFO *create_info __attribute__((__unused__))) {}
1542
1665
int check_old_types(void);
1543
virtual int assign_to_keycache(THD* thd __attribute__((unused)),
1544
HA_CHECK_OPT* check_opt __attribute__((unused)))
1666
virtual int assign_to_keycache(THD* thd __attribute__((__unused__)),
1667
HA_CHECK_OPT* check_opt __attribute__((__unused__)))
1545
1668
{ return HA_ADMIN_NOT_IMPLEMENTED; }
1546
1669
/* end of the list of admin commands */
1548
1671
virtual int indexes_are_disabled(void) {return 0;}
1549
1672
virtual char *update_table_comment(const char * comment)
1550
1673
{ return (char*) comment;}
1551
virtual void append_create_info(String *packet __attribute__((unused)))
1674
virtual void append_create_info(String *packet __attribute__((__unused__)))
1554
1677
If index == MAX_KEY then a check for table is made and if index <
1558
1681
@param index Index to check if foreign key uses it
1560
@retval true Foreign key defined on table or index
1561
@retval false No foreign key defined
1683
@retval TRUE Foreign key defined on table or index
1684
@retval FALSE No foreign key defined
1563
virtual bool is_fk_defined_on_table_or_index(uint32_t index __attribute__((unused)))
1686
virtual bool is_fk_defined_on_table_or_index(uint index __attribute__((__unused__)))
1565
1688
virtual char* get_foreign_key_create_info(void)
1566
1689
{ return(NULL);} /* gets foreign key create string from InnoDB */
1567
/** used in ALTER Table; 1 if changing storage engine is allowed */
1690
/* gets tablespace name from handler */
1691
const char* get_tablespace_name(void);
1692
/** used in ALTER TABLE; 1 if changing storage engine is allowed */
1568
1693
virtual bool can_switch_engines(void) { return 1; }
1569
1694
/** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
1570
virtual int get_foreign_key_list(THD *thd __attribute__((unused)),
1571
List<FOREIGN_KEY_INFO> *f_key_list __attribute__((unused)))
1695
virtual int get_foreign_key_list(THD *thd __attribute__((__unused__)),
1696
List<FOREIGN_KEY_INFO> *f_key_list __attribute__((__unused__)))
1573
virtual uint32_t referenced_by_foreign_key() { return 0;}
1698
virtual uint referenced_by_foreign_key() { return 0;}
1574
1699
virtual void init_table_handle_for_HANDLER()
1575
1700
{ return; } /* prepare InnoDB for HANDLER */
1576
virtual void free_foreign_key_create_info(char* str __attribute__((unused))) {}
1701
virtual void free_foreign_key_create_info(char* str __attribute__((__unused__))) {}
1577
1702
/** The following can be called without an open handler */
1578
1703
virtual const char *table_type() const =0;
1585
1710
and data file), the order of elements is relevant. First element of engine
1586
1711
file name extentions array should be meta/index file extention. Second
1587
1712
element - data file extention. This order is assumed by
1588
prepare_for_repair() when REPAIR Table ... USE_FRM is issued.
1713
prepare_for_repair() when REPAIR TABLE ... USE_FRM is issued.
1590
1715
virtual const char **bas_ext() const =0;
1592
virtual int get_default_no_partitions(HA_CREATE_INFO *info __attribute__((unused))) { return 1;}
1593
virtual bool get_no_parts(const char *name __attribute__((unused)),
1717
virtual int get_default_no_partitions(HA_CREATE_INFO *info __attribute__((__unused__))) { return 1;}
1718
virtual bool get_no_parts(const char *name __attribute__((__unused__)),
1600
virtual uint32_t index_flags(uint32_t idx, uint32_t part, bool all_parts) const =0;
1602
virtual int add_index(Table *table_arg __attribute__((unused)),
1603
KEY *key_info __attribute__((unused)),
1604
uint32_t num_of_keys __attribute__((unused)))
1605
{ return (HA_ERR_WRONG_COMMAND); }
1606
virtual int prepare_drop_index(Table *table_arg __attribute__((unused)),
1607
uint32_t *key_num __attribute__((unused)),
1608
uint32_t num_of_keys __attribute__((unused)))
1609
{ return (HA_ERR_WRONG_COMMAND); }
1610
virtual int final_drop_index(Table *table_arg __attribute__((unused)))
1611
{ return (HA_ERR_WRONG_COMMAND); }
1613
uint32_t max_record_length() const
1614
{ return cmin((unsigned int)HA_MAX_REC_LENGTH, max_supported_record_length()); }
1615
uint32_t max_keys() const
1616
{ return cmin((unsigned int)MAX_KEY, max_supported_keys()); }
1617
uint32_t max_key_parts() const
1618
{ return cmin((unsigned int)MAX_REF_PARTS, max_supported_key_parts()); }
1619
uint32_t max_key_length() const
1620
{ return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_length()); }
1621
uint32_t max_key_part_length(void) const
1622
{ return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_part_length()); }
1624
virtual uint32_t max_supported_record_length(void) const
1725
virtual uint32_t index_flags(uint idx, uint part, bool all_parts) const =0;
1727
virtual int add_index(TABLE *table_arg __attribute__((__unused__)),
1728
KEY *key_info __attribute__((__unused__)),
1729
uint num_of_keys __attribute__((__unused__)))
1730
{ return (HA_ERR_WRONG_COMMAND); }
1731
virtual int prepare_drop_index(TABLE *table_arg __attribute__((__unused__)),
1732
uint *key_num __attribute__((__unused__)),
1733
uint num_of_keys __attribute__((__unused__)))
1734
{ return (HA_ERR_WRONG_COMMAND); }
1735
virtual int final_drop_index(TABLE *table_arg __attribute__((__unused__)))
1736
{ return (HA_ERR_WRONG_COMMAND); }
1738
uint max_record_length() const
1739
{ return min(HA_MAX_REC_LENGTH, max_supported_record_length()); }
1740
uint max_keys() const
1741
{ return min(MAX_KEY, max_supported_keys()); }
1742
uint max_key_parts() const
1743
{ return min(MAX_REF_PARTS, max_supported_key_parts()); }
1744
uint max_key_length() const
1745
{ return min(MAX_KEY_LENGTH, max_supported_key_length()); }
1746
uint max_key_part_length(void) const
1747
{ return min(MAX_KEY_LENGTH, max_supported_key_part_length()); }
1749
virtual uint max_supported_record_length(void) const
1625
1750
{ return HA_MAX_REC_LENGTH; }
1626
virtual uint32_t max_supported_keys(void) const { return 0; }
1627
virtual uint32_t max_supported_key_parts(void) const { return MAX_REF_PARTS; }
1628
virtual uint32_t max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
1629
virtual uint32_t max_supported_key_part_length(void) const { return 255; }
1630
virtual uint32_t min_record_length(uint32_t options __attribute__((unused))) const
1751
virtual uint max_supported_keys(void) const { return 0; }
1752
virtual uint max_supported_key_parts(void) const { return MAX_REF_PARTS; }
1753
virtual uint max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
1754
virtual uint max_supported_key_part_length(void) const { return 255; }
1755
virtual uint min_record_length(uint options __attribute__((__unused__))) const
1633
1758
virtual bool low_byte_first(void) const { return 1; }
1634
virtual uint32_t checksum(void) const { return 0; }
1759
virtual uint checksum(void) const { return 0; }
1635
1760
virtual bool is_crashed(void) const { return 0; }
1636
1761
virtual bool auto_repair(void) const { return 0; }
1687
1812
@note If engine_data supplied with this function is different from
1688
1813
engine_data supplied with the callback function, and the callback returns
1689
false, a table invalidation on the current table will occur.
1814
FALSE, a table invalidation on the current table will occur.
1691
1816
@return Upon success the engine_callback will point to the storage engine
1692
1817
call back function, if any, and engine_data will point to any storage
1693
1818
engine data used in the specific implementation.
1694
@retval true Success
1695
@retval false The specified table or current statement should not be
1819
@retval TRUE Success
1820
@retval FALSE The specified table or current statement should not be
1700
register_query_cache_table(THD *thd __attribute__((unused)),
1701
char *table_key __attribute__((unused)),
1702
uint32_t key_length __attribute__((unused)),
1825
register_query_cache_table(THD *thd __attribute__((__unused__)),
1826
char *table_key __attribute__((__unused__)),
1827
uint key_length __attribute__((__unused__)),
1703
1828
qc_engine_callback *engine_callback,
1704
uint64_t *engine_data __attribute__((unused)))
1829
uint64_t *engine_data __attribute__((__unused__)))
1706
1831
*engine_callback= 0;
1712
@retval true Primary key (if there is one) is clustered
1837
@retval TRUE Primary key (if there is one) is clustered
1713
1838
key covering all fields
1714
@retval false otherwise
1839
@retval FALSE otherwise
1716
virtual bool primary_key_is_clustered() { return false; }
1717
virtual int cmp_ref(const unsigned char *ref1, const unsigned char *ref2)
1841
virtual bool primary_key_is_clustered() { return FALSE; }
1842
virtual int cmp_ref(const uchar *ref1, const uchar *ref2)
1719
1844
return memcmp(ref1, ref2, ref_length);
1755
1880
virtual void cond_pop(void) { return; }
1758
*idx_cond_push(uint32_t keyno __attribute__((unused)),
1759
Item* idx_cond __attribute__((unused)))
1883
*idx_cond_push(uint keyno __attribute__((__unused__)),
1884
Item* idx_cond __attribute__((__unused__)))
1760
1885
{ return idx_cond; }
1763
1888
Part of old fast alter table, to be depricated
1766
check_if_incompatible_data(HA_CREATE_INFO *create_info __attribute__((unused)),
1767
uint32_t table_changes __attribute__((unused)))
1891
check_if_incompatible_data(HA_CREATE_INFO *create_info __attribute__((__unused__)),
1892
uint table_changes __attribute__((__unused__)))
1768
1893
{ return COMPATIBLE_DATA_NO; }
1770
/* On-line ALTER Table interface */
1895
/* On-line ALTER TABLE interface */
1773
1898
Check if a storage engine supports a particular alter table on-line
1793
1918
implementation.
1796
check_if_supported_alter(Table *altered_table __attribute__((unused)),
1921
check_if_supported_alter(TABLE *altered_table __attribute__((__unused__)),
1797
1922
HA_CREATE_INFO *create_info,
1798
HA_ALTER_FLAGS *alter_flags __attribute__((unused)),
1799
uint32_t table_changes)
1923
HA_ALTER_FLAGS *alter_flags __attribute__((__unused__)),
1926
DBUG_ENTER("check_if_supported_alter");
1801
1927
if (this->check_if_incompatible_data(create_info, table_changes)
1802
1928
== COMPATIBLE_DATA_NO)
1803
return(HA_ALTER_NOT_SUPPORTED);
1804
else if ((*alter_flags & HA_ALTER_STORED_VCOL).is_set())
1805
return(HA_ALTER_NOT_SUPPORTED);
1929
DBUG_RETURN(HA_ALTER_NOT_SUPPORTED);
1807
return(HA_ALTER_SUPPORTED_WAIT_LOCK);
1931
DBUG_RETURN(HA_ALTER_SUPPORTED_WAIT_LOCK);
1810
1934
Tell storage engine to prepare for the on-line alter table (pre-alter)
1820
1944
@retval error error code passed from storage engine
1822
virtual int alter_table_phase1(THD *thd __attribute__((unused)),
1823
Table *altered_table __attribute__((unused)),
1824
HA_CREATE_INFO *create_info __attribute__((unused)),
1825
HA_ALTER_INFO *alter_info __attribute__((unused)),
1826
HA_ALTER_FLAGS *alter_flags __attribute__((unused)))
1946
virtual int alter_table_phase1(THD *thd __attribute__((__unused__)),
1947
TABLE *altered_table __attribute__((__unused__)),
1948
HA_CREATE_INFO *create_info __attribute__((__unused__)),
1949
HA_ALTER_INFO *alter_info __attribute__((__unused__)),
1950
HA_ALTER_FLAGS *alter_flags __attribute__((__unused__)))
1828
1952
return HA_ERR_UNSUPPORTED;
1845
1969
this call is to be wrapped with a DDL lock. This is currently NOT
1848
virtual int alter_table_phase2(THD *thd __attribute__((unused)),
1849
Table *altered_table __attribute__((unused)),
1850
HA_CREATE_INFO *create_info __attribute__((unused)),
1851
HA_ALTER_INFO *alter_info __attribute__((unused)),
1852
HA_ALTER_FLAGS *alter_flags __attribute__((unused)))
1972
virtual int alter_table_phase2(THD *thd __attribute__((__unused__)),
1973
TABLE *altered_table __attribute__((__unused__)),
1974
HA_CREATE_INFO *create_info __attribute__((__unused__)),
1975
HA_ALTER_INFO *alter_info __attribute__((__unused__)),
1976
HA_ALTER_FLAGS *alter_flags __attribute__((__unused__)))
1854
1978
return HA_ERR_UNSUPPORTED;
1955
2073
virtual int rnd_init(bool scan)= 0;
1956
2074
virtual int rnd_end() { return 0; }
1957
virtual int write_row(unsigned char *buf __attribute__((unused)))
1959
return HA_ERR_WRONG_COMMAND;
1962
virtual int update_row(const unsigned char *old_data __attribute__((unused)),
1963
unsigned char *new_data __attribute__((unused)))
1965
return HA_ERR_WRONG_COMMAND;
1968
virtual int delete_row(const unsigned char *buf __attribute__((unused)))
2075
virtual int write_row(uchar *buf __attribute__((unused)))
2077
return HA_ERR_WRONG_COMMAND;
2080
virtual int update_row(const uchar *old_data __attribute__((unused)),
2081
uchar *new_data __attribute__((unused)))
2083
return HA_ERR_WRONG_COMMAND;
2086
virtual int delete_row(const uchar *buf __attribute__((unused)))
1970
2088
return HA_ERR_WRONG_COMMAND;
2017
2135
to specify CHECK option to use to call check()
2018
2136
upon the table.
2020
virtual int repair(THD* thd __attribute__((unused)),
2021
HA_CHECK_OPT* check_opt __attribute__((unused)))
2138
virtual int repair(THD* thd __attribute__((__unused__)),
2139
HA_CHECK_OPT* check_opt __attribute__((__unused__)))
2022
2140
{ return HA_ADMIN_NOT_IMPLEMENTED; }
2023
virtual void start_bulk_insert(ha_rows rows __attribute__((unused)))
2141
virtual void start_bulk_insert(ha_rows rows __attribute__((__unused__)))
2025
2143
virtual int end_bulk_insert(void) { return 0; }
2026
virtual int index_read(unsigned char * buf __attribute__((unused)),
2027
const unsigned char * key __attribute__((unused)),
2028
uint32_t key_len __attribute__((unused)),
2029
enum ha_rkey_function find_flag __attribute__((unused)))
2144
virtual int index_read(uchar * buf __attribute__((__unused__)),
2145
const uchar * key __attribute__((__unused__)),
2146
uint key_len __attribute__((__unused__)),
2147
enum ha_rkey_function find_flag __attribute__((__unused__)))
2030
2148
{ return HA_ERR_WRONG_COMMAND; }
2031
virtual int index_read_last(unsigned char * buf __attribute__((unused)),
2032
const unsigned char * key __attribute__((unused)),
2033
uint32_t key_len __attribute__((unused)))
2149
virtual int index_read_last(uchar * buf __attribute__((__unused__)),
2150
const uchar * key __attribute__((__unused__)),
2151
uint key_len __attribute__((__unused__)))
2034
2152
{ return (my_errno= HA_ERR_WRONG_COMMAND); }
2036
2154
This method is similar to update_row, however the handler doesn't need
2066
2184
is emulated by doing a 'DELETE FROM t'. HA_ERR_WRONG_COMMAND is
2067
2185
returned by storage engines that don't support this operation.
2069
virtual int reset_auto_increment(uint64_t value __attribute__((unused)))
2070
{ return HA_ERR_WRONG_COMMAND; }
2071
virtual int optimize(THD* thd __attribute__((unused)),
2072
HA_CHECK_OPT* check_opt __attribute__((unused)))
2073
{ return HA_ADMIN_NOT_IMPLEMENTED; }
2074
virtual int analyze(THD* thd __attribute__((unused)),
2075
HA_CHECK_OPT* check_opt __attribute__((unused)))
2076
{ return HA_ADMIN_NOT_IMPLEMENTED; }
2077
virtual bool check_and_repair(THD *thd __attribute__((unused)))
2079
virtual int disable_indexes(uint32_t mode __attribute__((unused)))
2080
{ return HA_ERR_WRONG_COMMAND; }
2081
virtual int enable_indexes(uint32_t mode __attribute__((unused)))
2082
{ return HA_ERR_WRONG_COMMAND; }
2083
virtual int discard_or_import_tablespace(bool discard __attribute__((unused)))
2187
virtual int reset_auto_increment(uint64_t value __attribute__((__unused__)))
2188
{ return HA_ERR_WRONG_COMMAND; }
2189
virtual int optimize(THD* thd __attribute__((__unused__)),
2190
HA_CHECK_OPT* check_opt __attribute__((__unused__)))
2191
{ return HA_ADMIN_NOT_IMPLEMENTED; }
2192
virtual int analyze(THD* thd __attribute__((__unused__)),
2193
HA_CHECK_OPT* check_opt __attribute__((__unused__)))
2194
{ return HA_ADMIN_NOT_IMPLEMENTED; }
2195
virtual bool check_and_repair(THD *thd __attribute__((__unused__)))
2197
virtual int disable_indexes(uint mode __attribute__((__unused__)))
2198
{ return HA_ERR_WRONG_COMMAND; }
2199
virtual int enable_indexes(uint mode __attribute__((__unused__)))
2200
{ return HA_ERR_WRONG_COMMAND; }
2201
virtual int discard_or_import_tablespace(my_bool discard __attribute__((__unused__)))
2084
2202
{ return (my_errno=HA_ERR_WRONG_COMMAND); }
2085
2203
virtual void prepare_for_alter(void) { return; }
2086
2204
virtual void drop_table(const char *name);
2087
virtual int create(const char *name __attribute__((unused)),
2088
Table *form __attribute__((unused)),
2089
HA_CREATE_INFO *info __attribute__((unused)))=0;
2205
virtual int create(const char *name __attribute__((__unused__)),
2206
TABLE *form __attribute__((__unused__)),
2207
HA_CREATE_INFO *info __attribute__((__unused__)))=0;
2091
virtual int create_handler_files(const char *name __attribute__((unused)),
2092
const char *old_name __attribute__((unused)),
2093
int action_flag __attribute__((unused)),
2094
HA_CREATE_INFO *info __attribute__((unused)))
2209
virtual int create_handler_files(const char *name __attribute__((__unused__)),
2210
const char *old_name __attribute__((__unused__)),
2211
int action_flag __attribute__((__unused__)),
2212
HA_CREATE_INFO *info __attribute__((__unused__)))
2127
2245
/* Buffer to store rowids, or (rowid, range_id) pairs */
2128
unsigned char *rowids_buf;
2129
unsigned char *rowids_buf_cur; /* Current position when reading/writing */
2130
unsigned char *rowids_buf_last; /* When reading: end of used buffer space */
2131
unsigned char *rowids_buf_end; /* End of the buffer */
2133
bool dsmrr_eof; /* true <=> We have reached EOF when reading index tuples */
2135
/* true <=> need range association, buffer holds {rowid, range_id} pairs */
2247
uchar *rowids_buf_cur; /* Current position when reading/writing */
2248
uchar *rowids_buf_last; /* When reading: end of used buffer space */
2249
uchar *rowids_buf_end; /* End of the buffer */
2251
bool dsmrr_eof; /* TRUE <=> We have reached EOF when reading index tuples */
2253
/* TRUE <=> need range association, buffer holds {rowid, range_id} pairs */
2136
2254
bool is_mrr_assoc;
2138
bool use_default_impl; /* true <=> shortcut all calls to default MRR impl */
2256
bool use_default_impl; /* TRUE <=> shortcut all calls to default MRR impl */
2140
void init(handler *h_arg, Table *table_arg)
2258
void init(handler *h_arg, TABLE *table_arg)
2143
2261
table= table_arg;
2145
2263
int dsmrr_init(handler *h, KEY *key, RANGE_SEQ_IF *seq_funcs,
2146
void *seq_init_param, uint32_t n_ranges, uint32_t mode,
2264
void *seq_init_param, uint n_ranges, uint mode,
2147
2265
HANDLER_BUFFER *buf);
2148
2266
void dsmrr_close();
2149
2267
int dsmrr_fill_buffer(handler *h);
2150
2268
int dsmrr_next(handler *h, char **range_info);
2152
int dsmrr_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys, uint32_t *bufsz,
2153
uint32_t *flags, COST_VECT *cost);
2270
int dsmrr_info(uint keyno, uint n_ranges, uint keys, uint *bufsz,
2271
uint *flags, COST_VECT *cost);
2155
ha_rows dsmrr_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
2156
void *seq_init_param, uint32_t n_ranges, uint32_t *bufsz,
2157
uint32_t *flags, COST_VECT *cost);
2273
ha_rows dsmrr_info_const(uint keyno, RANGE_SEQ_IF *seq,
2274
void *seq_init_param, uint n_ranges, uint *bufsz,
2275
uint *flags, COST_VECT *cost);
2159
bool key_uses_partial_cols(uint32_t keyno);
2160
bool choose_mrr_impl(uint32_t keyno, ha_rows rows, uint32_t *flags, uint32_t *bufsz,
2277
bool key_uses_partial_cols(uint keyno);
2278
bool choose_mrr_impl(uint keyno, ha_rows rows, uint *flags, uint *bufsz,
2161
2279
COST_VECT *cost);
2162
bool get_disk_sweep_mrr_cost(uint32_t keynr, ha_rows rows, uint32_t flags,
2163
uint32_t *buffer_size, COST_VECT *cost);
2280
bool get_disk_sweep_mrr_cost(uint keynr, ha_rows rows, uint flags,
2281
uint *buffer_size, COST_VECT *cost);
2166
2284
extern const char *ha_row_type[];
2274
2393
#define trans_need_2pc(thd, all) ((total_ha_2pc > 1) && \
2275
2394
!((all ? &thd->transaction.all : &thd->transaction.stmt)->no_2pc))
2396
#ifdef HAVE_NDB_BINLOG
2397
int ha_reset_logs(THD *thd);
2398
int ha_binlog_index_purge_file(THD *thd, const char *file);
2399
void ha_reset_slave(THD *thd);
2400
void ha_binlog_log_query(THD *thd, handlerton *db_type,
2401
enum_binlog_command binlog_command,
2402
const char *query, uint query_length,
2403
const char *db, const char *table_name);
2404
void ha_binlog_wait(THD *thd);
2405
int ha_binlog_end(THD *thd);
2407
#define ha_reset_logs(a) do {} while (0)
2408
#define ha_binlog_index_purge_file(a,b) do {} while (0)
2409
#define ha_reset_slave(a) do {} while (0)
2410
#define ha_binlog_log_query(a,b,c,d,e,f,g) do {} while (0)
2411
#define ha_binlog_wait(a) do {} while (0)
2412
#define ha_binlog_end(a) do {} while (0)