224
229
Discrete_interval auto_inc_interval_for_cur_row;
226
Cursor(plugin::StorageEngine &engine_arg, TableShare &share_arg);
227
virtual ~Cursor(void);
228
virtual Cursor *clone(memory::Root *mem_root);
231
handler(handlerton *ht_arg, TABLE_SHARE *share_arg)
232
:table_share(share_arg), table(0),
233
estimation_rows_to_insert(0), ht(ht_arg),
234
ref(0), in_range_check_pushed_down(false),
235
key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
236
ref_length(sizeof(my_off_t)),
238
locked(false), implicit_emptied(0),
239
pushed_cond(0), pushed_idx_cond(NULL), pushed_idx_cond_keyno(MAX_KEY),
240
next_insert_id(0), insert_id_for_cur_row(0)
242
virtual ~handler(void)
244
assert(locked == false);
245
/* TODO: assert(inited == NONE); */
247
virtual handler *clone(MEM_ROOT *mem_root);
248
/** This is called after create to allow us to set up cached variables */
251
cached_table_flags= table_flags();
230
254
/* ha_ methods: pubilc wrappers for private virtual API */
232
int ha_open(const TableIdentifier &identifier, Table *table, int mode, int test_if_locked);
233
int startIndexScan(uint32_t idx, bool sorted);
235
int startTableScan(bool scan);
256
int ha_open(Table *table, const char *name, int mode, int test_if_locked);
257
int ha_index_init(uint32_t idx, bool sorted);
259
int ha_rnd_init(bool scan);
239
263
/* this is necessary in many places, e.g. in HANDLER command */
240
264
int ha_index_or_rnd_end();
265
Table_flags ha_table_flags() const;
243
268
These functions represent the public interface to *users* of the
244
Cursor class, hence they are *not* virtual. For the inheritance
245
interface, see the (private) functions doInsertRecord(), doUpdateRecord(),
246
and doDeleteRecord() below.
269
handler class, hence they are *not* virtual. For the inheritance
270
interface, see the (private) functions write_row(), update_row(),
271
and delete_row() below.
248
273
int ha_external_lock(Session *session, int lock_type);
249
int insertRecord(unsigned char * buf);
250
int updateRecord(const unsigned char * old_data, unsigned char * new_data);
251
int deleteRecord(const unsigned char * buf);
274
int ha_write_row(unsigned char * buf);
275
int ha_update_row(const unsigned char * old_data, unsigned char * new_data);
276
int ha_delete_row(const unsigned char * buf);
252
277
void ha_release_auto_increment();
279
int ha_check_for_upgrade(HA_CHECK_OPT *check_opt);
254
280
/** to be actually called to get 'check()' functionality*/
255
281
int ha_check(Session *session, HA_CHECK_OPT *check_opt);
282
int ha_repair(Session* session, HA_CHECK_OPT* check_opt);
257
283
void ha_start_bulk_insert(ha_rows rows);
258
284
int ha_end_bulk_insert();
285
int ha_bulk_update_row(const unsigned char *old_data, unsigned char *new_data,
286
uint32_t *dup_key_found);
259
287
int ha_delete_all_rows();
260
288
int ha_reset_auto_increment(uint64_t value);
289
int ha_optimize(Session* session, HA_CHECK_OPT* check_opt);
261
290
int ha_analyze(Session* session, HA_CHECK_OPT* check_opt);
291
bool ha_check_and_repair(Session *session);
263
292
int ha_disable_indexes(uint32_t mode);
264
293
int ha_enable_indexes(uint32_t mode);
265
294
int ha_discard_or_import_tablespace(bool discard);
266
void closeMarkForDelete(const char *name);
295
void ha_prepare_for_alter();
296
int ha_rename_table(const char *from, const char *to);
297
int ha_delete_table(const char *name);
298
void ha_drop_table(const char *name);
300
int ha_create(const char *name, Table *form, HA_CREATE_INFO *info);
302
int ha_create_handler_files(const char *name, const char *old_name,
303
int action_flag, HA_CREATE_INFO *info);
268
305
void adjust_next_insert_id_after_explicit_value(uint64_t nr);
269
306
int update_auto_increment();
270
virtual void change_table_ptr(Table *table_arg, TableShare *share);
307
void print_keydup_error(uint32_t key_nr, const char *msg);
308
virtual void print_error(int error, myf errflag);
309
virtual bool get_error_message(int error, String *buf);
310
uint32_t get_dup_key(int error);
311
virtual void change_table_ptr(Table *table_arg, TABLE_SHARE *share);
272
313
/* Estimates calculation */
273
314
virtual double scan_time(void)
274
315
{ return uint64_t2double(stats.data_file_length) / IO_SIZE + 2; }
275
virtual double read_time(uint32_t, uint32_t ranges, ha_rows rows)
316
virtual double read_time(uint32_t index __attribute__((unused)),
317
uint32_t ranges, ha_rows rows)
276
318
{ return rows2double(ranges+rows); }
278
320
virtual double index_only_read_time(uint32_t keynr, double records);
280
322
virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
281
void *seq_init_param,
323
void *seq_init_param,
282
324
uint32_t n_ranges, uint32_t *bufsz,
283
uint32_t *flags, optimizer::CostVector *cost);
325
uint32_t *flags, COST_VECT *cost);
284
326
virtual int multi_range_read_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys,
285
uint32_t *bufsz, uint32_t *flags, optimizer::CostVector *cost);
327
uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
286
328
virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
287
uint32_t n_ranges, uint32_t mode);
329
uint32_t n_ranges, uint32_t mode,
330
HANDLER_BUFFER *buf);
288
331
virtual int multi_range_read_next(char **range_info);
291
334
virtual const key_map *keys_to_use_for_scanning();
292
335
bool has_transactions();
336
virtual uint32_t extra_rec_buf_length() const { return 0; }
295
339
This method is used to analyse the error to see whether the error
296
340
is ignorable or not, certain handlers can have more error that are
297
ignorable than others. E.g. the partition Cursor can get inserts
341
ignorable than others. E.g. the partition handler can get inserts
298
342
into a range where there is no partition and this is an ignorable
300
344
HA_ERR_FOUND_DUP_UNIQUE is a special case in MyISAM that means the
456
579
@retval true Foreign key defined on table or index
457
580
@retval false No foreign key defined
582
virtual bool is_fk_defined_on_table_or_index(uint32_t index __attribute__((unused)))
459
584
virtual char* get_foreign_key_create_info(void)
460
{ return NULL;} /* gets foreign key create string from InnoDB */
461
/** used in ALTER Table; if changing storage engine is allowed.
462
e.g. not be allowed if table has foreign key constraints in engine.
464
virtual bool can_switch_engines(void) { return true; }
585
{ return(NULL);} /* gets foreign key create string from InnoDB */
586
/** used in ALTER Table; 1 if changing storage engine is allowed */
587
virtual bool can_switch_engines(void) { return 1; }
465
588
/** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
466
virtual int get_foreign_key_list(Session *, List<ForeignKeyInfo> *)
589
virtual int get_foreign_key_list(Session *session __attribute__((unused)),
590
List<FOREIGN_KEY_INFO> *f_key_list __attribute__((unused)))
468
592
virtual uint32_t referenced_by_foreign_key() { return 0;}
469
virtual void free_foreign_key_create_info(char *) {}
593
virtual void init_table_handle_for_HANDLER()
594
{ return; } /* prepare InnoDB for HANDLER */
595
virtual void free_foreign_key_create_info(char* str __attribute__((unused))) {}
596
/** The following can be called without an open handler */
597
virtual const char *table_type() const =0;
599
If frm_error() is called then we will use this to find out what file
600
extentions exist for the storage engine. This is also used by the default
601
rename_table and delete_table method in handler.cc.
603
For engines that have two file name extentions (separate meta/index file
604
and data file), the order of elements is relevant. First element of engine
605
file name extentions array should be meta/index file extention. Second
606
element - data file extention. This order is assumed by
607
prepare_for_repair() when REPAIR Table ... USE_FRM is issued.
609
virtual const char **bas_ext() const =0;
611
virtual int get_default_no_partitions(HA_CREATE_INFO *info __attribute__((unused))) { return 1;}
612
virtual bool get_no_parts(const char *name __attribute__((unused)),
619
virtual uint32_t index_flags(uint32_t idx, uint32_t part, bool all_parts) const =0;
621
virtual int add_index(Table *table_arg __attribute__((unused)),
622
KEY *key_info __attribute__((unused)),
623
uint32_t num_of_keys __attribute__((unused)))
624
{ return (HA_ERR_WRONG_COMMAND); }
625
virtual int prepare_drop_index(Table *table_arg __attribute__((unused)),
626
uint32_t *key_num __attribute__((unused)),
627
uint32_t num_of_keys __attribute__((unused)))
628
{ return (HA_ERR_WRONG_COMMAND); }
629
virtual int final_drop_index(Table *table_arg __attribute__((unused)))
630
{ return (HA_ERR_WRONG_COMMAND); }
632
uint32_t max_record_length() const
633
{ return cmin((unsigned int)HA_MAX_REC_LENGTH, max_supported_record_length()); }
634
uint32_t max_keys() const
635
{ return cmin((unsigned int)MAX_KEY, max_supported_keys()); }
636
uint32_t max_key_parts() const
637
{ return cmin((unsigned int)MAX_REF_PARTS, max_supported_key_parts()); }
638
uint32_t max_key_length() const
639
{ return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_length()); }
640
uint32_t max_key_part_length(void) const
641
{ return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_part_length()); }
643
virtual uint32_t max_supported_record_length(void) const
644
{ return HA_MAX_REC_LENGTH; }
645
virtual uint32_t max_supported_keys(void) const { return 0; }
646
virtual uint32_t max_supported_key_parts(void) const { return MAX_REF_PARTS; }
647
virtual uint32_t max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
648
virtual uint32_t max_supported_key_part_length(void) const { return 255; }
649
virtual uint32_t min_record_length(uint32_t options __attribute__((unused))) const
652
virtual bool low_byte_first(void) const { return 1; }
653
virtual uint32_t checksum(void) const { return 0; }
654
virtual bool is_crashed(void) const { return 0; }
655
virtual bool auto_repair(void) const { return 0; }
658
#define CHF_CREATE_FLAG 0
659
#define CHF_DELETE_FLAG 1
660
#define CHF_RENAME_FLAG 2
664
@note lock_count() can return > 1 if the table is MERGE or partitioned.
666
virtual uint32_t lock_count(void) const { return 1; }
472
668
Is not invoked for non-transactional temporary tables.
501
738
return memcmp(ref1, ref2, ref_length);
504
virtual bool isOrdered(void)
742
Condition pushdown to storage engines
746
Push condition down to the table handler.
748
@param cond Condition to be pushed. The condition tree must not be
749
modified by the by the caller.
752
The 'remainder' condition that caller must use to filter out records.
753
NULL means the handler will not return rows that do not match the
757
The pushed conditions form a stack (from which one can remove the
758
last pushed condition using cond_pop).
759
The table handler filters out rows using (pushed_cond1 AND pushed_cond2
760
AND ... AND pushed_condN)
761
or less restrictive condition, depending on handler's capabilities.
763
handler->ha_reset() call empties the condition stack.
764
Calls to rnd_init/rnd_end, index_init/index_end etc do not affect the
767
virtual const COND *cond_push(const COND *cond) { return cond; }
770
Pop the top condition from the condition stack of the handler instance.
772
Pops the top if condition stack, if stack is not empty.
774
virtual void cond_pop(void) { return; }
777
*idx_cond_push(uint32_t keyno __attribute__((unused)),
778
Item* idx_cond __attribute__((unused)))
782
Part of old fast alter table, to be depricated
785
check_if_incompatible_data(HA_CREATE_INFO *create_info __attribute__((unused)),
786
uint32_t table_changes __attribute__((unused)))
787
{ return COMPATIBLE_DATA_NO; }
789
/* On-line ALTER Table interface */
792
Check if a storage engine supports a particular alter table on-line
794
@param altered_table A temporary table show what table is to
796
@param create_info Information from the parsing phase about new
798
@param alter_flags Bitmask that shows what will be changed
799
@param table_changes Shows if table layout has changed (for
800
backwards compatibility with
801
check_if_incompatible_data
803
@retval HA_ALTER_ERROR Unexpected error
804
@retval HA_ALTER_SUPPORTED_WAIT_LOCK Supported, but requires DDL lock
805
@retval HA_ALTER_SUPPORTED_NO_LOCK Supported
806
@retval HA_ALTER_NOT_SUPPORTED Not supported
809
The default implementation is implemented to support fast
810
alter table (storage engines that support some changes by
811
just changing the frm file) without any change in the handler
815
check_if_supported_alter(Table *altered_table __attribute__((unused)),
816
HA_CREATE_INFO *create_info,
817
HA_ALTER_FLAGS *alter_flags __attribute__((unused)),
818
uint32_t table_changes)
820
if (this->check_if_incompatible_data(create_info, table_changes)
821
== COMPATIBLE_DATA_NO)
822
return(HA_ALTER_NOT_SUPPORTED);
823
else if ((*alter_flags & HA_ALTER_STORED_VCOL).is_set())
824
return(HA_ALTER_NOT_SUPPORTED);
826
return(HA_ALTER_SUPPORTED_WAIT_LOCK);
829
Tell storage engine to prepare for the on-line alter table (pre-alter)
831
@param session The thread handle
832
@param altered_table A temporary table show what table is to
834
@param alter_info Storage place for data used during phase1
836
@param alter_flags Bitmask that shows what will be changed
839
@retval error error code passed from storage engine
841
virtual int alter_table_phase1(Session *session __attribute__((unused)),
842
Table *altered_table __attribute__((unused)),
843
HA_CREATE_INFO *create_info __attribute__((unused)),
844
HA_ALTER_INFO *alter_info __attribute__((unused)),
845
HA_ALTER_FLAGS *alter_flags __attribute__((unused)))
847
return HA_ERR_UNSUPPORTED;
850
Tell storage engine to perform the on-line alter table (alter)
852
@param session The thread handle
853
@param altered_table A temporary table show what table is to
855
@param alter_info Storage place for data used during phase1
857
@param alter_flags Bitmask that shows what will be changed
860
@retval error error code passed from storage engine
863
If check_if_supported_alter returns HA_ALTER_SUPPORTED_WAIT_LOCK
864
this call is to be wrapped with a DDL lock. This is currently NOT
867
virtual int alter_table_phase2(Session *session __attribute__((unused)),
868
Table *altered_table __attribute__((unused)),
869
HA_CREATE_INFO *create_info __attribute__((unused)),
870
HA_ALTER_INFO *alter_info __attribute__((unused)),
871
HA_ALTER_FLAGS *alter_flags __attribute__((unused)))
873
return HA_ERR_UNSUPPORTED;
876
Tell storage engine that changed frm file is now on disk and table
877
has been re-opened (post-alter)
879
@param session The thread handle
880
@param table The altered table, re-opened
882
virtual int alter_table_phase3(Session *session __attribute__((unused)),
883
Table *table __attribute__((unused)))
885
return HA_ERR_UNSUPPORTED;
889
use_hidden_primary_key() is called in case of an update/delete when
890
(table_flags() and HA_PRIMARY_KEY_REQUIRED_FOR_DELETE) is defined
891
but we don't have a primary key
893
virtual void use_hidden_primary_key();
898
@param session Thread handle
899
@param lock_type HA_LOCK_IN_SHARE_MODE (F_RDLCK)
900
HA_LOCK_IN_EXCLUSIVE_MODE (F_WRLCK)
901
@param lock_timeout -1 default timeout
903
>0 wait timeout in milliseconds.
906
lock_timeout >0 is not used by MySQL currently. If the storage
907
engine does not support NOWAIT (lock_timeout == 0) it should
908
return an error. But if it does not support WAIT X (lock_timeout
909
>0) it should treat it as lock_timeout == -1 and wait a default
910
(or even hard-coded) timeout.
912
@retval HA_ERR_WRONG_COMMAND Storage engine does not support
914
@retval HA_ERR_UNSUPPORTED Storage engine does not support NOWAIT
915
@retval HA_ERR_LOCK_WAIT_TIMEOUT Lock request timed out or
916
lock conflict with NOWAIT option
917
@retval HA_ERR_LOCK_DEADLOCK Deadlock detected
919
virtual int lock_table(Session *session __attribute__((unused)),
920
int lock_type __attribute__((unused)),
921
int lock_timeout __attribute__((unused)))
923
return HA_ERR_WRONG_COMMAND;
926
This procedure defines if the storage engine supports virtual columns.
927
Default false means "not supported".
929
virtual bool check_if_supported_virtual_columns(void)
511
933
/* Service methods for use by storage engines. */
512
void ha_statistic_increment(uint64_t system_status_var::*offset) const;
934
void ha_statistic_increment(ulong SSV::*offset) const;
513
935
void **ha_data(Session *) const;
936
Session *ha_session(void) const;
939
Default rename_table() and delete_table() rename/delete files with a
940
given name and extensions from bas_ext().
942
These methods can be overridden, but their default implementation
943
provide useful functionality.
945
virtual int rename_table(const char *from, const char *to);
947
Delete a table in the engine. Called for base as well as temporary
950
virtual int delete_table(const char *name);
516
953
/* Private helpers */
517
inline void setTransactionReadWrite();
954
inline void mark_trx_read_write();
520
957
Low-level primitives for storage engines. These should be
579
1018
@return non-0 in case of failure, 0 in case of success.
580
1019
When lock_type is F_UNLCK, the return value is ignored.
582
virtual int external_lock(Session *, int)
1021
virtual int external_lock(Session *session __attribute__((unused)),
1022
int lock_type __attribute__((unused)))
586
1026
virtual void release_auto_increment(void) { return; };
587
1027
/** admin commands - called from mysql_admin_table */
588
virtual int check(Session *)
1028
virtual int check_for_upgrade(HA_CHECK_OPT *check_opt __attribute__((unused)))
1030
virtual int check(Session* session __attribute__((unused)),
1031
HA_CHECK_OPT* check_opt __attribute__((unused)))
589
1032
{ return HA_ADMIN_NOT_IMPLEMENTED; }
591
virtual void start_bulk_insert(ha_rows)
1035
In this method check_opt can be modified
1036
to specify CHECK option to use to call check()
1039
virtual int repair(Session* session __attribute__((unused)),
1040
HA_CHECK_OPT* check_opt __attribute__((unused)))
1041
{ return HA_ADMIN_NOT_IMPLEMENTED; }
1042
virtual void start_bulk_insert(ha_rows rows __attribute__((unused)))
593
1044
virtual int end_bulk_insert(void) { return 0; }
594
virtual int index_read(unsigned char *, const unsigned char *,
595
uint32_t, enum ha_rkey_function)
1045
virtual int index_read(unsigned char * buf __attribute__((unused)),
1046
const unsigned char * key __attribute__((unused)),
1047
uint32_t key_len __attribute__((unused)),
1048
enum ha_rkey_function find_flag __attribute__((unused)))
596
1049
{ return HA_ERR_WRONG_COMMAND; }
597
virtual int index_read_last(unsigned char *, const unsigned char *, uint32_t)
598
{ return (errno= HA_ERR_WRONG_COMMAND); }
1050
virtual int index_read_last(unsigned char * buf __attribute__((unused)),
1051
const unsigned char * key __attribute__((unused)),
1052
uint32_t key_len __attribute__((unused)))
1053
{ return (my_errno= HA_ERR_WRONG_COMMAND); }
1055
This method is similar to update_row, however the handler doesn't need
1056
to execute the updates at this point in time. The handler can be certain
1057
that another call to bulk_update_row will occur OR a call to
1058
exec_bulk_update before the set of updates in this query is concluded.
1060
@param old_data Old record
1061
@param new_data New record
1062
@param dup_key_found Number of duplicate keys found
1064
@retval 0 Bulk delete used by handler
1065
@retval 1 Bulk delete not used, normal operation used
1067
virtual int bulk_update_row(const unsigned char *old_data __attribute__((unused)),
1068
unsigned char *new_data __attribute__((unused)),
1069
uint32_t *dup_key_found __attribute__((unused)))
1072
return HA_ERR_WRONG_COMMAND;
600
1075
This is called to delete all rows in a table
601
If the Cursor don't support this, then this function will
1076
If the handler don't support this, then this function will
602
1077
return HA_ERR_WRONG_COMMAND and MySQL will delete the rows one
605
1080
virtual int delete_all_rows(void)
606
{ return (errno=HA_ERR_WRONG_COMMAND); }
1081
{ return (my_errno=HA_ERR_WRONG_COMMAND); }
608
1083
Reset the auto-increment counter to the given value, i.e. the next row
609
1084
inserted will get the given value. This is called e.g. after TRUNCATE
610
1085
is emulated by doing a 'DELETE FROM t'. HA_ERR_WRONG_COMMAND is
611
1086
returned by storage engines that don't support this operation.
613
virtual int reset_auto_increment(uint64_t)
614
{ return HA_ERR_WRONG_COMMAND; }
616
virtual int analyze(Session *)
617
{ return HA_ADMIN_NOT_IMPLEMENTED; }
619
virtual int disable_indexes(uint32_t)
620
{ return HA_ERR_WRONG_COMMAND; }
622
virtual int enable_indexes(uint32_t)
623
{ return HA_ERR_WRONG_COMMAND; }
625
virtual int discard_or_import_tablespace(bool)
626
{ return (errno=HA_ERR_WRONG_COMMAND); }
629
@todo this is just for the HEAP engine, it should
630
be removed at some point in the future (and
631
no new engine should ever use it). Right
632
now HEAP does rely on it, so we cannot remove it.
1088
virtual int reset_auto_increment(uint64_t value __attribute__((unused)))
1089
{ return HA_ERR_WRONG_COMMAND; }
1090
virtual int optimize(Session* session __attribute__((unused)),
1091
HA_CHECK_OPT* check_opt __attribute__((unused)))
1092
{ return HA_ADMIN_NOT_IMPLEMENTED; }
1093
virtual int analyze(Session* session __attribute__((unused)),
1094
HA_CHECK_OPT* check_opt __attribute__((unused)))
1095
{ return HA_ADMIN_NOT_IMPLEMENTED; }
1096
virtual bool check_and_repair(Session *session __attribute__((unused)))
1098
virtual int disable_indexes(uint32_t mode __attribute__((unused)))
1099
{ return HA_ERR_WRONG_COMMAND; }
1100
virtual int enable_indexes(uint32_t mode __attribute__((unused)))
1101
{ return HA_ERR_WRONG_COMMAND; }
1102
virtual int discard_or_import_tablespace(bool discard __attribute__((unused)))
1103
{ return (my_errno=HA_ERR_WRONG_COMMAND); }
1104
virtual void prepare_for_alter(void) { return; }
634
1105
virtual void drop_table(const char *name);
1106
virtual int create(const char *name __attribute__((unused)),
1107
Table *form __attribute__((unused)),
1108
HA_CREATE_INFO *info __attribute__((unused)))=0;
1110
virtual int create_handler_files(const char *name __attribute__((unused)),
1111
const char *old_name __attribute__((unused)),
1112
int action_flag __attribute__((unused)),
1113
HA_CREATE_INFO *info __attribute__((unused)))
1120
A Disk-Sweep MRR interface implementation
1122
This implementation makes range (and, in the future, 'ref') scans to read
1123
table rows in disk sweeps.
1125
Currently it is used by MyISAM and InnoDB. Potentially it can be used with
1126
any table handler that has non-clustered indexes and on-disk rows.
1132
typedef void (handler::*range_check_toggle_func_t)(bool on);
1137
handler *h; /* The "owner" handler object. It is used for scanning the index */
1138
Table *table; /* Always equal to h->table */
1141
Secondary handler object. It is used to retrieve full table rows by
1146
/* Buffer to store rowids, or (rowid, range_id) pairs */
1147
unsigned char *rowids_buf;
1148
unsigned char *rowids_buf_cur; /* Current position when reading/writing */
1149
unsigned char *rowids_buf_last; /* When reading: end of used buffer space */
1150
unsigned char *rowids_buf_end; /* End of the buffer */
1152
bool dsmrr_eof; /* true <=> We have reached EOF when reading index tuples */
1154
/* true <=> need range association, buffer holds {rowid, range_id} pairs */
1157
bool use_default_impl; /* true <=> shortcut all calls to default MRR impl */
1159
void init(handler *h_arg, Table *table_arg)
1164
int dsmrr_init(handler *h, KEY *key, RANGE_SEQ_IF *seq_funcs,
1165
void *seq_init_param, uint32_t n_ranges, uint32_t mode,
1166
HANDLER_BUFFER *buf);
1168
int dsmrr_fill_buffer(handler *h);
1169
int dsmrr_next(handler *h, char **range_info);
1171
int dsmrr_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys, uint32_t *bufsz,
1172
uint32_t *flags, COST_VECT *cost);
1174
ha_rows dsmrr_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
1175
void *seq_init_param, uint32_t n_ranges, uint32_t *bufsz,
1176
uint32_t *flags, COST_VECT *cost);
1178
bool key_uses_partial_cols(uint32_t keyno);
1179
bool choose_mrr_impl(uint32_t keyno, ha_rows rows, uint32_t *flags, uint32_t *bufsz,
1181
bool get_disk_sweep_mrr_cost(uint32_t keynr, ha_rows rows, uint32_t flags,
1182
uint32_t *buffer_size, COST_VECT *cost);
637
1185
extern const char *ha_row_type[];
1186
extern const char *tx_isolation_names[];
1187
extern const char *binlog_format_names[];
1188
extern TYPELIB tx_isolation_typelib;
1189
extern TYPELIB myisam_stats_method_typelib;
1190
extern uint32_t total_ha, total_ha_2pc;
1192
/* Wrapper functions */
1193
#define ha_commit(session) (ha_commit_trans((session), true))
1194
#define ha_rollback(session) (ha_rollback_trans((session), true))
639
1196
/* basic stuff */
640
void ha_init_errors(void);
643
SortField *make_unireg_sortorder(order_st *order, uint32_t *length,
644
SortField *sortorder);
1197
int ha_init_errors(void);
1200
int ha_initialize_handlerton(st_plugin_int *plugin);
1201
int ha_finalize_handlerton(st_plugin_int *plugin);
1203
TYPELIB *ha_known_exts(void);
1204
void ha_close_connection(Session* session);
1205
bool ha_flush_logs(handlerton *db_type);
1206
void ha_drop_database(char* path);
1207
int ha_create_table(Session *session, const char *path,
1208
const char *db, const char *table_name,
1209
HA_CREATE_INFO *create_info,
1210
bool update_create_info);
1211
int ha_delete_table(Session *session, const char *path,
1212
const char *db, const char *alias, bool generate_warning);
1214
/* statistics and info */
1215
bool ha_show_status(Session *session, handlerton *db_type, enum ha_stat_type stat);
1218
int ha_create_table_from_engine(Session* session, const char *db, const char *name);
1219
int ha_discover(Session* session, const char* dbname, const char* name,
1220
unsigned char** frmblob, size_t* frmlen);
1221
int ha_find_files(Session *session,const char *db,const char *path,
1222
const char *wild, bool dir, List<LEX_STRING>* files);
1223
int ha_table_exists_in_engine(Session* session, const char* db, const char* name);
1226
extern "C" int ha_init_key_cache(const char *name, KEY_CACHE *key_cache);
1227
int ha_resize_key_cache(KEY_CACHE *key_cache);
1228
int ha_change_key_cache_param(KEY_CACHE *key_cache);
1229
int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache);
1230
int ha_end_key_cache(KEY_CACHE *key_cache);
1232
/* report to InnoDB that control passes to the client */
1233
int ha_release_temporary_latches(Session *session);
1235
/* transactions: interface to handlerton functions */
1236
int ha_start_consistent_snapshot(Session *session);
1237
int ha_commit_or_rollback_by_xid(XID *xid, bool commit);
1238
int ha_commit_one_phase(Session *session, bool all);
1239
int ha_rollback_trans(Session *session, bool all);
1240
int ha_prepare(Session *session);
1241
int ha_recover(HASH *commit_list);
1243
/* transactions: these functions never call handlerton functions directly */
1244
int ha_commit_trans(Session *session, bool all);
1245
int ha_autocommit_or_rollback(Session *session, int error);
1246
int ha_enable_transaction(Session *session, bool on);
1249
int ha_rollback_to_savepoint(Session *session, SAVEPOINT *sv);
1250
int ha_savepoint(Session *session, SAVEPOINT *sv);
1251
int ha_release_savepoint(Session *session, SAVEPOINT *sv);
1253
/* these are called by storage engines */
1254
void trans_register_ha(Session *session, bool all, handlerton *ht);
1256
void table_case_convert(char * name, uint32_t length);
1257
const char *table_case_name(HA_CREATE_INFO *info, const char *name);
1259
extern char reg_ext[FN_EXTLEN];
1260
extern uint32_t reg_ext_length;
1261
extern ulong specialflag;
1262
extern uint32_t lower_case_table_names;
1263
uint32_t filename_to_tablename(const char *from, char *to, uint32_t to_length);
1264
uint32_t tablename_to_filename(const char *from, char *to, uint32_t to_length);
1267
bool mysql_ha_open(Session *session, TableList *tables, bool reopen);
1268
bool mysql_ha_close(Session *session, TableList *tables);
1269
bool mysql_ha_read(Session *, TableList *,enum enum_ha_read_modes,char *,
1270
List<Item> *,enum ha_rkey_function,Item *,ha_rows,ha_rows);
1271
void mysql_ha_flush(Session *session);
1272
void mysql_ha_rm_tables(Session *session, TableList *tables, bool is_locked);
1273
void mysql_ha_cleanup(Session *session);
1276
Storage engine has to assume the transaction will end up with 2pc if
1277
- there is more than one 2pc-capable storage engine available
1278
- in the current transaction 2pc was not disabled yet
1280
#define trans_need_2pc(session, all) ((total_ha_2pc > 1) && \
1281
!((all ? &session->transaction.all : &session->transaction.stmt)->no_2pc))
1284
bool mysql_xa_recover(Session *session);
1286
SORT_FIELD * make_unireg_sortorder(order_st *order, uint32_t *length,
1287
SORT_FIELD *sortorder);
645
1288
int setup_order(Session *session, Item **ref_pointer_array, TableList *tables,
646
1289
List<Item> &fields, List <Item> &all_fields, order_st *order);
647
1290
int setup_group(Session *session, Item **ref_pointer_array, TableList *tables,
648
1291
List<Item> &fields, List<Item> &all_fields, order_st *order,
649
1292
bool *hidden_group_fields);
650
bool fix_inner_refs(Session *session, List<Item> &all_fields, Select_Lex *select,
1293
bool fix_inner_refs(Session *session, List<Item> &all_fields, SELECT_LEX *select,
651
1294
Item **ref_pointer_array);
653
1296
bool handle_select(Session *session, LEX *lex, select_result *result,
654
uint64_t setup_tables_done_option);
655
void free_underlaid_joins(Session *session, Select_Lex *select);
1297
ulong setup_tables_done_option);
1298
bool mysql_select(Session *session, Item ***rref_pointer_array,
1299
TableList *tables, uint32_t wild_num, List<Item> &list,
1300
COND *conds, uint32_t og_num, order_st *order, order_st *group,
1301
Item *having, order_st *proc_param, uint64_t select_type,
1302
select_result *result, SELECT_LEX_UNIT *unit,
1303
SELECT_LEX *select_lex);
1304
void free_underlaid_joins(Session *session, SELECT_LEX *select);
1305
bool mysql_explain_union(Session *session, SELECT_LEX_UNIT *unit,
1306
select_result *result);
1307
int mysql_explain_select(Session *session, SELECT_LEX *sl, char const *type,
1308
select_result *result);
1309
bool mysql_union(Session *session, LEX *lex, select_result *result,
1310
SELECT_LEX_UNIT *unit, ulong setup_tables_done_option);
657
1311
bool mysql_handle_derived(LEX *lex, bool (*processor)(Session *session,
659
1313
TableList *table));
660
1314
bool mysql_derived_prepare(Session *session, LEX *lex, TableList *t);
661
1315
bool mysql_derived_filling(Session *session, LEX *lex, TableList *t);
662
int prepare_create_field(CreateField *sql_field,
1316
void sp_prepare_create_field(Session *session, Create_field *sql_field);
1317
int prepare_create_field(Create_field *sql_field,
663
1318
uint32_t *blob_columns,
664
int *timestamps, int *timestamps_with_niladic);
666
bool mysql_create_table(Session *session,
667
TableIdentifier &identifier,
1319
int *timestamps, int *timestamps_with_niladic,
1320
int64_t table_flags);
1321
bool mysql_create_table(Session *session,const char *db, const char *table_name,
668
1322
HA_CREATE_INFO *create_info,
669
message::Table &table_proto,
670
AlterInfo *alter_info,
671
bool tmp_table, uint32_t select_field_count,
672
bool is_if_not_exists);
674
bool mysql_create_table_no_lock(Session *session,
675
TableIdentifier &identifier,
1323
Alter_info *alter_info,
1324
bool tmp_table, uint32_t select_field_count);
1325
bool mysql_create_table_no_lock(Session *session, const char *db,
1326
const char *table_name,
676
1327
HA_CREATE_INFO *create_info,
677
message::Table &table_proto,
678
AlterInfo *alter_info,
1328
Alter_info *alter_info,
679
1329
bool tmp_table, uint32_t select_field_count,
680
bool is_if_not_exists);
682
bool mysql_create_like_table(Session* session,
683
TableIdentifier &destination_identifier,
684
TableList* table, TableList* src_table,
685
message::Table &create_table_proto,
686
bool is_if_not_exists,
689
bool mysql_rename_table(Session &session,
690
plugin::StorageEngine *base,
691
TableIdentifier &old_identifier,
692
TableIdentifier &new_identifier);
1330
bool lock_open_lock);
1332
bool mysql_alter_table(Session *session, char *new_db, char *new_name,
1333
HA_CREATE_INFO *create_info,
1334
TableList *table_list,
1335
Alter_info *alter_info,
1336
uint32_t order_num, order_st *order, bool ignore);
1337
bool mysql_recreate_table(Session *session, TableList *table_list);
1338
bool mysql_create_like_table(Session *session, TableList *table,
1339
TableList *src_table,
1340
HA_CREATE_INFO *create_info);
1341
bool mysql_rename_table(handlerton *base, const char *old_db,
1342
const char * old_name, const char *new_db,
1343
const char * new_name, uint32_t flags);
694
1344
bool mysql_prepare_update(Session *session, TableList *table_list,
695
1345
Item **conds, uint32_t order_num, order_st *order);
696
1346
int mysql_update(Session *session,TableList *tables,List<Item> &fields,
697
1347
List<Item> &values,COND *conds,
698
1348
uint32_t order_num, order_st *order, ha_rows limit,
699
1349
enum enum_duplicates handle_duplicates, bool ignore);
1350
bool mysql_multi_update(Session *session, TableList *table_list,
1351
List<Item> *fields, List<Item> *values,
1352
COND *conds, uint64_t options,
1353
enum enum_duplicates handle_duplicates, bool ignore,
1354
SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex);
700
1355
bool mysql_prepare_insert(Session *session, TableList *table_list, Table *table,
701
1356
List<Item> &fields, List_item *values,
702
1357
List<Item> &update_fields,