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 Sql_alloc
148
Table &table; /* The current open table */
149
plugin::StorageEngine &engine; /* storage engine of this Cursor */
167
typedef uint64_t Table_flags;
170
TableShare *table_share; /* The table definition */
171
Table *table; /* The current open table */
172
Table_flags cached_table_flags; /* Set on init() and open() */
152
174
ha_rows estimation_rows_to_insert;
155
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
159
unsigned char *ref; /* Pointer to current row */
176
drizzled::plugin::StorageEngine *engine; /* storage engine of this Cursor */
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;
225
237
Discrete_interval auto_inc_interval_for_cur_row;
227
Cursor(plugin::StorageEngine &engine_arg, Table &share_arg);
239
Cursor(drizzled::plugin::StorageEngine *engine_arg, TableShare *share_arg)
240
:table_share(share_arg), table(0),
241
estimation_rows_to_insert(0), engine(engine_arg),
242
ref(0), in_range_check_pushed_down(false),
243
key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
244
ref_length(sizeof(my_off_t)),
246
locked(false), implicit_emptied(0),
247
next_insert_id(0), insert_id_for_cur_row(0)
228
249
virtual ~Cursor(void);
229
virtual Cursor *clone(memory::Root *mem_root);
250
virtual Cursor *clone(MEM_ROOT *mem_root);
251
/** This is called after create to allow us to set up cached variables */
254
cached_table_flags= table_flags();
231
257
/* 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);
259
int ha_open(Table *table, const char *name, int mode, int test_if_locked);
260
int ha_index_init(uint32_t idx, bool sorted);
262
int ha_rnd_init(bool scan);
240
266
/* this is necessary in many places, e.g. in HANDLER command */
241
267
int ha_index_or_rnd_end();
268
Table_flags ha_table_flags() const;
244
271
These functions represent the public interface to *users* of the
245
272
Cursor class, hence they are *not* virtual. For the inheritance
246
interface, see the (private) functions doInsertRecord(), doUpdateRecord(),
247
and doDeleteRecord() below.
273
interface, see the (private) functions write_row(), update_row(),
274
and delete_row() below.
249
276
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);
277
int ha_write_row(unsigned char * buf);
278
int ha_update_row(const unsigned char * old_data, unsigned char * new_data);
279
int ha_delete_row(const unsigned char * buf);
253
280
void ha_release_auto_increment();
255
282
/** to be actually called to get 'check()' functionality*/
280
315
virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
281
316
void *seq_init_param,
282
317
uint32_t n_ranges, uint32_t *bufsz,
283
uint32_t *flags, optimizer::CostVector *cost);
318
uint32_t *flags, COST_VECT *cost);
284
319
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);
320
uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
286
321
virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
287
uint32_t n_ranges, uint32_t mode);
322
uint32_t n_ranges, uint32_t mode,
323
HANDLER_BUFFER *buf);
288
324
virtual int multi_range_read_next(char **range_info);
327
367
virtual int close(void)=0;
370
@retval 0 Bulk update used by Cursor
371
@retval 1 Bulk update not used, normal operation used
373
virtual bool start_bulk_update() { return 1; }
375
@retval 0 Bulk delete used by Cursor
376
@retval 1 Bulk delete not used, normal operation used
378
virtual bool start_bulk_delete() { return 1; }
380
After this call all outstanding updates must be performed. The number
381
of duplicate key errors are reported in the duplicate key parameter.
382
It is allowed to continue to the batched update after this call, the
383
Cursor has to wait until end_bulk_update with changing state.
385
@param dup_key_found Number of duplicate keys found
388
@retval >0 Error code
390
virtual int exec_bulk_update(uint32_t *)
393
return HA_ERR_WRONG_COMMAND;
396
Perform any needed clean-up, no outstanding updates are there at the
399
virtual void end_bulk_update() { return; }
401
Execute all outstanding deletes and close down the bulk delete.
404
@retval >0 Error code
406
virtual int end_bulk_delete()
409
return HA_ERR_WRONG_COMMAND;
331
413
Positions an index cursor to the index specified in the handle. Fetches the
332
414
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,
417
virtual int index_read_map(unsigned char * buf, const unsigned char * key,
336
418
key_part_map keypart_map,
337
419
enum ha_rkey_function find_flag)
339
uint32_t key_len= calculate_key_len(active_index, keypart_map);
421
uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
340
422
return index_read(buf, key, key_len, find_flag);
379
456
bool eq_range, bool sorted);
380
457
virtual int read_range_next();
381
458
int compare_key(key_range *range);
459
int compare_key2(key_range *range);
382
460
virtual int rnd_next(unsigned char *)=0;
383
461
virtual int rnd_pos(unsigned char *, unsigned char *)=0;
463
One has to use this method when to find
464
random position by record as the plain
465
position() call doesn't work for some
466
handlers for random position.
468
virtual int rnd_pos_by_record(unsigned char *record);
384
469
virtual int read_first_row(unsigned char *buf, uint32_t primary_key);
471
The following function is only needed for tables that may be temporary
474
virtual int restart_rnd_next(unsigned char *, unsigned char *)
475
{ return HA_ERR_WRONG_COMMAND; }
385
476
virtual int rnd_same(unsigned char *, uint32_t)
386
477
{ return HA_ERR_WRONG_COMMAND; }
387
478
virtual ha_rows records_in_range(uint32_t, key_range *, key_range *)
464
558
virtual bool can_switch_engines(void) { return true; }
465
559
/** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
466
virtual int get_foreign_key_list(Session *, List<ForeignKeyInfo> *)
560
virtual int get_foreign_key_list(Session *, List<FOREIGN_KEY_INFO> *)
468
562
virtual uint32_t referenced_by_foreign_key() { return 0;}
469
563
virtual void free_foreign_key_create_info(char *) {}
564
/** The following can be called without an open Cursor */
566
virtual uint32_t index_flags(uint32_t idx, uint32_t part, bool all_parts) const =0;
568
virtual int add_index(Table *, KEY *, uint32_t)
569
{ return (HA_ERR_WRONG_COMMAND); }
570
virtual int prepare_drop_index(Table *, uint32_t *, uint32_t)
571
{ return (HA_ERR_WRONG_COMMAND); }
572
virtual int final_drop_index(Table *)
573
{ return (HA_ERR_WRONG_COMMAND); }
575
uint32_t max_record_length() const
576
{ return std::min((unsigned int)HA_MAX_REC_LENGTH, max_supported_record_length()); }
577
uint32_t max_keys() const
578
{ return std::min((unsigned int)MAX_KEY, max_supported_keys()); }
579
uint32_t max_key_parts() const
580
{ return std::min((unsigned int)MAX_REF_PARTS, max_supported_key_parts()); }
581
uint32_t max_key_length() const
582
{ return std::min((unsigned int)MAX_KEY_LENGTH, max_supported_key_length()); }
583
uint32_t max_key_part_length(void) const
584
{ return std::min((unsigned int)MAX_KEY_LENGTH, max_supported_key_part_length()); }
586
virtual uint32_t max_supported_record_length(void) const
587
{ return HA_MAX_REC_LENGTH; }
588
virtual uint32_t max_supported_keys(void) const { return 0; }
589
virtual uint32_t max_supported_key_parts(void) const { return MAX_REF_PARTS; }
590
virtual uint32_t max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
591
virtual uint32_t max_supported_key_part_length(void) const { return 255; }
593
virtual bool low_byte_first(void) const { return 1; }
594
virtual uint32_t checksum(void) const { return 0; }
595
virtual bool is_crashed(void) const { return 0; }
596
virtual bool auto_repair(void) const { return 0; }
472
599
Is not invoked for non-transactional temporary tables.
501
623
return memcmp(ref1, ref2, ref_length);
504
virtual bool isOrdered(void)
629
@param session Thread handle
630
@param lock_type HA_LOCK_IN_SHARE_MODE (F_RDLCK)
631
HA_LOCK_IN_EXCLUSIVE_MODE (F_WRLCK)
632
@param lock_timeout -1 default timeout
634
>0 wait timeout in milliseconds.
637
lock_timeout >0 is not used by MySQL currently. If the storage
638
engine does not support NOWAIT (lock_timeout == 0) it should
639
return an error. But if it does not support WAIT X (lock_timeout
640
>0) it should treat it as lock_timeout == -1 and wait a default
641
(or even hard-coded) timeout.
643
@retval HA_ERR_WRONG_COMMAND Storage engine does not support
645
@retval HA_ERR_UNSUPPORTED Storage engine does not support NOWAIT
646
@retval HA_ERR_LOCK_WAIT_TIMEOUT Lock request timed out or
647
lock conflict with NOWAIT option
648
@retval HA_ERR_LOCK_DEADLOCK Deadlock detected
650
virtual int lock_table(Session *, int, int)
652
return HA_ERR_WRONG_COMMAND;
511
656
/* Service methods for use by storage engines. */
512
void ha_statistic_increment(uint64_t system_status_var::*offset) const;
657
void ha_statistic_increment(ulong SSV::*offset) const;
513
658
void **ha_data(Session *) const;
659
Session *ha_session(void) const;
516
662
/* Private helpers */
517
inline void setTransactionReadWrite();
663
inline void mark_trx_read_write();
520
666
Low-level primitives for storage engines. These should be
522
668
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)
671
virtual int open(const char *name, int mode, uint32_t test_if_locked)=0;
672
virtual int index_init(uint32_t idx, bool)
528
673
{ active_index= idx; return 0; }
529
virtual int doEndIndexScan() { active_index= MAX_KEY; return 0; }
674
virtual int index_end() { active_index= MAX_KEY; return 0; }
531
doStartTableScan() can be called two times without doEndTableScan() in between
676
rnd_init() can be called two times without rnd_end() in between
532
677
(it only makes sense if scan=1).
533
678
then the second call should prepare for the new table scan (e.g
534
679
if rnd_init allocates the cursor, second call should position it
535
680
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 *)
682
virtual int rnd_init(bool scan)= 0;
683
virtual int rnd_end() { return 0; }
684
virtual int write_row(unsigned char *)
686
return HA_ERR_WRONG_COMMAND;
689
virtual int update_row(const unsigned char *, unsigned char *)
691
return HA_ERR_WRONG_COMMAND;
694
virtual int delete_row(const unsigned char *)
551
696
return HA_ERR_WRONG_COMMAND;
595
741
uint32_t, enum ha_rkey_function)
596
742
{ return HA_ERR_WRONG_COMMAND; }
597
743
virtual int index_read_last(unsigned char *, const unsigned char *, uint32_t)
598
{ return (errno= HA_ERR_WRONG_COMMAND); }
744
{ return (my_errno= HA_ERR_WRONG_COMMAND); }
746
This method is similar to update_row, however the Cursor doesn't need
747
to execute the updates at this point in time. The Cursor can be certain
748
that another call to bulk_update_row will occur OR a call to
749
exec_bulk_update before the set of updates in this query is concluded.
751
@param old_data Old record
752
@param new_data New record
753
@param dup_key_found Number of duplicate keys found
755
@retval 0 Bulk delete used by Cursor
756
@retval 1 Bulk delete not used, normal operation used
758
virtual int bulk_update_row(const unsigned char *, unsigned char *, uint32_t *)
761
return HA_ERR_WRONG_COMMAND;
600
764
This is called to delete all rows in a table
601
765
If the Cursor don't support this, then this function will
613
777
virtual int reset_auto_increment(uint64_t)
614
778
{ return HA_ERR_WRONG_COMMAND; }
616
virtual int analyze(Session *)
779
virtual int optimize(Session *, HA_CHECK_OPT *)
780
{ return HA_ADMIN_NOT_IMPLEMENTED; }
781
virtual int analyze(Session *, HA_CHECK_OPT *)
617
782
{ return HA_ADMIN_NOT_IMPLEMENTED; }
619
784
virtual int disable_indexes(uint32_t)
620
785
{ return HA_ERR_WRONG_COMMAND; }
622
786
virtual int enable_indexes(uint32_t)
623
787
{ return HA_ERR_WRONG_COMMAND; }
625
788
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.
789
{ return (my_errno=HA_ERR_WRONG_COMMAND); }
634
790
virtual void drop_table(const char *name);
637
793
extern const char *ha_row_type[];
794
extern const char *tx_isolation_names[];
795
extern const char *binlog_format_names[];
796
extern TYPELIB tx_isolation_typelib;
797
extern uint32_t total_ha, total_ha_2pc;
799
/* Wrapper functions */
800
#define ha_commit(session) (ha_commit_trans((session), true))
801
#define ha_rollback(session) (ha_rollback_trans((session), true))
639
803
/* basic stuff */
640
void ha_init_errors(void);
643
SortField *make_unireg_sortorder(Order *order, uint32_t *length,
644
SortField *sortorder);
804
int ha_init_errors(void);
808
/* transactions: interface to plugin::StorageEngine functions */
809
int ha_commit_one_phase(Session *session, bool all);
810
int ha_rollback_trans(Session *session, bool all);
812
/* transactions: these functions never call plugin::StorageEngine functions directly */
813
int ha_commit_trans(Session *session, bool all);
814
int ha_autocommit_or_rollback(Session *session, int error);
815
int ha_enable_transaction(Session *session, bool on);
818
int ha_rollback_to_savepoint(Session *session, SAVEPOINT *sv);
819
int ha_savepoint(Session *session, SAVEPOINT *sv);
820
int ha_release_savepoint(Session *session, SAVEPOINT *sv);
822
/* these are called by storage engines */
823
void trans_register_ha(Session *session, bool all, drizzled::plugin::StorageEngine *engine);
825
uint32_t filename_to_tablename(const char *from, char *to, uint32_t to_length);
826
bool tablename_to_filename(const char *from, char *to, size_t to_length);
830
Storage engine has to assume the transaction will end up with 2pc if
831
- there is more than one 2pc-capable storage engine available
832
- in the current transaction 2pc was not disabled yet
834
#define trans_need_2pc(session, all) ((total_ha_2pc > 1) && \
835
!((all ? &session->transaction.all : &session->transaction.stmt)->no_2pc))
838
bool mysql_xa_recover(Session *session);
840
SORT_FIELD * make_unireg_sortorder(order_st *order, uint32_t *length,
841
SORT_FIELD *sortorder);
645
842
int setup_order(Session *session, Item **ref_pointer_array, TableList *tables,
646
List<Item> &fields, List <Item> &all_fields, Order *order);
843
List<Item> &fields, List <Item> &all_fields, order_st *order);
647
844
int setup_group(Session *session, Item **ref_pointer_array, TableList *tables,
648
List<Item> &fields, List<Item> &all_fields, Order *order,
845
List<Item> &fields, List<Item> &all_fields, order_st *order,
649
846
bool *hidden_group_fields);
650
847
bool fix_inner_refs(Session *session, List<Item> &all_fields, Select_Lex *select,
651
848
Item **ref_pointer_array);
653
850
bool handle_select(Session *session, LEX *lex, select_result *result,
654
851
uint64_t setup_tables_done_option);
852
bool mysql_select(Session *session, Item ***rref_pointer_array,
853
TableList *tables, uint32_t wild_num, List<Item> &list,
854
COND *conds, uint32_t og_num, order_st *order, order_st *group,
855
Item *having, uint64_t select_type,
856
select_result *result, Select_Lex_Unit *unit,
857
Select_Lex *select_lex);
655
858
void free_underlaid_joins(Session *session, Select_Lex *select);
859
bool mysql_explain_union(Session *session, Select_Lex_Unit *unit,
860
select_result *result);
861
int mysql_explain_select(Session *session, Select_Lex *sl, char const *type,
862
select_result *result);
657
864
bool mysql_handle_derived(LEX *lex, bool (*processor)(Session *session,
661
868
bool mysql_derived_filling(Session *session, LEX *lex, TableList *t);
662
869
int prepare_create_field(CreateField *sql_field,
663
870
uint32_t *blob_columns,
664
int *timestamps, int *timestamps_with_niladic);
666
bool mysql_create_table(Session *session,
667
const TableIdentifier &identifier,
871
int *timestamps, int *timestamps_with_niladic,
872
int64_t table_flags);
873
bool mysql_create_table(Session *session,const char *db, const char *table_name,
668
874
HA_CREATE_INFO *create_info,
669
message::Table &table_proto,
875
drizzled::message::Table *table_proto,
670
876
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
const TableIdentifier &identifier,
877
bool tmp_table, uint32_t select_field_count);
878
bool mysql_create_table_no_lock(Session *session, const char *db,
879
const char *table_name,
676
880
HA_CREATE_INFO *create_info,
677
message::Table &table_proto,
881
drizzled::message::Table *table_proto,
678
882
AlterInfo *alter_info,
679
bool tmp_table, uint32_t select_field_count,
680
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,
686
bool is_if_not_exists,
689
bool mysql_rename_table(Session &session,
690
plugin::StorageEngine *base,
691
const TableIdentifier &old_identifier,
692
const TableIdentifier &new_identifier);
883
bool tmp_table, uint32_t select_field_count);
885
bool mysql_recreate_table(Session *session, TableList *table_list);
886
bool mysql_create_like_table(Session* session, TableList* table, TableList* src_table,
887
drizzled::message::Table& create_table_proto,
888
HA_CREATE_INFO *create_info);
889
bool mysql_rename_table(drizzled::plugin::StorageEngine *base, const char *old_db,
890
const char * old_name, const char *new_db,
891
const char * new_name, uint32_t flags);
694
892
bool mysql_prepare_update(Session *session, TableList *table_list,
695
Item **conds, uint32_t order_num, Order *order);
893
Item **conds, uint32_t order_num, order_st *order);
696
894
int mysql_update(Session *session,TableList *tables,List<Item> &fields,
697
895
List<Item> &values,COND *conds,
698
uint32_t order_num, Order *order, ha_rows limit,
896
uint32_t order_num, order_st *order, ha_rows limit,
699
897
enum enum_duplicates handle_duplicates, bool ignore);
700
898
bool mysql_prepare_insert(Session *session, TableList *table_list, Table *table,
701
899
List<Item> &fields, List_item *values,
713
911
bool mysql_delete(Session *session, TableList *table_list, COND *conds,
714
912
SQL_LIST *order, ha_rows rows, uint64_t options,
715
913
bool reset_auto_increment);
716
bool mysql_truncate(Session& session, TableList *table_list);
914
bool mysql_truncate(Session& session, TableList *table_list, bool dont_send_ok);
717
915
TableShare *get_table_share(Session *session, TableList *table_list, char *key,
718
916
uint32_t key_length, uint32_t db_flags, int *error);
719
917
TableShare *get_cached_table_share(const char *db, const char *table_name);
720
918
bool reopen_name_locked_table(Session* session, TableList* table_list, bool link_in);
919
Table *table_cache_insert_placeholder(Session *session, const char *key,
920
uint32_t key_length);
921
bool lock_table_name_if_not_cached(Session *session, const char *db,
922
const char *table_name, Table **table);
923
bool reopen_table(Table *table);
721
924
bool reopen_tables(Session *session,bool get_locks,bool in_refresh);
925
void close_data_files_and_morph_locks(Session *session, const char *db,
926
const char *table_name);
722
927
void close_handle_and_leave_table_as_lock(Table *table);
723
928
bool wait_for_tables(Session *session);
724
929
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);
930
Table *drop_locked_tables(Session *session,const char *db, const char *table_name);
931
void abort_locked_tables(Session *session,const char *db, const char *table_name);
727
932
extern Field *not_found_field;
728
933
extern Field *view_ref_found;