22 #include <drizzled/atomics.h>
24 #include <drizzled/discrete_interval.h>
25 #include <drizzled/error_t.h>
26 #include <drizzled/ha_statistics.h>
27 #include <drizzled/handler_structs.h>
28 #include <drizzled/identifier.h>
29 #include <drizzled/key_map.h>
30 #include <drizzled/message/table.h>
31 #include <drizzled/sql_list.h>
32 #include <drizzled/thr_lock.h>
41 #define HA_MAX_ALTER_FLAGS 40
43 typedef std::bitset<HA_MAX_ALTER_FLAGS> HA_ALTER_FLAGS;
45 typedef List<Item> List_item;
46 extern KEY_CREATE_INFO default_key_create_info;
52 inline key_part_map make_keypart_map(
int a)
54 return (((key_part_map)2 << a) - 1);
61 inline key_part_map make_prev_keypart_map(
int a)
63 return (((key_part_map)1 << a) - 1);
116 ha_rows estimation_rows_to_insert;
124 unsigned char *dup_ref;
128 Table *getTable()
const
138 uint32_t ranges_in_seq;
140 bool mrr_is_output_sorted;
153 int key_compare_result_on_equal;
156 uint32_t key_used_on_scan;
157 uint32_t active_index;
160 enum {NONE=0, INDEX, RND} inited;
173 uint64_t getNextInsertId()
const
175 return next_insert_id;
183 return stats.auto_increment_value;
206 int startIndexScan(uint32_t idx,
bool sorted) __attribute__ ((warn_unused_result));
208 int startTableScan(
bool scan) __attribute__ ((warn_unused_result));
213 int ha_index_or_rnd_end();
221 int ha_external_lock(
Session *session,
int lock_type);
222 int insertRecord(
unsigned char * buf) __attribute__ ((warn_unused_result));
223 int updateRecord(
const unsigned char * old_data,
unsigned char * new_data) __attribute__ ((warn_unused_result));
224 int deleteRecord(
const unsigned char * buf) __attribute__ ((warn_unused_result));
225 void ha_release_auto_increment();
227 void ha_start_bulk_insert(ha_rows rows);
228 int ha_end_bulk_insert();
229 int ha_delete_all_rows();
230 int ha_reset_auto_increment(uint64_t value);
233 int ha_disable_indexes(uint32_t mode);
234 int ha_enable_indexes(uint32_t mode);
235 int ha_discard_or_import_tablespace(
bool discard);
236 void closeMarkForDelete();
238 void adjust_next_insert_id_after_explicit_value(uint64_t nr);
239 int update_auto_increment();
242 virtual double scan_time(
void)
243 {
return static_cast<double>(stats.data_file_length) / IO_SIZE + 2; }
244 virtual double read_time(uint32_t, uint32_t ranges, ha_rows rows)
245 {
return ranges + rows; }
247 virtual double index_only_read_time(uint32_t keynr,
double records);
249 virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
250 void *seq_init_param,
251 uint32_t n_ranges, uint32_t *bufsz,
252 uint32_t *flags, optimizer::CostVector *cost);
253 virtual int multi_range_read_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys,
254 uint32_t *bufsz, uint32_t *flags, optimizer::CostVector *cost);
255 virtual int multi_range_read_init(RANGE_SEQ_IF *seq,
void *seq_init_param,
256 uint32_t n_ranges, uint32_t mode);
257 virtual int multi_range_read_next(
char **range_info);
260 virtual const key_map *keys_to_use_for_scanning();
261 bool has_transactions();
273 virtual bool is_fatal_error(
int error, uint32_t flags);
279 virtual ha_rows records();
280 virtual uint64_t tableSize();
281 virtual uint64_t rowSize();
289 {
return stats.records+EXTRA_RECORDS; }
291 virtual const char *index_type(uint32_t)
292 { assert(0);
return "";}
295 uint32_t get_index(
void)
const {
return active_index; }
296 virtual int close(
void)=0;
305 key_part_map keypart_map,
306 enum ha_rkey_function find_flag)
308 uint32_t key_len= calculate_key_len(active_index, keypart_map);
309 return index_read(buf, key, key_len, find_flag);
317 virtual int index_read_idx_map(
unsigned char * buf, uint32_t index,
318 const unsigned char * key,
319 key_part_map keypart_map,
320 enum ha_rkey_function find_flag);
321 virtual int index_next(
unsigned char *) __attribute__ ((warn_unused_result))
322 {
return HA_ERR_WRONG_COMMAND; }
323 virtual int index_prev(
unsigned char *)
324 {
return HA_ERR_WRONG_COMMAND; }
325 virtual int index_first(
unsigned char *)
326 {
return HA_ERR_WRONG_COMMAND; }
327 virtual int index_last(
unsigned char *)
328 {
return HA_ERR_WRONG_COMMAND; }
329 virtual int index_next_same(
unsigned char *,
const unsigned char *, uint32_t);
332 uint32_t calculate_key_len(uint32_t key_position, key_part_map keypart_map_arg);
341 key_part_map keypart_map)
343 uint32_t key_len= calculate_key_len(active_index, keypart_map);
344 return index_read_last(buf, key, key_len);
346 virtual int read_range_first(
const key_range *start_key,
348 bool eq_range,
bool sorted);
349 virtual int read_range_next();
351 virtual int rnd_next(
unsigned char *)=0;
352 virtual int rnd_pos(
unsigned char *,
unsigned char *)=0;
353 virtual int read_first_row(
unsigned char *buf, uint32_t primary_key);
354 virtual int rnd_same(
unsigned char *, uint32_t)
355 {
return HA_ERR_WRONG_COMMAND; }
356 virtual ha_rows records_in_range(uint32_t, key_range *, key_range *)
357 {
return (ha_rows) 10; }
358 virtual void position(
const unsigned char *record)=0;
359 virtual int info(uint32_t)=0;
360 virtual uint32_t calculate_key_hash_value(Field **)
361 { assert(0);
return 0; }
362 virtual int extra(
enum ha_extra_function)
364 virtual int extra_opt(
enum ha_extra_function operation, uint32_t)
365 {
return extra(operation); }
387 virtual void unlock_row(
void) {}
388 virtual void get_auto_increment(uint64_t offset, uint64_t increment,
389 uint64_t nb_desired_values,
390 uint64_t *first_value,
391 uint64_t *nb_reserved_values)= 0;
393 void set_next_insert_id(uint64_t
id)
409 next_insert_id= (prev_insert_id > 0) ? prev_insert_id :
410 insert_id_for_cur_row;
415 virtual int indexes_are_disabled(
void) {
return 0;}
416 virtual void append_create_info(String *)
437 virtual uint32_t referenced_by_foreign_key() {
return 0;}
438 virtual void free_foreign_key_create_info(
char *) {}
467 virtual bool primary_key_is_clustered() {
return false; }
468 virtual int cmp_ref(
const unsigned char *ref1,
const unsigned char *ref2)
470 return memcmp(ref1, ref2, ref_length);
473 virtual bool isOrdered(
void)
481 void ha_statistic_increment(uint64_t system_status_var::*offset)
const;
482 void **ha_data(Session *)
const;
486 inline void setTransactionReadWrite();
494 virtual int open(
const char *,
int , uint32_t ) { assert(0);
return -1; }
495 virtual int doOpen(
const identifier::Table &identifier,
int mode, uint32_t test_if_locked);
496 virtual int doStartIndexScan(uint32_t idx,
bool)
497 { active_index= idx;
return 0; }
498 virtual int doEndIndexScan() { active_index= MAX_KEY;
return 0; }
506 virtual int doStartTableScan(
bool scan) __attribute__ ((warn_unused_result)) = 0;
507 virtual int doEndTableScan() {
return 0; }
508 virtual int doInsertRecord(
unsigned char *)
510 return HA_ERR_WRONG_COMMAND;
513 virtual int doUpdateRecord(
const unsigned char *,
unsigned char *)
515 return HA_ERR_WRONG_COMMAND;
518 virtual int doDeleteRecord(
const unsigned char *)
520 return HA_ERR_WRONG_COMMAND;
555 virtual void release_auto_increment(
void) {
return; }
558 {
return HA_ADMIN_NOT_IMPLEMENTED; }
560 virtual void start_bulk_insert(ha_rows)
562 virtual int end_bulk_insert(
void) {
return 0; }
563 virtual int index_read(
unsigned char *,
const unsigned char *,
564 uint32_t,
enum ha_rkey_function)
565 {
return HA_ERR_WRONG_COMMAND; }
566 virtual int index_read_last(
unsigned char *,
const unsigned char *, uint32_t)
567 {
return (errno= HA_ERR_WRONG_COMMAND); }
575 {
return (errno=HA_ERR_WRONG_COMMAND); }
583 {
return HA_ERR_WRONG_COMMAND; }
586 {
return HA_ADMIN_NOT_IMPLEMENTED; }
588 virtual int disable_indexes(uint32_t)
589 {
return HA_ERR_WRONG_COMMAND; }
591 virtual int enable_indexes(uint32_t)
592 {
return HA_ERR_WRONG_COMMAND; }
594 virtual int discard_or_import_tablespace(
bool)
595 {
return (errno=HA_ERR_WRONG_COMMAND); }
603 virtual void drop_table();
606 extern const char *ha_row_type[];
611 SortField *make_unireg_sortorder(Order *order, uint32_t *length,
612 SortField *sortorder);
613 int setup_order(Session *session, Item **ref_pointer_array, TableList *tables,
614 List<Item> &fields, List <Item> &all_fields, Order *order);
615 int setup_group(Session *session, Item **ref_pointer_array, TableList *tables,
616 List<Item> &fields, List<Item> &all_fields, Order *order,
617 bool *hidden_group_fields);
618 bool fix_inner_refs(Session *session, List<Item> &all_fields, Select_Lex *select,
619 Item **ref_pointer_array);
621 bool handle_select(Session *session, LEX *lex, select_result *result,
622 uint64_t setup_tables_done_option);
625 bool handle_derived(LEX *lex,
bool (*processor)(Session *session,
628 bool derived_prepare(Session *session, LEX *lex, TableList *t);
629 bool derived_filling(Session *session, LEX *lex, TableList *t);
630 int prepare_create_field(CreateField *sql_field,
631 uint32_t *blob_columns,
632 int *timestamps,
int *timestamps_with_niladic);
634 bool create_table(Session *session,
635 const identifier::Table &identifier,
636 HA_CREATE_INFO *create_info,
637 message::Table &table_proto,
638 AlterInfo *alter_info,
639 bool tmp_table, uint32_t select_field_count,
640 bool is_if_not_exists);
642 bool create_table_no_lock(Session *session,
643 const identifier::Table &identifier,
644 HA_CREATE_INFO *create_info,
645 message::Table &table_proto,
646 AlterInfo *alter_info,
647 bool tmp_table, uint32_t select_field_count,
648 bool is_if_not_exists);
650 bool create_like_table(Session* session,
651 const identifier::Table& destination_identifier,
652 const identifier::Table& source_identifier,
653 message::Table &create_table_proto,
654 bool is_if_not_exists,
657 bool rename_table(Session &session,
658 plugin::StorageEngine *base,
659 const identifier::Table &old_identifier,
660 const identifier::Table &new_identifier);
662 bool prepare_update(Session *session, TableList *table_list,
663 Item **conds, uint32_t order_num, Order *order);
664 int update_query(Session *session,TableList *tables,List<Item> &fields,
665 List<Item> &values,COND *conds,
666 uint32_t order_num, Order *order, ha_rows limit,
667 enum enum_duplicates handle_duplicates,
bool ignore);
668 bool prepare_insert(Session *session, TableList *table_list, Table *table,
669 List<Item> &fields, List_item *values,
670 List<Item> &update_fields,
671 List<Item> &update_values, enum_duplicates duplic,
672 COND **where,
bool select_insert,
673 bool check_fields,
bool abort_on_warning);
674 bool insert_query(Session *session,TableList *table,List<Item> &fields,
675 List<List_item> &values, List<Item> &update_fields,
676 List<Item> &update_values, enum_duplicates flag,
678 int check_that_all_fields_are_given_values(Session *session, Table *entry,
679 TableList *table_list);
680 int prepare_delete(Session *session, TableList *table_list, Item **conds);
681 bool delete_query(Session *session, TableList *table_list, COND *conds,
682 SQL_LIST *order, ha_rows rows, uint64_t options,
683 bool reset_auto_increment);
684 bool truncate(Session& session, TableList *table_list);
685 TableShare *get_table_share(Session *session, TableList *table_list,
char *key,
686 uint32_t key_length, uint32_t db_flags,
int *error);
687 TableShare *get_cached_table_share(
const char *db,
const char *table_name);
688 bool reopen_name_locked_table(Session* session, TableList* table_list,
bool link_in);
689 bool reopen_tables(Session *session,
bool get_locks,
bool in_refresh);
690 void close_handle_and_leave_table_as_lock(Table *table);
691 bool wait_for_tables(Session *session);
692 bool table_is_used(Table *table,
bool wait_for_name_lock);
695 extern Field *not_found_field;
696 extern Field *view_ref_found;
699 find_field_in_tables(Session *session, Item_ident *item,
700 TableList *first_table, TableList *last_table,
701 Item **ref, find_item_error_report_type report_error,
702 bool register_tree_change);
704 find_field_in_table_ref(Session *session, TableList *table_list,
705 const char *name, uint32_t length,
706 const char *item_name,
const char *db_name,
707 const char *table_name, Item **ref,
709 uint32_t *cached_field_index_ptr,
710 bool register_tree_change, TableList **actual_table);
712 find_field_in_table(Session *session, Table *table,
const char *name, uint32_t length,
713 bool allow_rowid, uint32_t *cached_field_index_ptr);
void ha_init_errors(void)
Discrete_interval auto_inc_interval_for_cur_row
KEY_MULTI_RANGE mrr_cur_range
virtual int reset_auto_increment(uint64_t)
virtual int external_lock(Session *, int)
TODO: Rename this file - func.h is stupid.
bool delete_query(Session *session, TableList *table_list, COND *conds, SQL_LIST *order, ha_rows rows, uint64_t options, bool reset_auto_increment)
virtual int delete_all_rows(void)
virtual bool was_semi_consistent_read()
virtual int get_foreign_key_list(Session *, List< ForeignKeyInfo > *)
virtual int check(Session *)
virtual bool can_switch_engines(void)
uint64_t prev_insert_id(uint64_t nr, drizzle_system_variables *variables)
virtual ha_rows estimate_rows_upper_bound()
Visibility Control Macros.
bool insert_query(Session *session, TableList *table, List< Item > &fields, List< List_item > &values, List< Item > &update_fields, List< Item > &update_values, enum_duplicates flag, bool ignore)
int update_query(Session *session, TableList *tables, List< Item > &fields, List< Item > &values, COND *conds, uint32_t order_num, Order *order, ha_rows limit, enum enum_duplicates handle_duplicates, bool ignore)
bool handle_select(Session *session, LEX *lex, select_result *result, uint64_t setup_tables_done_option)
int setup_group(Session *session, Item **ref_pointer_array, TableList *tables, List< Item > &fields, List< Item > &all_fields, Order *order, bool *hidden_group_fields)
uint64_t getAutoIncrement() const
virtual char * get_foreign_key_create_info(void)
int setup_order(Session *session, Item **ref_pointer_array, TableList *tables, List< Item > &fields, List< Item > &all_fields, Order *order)
virtual int index_read_map(unsigned char *buf, const unsigned char *key, key_part_map keypart_map, enum ha_rkey_function find_flag)
Positions an index cursor to the index specified in the handle. Fetches the row if available...
uint64_t insert_id_for_cur_row
void free_underlaid_joins(Session *session, Select_Lex *select)
virtual void try_semi_consistent_read(bool)
virtual int index_read_last_map(unsigned char *buf, const unsigned char *key, key_part_map keypart_map)
The following functions works like index_read, but it find the last row with the current key value or...
virtual THR_LOCK_DATA ** store_lock(Session *, THR_LOCK_DATA **to, enum thr_lock_type)