23
23
#include <drizzled/xid.h>
24
24
#include <drizzled/discrete_interval.h>
25
#include <drizzled/identifier.h>
26
#include <drizzled/definitions.h>
27
#include <drizzled/key_map.h>
25
#include <drizzled/table_identifier.h>
29
27
/* Definitions for parameters to do with Cursor-routines */
47
50
#define HA_MAX_ALTER_FLAGS 40
49
53
typedef std::bitset<HA_MAX_ALTER_FLAGS> HA_ALTER_FLAGS;
51
55
extern uint64_t refresh_version; /* Increments on each reload */
58
typedef bool (*qc_engine_callback)(Session *session, char *table_key,
60
uint64_t *engine_data);
63
/* The Cursor for a table type. Will be included in the Table structure */
56
68
class Select_Lex_Unit;
69
struct st_foreign_key_info;
70
typedef struct st_foreign_key_info FOREIGN_KEY_INFO;
74
struct st_table_log_memory_entry;
136
149
present, its length is one byte <not-sure> which must be set to 0xFF
137
150
at all times. </not-sure>
152
If the table has columns of type BIT, then certain bits from those columns
153
may be stored in null_bytes as well. Grep around for Field_bit for
139
156
For blob columns (see Field_blob), the record buffer stores length of the
140
157
data, following by memory pointer to the blob data. The pointer is owned
141
158
by the storage engine and is valid until the next operation.
143
160
If a blob column has NULL value, then its length and blob data pointer
144
161
must be set to 0.
164
class Cursor :public memory::SqlAlloc
148
Table &table; /* The current open table */
149
plugin::StorageEngine &engine; /* storage engine of this Cursor */
167
TableShare *table_share; /* The table definition */
168
Table *table; /* The current open table */
152
170
ha_rows estimation_rows_to_insert;
172
plugin::StorageEngine *engine; /* storage engine of this Cursor */
155
173
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
159
177
unsigned char *ref; /* Pointer to current row */
160
178
unsigned char *dup_ref; /* Pointer to duplicate row */
162
TableShare *getShare();
164
Table *getTable() const
169
180
ha_statistics stats;
170
181
/** MultiRangeRead-related members: */
171
182
range_seq_t mrr_iter; /* Interator to traverse the range sequence */
172
183
RANGE_SEQ_IF mrr_funcs; /* Range sequence traversal functions */
184
HANDLER_BUFFER *multi_range_buffer; /* MRR buffer info */
174
185
uint32_t ranges_in_seq; /* Total number of ranges in the traversed sequence */
175
186
/* true <=> source MRR ranges and the output are ordered */
176
187
bool mrr_is_output_sorted;
179
190
bool mrr_have_range;
194
true <=> the engine guarantees that returned records are within the range
197
bool in_range_check_pushed_down;
183
199
/** Current range (the one we're now returning rows from) */
184
200
KEY_MULTI_RANGE mrr_cur_range;
186
202
/** The following are for read_range() */
187
203
key_range save_end_range, *end_range;
188
KeyPartInfo *range_key_part;
204
KEY_PART_INFO *range_key_part;
189
205
int key_compare_result_on_equal;
191
207
uint32_t errkey; /* Last dup key */
225
242
Discrete_interval auto_inc_interval_for_cur_row;
227
Cursor(plugin::StorageEngine &engine_arg, Table &share_arg);
244
Cursor(plugin::StorageEngine &engine_arg, TableShare &share_arg);
228
245
virtual ~Cursor(void);
229
246
virtual Cursor *clone(memory::Root *mem_root);
231
248
/* 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);
250
int ha_open(Table *table, const char *name, int mode, int test_if_locked);
251
int ha_index_init(uint32_t idx, bool sorted);
253
int ha_rnd_init(bool scan);
240
257
/* this is necessary in many places, e.g. in HANDLER command */
244
261
These functions represent the public interface to *users* of the
245
262
Cursor class, hence they are *not* virtual. For the inheritance
246
interface, see the (private) functions doInsertRecord(), doUpdateRecord(),
247
and doDeleteRecord() below.
263
interface, see the (private) functions write_row(), update_row(),
264
and delete_row() below.
249
266
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);
267
int ha_write_row(unsigned char * buf);
268
int ha_update_row(const unsigned char * old_data, unsigned char * new_data);
269
int ha_delete_row(const unsigned char * buf);
253
270
void ha_release_auto_increment();
255
272
/** to be actually called to get 'check()' functionality*/
280
298
virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
281
299
void *seq_init_param,
282
300
uint32_t n_ranges, uint32_t *bufsz,
283
uint32_t *flags, optimizer::CostVector *cost);
301
uint32_t *flags, COST_VECT *cost);
284
302
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);
303
uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
286
304
virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
287
uint32_t n_ranges, uint32_t mode);
305
uint32_t n_ranges, uint32_t mode,
306
HANDLER_BUFFER *buf);
288
307
virtual int multi_range_read_next(char **range_info);
319
338
virtual ha_rows estimate_rows_upper_bound()
320
339
{ return stats.records+EXTRA_RECORDS; }
342
Get the row type from the storage engine. If this method returns
343
ROW_TYPE_NOT_USED, the information in HA_CREATE_INFO should be used.
345
virtual enum row_type get_row_type() const { return ROW_TYPE_NOT_USED; }
322
347
virtual const char *index_type(uint32_t)
323
348
{ assert(0); return "";}
332
357
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,
360
virtual int index_read_map(unsigned char * buf, const unsigned char * key,
336
361
key_part_map keypart_map,
337
362
enum ha_rkey_function find_flag)
339
uint32_t key_len= calculate_key_len(active_index, keypart_map);
364
uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
340
365
return index_read(buf, key, key_len, find_flag);
358
383
virtual int index_last(unsigned char *)
359
384
{ return HA_ERR_WRONG_COMMAND; }
360
385
virtual int index_next_same(unsigned char *, const unsigned char *, uint32_t);
363
uint32_t calculate_key_len(uint32_t key_position, key_part_map keypart_map_arg);
368
388
The following functions works like index_read, but it find the last
371
391
virtual int index_read_last_map(unsigned char * buf, const unsigned char * key,
372
392
key_part_map keypart_map)
374
uint32_t key_len= calculate_key_len(active_index, keypart_map);
394
uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
375
395
return index_read_last(buf, key, key_len);
377
397
virtual int read_range_first(const key_range *start_key,
379
399
bool eq_range, bool sorted);
380
400
virtual int read_range_next();
381
401
int compare_key(key_range *range);
402
int compare_key2(key_range *range);
382
403
virtual int rnd_next(unsigned char *)=0;
383
404
virtual int rnd_pos(unsigned char *, unsigned char *)=0;
406
One has to use this method when to find
407
random position by record as the plain
408
position() call doesn't work for some
409
handlers for random position.
411
virtual int rnd_pos_by_record(unsigned char *record);
384
412
virtual int read_first_row(unsigned char *buf, uint32_t primary_key);
414
The following function is only needed for tables that may be temporary
417
virtual int restart_rnd_next(unsigned char *, unsigned char *)
418
{ return HA_ERR_WRONG_COMMAND; }
385
419
virtual int rnd_same(unsigned char *, uint32_t)
386
420
{ return HA_ERR_WRONG_COMMAND; }
387
421
virtual ha_rows records_in_range(uint32_t, key_range *, key_range *)
464
499
virtual bool can_switch_engines(void) { return true; }
465
500
/** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
466
virtual int get_foreign_key_list(Session *, List<ForeignKeyInfo> *)
501
virtual int get_foreign_key_list(Session *, List<FOREIGN_KEY_INFO> *)
468
503
virtual uint32_t referenced_by_foreign_key() { return 0;}
469
504
virtual void free_foreign_key_create_info(char *) {}
505
/** The following can be called without an open Cursor */
507
virtual int add_index(Table *, KEY *, uint32_t)
508
{ return (HA_ERR_WRONG_COMMAND); }
509
virtual int prepare_drop_index(Table *, uint32_t *, uint32_t)
510
{ return (HA_ERR_WRONG_COMMAND); }
511
virtual int final_drop_index(Table *)
512
{ return (HA_ERR_WRONG_COMMAND); }
514
virtual uint32_t checksum(void) const { return 0; }
472
517
Is not invoked for non-transactional temporary tables.
522
568
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)
571
virtual int open(const char *name, int mode, uint32_t test_if_locked)=0;
572
virtual int index_init(uint32_t idx, bool)
528
573
{ active_index= idx; return 0; }
529
virtual int doEndIndexScan() { active_index= MAX_KEY; return 0; }
574
virtual int index_end() { active_index= MAX_KEY; return 0; }
531
doStartTableScan() can be called two times without doEndTableScan() in between
576
rnd_init() can be called two times without rnd_end() in between
532
577
(it only makes sense if scan=1).
533
578
then the second call should prepare for the new table scan (e.g
534
579
if rnd_init allocates the cursor, second call should position it
535
580
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 *)
582
virtual int rnd_init(bool scan)= 0;
583
virtual int rnd_end() { return 0; }
584
virtual int write_row(unsigned char *)
586
return HA_ERR_WRONG_COMMAND;
589
virtual int update_row(const unsigned char *, unsigned char *)
591
return HA_ERR_WRONG_COMMAND;
594
virtual int delete_row(const unsigned char *)
551
596
return HA_ERR_WRONG_COMMAND;
639
684
/* basic stuff */
640
685
void ha_init_errors(void);
643
SortField *make_unireg_sortorder(Order *order, uint32_t *length,
644
SortField *sortorder);
687
SORT_FIELD * make_unireg_sortorder(order_st *order, uint32_t *length,
688
SORT_FIELD *sortorder);
645
689
int setup_order(Session *session, Item **ref_pointer_array, TableList *tables,
646
List<Item> &fields, List <Item> &all_fields, Order *order);
690
List<Item> &fields, List <Item> &all_fields, order_st *order);
647
691
int setup_group(Session *session, Item **ref_pointer_array, TableList *tables,
648
List<Item> &fields, List<Item> &all_fields, Order *order,
692
List<Item> &fields, List<Item> &all_fields, order_st *order,
649
693
bool *hidden_group_fields);
650
694
bool fix_inner_refs(Session *session, List<Item> &all_fields, Select_Lex *select,
651
695
Item **ref_pointer_array);
664
708
int *timestamps, int *timestamps_with_niladic);
666
710
bool mysql_create_table(Session *session,
667
const TableIdentifier &identifier,
711
TableIdentifier &identifier,
668
712
HA_CREATE_INFO *create_info,
669
713
message::Table &table_proto,
670
714
AlterInfo *alter_info,
672
716
bool is_if_not_exists);
674
718
bool mysql_create_table_no_lock(Session *session,
675
const TableIdentifier &identifier,
719
TableIdentifier &identifier,
676
720
HA_CREATE_INFO *create_info,
677
721
message::Table &table_proto,
678
722
AlterInfo *alter_info,
679
bool tmp_table, uint32_t select_field_count,
724
uint32_t select_field_count,
680
725
bool is_if_not_exists);
682
727
bool mysql_create_like_table(Session* session,
683
const TableIdentifier &destination_identifier,
728
TableIdentifier &destination_identifier,
684
729
TableList* table, TableList* src_table,
685
730
message::Table &create_table_proto,
686
731
bool is_if_not_exists,
687
732
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);
734
bool mysql_rename_table(plugin::StorageEngine *base, const char *old_db,
735
const char * old_name, const char *new_db,
736
const char * new_name, uint32_t flags);
694
738
bool mysql_prepare_update(Session *session, TableList *table_list,
695
Item **conds, uint32_t order_num, Order *order);
739
Item **conds, uint32_t order_num, order_st *order);
696
740
int mysql_update(Session *session,TableList *tables,List<Item> &fields,
697
741
List<Item> &values,COND *conds,
698
uint32_t order_num, Order *order, ha_rows limit,
742
uint32_t order_num, order_st *order, ha_rows limit,
699
743
enum enum_duplicates handle_duplicates, bool ignore);
700
744
bool mysql_prepare_insert(Session *session, TableList *table_list, Table *table,
701
745
List<Item> &fields, List_item *values,
718
762
uint32_t key_length, uint32_t db_flags, int *error);
719
763
TableShare *get_cached_table_share(const char *db, const char *table_name);
720
764
bool reopen_name_locked_table(Session* session, TableList* table_list, bool link_in);
765
Table *table_cache_insert_placeholder(Session *session, const char *key,
766
uint32_t key_length);
767
bool lock_table_name_if_not_cached(Session *session, const char *db,
768
const char *table_name, Table **table);
769
bool reopen_table(Table *table);
721
770
bool reopen_tables(Session *session,bool get_locks,bool in_refresh);
771
void close_data_files_and_morph_locks(Session *session, const char *db,
772
const char *table_name);
722
773
void close_handle_and_leave_table_as_lock(Table *table);
723
774
bool wait_for_tables(Session *session);
724
775
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);
776
Table *drop_locked_tables(Session *session,const char *db, const char *table_name);
777
void abort_locked_tables(Session *session,const char *db, const char *table_name);
727
778
extern Field *not_found_field;
728
779
extern Field *view_ref_found;