39
38
#include <drizzled/message/table.pb.h>
40
/* Bits to show what an alter table will do */
41
#include <drizzled/sql_bitmap.h>
43
#include <drizzled/cursor.h>
42
46
#include <algorithm>
47
48
#define HA_MAX_ALTER_FLAGS 40
49
51
typedef std::bitset<HA_MAX_ALTER_FLAGS> HA_ALTER_FLAGS;
51
53
extern uint64_t refresh_version; /* Increments on each reload */
56
typedef bool (*qc_engine_callback)(Session *session, char *table_key,
58
uint64_t *engine_data);
61
/* The Cursor for a table type. Will be included in the Table structure */
56
66
class Select_Lex_Unit;
67
struct st_foreign_key_info;
68
typedef struct st_foreign_key_info FOREIGN_KEY_INFO;
72
struct st_table_log_memory_entry;
143
161
If a blob column has NULL value, then its length and blob data pointer
144
162
must be set to 0.
165
class Cursor :public Sql_alloc
148
Table &table; /* The current open table */
149
plugin::StorageEngine &engine; /* storage engine of this Cursor */
168
TableShare *table_share; /* The table definition */
169
Table *table; /* The current open table */
152
171
ha_rows estimation_rows_to_insert;
155
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
173
drizzled::plugin::StorageEngine *engine; /* storage engine of this Cursor */
174
inline drizzled::plugin::StorageEngine *getEngine() const /* table_type for handler */
159
178
unsigned char *ref; /* Pointer to current row */
160
179
unsigned char *dup_ref; /* Pointer to duplicate row */
162
TableShare *getShare();
164
Table *getTable() const
169
181
ha_statistics stats;
170
182
/** MultiRangeRead-related members: */
171
183
range_seq_t mrr_iter; /* Interator to traverse the range sequence */
172
184
RANGE_SEQ_IF mrr_funcs; /* Range sequence traversal functions */
185
HANDLER_BUFFER *multi_range_buffer; /* MRR buffer info */
174
186
uint32_t ranges_in_seq; /* Total number of ranges in the traversed sequence */
175
187
/* true <=> source MRR ranges and the output are ordered */
176
188
bool mrr_is_output_sorted;
225
238
Discrete_interval auto_inc_interval_for_cur_row;
227
Cursor(plugin::StorageEngine &engine_arg, Table &share_arg);
240
Cursor(drizzled::plugin::StorageEngine &engine_arg, TableShare &share_arg)
241
:table_share(&share_arg), table(0),
242
estimation_rows_to_insert(0), engine(&engine_arg),
243
ref(0), in_range_check_pushed_down(false),
244
key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
245
ref_length(sizeof(my_off_t)),
247
locked(false), implicit_emptied(0),
248
next_insert_id(0), insert_id_for_cur_row(0)
228
250
virtual ~Cursor(void);
229
virtual Cursor *clone(memory::Root *mem_root);
251
virtual Cursor *clone(MEM_ROOT *mem_root);
231
253
/* ha_ methods: pubilc wrappers for private virtual API */
233
int ha_open(const TableIdentifier &identifier, int mode, int test_if_locked);
234
int startIndexScan(uint32_t idx, bool sorted);
236
int startTableScan(bool scan);
255
int ha_open(Table *table, const char *name, int mode, int test_if_locked);
256
int ha_index_init(uint32_t idx, bool sorted);
258
int ha_rnd_init(bool scan);
240
262
/* this is necessary in many places, e.g. in HANDLER command */
244
266
These functions represent the public interface to *users* of the
245
267
Cursor class, hence they are *not* virtual. For the inheritance
246
interface, see the (private) functions doInsertRecord(), doUpdateRecord(),
247
and doDeleteRecord() below.
268
interface, see the (private) functions write_row(), update_row(),
269
and delete_row() below.
249
271
int ha_external_lock(Session *session, int lock_type);
250
int insertRecord(unsigned char * buf);
251
int updateRecord(const unsigned char * old_data, unsigned char * new_data);
252
int deleteRecord(const unsigned char * buf);
272
int ha_write_row(unsigned char * buf);
273
int ha_update_row(const unsigned char * old_data, unsigned char * new_data);
274
int ha_delete_row(const unsigned char * buf);
253
275
void ha_release_auto_increment();
255
277
/** to be actually called to get 'check()' functionality*/
280
303
virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
281
304
void *seq_init_param,
282
305
uint32_t n_ranges, uint32_t *bufsz,
283
uint32_t *flags, optimizer::CostVector *cost);
306
uint32_t *flags, COST_VECT *cost);
284
307
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);
308
uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
286
309
virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
287
uint32_t n_ranges, uint32_t mode);
310
uint32_t n_ranges, uint32_t mode,
311
HANDLER_BUFFER *buf);
288
312
virtual int multi_range_read_next(char **range_info);
332
360
row if available. If the key value is null, begin at the first key of the
335
virtual int index_read_map(unsigned char * buf, const unsigned char *key,
363
virtual int index_read_map(unsigned char * buf, const unsigned char * key,
336
364
key_part_map keypart_map,
337
365
enum ha_rkey_function find_flag)
339
uint32_t key_len= calculate_key_len(active_index, keypart_map);
367
uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
340
368
return index_read(buf, key, key_len, find_flag);
379
402
bool eq_range, bool sorted);
380
403
virtual int read_range_next();
381
404
int compare_key(key_range *range);
405
int compare_key2(key_range *range);
382
406
virtual int rnd_next(unsigned char *)=0;
383
407
virtual int rnd_pos(unsigned char *, unsigned char *)=0;
409
One has to use this method when to find
410
random position by record as the plain
411
position() call doesn't work for some
412
handlers for random position.
414
virtual int rnd_pos_by_record(unsigned char *record);
384
415
virtual int read_first_row(unsigned char *buf, uint32_t primary_key);
417
The following function is only needed for tables that may be temporary
420
virtual int restart_rnd_next(unsigned char *, unsigned char *)
421
{ return HA_ERR_WRONG_COMMAND; }
385
422
virtual int rnd_same(unsigned char *, uint32_t)
386
423
{ return HA_ERR_WRONG_COMMAND; }
387
424
virtual ha_rows records_in_range(uint32_t, key_range *, key_range *)
464
504
virtual bool can_switch_engines(void) { return true; }
465
505
/** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
466
virtual int get_foreign_key_list(Session *, List<ForeignKeyInfo> *)
506
virtual int get_foreign_key_list(Session *, List<FOREIGN_KEY_INFO> *)
468
508
virtual uint32_t referenced_by_foreign_key() { return 0;}
469
509
virtual void free_foreign_key_create_info(char *) {}
510
/** The following can be called without an open Cursor */
512
virtual int add_index(Table *, KEY *, uint32_t)
513
{ return (HA_ERR_WRONG_COMMAND); }
514
virtual int prepare_drop_index(Table *, uint32_t *, uint32_t)
515
{ return (HA_ERR_WRONG_COMMAND); }
516
virtual int final_drop_index(Table *)
517
{ return (HA_ERR_WRONG_COMMAND); }
519
virtual uint32_t checksum(void) const { return 0; }
472
522
Is not invoked for non-transactional temporary tables.
522
573
the corresponding 'ha_*' method above.
525
virtual int open(const char *, int , uint32_t ) { assert(0); return -1; }
526
virtual int doOpen(const TableIdentifier &identifier, int mode, uint32_t test_if_locked);
527
virtual int doStartIndexScan(uint32_t idx, bool)
576
virtual int open(const char *name, int mode, uint32_t test_if_locked)=0;
577
virtual int index_init(uint32_t idx, bool)
528
578
{ active_index= idx; return 0; }
529
virtual int doEndIndexScan() { active_index= MAX_KEY; return 0; }
579
virtual int index_end() { active_index= MAX_KEY; return 0; }
531
doStartTableScan() can be called two times without doEndTableScan() in between
581
rnd_init() can be called two times without rnd_end() in between
532
582
(it only makes sense if scan=1).
533
583
then the second call should prepare for the new table scan (e.g
534
584
if rnd_init allocates the cursor, second call should position it
535
585
to the start of the table, no need to deallocate and allocate it again
537
virtual int doStartTableScan(bool scan)= 0;
538
virtual int doEndTableScan() { return 0; }
539
virtual int doInsertRecord(unsigned char *)
541
return HA_ERR_WRONG_COMMAND;
544
virtual int doUpdateRecord(const unsigned char *, unsigned char *)
546
return HA_ERR_WRONG_COMMAND;
549
virtual int doDeleteRecord(const unsigned char *)
587
virtual int rnd_init(bool scan)= 0;
588
virtual int rnd_end() { return 0; }
589
virtual int write_row(unsigned char *)
591
return HA_ERR_WRONG_COMMAND;
594
virtual int update_row(const unsigned char *, unsigned char *)
596
return HA_ERR_WRONG_COMMAND;
599
virtual int delete_row(const unsigned char *)
551
601
return HA_ERR_WRONG_COMMAND;
637
687
extern const char *ha_row_type[];
688
extern const char *tx_isolation_names[];
689
extern const char *binlog_format_names[];
690
extern TYPELIB tx_isolation_typelib;
691
extern uint32_t total_ha, total_ha_2pc;
693
/* Wrapper functions */
694
#define ha_commit(session) (ha_commit_trans((session), true))
695
#define ha_rollback(session) (ha_rollback_trans((session), true))
639
697
/* basic stuff */
640
void ha_init_errors(void);
643
SortField *make_unireg_sortorder(Order *order, uint32_t *length,
644
SortField *sortorder);
698
int ha_init_errors(void);
702
/* transactions: interface to plugin::StorageEngine functions */
703
int ha_commit_one_phase(Session *session, bool all);
704
int ha_rollback_trans(Session *session, bool all);
706
/* transactions: these functions never call plugin::StorageEngine functions directly */
707
int ha_commit_trans(Session *session, bool all);
708
int ha_autocommit_or_rollback(Session *session, int error);
709
int ha_enable_transaction(Session *session, bool on);
712
int ha_rollback_to_savepoint(Session *session, SAVEPOINT *sv);
713
int ha_savepoint(Session *session, SAVEPOINT *sv);
714
int ha_release_savepoint(Session *session, SAVEPOINT *sv);
716
/* these are called by storage engines */
717
void trans_register_ha(Session *session, bool all, drizzled::plugin::StorageEngine *engine);
719
uint32_t filename_to_tablename(const char *from, char *to, uint32_t to_length);
720
bool tablename_to_filename(const char *from, char *to, size_t to_length);
724
Storage engine has to assume the transaction will end up with 2pc if
725
- there is more than one 2pc-capable storage engine available
726
- in the current transaction 2pc was not disabled yet
728
#define trans_need_2pc(session, all) ((total_ha_2pc > 1) && \
729
!((all ? &session->transaction.all : &session->transaction.stmt)->no_2pc))
732
bool mysql_xa_recover(Session *session);
734
SORT_FIELD * make_unireg_sortorder(order_st *order, uint32_t *length,
735
SORT_FIELD *sortorder);
645
736
int setup_order(Session *session, Item **ref_pointer_array, TableList *tables,
646
List<Item> &fields, List <Item> &all_fields, Order *order);
737
List<Item> &fields, List <Item> &all_fields, order_st *order);
647
738
int setup_group(Session *session, Item **ref_pointer_array, TableList *tables,
648
List<Item> &fields, List<Item> &all_fields, Order *order,
739
List<Item> &fields, List<Item> &all_fields, order_st *order,
649
740
bool *hidden_group_fields);
650
741
bool fix_inner_refs(Session *session, List<Item> &all_fields, Select_Lex *select,
651
742
Item **ref_pointer_array);
653
744
bool handle_select(Session *session, LEX *lex, select_result *result,
654
745
uint64_t setup_tables_done_option);
746
bool mysql_select(Session *session, Item ***rref_pointer_array,
747
TableList *tables, uint32_t wild_num, List<Item> &list,
748
COND *conds, uint32_t og_num, order_st *order, order_st *group,
749
Item *having, uint64_t select_type,
750
select_result *result, Select_Lex_Unit *unit,
751
Select_Lex *select_lex);
655
752
void free_underlaid_joins(Session *session, Select_Lex *select);
753
bool mysql_explain_union(Session *session, Select_Lex_Unit *unit,
754
select_result *result);
755
int mysql_explain_select(Session *session, Select_Lex *sl, char const *type,
756
select_result *result);
657
758
bool mysql_handle_derived(LEX *lex, bool (*processor)(Session *session,
664
765
int *timestamps, int *timestamps_with_niladic);
666
767
bool mysql_create_table(Session *session,
667
const TableIdentifier &identifier,
768
drizzled::TableIdentifier &identifier,
668
769
HA_CREATE_INFO *create_info,
669
message::Table &table_proto,
770
drizzled::message::Table *table_proto,
670
771
AlterInfo *alter_info,
671
772
bool tmp_table, uint32_t select_field_count,
672
773
bool is_if_not_exists);
674
775
bool mysql_create_table_no_lock(Session *session,
675
const TableIdentifier &identifier,
776
drizzled::TableIdentifier &identifier,
676
777
HA_CREATE_INFO *create_info,
677
message::Table &table_proto,
778
drizzled::message::Table *table_proto,
678
779
AlterInfo *alter_info,
679
bool tmp_table, uint32_t select_field_count,
781
uint32_t select_field_count,
680
782
bool is_if_not_exists);
682
bool mysql_create_like_table(Session* session,
683
const TableIdentifier &destination_identifier,
684
TableList* table, TableList* src_table,
685
message::Table &create_table_proto,
784
bool mysql_create_like_table(Session* session, TableList* table, TableList* src_table,
785
drizzled::message::Table& create_table_proto,
786
drizzled::plugin::StorageEngine*,
686
787
bool is_if_not_exists,
687
788
bool is_engine_set);
689
bool mysql_rename_table(Session &session,
690
plugin::StorageEngine *base,
691
const TableIdentifier &old_identifier,
692
const TableIdentifier &new_identifier);
790
bool mysql_rename_table(drizzled::plugin::StorageEngine *base, const char *old_db,
791
const char * old_name, const char *new_db,
792
const char * new_name, uint32_t flags);
694
794
bool mysql_prepare_update(Session *session, TableList *table_list,
695
Item **conds, uint32_t order_num, Order *order);
795
Item **conds, uint32_t order_num, order_st *order);
696
796
int mysql_update(Session *session,TableList *tables,List<Item> &fields,
697
797
List<Item> &values,COND *conds,
698
uint32_t order_num, Order *order, ha_rows limit,
798
uint32_t order_num, order_st *order, ha_rows limit,
699
799
enum enum_duplicates handle_duplicates, bool ignore);
700
800
bool mysql_prepare_insert(Session *session, TableList *table_list, Table *table,
701
801
List<Item> &fields, List_item *values,
718
818
uint32_t key_length, uint32_t db_flags, int *error);
719
819
TableShare *get_cached_table_share(const char *db, const char *table_name);
720
820
bool reopen_name_locked_table(Session* session, TableList* table_list, bool link_in);
821
Table *table_cache_insert_placeholder(Session *session, const char *key,
822
uint32_t key_length);
823
bool lock_table_name_if_not_cached(Session *session, const char *db,
824
const char *table_name, Table **table);
825
bool reopen_table(Table *table);
721
826
bool reopen_tables(Session *session,bool get_locks,bool in_refresh);
827
void close_data_files_and_morph_locks(Session *session, const char *db,
828
const char *table_name);
722
829
void close_handle_and_leave_table_as_lock(Table *table);
723
830
bool wait_for_tables(Session *session);
724
831
bool table_is_used(Table *table, bool wait_for_name_lock);
725
Table *drop_locked_tables(Session *session, const drizzled::TableIdentifier &identifier);
726
void abort_locked_tables(Session *session, const drizzled::TableIdentifier &identifier);
832
Table *drop_locked_tables(Session *session,const char *db, const char *table_name);
833
void abort_locked_tables(Session *session,const char *db, const char *table_name);
727
834
extern Field *not_found_field;
728
835
extern Field *view_ref_found;