~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; version 2 of the License.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16
 *  along with this program; if not, write to the Free Software
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
1 by brian
clean slate
19
520.6.4 by Monty Taylor
Moved thr_lock.h out of common_includes.
20
#ifndef DRIZZLED_HANDLER_H
21
#define DRIZZLED_HANDLER_H
1 by brian
clean slate
22
520.4.31 by Monty Taylor
Removed server_id from common_includes.
23
#include <drizzled/xid.h>
24
1 by brian
clean slate
25
/* Definitions for parameters to do with handler-routines */
26
212.4.2 by Monty Taylor
Fixed the includes in places to make the myisam header file move work.
27
#include <storage/myisam/keycache.h>
520.6.4 by Monty Taylor
Moved thr_lock.h out of common_includes.
28
#include <mysys/thr_lock.h>
520.8.3 by Monty Taylor
Moved hash back to mysys.
29
#include <mysys/hash.h>
520.8.5 by Monty Taylor
Removed sql_string and sql_list from common_includes.
30
#include <drizzled/sql_string.h>
31
#include <drizzled/sql_list.h>
575.1.3 by Monty Taylor
Moved some stuff out of handler.h.
32
#include <drizzled/handlerton.h>
33
#include <drizzled/handler_structs.h>
34
#include <drizzled/ha_statistics.h>
520.6.4 by Monty Taylor
Moved thr_lock.h out of common_includes.
35
36
/* Bits to show what an alter table will do */
37
#include <drizzled/sql_bitmap.h>
38
39
#define HA_MAX_ALTER_FLAGS 40
40
typedef Bitmap<HA_MAX_ALTER_FLAGS> HA_ALTER_FLAGS;
1 by brian
clean slate
41
42
520.1.22 by Brian Aker
Second pass of thd cleanup
43
typedef bool (*qc_engine_callback)(Session *session, char *table_key,
482 by Brian Aker
Remove uint.
44
                                      uint32_t key_length,
243.1.1 by Jay Pipes
* Pulled Object_creation_ctx and Default_creation_ctx out of mysql_priv.h
45
                                      uint64_t *engine_data);
46
1 by brian
clean slate
47
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
48
/* The handler for a table type.  Will be included in the Table structure */
1 by brian
clean slate
49
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
50
class Table;
561.1.3 by Monty Taylor
Split some more things out of common_includes.h.
51
class TableList;
1 by brian
clean slate
52
typedef struct st_table_share TABLE_SHARE;
53
struct st_foreign_key_info;
54
typedef struct st_foreign_key_info FOREIGN_KEY_INFO;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
55
struct order_st;
1 by brian
clean slate
56
57
class Item;
58
struct st_table_log_memory_entry;
59
575.4.7 by Monty Taylor
More header cleanup.
60
class LEX;
61
typedef class st_select_lex SELECT_LEX;
62
typedef class st_select_lex_unit SELECT_LEX_UNIT;
63
class Alter_info;
64
class select_result;
65
class Create_field;
66
class sys_var_str;
67
class Item_ident;
68
typedef struct st_sort_field SORT_FIELD;
69
70
typedef List<Item> List_item;
71
1 by brian
clean slate
72
typedef struct st_savepoint SAVEPOINT;
61 by Brian Aker
Conversion of handler type.
73
extern uint32_t savepoint_alloc_size;
1 by brian
clean slate
74
extern KEY_CREATE_INFO default_key_create_info;
75
76
/* Forward declaration for condition pushdown to storage engine */
77
typedef class Item COND;
78
79
typedef struct system_status_var SSV;
80
575.1.3 by Monty Taylor
Moved some stuff out of handler.h.
81
class COST_VECT;
82
482 by Brian Aker
Remove uint.
83
uint16_t &mrr_persistent_flag_storage(range_seq_t seq, uint32_t idx);
84
char* &mrr_get_ptr_by_idx(range_seq_t seq, uint32_t idx);
1 by brian
clean slate
85
482 by Brian Aker
Remove uint.
86
uint32_t calculate_key_len(Table *, uint, const unsigned char *, key_part_map);
1 by brian
clean slate
87
/*
88
  bitmap with first N+1 bits set
89
  (keypart_map for a key prefix of [0..N] keyparts)
90
*/
575.1.3 by Monty Taylor
Moved some stuff out of handler.h.
91
template<class T>
92
inline key_part_map make_keypart_map(T a)
93
{
94
  return (((key_part_map)2 << a) - 1);
95
}
96
1 by brian
clean slate
97
/*
98
  bitmap with first N bits set
99
  (keypart_map for a key prefix of [0..N-1] keyparts)
100
*/
575.1.3 by Monty Taylor
Moved some stuff out of handler.h.
101
template<class T>
102
inline key_part_map make_prev_keypart_map(T a)
103
{
104
  return (((key_part_map)1 << a) - 1);
105
}
1 by brian
clean slate
106
107
/**
108
  The handler class is the interface for dynamically loadable
109
  storage engines. Do not add ifdefs and take care when adding or
110
  changing virtual functions to avoid vtable confusion
111
112
  Functions in this class accept and return table columns data. Two data
113
  representation formats are used:
114
  1. TableRecordFormat - Used to pass [partial] table records to/from
115
     storage engine
116
117
  2. KeyTupleFormat - used to pass index search tuples (aka "keys") to
118
     storage engine. See opt_range.cc for description of this format.
119
120
  TableRecordFormat
121
  =================
122
  [Warning: this description is work in progress and may be incomplete]
123
  The table record is stored in a fixed-size buffer:
124
   
125
    record: null_bytes, column1_data, column2_data, ...
126
  
127
  The offsets of the parts of the buffer are also fixed: every column has 
128
  an offset to its column{i}_data, and if it is nullable it also has its own
129
  bit in null_bytes. 
130
131
  The record buffer only includes data about columns that are marked in the
132
  relevant column set (table->read_set and/or table->write_set, depending on
133
  the situation). 
134
  <not-sure>It could be that it is required that null bits of non-present
135
  columns are set to 1</not-sure>
136
137
  VARIOUS EXCEPTIONS AND SPECIAL CASES
138
139
  f the table has no nullable columns, then null_bytes is still 
140
  present, its length is one byte <not-sure> which must be set to 0xFF 
141
  at all times. </not-sure>
142
  
143
  If the table has columns of type BIT, then certain bits from those columns
144
  may be stored in null_bytes as well. Grep around for Field_bit for
145
  details.
146
147
  For blob columns (see Field_blob), the record buffer stores length of the 
148
  data, following by memory pointer to the blob data. The pointer is owned 
149
  by the storage engine and is valid until the next operation.
150
151
  If a blob column has NULL value, then its length and blob data pointer
152
  must be set to 0.
153
*/
154
155
class handler :public Sql_alloc
156
{
157
public:
158
  typedef uint64_t Table_flags;
159
protected:
160
  struct st_table_share *table_share;   /* The table definition */
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
161
  Table *table;               /* The current open table */
1 by brian
clean slate
162
  Table_flags cached_table_flags;       /* Set on init() and open() */
163
164
  ha_rows estimation_rows_to_insert;
165
public:
166
  handlerton *ht;                 /* storage engine of this handler */
481 by Brian Aker
Remove all of uchar.
167
  unsigned char *ref;				/* Pointer to current row */
168
  unsigned char *dup_ref;			/* Pointer to duplicate row */
1 by brian
clean slate
169
170
  ha_statistics stats;
171
  /** MultiRangeRead-related members: */
172
  range_seq_t mrr_iter;    /* Interator to traverse the range sequence */
173
  RANGE_SEQ_IF mrr_funcs;  /* Range sequence traversal functions */
174
  HANDLER_BUFFER *multi_range_buffer; /* MRR buffer info */
482 by Brian Aker
Remove uint.
175
  uint32_t ranges_in_seq; /* Total number of ranges in the traversed sequence */
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
176
  /* true <=> source MRR ranges and the output are ordered */
1 by brian
clean slate
177
  bool mrr_is_output_sorted;
178
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
179
  /** true <=> we're currently traversing a range in mrr_cur_range. */
1 by brian
clean slate
180
  bool mrr_have_range;
181
  /** Current range (the one we're now returning rows from) */
182
  KEY_MULTI_RANGE mrr_cur_range;
183
184
  /** The following are for read_range() */
185
  key_range save_end_range, *end_range;
186
  KEY_PART_INFO *range_key_part;
187
  int key_compare_result_on_equal;
188
  bool eq_range;
189
  /* 
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
190
    true <=> the engine guarantees that returned records are within the range
1 by brian
clean slate
191
    being scanned.
192
  */
193
  bool in_range_check_pushed_down;
194
482 by Brian Aker
Remove uint.
195
  uint32_t errkey;				/* Last dup key */
196
  uint32_t key_used_on_scan;
197
  uint32_t active_index;
1 by brian
clean slate
198
  /** Length of ref (1-8 or the clustered key length) */
482 by Brian Aker
Remove uint.
199
  uint32_t ref_length;
1 by brian
clean slate
200
  enum {NONE=0, INDEX, RND} inited;
201
  bool locked;
202
  bool implicit_emptied;                /* Can be !=0 only if HEAP */
203
  const Item *pushed_cond;
204
205
  Item *pushed_idx_cond;
482 by Brian Aker
Remove uint.
206
  uint32_t pushed_idx_cond_keyno;  /* The index which the above condition is for */
1 by brian
clean slate
207
208
  /**
209
    next_insert_id is the next value which should be inserted into the
210
    auto_increment column: in a inserting-multi-row statement (like INSERT
211
    SELECT), for the first row where the autoinc value is not specified by the
212
    statement, get_auto_increment() called and asked to generate a value,
213
    next_insert_id is set to the next value, then for all other rows
214
    next_insert_id is used (and increased each time) without calling
215
    get_auto_increment().
216
  */
217
  uint64_t next_insert_id;
218
  /**
219
    insert id for the current row (*autogenerated*; if not
220
    autogenerated, it's 0).
221
    At first successful insertion, this variable is stored into
520.1.21 by Brian Aker
THD -> Session rename
222
    Session::first_successful_insert_id_in_cur_stmt.
1 by brian
clean slate
223
  */
224
  uint64_t insert_id_for_cur_row;
225
  /**
226
    Interval returned by get_auto_increment() and being consumed by the
227
    inserter.
228
  */
229
  Discrete_interval auto_inc_interval_for_cur_row;
230
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),
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
234
    ref(0), in_range_check_pushed_down(false),
1 by brian
clean slate
235
    key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
236
    ref_length(sizeof(my_off_t)),
137 by Brian Aker
Removed dead FT bits. Small refactoring in sql_plugin.cc
237
    inited(NONE),
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
238
    locked(false), implicit_emptied(0),
1 by brian
clean slate
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)
241
    {}
242
  virtual ~handler(void)
243
  {
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
244
    assert(locked == false);
245
    /* TODO: assert(inited == NONE); */
1 by brian
clean slate
246
  }
247
  virtual handler *clone(MEM_ROOT *mem_root);
248
  /** This is called after create to allow us to set up cached variables */
249
  void init()
250
  {
251
    cached_table_flags= table_flags();
252
  }
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
253
1 by brian
clean slate
254
  /* ha_ methods: pubilc wrappers for private virtual API */
255
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
256
  int ha_open(Table *table, const char *name, int mode, int test_if_locked);
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
257
  int ha_index_init(uint32_t idx, bool sorted);
258
  int ha_index_end();
259
  int ha_rnd_init(bool scan);
260
  int ha_rnd_end();
1 by brian
clean slate
261
  int ha_reset();
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
262
1 by brian
clean slate
263
  /* this is necessary in many places, e.g. in HANDLER command */
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
264
  int ha_index_or_rnd_end();
265
  Table_flags ha_table_flags() const;
266
1 by brian
clean slate
267
  /**
268
    These functions represent the public interface to *users* of the
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.
272
  */
520.1.22 by Brian Aker
Second pass of thd cleanup
273
  int ha_external_lock(Session *session, int lock_type);
481 by Brian Aker
Remove all of uchar.
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);
1 by brian
clean slate
277
  void ha_release_auto_increment();
278
279
  int ha_check_for_upgrade(HA_CHECK_OPT *check_opt);
280
  /** to be actually called to get 'check()' functionality*/
520.1.22 by Brian Aker
Second pass of thd cleanup
281
  int ha_check(Session *session, HA_CHECK_OPT *check_opt);
282
  int ha_repair(Session* session, HA_CHECK_OPT* check_opt);
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
283
  void ha_start_bulk_insert(ha_rows rows);
284
  int ha_end_bulk_insert();
481 by Brian Aker
Remove all of uchar.
285
  int ha_bulk_update_row(const unsigned char *old_data, unsigned char *new_data,
482 by Brian Aker
Remove uint.
286
                         uint32_t *dup_key_found);
1 by brian
clean slate
287
  int ha_delete_all_rows();
288
  int ha_reset_auto_increment(uint64_t value);
520.1.22 by Brian Aker
Second pass of thd cleanup
289
  int ha_optimize(Session* session, HA_CHECK_OPT* check_opt);
290
  int ha_analyze(Session* session, HA_CHECK_OPT* check_opt);
291
  bool ha_check_and_repair(Session *session);
482 by Brian Aker
Remove uint.
292
  int ha_disable_indexes(uint32_t mode);
293
  int ha_enable_indexes(uint32_t mode);
200 by Brian Aker
my_bool from handler and set_var
294
  int ha_discard_or_import_tablespace(bool discard);
1 by brian
clean slate
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);
299
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
300
  int ha_create(const char *name, Table *form, HA_CREATE_INFO *info);
1 by brian
clean slate
301
302
  int ha_create_handler_files(const char *name, const char *old_name,
303
                              int action_flag, HA_CREATE_INFO *info);
304
305
  void adjust_next_insert_id_after_explicit_value(uint64_t nr);
306
  int update_auto_increment();
482 by Brian Aker
Remove uint.
307
  void print_keydup_error(uint32_t key_nr, const char *msg);
1 by brian
clean slate
308
  virtual void print_error(int error, myf errflag);
309
  virtual bool get_error_message(int error, String *buf);
482 by Brian Aker
Remove uint.
310
  uint32_t get_dup_key(int error);
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
311
  virtual void change_table_ptr(Table *table_arg, TABLE_SHARE *share);
312
1 by brian
clean slate
313
  /* Estimates calculation */
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
314
  virtual double scan_time(void)
151 by Brian Aker
Ulonglong to uint64_t
315
  { return uint64_t2double(stats.data_file_length) / IO_SIZE + 2; }
482 by Brian Aker
Remove uint.
316
  virtual double read_time(uint32_t index __attribute__((unused)),
317
                           uint32_t ranges, ha_rows rows)
1 by brian
clean slate
318
  { return rows2double(ranges+rows); }
319
482 by Brian Aker
Remove uint.
320
  virtual double index_only_read_time(uint32_t keynr, double records);
1 by brian
clean slate
321
  
482 by Brian Aker
Remove uint.
322
  virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
1 by brian
clean slate
323
                                              void *seq_init_param, 
482 by Brian Aker
Remove uint.
324
                                              uint32_t n_ranges, uint32_t *bufsz,
325
                                              uint32_t *flags, COST_VECT *cost);
326
  virtual int multi_range_read_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys,
327
                                    uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
1 by brian
clean slate
328
  virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
482 by Brian Aker
Remove uint.
329
                                    uint32_t n_ranges, uint32_t mode,
1 by brian
clean slate
330
                                    HANDLER_BUFFER *buf);
331
  virtual int multi_range_read_next(char **range_info);
332
333
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
334
  virtual const key_map *keys_to_use_for_scanning();
335
  bool has_transactions();
482 by Brian Aker
Remove uint.
336
  virtual uint32_t extra_rec_buf_length() const { return 0; }
1 by brian
clean slate
337
338
  /**
339
    This method is used to analyse the error to see whether the error
340
    is ignorable or not, certain handlers can have more error that are
341
    ignorable than others. E.g. the partition handler can get inserts
342
    into a range where there is no partition and this is an ignorable
343
    error.
344
    HA_ERR_FOUND_DUP_UNIQUE is a special case in MyISAM that means the
345
    same thing as HA_ERR_FOUND_DUP_KEY but can in some cases lead to
346
    a slightly different error message.
347
  */
575.1.4 by Monty Taylor
Moved implementation of some methods into handler.cc from handler.h.
348
  virtual bool is_fatal_error(int error, uint32_t flags);
1 by brian
clean slate
349
350
  /**
351
    Number of rows in table. It will only be called if
352
    (table_flags() & (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT)) != 0
353
  */
575.1.5 by Monty Taylor
Moved stuff to handlerton.cc
354
  virtual ha_rows records();
1 by brian
clean slate
355
  /**
356
    Return upper bound of current number of records in the table
357
    (max. of how many records one will retrieve when doing a full table scan)
358
    If upper bound is not known, HA_POS_ERROR should be returned as a max
359
    possible upper bound.
360
  */
361
  virtual ha_rows estimate_rows_upper_bound()
362
  { return stats.records+EXTRA_RECORDS; }
363
364
  /**
365
    Get the row type from the storage engine.  If this method returns
366
    ROW_TYPE_NOT_USED, the information in HA_CREATE_INFO should be used.
367
  */
368
  virtual enum row_type get_row_type() const { return ROW_TYPE_NOT_USED; }
369
482 by Brian Aker
Remove uint.
370
  virtual const char *index_type(uint32_t key_number __attribute__((unused)))
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
371
  { assert(0); return "";}
1 by brian
clean slate
372
373
374
  /**
375
    Signal that the table->read_set and table->write_set table maps changed
376
    The handler is allowed to set additional bits in the above map in this
377
    call. Normally the handler should ignore all calls until we have done
378
    a ha_rnd_init() or ha_index_init(), write_row(), update_row or delete_row()
379
    as there may be several calls to this routine.
380
  */
381
  virtual void column_bitmaps_signal();
482 by Brian Aker
Remove uint.
382
  uint32_t get_index(void) const { return active_index; }
1 by brian
clean slate
383
  virtual int close(void)=0;
384
385
  /**
386
    @retval  0   Bulk update used by handler
387
    @retval  1   Bulk update not used, normal operation used
388
  */
389
  virtual bool start_bulk_update() { return 1; }
390
  /**
391
    @retval  0   Bulk delete used by handler
392
    @retval  1   Bulk delete not used, normal operation used
393
  */
394
  virtual bool start_bulk_delete() { return 1; }
395
  /**
396
    After this call all outstanding updates must be performed. The number
397
    of duplicate key errors are reported in the duplicate key parameter.
398
    It is allowed to continue to the batched update after this call, the
399
    handler has to wait until end_bulk_update with changing state.
400
401
    @param    dup_key_found       Number of duplicate keys found
402
403
    @retval  0           Success
404
    @retval  >0          Error code
405
  */
482 by Brian Aker
Remove uint.
406
  virtual int exec_bulk_update(uint32_t *dup_key_found __attribute__((unused)))
1 by brian
clean slate
407
  {
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
408
    assert(false);
1 by brian
clean slate
409
    return HA_ERR_WRONG_COMMAND;
410
  }
411
  /**
412
    Perform any needed clean-up, no outstanding updates are there at the
413
    moment.
414
  */
415
  virtual void end_bulk_update() { return; }
416
  /**
417
    Execute all outstanding deletes and close down the bulk delete.
418
419
    @retval 0             Success
420
    @retval >0            Error code
421
  */
422
  virtual int end_bulk_delete()
423
  {
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
424
    assert(false);
1 by brian
clean slate
425
    return HA_ERR_WRONG_COMMAND;
426
  }
427
  /**
428
     @brief
429
     Positions an index cursor to the index specified in the handle. Fetches the
430
     row if available. If the key value is null, begin at the first key of the
431
     index.
432
  */
481 by Brian Aker
Remove all of uchar.
433
  virtual int index_read_map(unsigned char * buf, const unsigned char * key,
1 by brian
clean slate
434
                             key_part_map keypart_map,
435
                             enum ha_rkey_function find_flag)
436
  {
482 by Brian Aker
Remove uint.
437
    uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
1 by brian
clean slate
438
    return  index_read(buf, key, key_len, find_flag);
439
  }
440
  /**
441
     @brief
442
     Positions an index cursor to the index specified in the handle. Fetches the
443
     row if available. If the key value is null, begin at the first key of the
444
     index.
445
  */
482 by Brian Aker
Remove uint.
446
  virtual int index_read_idx_map(unsigned char * buf, uint32_t index, const unsigned char * key,
1 by brian
clean slate
447
                                 key_part_map keypart_map,
448
                                 enum ha_rkey_function find_flag);
481 by Brian Aker
Remove all of uchar.
449
  virtual int index_next(unsigned char * buf __attribute__((unused)))
450
   { return  HA_ERR_WRONG_COMMAND; }
451
  virtual int index_prev(unsigned char * buf __attribute__((unused)))
452
   { return  HA_ERR_WRONG_COMMAND; }
453
  virtual int index_first(unsigned char * buf __attribute__((unused)))
454
   { return  HA_ERR_WRONG_COMMAND; }
455
  virtual int index_last(unsigned char * buf __attribute__((unused)))
456
   { return  HA_ERR_WRONG_COMMAND; }
457
  virtual int index_next_same(unsigned char *buf __attribute__((unused)),
458
                              const unsigned char *key __attribute__((unused)),
482 by Brian Aker
Remove uint.
459
                              uint32_t keylen __attribute__((unused)));
1 by brian
clean slate
460
  /**
461
     @brief
462
     The following functions works like index_read, but it find the last
463
     row with the current key value or prefix.
464
  */
481 by Brian Aker
Remove all of uchar.
465
  virtual int index_read_last_map(unsigned char * buf, const unsigned char * key,
1 by brian
clean slate
466
                                  key_part_map keypart_map)
467
  {
482 by Brian Aker
Remove uint.
468
    uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
1 by brian
clean slate
469
    return index_read_last(buf, key, key_len);
470
  }
471
  virtual int read_range_first(const key_range *start_key,
472
                               const key_range *end_key,
473
                               bool eq_range, bool sorted);
474
  virtual int read_range_next();
475
  int compare_key(key_range *range);
476
  int compare_key2(key_range *range);
481 by Brian Aker
Remove all of uchar.
477
  virtual int rnd_next(unsigned char *buf __attribute__((unused)))=0;
478
  virtual int rnd_pos(unsigned char * buf __attribute__((unused)),
479
                      unsigned char *pos __attribute__((unused)))=0;
1 by brian
clean slate
480
  /**
481
    One has to use this method when to find
482
    random position by record as the plain
483
    position() call doesn't work for some
484
    handlers for random position.
485
  */
481 by Brian Aker
Remove all of uchar.
486
  virtual int rnd_pos_by_record(unsigned char *record);
482 by Brian Aker
Remove uint.
487
  virtual int read_first_row(unsigned char *buf, uint32_t primary_key);
1 by brian
clean slate
488
  /**
489
    The following function is only needed for tables that may be temporary
490
    tables during joins.
491
  */
481 by Brian Aker
Remove all of uchar.
492
  virtual int restart_rnd_next(unsigned char *buf __attribute__((unused)),
493
                               unsigned char *pos __attribute__((unused)))
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
494
    { return HA_ERR_WRONG_COMMAND; }
481 by Brian Aker
Remove all of uchar.
495
  virtual int rnd_same(unsigned char *buf __attribute__((unused)),
482 by Brian Aker
Remove uint.
496
                       uint32_t inx __attribute__((unused)))
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
497
    { return HA_ERR_WRONG_COMMAND; }
482 by Brian Aker
Remove uint.
498
  virtual ha_rows records_in_range(uint32_t inx __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
499
                                   key_range *min_key __attribute__((unused)),
500
                                   key_range *max_key __attribute__((unused)))
1 by brian
clean slate
501
    { return (ha_rows) 10; }
481 by Brian Aker
Remove all of uchar.
502
  virtual void position(const unsigned char *record)=0;
1 by brian
clean slate
503
  virtual int info(uint)=0; // see my_base.h for full description
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
504
  virtual uint32_t calculate_key_hash_value(Field **field_array __attribute__((unused)))
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
505
  { assert(0); return 0; }
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
506
  virtual int extra(enum ha_extra_function operation __attribute__((unused)))
1 by brian
clean slate
507
  { return 0; }
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
508
  virtual int extra_opt(enum ha_extra_function operation,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
509
                        uint32_t cache_size __attribute__((unused)))
1 by brian
clean slate
510
  { return extra(operation); }
511
512
  /**
513
    In an UPDATE or DELETE, if the row under the cursor was locked by another
514
    transaction, and the engine used an optimistic read of the last
515
    committed row value under the cursor, then the engine returns 1 from this
516
    function. MySQL must NOT try to update this optimistic value. If the
517
    optimistic value does not match the WHERE condition, MySQL can decide to
518
    skip over this row. Currently only works for InnoDB. This can be used to
519
    avoid unnecessary lock waits.
520
521
    If this method returns nonzero, it will also signal the storage
522
    engine that the next read will be a locking re-read of the row.
523
  */
524
  virtual bool was_semi_consistent_read() { return 0; }
525
  /**
526
    Tell the engine whether it should avoid unnecessary lock waits.
527
    If yes, in an UPDATE or DELETE, if the row under the cursor was locked
528
    by another transaction, the engine may try an optimistic read of
529
    the last committed row value under the cursor.
530
  */
531
  virtual void try_semi_consistent_read(bool) {}
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
532
  virtual void unlock_row(void) {}
520.1.22 by Brian Aker
Second pass of thd cleanup
533
  virtual int start_stmt(Session *session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
534
                         thr_lock_type lock_type __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
535
  {return 0;}
1 by brian
clean slate
536
  virtual void get_auto_increment(uint64_t offset, uint64_t increment,
537
                                  uint64_t nb_desired_values,
538
                                  uint64_t *first_value,
539
                                  uint64_t *nb_reserved_values);
540
  void set_next_insert_id(uint64_t id)
541
  {
542
    next_insert_id= id;
543
  }
544
  void restore_auto_increment(uint64_t prev_insert_id)
545
  {
546
    /*
547
      Insertion of a row failed, re-use the lastly generated auto_increment
548
      id, for the next row. This is achieved by resetting next_insert_id to
549
      what it was before the failed insertion (that old value is provided by
550
      the caller). If that value was 0, it was the first row of the INSERT;
551
      then if insert_id_for_cur_row contains 0 it means no id was generated
552
      for this first row, so no id was generated since the INSERT started, so
553
      we should set next_insert_id to 0; if insert_id_for_cur_row is not 0, it
554
      is the generated id of the first and failed row, so we use it.
555
    */
556
    next_insert_id= (prev_insert_id > 0) ? prev_insert_id :
557
      insert_id_for_cur_row;
558
  }
559
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
560
  virtual void update_create_info(HA_CREATE_INFO *create_info __attribute__((unused))) {}
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
561
  int check_old_types(void);
520.1.22 by Brian Aker
Second pass of thd cleanup
562
  virtual int assign_to_keycache(Session* session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
563
                                 HA_CHECK_OPT* check_opt __attribute__((unused)))
1 by brian
clean slate
564
  { return HA_ADMIN_NOT_IMPLEMENTED; }
565
  /* end of the list of admin commands */
566
567
  virtual int indexes_are_disabled(void) {return 0;}
568
  virtual char *update_table_comment(const char * comment)
569
  { return (char*) comment;}
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
570
  virtual void append_create_info(String *packet __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
571
  {}
1 by brian
clean slate
572
  /**
573
      If index == MAX_KEY then a check for table is made and if index <
574
      MAX_KEY then a check is made if the table has foreign keys and if
575
      a foreign key uses this index (and thus the index cannot be dropped).
576
577
    @param  index            Index to check if foreign key uses it
578
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
579
    @retval   true            Foreign key defined on table or index
580
    @retval   false           No foreign key defined
1 by brian
clean slate
581
  */
482 by Brian Aker
Remove uint.
582
  virtual bool is_fk_defined_on_table_or_index(uint32_t index __attribute__((unused)))
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
583
  { return false; }
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
584
  virtual char* get_foreign_key_create_info(void)
1 by brian
clean slate
585
  { return(NULL);}  /* gets foreign key create string from InnoDB */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
586
  /** used in ALTER Table; 1 if changing storage engine is allowed */
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
587
  virtual bool can_switch_engines(void) { return 1; }
1 by brian
clean slate
588
  /** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
520.1.22 by Brian Aker
Second pass of thd cleanup
589
  virtual int get_foreign_key_list(Session *session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
590
                                   List<FOREIGN_KEY_INFO> *f_key_list __attribute__((unused)))
1 by brian
clean slate
591
  { return 0; }
482 by Brian Aker
Remove uint.
592
  virtual uint32_t referenced_by_foreign_key() { return 0;}
1 by brian
clean slate
593
  virtual void init_table_handle_for_HANDLER()
594
  { return; }       /* prepare InnoDB for HANDLER */
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
595
  virtual void free_foreign_key_create_info(char* str __attribute__((unused))) {}
1 by brian
clean slate
596
  /** The following can be called without an open handler */
597
  virtual const char *table_type() const =0;
598
  /**
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.
602
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
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
607
    prepare_for_repair() when REPAIR Table ... USE_FRM is issued.
1 by brian
clean slate
608
  */
609
  virtual const char **bas_ext() const =0;
610
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
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)),
482 by Brian Aker
Remove uint.
613
                            uint32_t *no_parts)
1 by brian
clean slate
614
  {
615
    *no_parts= 0;
616
    return 0;
617
  }
618
482 by Brian Aker
Remove uint.
619
  virtual uint32_t index_flags(uint32_t idx, uint32_t part, bool all_parts) const =0;
1 by brian
clean slate
620
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
621
  virtual int add_index(Table *table_arg __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
622
                        KEY *key_info __attribute__((unused)),
482 by Brian Aker
Remove uint.
623
                        uint32_t num_of_keys __attribute__((unused)))
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
624
  { return (HA_ERR_WRONG_COMMAND); }
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
625
  virtual int prepare_drop_index(Table *table_arg __attribute__((unused)),
482 by Brian Aker
Remove uint.
626
                                 uint32_t *key_num __attribute__((unused)),
627
                                 uint32_t num_of_keys __attribute__((unused)))
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
628
  { return (HA_ERR_WRONG_COMMAND); }
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
629
  virtual int final_drop_index(Table *table_arg __attribute__((unused)))
1 by brian
clean slate
630
  { return (HA_ERR_WRONG_COMMAND); }
631
482 by Brian Aker
Remove uint.
632
  uint32_t max_record_length() const
398.1.4 by Monty Taylor
Renamed max/min.
633
  { return cmin((unsigned int)HA_MAX_REC_LENGTH, max_supported_record_length()); }
482 by Brian Aker
Remove uint.
634
  uint32_t max_keys() const
398.1.4 by Monty Taylor
Renamed max/min.
635
  { return cmin((unsigned int)MAX_KEY, max_supported_keys()); }
482 by Brian Aker
Remove uint.
636
  uint32_t max_key_parts() const
398.1.4 by Monty Taylor
Renamed max/min.
637
  { return cmin((unsigned int)MAX_REF_PARTS, max_supported_key_parts()); }
482 by Brian Aker
Remove uint.
638
  uint32_t max_key_length() const
398.1.4 by Monty Taylor
Renamed max/min.
639
  { return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_length()); }
482 by Brian Aker
Remove uint.
640
  uint32_t max_key_part_length(void) const
398.1.4 by Monty Taylor
Renamed max/min.
641
  { return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_part_length()); }
1 by brian
clean slate
642
482 by Brian Aker
Remove uint.
643
  virtual uint32_t max_supported_record_length(void) const
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
644
  { return HA_MAX_REC_LENGTH; }
482 by Brian Aker
Remove uint.
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
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
650
  { return 1; }
1 by brian
clean slate
651
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
652
  virtual bool low_byte_first(void) const { return 1; }
482 by Brian Aker
Remove uint.
653
  virtual uint32_t checksum(void) const { return 0; }
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
654
  virtual bool is_crashed(void) const  { return 0; }
655
  virtual bool auto_repair(void) const { return 0; }
1 by brian
clean slate
656
657
658
#define CHF_CREATE_FLAG 0
659
#define CHF_DELETE_FLAG 1
660
#define CHF_RENAME_FLAG 2
661
662
663
  /**
664
    @note lock_count() can return > 1 if the table is MERGE or partitioned.
665
  */
482 by Brian Aker
Remove uint.
666
  virtual uint32_t lock_count(void) const { return 1; }
1 by brian
clean slate
667
  /**
668
    Is not invoked for non-transactional temporary tables.
669
670
    @note store_lock() can return more than one lock if the table is MERGE
671
    or partitioned.
672
673
    @note that one can NOT rely on table->in_use in store_lock().  It may
674
    refer to a different thread if called from mysql_lock_abort_for_thread().
675
676
    @note If the table is MERGE, store_lock() can return less locks
677
    than lock_count() claimed. This can happen when the MERGE children
678
    are not attached when this is called from another thread.
679
  */
520.1.22 by Brian Aker
Second pass of thd cleanup
680
  virtual THR_LOCK_DATA **store_lock(Session *session,
1 by brian
clean slate
681
                                     THR_LOCK_DATA **to,
682
                                     enum thr_lock_type lock_type)=0;
683
684
  /** Type of table for caching query */
206 by Brian Aker
Removed final uint dead types.
685
  virtual uint8_t table_cache_type() { return HA_CACHE_TBL_NONTRANSACT; }
1 by brian
clean slate
686
687
688
  /**
689
    @brief Register a named table with a call back function to the query cache.
690
520.1.22 by Brian Aker
Second pass of thd cleanup
691
    @param session The thread handle
1 by brian
clean slate
692
    @param table_key A pointer to the table name in the table cache
693
    @param key_length The length of the table name
694
    @param[out] engine_callback The pointer to the storage engine call back
695
      function
696
    @param[out] engine_data Storage engine specific data which could be
697
      anything
698
699
    This method offers the storage engine, the possibility to store a reference
700
    to a table name which is going to be used with query cache. 
701
    The method is called each time a statement is written to the cache and can
702
    be used to verify if a specific statement is cachable. It also offers
703
    the possibility to register a generic (but static) call back function which
704
    is called each time a statement is matched against the query cache.
705
706
    @note If engine_data supplied with this function is different from
707
      engine_data supplied with the callback function, and the callback returns
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
708
      false, a table invalidation on the current table will occur.
1 by brian
clean slate
709
710
    @return Upon success the engine_callback will point to the storage engine
711
      call back function, if any, and engine_data will point to any storage
712
      engine data used in the specific implementation.
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
713
      @retval true Success
714
      @retval false The specified table or current statement should not be
1 by brian
clean slate
715
        cached
716
  */
717
200 by Brian Aker
my_bool from handler and set_var
718
  virtual bool
520.1.22 by Brian Aker
Second pass of thd cleanup
719
    register_query_cache_table(Session *session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
720
                               char *table_key __attribute__((unused)),
482 by Brian Aker
Remove uint.
721
                               uint32_t key_length __attribute__((unused)),
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
722
                               qc_engine_callback *engine_callback,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
723
                               uint64_t *engine_data __attribute__((unused)))
1 by brian
clean slate
724
  {
725
    *engine_callback= 0;
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
726
    return true;
1 by brian
clean slate
727
  }
728
729
730
 /*
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
731
   @retval true   Primary key (if there is one) is clustered
1 by brian
clean slate
732
                  key covering all fields
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
733
   @retval false  otherwise
1 by brian
clean slate
734
 */
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
735
 virtual bool primary_key_is_clustered() { return false; }
481 by Brian Aker
Remove all of uchar.
736
 virtual int cmp_ref(const unsigned char *ref1, const unsigned char *ref2)
1 by brian
clean slate
737
 {
738
   return memcmp(ref1, ref2, ref_length);
739
 }
740
741
 /*
742
   Condition pushdown to storage engines
743
 */
744
745
 /**
746
   Push condition down to the table handler.
747
748
   @param  cond   Condition to be pushed. The condition tree must not be
749
                  modified by the by the caller.
750
751
   @return
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
754
     passed condition.
755
756
   @note
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.
762
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
765
   condition stack.
766
 */ 
767
 virtual const COND *cond_push(const COND *cond) { return cond; }
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
768
1 by brian
clean slate
769
 /**
770
   Pop the top condition from the condition stack of the handler instance.
771
772
   Pops the top if condition stack, if stack is not empty.
773
 */
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
774
 virtual void cond_pop(void) { return; }
1 by brian
clean slate
775
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
776
 virtual Item
482 by Brian Aker
Remove uint.
777
   *idx_cond_push(uint32_t keyno __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
778
                  Item* idx_cond __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
779
 { return idx_cond; }
1 by brian
clean slate
780
781
 /*
782
    Part of old fast alter table, to be depricated
783
  */
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
784
 virtual bool
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
785
   check_if_incompatible_data(HA_CREATE_INFO *create_info __attribute__((unused)),
482 by Brian Aker
Remove uint.
786
                              uint32_t table_changes __attribute__((unused)))
1 by brian
clean slate
787
 { return COMPATIBLE_DATA_NO; }
788
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
789
 /* On-line ALTER Table interface */
1 by brian
clean slate
790
791
 /**
792
    Check if a storage engine supports a particular alter table on-line
793
794
    @param    altered_table     A temporary table show what table is to
795
                                change to
796
    @param    create_info       Information from the parsing phase about new
797
                                table properties.
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
802
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
807
808
    @note
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
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
812
      implementation.
1 by brian
clean slate
813
 */
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
814
 virtual int
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
815
   check_if_supported_alter(Table *altered_table __attribute__((unused)),
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
816
                            HA_CREATE_INFO *create_info,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
817
                            HA_ALTER_FLAGS *alter_flags __attribute__((unused)),
482 by Brian Aker
Remove uint.
818
                            uint32_t table_changes)
1 by brian
clean slate
819
 {
820
   if (this->check_if_incompatible_data(create_info, table_changes)
821
       == COMPATIBLE_DATA_NO)
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
822
     return(HA_ALTER_NOT_SUPPORTED);
383.7.1 by Andrey Zhakov
Initial submit of code and tests
823
   else if ((*alter_flags & HA_ALTER_STORED_VCOL).is_set())
824
     return(HA_ALTER_NOT_SUPPORTED);
1 by brian
clean slate
825
   else
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
826
     return(HA_ALTER_SUPPORTED_WAIT_LOCK);
1 by brian
clean slate
827
 }
828
 /**
829
   Tell storage engine to prepare for the on-line alter table (pre-alter)
830
520.1.22 by Brian Aker
Second pass of thd cleanup
831
   @param     session               The thread handle
1 by brian
clean slate
832
   @param     altered_table     A temporary table show what table is to
833
                                change to
834
   @param     alter_info        Storage place for data used during phase1
835
                                and phase2
836
   @param     alter_flags       Bitmask that shows what will be changed
837
838
   @retval   0      OK
839
   @retval   error  error code passed from storage engine
840
 */
520.1.22 by Brian Aker
Second pass of thd cleanup
841
 virtual int alter_table_phase1(Session *session __attribute__((unused)),
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
842
                                Table *altered_table __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __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)))
1 by brian
clean slate
846
 {
847
   return HA_ERR_UNSUPPORTED;
848
 }
849
 /**
850
    Tell storage engine to perform the on-line alter table (alter)
851
520.1.22 by Brian Aker
Second pass of thd cleanup
852
    @param    session               The thread handle
1 by brian
clean slate
853
    @param    altered_table     A temporary table show what table is to
854
                                change to
855
    @param    alter_info        Storage place for data used during phase1
856
                                and phase2
857
    @param    alter_flags       Bitmask that shows what will be changed
858
859
    @retval  0      OK
860
    @retval  error  error code passed from storage engine
861
862
    @note
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
865
      supported.
866
 */
520.1.22 by Brian Aker
Second pass of thd cleanup
867
 virtual int alter_table_phase2(Session *session  __attribute__((unused)),
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
868
                                Table *altered_table  __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __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)))
1 by brian
clean slate
872
 {
873
   return HA_ERR_UNSUPPORTED;
874
 }
875
 /**
876
    Tell storage engine that changed frm file is now on disk and table
877
    has been re-opened (post-alter)
878
520.1.22 by Brian Aker
Second pass of thd cleanup
879
    @param    session               The thread handle
1 by brian
clean slate
880
    @param    table             The altered table, re-opened
881
 */
520.1.22 by Brian Aker
Second pass of thd cleanup
882
 virtual int alter_table_phase3(Session *session __attribute__((unused)),
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
883
                                Table *table __attribute__((unused)))
1 by brian
clean slate
884
 {
885
   return HA_ERR_UNSUPPORTED;
886
 }
887
888
  /**
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
892
  */
893
  virtual void use_hidden_primary_key();
894
895
  /**
896
    Lock table.
897
520.1.22 by Brian Aker
Second pass of thd cleanup
898
    @param    session                     Thread handle
1 by brian
clean slate
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
902
                                      0  no wait
903
                                      >0 wait timeout in milliseconds.
904
905
   @note
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.
911
912
    @retval HA_ERR_WRONG_COMMAND      Storage engine does not support
913
                                      lock_table()
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
918
  */
520.1.22 by Brian Aker
Second pass of thd cleanup
919
  virtual int lock_table(Session *session         __attribute__((unused)),
1 by brian
clean slate
920
                         int lock_type    __attribute__((unused)),
921
                         int lock_timeout __attribute__((unused)))
922
  {
923
    return HA_ERR_WRONG_COMMAND;
924
  }
383.7.1 by Andrey Zhakov
Initial submit of code and tests
925
  /*
926
    This procedure defines if the storage engine supports virtual columns.
927
    Default false means "not supported".
928
  */
929
  virtual bool check_if_supported_virtual_columns(void) 
930
  { return false; }
1 by brian
clean slate
931
932
protected:
933
  /* Service methods for use by storage engines. */
934
  void ha_statistic_increment(ulong SSV::*offset) const;
520.1.21 by Brian Aker
THD -> Session rename
935
  void **ha_data(Session *) const;
520.1.22 by Brian Aker
Second pass of thd cleanup
936
  Session *ha_session(void) const;
1 by brian
clean slate
937
938
  /**
939
    Default rename_table() and delete_table() rename/delete files with a
940
    given name and extensions from bas_ext().
941
942
    These methods can be overridden, but their default implementation
943
    provide useful functionality.
944
  */
945
  virtual int rename_table(const char *from, const char *to);
946
  /**
947
    Delete a table in the engine. Called for base as well as temporary
948
    tables.
949
  */
950
  virtual int delete_table(const char *name);
951
952
private:
953
  /* Private helpers */
954
  inline void mark_trx_read_write();
955
private:
956
  /*
957
    Low-level primitives for storage engines.  These should be
958
    overridden by the storage engine class. To call these methods, use
959
    the corresponding 'ha_*' method above.
960
  */
961
482 by Brian Aker
Remove uint.
962
  virtual int open(const char *name, int mode, uint32_t test_if_locked)=0;
963
  virtual int index_init(uint32_t idx,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
964
                         bool sorted __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
965
  { active_index= idx; return 0; }
1 by brian
clean slate
966
  virtual int index_end() { active_index= MAX_KEY; return 0; }
967
  /**
968
    rnd_init() can be called two times without rnd_end() in between
969
    (it only makes sense if scan=1).
970
    then the second call should prepare for the new table scan (e.g
971
    if rnd_init allocates the cursor, second call should position it
972
    to the start of the table, no need to deallocate and allocate it again
973
  */
974
  virtual int rnd_init(bool scan)= 0;
975
  virtual int rnd_end() { return 0; }
481 by Brian Aker
Remove all of uchar.
976
  virtual int write_row(unsigned char *buf __attribute__((unused)))
977
  {
978
    return HA_ERR_WRONG_COMMAND;
979
  }
980
981
  virtual int update_row(const unsigned char *old_data __attribute__((unused)),
982
                         unsigned char *new_data __attribute__((unused)))
983
  {
984
    return HA_ERR_WRONG_COMMAND;
985
  }
986
987
  virtual int delete_row(const unsigned char *buf __attribute__((unused)))
1 by brian
clean slate
988
  {
989
    return HA_ERR_WRONG_COMMAND;
990
  }
991
  /**
992
    Reset state of file to after 'open'.
993
    This function is called after every statement for all tables used
994
    by that statement.
995
  */
996
  virtual int reset() { return 0; }
997
  virtual Table_flags table_flags(void) const= 0;
998
999
  /**
1000
    Is not invoked for non-transactional temporary tables.
1001
1002
    Tells the storage engine that we intend to read or write data
1003
    from the table. This call is prefixed with a call to handler::store_lock()
1004
    and is invoked only for those handler instances that stored the lock.
1005
1006
    Calls to rnd_init/index_init are prefixed with this call. When table
1007
    IO is complete, we call external_lock(F_UNLCK).
1008
    A storage engine writer should expect that each call to
1009
    ::external_lock(F_[RD|WR]LOCK is followed by a call to
1010
    ::external_lock(F_UNLCK). If it is not, it is a bug in MySQL.
1011
1012
    The name and signature originate from the first implementation
1013
    in MyISAM, which would call fcntl to set/clear an advisory
1014
    lock on the data file in this method.
1015
1016
    @param   lock_type    F_RDLCK, F_WRLCK, F_UNLCK
1017
1018
    @return  non-0 in case of failure, 0 in case of success.
1019
    When lock_type is F_UNLCK, the return value is ignored.
1020
  */
520.1.22 by Brian Aker
Second pass of thd cleanup
1021
  virtual int external_lock(Session *session __attribute__((unused)),
1 by brian
clean slate
1022
                            int lock_type __attribute__((unused)))
1023
  {
1024
    return 0;
1025
  }
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
1026
  virtual void release_auto_increment(void) { return; };
1 by brian
clean slate
1027
  /** admin commands - called from mysql_admin_table */
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1028
  virtual int check_for_upgrade(HA_CHECK_OPT *check_opt __attribute__((unused)))
1 by brian
clean slate
1029
  { return 0; }
520.1.22 by Brian Aker
Second pass of thd cleanup
1030
  virtual int check(Session* session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1031
                    HA_CHECK_OPT* check_opt __attribute__((unused)))
1 by brian
clean slate
1032
  { return HA_ADMIN_NOT_IMPLEMENTED; }
1033
1034
  /**
1035
     In this method check_opt can be modified
1036
     to specify CHECK option to use to call check()
1037
     upon the table.
1038
  */
520.1.22 by Brian Aker
Second pass of thd cleanup
1039
  virtual int repair(Session* session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1040
                     HA_CHECK_OPT* check_opt __attribute__((unused)))
1 by brian
clean slate
1041
  { return HA_ADMIN_NOT_IMPLEMENTED; }
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1042
  virtual void start_bulk_insert(ha_rows rows __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
1043
  {}
1044
  virtual int end_bulk_insert(void) { return 0; }
481 by Brian Aker
Remove all of uchar.
1045
  virtual int index_read(unsigned char * buf __attribute__((unused)),
1046
                         const unsigned char * key __attribute__((unused)),
482 by Brian Aker
Remove uint.
1047
                         uint32_t key_len __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1048
                         enum ha_rkey_function find_flag __attribute__((unused)))
1 by brian
clean slate
1049
   { return  HA_ERR_WRONG_COMMAND; }
481 by Brian Aker
Remove all of uchar.
1050
  virtual int index_read_last(unsigned char * buf __attribute__((unused)),
1051
                              const unsigned char * key __attribute__((unused)),
482 by Brian Aker
Remove uint.
1052
                              uint32_t key_len __attribute__((unused)))
1 by brian
clean slate
1053
   { return (my_errno= HA_ERR_WRONG_COMMAND); }
1054
  /**
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.
1059
1060
    @param    old_data       Old record
1061
    @param    new_data       New record
1062
    @param    dup_key_found  Number of duplicate keys found
1063
1064
    @retval  0   Bulk delete used by handler
1065
    @retval  1   Bulk delete not used, normal operation used
1066
  */
481 by Brian Aker
Remove all of uchar.
1067
  virtual int bulk_update_row(const unsigned char *old_data __attribute__((unused)),
1068
                              unsigned char *new_data __attribute__((unused)),
482 by Brian Aker
Remove uint.
1069
                              uint32_t *dup_key_found __attribute__((unused)))
1 by brian
clean slate
1070
  {
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
1071
    assert(false);
1 by brian
clean slate
1072
    return HA_ERR_WRONG_COMMAND;
1073
  }
1074
  /**
1075
    This is called to delete all rows in a table
1076
    If the handler don't support this, then this function will
1077
    return HA_ERR_WRONG_COMMAND and MySQL will delete the rows one
1078
    by one.
1079
  */
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
1080
  virtual int delete_all_rows(void)
1 by brian
clean slate
1081
  { return (my_errno=HA_ERR_WRONG_COMMAND); }
1082
  /**
1083
    Reset the auto-increment counter to the given value, i.e. the next row
1084
    inserted will get the given value. This is called e.g. after TRUNCATE
1085
    is emulated by doing a 'DELETE FROM t'. HA_ERR_WRONG_COMMAND is
1086
    returned by storage engines that don't support this operation.
1087
  */
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1088
  virtual int reset_auto_increment(uint64_t value __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
1089
  { return HA_ERR_WRONG_COMMAND; }
520.1.22 by Brian Aker
Second pass of thd cleanup
1090
  virtual int optimize(Session* session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1091
                       HA_CHECK_OPT* check_opt __attribute__((unused)))
1092
  { return HA_ADMIN_NOT_IMPLEMENTED; }
520.1.22 by Brian Aker
Second pass of thd cleanup
1093
  virtual int analyze(Session* session __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1094
                      HA_CHECK_OPT* check_opt __attribute__((unused)))
1095
  { return HA_ADMIN_NOT_IMPLEMENTED; }
520.1.22 by Brian Aker
Second pass of thd cleanup
1096
  virtual bool check_and_repair(Session *session __attribute__((unused)))
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
1097
  { return true; }
482 by Brian Aker
Remove uint.
1098
  virtual int disable_indexes(uint32_t mode __attribute__((unused)))
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1099
  { return HA_ERR_WRONG_COMMAND; }
482 by Brian Aker
Remove uint.
1100
  virtual int enable_indexes(uint32_t mode __attribute__((unused)))
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1101
  { return HA_ERR_WRONG_COMMAND; }
1102
  virtual int discard_or_import_tablespace(bool discard __attribute__((unused)))
1 by brian
clean slate
1103
  { return (my_errno=HA_ERR_WRONG_COMMAND); }
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
1104
  virtual void prepare_for_alter(void) { return; }
1 by brian
clean slate
1105
  virtual void drop_table(const char *name);
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1106
  virtual int create(const char *name __attribute__((unused)),
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1107
                     Table *form __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1108
                     HA_CREATE_INFO *info __attribute__((unused)))=0;
1 by brian
clean slate
1109
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
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)))
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
1114
  { return false; }
1 by brian
clean slate
1115
};
1116
1117
1118
1119
/**
1120
  A Disk-Sweep MRR interface implementation
1121
1122
  This implementation makes range (and, in the future, 'ref') scans to read
1123
  table rows in disk sweeps. 
1124
  
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.
1127
*/
1128
1129
class DsMrr_impl
1130
{
1131
public:
1132
  typedef void (handler::*range_check_toggle_func_t)(bool on);
1133
1134
  DsMrr_impl()
1135
    : h2(NULL) {};
1136
1137
  handler *h; /* The "owner" handler object. It is used for scanning the index */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1138
  Table *table; /* Always equal to h->table */
1 by brian
clean slate
1139
private:
1140
  /*
1141
    Secondary handler object. It is used to retrieve full table rows by
1142
    calling rnd_pos().
1143
  */
1144
  handler *h2;
1145
1146
  /* Buffer to store rowids, or (rowid, range_id) pairs */
481 by Brian Aker
Remove all of uchar.
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 */
1 by brian
clean slate
1151
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
1152
  bool dsmrr_eof; /* true <=> We have reached EOF when reading index tuples */
1 by brian
clean slate
1153
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
1154
  /* true <=> need range association, buffer holds {rowid, range_id} pairs */
1 by brian
clean slate
1155
  bool is_mrr_assoc;
1156
51.1.77 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
1157
  bool use_default_impl; /* true <=> shortcut all calls to default MRR impl */
1 by brian
clean slate
1158
public:
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1159
  void init(handler *h_arg, Table *table_arg)
1 by brian
clean slate
1160
  {
1161
    h= h_arg; 
1162
    table= table_arg;
1163
  }
1164
  int dsmrr_init(handler *h, KEY *key, RANGE_SEQ_IF *seq_funcs, 
482 by Brian Aker
Remove uint.
1165
                 void *seq_init_param, uint32_t n_ranges, uint32_t mode, 
1 by brian
clean slate
1166
                 HANDLER_BUFFER *buf);
1167
  void dsmrr_close();
1168
  int dsmrr_fill_buffer(handler *h);
1169
  int dsmrr_next(handler *h, char **range_info);
1170
482 by Brian Aker
Remove uint.
1171
  int dsmrr_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys, uint32_t *bufsz,
1172
                 uint32_t *flags, COST_VECT *cost);
1 by brian
clean slate
1173
482 by Brian Aker
Remove uint.
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);
1 by brian
clean slate
1177
private:
482 by Brian Aker
Remove uint.
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, 
1 by brian
clean slate
1180
                       COST_VECT *cost);
482 by Brian Aker
Remove uint.
1181
  bool get_disk_sweep_mrr_cost(uint32_t keynr, ha_rows rows, uint32_t flags, 
1182
                               uint32_t *buffer_size, COST_VECT *cost);
1 by brian
clean slate
1183
};
1184
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;
61 by Brian Aker
Conversion of handler type.
1190
extern uint32_t total_ha, total_ha_2pc;
1 by brian
clean slate
1191
1192
       /* Wrapper functions */
520.1.22 by Brian Aker
Second pass of thd cleanup
1193
#define ha_commit(session) (ha_commit_trans((session), true))
1194
#define ha_rollback(session) (ha_rollback_trans((session), true))
1 by brian
clean slate
1195
1196
/* basic stuff */
1197
int ha_init_errors(void);
1198
int ha_init(void);
1199
int ha_end(void);
1200
int ha_initialize_handlerton(st_plugin_int *plugin);
1201
int ha_finalize_handlerton(st_plugin_int *plugin);
1202
1203
TYPELIB *ha_known_exts(void);
520.1.22 by Brian Aker
Second pass of thd cleanup
1204
void ha_close_connection(Session* session);
1 by brian
clean slate
1205
bool ha_flush_logs(handlerton *db_type);
1206
void ha_drop_database(char* path);
520.1.22 by Brian Aker
Second pass of thd cleanup
1207
int ha_create_table(Session *session, const char *path,
1 by brian
clean slate
1208
                    const char *db, const char *table_name,
1209
                    HA_CREATE_INFO *create_info,
1210
                    bool update_create_info);
590.1.7 by Stewart Smith
remove mysql_frm_type
1211
int ha_delete_table(Session *session, const char *path,
1 by brian
clean slate
1212
                    const char *db, const char *alias, bool generate_warning);
1213
1214
/* statistics and info */
520.1.22 by Brian Aker
Second pass of thd cleanup
1215
bool ha_show_status(Session *session, handlerton *db_type, enum ha_stat_type stat);
1 by brian
clean slate
1216
1217
/* discovery */
520.1.22 by Brian Aker
Second pass of thd cleanup
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,
481 by Brian Aker
Remove all of uchar.
1220
                unsigned char** frmblob, size_t* frmlen);
520.1.22 by Brian Aker
Second pass of thd cleanup
1221
int ha_find_files(Session *session,const char *db,const char *path,
1 by brian
clean slate
1222
                  const char *wild, bool dir, List<LEX_STRING>* files);
520.1.22 by Brian Aker
Second pass of thd cleanup
1223
int ha_table_exists_in_engine(Session* session, const char* db, const char* name);
1 by brian
clean slate
1224
1225
/* key cache */
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);
1231
1232
/* report to InnoDB that control passes to the client */
520.1.22 by Brian Aker
Second pass of thd cleanup
1233
int ha_release_temporary_latches(Session *session);
1 by brian
clean slate
1234
1235
/* transactions: interface to handlerton functions */
520.1.22 by Brian Aker
Second pass of thd cleanup
1236
int ha_start_consistent_snapshot(Session *session);
1 by brian
clean slate
1237
int ha_commit_or_rollback_by_xid(XID *xid, bool commit);
520.1.22 by Brian Aker
Second pass of thd cleanup
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);
1 by brian
clean slate
1241
int ha_recover(HASH *commit_list);
1242
1243
/* transactions: these functions never call handlerton functions directly */
520.1.22 by Brian Aker
Second pass of thd cleanup
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);
1 by brian
clean slate
1247
1248
/* savepoints */
520.1.22 by Brian Aker
Second pass of thd cleanup
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);
1 by brian
clean slate
1252
1253
/* these are called by storage engines */
520.1.22 by Brian Aker
Second pass of thd cleanup
1254
void trans_register_ha(Session *session, bool all, handlerton *ht);
1 by brian
clean slate
1255
520.6.7 by Monty Taylor
Moved a bunch of crap out of common_includes.
1256
void table_case_convert(char * name, uint32_t length);
1257
const char *table_case_name(HA_CREATE_INFO *info, const char *name);
1258
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);
1265
1266
575.1.3 by Monty Taylor
Moved some stuff out of handler.h.
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);
1274
1 by brian
clean slate
1275
/*
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
1279
*/
520.1.22 by Brian Aker
Second pass of thd cleanup
1280
#define trans_need_2pc(session, all)                   ((total_ha_2pc > 1) && \
1281
        !((all ? &session->transaction.all : &session->transaction.stmt)->no_2pc))
520.6.4 by Monty Taylor
Moved thr_lock.h out of common_includes.
1282
575.4.7 by Monty Taylor
More header cleanup.
1283
1284
bool mysql_xa_recover(Session *session);
1285
1286
SORT_FIELD * make_unireg_sortorder(order_st *order, uint32_t *length,
1287
                                   SORT_FIELD *sortorder);
1288
int setup_order(Session *session, Item **ref_pointer_array, TableList *tables,
1289
                List<Item> &fields, List <Item> &all_fields, order_st *order);
1290
int setup_group(Session *session, Item **ref_pointer_array, TableList *tables,
1291
                List<Item> &fields, List<Item> &all_fields, order_st *order,
1292
                bool *hidden_group_fields);
1293
bool fix_inner_refs(Session *session, List<Item> &all_fields, SELECT_LEX *select,
1294
                    Item **ref_pointer_array);
1295
1296
bool handle_select(Session *session, LEX *lex, select_result *result,
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);
1311
bool mysql_handle_derived(LEX *lex, bool (*processor)(Session *session,
1312
                                                      LEX *lex,
1313
                                                      TableList *table));
1314
bool mysql_derived_prepare(Session *session, LEX *lex, TableList *t);
1315
bool mysql_derived_filling(Session *session, LEX *lex, TableList *t);
1316
void sp_prepare_create_field(Session *session, Create_field *sql_field);
1317
int prepare_create_field(Create_field *sql_field,
1318
                         uint32_t *blob_columns,
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,
1322
                        HA_CREATE_INFO *create_info,
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,
1327
                                HA_CREATE_INFO *create_info,
1328
                                Alter_info *alter_info,
1329
                                bool tmp_table, uint32_t select_field_count,
1330
                                bool lock_open_lock);
1331
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);
1344
bool mysql_prepare_update(Session *session, TableList *table_list,
1345
                          Item **conds, uint32_t order_num, order_st *order);
1346
int mysql_update(Session *session,TableList *tables,List<Item> &fields,
1347
                 List<Item> &values,COND *conds,
1348
                 uint32_t order_num, order_st *order, ha_rows limit,
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);
1355
bool mysql_prepare_insert(Session *session, TableList *table_list, Table *table,
1356
                          List<Item> &fields, List_item *values,
1357
                          List<Item> &update_fields,
1358
                          List<Item> &update_values, enum_duplicates duplic,
1359
                          COND **where, bool select_insert,
1360
                          bool check_fields, bool abort_on_warning);
1361
bool mysql_insert(Session *session,TableList *table,List<Item> &fields,
1362
                  List<List_item> &values, List<Item> &update_fields,
1363
                  List<Item> &update_values, enum_duplicates flag,
1364
                  bool ignore);
1365
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1366
                                           TableList *table_list);
1367
void prepare_triggers_for_insert_stmt(Table *table);
1368
int mysql_prepare_delete(Session *session, TableList *table_list, Item **conds);
1369
bool mysql_delete(Session *session, TableList *table_list, COND *conds,
1370
                  SQL_LIST *order, ha_rows rows, uint64_t options,
1371
                  bool reset_auto_increment);
1372
bool mysql_truncate(Session *session, TableList *table_list, bool dont_send_ok);
1373
uint32_t create_table_def_key(Session *session, char *key, TableList *table_list,
1374
                              bool tmp_table);
1375
TABLE_SHARE *get_table_share(Session *session, TableList *table_list, char *key,
1376
                             uint32_t key_length, uint32_t db_flags, int *error);
1377
void release_table_share(TABLE_SHARE *share, enum release_type type);
1378
TABLE_SHARE *get_cached_table_share(const char *db, const char *table_name);
1379
Table *open_ltable(Session *session, TableList *table_list, thr_lock_type update,
1380
                   uint32_t lock_flags);
1381
Table *open_table(Session *session, TableList *table_list, bool *refresh, uint32_t flags);
1382
bool name_lock_locked_table(Session *session, TableList *tables);
1383
bool reopen_name_locked_table(Session* session, TableList* table_list, bool link_in);
1384
Table *table_cache_insert_placeholder(Session *session, const char *key,
1385
                                      uint32_t key_length);
1386
bool lock_table_name_if_not_cached(Session *session, const char *db,
1387
                                   const char *table_name, Table **table);
1388
Table *find_locked_table(Session *session, const char *db,const char *table_name);
1389
void detach_merge_children(Table *table, bool clear_refs);
1390
bool fix_merge_after_open(TableList *old_child_list, TableList **old_last,
1391
                          TableList *new_child_list, TableList **new_last);
1392
bool reopen_table(Table *table);
1393
bool reopen_tables(Session *session,bool get_locks,bool in_refresh);
1394
void close_data_files_and_morph_locks(Session *session, const char *db,
1395
                                      const char *table_name);
1396
void close_handle_and_leave_table_as_lock(Table *table);
1397
bool open_new_frm(Session *session, TABLE_SHARE *share, const char *alias,
1398
                  uint32_t db_stat, uint32_t prgflag,
1399
                  uint32_t ha_open_flags, Table *outparam,
1400
                  TableList *table_desc, MEM_ROOT *mem_root);
1401
bool wait_for_tables(Session *session);
1402
bool table_is_used(Table *table, bool wait_for_name_lock);
1403
Table *drop_locked_tables(Session *session,const char *db, const char *table_name);
1404
void abort_locked_tables(Session *session,const char *db, const char *table_name);
1405
void execute_init_command(Session *session, sys_var_str *init_command_var,
1406
                          rw_lock_t *var_mutex);
1407
extern Field *not_found_field;
1408
extern Field *view_ref_found;
1409
1410
Field *
1411
find_field_in_tables(Session *session, Item_ident *item,
1412
                     TableList *first_table, TableList *last_table,
1413
                     Item **ref, find_item_error_report_type report_error,
1414
                     bool check_privileges, bool register_tree_change);
1415
Field *
1416
find_field_in_table_ref(Session *session, TableList *table_list,
1417
                        const char *name, uint32_t length,
1418
                        const char *item_name, const char *db_name,
1419
                        const char *table_name, Item **ref,
1420
                        bool check_privileges, bool allow_rowid,
1421
                        uint32_t *cached_field_index_ptr,
1422
                        bool register_tree_change, TableList **actual_table);
1423
Field *
1424
find_field_in_table(Session *session, Table *table, const char *name, uint32_t length,
1425
                    bool allow_rowid, uint32_t *cached_field_index_ptr);
1426
Field *
1427
find_field_in_table_sef(Table *table, const char *name);
1428
int update_virtual_fields_marked_for_write(Table *table,
1429
                                           bool ignore_stored=true);
1430
1431
520.6.4 by Monty Taylor
Moved thr_lock.h out of common_includes.
1432
#endif /* DRIZZLED_HANDLER_H */