~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/table.h

  • Committer: Monty Taylor
  • Date: 2008-08-09 02:24:34 UTC
  • mto: (266.1.8 codestyle)
  • mto: This revision was merged to the branch mainline in revision 279.
  • Revision ID: monty@inaugust.com-20080809022434-97na8pnugghskxip
Removed mystringslt conv lib and replaced it with a noinst lib.

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
204
  const CHARSET_INFO *table_charset; /* Default charset of string fields */
168
205
 
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   block_size;                   /* create information */
 
233
  ulong   version, mysql_version;
 
234
  ulong   timestamp_offset;             /* Set to offset+1 of record */
 
235
  ulong   reclength;                    /* Recordlength */
199
236
 
200
237
  plugin_ref db_plugin;                 /* storage engine plugin */
201
238
  inline handlerton *db_type() const    /* table_type for handler */
202
 
  {
 
239
  { 
203
240
    // assert(db_plugin);
204
241
    return db_plugin ? plugin_data(db_plugin, handlerton*) : NULL;
205
242
  }
208
245
  enum ha_choice transactional;
209
246
  enum ha_choice page_checksum;
210
247
 
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 */
 
248
  uint ref_count;                       /* How many TABLE objects uses this */
 
249
  uint open_count;                      /* Number of tables in open list */
 
250
  uint blob_ptr_size;                   /* 4 or 8 */
 
251
  uint key_block_size;                  /* create key_block_size, if used */
 
252
  uint null_bytes, last_null_bit_pos;
 
253
  uint fields;                          /* Number of fields */
 
254
  uint rec_buff_length;                 /* Size of table->record[] buffer */
 
255
  uint keys, key_parts;
 
256
  uint max_key_length, max_unique_length, total_key_length;
 
257
  uint uniques;                         /* Number of UNIQUE index */
 
258
  uint null_fields;                     /* number of null fields */
 
259
  uint blob_fields;                     /* number of blob fields */
 
260
  uint timestamp_field_offset;          /* Field number for timestamp field */
 
261
  uint varchar_fields;                  /* number of varchar fields */
 
262
  uint db_create_options;               /* Create options from database */
 
263
  uint db_options_in_use;               /* Options in use */
 
264
  uint db_record_offset;                /* if HA_REC_IN_SEQ */
 
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) */
238
276
  bool db_low_byte_first;               /* Portable row format */
239
277
  bool crashed;
240
278
  bool name_lock, replace_with_name_lock;
241
279
  bool waiting_on_cond;                 /* Protection against free */
242
 
  uint32_t table_map_id;                   /* for row-based replication */
 
280
  ulong table_map_id;                   /* for row-based replication */
243
281
  uint64_t table_map_version;
244
282
 
245
283
  /*
266
304
      appropriate values by using table cache key as their source.
267
305
  */
268
306
 
269
 
  void set_table_cache_key(char *key_buff, uint32_t key_length)
 
307
  void set_table_cache_key(char *key_buff, uint key_length)
270
308
  {
271
309
    table_cache_key.str= key_buff;
272
310
    table_cache_key.length= key_length;
296
334
      it should has same life-time as share itself.
297
335
  */
298
336
 
299
 
  void set_table_cache_key(char *key_buff, const char *key, uint32_t key_length)
 
337
  void set_table_cache_key(char *key_buff, const char *key, uint key_length)
300
338
  {
301
339
    memcpy(key_buff, key, key_length);
302
340
    set_table_cache_key(key_buff, key_length);
304
342
 
305
343
  inline bool honor_global_locks()
306
344
  {
307
 
    return (table_category == TABLE_CATEGORY_USER);
 
345
    return ((table_category == TABLE_CATEGORY_USER)
 
346
            || (table_category == TABLE_CATEGORY_SYSTEM));
308
347
  }
309
348
 
310
 
  inline uint32_t get_table_def_version()
 
349
  inline ulong get_table_def_version()
311
350
  {
312
351
    return table_map_id;
313
352
  }
315
354
} TABLE_SHARE;
316
355
 
317
356
 
318
 
extern uint32_t refresh_version;
 
357
extern ulong refresh_version;
319
358
 
320
359
/* Information for one open table */
321
360
enum index_hint_type
325
364
  INDEX_HINT_FORCE
326
365
};
327
366
 
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:
 
367
struct st_table {
 
368
  st_table() {}                               /* Remove gcc warning */
 
369
 
343
370
  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
371
  handler       *file;
387
 
  Table *next, *prev;
 
372
  struct st_table *next, *prev;
388
373
 
389
374
  THD   *in_use;                        /* Which thread uses this */
390
375
  Field **field;                        /* Pointer to fields */
391
376
 
392
 
  unsigned char *record[2];                     /* Pointer to records */
393
 
  unsigned char *write_row_record;              /* Used as optimisation in
 
377
  uchar *record[2];                     /* Pointer to records */
 
378
  uchar *write_row_record;              /* Used as optimisation in
394
379
                                           THD::write_row */
395
 
  unsigned char *insert_values;                  /* used by INSERT ... UPDATE */
 
380
  uchar *insert_values;                  /* used by INSERT ... UPDATE */
396
381
  /* 
397
382
    Map of keys that can be used to retrieve all data from this table 
398
383
    needed by the query without reading the row.
403
388
    A set of keys that can be used in the query that references this
404
389
    table.
405
390
 
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
 
391
    All indexes disabled on the table's TABLE_SHARE (see TABLE::s) will be 
 
392
    subtracted from this set upon instantiation. Thus for any TABLE t it holds
408
393
    that t.keys_in_use_for_query is a subset of t.s.keys_in_use. Generally we 
409
394
    must not introduce any new keys here (see setup_tables).
410
395
 
421
406
  Field *found_next_number_field;       /* Set on open */
422
407
  Field_timestamp *timestamp_field;
423
408
 
424
 
  TableList *pos_in_table_list;/* Element referring to this table */
425
 
  order_st *group;
 
409
  /* Table's triggers, 0 if there are no of them */
 
410
  Table_triggers_list *triggers;
 
411
  TABLE_LIST *pos_in_table_list;/* Element referring to this table */
 
412
  ORDER         *group;
426
413
  const char    *alias;                   /* alias or table name */
427
 
  unsigned char         *null_flags;
 
414
  uchar         *null_flags;
428
415
  my_bitmap_map *bitmap_init_value;
429
416
  MY_BITMAP     def_read_set, def_write_set, tmp_set; /* containers */
430
417
  MY_BITMAP     *read_set, *write_set;          /* Active column sets */
485
472
  timestamp_auto_set_type timestamp_field_type;
486
473
  table_map     map;                    /* ID bit of table (1,2,4,8,16...) */
487
474
 
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 */
 
475
  uint          lock_position;          /* Position in MYSQL_LOCK.table */
 
476
  uint          lock_data_start;        /* Start pos. in MYSQL_LOCK.locks */
 
477
  uint          lock_count;             /* Number of locks */
491
478
  uint          tablenr,used_fields;
492
 
  uint32_t          temp_pool_slot;             /* Used by intern temp tables */
 
479
  uint          temp_pool_slot;         /* Used by intern temp tables */
493
480
  uint          status;                 /* What's in record[0] */
 
481
  uint          db_stat;                /* mode of file as in handler.h */
494
482
  /* number of select if it is derived table */
495
 
  uint32_t          derived_select_number;
 
483
  uint          derived_select_number;
496
484
  int           current_lock;           /* Type of lock on table */
497
 
  bool copy_blobs;                      /* copy_blobs when storing */
 
485
  my_bool copy_blobs;                   /* copy_blobs when storing */
498
486
 
499
487
  /*
500
488
    0 or JOIN_TYPE_{LEFT|RIGHT}. Currently this is only compared to 0.
501
489
    If maybe_null !=0, this table is inner w.r.t. some outer join operation,
502
490
    and null_row may be true.
503
491
  */
504
 
  bool maybe_null;
505
 
 
 
492
  uint maybe_null;
506
493
  /*
507
494
    If true, the current table row is considered to have all columns set to 
508
495
    NULL, including columns declared as "not null" (see maybe_null).
509
496
  */
510
 
  bool null_row;
 
497
  my_bool null_row;
511
498
 
512
 
  bool force_index;
513
 
  bool distinct,const_table,no_rows;
514
 
  bool key_read, no_keyread;
 
499
  /*
 
500
    TODO: Each of the following flags take up 8 bits. They can just as easily
 
501
    be put into one single unsigned long and instead of taking up 18
 
502
    bytes, it would take up 4.
 
503
  */
 
504
  my_bool force_index;
 
505
  my_bool distinct,const_table,no_rows;
 
506
  my_bool key_read, no_keyread;
515
507
  /*
516
508
    Placeholder for an open table which prevents other connections
517
509
    from taking name-locks on this table. Typically used with
529
521
    object associated with it (db_stat is always 0), but please do
530
522
    not rely on that.
531
523
  */
532
 
  bool open_placeholder;
533
 
  bool locked_by_logger;
534
 
  bool no_replicate;
535
 
  bool locked_by_name;
536
 
  bool no_cache;
 
524
  my_bool open_placeholder;
 
525
  my_bool locked_by_logger;
 
526
  my_bool no_replicate;
 
527
  my_bool locked_by_name;
 
528
  my_bool no_cache;
537
529
  /* To signal that the table is associated with a HANDLER statement */
538
 
  bool open_by_handler;
 
530
  my_bool open_by_handler;
539
531
  /*
540
532
    To indicate that a non-null value of the auto_increment field
541
533
    was provided by the user or retrieved from the current record.
542
534
    Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode.
543
535
  */
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 */
 
536
  my_bool auto_increment_field_not_null;
 
537
  my_bool insert_or_update;             /* Can be used by the handler */
 
538
  my_bool alias_name_used;              /* true if table_name is alias */
 
539
  my_bool get_fields_in_item_tree;      /* Signal to fix_field */
548
540
 
549
541
  REGINFO reginfo;                      /* field connections */
550
542
  MEM_ROOT mem_root;
551
 
  filesort_info_st sort;
 
543
  FILESORT_INFO sort;
552
544
 
553
545
  bool fill_item_list(List<Item> *item_list) const;
554
546
  void reset_item_list(List<Item> *item_list) const;
555
547
  void clear_column_bitmaps(void);
556
548
  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);
 
549
  void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map);
 
550
  void mark_columns_used_by_index(uint index);
559
551
  void restore_column_maps_after_mark_index();
560
552
  void mark_auto_increment_column(void);
561
553
  void mark_columns_needed_for_update(void);
575
567
    read_set= read_set_arg;
576
568
    write_set= write_set_arg;
577
569
  }
578
 
 
579
 
  void restore_column_map(my_bitmap_map *old);
580
 
 
581
 
  my_bitmap_map *use_all_columns(MY_BITMAP *bitmap);
582
570
  inline void use_all_columns()
583
571
  {
584
572
    column_bitmaps_set(&s->all_set, &s->all_set);
585
573
  }
586
 
 
587
574
  inline void default_column_bitmaps()
588
575
  {
589
576
    read_set= &def_read_set;
590
577
    write_set= &def_write_set;
591
578
  }
592
 
 
593
579
  /* Is table open or should be treated as such by name-locking? */
594
580
  inline bool is_name_opened() { return db_stat || open_placeholder; }
595
581
  /*
597
583
  */
598
584
  inline bool needs_reopen_or_name_lock()
599
585
  { return s->version != refresh_version; }
 
586
};
600
587
 
601
 
  int report_error(int error);
 
588
enum enum_schema_table_state
 
589
 
590
  NOT_PROCESSED= 0,
 
591
  PROCESSED_BY_CREATE_SORT_INDEX,
 
592
  PROCESSED_BY_JOIN_EXEC
602
593
};
603
594
 
604
595
typedef struct st_foreign_key_info
660
651
     For string-type columns, this is the maximum number of
661
652
     characters. Otherwise, it is the 'display-length' for the column.
662
653
  */
663
 
  uint32_t field_length;
 
654
  uint field_length;
664
655
  /**
665
656
     This denotes data type for the column. For the most part, there seems to
666
657
     be one entry in the enum for each SQL data type, although there seem to
676
667
     combine them using the bitwise or operator @c |. Both flags are
677
668
     defined in table.h.
678
669
   */
679
 
  uint32_t field_flags;        // Field atributes(maybe_null, signed, unsigned etc.)
 
670
  uint field_flags;        // Field atributes(maybe_null, signed, unsigned etc.)
680
671
  const char* old_name;
681
672
  /**
682
673
     This should be one of @c SKIP_OPEN_TABLE,
683
674
     @c OPEN_FRM_ONLY or @c OPEN_FULL_TABLE.
684
675
  */
685
 
  uint32_t open_method;
 
676
  uint open_method;
686
677
} ST_FIELD_INFO;
687
678
 
688
679
 
689
 
class TableList;
 
680
struct TABLE_LIST;
690
681
typedef class Item COND;
691
682
 
692
 
struct ST_SCHEMA_TABLE
 
683
typedef struct st_schema_table
693
684
{
694
685
  const char* table_name;
695
686
  ST_FIELD_INFO *fields_info;
696
687
  /* Create information_schema table */
697
 
  Table *(*create_table)  (THD *thd, TableList *table_list);
 
688
  TABLE *(*create_table)  (THD *thd, TABLE_LIST *table_list);
698
689
  /* Fill table with data */
699
 
  int (*fill_table) (THD *thd, TableList *tables, COND *cond);
 
690
  int (*fill_table) (THD *thd, TABLE_LIST *tables, COND *cond);
700
691
  /* 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,
 
692
  int (*old_format) (THD *thd, struct st_schema_table *schema_table);
 
693
  int (*process_table) (THD *thd, TABLE_LIST *tables, TABLE *table,
703
694
                        bool res, LEX_STRING *db_name, LEX_STRING *table_name);
704
695
  int idx_field1, idx_field2; 
705
696
  bool hidden;
706
 
  uint32_t i_s_requested_object;  /* the object we need to open(Table | VIEW) */
707
 
};
 
697
  uint i_s_requested_object;  /* the object we need to open(TABLE | VIEW) */
 
698
} ST_SCHEMA_TABLE;
708
699
 
709
700
 
710
701
#define JOIN_TYPE_LEFT  1
714
705
class select_union;
715
706
class TMP_TABLE_PARAM;
716
707
 
 
708
Item *create_view_field(THD *thd, TABLE_LIST *view, Item **field_ref,
 
709
                        const char *name);
 
710
 
717
711
struct Field_translator
718
712
{
719
713
  Item *item;
721
715
};
722
716
 
723
717
 
 
718
/*
 
719
  Column reference of a NATURAL/USING join. Since column references in
 
720
  joins can be both from views and stored tables, may point to either a
 
721
  Field (for tables), or a Field_translator (for views).
 
722
*/
 
723
 
 
724
class Natural_join_column: public Sql_alloc
 
725
{
 
726
public:
 
727
  Field_translator *view_field;  /* Column reference of merge view. */
 
728
  Field            *table_field; /* Column reference of table or temp view. */
 
729
  TABLE_LIST *table_ref; /* Original base table/view reference. */
 
730
  /*
 
731
    True if a common join column of two NATURAL/USING join operands. Notice
 
732
    that when we have a hierarchy of nested NATURAL/USING joins, a column can
 
733
    be common at some level of nesting but it may not be common at higher
 
734
    levels of nesting. Thus this flag may change depending on at which level
 
735
    we are looking at some column.
 
736
  */
 
737
  bool is_common;
 
738
public:
 
739
  Natural_join_column(Field_translator *field_param, TABLE_LIST *tab);
 
740
  Natural_join_column(Field *field_param, TABLE_LIST *tab);
 
741
  const char *name();
 
742
  Item *create_item(THD *thd);
 
743
  Field *field();
 
744
  const char *table_name();
 
745
  const char *db_name();
 
746
};
 
747
 
 
748
 
 
749
/*
 
750
  Table reference in the FROM clause.
 
751
 
 
752
  These table references can be of several types that correspond to
 
753
  different SQL elements. Below we list all types of TABLE_LISTs with
 
754
  the necessary conditions to determine when a TABLE_LIST instance
 
755
  belongs to a certain type.
 
756
 
 
757
  1) table (TABLE_LIST::view == NULL)
 
758
     - base table
 
759
       (TABLE_LIST::derived == NULL)
 
760
     - subquery - TABLE_LIST::table is a temp table
 
761
       (TABLE_LIST::derived != NULL)
 
762
     - information schema table
 
763
       (TABLE_LIST::schema_table != NULL)
 
764
       NOTICE: for schema tables TABLE_LIST::field_translation may be != NULL
 
765
  2) view (TABLE_LIST::view != NULL)
 
766
     - merge    (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_MERGE)
 
767
           also (TABLE_LIST::field_translation != NULL)
 
768
     - tmptable (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_TMPTABLE)
 
769
           also (TABLE_LIST::field_translation == NULL)
 
770
  3) nested table reference (TABLE_LIST::nested_join != NULL)
 
771
     - table sequence - e.g. (t1, t2, t3)
 
772
       TODO: how to distinguish from a JOIN?
 
773
     - general JOIN
 
774
       TODO: how to distinguish from a table sequence?
 
775
     - NATURAL JOIN
 
776
       (TABLE_LIST::natural_join != NULL)
 
777
       - JOIN ... USING
 
778
         (TABLE_LIST::join_using_fields != NULL)
 
779
     - semi-join
 
780
       ;
 
781
*/
 
782
 
 
783
class Index_hint;
 
784
struct TABLE_LIST
 
785
{
 
786
  TABLE_LIST() {}                          /* Remove gcc warning */
 
787
 
 
788
  /**
 
789
    Prepare TABLE_LIST that consists of one table instance to use in
 
790
    simple_open_and_lock_tables
 
791
  */
 
792
  inline void init_one_table(const char *db_name_arg,
 
793
                             const char *table_name_arg,
 
794
                             enum thr_lock_type lock_type_arg)
 
795
  {
 
796
    memset(this, 0, sizeof(*this));
 
797
    db= (char*) db_name_arg;
 
798
    table_name= alias= (char*) table_name_arg;
 
799
    lock_type= lock_type_arg;
 
800
  }
 
801
 
 
802
  /*
 
803
    List of tables local to a subquery (used by SQL_LIST). Considers
 
804
    views as leaves (unlike 'next_leaf' below). Created at parse time
 
805
    in st_select_lex::add_table_to_list() -> table_list.link_in_list().
 
806
  */
 
807
  TABLE_LIST *next_local;
 
808
  /* link in a global list of all queries tables */
 
809
  TABLE_LIST *next_global, **prev_global;
 
810
  char          *db, *alias, *table_name, *schema_table_name;
 
811
  char          *option;                /* Used by cache index  */
 
812
  Item          *on_expr;               /* Used with outer join */
 
813
  Item          *sj_on_expr;
 
814
  /*
 
815
    (Valid only for semi-join nests) Bitmap of tables that are within the
 
816
    semi-join (this is different from bitmap of all nest's children because
 
817
    tables that were pulled out of the semi-join nest remain listed as
 
818
    nest's children).
 
819
  */
 
820
  table_map     sj_inner_tables;
 
821
  /* Number of IN-compared expressions */
 
822
  uint          sj_in_exprs; 
 
823
  /*
 
824
    The structure of ON expression presented in the member above
 
825
    can be changed during certain optimizations. This member
 
826
    contains a snapshot of AND-OR structure of the ON expression
 
827
    made after permanent transformations of the parse tree, and is
 
828
    used to restore ON clause before every reexecution of a prepared
 
829
    statement or stored procedure.
 
830
  */
 
831
  Item          *prep_on_expr;
 
832
  COND_EQUAL    *cond_equal;            /* Used with outer join */
 
833
  /*
 
834
    During parsing - left operand of NATURAL/USING join where 'this' is
 
835
    the right operand. After parsing (this->natural_join == this) iff
 
836
    'this' represents a NATURAL or USING join operation. Thus after
 
837
    parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
 
838
  */
 
839
  TABLE_LIST *natural_join;
 
840
  /*
 
841
    True if 'this' represents a nested join that is a NATURAL JOIN.
 
842
    For one of the operands of 'this', the member 'natural_join' points
 
843
    to the other operand of 'this'.
 
844
  */
 
845
  bool is_natural_join;
 
846
  /* Field names in a USING clause for JOIN ... USING. */
 
847
  List<String> *join_using_fields;
 
848
  /*
 
849
    Explicitly store the result columns of either a NATURAL/USING join or
 
850
    an operand of such a join.
 
851
  */
 
852
  List<Natural_join_column> *join_columns;
 
853
  /* true if join_columns contains all columns of this table reference. */
 
854
  bool is_join_columns_complete;
 
855
 
 
856
  /*
 
857
    List of nodes in a nested join tree, that should be considered as
 
858
    leaves with respect to name resolution. The leaves are: views,
 
859
    top-most nodes representing NATURAL/USING joins, subqueries, and
 
860
    base tables. All of these TABLE_LIST instances contain a
 
861
    materialized list of columns. The list is local to a subquery.
 
862
  */
 
863
  TABLE_LIST *next_name_resolution_table;
 
864
  /* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
 
865
  List<Index_hint> *index_hints;
 
866
  TABLE        *table;                          /* opened table */
 
867
  uint          table_id; /* table id (from binlog) for opened table */
 
868
  /*
 
869
    select_result for derived table to pass it from table creation to table
 
870
    filling procedure
 
871
  */
 
872
  select_union  *derived_result;
 
873
  /*
 
874
    Reference from aux_tables to local list entry of main select of
 
875
    multi-delete statement:
 
876
    delete t1 from t2,t1 where t1.a<'B' and t2.b=t1.b;
 
877
    here it will be reference of first occurrence of t1 to second (as you
 
878
    can see this lists can't be merged)
 
879
  */
 
880
  TABLE_LIST    *correspondent_table;
 
881
  st_select_lex_unit *derived;          /* SELECT_LEX_UNIT of derived table */
 
882
  ST_SCHEMA_TABLE *schema_table;        /* Information_schema table */
 
883
  st_select_lex *schema_select_lex;
 
884
  /*
 
885
    True when the view field translation table is used to convert
 
886
    schema table fields for backwards compatibility with SHOW command.
 
887
  */
 
888
  bool schema_table_reformed;
 
889
  TMP_TABLE_PARAM *schema_table_param;
 
890
  /* link to select_lex where this table was used */
 
891
  st_select_lex *select_lex;
 
892
  Field_translator *field_translation;  /* array of VIEW fields */
 
893
  /* pointer to element after last one in translation table above */
 
894
  Field_translator *field_translation_end;
 
895
  /*
 
896
    List (based on next_local) of underlying tables of this view. I.e. it
 
897
    does not include the tables of subqueries used in the view. Is set only
 
898
    for merged views.
 
899
  */
 
900
  TABLE_LIST    *merge_underlying_list;
 
901
  /*
 
902
    - 0 for base tables
 
903
    - in case of the view it is the list of all (not only underlying
 
904
    tables but also used in subquery ones) tables of the view.
 
905
  */
 
906
  List<TABLE_LIST> *view_tables;
 
907
  /* most upper view this table belongs to */
 
908
  TABLE_LIST    *belong_to_view;
 
909
  /* Ptr to parent MERGE table list item. See top comment in ha_myisammrg.cc */
 
910
  TABLE_LIST    *parent_l;
 
911
  /*
 
912
    List of all base tables local to a subquery including all view
 
913
    tables. Unlike 'next_local', this in this list views are *not*
 
914
    leaves. Created in setup_tables() -> make_leaves_list().
 
915
  */
 
916
  TABLE_LIST    *next_leaf;
 
917
  /* data need by some engines in query cache*/
 
918
  uint64_t     engine_data;
 
919
  /* call back function for asking handler about caching in query cache */
 
920
  qc_engine_callback callback_func;
 
921
  thr_lock_type lock_type;
 
922
  uint          outer_join;             /* Which join type */
 
923
  uint          shared;                 /* Used in multi-upd */
 
924
  size_t        db_length;
 
925
  size_t        table_name_length;
 
926
  bool          straight;               /* optimize with prev table */
 
927
  bool          updating;               /* for replicate-do/ignore table */
 
928
  bool          force_index;            /* prefer index over table scan */
 
929
  bool          ignore_leaves;          /* preload only non-leaf nodes */
 
930
  table_map     dep_tables;             /* tables the table depends on      */
 
931
  table_map     on_expr_dep_tables;     /* tables on expression depends on  */
 
932
  struct st_nested_join *nested_join;   /* if the element is a nested join  */
 
933
  TABLE_LIST *embedding;             /* nested join containing the table */
 
934
  List<TABLE_LIST> *join_list;/* join list the table belongs to   */
 
935
  bool          cacheable_table;        /* stop PS caching */
 
936
  /* FRMTYPE_ERROR if any type is acceptable */
 
937
  enum frm_type_enum required_type;
 
938
  handlerton    *db_type;               /* table_type for handler */
 
939
  char          timestamp_buffer[20];   /* buffer for timestamp (19+1) */
 
940
  /*
 
941
    This TABLE_LIST object corresponds to the table to be created
 
942
    so it is possible that it does not exist (used in CREATE TABLE
 
943
    ... SELECT implementation).
 
944
  */
 
945
  bool          create;
 
946
  /* For transactional locking. */
 
947
  int           lock_timeout;           /* NOWAIT or WAIT [X]               */
 
948
  bool          lock_transactional;     /* If transactional lock requested. */
 
949
  bool          internal_tmp_table;
 
950
  /** true if an alias for this table was specified in the SQL. */
 
951
  bool          is_alias;
 
952
  /** true if the table is referred to in the statement using a fully
 
953
      qualified name (<db_name>.<table_name>).
 
954
  */
 
955
  bool          is_fqtn;
 
956
 
 
957
  uint i_s_requested_object;
 
958
  bool has_db_lookup_value;
 
959
  bool has_table_lookup_value;
 
960
  uint table_open_method;
 
961
  enum enum_schema_table_state schema_table_state;
 
962
  void set_underlying_merge();
 
963
  bool setup_underlying(THD *thd);
 
964
  void cleanup_items();
 
965
  /*
 
966
    If you change placeholder(), please check the condition in
 
967
    check_transactional_lock() too.
 
968
  */
 
969
  bool placeholder()
 
970
  {
 
971
    return derived || schema_table || (create && !table->db_stat) || !table;
 
972
  }
 
973
  void print(THD *thd, String *str, enum_query_type query_type);
 
974
  bool set_insert_values(MEM_ROOT *mem_root);
 
975
  TABLE_LIST *find_underlying_table(TABLE *table);
 
976
  TABLE_LIST *first_leaf_for_name_resolution();
 
977
  TABLE_LIST *last_leaf_for_name_resolution();
 
978
  bool is_leaf_for_name_resolution();
 
979
  inline TABLE_LIST *top_table()
 
980
    { return belong_to_view ? belong_to_view : this; }
 
981
 
 
982
  /*
 
983
    Cleanup for re-execution in a prepared statement or a stored
 
984
    procedure.
 
985
  */
 
986
  void reinit_before_use(THD *thd);
 
987
  Item_subselect *containing_subselect();
 
988
 
 
989
  /* 
 
990
    Compiles the tagged hints list and fills up st_table::keys_in_use_for_query,
 
991
    st_table::keys_in_use_for_group_by, st_table::keys_in_use_for_order_by,
 
992
    st_table::force_index and st_table::covering_keys.
 
993
  */
 
994
  bool process_index_hints(TABLE *table);
 
995
 
 
996
private:
 
997
  bool prep_where(THD *thd, Item **conds, bool no_where_clause);
 
998
  /*
 
999
    Cleanup for re-execution in a prepared statement or a stored
 
1000
    procedure.
 
1001
  */
 
1002
};
 
1003
 
 
1004
class Item;
 
1005
 
 
1006
/*
 
1007
  Iterator over the fields of a generic table reference.
 
1008
*/
 
1009
 
 
1010
class Field_iterator: public Sql_alloc
 
1011
{
 
1012
public:
 
1013
  Field_iterator() {}                         /* Remove gcc warning */
 
1014
  virtual ~Field_iterator() {}
 
1015
  virtual void set(TABLE_LIST *)= 0;
 
1016
  virtual void next()= 0;
 
1017
  virtual bool end_of_fields()= 0;              /* Return 1 at end of list */
 
1018
  virtual const char *name()= 0;
 
1019
  virtual Item *create_item(THD *)= 0;
 
1020
  virtual Field *field()= 0;
 
1021
};
 
1022
 
 
1023
 
 
1024
/* 
 
1025
  Iterator over the fields of a base table, view with temporary
 
1026
  table, or subquery.
 
1027
*/
 
1028
 
 
1029
class Field_iterator_table: public Field_iterator
 
1030
{
 
1031
  Field **ptr;
 
1032
public:
 
1033
  Field_iterator_table() :ptr(0) {}
 
1034
  void set(TABLE_LIST *table) { ptr= table->table->field; }
 
1035
  void set_table(TABLE *table) { ptr= table->field; }
 
1036
  void next() { ptr++; }
 
1037
  bool end_of_fields() { return *ptr == 0; }
 
1038
  const char *name();
 
1039
  Item *create_item(THD *thd);
 
1040
  Field *field() { return *ptr; }
 
1041
};
 
1042
 
 
1043
 
 
1044
/* Iterator over the fields of a merge view. */
 
1045
 
 
1046
class Field_iterator_view: public Field_iterator
 
1047
{
 
1048
  Field_translator *ptr, *array_end;
 
1049
  TABLE_LIST *view;
 
1050
public:
 
1051
  Field_iterator_view() :ptr(0), array_end(0) {}
 
1052
  void set(TABLE_LIST *table);
 
1053
  void next() { ptr++; }
 
1054
  bool end_of_fields() { return ptr == array_end; }
 
1055
  const char *name();
 
1056
  Item *create_item(THD *thd);
 
1057
  Item **item_ptr() {return &ptr->item; }
 
1058
  Field *field() { return 0; }
 
1059
  inline Item *item() { return ptr->item; }
 
1060
  Field_translator *field_translator() { return ptr; }
 
1061
};
 
1062
 
 
1063
 
 
1064
/*
 
1065
  Field_iterator interface to the list of materialized fields of a
 
1066
  NATURAL/USING join.
 
1067
*/
 
1068
 
 
1069
class Field_iterator_natural_join: public Field_iterator
 
1070
{
 
1071
  List_iterator_fast<Natural_join_column> column_ref_it;
 
1072
  Natural_join_column *cur_column_ref;
 
1073
public:
 
1074
  Field_iterator_natural_join() :cur_column_ref(NULL) {}
 
1075
  ~Field_iterator_natural_join() {}
 
1076
  void set(TABLE_LIST *table);
 
1077
  void next();
 
1078
  bool end_of_fields() { return !cur_column_ref; }
 
1079
  const char *name() { return cur_column_ref->name(); }
 
1080
  Item *create_item(THD *thd) { return cur_column_ref->create_item(thd); }
 
1081
  Field *field() { return cur_column_ref->field(); }
 
1082
  Natural_join_column *column_ref() { return cur_column_ref; }
 
1083
};
 
1084
 
 
1085
 
 
1086
/*
 
1087
  Generic iterator over the fields of an arbitrary table reference.
 
1088
 
 
1089
  DESCRIPTION
 
1090
    This class unifies the various ways of iterating over the columns
 
1091
    of a table reference depending on the type of SQL entity it
 
1092
    represents. If such an entity represents a nested table reference,
 
1093
    this iterator encapsulates the iteration over the columns of the
 
1094
    members of the table reference.
 
1095
 
 
1096
  IMPLEMENTATION
 
1097
    The implementation assumes that all underlying NATURAL/USING table
 
1098
    references already contain their result columns and are linked into
 
1099
    the list TABLE_LIST::next_name_resolution_table.
 
1100
*/
 
1101
 
 
1102
class Field_iterator_table_ref: public Field_iterator
 
1103
{
 
1104
  TABLE_LIST *table_ref, *first_leaf, *last_leaf;
 
1105
  Field_iterator_table        table_field_it;
 
1106
  Field_iterator_view         view_field_it;
 
1107
  Field_iterator_natural_join natural_join_it;
 
1108
  Field_iterator *field_it;
 
1109
  void set_field_iterator();
 
1110
public:
 
1111
  Field_iterator_table_ref() :field_it(NULL) {}
 
1112
  void set(TABLE_LIST *table);
 
1113
  void next();
 
1114
  bool end_of_fields()
 
1115
  { return (table_ref == last_leaf && field_it->end_of_fields()); }
 
1116
  const char *name() { return field_it->name(); }
 
1117
  const char *table_name();
 
1118
  const char *db_name();
 
1119
  Item *create_item(THD *thd) { return field_it->create_item(thd); }
 
1120
  Field *field() { return field_it->field(); }
 
1121
  Natural_join_column *get_or_create_column_ref(TABLE_LIST *parent_table_ref);
 
1122
  Natural_join_column *get_natural_column_ref();
 
1123
};
 
1124
 
 
1125
 
 
1126
typedef struct st_nested_join
 
1127
{
 
1128
  List<TABLE_LIST>  join_list;       /* list of elements in the nested join */
 
1129
  table_map         used_tables;     /* bitmap of tables in the nested join */
 
1130
  table_map         not_null_tables; /* tables that rejects nulls           */
 
1131
  struct st_join_table *first_nested;/* the first nested table in the plan  */
 
1132
  /* 
 
1133
    Used to count tables in the nested join in 2 isolated places:
 
1134
    1. In make_outerjoin_info(). 
 
1135
    2. check_interleaving_with_nj/restore_prev_nj_state (these are called
 
1136
       by the join optimizer. 
 
1137
    Before each use the counters are zeroed by reset_nj_counters.
 
1138
  */
 
1139
  uint              counter_;
 
1140
  nested_join_map   nj_map;          /* Bit used to identify this nested join*/
 
1141
  /*
 
1142
    (Valid only for semi-join nests) Bitmap of tables outside the semi-join
 
1143
    that are used within the semi-join's ON condition.
 
1144
  */
 
1145
  table_map         sj_depends_on;
 
1146
  /* Outer non-trivially correlated tables */
 
1147
  table_map         sj_corr_tables;
 
1148
  List<Item>        sj_outer_expr_list;
 
1149
} NESTED_JOIN;
 
1150
 
 
1151
 
724
1152
typedef struct st_changed_table_list
725
1153
{
726
1154
  struct        st_changed_table_list *next;
727
1155
  char          *key;
728
1156
  uint32_t        key_length;
729
 
} CHANGED_TableList;
730
 
 
731
 
 
732
 
typedef struct st_open_table_list
733
 
{
 
1157
} CHANGED_TABLE_LIST;
 
1158
 
 
1159
 
 
1160
typedef struct st_open_table_list{
734
1161
  struct st_open_table_list *next;
735
1162
  char  *db,*table;
736
1163
  uint32_t in_use,locked;
737
 
} OPEN_TableList;
738
 
 
739
 
 
740
 
#endif /* DRIZZLED_TABLE_H */
 
1164
} OPEN_TABLE_LIST;
 
1165
 
 
1166
typedef struct st_table_field_w_type
 
1167
{
 
1168
  LEX_STRING name;
 
1169
  LEX_STRING type;
 
1170
  LEX_STRING cset;
 
1171
} TABLE_FIELD_W_TYPE;
 
1172
 
 
1173
 
 
1174
bool
 
1175
table_check_intact(TABLE *table, const uint table_f_count,
 
1176
                   const TABLE_FIELD_W_TYPE *table_def);
 
1177
 
 
1178
static inline my_bitmap_map *tmp_use_all_columns(TABLE *table,
 
1179
                                                 MY_BITMAP *bitmap)
 
1180
{
 
1181
  my_bitmap_map *old= bitmap->bitmap;
 
1182
  bitmap->bitmap= table->s->all_set.bitmap;
 
1183
  return old;
 
1184
}
 
1185
 
 
1186
 
 
1187
static inline void tmp_restore_column_map(MY_BITMAP *bitmap,
 
1188
                                          my_bitmap_map *old)
 
1189
{
 
1190
  bitmap->bitmap= old;
 
1191
}
 
1192
 
 
1193
/* The following is only needed for debugging */
 
1194
 
 
1195
static inline my_bitmap_map *dbug_tmp_use_all_columns(TABLE *table __attribute__((unused)),
 
1196
                                                      MY_BITMAP *bitmap __attribute__((unused)))
 
1197
{
 
1198
  return 0;
 
1199
}
 
1200
 
 
1201
static inline void dbug_tmp_restore_column_map(MY_BITMAP *bitmap __attribute__((unused)),
 
1202
                                               my_bitmap_map *old __attribute__((unused)))
 
1203
{
 
1204
  return;
 
1205
}
 
1206
 
 
1207
size_t max_row_length(TABLE *table, const uchar *data);
 
1208