~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/table.h

  • Committer: Brian Aker
  • Date: 2008-10-06 06:47:29 UTC
  • Revision ID: brian@tangent.org-20081006064729-2i9mhjkzyvow9xsm
RemoveĀ uint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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 */
15
 
 
16
 
 
17
 
/* Structs that defines the TABLE */
18
 
 
19
 
class Item;                             /* Needed by ORDER */
 
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; either version 2 of the License, or
 
9
 *  (at your option) any later version.
 
10
 *
 
11
 *  This program is distributed in the hope that it will be useful,
 
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 *  GNU General Public License for more details.
 
15
 *
 
16
 *  You should have received a copy of the GNU General Public License
 
17
 *  along with this program; if not, write to the Free Software
 
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
19
 */
 
20
 
 
21
/* Structs that defines the Table */
 
22
 
 
23
#ifndef DRIZZLED_TABLE_H
 
24
#define DRIZZLED_TABLE_H
 
25
 
 
26
#include <storage/myisam/myisam.h>
 
27
#include <drizzled/order.h>
 
28
#include <drizzled/filesort_info.h>
 
29
#include <drizzled/natural_join_column.h>
 
30
#include <drizzled/nested_join.h>
 
31
#include <drizzled/field_iterator.h>
 
32
 
 
33
class Item;                             /* Needed by order_st */
20
34
class Item_subselect;
21
35
class st_select_lex_unit;
22
36
class st_select_lex;
23
37
class COND_EQUAL;
24
38
class Security_context;
 
39
class TableList;
25
40
 
26
41
/*************************************************************************/
27
42
 
28
 
/* Order clause list element */
29
 
 
30
 
typedef struct st_order {
31
 
  struct st_order *next;
32
 
  Item   **item;                        /* Point at item in select fields */
33
 
  Item   *item_ptr;                     /* Storage for initial item */
34
 
  Item   **item_copy;                   /* For SPs; the original item ptr */
35
 
  int    counter;                       /* position in SELECT list, correct
36
 
                                           only if counter_used is true*/
37
 
  bool   asc;                           /* true if ascending */
38
 
  bool   free_me;                       /* true if item isn't shared  */
39
 
  bool   in_field_list;                 /* true if in select field list */
40
 
  bool   counter_used;                  /* parameter was counter of columns */
41
 
  Field  *field;                        /* If tmp-table group */
42
 
  char   *buff;                         /* If tmp-table group */
43
 
  table_map used, depend_map;
44
 
} ORDER;
45
 
 
46
43
enum tmp_table_type
47
44
{
48
45
  NO_TMP_TABLE, NON_TRANSACTIONAL_TMP_TABLE, TRANSACTIONAL_TMP_TABLE,
49
46
  INTERNAL_TMP_TABLE, SYSTEM_TMP_TABLE, TMP_TABLE_FRM_FILE_ONLY
50
47
};
51
48
 
52
 
enum frm_type_enum
53
 
{
54
 
  FRMTYPE_ERROR= 0,
55
 
  FRMTYPE_TABLE
56
 
};
57
 
 
58
 
frm_type_enum mysql_frm_type(THD *thd, char *path, enum legacy_db_type *dbt);
 
49
bool mysql_frm_type(THD *thd, char *path, enum legacy_db_type *dbt);
59
50
 
60
51
 
61
52
enum release_type { RELEASE_NORMAL, RELEASE_WAIT_FOR_DROP };
62
53
 
63
 
typedef struct st_filesort_info
64
 
{
65
 
  IO_CACHE *io_cache;           /* If sorted through filesort */
66
 
  uchar     **sort_keys;        /* Buffer for sorting keys */
67
 
  uchar     *buffpek;           /* Buffer for buffpek structures */
68
 
  uint      buffpek_len;        /* Max number of buffpeks in the buffer */
69
 
  uchar     *addon_buf;         /* Pointer to a buffer if sorted with fields */
70
 
  size_t    addon_length;       /* Length of the buffer */
71
 
  struct st_sort_addon_field *addon_field;     /* Pointer to the fields info */
72
 
  void    (*unpack)(struct st_sort_addon_field *, uchar *); /* To unpack back */
73
 
  uchar     *record_pointers;    /* If sorted in memory */
74
 
  ha_rows   found_records;      /* How many records in sort */
75
 
} FILESORT_INFO;
76
 
 
77
 
 
78
54
/*
79
55
  Values in this enum are used to indicate how a tables TIMESTAMP field
80
56
  should be treated. It can be set to the current timestamp on insert or
95
71
 
96
72
class Field_timestamp;
97
73
class Field_blob;
98
 
class Table_triggers_list;
99
74
 
100
75
/**
101
76
  Category of table found in the table share.
114
89
    - FLUSH TABLES WITH READ LOCK
115
90
    - SET GLOBAL READ_ONLY = ON
116
91
    do not apply to this table.
117
 
    Note that LOCK TABLE t FOR READ/WRITE
 
92
    Note that LOCK Table t FOR READ/WRITE
118
93
    can be used on temporary tables.
119
94
    Temporary tables are not part of the table cache.
120
95
  */
123
98
  /**
124
99
    User table.
125
100
    These tables do honor:
126
 
    - LOCK TABLE t FOR READ/WRITE
 
101
    - LOCK Table t FOR READ/WRITE
127
102
    - FLUSH TABLES WITH READ LOCK
128
103
    - SET GLOBAL READ_ONLY = ON
129
104
    User tables are cached in the table cache.
131
106
  TABLE_CATEGORY_USER=2,
132
107
 
133
108
  /**
134
 
    System table, maintained by the server.
135
 
    These tables do honor:
136
 
    - LOCK TABLE t FOR READ/WRITE
137
 
    - FLUSH TABLES WITH READ LOCK
138
 
    - SET GLOBAL READ_ONLY = ON
139
 
    Typically, writes to system tables are performed by
140
 
    the server implementation, not explicitly be a user.
141
 
    System tables are cached in the table cache.
142
 
  */
143
 
  TABLE_CATEGORY_SYSTEM=3,
144
 
 
145
 
  /**
146
109
    Information schema tables.
147
110
    These tables are an interface provided by the system
148
111
    to inspect the system metadata.
149
112
    These tables do *not* honor:
150
 
    - LOCK TABLE t FOR READ/WRITE
 
113
    - LOCK Table t FOR READ/WRITE
151
114
    - FLUSH TABLES WITH READ LOCK
152
115
    - SET GLOBAL READ_ONLY = ON
153
116
    as there is no point in locking explicitely
162
125
    to I_S tables in the table cache, which should use
163
126
    this table type.
164
127
  */
165
 
  TABLE_CATEGORY_INFORMATION=4
 
128
  TABLE_CATEGORY_INFORMATION
166
129
};
167
130
typedef enum enum_table_category TABLE_CATEGORY;
168
131
 
192
155
  struct st_table_share *next,          /* Link to unused shares */
193
156
    **prev;
194
157
 
195
 
  /* The following is copied to each TABLE on OPEN */
 
158
  /* The following is copied to each Table on OPEN */
196
159
  Field **field;
197
160
  Field **found_next_number_field;
198
161
  Field *timestamp_field;               /* Used only during open */
199
162
  KEY  *key_info;                       /* data of keys in database */
200
163
  uint  *blob_field;                    /* Index to blobs in Field arrray*/
201
164
 
202
 
  uchar *default_values;                /* row with default values */
 
165
  unsigned char *default_values;                /* row with default values */
203
166
  LEX_STRING comment;                   /* Comment about table */
204
 
  CHARSET_INFO *table_charset;          /* Default charset of string fields */
 
167
  const CHARSET_INFO *table_charset; /* Default charset of string fields */
205
168
 
206
169
  MY_BITMAP all_set;
207
170
  /*
217
180
  LEX_STRING table_cache_key;
218
181
  LEX_STRING db;                        /* Pointer to db */
219
182
  LEX_STRING table_name;                /* Table name (for open) */
220
 
  LEX_STRING path;                      /* Path to .frm file (from datadir) */
 
183
  LEX_STRING path;      /* Path to .frm file (from datadir) */
221
184
  LEX_STRING normalized_path;           /* unpack_filename(path) */
222
185
  LEX_STRING connect_string;
223
186
 
224
 
  /* 
 
187
  /*
225
188
     Set of keys in use, implemented as a Bitmap.
226
 
     Excludes keys disabled by ALTER TABLE ... DISABLE KEYS.
 
189
     Excludes keys disabled by ALTER Table ... DISABLE KEYS.
227
190
  */
228
191
  key_map keys_in_use;
229
192
  key_map keys_for_keyread;
230
193
  ha_rows min_rows, max_rows;           /* create information */
231
 
  ulong   avg_row_length;               /* create information */
232
 
  ulong   version, mysql_version;
233
 
  ulong   timestamp_offset;             /* Set to offset+1 of record */
234
 
  ulong   reclength;                    /* Recordlength */
 
194
  uint32_t   avg_row_length;            /* create information */
 
195
  uint32_t   block_size;                   /* create information */
 
196
  uint32_t   version, mysql_version;
 
197
  uint32_t   timestamp_offset;          /* Set to offset+1 of record */
 
198
  uint32_t   reclength;                 /* Recordlength */
235
199
 
236
200
  plugin_ref db_plugin;                 /* storage engine plugin */
237
201
  inline handlerton *db_type() const    /* table_type for handler */
238
 
  { 
 
202
  {
239
203
    // assert(db_plugin);
240
204
    return db_plugin ? plugin_data(db_plugin, handlerton*) : NULL;
241
205
  }
244
208
  enum ha_choice transactional;
245
209
  enum ha_choice page_checksum;
246
210
 
247
 
  uint ref_count;                       /* How many TABLE objects uses this */
248
 
  uint open_count;                      /* Number of tables in open list */
249
 
  uint blob_ptr_size;                   /* 4 or 8 */
250
 
  uint key_block_size;                  /* create key_block_size, if used */
251
 
  uint null_bytes, last_null_bit_pos;
252
 
  uint fields;                          /* Number of fields */
253
 
  uint rec_buff_length;                 /* Size of table->record[] buffer */
254
 
  uint keys, key_parts;
255
 
  uint max_key_length, max_unique_length, total_key_length;
256
 
  uint uniques;                         /* Number of UNIQUE index */
257
 
  uint null_fields;                     /* number of null fields */
258
 
  uint blob_fields;                     /* number of blob fields */
259
 
  uint timestamp_field_offset;          /* Field number for timestamp field */
260
 
  uint varchar_fields;                  /* number of varchar fields */
261
 
  uint db_create_options;               /* Create options from database */
262
 
  uint db_options_in_use;               /* Options in use */
263
 
  uint db_record_offset;                /* if HA_REC_IN_SEQ */
264
 
  uint raid_type, raid_chunks;
265
 
  uint rowid_field_offset;              /* Field_nr +1 to rowid field */
 
211
  uint32_t ref_count;                       /* How many Table objects uses this */
 
212
  uint32_t open_count;                  /* Number of tables in open list */
 
213
  uint32_t blob_ptr_size;                       /* 4 or 8 */
 
214
  uint32_t key_block_size;                      /* create key_block_size, if used */
 
215
  uint32_t null_bytes, last_null_bit_pos;
 
216
  uint32_t fields;                              /* Number of fields */
 
217
  uint32_t rec_buff_length;                 /* Size of table->record[] buffer */
 
218
  uint32_t keys, key_parts;
 
219
  uint32_t max_key_length, max_unique_length, total_key_length;
 
220
  uint32_t uniques;                         /* Number of UNIQUE index */
 
221
  uint32_t null_fields;                 /* number of null fields */
 
222
  uint32_t blob_fields;                 /* number of blob fields */
 
223
  uint32_t timestamp_field_offset;              /* Field number for timestamp field */
 
224
  uint32_t varchar_fields;                  /* number of varchar fields */
 
225
  uint32_t db_create_options;           /* Create options from database */
 
226
  uint32_t db_options_in_use;           /* Options in use */
 
227
  uint32_t db_record_offset;            /* if HA_REC_IN_SEQ */
 
228
  uint32_t rowid_field_offset;          /* Field_nr +1 to rowid field */
266
229
  /* Index of auto-updated TIMESTAMP field in field array */
267
 
  uint primary_key;
268
 
  uint next_number_index;               /* autoincrement key number */
269
 
  uint next_number_key_offset;          /* autoinc keypart offset in a key */
270
 
  uint next_number_keypart;             /* autoinc keypart number in a key */
271
 
  uint error, open_errno, errarg;       /* error from open_table_def() */
272
 
  uint column_bitmap_size;
273
 
  uchar frm_version;
 
230
  uint32_t primary_key;
 
231
  uint32_t next_number_index;               /* autoincrement key number */
 
232
  uint32_t next_number_key_offset;          /* autoinc keypart offset in a key */
 
233
  uint32_t next_number_keypart;             /* autoinc keypart number in a key */
 
234
  uint32_t error, open_errno, errarg;       /* error from open_table_def() */
 
235
  uint32_t column_bitmap_size;
 
236
  unsigned char frm_version;
274
237
  bool null_field_first;
275
 
  bool system;                          /* Set if system table (one record) */
276
 
  bool crypted;                         /* If .frm file is crypted */
277
238
  bool db_low_byte_first;               /* Portable row format */
278
239
  bool crashed;
279
240
  bool name_lock, replace_with_name_lock;
280
241
  bool waiting_on_cond;                 /* Protection against free */
281
 
  ulong table_map_id;                   /* for row-based replication */
 
242
  uint32_t table_map_id;                   /* for row-based replication */
282
243
  uint64_t table_map_version;
283
244
 
284
245
  /*
305
266
      appropriate values by using table cache key as their source.
306
267
  */
307
268
 
308
 
  void set_table_cache_key(char *key_buff, uint key_length)
 
269
  void set_table_cache_key(char *key_buff, uint32_t key_length)
309
270
  {
310
271
    table_cache_key.str= key_buff;
311
272
    table_cache_key.length= key_length;
335
296
      it should has same life-time as share itself.
336
297
  */
337
298
 
338
 
  void set_table_cache_key(char *key_buff, const char *key, uint key_length)
 
299
  void set_table_cache_key(char *key_buff, const char *key, uint32_t key_length)
339
300
  {
340
301
    memcpy(key_buff, key, key_length);
341
302
    set_table_cache_key(key_buff, key_length);
343
304
 
344
305
  inline bool honor_global_locks()
345
306
  {
346
 
    return ((table_category == TABLE_CATEGORY_USER)
347
 
            || (table_category == TABLE_CATEGORY_SYSTEM));
 
307
    return (table_category == TABLE_CATEGORY_USER);
348
308
  }
349
309
 
350
 
  inline ulong get_table_def_version()
 
310
  inline uint32_t get_table_def_version()
351
311
  {
352
312
    return table_map_id;
353
313
  }
355
315
} TABLE_SHARE;
356
316
 
357
317
 
358
 
extern ulong refresh_version;
 
318
extern uint32_t refresh_version;
359
319
 
360
320
/* Information for one open table */
361
321
enum index_hint_type
365
325
  INDEX_HINT_FORCE
366
326
};
367
327
 
368
 
struct st_table {
369
 
  st_table() {}                               /* Remove gcc warning */
370
 
 
 
328
typedef struct st_table_field_w_type
 
329
{
 
330
  LEX_STRING name;
 
331
  LEX_STRING type;
 
332
  LEX_STRING cset;
 
333
} TABLE_FIELD_W_TYPE;
 
334
 
 
335
bool create_myisam_from_heap(THD *thd, Table *table,
 
336
                             MI_COLUMNDEF *start_recinfo,
 
337
                             MI_COLUMNDEF **recinfo, 
 
338
                             int error, bool ignore_last_dupp_key_error);
 
339
 
 
340
class Table {
 
341
 
 
342
public:
371
343
  TABLE_SHARE   *s;
 
344
  Table() {}                               /* Remove gcc warning */
 
345
 
 
346
  /* SHARE methods */
 
347
  inline TABLE_SHARE *getShare() { return s; } /* Get rid of this long term */
 
348
  inline void setShare(TABLE_SHARE *new_share) { s= new_share; } /* Get rid of this long term */
 
349
  inline uint32_t sizeKeys() { return s->keys; }
 
350
  inline uint32_t sizeFields() { return s->fields; }
 
351
  inline uint32_t getRecordLength() { return s->reclength; }
 
352
  inline uint32_t sizeBlobFields() { return s->blob_fields; }
 
353
  inline uint32_t *getBlobField() { return s->blob_field; }
 
354
  inline uint32_t getNullBytes() { return s->null_bytes; }
 
355
  inline uint32_t getNullFields() { return s->null_fields; }
 
356
  inline unsigned char *getDefaultValues() { return s->default_values; }
 
357
 
 
358
  inline bool isNullFieldFirst() { return s->null_field_first; }
 
359
  inline bool isDatabaseLowByteFirst() { return s->db_low_byte_first; }         /* Portable row format */
 
360
  inline bool isCrashed() { return s->crashed; }
 
361
  inline bool isNameLock() { return s->name_lock; } 
 
362
  inline bool isReplaceWithNameLock() { return s->replace_with_name_lock; }
 
363
  inline bool isWaitingOnCondition() { return s->waiting_on_cond; }                 /* Protection against free */
 
364
 
 
365
  /* For TMP tables, should be pulled out as a class */
 
366
  void updateCreateInfo(HA_CREATE_INFO *create_info);
 
367
  void setup_tmp_table_column_bitmaps(unsigned char *bitmaps);
 
368
  bool create_myisam_tmp_table(KEY *keyinfo, 
 
369
                               MI_COLUMNDEF *start_recinfo,
 
370
                               MI_COLUMNDEF **recinfo, 
 
371
                               uint64_t options);
 
372
  void free_tmp_table(THD *thd);
 
373
  bool open_tmp_table();
 
374
  size_t max_row_length(const unsigned char *data);
 
375
  uint32_t find_shortest_key(const key_map *usable_keys);
 
376
  bool compare_record(Field **ptr);
 
377
  bool compare_record();
 
378
 
 
379
  bool table_check_intact(const uint32_t table_f_count, const TABLE_FIELD_W_TYPE *table_def);
 
380
 
 
381
  /* See if this can be blown away */
 
382
  inline uint32_t getDBStat () { return db_stat; }
 
383
  inline uint32_t setDBStat () { return db_stat; }
 
384
  uint          db_stat;                /* mode of file as in handler.h */
 
385
 
372
386
  handler       *file;
373
 
  struct st_table *next, *prev;
 
387
  Table *next, *prev;
374
388
 
375
389
  THD   *in_use;                        /* Which thread uses this */
376
390
  Field **field;                        /* Pointer to fields */
377
391
 
378
 
  uchar *record[2];                     /* Pointer to records */
379
 
  uchar *write_row_record;              /* Used as optimisation in
 
392
  unsigned char *record[2];                     /* Pointer to records */
 
393
  unsigned char *write_row_record;              /* Used as optimisation in
380
394
                                           THD::write_row */
381
 
  uchar *insert_values;                  /* used by INSERT ... UPDATE */
 
395
  unsigned char *insert_values;                  /* used by INSERT ... UPDATE */
382
396
  /* 
383
397
    Map of keys that can be used to retrieve all data from this table 
384
398
    needed by the query without reading the row.
389
403
    A set of keys that can be used in the query that references this
390
404
    table.
391
405
 
392
 
    All indexes disabled on the table's TABLE_SHARE (see TABLE::s) will be 
393
 
    subtracted from this set upon instantiation. Thus for any TABLE t it holds
 
406
    All indexes disabled on the table's TABLE_SHARE (see Table::s) will be 
 
407
    subtracted from this set upon instantiation. Thus for any Table t it holds
394
408
    that t.keys_in_use_for_query is a subset of t.s.keys_in_use. Generally we 
395
409
    must not introduce any new keys here (see setup_tables).
396
410
 
407
421
  Field *found_next_number_field;       /* Set on open */
408
422
  Field_timestamp *timestamp_field;
409
423
 
410
 
  /* Table's triggers, 0 if there are no of them */
411
 
  Table_triggers_list *triggers;
412
 
  TABLE_LIST *pos_in_table_list;/* Element referring to this table */
413
 
  ORDER         *group;
 
424
  TableList *pos_in_table_list;/* Element referring to this table */
 
425
  order_st *group;
414
426
  const char    *alias;                   /* alias or table name */
415
 
  uchar         *null_flags;
 
427
  unsigned char         *null_flags;
416
428
  my_bitmap_map *bitmap_init_value;
417
429
  MY_BITMAP     def_read_set, def_write_set, tmp_set; /* containers */
418
430
  MY_BITMAP     *read_set, *write_set;          /* Active column sets */
473
485
  timestamp_auto_set_type timestamp_field_type;
474
486
  table_map     map;                    /* ID bit of table (1,2,4,8,16...) */
475
487
 
476
 
  uint          lock_position;          /* Position in MYSQL_LOCK.table */
477
 
  uint          lock_data_start;        /* Start pos. in MYSQL_LOCK.locks */
478
 
  uint          lock_count;             /* Number of locks */
 
488
  uint32_t          lock_position;          /* Position in DRIZZLE_LOCK.table */
 
489
  uint32_t          lock_data_start;        /* Start pos. in DRIZZLE_LOCK.locks */
 
490
  uint32_t          lock_count;             /* Number of locks */
479
491
  uint          tablenr,used_fields;
480
 
  uint          temp_pool_slot;         /* Used by intern temp tables */
 
492
  uint32_t          temp_pool_slot;             /* Used by intern temp tables */
481
493
  uint          status;                 /* What's in record[0] */
482
 
  uint          db_stat;                /* mode of file as in handler.h */
483
494
  /* number of select if it is derived table */
484
 
  uint          derived_select_number;
 
495
  uint32_t          derived_select_number;
485
496
  int           current_lock;           /* Type of lock on table */
486
 
  my_bool copy_blobs;                   /* copy_blobs when storing */
 
497
  bool copy_blobs;                      /* copy_blobs when storing */
487
498
 
488
499
  /*
489
500
    0 or JOIN_TYPE_{LEFT|RIGHT}. Currently this is only compared to 0.
490
501
    If maybe_null !=0, this table is inner w.r.t. some outer join operation,
491
502
    and null_row may be true.
492
503
  */
493
 
  uint maybe_null;
 
504
  bool maybe_null;
 
505
 
494
506
  /*
495
507
    If true, the current table row is considered to have all columns set to 
496
508
    NULL, including columns declared as "not null" (see maybe_null).
497
509
  */
498
 
  my_bool null_row;
 
510
  bool null_row;
499
511
 
500
 
  /*
501
 
    TODO: Each of the following flags take up 8 bits. They can just as easily
502
 
    be put into one single unsigned long and instead of taking up 18
503
 
    bytes, it would take up 4.
504
 
  */
505
 
  my_bool force_index;
506
 
  my_bool distinct,const_table,no_rows;
507
 
  my_bool key_read, no_keyread;
 
512
  bool force_index;
 
513
  bool distinct,const_table,no_rows;
 
514
  bool key_read, no_keyread;
508
515
  /*
509
516
    Placeholder for an open table which prevents other connections
510
517
    from taking name-locks on this table. Typically used with
522
529
    object associated with it (db_stat is always 0), but please do
523
530
    not rely on that.
524
531
  */
525
 
  my_bool open_placeholder;
526
 
  my_bool locked_by_logger;
527
 
  my_bool no_replicate;
528
 
  my_bool locked_by_name;
529
 
  my_bool no_cache;
 
532
  bool open_placeholder;
 
533
  bool locked_by_logger;
 
534
  bool no_replicate;
 
535
  bool locked_by_name;
 
536
  bool no_cache;
530
537
  /* To signal that the table is associated with a HANDLER statement */
531
 
  my_bool open_by_handler;
 
538
  bool open_by_handler;
532
539
  /*
533
540
    To indicate that a non-null value of the auto_increment field
534
541
    was provided by the user or retrieved from the current record.
535
542
    Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode.
536
543
  */
537
 
  my_bool auto_increment_field_not_null;
538
 
  my_bool insert_or_update;             /* Can be used by the handler */
539
 
  my_bool alias_name_used;              /* true if table_name is alias */
540
 
  my_bool get_fields_in_item_tree;      /* Signal to fix_field */
 
544
  bool auto_increment_field_not_null;
 
545
  bool insert_or_update;             /* Can be used by the handler */
 
546
  bool alias_name_used;         /* true if table_name is alias */
 
547
  bool get_fields_in_item_tree;      /* Signal to fix_field */
541
548
 
542
549
  REGINFO reginfo;                      /* field connections */
543
550
  MEM_ROOT mem_root;
544
 
  FILESORT_INFO sort;
 
551
  filesort_info_st sort;
545
552
 
546
553
  bool fill_item_list(List<Item> *item_list) const;
547
554
  void reset_item_list(List<Item> *item_list) const;
548
555
  void clear_column_bitmaps(void);
549
556
  void prepare_for_position(void);
550
 
  void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map);
551
 
  void mark_columns_used_by_index(uint index);
 
557
  void mark_columns_used_by_index_no_reset(uint32_t index, MY_BITMAP *map);
 
558
  void mark_columns_used_by_index(uint32_t index);
552
559
  void restore_column_maps_after_mark_index();
553
560
  void mark_auto_increment_column(void);
554
561
  void mark_columns_needed_for_update(void);
568
575
    read_set= read_set_arg;
569
576
    write_set= write_set_arg;
570
577
  }
 
578
 
 
579
  void restore_column_map(my_bitmap_map *old);
 
580
 
 
581
  my_bitmap_map *use_all_columns(MY_BITMAP *bitmap);
571
582
  inline void use_all_columns()
572
583
  {
573
584
    column_bitmaps_set(&s->all_set, &s->all_set);
574
585
  }
 
586
 
575
587
  inline void default_column_bitmaps()
576
588
  {
577
589
    read_set= &def_read_set;
578
590
    write_set= &def_write_set;
579
591
  }
 
592
 
580
593
  /* Is table open or should be treated as such by name-locking? */
581
594
  inline bool is_name_opened() { return db_stat || open_placeholder; }
582
595
  /*
584
597
  */
585
598
  inline bool needs_reopen_or_name_lock()
586
599
  { return s->version != refresh_version; }
587
 
};
588
600
 
589
 
enum enum_schema_table_state
590
 
591
 
  NOT_PROCESSED= 0,
592
 
  PROCESSED_BY_CREATE_SORT_INDEX,
593
 
  PROCESSED_BY_JOIN_EXEC
 
601
  int report_error(int error);
594
602
};
595
603
 
596
604
typedef struct st_foreign_key_info
652
660
     For string-type columns, this is the maximum number of
653
661
     characters. Otherwise, it is the 'display-length' for the column.
654
662
  */
655
 
  uint field_length;
 
663
  uint32_t field_length;
656
664
  /**
657
665
     This denotes data type for the column. For the most part, there seems to
658
666
     be one entry in the enum for each SQL data type, although there seem to
668
676
     combine them using the bitwise or operator @c |. Both flags are
669
677
     defined in table.h.
670
678
   */
671
 
  uint field_flags;        // Field atributes(maybe_null, signed, unsigned etc.)
 
679
  uint32_t field_flags;        // Field atributes(maybe_null, signed, unsigned etc.)
672
680
  const char* old_name;
673
681
  /**
674
682
     This should be one of @c SKIP_OPEN_TABLE,
675
683
     @c OPEN_FRM_ONLY or @c OPEN_FULL_TABLE.
676
684
  */
677
 
  uint open_method;
 
685
  uint32_t open_method;
678
686
} ST_FIELD_INFO;
679
687
 
680
688
 
681
 
struct TABLE_LIST;
 
689
class TableList;
682
690
typedef class Item COND;
683
691
 
684
 
typedef struct st_schema_table
 
692
struct ST_SCHEMA_TABLE
685
693
{
686
694
  const char* table_name;
687
695
  ST_FIELD_INFO *fields_info;
688
696
  /* Create information_schema table */
689
 
  TABLE *(*create_table)  (THD *thd, TABLE_LIST *table_list);
 
697
  Table *(*create_table)  (THD *thd, TableList *table_list);
690
698
  /* Fill table with data */
691
 
  int (*fill_table) (THD *thd, TABLE_LIST *tables, COND *cond);
 
699
  int (*fill_table) (THD *thd, TableList *tables, COND *cond);
692
700
  /* Handle fileds for old SHOW */
693
 
  int (*old_format) (THD *thd, struct st_schema_table *schema_table);
694
 
  int (*process_table) (THD *thd, TABLE_LIST *tables, TABLE *table,
 
701
  int (*old_format) (THD *thd, struct ST_SCHEMA_TABLE *schema_table);
 
702
  int (*process_table) (THD *thd, TableList *tables, Table *table,
695
703
                        bool res, LEX_STRING *db_name, LEX_STRING *table_name);
696
704
  int idx_field1, idx_field2; 
697
705
  bool hidden;
698
 
  uint i_s_requested_object;  /* the object we need to open(TABLE | VIEW) */
699
 
} ST_SCHEMA_TABLE;
 
706
  uint32_t i_s_requested_object;  /* the object we need to open(Table | VIEW) */
 
707
};
700
708
 
701
709
 
702
710
#define JOIN_TYPE_LEFT  1
706
714
class select_union;
707
715
class TMP_TABLE_PARAM;
708
716
 
709
 
Item *create_view_field(THD *thd, TABLE_LIST *view, Item **field_ref,
710
 
                        const char *name);
711
 
 
712
717
struct Field_translator
713
718
{
714
719
  Item *item;
716
721
};
717
722
 
718
723
 
719
 
/*
720
 
  Column reference of a NATURAL/USING join. Since column references in
721
 
  joins can be both from views and stored tables, may point to either a
722
 
  Field (for tables), or a Field_translator (for views).
723
 
*/
724
 
 
725
 
class Natural_join_column: public Sql_alloc
726
 
{
727
 
public:
728
 
  Field_translator *view_field;  /* Column reference of merge view. */
729
 
  Field            *table_field; /* Column reference of table or temp view. */
730
 
  TABLE_LIST *table_ref; /* Original base table/view reference. */
731
 
  /*
732
 
    True if a common join column of two NATURAL/USING join operands. Notice
733
 
    that when we have a hierarchy of nested NATURAL/USING joins, a column can
734
 
    be common at some level of nesting but it may not be common at higher
735
 
    levels of nesting. Thus this flag may change depending on at which level
736
 
    we are looking at some column.
737
 
  */
738
 
  bool is_common;
739
 
public:
740
 
  Natural_join_column(Field_translator *field_param, TABLE_LIST *tab);
741
 
  Natural_join_column(Field *field_param, TABLE_LIST *tab);
742
 
  const char *name();
743
 
  Item *create_item(THD *thd);
744
 
  Field *field();
745
 
  const char *table_name();
746
 
  const char *db_name();
747
 
};
748
 
 
749
 
 
750
 
/*
751
 
  Table reference in the FROM clause.
752
 
 
753
 
  These table references can be of several types that correspond to
754
 
  different SQL elements. Below we list all types of TABLE_LISTs with
755
 
  the necessary conditions to determine when a TABLE_LIST instance
756
 
  belongs to a certain type.
757
 
 
758
 
  1) table (TABLE_LIST::view == NULL)
759
 
     - base table
760
 
       (TABLE_LIST::derived == NULL)
761
 
     - subquery - TABLE_LIST::table is a temp table
762
 
       (TABLE_LIST::derived != NULL)
763
 
     - information schema table
764
 
       (TABLE_LIST::schema_table != NULL)
765
 
       NOTICE: for schema tables TABLE_LIST::field_translation may be != NULL
766
 
  2) view (TABLE_LIST::view != NULL)
767
 
     - merge    (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_MERGE)
768
 
           also (TABLE_LIST::field_translation != NULL)
769
 
     - tmptable (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_TMPTABLE)
770
 
           also (TABLE_LIST::field_translation == NULL)
771
 
  3) nested table reference (TABLE_LIST::nested_join != NULL)
772
 
     - table sequence - e.g. (t1, t2, t3)
773
 
       TODO: how to distinguish from a JOIN?
774
 
     - general JOIN
775
 
       TODO: how to distinguish from a table sequence?
776
 
     - NATURAL JOIN
777
 
       (TABLE_LIST::natural_join != NULL)
778
 
       - JOIN ... USING
779
 
         (TABLE_LIST::join_using_fields != NULL)
780
 
     - semi-join
781
 
       ;
782
 
*/
783
 
 
784
 
class Index_hint;
785
 
struct TABLE_LIST
786
 
{
787
 
  TABLE_LIST() {}                          /* Remove gcc warning */
788
 
 
789
 
  /**
790
 
    Prepare TABLE_LIST that consists of one table instance to use in
791
 
    simple_open_and_lock_tables
792
 
  */
793
 
  inline void init_one_table(const char *db_name_arg,
794
 
                             const char *table_name_arg,
795
 
                             enum thr_lock_type lock_type_arg)
796
 
  {
797
 
    bzero((char*) this, sizeof(*this));
798
 
    db= (char*) db_name_arg;
799
 
    table_name= alias= (char*) table_name_arg;
800
 
    lock_type= lock_type_arg;
801
 
  }
802
 
 
803
 
  /*
804
 
    List of tables local to a subquery (used by SQL_LIST). Considers
805
 
    views as leaves (unlike 'next_leaf' below). Created at parse time
806
 
    in st_select_lex::add_table_to_list() -> table_list.link_in_list().
807
 
  */
808
 
  TABLE_LIST *next_local;
809
 
  /* link in a global list of all queries tables */
810
 
  TABLE_LIST *next_global, **prev_global;
811
 
  char          *db, *alias, *table_name, *schema_table_name;
812
 
  char          *option;                /* Used by cache index  */
813
 
  Item          *on_expr;               /* Used with outer join */
814
 
  Item          *sj_on_expr;
815
 
  /*
816
 
    (Valid only for semi-join nests) Bitmap of tables that are within the
817
 
    semi-join (this is different from bitmap of all nest's children because
818
 
    tables that were pulled out of the semi-join nest remain listed as
819
 
    nest's children).
820
 
  */
821
 
  table_map     sj_inner_tables;
822
 
  /* Number of IN-compared expressions */
823
 
  uint          sj_in_exprs; 
824
 
  /*
825
 
    The structure of ON expression presented in the member above
826
 
    can be changed during certain optimizations. This member
827
 
    contains a snapshot of AND-OR structure of the ON expression
828
 
    made after permanent transformations of the parse tree, and is
829
 
    used to restore ON clause before every reexecution of a prepared
830
 
    statement or stored procedure.
831
 
  */
832
 
  Item          *prep_on_expr;
833
 
  COND_EQUAL    *cond_equal;            /* Used with outer join */
834
 
  /*
835
 
    During parsing - left operand of NATURAL/USING join where 'this' is
836
 
    the right operand. After parsing (this->natural_join == this) iff
837
 
    'this' represents a NATURAL or USING join operation. Thus after
838
 
    parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
839
 
  */
840
 
  TABLE_LIST *natural_join;
841
 
  /*
842
 
    True if 'this' represents a nested join that is a NATURAL JOIN.
843
 
    For one of the operands of 'this', the member 'natural_join' points
844
 
    to the other operand of 'this'.
845
 
  */
846
 
  bool is_natural_join;
847
 
  /* Field names in a USING clause for JOIN ... USING. */
848
 
  List<String> *join_using_fields;
849
 
  /*
850
 
    Explicitly store the result columns of either a NATURAL/USING join or
851
 
    an operand of such a join.
852
 
  */
853
 
  List<Natural_join_column> *join_columns;
854
 
  /* true if join_columns contains all columns of this table reference. */
855
 
  bool is_join_columns_complete;
856
 
 
857
 
  /*
858
 
    List of nodes in a nested join tree, that should be considered as
859
 
    leaves with respect to name resolution. The leaves are: views,
860
 
    top-most nodes representing NATURAL/USING joins, subqueries, and
861
 
    base tables. All of these TABLE_LIST instances contain a
862
 
    materialized list of columns. The list is local to a subquery.
863
 
  */
864
 
  TABLE_LIST *next_name_resolution_table;
865
 
  /* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
866
 
  List<Index_hint> *index_hints;
867
 
  TABLE        *table;                          /* opened table */
868
 
  uint          table_id; /* table id (from binlog) for opened table */
869
 
  /*
870
 
    select_result for derived table to pass it from table creation to table
871
 
    filling procedure
872
 
  */
873
 
  select_union  *derived_result;
874
 
  /*
875
 
    Reference from aux_tables to local list entry of main select of
876
 
    multi-delete statement:
877
 
    delete t1 from t2,t1 where t1.a<'B' and t2.b=t1.b;
878
 
    here it will be reference of first occurrence of t1 to second (as you
879
 
    can see this lists can't be merged)
880
 
  */
881
 
  TABLE_LIST    *correspondent_table;
882
 
  st_select_lex_unit *derived;          /* SELECT_LEX_UNIT of derived table */
883
 
  ST_SCHEMA_TABLE *schema_table;        /* Information_schema table */
884
 
  st_select_lex *schema_select_lex;
885
 
  /*
886
 
    True when the view field translation table is used to convert
887
 
    schema table fields for backwards compatibility with SHOW command.
888
 
  */
889
 
  bool schema_table_reformed;
890
 
  TMP_TABLE_PARAM *schema_table_param;
891
 
  /* link to select_lex where this table was used */
892
 
  st_select_lex *select_lex;
893
 
  Field_translator *field_translation;  /* array of VIEW fields */
894
 
  /* pointer to element after last one in translation table above */
895
 
  Field_translator *field_translation_end;
896
 
  /*
897
 
    List (based on next_local) of underlying tables of this view. I.e. it
898
 
    does not include the tables of subqueries used in the view. Is set only
899
 
    for merged views.
900
 
  */
901
 
  TABLE_LIST    *merge_underlying_list;
902
 
  /*
903
 
    - 0 for base tables
904
 
    - in case of the view it is the list of all (not only underlying
905
 
    tables but also used in subquery ones) tables of the view.
906
 
  */
907
 
  List<TABLE_LIST> *view_tables;
908
 
  /* most upper view this table belongs to */
909
 
  TABLE_LIST    *belong_to_view;
910
 
  /* Ptr to parent MERGE table list item. See top comment in ha_myisammrg.cc */
911
 
  TABLE_LIST    *parent_l;
912
 
  /*
913
 
    List of all base tables local to a subquery including all view
914
 
    tables. Unlike 'next_local', this in this list views are *not*
915
 
    leaves. Created in setup_tables() -> make_leaves_list().
916
 
  */
917
 
  TABLE_LIST    *next_leaf;
918
 
  /* data need by some engines in query cache*/
919
 
  uint64_t     engine_data;
920
 
  /* call back function for asking handler about caching in query cache */
921
 
  qc_engine_callback callback_func;
922
 
  thr_lock_type lock_type;
923
 
  uint          outer_join;             /* Which join type */
924
 
  uint          shared;                 /* Used in multi-upd */
925
 
  size_t        db_length;
926
 
  size_t        table_name_length;
927
 
  bool          straight;               /* optimize with prev table */
928
 
  bool          updating;               /* for replicate-do/ignore table */
929
 
  bool          force_index;            /* prefer index over table scan */
930
 
  bool          ignore_leaves;          /* preload only non-leaf nodes */
931
 
  table_map     dep_tables;             /* tables the table depends on      */
932
 
  table_map     on_expr_dep_tables;     /* tables on expression depends on  */
933
 
  struct st_nested_join *nested_join;   /* if the element is a nested join  */
934
 
  TABLE_LIST *embedding;             /* nested join containing the table */
935
 
  List<TABLE_LIST> *join_list;/* join list the table belongs to   */
936
 
  bool          cacheable_table;        /* stop PS caching */
937
 
  /* FRMTYPE_ERROR if any type is acceptable */
938
 
  enum frm_type_enum required_type;
939
 
  handlerton    *db_type;               /* table_type for handler */
940
 
  char          timestamp_buffer[20];   /* buffer for timestamp (19+1) */
941
 
  /*
942
 
    This TABLE_LIST object corresponds to the table to be created
943
 
    so it is possible that it does not exist (used in CREATE TABLE
944
 
    ... SELECT implementation).
945
 
  */
946
 
  bool          create;
947
 
  /* For transactional locking. */
948
 
  int           lock_timeout;           /* NOWAIT or WAIT [X]               */
949
 
  bool          lock_transactional;     /* If transactional lock requested. */
950
 
  bool          internal_tmp_table;
951
 
  /** true if an alias for this table was specified in the SQL. */
952
 
  bool          is_alias;
953
 
  /** true if the table is referred to in the statement using a fully
954
 
      qualified name (<db_name>.<table_name>).
955
 
  */
956
 
  bool          is_fqtn;
957
 
 
958
 
  uint i_s_requested_object;
959
 
  bool has_db_lookup_value;
960
 
  bool has_table_lookup_value;
961
 
  uint table_open_method;
962
 
  enum enum_schema_table_state schema_table_state;
963
 
  void set_underlying_merge();
964
 
  bool setup_underlying(THD *thd);
965
 
  void cleanup_items();
966
 
  /*
967
 
    If you change placeholder(), please check the condition in
968
 
    check_transactional_lock() too.
969
 
  */
970
 
  bool placeholder()
971
 
  {
972
 
    return derived || schema_table || (create && !table->db_stat) || !table;
973
 
  }
974
 
  void print(THD *thd, String *str, enum_query_type query_type);
975
 
  bool set_insert_values(MEM_ROOT *mem_root);
976
 
  TABLE_LIST *find_underlying_table(TABLE *table);
977
 
  TABLE_LIST *first_leaf_for_name_resolution();
978
 
  TABLE_LIST *last_leaf_for_name_resolution();
979
 
  bool is_leaf_for_name_resolution();
980
 
  inline TABLE_LIST *top_table()
981
 
    { return belong_to_view ? belong_to_view : this; }
982
 
 
983
 
  /*
984
 
    Cleanup for re-execution in a prepared statement or a stored
985
 
    procedure.
986
 
  */
987
 
  void reinit_before_use(THD *thd);
988
 
  Item_subselect *containing_subselect();
989
 
 
990
 
  /* 
991
 
    Compiles the tagged hints list and fills up st_table::keys_in_use_for_query,
992
 
    st_table::keys_in_use_for_group_by, st_table::keys_in_use_for_order_by,
993
 
    st_table::force_index and st_table::covering_keys.
994
 
  */
995
 
  bool process_index_hints(TABLE *table);
996
 
 
997
 
private:
998
 
  bool prep_where(THD *thd, Item **conds, bool no_where_clause);
999
 
  /*
1000
 
    Cleanup for re-execution in a prepared statement or a stored
1001
 
    procedure.
1002
 
  */
1003
 
};
1004
 
 
1005
 
class Item;
1006
 
 
1007
 
/*
1008
 
  Iterator over the fields of a generic table reference.
1009
 
*/
1010
 
 
1011
 
class Field_iterator: public Sql_alloc
1012
 
{
1013
 
public:
1014
 
  Field_iterator() {}                         /* Remove gcc warning */
1015
 
  virtual ~Field_iterator() {}
1016
 
  virtual void set(TABLE_LIST *)= 0;
1017
 
  virtual void next()= 0;
1018
 
  virtual bool end_of_fields()= 0;              /* Return 1 at end of list */
1019
 
  virtual const char *name()= 0;
1020
 
  virtual Item *create_item(THD *)= 0;
1021
 
  virtual Field *field()= 0;
1022
 
};
1023
 
 
1024
 
 
1025
 
/* 
1026
 
  Iterator over the fields of a base table, view with temporary
1027
 
  table, or subquery.
1028
 
*/
1029
 
 
1030
 
class Field_iterator_table: public Field_iterator
1031
 
{
1032
 
  Field **ptr;
1033
 
public:
1034
 
  Field_iterator_table() :ptr(0) {}
1035
 
  void set(TABLE_LIST *table) { ptr= table->table->field; }
1036
 
  void set_table(TABLE *table) { ptr= table->field; }
1037
 
  void next() { ptr++; }
1038
 
  bool end_of_fields() { return *ptr == 0; }
1039
 
  const char *name();
1040
 
  Item *create_item(THD *thd);
1041
 
  Field *field() { return *ptr; }
1042
 
};
1043
 
 
1044
 
 
1045
 
/* Iterator over the fields of a merge view. */
1046
 
 
1047
 
class Field_iterator_view: public Field_iterator
1048
 
{
1049
 
  Field_translator *ptr, *array_end;
1050
 
  TABLE_LIST *view;
1051
 
public:
1052
 
  Field_iterator_view() :ptr(0), array_end(0) {}
1053
 
  void set(TABLE_LIST *table);
1054
 
  void next() { ptr++; }
1055
 
  bool end_of_fields() { return ptr == array_end; }
1056
 
  const char *name();
1057
 
  Item *create_item(THD *thd);
1058
 
  Item **item_ptr() {return &ptr->item; }
1059
 
  Field *field() { return 0; }
1060
 
  inline Item *item() { return ptr->item; }
1061
 
  Field_translator *field_translator() { return ptr; }
1062
 
};
1063
 
 
1064
 
 
1065
 
/*
1066
 
  Field_iterator interface to the list of materialized fields of a
1067
 
  NATURAL/USING join.
1068
 
*/
1069
 
 
1070
 
class Field_iterator_natural_join: public Field_iterator
1071
 
{
1072
 
  List_iterator_fast<Natural_join_column> column_ref_it;
1073
 
  Natural_join_column *cur_column_ref;
1074
 
public:
1075
 
  Field_iterator_natural_join() :cur_column_ref(NULL) {}
1076
 
  ~Field_iterator_natural_join() {}
1077
 
  void set(TABLE_LIST *table);
1078
 
  void next();
1079
 
  bool end_of_fields() { return !cur_column_ref; }
1080
 
  const char *name() { return cur_column_ref->name(); }
1081
 
  Item *create_item(THD *thd) { return cur_column_ref->create_item(thd); }
1082
 
  Field *field() { return cur_column_ref->field(); }
1083
 
  Natural_join_column *column_ref() { return cur_column_ref; }
1084
 
};
1085
 
 
1086
 
 
1087
 
/*
1088
 
  Generic iterator over the fields of an arbitrary table reference.
1089
 
 
1090
 
  DESCRIPTION
1091
 
    This class unifies the various ways of iterating over the columns
1092
 
    of a table reference depending on the type of SQL entity it
1093
 
    represents. If such an entity represents a nested table reference,
1094
 
    this iterator encapsulates the iteration over the columns of the
1095
 
    members of the table reference.
1096
 
 
1097
 
  IMPLEMENTATION
1098
 
    The implementation assumes that all underlying NATURAL/USING table
1099
 
    references already contain their result columns and are linked into
1100
 
    the list TABLE_LIST::next_name_resolution_table.
1101
 
*/
1102
 
 
1103
 
class Field_iterator_table_ref: public Field_iterator
1104
 
{
1105
 
  TABLE_LIST *table_ref, *first_leaf, *last_leaf;
1106
 
  Field_iterator_table        table_field_it;
1107
 
  Field_iterator_view         view_field_it;
1108
 
  Field_iterator_natural_join natural_join_it;
1109
 
  Field_iterator *field_it;
1110
 
  void set_field_iterator();
1111
 
public:
1112
 
  Field_iterator_table_ref() :field_it(NULL) {}
1113
 
  void set(TABLE_LIST *table);
1114
 
  void next();
1115
 
  bool end_of_fields()
1116
 
  { return (table_ref == last_leaf && field_it->end_of_fields()); }
1117
 
  const char *name() { return field_it->name(); }
1118
 
  const char *table_name();
1119
 
  const char *db_name();
1120
 
  Item *create_item(THD *thd) { return field_it->create_item(thd); }
1121
 
  Field *field() { return field_it->field(); }
1122
 
  Natural_join_column *get_or_create_column_ref(TABLE_LIST *parent_table_ref);
1123
 
  Natural_join_column *get_natural_column_ref();
1124
 
};
1125
 
 
1126
 
 
1127
 
typedef struct st_nested_join
1128
 
{
1129
 
  List<TABLE_LIST>  join_list;       /* list of elements in the nested join */
1130
 
  table_map         used_tables;     /* bitmap of tables in the nested join */
1131
 
  table_map         not_null_tables; /* tables that rejects nulls           */
1132
 
  struct st_join_table *first_nested;/* the first nested table in the plan  */
1133
 
  /* 
1134
 
    Used to count tables in the nested join in 2 isolated places:
1135
 
    1. In make_outerjoin_info(). 
1136
 
    2. check_interleaving_with_nj/restore_prev_nj_state (these are called
1137
 
       by the join optimizer. 
1138
 
    Before each use the counters are zeroed by reset_nj_counters.
1139
 
  */
1140
 
  uint              counter_;
1141
 
  nested_join_map   nj_map;          /* Bit used to identify this nested join*/
1142
 
  /*
1143
 
    (Valid only for semi-join nests) Bitmap of tables outside the semi-join
1144
 
    that are used within the semi-join's ON condition.
1145
 
  */
1146
 
  table_map         sj_depends_on;
1147
 
  /* Outer non-trivially correlated tables */
1148
 
  table_map         sj_corr_tables;
1149
 
  List<Item>        sj_outer_expr_list;
1150
 
} NESTED_JOIN;
1151
 
 
1152
 
 
1153
724
typedef struct st_changed_table_list
1154
725
{
1155
726
  struct        st_changed_table_list *next;
1156
727
  char          *key;
1157
 
  uint32        key_length;
1158
 
} CHANGED_TABLE_LIST;
1159
 
 
1160
 
 
1161
 
typedef struct st_open_table_list{
 
728
  uint32_t        key_length;
 
729
} CHANGED_TableList;
 
730
 
 
731
 
 
732
typedef struct st_open_table_list
 
733
{
1162
734
  struct st_open_table_list *next;
1163
735
  char  *db,*table;
1164
 
  uint32 in_use,locked;
1165
 
} OPEN_TABLE_LIST;
1166
 
 
1167
 
typedef struct st_table_field_w_type
1168
 
{
1169
 
  LEX_STRING name;
1170
 
  LEX_STRING type;
1171
 
  LEX_STRING cset;
1172
 
} TABLE_FIELD_W_TYPE;
1173
 
 
1174
 
 
1175
 
bool
1176
 
table_check_intact(TABLE *table, const uint table_f_count,
1177
 
                   const TABLE_FIELD_W_TYPE *table_def);
1178
 
 
1179
 
static inline my_bitmap_map *tmp_use_all_columns(TABLE *table,
1180
 
                                                 MY_BITMAP *bitmap)
1181
 
{
1182
 
  my_bitmap_map *old= bitmap->bitmap;
1183
 
  bitmap->bitmap= table->s->all_set.bitmap;
1184
 
  return old;
1185
 
}
1186
 
 
1187
 
 
1188
 
static inline void tmp_restore_column_map(MY_BITMAP *bitmap,
1189
 
                                          my_bitmap_map *old)
1190
 
{
1191
 
  bitmap->bitmap= old;
1192
 
}
1193
 
 
1194
 
/* The following is only needed for debugging */
1195
 
 
1196
 
static inline my_bitmap_map *dbug_tmp_use_all_columns(TABLE *table __attribute__((__unused__)),
1197
 
                                                      MY_BITMAP *bitmap __attribute__((__unused__)))
1198
 
{
1199
 
  return 0;
1200
 
}
1201
 
 
1202
 
static inline void dbug_tmp_restore_column_map(MY_BITMAP *bitmap __attribute__((__unused__)),
1203
 
                                               my_bitmap_map *old __attribute__((__unused__)))
1204
 
{
1205
 
  return;
1206
 
}
1207
 
 
1208
 
size_t max_row_length(TABLE *table, const uchar *data);
1209
 
 
 
736
  uint32_t in_use,locked;
 
737
} OPEN_TableList;
 
738
 
 
739
 
 
740
#endif /* DRIZZLED_TABLE_H */