~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to server/table.h

  • Committer: Toru Maesaka
  • Date: 2008-07-17 05:59:20 UTC
  • mto: (202.1.1 toru)
  • mto: This revision was merged to the branch mainline in revision 204.
  • Revision ID: dev@torum.net-20080717055920-10okif50x6nh7b1d
forgot to bzr-add new files in the previous push

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; 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 */
 
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 */
34
20
class Item_subselect;
35
21
class st_select_lex_unit;
36
22
class st_select_lex;
37
23
class COND_EQUAL;
38
24
class Security_context;
39
 
class TableList;
40
25
 
41
26
/*************************************************************************/
42
27
 
 
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
 
43
46
enum tmp_table_type
44
47
{
45
48
  NO_TMP_TABLE, NON_TRANSACTIONAL_TMP_TABLE, TRANSACTIONAL_TMP_TABLE,
46
49
  INTERNAL_TMP_TABLE, SYSTEM_TMP_TABLE, TMP_TABLE_FRM_FILE_ONLY
47
50
};
48
51
 
49
 
bool mysql_frm_type(THD *thd, char *path, enum legacy_db_type *dbt);
 
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);
50
59
 
51
60
 
52
61
enum release_type { RELEASE_NORMAL, RELEASE_WAIT_FOR_DROP };
53
62
 
 
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
 
54
78
/*
55
79
  Values in this enum are used to indicate how a tables TIMESTAMP field
56
80
  should be treated. It can be set to the current timestamp on insert or
71
95
 
72
96
class Field_timestamp;
73
97
class Field_blob;
 
98
class Table_triggers_list;
74
99
 
75
100
/**
76
101
  Category of table found in the table share.
89
114
    - FLUSH TABLES WITH READ LOCK
90
115
    - SET GLOBAL READ_ONLY = ON
91
116
    do not apply to this table.
92
 
    Note that LOCK Table t FOR READ/WRITE
 
117
    Note that LOCK TABLE t FOR READ/WRITE
93
118
    can be used on temporary tables.
94
119
    Temporary tables are not part of the table cache.
95
120
  */
98
123
  /**
99
124
    User table.
100
125
    These tables do honor:
101
 
    - LOCK Table t FOR READ/WRITE
 
126
    - LOCK TABLE t FOR READ/WRITE
102
127
    - FLUSH TABLES WITH READ LOCK
103
128
    - SET GLOBAL READ_ONLY = ON
104
129
    User tables are cached in the table cache.
106
131
  TABLE_CATEGORY_USER=2,
107
132
 
108
133
  /**
 
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
  /**
109
146
    Information schema tables.
110
147
    These tables are an interface provided by the system
111
148
    to inspect the system metadata.
112
149
    These tables do *not* honor:
113
 
    - LOCK Table t FOR READ/WRITE
 
150
    - LOCK TABLE t FOR READ/WRITE
114
151
    - FLUSH TABLES WITH READ LOCK
115
152
    - SET GLOBAL READ_ONLY = ON
116
153
    as there is no point in locking explicitely
125
162
    to I_S tables in the table cache, which should use
126
163
    this table type.
127
164
  */
128
 
  TABLE_CATEGORY_INFORMATION
 
165
  TABLE_CATEGORY_INFORMATION=4
129
166
};
130
167
typedef enum enum_table_category TABLE_CATEGORY;
131
168
 
155
192
  struct st_table_share *next,          /* Link to unused shares */
156
193
    **prev;
157
194
 
158
 
  /* The following is copied to each Table on OPEN */
 
195
  /* The following is copied to each TABLE on OPEN */
159
196
  Field **field;
160
197
  Field **found_next_number_field;
161
198
  Field *timestamp_field;               /* Used only during open */
162
199
  KEY  *key_info;                       /* data of keys in database */
163
200
  uint  *blob_field;                    /* Index to blobs in Field arrray*/
164
201
 
165
 
  unsigned char *default_values;                /* row with default values */
 
202
  uchar *default_values;                /* row with default values */
166
203
  LEX_STRING comment;                   /* Comment about table */
167
 
  const CHARSET_INFO *table_charset; /* Default charset of string fields */
 
204
  CHARSET_INFO *table_charset;          /* Default charset of string fields */
168
205
 
169
206
  MY_BITMAP all_set;
170
207
  /*
180
217
  LEX_STRING table_cache_key;
181
218
  LEX_STRING db;                        /* Pointer to db */
182
219
  LEX_STRING table_name;                /* Table name (for open) */
183
 
  LEX_STRING path;      /* Path to .frm file (from datadir) */
 
220
  LEX_STRING path;                      /* Path to .frm file (from datadir) */
184
221
  LEX_STRING normalized_path;           /* unpack_filename(path) */
185
222
  LEX_STRING connect_string;
186
223
 
187
 
  /*
 
224
  /* 
188
225
     Set of keys in use, implemented as a Bitmap.
189
 
     Excludes keys disabled by ALTER Table ... DISABLE KEYS.
 
226
     Excludes keys disabled by ALTER TABLE ... DISABLE KEYS.
190
227
  */
191
228
  key_map keys_in_use;
192
229
  key_map keys_for_keyread;
193
230
  ha_rows min_rows, max_rows;           /* create information */
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 */
 
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 */
199
235
 
200
236
  plugin_ref db_plugin;                 /* storage engine plugin */
201
237
  inline handlerton *db_type() const    /* table_type for handler */
202
 
  {
 
238
  { 
203
239
    // assert(db_plugin);
204
240
    return db_plugin ? plugin_data(db_plugin, handlerton*) : NULL;
205
241
  }
208
244
  enum ha_choice transactional;
209
245
  enum ha_choice page_checksum;
210
246
 
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 */
 
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 */
229
266
  /* Index of auto-updated TIMESTAMP field in field array */
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;
 
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;
237
274
  bool null_field_first;
 
275
  bool system;                          /* Set if system table (one record) */
 
276
  bool crypted;                         /* If .frm file is crypted */
238
277
  bool db_low_byte_first;               /* Portable row format */
239
278
  bool crashed;
240
279
  bool name_lock, replace_with_name_lock;
241
280
  bool waiting_on_cond;                 /* Protection against free */
242
 
  uint32_t table_map_id;                   /* for row-based replication */
 
281
  ulong table_map_id;                   /* for row-based replication */
243
282
  uint64_t table_map_version;
244
283
 
245
284
  /*
266
305
      appropriate values by using table cache key as their source.
267
306
  */
268
307
 
269
 
  void set_table_cache_key(char *key_buff, uint32_t key_length)
 
308
  void set_table_cache_key(char *key_buff, uint key_length)
270
309
  {
271
310
    table_cache_key.str= key_buff;
272
311
    table_cache_key.length= key_length;
296
335
      it should has same life-time as share itself.
297
336
  */
298
337
 
299
 
  void set_table_cache_key(char *key_buff, const char *key, uint32_t key_length)
 
338
  void set_table_cache_key(char *key_buff, const char *key, uint key_length)
300
339
  {
301
340
    memcpy(key_buff, key, key_length);
302
341
    set_table_cache_key(key_buff, key_length);
304
343
 
305
344
  inline bool honor_global_locks()
306
345
  {
307
 
    return (table_category == TABLE_CATEGORY_USER);
 
346
    return ((table_category == TABLE_CATEGORY_USER)
 
347
            || (table_category == TABLE_CATEGORY_SYSTEM));
308
348
  }
309
349
 
310
 
  inline uint32_t get_table_def_version()
 
350
  inline ulong get_table_def_version()
311
351
  {
312
352
    return table_map_id;
313
353
  }
315
355
} TABLE_SHARE;
316
356
 
317
357
 
318
 
extern uint32_t refresh_version;
 
358
extern ulong refresh_version;
319
359
 
320
360
/* Information for one open table */
321
361
enum index_hint_type
325
365
  INDEX_HINT_FORCE
326
366
};
327
367
 
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:
 
368
struct st_table {
 
369
  st_table() {}                               /* Remove gcc warning */
 
370
 
343
371
  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
 
 
386
372
  handler       *file;
387
 
  Table *next, *prev;
 
373
  struct st_table *next, *prev;
388
374
 
389
375
  THD   *in_use;                        /* Which thread uses this */
390
376
  Field **field;                        /* Pointer to fields */
391
377
 
392
 
  unsigned char *record[2];                     /* Pointer to records */
393
 
  unsigned char *write_row_record;              /* Used as optimisation in
 
378
  uchar *record[2];                     /* Pointer to records */
 
379
  uchar *write_row_record;              /* Used as optimisation in
394
380
                                           THD::write_row */
395
 
  unsigned char *insert_values;                  /* used by INSERT ... UPDATE */
 
381
  uchar *insert_values;                  /* used by INSERT ... UPDATE */
396
382
  /* 
397
383
    Map of keys that can be used to retrieve all data from this table 
398
384
    needed by the query without reading the row.
403
389
    A set of keys that can be used in the query that references this
404
390
    table.
405
391
 
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
 
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
408
394
    that t.keys_in_use_for_query is a subset of t.s.keys_in_use. Generally we 
409
395
    must not introduce any new keys here (see setup_tables).
410
396
 
421
407
  Field *found_next_number_field;       /* Set on open */
422
408
  Field_timestamp *timestamp_field;
423
409
 
424
 
  TableList *pos_in_table_list;/* Element referring to this table */
425
 
  order_st *group;
 
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;
426
414
  const char    *alias;                   /* alias or table name */
427
 
  unsigned char         *null_flags;
 
415
  uchar         *null_flags;
428
416
  my_bitmap_map *bitmap_init_value;
429
417
  MY_BITMAP     def_read_set, def_write_set, tmp_set; /* containers */
430
418
  MY_BITMAP     *read_set, *write_set;          /* Active column sets */
485
473
  timestamp_auto_set_type timestamp_field_type;
486
474
  table_map     map;                    /* ID bit of table (1,2,4,8,16...) */
487
475
 
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 */
 
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 */
491
479
  uint          tablenr,used_fields;
492
 
  uint32_t          temp_pool_slot;             /* Used by intern temp tables */
 
480
  uint          temp_pool_slot;         /* Used by intern temp tables */
493
481
  uint          status;                 /* What's in record[0] */
 
482
  uint          db_stat;                /* mode of file as in handler.h */
494
483
  /* number of select if it is derived table */
495
 
  uint32_t          derived_select_number;
 
484
  uint          derived_select_number;
496
485
  int           current_lock;           /* Type of lock on table */
497
 
  bool copy_blobs;                      /* copy_blobs when storing */
 
486
  my_bool copy_blobs;                   /* copy_blobs when storing */
498
487
 
499
488
  /*
500
489
    0 or JOIN_TYPE_{LEFT|RIGHT}. Currently this is only compared to 0.
501
490
    If maybe_null !=0, this table is inner w.r.t. some outer join operation,
502
491
    and null_row may be true.
503
492
  */
504
 
  bool maybe_null;
505
 
 
 
493
  uint maybe_null;
506
494
  /*
507
495
    If true, the current table row is considered to have all columns set to 
508
496
    NULL, including columns declared as "not null" (see maybe_null).
509
497
  */
510
 
  bool null_row;
 
498
  my_bool null_row;
511
499
 
512
 
  bool force_index;
513
 
  bool distinct,const_table,no_rows;
514
 
  bool key_read, no_keyread;
 
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;
515
508
  /*
516
509
    Placeholder for an open table which prevents other connections
517
510
    from taking name-locks on this table. Typically used with
529
522
    object associated with it (db_stat is always 0), but please do
530
523
    not rely on that.
531
524
  */
532
 
  bool open_placeholder;
533
 
  bool locked_by_logger;
534
 
  bool no_replicate;
535
 
  bool locked_by_name;
536
 
  bool no_cache;
 
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;
537
530
  /* To signal that the table is associated with a HANDLER statement */
538
 
  bool open_by_handler;
 
531
  my_bool open_by_handler;
539
532
  /*
540
533
    To indicate that a non-null value of the auto_increment field
541
534
    was provided by the user or retrieved from the current record.
542
535
    Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode.
543
536
  */
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 */
 
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 */
548
541
 
549
542
  REGINFO reginfo;                      /* field connections */
550
543
  MEM_ROOT mem_root;
551
 
  filesort_info_st sort;
 
544
  FILESORT_INFO sort;
552
545
 
553
546
  bool fill_item_list(List<Item> *item_list) const;
554
547
  void reset_item_list(List<Item> *item_list) const;
555
548
  void clear_column_bitmaps(void);
556
549
  void prepare_for_position(void);
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);
 
550
  void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map);
 
551
  void mark_columns_used_by_index(uint index);
559
552
  void restore_column_maps_after_mark_index();
560
553
  void mark_auto_increment_column(void);
561
554
  void mark_columns_needed_for_update(void);
575
568
    read_set= read_set_arg;
576
569
    write_set= write_set_arg;
577
570
  }
578
 
 
579
 
  void restore_column_map(my_bitmap_map *old);
580
 
 
581
 
  my_bitmap_map *use_all_columns(MY_BITMAP *bitmap);
582
571
  inline void use_all_columns()
583
572
  {
584
573
    column_bitmaps_set(&s->all_set, &s->all_set);
585
574
  }
586
 
 
587
575
  inline void default_column_bitmaps()
588
576
  {
589
577
    read_set= &def_read_set;
590
578
    write_set= &def_write_set;
591
579
  }
592
 
 
593
580
  /* Is table open or should be treated as such by name-locking? */
594
581
  inline bool is_name_opened() { return db_stat || open_placeholder; }
595
582
  /*
597
584
  */
598
585
  inline bool needs_reopen_or_name_lock()
599
586
  { return s->version != refresh_version; }
 
587
};
600
588
 
601
 
  int report_error(int error);
 
589
enum enum_schema_table_state
 
590
 
591
  NOT_PROCESSED= 0,
 
592
  PROCESSED_BY_CREATE_SORT_INDEX,
 
593
  PROCESSED_BY_JOIN_EXEC
602
594
};
603
595
 
604
596
typedef struct st_foreign_key_info
660
652
     For string-type columns, this is the maximum number of
661
653
     characters. Otherwise, it is the 'display-length' for the column.
662
654
  */
663
 
  uint32_t field_length;
 
655
  uint field_length;
664
656
  /**
665
657
     This denotes data type for the column. For the most part, there seems to
666
658
     be one entry in the enum for each SQL data type, although there seem to
676
668
     combine them using the bitwise or operator @c |. Both flags are
677
669
     defined in table.h.
678
670
   */
679
 
  uint32_t field_flags;        // Field atributes(maybe_null, signed, unsigned etc.)
 
671
  uint field_flags;        // Field atributes(maybe_null, signed, unsigned etc.)
680
672
  const char* old_name;
681
673
  /**
682
674
     This should be one of @c SKIP_OPEN_TABLE,
683
675
     @c OPEN_FRM_ONLY or @c OPEN_FULL_TABLE.
684
676
  */
685
 
  uint32_t open_method;
 
677
  uint open_method;
686
678
} ST_FIELD_INFO;
687
679
 
688
680
 
689
 
class TableList;
 
681
struct TABLE_LIST;
690
682
typedef class Item COND;
691
683
 
692
 
struct ST_SCHEMA_TABLE
 
684
typedef struct st_schema_table
693
685
{
694
686
  const char* table_name;
695
687
  ST_FIELD_INFO *fields_info;
696
688
  /* Create information_schema table */
697
 
  Table *(*create_table)  (THD *thd, TableList *table_list);
 
689
  TABLE *(*create_table)  (THD *thd, TABLE_LIST *table_list);
698
690
  /* Fill table with data */
699
 
  int (*fill_table) (THD *thd, TableList *tables, COND *cond);
 
691
  int (*fill_table) (THD *thd, TABLE_LIST *tables, COND *cond);
700
692
  /* Handle fileds for old SHOW */
701
 
  int (*old_format) (THD *thd, struct ST_SCHEMA_TABLE *schema_table);
702
 
  int (*process_table) (THD *thd, TableList *tables, Table *table,
 
693
  int (*old_format) (THD *thd, struct st_schema_table *schema_table);
 
694
  int (*process_table) (THD *thd, TABLE_LIST *tables, TABLE *table,
703
695
                        bool res, LEX_STRING *db_name, LEX_STRING *table_name);
704
696
  int idx_field1, idx_field2; 
705
697
  bool hidden;
706
 
  uint32_t i_s_requested_object;  /* the object we need to open(Table | VIEW) */
707
 
};
 
698
  uint i_s_requested_object;  /* the object we need to open(TABLE | VIEW) */
 
699
} ST_SCHEMA_TABLE;
708
700
 
709
701
 
710
702
#define JOIN_TYPE_LEFT  1
714
706
class select_union;
715
707
class TMP_TABLE_PARAM;
716
708
 
 
709
Item *create_view_field(THD *thd, TABLE_LIST *view, Item **field_ref,
 
710
                        const char *name);
 
711
 
717
712
struct Field_translator
718
713
{
719
714
  Item *item;
721
716
};
722
717
 
723
718
 
 
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
 
724
1153
typedef struct st_changed_table_list
725
1154
{
726
1155
  struct        st_changed_table_list *next;
727
1156
  char          *key;
728
 
  uint32_t        key_length;
729
 
} CHANGED_TableList;
730
 
 
731
 
 
732
 
typedef struct st_open_table_list
733
 
{
 
1157
  uint32        key_length;
 
1158
} CHANGED_TABLE_LIST;
 
1159
 
 
1160
 
 
1161
typedef struct st_open_table_list{
734
1162
  struct st_open_table_list *next;
735
1163
  char  *db,*table;
736
 
  uint32_t in_use,locked;
737
 
} OPEN_TableList;
738
 
 
739
 
 
740
 
#endif /* DRIZZLED_TABLE_H */
 
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