table.h 18.3 KB
Newer Older
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
2

bk@work.mysql.com's avatar
bk@work.mysql.com committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
7

bk@work.mysql.com's avatar
bk@work.mysql.com committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
12

bk@work.mysql.com's avatar
bk@work.mysql.com committed
13 14 15 16 17 18 19 20 21
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */


/* Structs that defines the TABLE */

class Item;				/* Needed by ORDER */
class GRANT_TABLE;
22
class st_select_lex_unit;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
23
class st_select_lex;
24
class COND_EQUAL;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
25 26 27 28 29 30

/* Order clause list element */

typedef struct st_order {
  struct st_order *next;
  Item	 **item;			/* Point at item in select fields */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
31
  Item	 *item_ptr;			/* Storage for initial item */
32
  Item   **item_copy;			/* For SPs; the original item ptr */
33 34
  int    counter;                       /* position in SELECT list, correct
                                           only if counter_used is true*/
bk@work.mysql.com's avatar
bk@work.mysql.com committed
35 36 37
  bool	 asc;				/* true if ascending */
  bool	 free_me;			/* true if item isn't shared  */
  bool	 in_field_list;			/* true if in select field list */
38
  bool   counter_used;                  /* parameter was counter of columns */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
39 40
  Field  *field;			/* If tmp-table group */
  char	 *buff;				/* If tmp-table group */
41
  table_map used, depend_map;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
42 43 44 45 46 47
} ORDER;

typedef struct st_grant_info
{
  GRANT_TABLE *grant_table;
  uint version;
48 49
  ulong privilege;
  ulong want_privilege;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
50 51
} GRANT_INFO;

52 53
enum tmp_table_type {NO_TMP_TABLE=0, TMP_TABLE=1, TRANSACTIONAL_TMP_TABLE=2};

54 55 56 57 58 59 60
enum frm_type_enum
{
  FRMTYPE_ERROR= 0,
  FRMTYPE_TABLE,
  FRMTYPE_VIEW
};

igor@hundin.mysql.fi's avatar
igor@hundin.mysql.fi committed
61 62 63 64 65 66 67 68 69 70 71
typedef struct st_filesort_info
{
  IO_CACHE *io_cache;           /* If sorted through filebyte                */
  byte     *addon_buf;          /* Pointer to a buffer if sorted with fields */
  uint      addon_length;       /* Length of the buffer                      */
  struct st_sort_addon_field *addon_field;     /* Pointer to the fields info */
  void    (*unpack)(struct st_sort_addon_field *, byte *); /* To unpack back */
  byte     *record_pointers;    /* If sorted in memory                       */
  ha_rows   found_records;      /* How many records in sort                  */
} FILESORT_INFO;

igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
72

73 74 75 76 77 78 79 80 81 82
/*
  Values in this enum are used to indicate during which operations value
  of TIMESTAMP field should be set to current timestamp.
*/
enum timestamp_auto_set_type
{
  TIMESTAMP_NO_AUTO_SET= 0, TIMESTAMP_AUTO_SET_ON_INSERT= 1,
  TIMESTAMP_AUTO_SET_ON_UPDATE= 2, TIMESTAMP_AUTO_SET_ON_BOTH= 3
};

bk@work.mysql.com's avatar
bk@work.mysql.com committed
83 84
class Field_timestamp;
class Field_blob;
85
class Table_triggers_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
86

87 88 89 90
/* This structure is shared between different table objects */

typedef struct st_table_share
{
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
91
  /* hash of field names (contains pointers to elements of field array) */
92 93
  HASH	name_hash;			/* hash of field names */
  MEM_ROOT mem_root;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
94 95 96
  TYPELIB keynames;			/* Pointers to keynames */
  TYPELIB fieldnames;			/* Pointer to fieldnames */
  TYPELIB *intervals;			/* pointer to interval info */
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
#ifdef NOT_YET
  pthread_mutex_t mutex;                /* For locking the share  */
  pthread_cond_t cond;			/* To signal that share is ready */
  struct st_table *open_tables;		/* link to open tables */
  struct st_table *used_next,		/* Link to used tables */
		 **used_prev;
  /* The following is copied to each TABLE on OPEN */
  Field **field;
  KEY  *key_info;			/* data of keys in database */
#endif
  uint	*blob_field;			/* Index to blobs in Field arrray*/
  byte	*default_values;		/* row with default values */
  char	*comment;			/* Comment about table */
  CHARSET_INFO *table_charset;		/* Default charset of string fields */

  /* A pair "database_name\0table_name\0", widely used as simply a db name */
  char	*table_cache_key;
  const char *db;                       /* Pointer to db */
  const char *table_name;               /* Table name (for open) */
  const char *path;                     /* Path to .frm file (from datadir) */
  key_map keys_in_use;                  /* Keys in use for table */
  key_map keys_for_keyread;
  ulong   avg_row_length;		/* create information */
  ulong   raid_chunksize;
  ulong   version, flush_version;
  ulong   timestamp_offset;		/* Set to offset+1 of record */
  ulong   reclength;			/* Recordlength */

  ha_rows min_rows, max_rows;		/* create information */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
126 127
  enum db_type db_type;			/* table_type for handler */
  enum row_type row_type;		/* How rows are stored */
128 129 130 131 132 133 134 135 136 137 138 139
  enum tmp_table_type tmp_table;

  uint blob_ptr_size;			/* 4 or 8 */
  uint null_bytes;
  uint key_length;			/* Length of table_cache_key */
  uint fields;				/* Number of fields */
  uint rec_buff_length;                 /* Size of table->record[] buffer */
  uint keys, key_parts;
  uint max_key_length, max_unique_length, total_key_length;
  uint uniques;                         /* Number of UNIQUE index */
  uint null_fields;			/* number of null fields */
  uint blob_fields;			/* number of blob fields */
140
  uint varchar_fields;                  /* number of varchar fields */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
141 142 143
  uint db_create_options;		/* Create options from database */
  uint db_options_in_use;		/* Options in use */
  uint db_record_offset;		/* if HA_REC_IN_SEQ */
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
  uint raid_type, raid_chunks;
  uint open_count;			/* Number of tables in open list */
  /* Index of auto-updated TIMESTAMP field in field array */
  uint primary_key;
  uint timestamp_field_offset;
  uint next_number_index;
  uint next_number_key_offset;
  uchar	  frm_version;
  my_bool system;			/* Set if system record */
  my_bool crypted;                      /* If .frm file is crypted */
  my_bool db_low_byte_first;		/* Portable row format */
  my_bool crashed;
  my_bool is_view;
  my_bool name_lock, replace_with_name_lock;
} TABLE_SHARE;


/* Information for one open table */

struct st_table {
  TABLE_SHARE	*s;
  handler	*file;
#ifdef NOT_YET
  struct st_table *used_next, **used_prev;	/* Link to used tables */
  struct st_table *open_next, **open_prev;	/* Link to open tables */
#endif
  struct st_table *next, *prev;

  THD	*in_use;                        /* Which thread uses this */
  Field **field;			/* Pointer to fields */

  byte *record[2];			/* Pointer to records */
  byte *insert_values;                  /* used by INSERT ... UPDATE */
  key_map quick_keys, used_keys, keys_in_use_for_query;
  KEY  *key_info;			/* data of keys in database */

  Field *next_number_field,		/* Set if next_number is activated */
	*found_next_number_field,	/* Set on open */
        *rowid_field;
  Field_timestamp *timestamp_field;

  /* Table's triggers, 0 if there are no of them */
  Table_triggers_list *triggers;
  struct st_table_list *pos_in_table_list;/* Element referring to this table */
  ORDER		*group;
  const char	*alias;            	  /* alias or table name */
  uchar		*null_flags;
  ulong		query_id;

  ha_rows	quick_rows[MAX_KEY];
  key_part_map  const_key_parts[MAX_KEY];
  uint		quick_key_parts[MAX_KEY];
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
196

197 198 199 200 201 202 203 204 205 206 207
  /*
    If this table has TIMESTAMP field with auto-set property (pointed by
    timestamp_field member) then this variable indicates during which
    operations (insert only/on update/in both cases) we should set this
    field to current timestamp. If there are no such field in this table
    or we should not automatically set its value during execution of current
    statement then the variable contains TIMESTAMP_NO_AUTO_SET (i.e. 0).

    Value of this variable is set for each statement in open_table() and
    if needed cleared later in statement processing code (see mysql_update()
    as example).
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
208
  */
209
  timestamp_auto_set_type timestamp_field_type;
210
  table_map	map;                    /* ID bit of table (1,2,4,8,16...) */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
211
  
212 213 214 215 216 217 218
  uint		tablenr,used_fields;
  uint          temp_pool_slot;		/* Used by intern temp tables */
  uint		status;                 /* What's in record[0] */
  uint		db_stat;		/* mode of file as in handler.h */
  /* number of select if it is derived table */
  uint          derived_select_number;
  int		current_lock;           /* Type of lock on table */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
219
  my_bool copy_blobs;			/* copy_blobs when storing */
220 221 222 223 224 225 226
  
  /* 
    0 or JOIN_TYPE_{LEFT|RIGHT}. Currently this is only compared to 0.
    If maybe_null !=0, this table is inner w.r.t. some outer join operation,
    and null_row may be true.
  */
  uint maybe_null;
227
  /*
228 229
    If true, the current table row is considered to have all columns set to 
    NULL, including columns declared as "not null" (see maybe_null).
230 231
  */
  my_bool null_row;
232
  my_bool force_index;
233
  my_bool distinct,const_table,no_rows;
234
  my_bool key_read, no_keyread;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
235
  my_bool locked_by_flush;
236
  my_bool locked_by_name;
237
  my_bool fulltext_searched;
238 239 240
  my_bool no_cache;
  /* To signal that we should reset query_id for tables and cols */
  my_bool clear_query_id;
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
241
  my_bool auto_increment_field_not_null;
242
  my_bool insert_or_update;             /* Can be used by the handler */
243
  my_bool alias_name_used;		/* true if table_name is alias */
244

bk@work.mysql.com's avatar
bk@work.mysql.com committed
245 246 247
  REGINFO reginfo;			/* field connections */
  MEM_ROOT mem_root;
  GRANT_INFO grant;
igor@hundin.mysql.fi's avatar
igor@hundin.mysql.fi committed
248
  FILESORT_INFO sort;
249
  TABLE_SHARE share_not_to_be_used;     /* To be deleted when true shares */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
250 251 252
};


253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
typedef struct st_foreign_key_info
{
  LEX_STRING *forein_id;
  LEX_STRING *referenced_db;
  LEX_STRING *referenced_table;
  LEX_STRING *constraint_method;
  List<LEX_STRING> foreign_fields;
  List<LEX_STRING> referenced_fields;
} FOREIGN_KEY_INFO;


enum enum_schema_tables
{
  SCH_SCHEMATA= 0, SCH_TABLES, SCH_COLUMNS, SCH_CHARSETS, SCH_COLLATIONS,
  SCH_COLLATION_CHARACTER_SET_APPLICABILITY, SCH_PROCEDURES, SCH_STATISTICS,
  SCH_VIEWS, SCH_USER_PRIVILEGES, SCH_SCHEMA_PRIVILEGES, SCH_TABLE_PRIVILEGES,
  SCH_COLUMN_PRIVILEGES, SCH_TABLE_CONSTRAINTS, SCH_KEY_COLUMN_USAGE,
270
  SCH_TABLE_NAMES, SCH_OPEN_TABLES, SCH_STATUS, SCH_VARIABLES
271 272 273 274 275 276 277 278 279 280 281 282 283
};


typedef struct st_field_info
{
  const char* field_name;
  uint field_length;
  enum enum_field_types field_type;
  int value;
  bool maybe_null;
  const char* old_name;
} ST_FIELD_INFO;

284

285 286 287 288 289 290 291 292
struct st_table_list;
typedef class Item COND;

typedef struct st_schema_table
{
  const char* table_name;
  ST_FIELD_INFO *fields_info;
  /* Create information_schema table */
293
  TABLE *(*create_table)  (THD *thd, struct st_table_list *table_list);
294 295 296 297 298
  /* Fill table with data */
  int (*fill_table) (THD *thd, struct st_table_list *tables, COND *cond);
  /* Handle fileds for old SHOW */
  int (*old_format) (THD *thd, struct st_schema_table *schema_table);
  int (*process_table) (THD *thd, struct st_table_list *tables,
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
299
                        TABLE *table, bool res, const char *base_name,
300 301
                        const char *file_name);
  int idx_field1, idx_field2; 
302
  bool hidden;
303 304 305
} ST_SCHEMA_TABLE;


306 307 308
#define JOIN_TYPE_LEFT	1
#define JOIN_TYPE_RIGHT	2

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
309
#define VIEW_ALGORITHM_UNDEFINED	0
310
#define VIEW_ALGORITHM_TMPTABLE	1
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
311 312
#define VIEW_ALGORITHM_MERGE		2

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
313
/* view WITH CHECK OPTION parameter options */
314 315 316 317
#define VIEW_CHECK_NONE       0
#define VIEW_CHECK_LOCAL      1
#define VIEW_CHECK_CASCADED   2

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
318 319 320 321 322
/* result of view WITH CHECK OPTION parameter check */
#define VIEW_CHECK_OK         0
#define VIEW_CHECK_ERROR      1
#define VIEW_CHECK_SKIP       2

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
323
struct st_lex;
324
class select_union;
325

326 327 328 329 330
struct Field_translator
{
  Item *item;
  const char *name;
};
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
331

332

333 334
typedef struct st_table_list
{
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
335 336 337 338
  /* link in a local table list (used by SQL_LIST) */
  struct st_table_list *next_local;
  /* link in a global list of all queries tables */
  struct st_table_list *next_global, **prev_global;
339
  char		*db, *alias, *table_name, *schema_table_name;
340
  char          *option;                /* Used by cache index  */
341
  Item		*on_expr;		/* Used with outer join */
342 343 344 345 346 347 348 349 350
  /*
    The scturcture of ON expression presented in the member above
    can be changed during certain optimizations. This member
    contains a snapshot of AND-OR structure of the ON expression
    made after permanent transformations of the parse tree, and is
    used to restore ON clause before every reexecution of a prepared
    statement or stored procedure.
  */
  Item          *prep_on_expr;
351
  COND_EQUAL    *cond_equal;            /* Used with outer join */
352
  struct st_table_list *natural_join;	/* natural join on this table*/
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
353
  /* ... join ... USE INDEX ... IGNORE INDEX */
354
  List<String>	*use_index, *ignore_index;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
355
  TABLE         *table;                 /* opened table */
356 357 358 359 360
  /*
    select_result for derived table to pass it from table creation to table
    filling procedure
  */
  select_union  *derived_result;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
361 362 363 364 365 366 367 368 369
  /*
    Reference from aux_tables to local list entry of main select of
    multi-delete statement:
    delete t1 from t2,t1 where t1.a<'B' and t2.b=t1.b;
    here it will be reference of first occurrence of t1 to second (as you
    can see this lists can't be merged)
  */
  st_table_list	*correspondent_table;
  st_select_lex_unit *derived;		/* SELECT_LEX_UNIT of derived table */
370 371
  ST_SCHEMA_TABLE *schema_table;        /* Information_schema table */
  st_select_lex	*schema_select_lex;
372
  bool schema_table_reformed;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
373 374 375
  /* link to select_lex where this table was used */
  st_select_lex	*select_lex;
  st_lex	*view;			/* link on VIEW lex for merging */
376
  Field_translator *field_translation;	/* array of VIEW fields */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
377 378
  /* ancestor of this table (VIEW merge algorithm) */
  st_table_list	*ancestor;
379 380
  /* most upper view this table belongs to */
  st_table_list	*belong_to_view;
381 382
  /* list of join table tree leaves */
  st_table_list	*next_leaf;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
383
  Item          *where;                 /* VIEW WHERE clause condition */
384
  Item          *check_option;          /* WITH CHECK OPTION condition */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
385
  LEX_STRING	query;			/* text of (CRETE/SELECT) statement */
386
  LEX_STRING	md5;			/* md5 of query text */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
387
  LEX_STRING	source;			/* source of CREATE VIEW */
388 389
  LEX_STRING	view_db;		/* saved view database */
  LEX_STRING	view_name;		/* saved view name */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
390 391
  LEX_STRING	timestamp;		/* GMT time stamp of last operation */
  ulonglong	file_version;		/* version of file's field set */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
392
  ulonglong     updatable_view;         /* VIEW can be updated */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
393 394
  ulonglong	revision;		/* revision control number */
  ulonglong	algorithm;		/* 0 any, 1 tmp tables , 2 merging */
395
  ulonglong     with_check;             /* WITH CHECK OPTION */
396 397 398 399 400
  /*
    effective value of WITH CHECK OPTION (differ for temporary table
    algorithm)
  */
  uint8         effective_with_check;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
401
  uint          effective_algorithm;    /* which algorithm was really used */
402
  uint		privilege_backup;       /* place for saving privileges */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
403
  GRANT_INFO	grant;
404 405 406 407
  /* data need by some engines in query cache*/
  ulonglong     engine_data;
  /* call back function for asking handler about caching in query cache */
  qc_engine_callback callback_func;
408
  thr_lock_type lock_type;
409
  uint		outer_join;		/* Which join type */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
410
  uint		shared;			/* Used in multi-upd */
411
  uint32        db_length, table_name_length;
412
  bool          updatable;		/* VIEW/TABLE can be updated now */
413 414
  bool		straight;		/* optimize with prev table */
  bool          updating;               /* for replicate-do/ignore table */
415 416
  bool		force_index;		/* prefer index over table scan */
  bool          ignore_leaves;          /* preload only non-leaf nodes */
417
  bool          no_where_clause;        /* do not attach WHERE to SELECT */
418
  table_map     dep_tables;             /* tables the table depends on      */
419
  table_map     on_expr_dep_tables;     /* tables on expression depends on  */
420 421
  struct st_nested_join *nested_join;   /* if the element is a nested join  */
  st_table_list *embedding;             /* nested join containing the table */
422
  List<struct st_table_list> *join_list;/* join list the table belongs to   */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
423
  bool		cacheable_table;	/* stop PS caching */
424
  /* used in multi-upd/views privilege check */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
425 426
  bool		table_in_first_from_clause;
  bool		skip_temporary;		/* this table shouldn't be temporary */
427
  /* TRUE if this merged view contain auto_increment field */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
428
  bool          contain_auto_increment;
429 430
  /* FRMTYPE_ERROR if any type is acceptable */
  enum frm_type_enum required_type;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
431
  char		timestamp_buffer[20];	/* buffer for timestamp (19+1) */
432

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
433 434
  void calc_md5(char *buffer);
  void set_ancestor();
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
435
  int view_check_option(THD *thd, bool ignore_failure);
436
  bool setup_ancestor(THD *thd, Item **conds, uint8 check_option);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
437
  void cleanup_items();
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
438
  bool placeholder() {return derived || view; }
439
  void print(THD *thd, String *str);
440 441
  void save_and_clear_want_privilege();
  void restore_want_privilege();
442 443
  bool check_single_table(st_table_list **table, table_map map);
  bool set_insert_values(MEM_ROOT *mem_root);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
444
} TABLE_LIST;
445

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
446 447 448 449 450 451 452 453
class Item;

class Field_iterator: public Sql_alloc
{
public:
  virtual ~Field_iterator() {}
  virtual void set(TABLE_LIST *)= 0;
  virtual void next()= 0;
454
  virtual bool end_of_fields()= 0;              /* Return 1 at end of list */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
455 456 457 458 459 460 461 462 463 464 465 466 467 468
  virtual const char *name()= 0;
  virtual Item *item(THD *)= 0;
  virtual Field *field()= 0;
};


class Field_iterator_table: public Field_iterator
{
  Field **ptr;
public:
  Field_iterator_table() :ptr(0) {}
  void set(TABLE_LIST *table) { ptr= table->table->field; }
  void set_table(TABLE *table) { ptr= table->field; }
  void next() { ptr++; }
469
  bool end_of_fields() { return *ptr == 0; }
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
470 471 472 473 474 475 476 477
  const char *name();
  Item *item(THD *thd);
  Field *field() { return *ptr; }
};


class Field_iterator_view: public Field_iterator
{
478
  Field_translator *ptr, *array_end;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
479 480 481 482
public:
  Field_iterator_view() :ptr(0), array_end(0) {}
  void set(TABLE_LIST *table);
  void next() { ptr++; }
483
  bool end_of_fields() { return ptr == array_end; }
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
484
  const char *name();
485
  Item *item(THD *thd) { return ptr->item; }
486
  Item **item_ptr() {return &ptr->item; }
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
487 488 489
  Field *field() { return 0; }
};

490

491 492 493 494
typedef struct st_nested_join
{
  List<TABLE_LIST>  join_list;       /* list of elements in the nested join */
  table_map         used_tables;     /* bitmap of tables in the nested join */
495
  table_map         not_null_tables; /* tables that rejects nulls           */
496 497 498
  struct st_join_table *first_nested;/* the first nested table in the plan  */
  uint              counter;         /* to count tables in the nested join  */
} NESTED_JOIN;
499

500

501 502
typedef struct st_changed_table_list
{
503
  struct	st_changed_table_list *next;
504
  char		*key;
505 506 507
  uint32        key_length;
} CHANGED_TABLE_LIST;

508

509
typedef struct st_open_table_list{
510 511 512 513
  struct st_open_table_list *next;
  char	*db,*table;
  uint32 in_use,locked;
} OPEN_TABLE_LIST;
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
514 515