~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to server/handler.h

  • Committer: Brian Aker
  • Date: 2008-07-18 22:05:16 UTC
  • Revision ID: brian@tangent.org-20080718220516-dzyjle0iqqjssphx
Dead debug code removal (and a compatible "never used") bit in the
optimizer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
/* Copyright (C) 2000-2006 MySQL AB
 
2
 
 
3
   This program is free software; you can redistribute it and/or modify
 
4
   it under the terms of the GNU General Public License as published by
 
5
   the Free Software Foundation; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
19
15
 
20
16
 
21
17
/* Definitions for parameters to do with handler-routines */
24
20
#pragma interface                       /* gcc class implementation */
25
21
#endif
26
22
 
27
 
#include <mysys/my_handler.h>
28
 
#include <storage/myisam/keycache.h>
 
23
#include <my_handler.h>
 
24
#include <keycache.h>
29
25
 
30
26
#ifndef NO_HASH
31
27
#define NO_HASH                         /* Not yet implemented */
49
45
#define HA_ADMIN_NEEDS_CHECK    -12
50
46
 
51
47
/* Bits to show what an alter table will do */
52
 
#include <drizzled/sql_bitmap.h>
 
48
#include <sql_bitmap.h>
53
49
 
54
50
#define HA_MAX_ALTER_FLAGS 39
55
51
typedef Bitmap<HA_MAX_ALTER_FLAGS> HA_ALTER_FLAGS;
111
107
  row to be able to find the row later.
112
108
*/
113
109
#define HA_REC_NOT_IN_SEQ      (1 << 3)
114
 
 
 
110
/* This is now a dead option, just left for compatibility */
 
111
#define HA_CAN_GEOMETRY        (1 << 4)
115
112
/*
116
113
  Reading keys in random order is as fast as reading keys in sort order
117
114
  (Used in records.cc to decide if we should use a record cache and by
131
128
#define HA_REQUIRE_PRIMARY_KEY (1 << 12) /* .. and can't create a hidden one */
132
129
#define HA_STATS_RECORDS_IS_EXACT (1 << 13) /* stats.records is exact */
133
130
/*
 
131
  INSERT_DELAYED only works with handlers that uses MySQL internal table
 
132
  level locks
 
133
*/
 
134
#define HA_CAN_INSERT_DELAYED  (1 << 14)
 
135
/*
134
136
  If we get the primary key columns for free when we do an index read
135
137
  It also implies that we have to retrive the primary key when using
136
138
  position() and rnd_pos().
141
143
  uses a primary key. Without primary key, we can't call position().
142
144
*/ 
143
145
#define HA_PRIMARY_KEY_REQUIRED_FOR_POSITION (1 << 16) 
 
146
#define HA_CAN_RTREEKEYS       (1 << 17) /* Historical, no longer supported */
144
147
#define HA_NOT_DELETE_WITH_CACHE (1 << 18)
145
148
/*
146
149
  The following is we need to a primary key to delete (and update) a row.
148
151
*/
149
152
#define HA_PRIMARY_KEY_REQUIRED_FOR_DELETE (1 << 19)
150
153
#define HA_NO_PREFIX_CHAR_KEYS (1 << 20)
 
154
#define HA_CAN_FULLTEXT        (1 << 21) /* Historical, no longer supported */
 
155
#define HA_CAN_SQL_HANDLER     (1 << 22) /* Historical, no longer supported */
151
156
#define HA_NO_AUTO_INCREMENT   (1 << 23)
152
157
#define HA_HAS_CHECKSUM        (1 << 24)
153
158
/* Table data are stored in separate files (for lower_case_table_names) */
154
159
#define HA_FILE_BASED          (1 << 26)
 
160
#define HA_NO_VARCHAR          (1 << 27) /* Historical, no longer supported */
 
161
#define HA_CAN_BIT_FIELD       (1 << 28) /* Historical, no longer supported */
155
162
#define HA_NEED_READ_RANGE_BUFFER (1 << 29) /* for read_multi_range */
156
163
#define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30)
157
 
#define HA_NO_COPY_ON_ALTER    (INT64_C(1) << 31)
158
 
#define HA_HAS_RECORDS         (INT64_C(1) << 32) /* records() gives exact count*/
159
 
#define HA_MRR_CANT_SORT       (INT64_C(1) << 34)
 
164
#define HA_NO_COPY_ON_ALTER    (1LL << 31)
 
165
#define HA_HAS_RECORDS         (1LL << 32) /* records() gives exact count*/
 
166
/* Has it's own method of binlog logging */
 
167
#define HA_HAS_OWN_BINLOGGING  (1LL << 33) /* Historical, no longer supported */
 
168
#define HA_MRR_CANT_SORT       (1LL << 34)
160
169
 
161
170
/*
162
171
  Engine is capable of row-format and statement-format logging,
163
172
  respectively
164
173
*/
165
 
#define HA_BINLOG_ROW_CAPABLE  (INT64_C(1) << 35)
166
 
#define HA_BINLOG_STMT_CAPABLE (INT64_C(1) << 36)
 
174
#define HA_BINLOG_ROW_CAPABLE  (1LL << 35)
 
175
#define HA_BINLOG_STMT_CAPABLE (1LL << 36)
167
176
 
168
 
#define HA_ONLINE_ALTER        (INT64_C(1) << 37)
 
177
#define HA_ONLINE_ALTER        (1LL << 37)
169
178
 
170
179
/*
171
180
  Set of all binlog flags. Currently only contain the capabilities
204
213
  set.
205
214
  This is actually removed even before it was introduced the first time.
206
215
  The new idea is that handlers will handle the lock level already in
207
 
  store_lock for ALTER Table partitions.
 
216
  store_lock for ALTER TABLE partitions.
208
217
 
209
218
  HA_PARTITION_ONE_PHASE is a flag that can be set by handlers that take
210
219
  care of changing the partitions online and in one phase. Thus all phases
250
259
#define HA_BLOCK_LOCK           256     /* unlock when reading some records */
251
260
#define HA_OPEN_TEMPORARY       512
252
261
 
253
 
/* For transactional LOCK Table. handler::lock_table() */
 
262
/* For transactional LOCK TABLE. handler::lock_table() */
254
263
#define HA_LOCK_IN_SHARE_MODE      F_RDLCK
255
264
#define HA_LOCK_IN_EXCLUSIVE_MODE  F_WRLCK
256
265
 
272
281
#define HA_CACHE_TBL_TRANSACT    4
273
282
 
274
283
/* Options of START TRANSACTION statement (and later of SET TRANSACTION stmt) */
275
 
#define DRIZZLE_START_TRANS_OPT_WITH_CONS_SNAPSHOT 1
 
284
#define MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT 1
276
285
 
277
286
/* Flags for method is_fatal_error */
278
287
#define HA_CHECK_DUP_KEY 1
281
290
 
282
291
enum legacy_db_type
283
292
{
284
 
  DB_TYPE_UNKNOWN=0,
 
293
  DB_TYPE_UNKNOWN=0,DB_TYPE_DIAB_ISAM=1,
 
294
  DB_TYPE_HASH,DB_TYPE_MISAM,DB_TYPE_PISAM,
 
295
  DB_TYPE_RMS_ISAM, DB_TYPE_HEAP, DB_TYPE_ISAM,
 
296
  DB_TYPE_MRG_ISAM, DB_TYPE_MYISAM, DB_TYPE_MRG_MYISAM,
 
297
  DB_TYPE_BERKELEY_DB, DB_TYPE_INNODB,
 
298
  DB_TYPE_GEMINI, DB_TYPE_NDBCLUSTER,
 
299
  DB_TYPE_EXAMPLE_DB, DB_TYPE_ARCHIVE_DB, DB_TYPE_CSV_DB,
 
300
  DB_TYPE_FEDERATED_DB,
 
301
  DB_TYPE_BLACKHOLE_DB,
 
302
  DB_TYPE_PARTITION_DB,
 
303
  DB_TYPE_BINLOG,
 
304
  DB_TYPE_SOLID,
 
305
  DB_TYPE_PBXT,
 
306
  DB_TYPE_TABLE_FUNCTION,
 
307
  DB_TYPE_MEMCACHE,
 
308
  DB_TYPE_FALCON,
 
309
  DB_TYPE_MARIA,
285
310
  DB_TYPE_FIRST_DYNAMIC=42,
286
311
  DB_TYPE_DEFAULT=127 // Must be last
287
312
};
317
342
 
318
343
/* Bits in used_fields */
319
344
#define HA_CREATE_USED_AUTO             (1L << 0)
320
 
#ifdef DEAD_OPTIONS
321
345
#define HA_CREATE_USED_RAID             (1L << 1) /* Historical, no longer supported */
322
346
#define HA_CREATE_USED_UNION            (1L << 2)
323
 
#define HA_CREATE_USED_PASSWORD         (1L << 17)
324
 
#endif
325
347
#define HA_CREATE_USED_INSERT_METHOD    (1L << 3)
326
348
#define HA_CREATE_USED_MIN_ROWS         (1L << 4)
327
349
#define HA_CREATE_USED_MAX_ROWS         (1L << 5)
336
358
#define HA_CREATE_USED_DELAY_KEY_WRITE  (1L << 14)
337
359
#define HA_CREATE_USED_ROW_FORMAT       (1L << 15)
338
360
#define HA_CREATE_USED_COMMENT          (1L << 16)
 
361
#define HA_CREATE_USED_PASSWORD         (1L << 17)
339
362
#define HA_CREATE_USED_CONNECTION       (1L << 18)
340
363
#define HA_CREATE_USED_KEY_BLOCK_SIZE   (1L << 19)
 
364
#define HA_CREATE_USED_TRANSACTIONAL    (1L << 20)
341
365
#define HA_CREATE_USED_PAGE_CHECKSUM    (1L << 21)
342
 
#define HA_CREATE_USED_BLOCK_SIZE       (1L << 22)
343
366
 
344
367
typedef uint64_t my_xid; // this line is the same as in log_event.h
345
 
#define DRIZZLE_XID_PREFIX "MySQLXid"
346
 
#define DRIZZLE_XID_PREFIX_LEN 8 // must be a multiple of 8
347
 
#define DRIZZLE_XID_OFFSET (DRIZZLE_XID_PREFIX_LEN+sizeof(server_id))
348
 
#define DRIZZLE_XID_GTRID_LEN (DRIZZLE_XID_OFFSET+sizeof(my_xid))
 
368
#define MYSQL_XID_PREFIX "MySQLXid"
 
369
#define MYSQL_XID_PREFIX_LEN 8 // must be a multiple of 8
 
370
#define MYSQL_XID_OFFSET (MYSQL_XID_PREFIX_LEN+sizeof(server_id))
 
371
#define MYSQL_XID_GTRID_LEN (MYSQL_XID_OFFSET+sizeof(my_xid))
349
372
 
350
 
#define XIDDATASIZE DRIZZLE_XIDDATASIZE
 
373
#define XIDDATASIZE MYSQL_XIDDATASIZE
351
374
#define MAXGTRIDSIZE 64
352
375
#define MAXBQUALSIZE 64
353
376
 
354
377
#define COMPATIBLE_DATA_YES 0
355
378
#define COMPATIBLE_DATA_NO  1
356
379
 
357
 
typedef bool (*qc_engine_callback)(THD *thd, char *table_key,
358
 
                                      uint32_t key_length,
359
 
                                      uint64_t *engine_data);
360
 
 
361
380
/**
362
381
  struct xid_t is binary compatible with the XID structure as
363
382
  in the X/Open CAE Specification, Distributed Transaction Processing:
364
383
  The XA Specification, X/Open Company Ltd., 1991.
365
384
  http://www.opengroup.org/bookstore/catalog/c193.htm
366
385
 
367
 
  @see DRIZZLE_XID in mysql/plugin.h
 
386
  @see MYSQL_XID in mysql/plugin.h
368
387
*/
369
388
struct xid_t {
370
389
  long formatID;
389
408
  {
390
409
    my_xid tmp;
391
410
    formatID= 1;
392
 
    set(DRIZZLE_XID_PREFIX_LEN, 0, DRIZZLE_XID_PREFIX);
393
 
    memcpy(data+DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id));
 
411
    set(MYSQL_XID_PREFIX_LEN, 0, MYSQL_XID_PREFIX);
 
412
    memcpy(data+MYSQL_XID_PREFIX_LEN, &server_id, sizeof(server_id));
394
413
    tmp= xid;
395
 
    memcpy(data+DRIZZLE_XID_OFFSET, &tmp, sizeof(tmp));
396
 
    gtrid_length=DRIZZLE_XID_GTRID_LEN;
 
414
    memcpy(data+MYSQL_XID_OFFSET, &tmp, sizeof(tmp));
 
415
    gtrid_length=MYSQL_XID_GTRID_LEN;
397
416
  }
398
417
  void set(long g, long b, const char *d)
399
418
  {
407
426
  my_xid quick_get_my_xid()
408
427
  {
409
428
    my_xid tmp;
410
 
    memcpy(&tmp, data+DRIZZLE_XID_OFFSET, sizeof(tmp));
 
429
    memcpy(&tmp, data+MYSQL_XID_OFFSET, sizeof(tmp));
411
430
    return tmp;
412
431
  }
413
432
  my_xid get_my_xid()
414
433
  {
415
 
    return gtrid_length == DRIZZLE_XID_GTRID_LEN && bqual_length == 0 &&
416
 
           !memcmp(data+DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id)) &&
417
 
           !memcmp(data, DRIZZLE_XID_PREFIX, DRIZZLE_XID_PREFIX_LEN) ?
 
434
    return gtrid_length == MYSQL_XID_GTRID_LEN && bqual_length == 0 &&
 
435
           !memcmp(data+MYSQL_XID_PREFIX_LEN, &server_id, sizeof(server_id)) &&
 
436
           !memcmp(data, MYSQL_XID_PREFIX, MYSQL_XID_PREFIX_LEN) ?
418
437
           quick_get_my_xid() : 0;
419
438
  }
420
 
  uint32_t length()
 
439
  uint length()
421
440
  {
422
441
    return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+
423
442
           gtrid_length+bqual_length;
424
443
  }
425
 
  unsigned char *key()
 
444
  uchar *key()
426
445
  {
427
 
    return (unsigned char *)&gtrid_length;
 
446
    return (uchar *)&gtrid_length;
428
447
  }
429
 
  uint32_t key_length()
 
448
  uint key_length()
430
449
  {
431
450
    return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length;
432
451
  }
439
458
 
440
459
struct handlerton;
441
460
 
442
 
/* The handler for a table type.  Will be included in the Table structure */
 
461
/* The handler for a table type.  Will be included in the TABLE structure */
443
462
 
444
 
class Table;
 
463
struct st_table;
 
464
typedef struct st_table TABLE;
445
465
typedef struct st_table_share TABLE_SHARE;
446
466
struct st_foreign_key_info;
447
467
typedef struct st_foreign_key_info FOREIGN_KEY_INFO;
448
 
typedef bool (stat_print_fn)(THD *thd, const char *type, uint32_t type_len,
449
 
                             const char *file, uint32_t file_len,
450
 
                             const char *status, uint32_t status_len);
 
468
typedef bool (stat_print_fn)(THD *thd, const char *type, uint type_len,
 
469
                             const char *file, uint file_len,
 
470
                             const char *status, uint status_len);
451
471
enum ha_stat_type { HA_ENGINE_STATUS, HA_ENGINE_LOGS, HA_ENGINE_MUTEX };
452
472
extern st_plugin_int *hton2plugin[MAX_HA];
453
473
 
483
503
 
484
504
   slot number is initialized by MySQL after xxx_init() is called.
485
505
   */
486
 
   uint32_t slot;
 
506
   uint slot;
487
507
   /*
488
508
     to store per-savepoint data storage engine is provided with an area
489
509
     of a requested size (0 is ok here).
493
513
     area and need not be used by storage engine.
494
514
     see binlog_hton and binlog_savepoint_set/rollback for an example.
495
515
   */
496
 
   uint32_t savepoint_offset;
 
516
   uint savepoint_offset;
497
517
   /*
498
518
     handlerton methods:
499
519
 
524
544
   int  (*commit)(handlerton *hton, THD *thd, bool all);
525
545
   int  (*rollback)(handlerton *hton, THD *thd, bool all);
526
546
   int  (*prepare)(handlerton *hton, THD *thd, bool all);
527
 
   int  (*recover)(handlerton *hton, XID *xid_list, uint32_t len);
 
547
   int  (*recover)(handlerton *hton, XID *xid_list, uint len);
528
548
   int  (*commit_by_xid)(handlerton *hton, XID *xid);
529
549
   int  (*rollback_by_xid)(handlerton *hton, XID *xid);
530
550
   void *(*create_cursor_read_view)(handlerton *hton, THD *thd);
532
552
   void (*close_cursor_read_view)(handlerton *hton, THD *thd, void *read_view);
533
553
   handler *(*create)(handlerton *hton, TABLE_SHARE *table, MEM_ROOT *mem_root);
534
554
   void (*drop_database)(handlerton *hton, char* path);
 
555
   int (*panic)(handlerton *hton, enum ha_panic_function flag);
535
556
   int (*start_consistent_snapshot)(handlerton *hton, THD *thd);
536
557
   bool (*flush_logs)(handlerton *hton);
537
558
   bool (*show_status)(handlerton *hton, THD *thd, stat_print_fn *print, enum ha_stat_type stat);
538
559
   int (*fill_files_table)(handlerton *hton, THD *thd,
539
 
                           TableList *tables,
 
560
                           TABLE_LIST *tables,
540
561
                           class Item *cond);
541
 
   uint32_t flags;                                /* global handler flags */
 
562
   uint32 flags;                                /* global handler flags */
542
563
   int (*release_temporary_latches)(handlerton *hton, THD *thd);
543
564
 
544
565
   int (*discover)(handlerton *hton, THD* thd, const char *db, 
545
566
                   const char *name,
546
 
                   unsigned char **frmblob, 
 
567
                   uchar **frmblob, 
547
568
                   size_t *frmlen);
548
569
   int (*table_exists_in_engine)(handlerton *hton, THD* thd, const char *db,
549
570
                                 const char *name);
550
 
   uint32_t license; /* Flag for Engine License */
 
571
   uint32 license; /* Flag for Engine License */
551
572
   void *data; /* Location for engines to keep personal structures */
552
573
};
553
574
 
698
719
    Not-null only if this instance is a part of transaction.
699
720
    May assume a combination of enum values above.
700
721
  */
701
 
  unsigned char       m_flags;
 
722
  uchar       m_flags;
702
723
};
703
724
 
704
725
 
705
726
enum enum_tx_isolation { ISO_READ_UNCOMMITTED, ISO_READ_COMMITTED,
706
727
                         ISO_REPEATABLE_READ, ISO_SERIALIZABLE};
707
728
 
 
729
 
 
730
enum ndb_distribution { ND_KEYHASH= 0, ND_LINHASH= 1 };
 
731
 
 
732
 
708
733
typedef struct {
709
734
  uint64_t data_file_length;
710
735
  uint64_t max_data_file_length;
722
747
class Item;
723
748
struct st_table_log_memory_entry;
724
749
 
725
 
#define NOT_A_PARTITION_ID ((uint32_t)-1)
 
750
#define NOT_A_PARTITION_ID ((uint32)-1)
726
751
 
727
752
enum ha_choice { HA_CHOICE_UNDEF, HA_CHOICE_NO, HA_CHOICE_YES };
728
753
 
729
754
typedef struct st_ha_create_information
730
755
{
731
 
  const CHARSET_INFO *table_charset, *default_table_charset;
 
756
  CHARSET_INFO *table_charset, *default_table_charset;
732
757
  LEX_STRING connect_string;
733
758
  LEX_STRING comment;
734
759
  const char *data_file_name, *index_file_name;
739
764
  uint32_t avg_row_length;
740
765
  uint32_t used_fields;
741
766
  uint32_t key_block_size;
742
 
  uint32_t block_size;
 
767
  SQL_LIST merge_list;
743
768
  handlerton *db_type;
744
769
  enum row_type row_type;
745
 
  uint32_t null_bits;                       /* NULL bits at start of record */
746
 
  uint32_t options;                             /* OR of HA_CREATE_ options */
747
 
  uint32_t extra_size;                      /* length of extra data segment */
 
770
  uint null_bits;                       /* NULL bits at start of record */
 
771
  uint options;                         /* OR of HA_CREATE_ options */
 
772
  uint merge_insert_method;
 
773
  uint extra_size;                      /* length of extra data segment */
 
774
  /* 0 not used, 1 if not transactional, 2 if transactional */
 
775
  enum ha_choice transactional;
748
776
  bool table_existed;                   /* 1 in create if table existed */
749
777
  bool frm_only;                        /* 1 if no ha_create_table() */
750
778
  bool varchar;                         /* 1 if table has a VARCHAR */
754
782
typedef struct st_ha_alter_information
755
783
{
756
784
  KEY  *key_info_buffer;
757
 
  uint32_t key_count;
758
 
  uint32_t index_drop_count;
759
 
  uint32_t *index_drop_buffer;
760
 
  uint32_t index_add_count;
761
 
  uint32_t *index_add_buffer;
 
785
  uint key_count;
 
786
  uint index_drop_count;
 
787
  uint *index_drop_buffer;
 
788
  uint index_add_count;
 
789
  uint *index_add_buffer;
762
790
  void *data;
763
791
} HA_ALTER_INFO;
764
792
 
792
820
  TABLEOP_HOOKS() {}
793
821
  virtual ~TABLEOP_HOOKS() {}
794
822
 
795
 
  inline void prelock(Table **tables, uint32_t count)
 
823
  inline void prelock(TABLE **tables, uint count)
796
824
  {
797
825
    do_prelock(tables, count);
798
826
  }
799
827
 
800
 
  inline int postlock(Table **tables, uint32_t count)
 
828
  inline int postlock(TABLE **tables, uint count)
801
829
  {
802
830
    return do_postlock(tables, count);
803
831
  }
804
832
private:
805
833
  /* Function primitive that is called prior to locking tables */
806
 
  virtual void do_prelock(Table **tables __attribute__((unused)),
807
 
                          uint32_t count __attribute__((unused)))
 
834
  virtual void do_prelock(TABLE **tables __attribute__((__unused__)),
 
835
                          uint count __attribute__((__unused__)))
808
836
  {
809
837
    /* Default is to do nothing */
810
838
  }
817
845
 
818
846
     @return Error code or zero.
819
847
   */
820
 
  virtual int do_postlock(Table **tables __attribute__((unused)),
821
 
                          uint32_t count __attribute__((unused)))
 
848
  virtual int do_postlock(TABLE **tables __attribute__((__unused__)),
 
849
                          uint count __attribute__((__unused__)))
822
850
  {
823
851
    return 0;                           /* Default is to do nothing */
824
852
  }
835
863
{
836
864
  st_ha_check_opt() {}                        /* Remove gcc warning */
837
865
  uint32_t sort_buffer_size;
838
 
  uint32_t flags;       /* isam layer flags (e.g. for myisamchk) */
839
 
  uint32_t sql_flags;   /* sql layer flags - for something myisamchk cannot do */
 
866
  uint flags;       /* isam layer flags (e.g. for myisamchk) */
 
867
  uint sql_flags;   /* sql layer flags - for something myisamchk cannot do */
840
868
  KEY_CACHE *key_cache; /* new key cache when changing key cache */
841
869
  void init();
842
870
} HA_CHECK_OPT;
852
880
 
853
881
typedef struct st_handler_buffer
854
882
{
855
 
  unsigned char *buffer;         /* Buffer one can start using */
856
 
  unsigned char *buffer_end;     /* End of buffer */
857
 
  unsigned char *end_of_used_area;     /* End of area that was used by handler */
 
883
  uchar *buffer;         /* Buffer one can start using */
 
884
  uchar *buffer_end;     /* End of buffer */
 
885
  uchar *end_of_used_area;     /* End of area that was used by handler */
858
886
} HANDLER_BUFFER;
859
887
 
860
888
typedef struct system_status_var SSV;
876
904
    RETURN
877
905
      An opaque value to be used as RANGE_SEQ_IF::next() parameter
878
906
  */
879
 
  range_seq_t (*init)(void *init_params, uint32_t n_ranges, uint32_t flags);
 
907
  range_seq_t (*init)(void *init_params, uint n_ranges, uint flags);
880
908
 
881
909
 
882
910
  /*
891
919
      0 - Ok, the range structure filled with info about the next range
892
920
      1 - No more ranges
893
921
  */
894
 
  uint32_t (*next) (range_seq_t seq, KEY_MULTI_RANGE *range);
 
922
  uint (*next) (range_seq_t seq, KEY_MULTI_RANGE *range);
895
923
} RANGE_SEQ_IF;
896
924
 
897
 
uint16_t &mrr_persistent_flag_storage(range_seq_t seq, uint32_t idx);
898
 
char* &mrr_get_ptr_by_idx(range_seq_t seq, uint32_t idx);
 
925
uint16 &mrr_persistent_flag_storage(range_seq_t seq, uint idx);
 
926
char* &mrr_get_ptr_by_idx(range_seq_t seq, uint idx);
899
927
 
900
928
class COST_VECT
901
929
949
977
  }
950
978
};
951
979
 
952
 
void get_sweep_read_cost(Table *table, ha_rows nrows, bool interrupted, 
 
980
void get_sweep_read_cost(TABLE *table, ha_rows nrows, bool interrupted, 
953
981
                         COST_VECT *cost);
954
982
 
955
983
/*
1021
1049
  time_t create_time;                   /* When table was created */
1022
1050
  time_t check_time;
1023
1051
  time_t update_time;
1024
 
  uint32_t block_size;                  /* index block size */
 
1052
  uint block_size;                      /* index block size */
1025
1053
 
1026
1054
  ha_statistics():
1027
1055
    data_file_length(0), max_data_file_length(0),
1031
1059
  {}
1032
1060
};
1033
1061
 
1034
 
uint32_t calculate_key_len(Table *, uint, const unsigned char *, key_part_map);
 
1062
uint calculate_key_len(TABLE *, uint, const uchar *, key_part_map);
1035
1063
/*
1036
1064
  bitmap with first N+1 bits set
1037
1065
  (keypart_map for a key prefix of [0..N] keyparts)
1097
1125
  typedef uint64_t Table_flags;
1098
1126
protected:
1099
1127
  struct st_table_share *table_share;   /* The table definition */
1100
 
  Table *table;               /* The current open table */
 
1128
  struct st_table *table;               /* The current open table */
1101
1129
  Table_flags cached_table_flags;       /* Set on init() and open() */
1102
1130
 
1103
1131
  ha_rows estimation_rows_to_insert;
1104
1132
public:
1105
1133
  handlerton *ht;                 /* storage engine of this handler */
1106
 
  unsigned char *ref;                           /* Pointer to current row */
1107
 
  unsigned char *dup_ref;                       /* Pointer to duplicate row */
 
1134
  uchar *ref;                           /* Pointer to current row */
 
1135
  uchar *dup_ref;                       /* Pointer to duplicate row */
1108
1136
 
1109
1137
  ha_statistics stats;
1110
1138
  /** MultiRangeRead-related members: */
1111
1139
  range_seq_t mrr_iter;    /* Interator to traverse the range sequence */
1112
1140
  RANGE_SEQ_IF mrr_funcs;  /* Range sequence traversal functions */
1113
1141
  HANDLER_BUFFER *multi_range_buffer; /* MRR buffer info */
1114
 
  uint32_t ranges_in_seq; /* Total number of ranges in the traversed sequence */
 
1142
  uint ranges_in_seq; /* Total number of ranges in the traversed sequence */
1115
1143
  /* true <=> source MRR ranges and the output are ordered */
1116
1144
  bool mrr_is_output_sorted;
1117
1145
 
1131
1159
  */
1132
1160
  bool in_range_check_pushed_down;
1133
1161
 
1134
 
  uint32_t errkey;                              /* Last dup key */
1135
 
  uint32_t key_used_on_scan;
1136
 
  uint32_t active_index;
 
1162
  uint errkey;                          /* Last dup key */
 
1163
  uint key_used_on_scan;
 
1164
  uint active_index;
1137
1165
  /** Length of ref (1-8 or the clustered key length) */
1138
 
  uint32_t ref_length;
 
1166
  uint ref_length;
1139
1167
  enum {NONE=0, INDEX, RND} inited;
1140
1168
  bool locked;
1141
1169
  bool implicit_emptied;                /* Can be !=0 only if HEAP */
1142
1170
  const Item *pushed_cond;
1143
1171
 
1144
1172
  Item *pushed_idx_cond;
1145
 
  uint32_t pushed_idx_cond_keyno;  /* The index which the above condition is for */
 
1173
  uint pushed_idx_cond_keyno;  /* The index which the above condition is for */
1146
1174
 
1147
1175
  /**
1148
1176
    next_insert_id is the next value which should be inserted into the
1191
1219
  }
1192
1220
  /* ha_ methods: pubilc wrappers for private virtual API */
1193
1221
 
1194
 
  int ha_open(Table *table, const char *name, int mode, int test_if_locked);
1195
 
  int ha_index_init(uint32_t idx, bool sorted)
 
1222
  int ha_open(TABLE *table, const char *name, int mode, int test_if_locked);
 
1223
  int ha_index_init(uint idx, bool sorted)
1196
1224
  {
1197
1225
    int result;
1198
1226
    assert(inited==NONE);
1235
1263
    and delete_row() below.
1236
1264
  */
1237
1265
  int ha_external_lock(THD *thd, int lock_type);
1238
 
  int ha_write_row(unsigned char * buf);
1239
 
  int ha_update_row(const unsigned char * old_data, unsigned char * new_data);
1240
 
  int ha_delete_row(const unsigned char * buf);
 
1266
  int ha_write_row(uchar * buf);
 
1267
  int ha_update_row(const uchar * old_data, uchar * new_data);
 
1268
  int ha_delete_row(const uchar * buf);
1241
1269
  void ha_release_auto_increment();
1242
1270
 
1243
1271
  int ha_check_for_upgrade(HA_CHECK_OPT *check_opt);
1254
1282
    estimation_rows_to_insert= 0;
1255
1283
    return end_bulk_insert();
1256
1284
  }
1257
 
  int ha_bulk_update_row(const unsigned char *old_data, unsigned char *new_data,
1258
 
                         uint32_t *dup_key_found);
 
1285
  int ha_bulk_update_row(const uchar *old_data, uchar *new_data,
 
1286
                         uint *dup_key_found);
1259
1287
  int ha_delete_all_rows();
1260
1288
  int ha_reset_auto_increment(uint64_t value);
1261
1289
  int ha_optimize(THD* thd, HA_CHECK_OPT* check_opt);
1262
1290
  int ha_analyze(THD* thd, HA_CHECK_OPT* check_opt);
1263
1291
  bool ha_check_and_repair(THD *thd);
1264
 
  int ha_disable_indexes(uint32_t mode);
1265
 
  int ha_enable_indexes(uint32_t mode);
1266
 
  int ha_discard_or_import_tablespace(bool discard);
 
1292
  int ha_disable_indexes(uint mode);
 
1293
  int ha_enable_indexes(uint mode);
 
1294
  int ha_discard_or_import_tablespace(my_bool discard);
1267
1295
  void ha_prepare_for_alter();
1268
1296
  int ha_rename_table(const char *from, const char *to);
1269
1297
  int ha_delete_table(const char *name);
1270
1298
  void ha_drop_table(const char *name);
1271
1299
 
1272
 
  int ha_create(const char *name, Table *form, HA_CREATE_INFO *info);
 
1300
  int ha_create(const char *name, TABLE *form, HA_CREATE_INFO *info);
1273
1301
 
1274
1302
  int ha_create_handler_files(const char *name, const char *old_name,
1275
1303
                              int action_flag, HA_CREATE_INFO *info);
1276
1304
 
1277
1305
  void adjust_next_insert_id_after_explicit_value(uint64_t nr);
1278
1306
  int update_auto_increment();
1279
 
  void print_keydup_error(uint32_t key_nr, const char *msg);
 
1307
  void print_keydup_error(uint key_nr, const char *msg);
1280
1308
  virtual void print_error(int error, myf errflag);
1281
1309
  virtual bool get_error_message(int error, String *buf);
1282
 
  uint32_t get_dup_key(int error);
1283
 
  virtual void change_table_ptr(Table *table_arg, TABLE_SHARE *share)
 
1310
  uint get_dup_key(int error);
 
1311
  virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share)
1284
1312
  {
1285
1313
    table= table_arg;
1286
1314
    table_share= share;
1288
1316
  /* Estimates calculation */
1289
1317
  virtual double scan_time(void)
1290
1318
  { return uint64_t2double(stats.data_file_length) / IO_SIZE + 2; }
1291
 
  virtual double read_time(uint32_t index __attribute__((unused)),
1292
 
                           uint32_t ranges, ha_rows rows)
 
1319
  virtual double read_time(uint index __attribute__((__unused__)),
 
1320
                           uint ranges, ha_rows rows)
1293
1321
  { return rows2double(ranges+rows); }
1294
1322
 
1295
 
  virtual double index_only_read_time(uint32_t keynr, double records);
 
1323
  virtual double index_only_read_time(uint keynr, double records);
1296
1324
  
1297
 
  virtual ha_rows multi_range_read_info_const(uint32_t keyno, RANGE_SEQ_IF *seq,
 
1325
  virtual ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq,
1298
1326
                                              void *seq_init_param, 
1299
 
                                              uint32_t n_ranges, uint32_t *bufsz,
1300
 
                                              uint32_t *flags, COST_VECT *cost);
1301
 
  virtual int multi_range_read_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys,
1302
 
                                    uint32_t *bufsz, uint32_t *flags, COST_VECT *cost);
 
1327
                                              uint n_ranges, uint *bufsz,
 
1328
                                              uint *flags, COST_VECT *cost);
 
1329
  virtual int multi_range_read_info(uint keyno, uint n_ranges, uint keys,
 
1330
                                    uint *bufsz, uint *flags, COST_VECT *cost);
1303
1331
  virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
1304
 
                                    uint32_t n_ranges, uint32_t mode,
 
1332
                                    uint n_ranges, uint mode,
1305
1333
                                    HANDLER_BUFFER *buf);
1306
1334
  virtual int multi_range_read_next(char **range_info);
1307
1335
 
1309
1337
  virtual const key_map *keys_to_use_for_scanning() { return &key_map_empty; }
1310
1338
  bool has_transactions()
1311
1339
  { return (ha_table_flags() & HA_NO_TRANSACTIONS) == 0; }
1312
 
  virtual uint32_t extra_rec_buf_length() const { return 0; }
 
1340
  virtual uint extra_rec_buf_length() const { return 0; }
1313
1341
 
1314
1342
  /**
1315
1343
    This method is used to analyse the error to see whether the error
1321
1349
    same thing as HA_ERR_FOUND_DUP_KEY but can in some cases lead to
1322
1350
    a slightly different error message.
1323
1351
  */
1324
 
  virtual bool is_fatal_error(int error, uint32_t flags)
 
1352
  virtual bool is_fatal_error(int error, uint flags)
1325
1353
  {
1326
1354
    if (!error ||
1327
1355
        ((flags & HA_CHECK_DUP_KEY) &&
1351
1379
  */
1352
1380
  virtual enum row_type get_row_type() const { return ROW_TYPE_NOT_USED; }
1353
1381
 
1354
 
  virtual const char *index_type(uint32_t key_number __attribute__((unused)))
 
1382
  virtual const char *index_type(uint key_number __attribute__((__unused__)))
1355
1383
  { assert(0); return "";}
1356
1384
 
1357
1385
 
1363
1391
    as there may be several calls to this routine.
1364
1392
  */
1365
1393
  virtual void column_bitmaps_signal();
1366
 
  uint32_t get_index(void) const { return active_index; }
 
1394
  uint get_index(void) const { return active_index; }
1367
1395
  virtual int close(void)=0;
1368
1396
 
1369
1397
  /**
1387
1415
    @retval  0           Success
1388
1416
    @retval  >0          Error code
1389
1417
  */
1390
 
  virtual int exec_bulk_update(uint32_t *dup_key_found __attribute__((unused)))
 
1418
  virtual int exec_bulk_update(uint *dup_key_found __attribute__((__unused__)))
1391
1419
  {
1392
1420
    assert(false);
1393
1421
    return HA_ERR_WRONG_COMMAND;
1414
1442
     row if available. If the key value is null, begin at the first key of the
1415
1443
     index.
1416
1444
  */
1417
 
  virtual int index_read_map(unsigned char * buf, const unsigned char * key,
 
1445
  virtual int index_read_map(uchar * buf, const uchar * key,
1418
1446
                             key_part_map keypart_map,
1419
1447
                             enum ha_rkey_function find_flag)
1420
1448
  {
1421
 
    uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
 
1449
    uint key_len= calculate_key_len(table, active_index, key, keypart_map);
1422
1450
    return  index_read(buf, key, key_len, find_flag);
1423
1451
  }
1424
1452
  /**
1427
1455
     row if available. If the key value is null, begin at the first key of the
1428
1456
     index.
1429
1457
  */
1430
 
  virtual int index_read_idx_map(unsigned char * buf, uint32_t index, const unsigned char * key,
 
1458
  virtual int index_read_idx_map(uchar * buf, uint index, const uchar * key,
1431
1459
                                 key_part_map keypart_map,
1432
1460
                                 enum ha_rkey_function find_flag);
1433
 
  virtual int index_next(unsigned char * buf __attribute__((unused)))
1434
 
   { return  HA_ERR_WRONG_COMMAND; }
1435
 
  virtual int index_prev(unsigned char * buf __attribute__((unused)))
1436
 
   { return  HA_ERR_WRONG_COMMAND; }
1437
 
  virtual int index_first(unsigned char * buf __attribute__((unused)))
1438
 
   { return  HA_ERR_WRONG_COMMAND; }
1439
 
  virtual int index_last(unsigned char * buf __attribute__((unused)))
1440
 
   { return  HA_ERR_WRONG_COMMAND; }
1441
 
  virtual int index_next_same(unsigned char *buf __attribute__((unused)),
1442
 
                              const unsigned char *key __attribute__((unused)),
1443
 
                              uint32_t keylen __attribute__((unused)));
 
1461
  virtual int index_next(uchar * buf __attribute__((__unused__)))
 
1462
   { return  HA_ERR_WRONG_COMMAND; }
 
1463
  virtual int index_prev(uchar * buf __attribute__((__unused__)))
 
1464
   { return  HA_ERR_WRONG_COMMAND; }
 
1465
  virtual int index_first(uchar * buf __attribute__((__unused__)))
 
1466
   { return  HA_ERR_WRONG_COMMAND; }
 
1467
  virtual int index_last(uchar * buf __attribute__((__unused__)))
 
1468
   { return  HA_ERR_WRONG_COMMAND; }
 
1469
  virtual int index_next_same(uchar *buf __attribute__((__unused__)),
 
1470
                              const uchar *key __attribute__((__unused__)),
 
1471
                              uint keylen __attribute__((__unused__)));
1444
1472
  /**
1445
1473
     @brief
1446
1474
     The following functions works like index_read, but it find the last
1447
1475
     row with the current key value or prefix.
1448
1476
  */
1449
 
  virtual int index_read_last_map(unsigned char * buf, const unsigned char * key,
 
1477
  virtual int index_read_last_map(uchar * buf, const uchar * key,
1450
1478
                                  key_part_map keypart_map)
1451
1479
  {
1452
 
    uint32_t key_len= calculate_key_len(table, active_index, key, keypart_map);
 
1480
    uint key_len= calculate_key_len(table, active_index, key, keypart_map);
1453
1481
    return index_read_last(buf, key, key_len);
1454
1482
  }
1455
1483
  virtual int read_range_first(const key_range *start_key,
1458
1486
  virtual int read_range_next();
1459
1487
  int compare_key(key_range *range);
1460
1488
  int compare_key2(key_range *range);
1461
 
  virtual int rnd_next(unsigned char *buf __attribute__((unused)))=0;
1462
 
  virtual int rnd_pos(unsigned char * buf __attribute__((unused)),
1463
 
                      unsigned char *pos __attribute__((unused)))=0;
 
1489
  virtual int rnd_next(uchar *buf __attribute__((__unused__)))=0;
 
1490
  virtual int rnd_pos(uchar * buf __attribute__((__unused__)),
 
1491
                      uchar *pos __attribute__((__unused__)))=0;
1464
1492
  /**
1465
1493
    One has to use this method when to find
1466
1494
    random position by record as the plain
1467
1495
    position() call doesn't work for some
1468
1496
    handlers for random position.
1469
1497
  */
1470
 
  virtual int rnd_pos_by_record(unsigned char *record);
1471
 
  virtual int read_first_row(unsigned char *buf, uint32_t primary_key);
 
1498
  virtual int rnd_pos_by_record(uchar *record);
 
1499
  virtual int read_first_row(uchar *buf, uint primary_key);
1472
1500
  /**
1473
1501
    The following function is only needed for tables that may be temporary
1474
1502
    tables during joins.
1475
1503
  */
1476
 
  virtual int restart_rnd_next(unsigned char *buf __attribute__((unused)),
1477
 
                               unsigned char *pos __attribute__((unused)))
1478
 
    { return HA_ERR_WRONG_COMMAND; }
1479
 
  virtual int rnd_same(unsigned char *buf __attribute__((unused)),
1480
 
                       uint32_t inx __attribute__((unused)))
1481
 
    { return HA_ERR_WRONG_COMMAND; }
1482
 
  virtual ha_rows records_in_range(uint32_t inx __attribute__((unused)),
1483
 
                                   key_range *min_key __attribute__((unused)),
1484
 
                                   key_range *max_key __attribute__((unused)))
 
1504
  virtual int restart_rnd_next(uchar *buf __attribute__((__unused__)),
 
1505
                               uchar *pos __attribute__((__unused__)))
 
1506
    { return HA_ERR_WRONG_COMMAND; }
 
1507
  virtual int rnd_same(uchar *buf __attribute__((__unused__)),
 
1508
                       uint inx __attribute__((__unused__)))
 
1509
    { return HA_ERR_WRONG_COMMAND; }
 
1510
  virtual ha_rows records_in_range(uint inx __attribute__((__unused__)),
 
1511
                                   key_range *min_key __attribute__((__unused__)),
 
1512
                                   key_range *max_key __attribute__((__unused__)))
1485
1513
    { return (ha_rows) 10; }
1486
 
  virtual void position(const unsigned char *record)=0;
 
1514
  virtual void position(const uchar *record)=0;
1487
1515
  virtual int info(uint)=0; // see my_base.h for full description
1488
 
  virtual uint32_t calculate_key_hash_value(Field **field_array __attribute__((unused)))
 
1516
  virtual uint32 calculate_key_hash_value(Field **field_array __attribute__((__unused__)))
1489
1517
  { assert(0); return 0; }
1490
 
  virtual int extra(enum ha_extra_function operation __attribute__((unused)))
 
1518
  virtual int extra(enum ha_extra_function operation __attribute__((__unused__)))
1491
1519
  { return 0; }
1492
1520
  virtual int extra_opt(enum ha_extra_function operation,
1493
 
                        uint32_t cache_size __attribute__((unused)))
 
1521
                        uint32_t cache_size __attribute__((__unused__)))
1494
1522
  { return extra(operation); }
1495
1523
 
1496
1524
  /**
1514
1542
  */
1515
1543
  virtual void try_semi_consistent_read(bool) {}
1516
1544
  virtual void unlock_row(void) {}
1517
 
  virtual int start_stmt(THD *thd __attribute__((unused)),
1518
 
                         thr_lock_type lock_type __attribute__((unused)))
 
1545
  virtual int start_stmt(THD *thd __attribute__((__unused__)),
 
1546
                         thr_lock_type lock_type __attribute__((__unused__)))
1519
1547
  {return 0;}
1520
1548
  virtual void get_auto_increment(uint64_t offset, uint64_t increment,
1521
1549
                                  uint64_t nb_desired_values,
1541
1569
      insert_id_for_cur_row;
1542
1570
  }
1543
1571
 
1544
 
  virtual void update_create_info(HA_CREATE_INFO *create_info __attribute__((unused))) {}
 
1572
  virtual void update_create_info(HA_CREATE_INFO *create_info __attribute__((__unused__))) {}
1545
1573
  int check_old_types(void);
1546
 
  virtual int assign_to_keycache(THD* thd __attribute__((unused)),
1547
 
                                 HA_CHECK_OPT* check_opt __attribute__((unused)))
 
1574
  virtual int assign_to_keycache(THD* thd __attribute__((__unused__)),
 
1575
                                 HA_CHECK_OPT* check_opt __attribute__((__unused__)))
1548
1576
  { return HA_ADMIN_NOT_IMPLEMENTED; }
1549
1577
  /* end of the list of admin commands */
1550
1578
 
1551
1579
  virtual int indexes_are_disabled(void) {return 0;}
1552
1580
  virtual char *update_table_comment(const char * comment)
1553
1581
  { return (char*) comment;}
1554
 
  virtual void append_create_info(String *packet __attribute__((unused)))
 
1582
  virtual void append_create_info(String *packet __attribute__((__unused__)))
1555
1583
  {}
1556
1584
  /**
1557
1585
      If index == MAX_KEY then a check for table is made and if index <
1563
1591
    @retval   true            Foreign key defined on table or index
1564
1592
    @retval   false           No foreign key defined
1565
1593
  */
1566
 
  virtual bool is_fk_defined_on_table_or_index(uint32_t index __attribute__((unused)))
 
1594
  virtual bool is_fk_defined_on_table_or_index(uint index __attribute__((__unused__)))
1567
1595
  { return false; }
1568
1596
  virtual char* get_foreign_key_create_info(void)
1569
1597
  { return(NULL);}  /* gets foreign key create string from InnoDB */
1570
 
  /** used in ALTER Table; 1 if changing storage engine is allowed */
 
1598
  /** used in ALTER TABLE; 1 if changing storage engine is allowed */
1571
1599
  virtual bool can_switch_engines(void) { return 1; }
1572
1600
  /** used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
1573
 
  virtual int get_foreign_key_list(THD *thd __attribute__((unused)),
1574
 
                                   List<FOREIGN_KEY_INFO> *f_key_list __attribute__((unused)))
 
1601
  virtual int get_foreign_key_list(THD *thd __attribute__((__unused__)),
 
1602
                                   List<FOREIGN_KEY_INFO> *f_key_list __attribute__((__unused__)))
1575
1603
  { return 0; }
1576
 
  virtual uint32_t referenced_by_foreign_key() { return 0;}
 
1604
  virtual uint referenced_by_foreign_key() { return 0;}
1577
1605
  virtual void init_table_handle_for_HANDLER()
1578
1606
  { return; }       /* prepare InnoDB for HANDLER */
1579
 
  virtual void free_foreign_key_create_info(char* str __attribute__((unused))) {}
 
1607
  virtual void free_foreign_key_create_info(char* str __attribute__((__unused__))) {}
1580
1608
  /** The following can be called without an open handler */
1581
1609
  virtual const char *table_type() const =0;
1582
1610
  /**
1588
1616
    and data file), the order of elements is relevant. First element of engine
1589
1617
    file name extentions array should be meta/index file extention. Second
1590
1618
    element - data file extention. This order is assumed by
1591
 
    prepare_for_repair() when REPAIR Table ... USE_FRM is issued.
 
1619
    prepare_for_repair() when REPAIR TABLE ... USE_FRM is issued.
1592
1620
  */
1593
1621
  virtual const char **bas_ext() const =0;
1594
1622
 
1595
 
  virtual int get_default_no_partitions(HA_CREATE_INFO *info __attribute__((unused))) { return 1;}
1596
 
  virtual bool get_no_parts(const char *name __attribute__((unused)),
1597
 
                            uint32_t *no_parts)
 
1623
  virtual int get_default_no_partitions(HA_CREATE_INFO *info __attribute__((__unused__))) { return 1;}
 
1624
  virtual bool get_no_parts(const char *name __attribute__((__unused__)),
 
1625
                            uint *no_parts)
1598
1626
  {
1599
1627
    *no_parts= 0;
1600
1628
    return 0;
1601
1629
  }
1602
1630
 
1603
 
  virtual uint32_t index_flags(uint32_t idx, uint32_t part, bool all_parts) const =0;
1604
 
 
1605
 
  virtual int add_index(Table *table_arg __attribute__((unused)),
1606
 
                        KEY *key_info __attribute__((unused)),
1607
 
                        uint32_t num_of_keys __attribute__((unused)))
1608
 
  { return (HA_ERR_WRONG_COMMAND); }
1609
 
  virtual int prepare_drop_index(Table *table_arg __attribute__((unused)),
1610
 
                                 uint32_t *key_num __attribute__((unused)),
1611
 
                                 uint32_t num_of_keys __attribute__((unused)))
1612
 
  { return (HA_ERR_WRONG_COMMAND); }
1613
 
  virtual int final_drop_index(Table *table_arg __attribute__((unused)))
1614
 
  { return (HA_ERR_WRONG_COMMAND); }
1615
 
 
1616
 
  uint32_t max_record_length() const
1617
 
  { return cmin((unsigned int)HA_MAX_REC_LENGTH, max_supported_record_length()); }
1618
 
  uint32_t max_keys() const
1619
 
  { return cmin((unsigned int)MAX_KEY, max_supported_keys()); }
1620
 
  uint32_t max_key_parts() const
1621
 
  { return cmin((unsigned int)MAX_REF_PARTS, max_supported_key_parts()); }
1622
 
  uint32_t max_key_length() const
1623
 
  { return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_length()); }
1624
 
  uint32_t max_key_part_length(void) const
1625
 
  { return cmin((unsigned int)MAX_KEY_LENGTH, max_supported_key_part_length()); }
1626
 
 
1627
 
  virtual uint32_t max_supported_record_length(void) const
 
1631
  virtual uint32_t index_flags(uint idx, uint part, bool all_parts) const =0;
 
1632
 
 
1633
  virtual int add_index(TABLE *table_arg __attribute__((__unused__)),
 
1634
                        KEY *key_info __attribute__((__unused__)),
 
1635
                        uint num_of_keys __attribute__((__unused__)))
 
1636
  { return (HA_ERR_WRONG_COMMAND); }
 
1637
  virtual int prepare_drop_index(TABLE *table_arg __attribute__((__unused__)),
 
1638
                                 uint *key_num __attribute__((__unused__)),
 
1639
                                 uint num_of_keys __attribute__((__unused__)))
 
1640
  { return (HA_ERR_WRONG_COMMAND); }
 
1641
  virtual int final_drop_index(TABLE *table_arg __attribute__((__unused__)))
 
1642
  { return (HA_ERR_WRONG_COMMAND); }
 
1643
 
 
1644
  uint max_record_length() const
 
1645
  { return min(HA_MAX_REC_LENGTH, max_supported_record_length()); }
 
1646
  uint max_keys() const
 
1647
  { return min(MAX_KEY, max_supported_keys()); }
 
1648
  uint max_key_parts() const
 
1649
  { return min(MAX_REF_PARTS, max_supported_key_parts()); }
 
1650
  uint max_key_length() const
 
1651
  { return min(MAX_KEY_LENGTH, max_supported_key_length()); }
 
1652
  uint max_key_part_length(void) const
 
1653
  { return min(MAX_KEY_LENGTH, max_supported_key_part_length()); }
 
1654
 
 
1655
  virtual uint max_supported_record_length(void) const
1628
1656
  { return HA_MAX_REC_LENGTH; }
1629
 
  virtual uint32_t max_supported_keys(void) const { return 0; }
1630
 
  virtual uint32_t max_supported_key_parts(void) const { return MAX_REF_PARTS; }
1631
 
  virtual uint32_t max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
1632
 
  virtual uint32_t max_supported_key_part_length(void) const { return 255; }
1633
 
  virtual uint32_t min_record_length(uint32_t options __attribute__((unused))) const
 
1657
  virtual uint max_supported_keys(void) const { return 0; }
 
1658
  virtual uint max_supported_key_parts(void) const { return MAX_REF_PARTS; }
 
1659
  virtual uint max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
 
1660
  virtual uint max_supported_key_part_length(void) const { return 255; }
 
1661
  virtual uint min_record_length(uint options __attribute__((__unused__))) const
1634
1662
  { return 1; }
1635
1663
 
1636
1664
  virtual bool low_byte_first(void) const { return 1; }
1637
 
  virtual uint32_t checksum(void) const { return 0; }
 
1665
  virtual uint checksum(void) const { return 0; }
1638
1666
  virtual bool is_crashed(void) const  { return 0; }
1639
1667
  virtual bool auto_repair(void) const { return 0; }
1640
1668
 
1647
1675
  /**
1648
1676
    @note lock_count() can return > 1 if the table is MERGE or partitioned.
1649
1677
  */
1650
 
  virtual uint32_t lock_count(void) const { return 1; }
 
1678
  virtual uint lock_count(void) const { return 1; }
1651
1679
  /**
1652
1680
    Is not invoked for non-transactional temporary tables.
1653
1681
 
1666
1694
                                     enum thr_lock_type lock_type)=0;
1667
1695
 
1668
1696
  /** Type of table for caching query */
1669
 
  virtual uint8_t table_cache_type() { return HA_CACHE_TBL_NONTRANSACT; }
 
1697
  virtual uint8 table_cache_type() { return HA_CACHE_TBL_NONTRANSACT; }
1670
1698
 
1671
1699
 
1672
1700
  /**
1699
1727
        cached
1700
1728
  */
1701
1729
 
1702
 
  virtual bool
1703
 
    register_query_cache_table(THD *thd __attribute__((unused)),
1704
 
                               char *table_key __attribute__((unused)),
1705
 
                               uint32_t key_length __attribute__((unused)),
 
1730
  virtual my_bool
 
1731
    register_query_cache_table(THD *thd __attribute__((__unused__)),
 
1732
                               char *table_key __attribute__((__unused__)),
 
1733
                               uint key_length __attribute__((__unused__)),
1706
1734
                               qc_engine_callback *engine_callback,
1707
 
                               uint64_t *engine_data __attribute__((unused)))
 
1735
                               uint64_t *engine_data __attribute__((__unused__)))
1708
1736
  {
1709
1737
    *engine_callback= 0;
1710
1738
    return true;
1717
1745
   @retval false  otherwise
1718
1746
 */
1719
1747
 virtual bool primary_key_is_clustered() { return false; }
1720
 
 virtual int cmp_ref(const unsigned char *ref1, const unsigned char *ref2)
 
1748
 virtual int cmp_ref(const uchar *ref1, const uchar *ref2)
1721
1749
 {
1722
1750
   return memcmp(ref1, ref2, ref_length);
1723
1751
 }
1758
1786
 virtual void cond_pop(void) { return; }
1759
1787
 
1760
1788
 virtual Item
1761
 
   *idx_cond_push(uint32_t keyno __attribute__((unused)),
1762
 
                  Item* idx_cond __attribute__((unused)))
 
1789
   *idx_cond_push(uint keyno __attribute__((__unused__)),
 
1790
                  Item* idx_cond __attribute__((__unused__)))
1763
1791
 { return idx_cond; }
1764
1792
 
1765
1793
 /*
1766
1794
    Part of old fast alter table, to be depricated
1767
1795
  */
1768
1796
 virtual bool
1769
 
   check_if_incompatible_data(HA_CREATE_INFO *create_info __attribute__((unused)),
1770
 
                              uint32_t table_changes __attribute__((unused)))
 
1797
   check_if_incompatible_data(HA_CREATE_INFO *create_info __attribute__((__unused__)),
 
1798
                              uint table_changes __attribute__((__unused__)))
1771
1799
 { return COMPATIBLE_DATA_NO; }
1772
1800
 
1773
 
 /* On-line ALTER Table interface */
 
1801
 /* On-line ALTER TABLE interface */
1774
1802
 
1775
1803
 /**
1776
1804
    Check if a storage engine supports a particular alter table on-line
1796
1824
      implementation.
1797
1825
 */
1798
1826
 virtual int
1799
 
   check_if_supported_alter(Table *altered_table __attribute__((unused)),
 
1827
   check_if_supported_alter(TABLE *altered_table __attribute__((__unused__)),
1800
1828
                            HA_CREATE_INFO *create_info,
1801
 
                            HA_ALTER_FLAGS *alter_flags __attribute__((unused)),
1802
 
                            uint32_t table_changes)
 
1829
                            HA_ALTER_FLAGS *alter_flags __attribute__((__unused__)),
 
1830
                            uint table_changes)
1803
1831
 {
1804
1832
   if (this->check_if_incompatible_data(create_info, table_changes)
1805
1833
       == COMPATIBLE_DATA_NO)
1820
1848
   @retval   0      OK
1821
1849
   @retval   error  error code passed from storage engine
1822
1850
 */
1823
 
 virtual int alter_table_phase1(THD *thd __attribute__((unused)),
1824
 
                                Table *altered_table __attribute__((unused)),
1825
 
                                HA_CREATE_INFO *create_info __attribute__((unused)),
1826
 
                                HA_ALTER_INFO *alter_info __attribute__((unused)),
1827
 
                                HA_ALTER_FLAGS *alter_flags  __attribute__((unused)))
 
1851
 virtual int alter_table_phase1(THD *thd __attribute__((__unused__)),
 
1852
                                TABLE *altered_table __attribute__((__unused__)),
 
1853
                                HA_CREATE_INFO *create_info __attribute__((__unused__)),
 
1854
                                HA_ALTER_INFO *alter_info __attribute__((__unused__)),
 
1855
                                HA_ALTER_FLAGS *alter_flags  __attribute__((__unused__)))
1828
1856
 {
1829
1857
   return HA_ERR_UNSUPPORTED;
1830
1858
 }
1846
1874
      this call is to be wrapped with a DDL lock. This is currently NOT
1847
1875
      supported.
1848
1876
 */
1849
 
 virtual int alter_table_phase2(THD *thd  __attribute__((unused)),
1850
 
                                Table *altered_table  __attribute__((unused)),
1851
 
                                HA_CREATE_INFO *create_info __attribute__((unused)),
1852
 
                                HA_ALTER_INFO *alter_info __attribute__((unused)),
1853
 
                                HA_ALTER_FLAGS *alter_flags __attribute__((unused)))
 
1877
 virtual int alter_table_phase2(THD *thd  __attribute__((__unused__)),
 
1878
                                TABLE *altered_table  __attribute__((__unused__)),
 
1879
                                HA_CREATE_INFO *create_info __attribute__((__unused__)),
 
1880
                                HA_ALTER_INFO *alter_info __attribute__((__unused__)),
 
1881
                                HA_ALTER_FLAGS *alter_flags __attribute__((__unused__)))
1854
1882
 {
1855
1883
   return HA_ERR_UNSUPPORTED;
1856
1884
 }
1861
1889
    @param    thd               The thread handle
1862
1890
    @param    table             The altered table, re-opened
1863
1891
 */
1864
 
 virtual int alter_table_phase3(THD *thd __attribute__((unused)),
1865
 
                                Table *table __attribute__((unused)))
 
1892
 virtual int alter_table_phase3(THD *thd __attribute__((__unused__)),
 
1893
                                TABLE *table __attribute__((__unused__)))
1866
1894
 {
1867
1895
   return HA_ERR_UNSUPPORTED;
1868
1896
 }
1935
1963
    the corresponding 'ha_*' method above.
1936
1964
  */
1937
1965
 
1938
 
  virtual int open(const char *name, int mode, uint32_t test_if_locked)=0;
1939
 
  virtual int index_init(uint32_t idx,
1940
 
                         bool sorted __attribute__((unused)))
 
1966
  virtual int open(const char *name, int mode, uint test_if_locked)=0;
 
1967
  virtual int index_init(uint idx,
 
1968
                         bool sorted __attribute__((__unused__)))
1941
1969
  { active_index= idx; return 0; }
1942
1970
  virtual int index_end() { active_index= MAX_KEY; return 0; }
1943
1971
  /**
1949
1977
  */
1950
1978
  virtual int rnd_init(bool scan)= 0;
1951
1979
  virtual int rnd_end() { return 0; }
1952
 
  virtual int write_row(unsigned char *buf __attribute__((unused)))
1953
 
  {
1954
 
    return HA_ERR_WRONG_COMMAND;
1955
 
  }
1956
 
 
1957
 
  virtual int update_row(const unsigned char *old_data __attribute__((unused)),
1958
 
                         unsigned char *new_data __attribute__((unused)))
1959
 
  {
1960
 
    return HA_ERR_WRONG_COMMAND;
1961
 
  }
1962
 
 
1963
 
  virtual int delete_row(const unsigned char *buf __attribute__((unused)))
 
1980
  virtual int write_row(uchar *buf __attribute__((unused)))
 
1981
  {
 
1982
    return HA_ERR_WRONG_COMMAND;
 
1983
  }
 
1984
 
 
1985
  virtual int update_row(const uchar *old_data __attribute__((unused)),
 
1986
                         uchar *new_data __attribute__((unused)))
 
1987
  {
 
1988
    return HA_ERR_WRONG_COMMAND;
 
1989
  }
 
1990
 
 
1991
  virtual int delete_row(const uchar *buf __attribute__((unused)))
1964
1992
  {
1965
1993
    return HA_ERR_WRONG_COMMAND;
1966
1994
  }
2001
2029
  }
2002
2030
  virtual void release_auto_increment(void) { return; };
2003
2031
  /** admin commands - called from mysql_admin_table */
2004
 
  virtual int check_for_upgrade(HA_CHECK_OPT *check_opt __attribute__((unused)))
 
2032
  virtual int check_for_upgrade(HA_CHECK_OPT *check_opt __attribute__((__unused__)))
2005
2033
  { return 0; }
2006
 
  virtual int check(THD* thd __attribute__((unused)),
2007
 
                    HA_CHECK_OPT* check_opt __attribute__((unused)))
 
2034
  virtual int check(THD* thd __attribute__((__unused__)),
 
2035
                    HA_CHECK_OPT* check_opt __attribute__((__unused__)))
2008
2036
  { return HA_ADMIN_NOT_IMPLEMENTED; }
2009
2037
 
2010
2038
  /**
2012
2040
     to specify CHECK option to use to call check()
2013
2041
     upon the table.
2014
2042
  */
2015
 
  virtual int repair(THD* thd __attribute__((unused)),
2016
 
                     HA_CHECK_OPT* check_opt __attribute__((unused)))
 
2043
  virtual int repair(THD* thd __attribute__((__unused__)),
 
2044
                     HA_CHECK_OPT* check_opt __attribute__((__unused__)))
2017
2045
  { return HA_ADMIN_NOT_IMPLEMENTED; }
2018
 
  virtual void start_bulk_insert(ha_rows rows __attribute__((unused)))
 
2046
  virtual void start_bulk_insert(ha_rows rows __attribute__((__unused__)))
2019
2047
  {}
2020
2048
  virtual int end_bulk_insert(void) { return 0; }
2021
 
  virtual int index_read(unsigned char * buf __attribute__((unused)),
2022
 
                         const unsigned char * key __attribute__((unused)),
2023
 
                         uint32_t key_len __attribute__((unused)),
2024
 
                         enum ha_rkey_function find_flag __attribute__((unused)))
 
2049
  virtual int index_read(uchar * buf __attribute__((__unused__)),
 
2050
                         const uchar * key __attribute__((__unused__)),
 
2051
                         uint key_len __attribute__((__unused__)),
 
2052
                         enum ha_rkey_function find_flag __attribute__((__unused__)))
2025
2053
   { return  HA_ERR_WRONG_COMMAND; }
2026
 
  virtual int index_read_last(unsigned char * buf __attribute__((unused)),
2027
 
                              const unsigned char * key __attribute__((unused)),
2028
 
                              uint32_t key_len __attribute__((unused)))
 
2054
  virtual int index_read_last(uchar * buf __attribute__((__unused__)),
 
2055
                              const uchar * key __attribute__((__unused__)),
 
2056
                              uint key_len __attribute__((__unused__)))
2029
2057
   { return (my_errno= HA_ERR_WRONG_COMMAND); }
2030
2058
  /**
2031
2059
    This method is similar to update_row, however the handler doesn't need
2040
2068
    @retval  0   Bulk delete used by handler
2041
2069
    @retval  1   Bulk delete not used, normal operation used
2042
2070
  */
2043
 
  virtual int bulk_update_row(const unsigned char *old_data __attribute__((unused)),
2044
 
                              unsigned char *new_data __attribute__((unused)),
2045
 
                              uint32_t *dup_key_found __attribute__((unused)))
 
2071
  virtual int bulk_update_row(const uchar *old_data __attribute__((__unused__)),
 
2072
                              uchar *new_data __attribute__((__unused__)),
 
2073
                              uint *dup_key_found __attribute__((__unused__)))
2046
2074
  {
2047
2075
    assert(false);
2048
2076
    return HA_ERR_WRONG_COMMAND;
2061
2089
    is emulated by doing a 'DELETE FROM t'. HA_ERR_WRONG_COMMAND is
2062
2090
    returned by storage engines that don't support this operation.
2063
2091
  */
2064
 
  virtual int reset_auto_increment(uint64_t value __attribute__((unused)))
 
2092
  virtual int reset_auto_increment(uint64_t value __attribute__((__unused__)))
2065
2093
  { return HA_ERR_WRONG_COMMAND; }
2066
 
  virtual int optimize(THD* thd __attribute__((unused)),
2067
 
                       HA_CHECK_OPT* check_opt __attribute__((unused)))
2068
 
  { return HA_ADMIN_NOT_IMPLEMENTED; }
2069
 
  virtual int analyze(THD* thd __attribute__((unused)),
2070
 
                      HA_CHECK_OPT* check_opt __attribute__((unused)))
2071
 
  { return HA_ADMIN_NOT_IMPLEMENTED; }
2072
 
  virtual bool check_and_repair(THD *thd __attribute__((unused)))
 
2094
  virtual int optimize(THD* thd __attribute__((__unused__)),
 
2095
                       HA_CHECK_OPT* check_opt __attribute__((__unused__)))
 
2096
  { return HA_ADMIN_NOT_IMPLEMENTED; }
 
2097
  virtual int analyze(THD* thd __attribute__((__unused__)),
 
2098
                      HA_CHECK_OPT* check_opt __attribute__((__unused__)))
 
2099
  { return HA_ADMIN_NOT_IMPLEMENTED; }
 
2100
  virtual bool check_and_repair(THD *thd __attribute__((__unused__)))
2073
2101
  { return true; }
2074
 
  virtual int disable_indexes(uint32_t mode __attribute__((unused)))
2075
 
  { return HA_ERR_WRONG_COMMAND; }
2076
 
  virtual int enable_indexes(uint32_t mode __attribute__((unused)))
2077
 
  { return HA_ERR_WRONG_COMMAND; }
2078
 
  virtual int discard_or_import_tablespace(bool discard __attribute__((unused)))
 
2102
  virtual int disable_indexes(uint mode __attribute__((__unused__)))
 
2103
  { return HA_ERR_WRONG_COMMAND; }
 
2104
  virtual int enable_indexes(uint mode __attribute__((__unused__)))
 
2105
  { return HA_ERR_WRONG_COMMAND; }
 
2106
  virtual int discard_or_import_tablespace(my_bool discard __attribute__((__unused__)))
2079
2107
  { return (my_errno=HA_ERR_WRONG_COMMAND); }
2080
2108
  virtual void prepare_for_alter(void) { return; }
2081
2109
  virtual void drop_table(const char *name);
2082
 
  virtual int create(const char *name __attribute__((unused)),
2083
 
                     Table *form __attribute__((unused)),
2084
 
                     HA_CREATE_INFO *info __attribute__((unused)))=0;
 
2110
  virtual int create(const char *name __attribute__((__unused__)),
 
2111
                     TABLE *form __attribute__((__unused__)),
 
2112
                     HA_CREATE_INFO *info __attribute__((__unused__)))=0;
2085
2113
 
2086
 
  virtual int create_handler_files(const char *name __attribute__((unused)),
2087
 
                                   const char *old_name __attribute__((unused)),
2088
 
                                   int action_flag __attribute__((unused)),
2089
 
                                   HA_CREATE_INFO *info __attribute__((unused)))
 
2114
  virtual int create_handler_files(const char *name __attribute__((__unused__)),
 
2115
                                   const char *old_name __attribute__((__unused__)),
 
2116
                                   int action_flag __attribute__((__unused__)),
 
2117
                                   HA_CREATE_INFO *info __attribute__((__unused__)))
2090
2118
  { return false; }
2091
2119
};
2092
2120
 
2111
2139
    : h2(NULL) {};
2112
2140
 
2113
2141
  handler *h; /* The "owner" handler object. It is used for scanning the index */
2114
 
  Table *table; /* Always equal to h->table */
 
2142
  TABLE *table; /* Always equal to h->table */
2115
2143
private:
2116
2144
  /*
2117
2145
    Secondary handler object. It is used to retrieve full table rows by
2120
2148
  handler *h2;
2121
2149
 
2122
2150
  /* Buffer to store rowids, or (rowid, range_id) pairs */
2123
 
  unsigned char *rowids_buf;
2124
 
  unsigned char *rowids_buf_cur;   /* Current position when reading/writing */
2125
 
  unsigned char *rowids_buf_last;  /* When reading: end of used buffer space */
2126
 
  unsigned char *rowids_buf_end;   /* End of the buffer */
 
2151
  uchar *rowids_buf;
 
2152
  uchar *rowids_buf_cur;   /* Current position when reading/writing */
 
2153
  uchar *rowids_buf_last;  /* When reading: end of used buffer space */
 
2154
  uchar *rowids_buf_end;   /* End of the buffer */
2127
2155
 
2128
2156
  bool dsmrr_eof; /* true <=> We have reached EOF when reading index tuples */
2129
2157
 
2132
2160
 
2133
2161
  bool use_default_impl; /* true <=> shortcut all calls to default MRR impl */
2134
2162
public:
2135
 
  void init(handler *h_arg, Table *table_arg)
 
2163
  void init(handler *h_arg, TABLE *table_arg)
2136
2164
  {
2137
2165
    h= h_arg; 
2138
2166
    table= table_arg;
2139
2167
  }
2140
2168
  int dsmrr_init(handler *h, KEY *key, RANGE_SEQ_IF *seq_funcs, 
2141
 
                 void *seq_init_param, uint32_t n_ranges, uint32_t mode, 
 
2169
                 void *seq_init_param, uint n_ranges, uint mode, 
2142
2170
                 HANDLER_BUFFER *buf);
2143
2171
  void dsmrr_close();
2144
2172
  int dsmrr_fill_buffer(handler *h);
2145
2173
  int dsmrr_next(handler *h, char **range_info);
2146
2174
 
2147
 
  int dsmrr_info(uint32_t keyno, uint32_t n_ranges, uint32_t keys, uint32_t *bufsz,
2148
 
                 uint32_t *flags, COST_VECT *cost);
 
2175
  int dsmrr_info(uint keyno, uint n_ranges, uint keys, uint *bufsz,
 
2176
                 uint *flags, COST_VECT *cost);
2149
2177
 
2150
 
  ha_rows dsmrr_info_const(uint32_t keyno, RANGE_SEQ_IF *seq, 
2151
 
                            void *seq_init_param, uint32_t n_ranges, uint32_t *bufsz,
2152
 
                            uint32_t *flags, COST_VECT *cost);
 
2178
  ha_rows dsmrr_info_const(uint keyno, RANGE_SEQ_IF *seq, 
 
2179
                            void *seq_init_param, uint n_ranges, uint *bufsz,
 
2180
                            uint *flags, COST_VECT *cost);
2153
2181
private:
2154
 
  bool key_uses_partial_cols(uint32_t keyno);
2155
 
  bool choose_mrr_impl(uint32_t keyno, ha_rows rows, uint32_t *flags, uint32_t *bufsz, 
 
2182
  bool key_uses_partial_cols(uint keyno);
 
2183
  bool choose_mrr_impl(uint keyno, ha_rows rows, uint *flags, uint *bufsz, 
2156
2184
                       COST_VECT *cost);
2157
 
  bool get_disk_sweep_mrr_cost(uint32_t keynr, ha_rows rows, uint32_t flags, 
2158
 
                               uint32_t *buffer_size, COST_VECT *cost);
 
2185
  bool get_disk_sweep_mrr_cost(uint keynr, ha_rows rows, uint flags, 
 
2186
                               uint *buffer_size, COST_VECT *cost);
2159
2187
};
2160
2188
 
2161
2189
extern const char *ha_row_type[];
2190
2218
  return db_type == NULL ? "UNKNOWN" : hton2plugin[db_type->slot]->name.str;
2191
2219
}
2192
2220
 
2193
 
static inline bool ha_check_storage_engine_flag(const handlerton *db_type, uint32_t flag)
 
2221
static inline bool ha_check_storage_engine_flag(const handlerton *db_type, uint32 flag)
2194
2222
{
2195
2223
  return db_type == NULL ? false : test(db_type->flags & flag);
2196
2224
}
2209
2237
int ha_finalize_handlerton(st_plugin_int *plugin);
2210
2238
 
2211
2239
TYPELIB *ha_known_exts(void);
 
2240
int ha_panic(enum ha_panic_function flag);
2212
2241
void ha_close_connection(THD* thd);
2213
2242
bool ha_flush_logs(handlerton *db_type);
2214
2243
void ha_drop_database(char* path);
2225
2254
/* discovery */
2226
2255
int ha_create_table_from_engine(THD* thd, const char *db, const char *name);
2227
2256
int ha_discover(THD* thd, const char* dbname, const char* name,
2228
 
                unsigned char** frmblob, size_t* frmlen);
 
2257
                uchar** frmblob, size_t* frmlen);
2229
2258
int ha_find_files(THD *thd,const char *db,const char *path,
2230
2259
                  const char *wild, bool dir, List<LEX_STRING>* files);
2231
2260
int ha_table_exists_in_engine(THD* thd, const char* db, const char* name);
2268
2297
*/
2269
2298
#define trans_need_2pc(thd, all)                   ((total_ha_2pc > 1) && \
2270
2299
        !((all ? &thd->transaction.all : &thd->transaction.stmt)->no_2pc))
 
2300
 
 
2301
#ifdef HAVE_NDB_BINLOG
 
2302
int ha_reset_logs(THD *thd);
 
2303
int ha_binlog_index_purge_file(THD *thd, const char *file);
 
2304
void ha_reset_slave(THD *thd);
 
2305
void ha_binlog_log_query(THD *thd, handlerton *db_type,
 
2306
                         enum_binlog_command binlog_command,
 
2307
                         const char *query, uint query_length,
 
2308
                         const char *db, const char *table_name);
 
2309
void ha_binlog_wait(THD *thd);
 
2310
int ha_binlog_end(THD *thd);
 
2311
#else
 
2312
#define ha_reset_logs(a) do {} while (0)
 
2313
#define ha_binlog_index_purge_file(a,b) do {} while (0)
 
2314
#define ha_reset_slave(a) do {} while (0)
 
2315
#define ha_binlog_log_query(a,b,c,d,e,f,g) do {} while (0)
 
2316
#define ha_binlog_wait(a) do {} while (0)
 
2317
#define ha_binlog_end(a)  do {} while (0)
 
2318
#endif