table.h 33.1 KB
Newer Older
1
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
unknown's avatar
unknown committed
2

unknown's avatar
unknown committed
3 4
   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
unknown's avatar
unknown committed
5
   the Free Software Foundation; version 2 of the License.
unknown's avatar
unknown committed
6

unknown's avatar
unknown committed
7 8 9 10
   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.
unknown's avatar
unknown committed
11

unknown's avatar
unknown committed
12 13 14 15 16 17 18 19
   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 */
unknown's avatar
unknown committed
20
class Item_subselect;
21
class Item_field;
unknown's avatar
unknown committed
22
class GRANT_TABLE;
23
class st_select_lex_unit;
unknown's avatar
VIEW  
unknown committed
24
class st_select_lex;
unknown's avatar
unknown committed
25
class COND_EQUAL;
26
class Security_context;
unknown's avatar
unknown committed
27 28 29 30 31 32

/* Order clause list element */

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

typedef struct st_grant_info
{
  GRANT_TABLE *grant_table;
  uint version;
unknown's avatar
unknown committed
49 50
  ulong privilege;
  ulong want_privilege;
51 52 53 54 55
  /*
    Stores the requested access acl of top level tables list. Is used to
    check access rights to the underlying tables of a view.
  */
  ulong orig_want_privilege;
unknown's avatar
unknown committed
56 57
} GRANT_INFO;

58 59
enum tmp_table_type {NO_TMP_TABLE=0,
                     NON_TRANSACTIONAL_TMP_TABLE=1, TRANSACTIONAL_TMP_TABLE=2,
60
                     SYSTEM_TMP_TABLE=3};
unknown's avatar
unknown committed
61

62 63 64 65 66 67 68 69 70 71 72

/** Event on which trigger is invoked. */
enum trg_event_type
{
  TRG_EVENT_INSERT= 0,
  TRG_EVENT_UPDATE= 1,
  TRG_EVENT_DELETE= 2,
  TRG_EVENT_MAX
};


73 74 75 76 77 78 79
enum frm_type_enum
{
  FRMTYPE_ERROR= 0,
  FRMTYPE_TABLE,
  FRMTYPE_VIEW
};

unknown's avatar
unknown committed
80 81 82
typedef struct st_filesort_info
{
  IO_CACHE *io_cache;           /* If sorted through filebyte                */
unknown's avatar
unknown committed
83 84 85
  uchar   **sort_keys;          /* Buffer for sorting keys                   */
  byte     *buffpek;            /* Buffer for buffpek structures             */
  uint      buffpek_len;        /* Max number of buffpeks in the buffer      */
unknown's avatar
unknown committed
86 87 88 89 90 91 92 93
  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;

unknown's avatar
unknown committed
94

95
/*
96 97 98 99 100 101 102 103
  Values in this enum are used to indicate how a tables TIMESTAMP field
  should be treated. It can be set to the current timestamp on insert or
  update or both.
  WARNING: The values are used for bit operations. If you change the
  enum, you must keep the bitwise relation of the values. For example:
  (int) TIMESTAMP_AUTO_SET_ON_BOTH must be equal to
  (int) TIMESTAMP_AUTO_SET_ON_INSERT | (int) TIMESTAMP_AUTO_SET_ON_UPDATE.
  We use an enum here so that the debugger can display the value names.
104 105 106 107 108 109
*/
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
};
110 111
#define clear_timestamp_auto_bits(_target_, _bits_) \
  (_target_)= (enum timestamp_auto_set_type)((int)(_target_) & ~(int)(_bits_))
112

unknown's avatar
unknown committed
113 114
class Field_timestamp;
class Field_blob;
115
class Table_triggers_list;
unknown's avatar
unknown committed
116

unknown's avatar
unknown committed
117 118 119 120
/*
  This structure is shared between different table objects. There is one
  instance of table share per one table in the database.
*/
121 122 123

typedef struct st_table_share
{
unknown's avatar
unknown committed
124
  /* hash of field names (contains pointers to elements of field array) */
125 126
  HASH	name_hash;			/* hash of field names */
  MEM_ROOT mem_root;
unknown's avatar
unknown committed
127 128 129
  TYPELIB keynames;			/* Pointers to keynames */
  TYPELIB fieldnames;			/* Pointer to fieldnames */
  TYPELIB *intervals;			/* pointer to interval info */
130 131 132 133 134 135 136 137 138 139 140 141
#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 */
142
  LEX_STRING comment;			/* Comment about table */
143 144 145 146 147 148 149
  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) */
150
  LEX_STRING connect_string;
151 152 153 154 155 156

  /* 
     Set of keys in use, implemented as a Bitmap.
     Excludes keys disabled by ALTER TABLE ... DISABLE KEYS.
  */
  key_map keys_in_use;
157 158 159
  key_map keys_for_keyread;
  ulong   avg_row_length;		/* create information */
  ulong   raid_chunksize;
160
  ulong   version, flush_version, mysql_version;
161 162 163 164
  ulong   timestamp_offset;		/* Set to offset+1 of record */
  ulong   reclength;			/* Recordlength */

  ha_rows min_rows, max_rows;		/* create information */
unknown's avatar
unknown committed
165 166
  enum db_type db_type;			/* table_type for handler */
  enum row_type row_type;		/* How rows are stored */
167 168 169
  enum tmp_table_type tmp_table;

  uint blob_ptr_size;			/* 4 or 8 */
unknown's avatar
unknown committed
170
  uint null_bytes, last_null_bit_pos;
171 172 173 174 175 176 177 178
  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 */
179
  uint varchar_fields;                  /* number of varchar fields */
unknown's avatar
unknown committed
180 181 182
  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 */
183 184 185 186 187 188 189 190 191 192 193 194 195 196
  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;
197 198 199 200 201 202 203
  /*
    TRUE if this is a system table like 'mysql.proc', which we want to be
    able to open and lock even when we already have some tables open and
    locked. To avoid deadlocks we have to put certain restrictions on
    locking of this table for writing. FALSE - otherwise.
  */
  my_bool system_table;
204 205 206
} TABLE_SHARE;


unknown's avatar
unknown committed
207 208
extern ulong refresh_version;

209 210 211
/* Information for one open table */

struct st_table {
212 213
  st_table() {}                               /* Remove gcc warning */

214 215 216 217 218 219 220 221 222 223 224 225 226
  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 */
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
  key_map quick_keys, used_keys;

  /*
    A set of keys that can be used in the query that references this
    table 

    All indexes disabled on the table's TABLE_SHARE (see TABLE::s) will be 
    subtracted from this set upon instantiation. Thus for any TABLE t it holds
    that t.keys_in_use_for_query is a subset of t.s.keys_in_use. Generally we 
    must not introduce any new keys here (see setup_tables).

    The set is implemented as a bitmap.
  */
  key_map keys_in_use_for_query;
  key_map merge_keys;
242 243 244 245 246 247 248 249 250
  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;
251
  TABLE_LIST *pos_in_table_list;/* Element referring to this table */
252 253 254
  ORDER		*group;
  const char	*alias;            	  /* alias or table name */
  uchar		*null_flags;
255
  query_id_t	query_id;
256 257 258 259

  ha_rows	quick_rows[MAX_KEY];
  key_part_map  const_key_parts[MAX_KEY];
  uint		quick_key_parts[MAX_KEY];
260
  uint		quick_n_ranges[MAX_KEY];
unknown's avatar
unknown committed
261

262 263 264 265 266 267 268 269 270 271 272
  /*
    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).
unknown's avatar
unknown committed
273
  */
274
  timestamp_auto_set_type timestamp_field_type;
275
  table_map	map;                    /* ID bit of table (1,2,4,8,16...) */
276 277 278 279

  uint          lock_position;          /* Position in MYSQL_LOCK.table */
  uint          lock_data_start;        /* Start pos. in MYSQL_LOCK.locks */
  uint          lock_count;             /* Number of locks */
280 281 282 283 284 285 286
  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 */
unknown's avatar
unknown committed
287
  my_bool copy_blobs;			/* copy_blobs when storing */
288 289

  /*
290 291 292 293 294
    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;
unknown's avatar
unknown committed
295
  /*
296 297
    If true, the current table row is considered to have all columns set to 
    NULL, including columns declared as "not null" (see maybe_null).
unknown's avatar
unknown committed
298 299
  */
  my_bool null_row;
300
  my_bool force_index;
301
  my_bool distinct,const_table,no_rows;
302
  my_bool key_read, no_keyread;
unknown's avatar
unknown committed
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
  /*
    Placeholder for an open table which prevents other connections
    from taking name-locks on this table. Typically used with
    TABLE_SHARE::version member to take an exclusive name-lock on
    this table name -- a name lock that not only prevents other
    threads from opening the table, but also blocks other name
    locks. This is achieved by:
    - setting open_placeholder to 1 - this will block other name
      locks, as wait_for_locked_table_name will be forced to wait,
      see table_is_used for details.
    - setting version to 0 - this will force other threads to close
      the instance of this table and wait (this is the same approach
      as used for usual name locks).
    An exclusively name-locked table currently can have no handler
    object associated with it (db_stat is always 0), but please do
    not rely on that.
  */
  my_bool open_placeholder;
unknown's avatar
unknown committed
321
  my_bool locked_by_name;
unknown's avatar
unknown committed
322
  my_bool fulltext_searched;
323 324 325
  my_bool no_cache;
  /* To signal that we should reset query_id for tables and cols */
  my_bool clear_query_id;
326 327 328 329 330
  /*
    To indicate that a non-null value of the auto_increment field
    was provided by the user or retrieved from the current record.
    Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode.
  */
unknown's avatar
unknown committed
331
  my_bool auto_increment_field_not_null;
332
  my_bool insert_or_update;             /* Can be used by the handler */
unknown's avatar
unknown committed
333
  my_bool alias_name_used;		/* true if table_name is alias */
334

unknown's avatar
unknown committed
335 336 337
  REGINFO reginfo;			/* field connections */
  MEM_ROOT mem_root;
  GRANT_INFO grant;
unknown's avatar
unknown committed
338
  FILESORT_INFO sort;
339
  TABLE_SHARE share_not_to_be_used;     /* To be deleted when true shares */
340 341 342

  bool fill_item_list(List<Item> *item_list) const;
  void reset_item_list(List<Item> *item_list) const;
unknown's avatar
unknown committed
343 344 345 346 347 348 349
  /* Is table open or should be treated as such by name-locking? */
  inline bool is_name_opened() { return db_stat || open_placeholder; }
  /*
    Is this instance of the table should be reopen or represents a name-lock?
  */
  inline bool needs_reopen_or_name_lock()
  { return s->version != refresh_version; }
unknown's avatar
unknown committed
350 351
};

352 353 354 355 356 357
enum enum_schema_table_state
{ 
  NOT_PROCESSED= 0,
  PROCESSED_BY_CREATE_SORT_INDEX,
  PROCESSED_BY_JOIN_EXEC
};
unknown's avatar
unknown committed
358

359 360 361 362 363 364 365 366 367 368 369 370 371
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
{
372 373 374 375 376 377 378
  SCH_CHARSETS= 0,
  SCH_COLLATIONS,
  SCH_COLLATION_CHARACTER_SET_APPLICABILITY,
  SCH_COLUMNS,
  SCH_COLUMN_PRIVILEGES,
  SCH_KEY_COLUMN_USAGE,
  SCH_OPEN_TABLES,
379
  SCH_PROFILES,
380 381 382 383 384 385 386 387 388 389
  SCH_PROCEDURES,
  SCH_SCHEMATA,
  SCH_SCHEMA_PRIVILEGES,
  SCH_STATISTICS,
  SCH_STATUS,
  SCH_TABLES,
  SCH_TABLE_CONSTRAINTS,
  SCH_TABLE_NAMES,
  SCH_TABLE_PRIVILEGES,
  SCH_TRIGGERS,
390
  SCH_USER_PRIVILEGES,
391
  SCH_VARIABLES,
392
  SCH_VIEWS
393 394 395 396 397 398 399 400 401 402 403 404 405
};


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;

406

407
struct TABLE_LIST;
408 409 410 411 412 413 414
typedef class Item COND;

typedef struct st_schema_table
{
  const char* table_name;
  ST_FIELD_INFO *fields_info;
  /* Create information_schema table */
415
  TABLE *(*create_table)  (THD *thd, TABLE_LIST *table_list);
416
  /* Fill table with data */
417
  int (*fill_table) (THD *thd, TABLE_LIST *tables, COND *cond);
418 419
  /* Handle fileds for old SHOW */
  int (*old_format) (THD *thd, struct st_schema_table *schema_table);
420
  int (*process_table) (THD *thd, TABLE_LIST *tables,
unknown's avatar
unknown committed
421
                        TABLE *table, bool res, const char *base_name,
422 423
                        const char *file_name);
  int idx_field1, idx_field2; 
424
  bool hidden;
425 426 427
} ST_SCHEMA_TABLE;


428 429 430
#define JOIN_TYPE_LEFT	1
#define JOIN_TYPE_RIGHT	2

431 432 433
#define VIEW_ALGORITHM_UNDEFINED        0
#define VIEW_ALGORITHM_TMPTABLE         1
#define VIEW_ALGORITHM_MERGE            2
unknown's avatar
VIEW  
unknown committed
434

435 436 437 438
#define VIEW_SUID_INVOKER               0
#define VIEW_SUID_DEFINER               1
#define VIEW_SUID_DEFAULT               2

unknown's avatar
unknown committed
439
/* view WITH CHECK OPTION parameter options */
unknown's avatar
unknown committed
440 441 442 443
#define VIEW_CHECK_NONE       0
#define VIEW_CHECK_LOCAL      1
#define VIEW_CHECK_CASCADED   2

unknown's avatar
unknown committed
444 445 446 447 448
/* result of view WITH CHECK OPTION parameter check */
#define VIEW_CHECK_OK         0
#define VIEW_CHECK_ERROR      1
#define VIEW_CHECK_SKIP       2

unknown's avatar
VIEW  
unknown committed
449
struct st_lex;
450
class select_union;
451
class TMP_TABLE_PARAM;
452

453
Item *create_view_field(THD *thd, TABLE_LIST *view, Item **field_ref,
454 455
                        const char *name);

456 457 458 459 460
struct Field_translator
{
  Item *item;
  const char *name;
};
unknown's avatar
VIEW  
unknown committed
461

462

unknown's avatar
unknown committed
463 464 465 466 467 468
/*
  Column reference of a NATURAL/USING join. Since column references in
  joins can be both from views and stored tables, may point to either a
  Field (for tables), or a Field_translator (for views).
*/

469
class Natural_join_column: public Sql_alloc
unknown's avatar
unknown committed
470 471 472
{
public:
  Field_translator *view_field;  /* Column reference of merge view. */
473
  Item_field       *table_field; /* Column reference of table or temp view. */
474
  TABLE_LIST *table_ref; /* Original base table/view reference. */
unknown's avatar
unknown committed
475 476 477 478 479 480 481 482 483
  /*
    True if a common join column of two NATURAL/USING join operands. Notice
    that when we have a hierarchy of nested NATURAL/USING joins, a column can
    be common at some level of nesting but it may not be common at higher
    levels of nesting. Thus this flag may change depending on at which level
    we are looking at some column.
  */
  bool is_common;
public:
484
  Natural_join_column(Field_translator *field_param, TABLE_LIST *tab);
485
  Natural_join_column(Item_field *field_param, TABLE_LIST *tab);
unknown's avatar
unknown committed
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
  const char *name();
  Item *create_item(THD *thd);
  Field *field();
  const char *table_name();
  const char *db_name();
  GRANT_INFO *grant();
};


/*
  Table reference in the FROM clause.

  These table references can be of several types that correspond to
  different SQL elements. Below we list all types of TABLE_LISTs with
  the necessary conditions to determine when a TABLE_LIST instance
  belongs to a certain type.

  1) table (TABLE_LIST::view == NULL)
     - base table
       (TABLE_LIST::derived == NULL)
     - subquery - TABLE_LIST::table is a temp table
       (TABLE_LIST::derived != NULL)
     - information schema table
       (TABLE_LIST::schema_table != NULL)
       NOTICE: for schema tables TABLE_LIST::field_translation may be != NULL
  2) view (TABLE_LIST::view != NULL)
     - merge    (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_MERGE)
           also (TABLE_LIST::field_translation != NULL)
     - tmptable (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_TMPTABLE)
           also (TABLE_LIST::field_translation == NULL)
  3) nested table reference (TABLE_LIST::nested_join != NULL)
     - table sequence - e.g. (t1, t2, t3)
       TODO: how to distinguish from a JOIN?
     - general JOIN
       TODO: how to distinguish from a table sequence?
     - NATURAL JOIN
       (TABLE_LIST::natural_join != NULL)
       - JOIN ... USING
         (TABLE_LIST::join_using_fields != NULL)
*/

527
struct TABLE_LIST
528
{
529
  TABLE_LIST() {}                          /* Remove gcc warning */
unknown's avatar
unknown committed
530 531 532 533 534
  /*
    List of tables local to a subquery (used by SQL_LIST). Considers
    views as leaves (unlike 'next_leaf' below). Created at parse time
    in st_select_lex::add_table_to_list() -> table_list.link_in_list().
  */
535
  TABLE_LIST *next_local;
unknown's avatar
VIEW  
unknown committed
536
  /* link in a global list of all queries tables */
537
  TABLE_LIST *next_global, **prev_global;
538
  char		*db, *alias, *table_name, *schema_table_name;
539
  char          *option;                /* Used by cache index  */
540
  Item		*on_expr;		/* Used with outer join */
541
  /*
unknown's avatar
unknown committed
542
    The structure of ON expression presented in the member above
543 544 545 546 547 548 549
    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;
unknown's avatar
unknown committed
550
  COND_EQUAL    *cond_equal;            /* Used with outer join */
unknown's avatar
unknown committed
551 552 553 554 555 556
  /*
    During parsing - left operand of NATURAL/USING join where 'this' is
    the right operand. After parsing (this->natural_join == this) iff
    'this' represents a NATURAL or USING join operation. Thus after
    parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
  */
557
  TABLE_LIST *natural_join;
unknown's avatar
unknown committed
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
  /*
    True if 'this' represents a nested join that is a NATURAL JOIN.
    For one of the operands of 'this', the member 'natural_join' points
    to the other operand of 'this'.
  */
  bool is_natural_join;
  /* Field names in a USING clause for JOIN ... USING. */
  List<String> *join_using_fields;
  /*
    Explicitly store the result columns of either a NATURAL/USING join or
    an operand of such a join.
  */
  List<Natural_join_column> *join_columns;
  /* TRUE if join_columns contains all columns of this table reference. */
  bool is_join_columns_complete;

  /*
    List of nodes in a nested join tree, that should be considered as
    leaves with respect to name resolution. The leaves are: views,
    top-most nodes representing NATURAL/USING joins, subqueries, and
    base tables. All of these TABLE_LIST instances contain a
    materialized list of columns. The list is local to a subquery.
  */
581
  TABLE_LIST *next_name_resolution_table;
unknown's avatar
unknown committed
582 583 584
  /* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
  List<String> *use_index, *ignore_index;
  TABLE        *table;                   /* opened table */
unknown's avatar
unknown committed
585 586 587 588 589
  /*
    select_result for derived table to pass it from table creation to table
    filling procedure
  */
  select_union  *derived_result;
unknown's avatar
VIEW  
unknown committed
590 591 592 593 594 595 596
  /*
    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)
  */
597
  TABLE_LIST	*correspondent_table;
unknown's avatar
VIEW  
unknown committed
598
  st_select_lex_unit *derived;		/* SELECT_LEX_UNIT of derived table */
599 600
  ST_SCHEMA_TABLE *schema_table;        /* Information_schema table */
  st_select_lex	*schema_select_lex;
unknown's avatar
unknown committed
601 602 603 604
  /*
    True when the view field translation table is used to convert
    schema table fields for backwards compatibility with SHOW command.
  */
605
  bool schema_table_reformed;
606
  TMP_TABLE_PARAM *schema_table_param;
unknown's avatar
VIEW  
unknown committed
607 608 609
  /* link to select_lex where this table was used */
  st_select_lex	*select_lex;
  st_lex	*view;			/* link on VIEW lex for merging */
610
  Field_translator *field_translation;	/* array of VIEW fields */
611 612
  /* pointer to element after last one in translation table above */
  Field_translator *field_translation_end;
613 614 615 616 617
  /*
    List (based on next_local) of underlying tables of this view. I.e. it
    does not include the tables of subqueries used in the view. Is set only
    for merged views.
  */
618
  TABLE_LIST	*merge_underlying_list;
619 620 621 622 623
  /*
    - 0 for base tables
    - in case of the view it is the list of all (not only underlying
    tables but also used in subquery ones) tables of the view.
  */
624
  List<TABLE_LIST> *view_tables;
625
  /* most upper view this table belongs to */
626
  TABLE_LIST	*belong_to_view;
627 628 629 630
  /*
    The view directly referencing this table
    (non-zero only for merged underlying tables of a view).
  */
631
  TABLE_LIST	*referencing_view;
632
  /*
unknown's avatar
unknown committed
633 634
    Security  context (non-zero only for tables which belong
    to view with SQL SECURITY DEFINER)
635 636 637
  */
  Security_context *security_ctx;
  /*
unknown's avatar
unknown committed
638 639
    This view security context (non-zero only for views with
    SQL SECURITY DEFINER)
640 641
  */
  Security_context *view_sctx;
unknown's avatar
unknown committed
642 643 644 645 646
  /*
    List of all base tables local to a subquery including all view
    tables. Unlike 'next_local', this in this list views are *not*
    leaves. Created in setup_tables() -> make_leaves_list().
  */
647
  bool allowed_show;
648
  TABLE_LIST	*next_leaf;
unknown's avatar
VIEW  
unknown committed
649
  Item          *where;                 /* VIEW WHERE clause condition */
unknown's avatar
unknown committed
650
  Item          *check_option;          /* WITH CHECK OPTION condition */
unknown's avatar
VIEW  
unknown committed
651
  LEX_STRING	query;			/* text of (CRETE/SELECT) statement */
652
  LEX_STRING	md5;			/* md5 of query text */
unknown's avatar
VIEW  
unknown committed
653
  LEX_STRING	source;			/* source of CREATE VIEW */
654 655
  LEX_STRING	view_db;		/* saved view database */
  LEX_STRING	view_name;		/* saved view name */
unknown's avatar
VIEW  
unknown committed
656
  LEX_STRING	timestamp;		/* GMT time stamp of last operation */
657
  st_lex_user   definer;                /* definer of view */
unknown's avatar
VIEW  
unknown committed
658
  ulonglong	file_version;		/* version of file's field set */
unknown's avatar
unknown committed
659
  ulonglong     updatable_view;         /* VIEW can be updated */
unknown's avatar
VIEW  
unknown committed
660
  ulonglong	algorithm;		/* 0 any, 1 tmp tables , 2 merging */
661
  ulonglong     view_suid;              /* view is suid (TRUE dy default) */
unknown's avatar
unknown committed
662
  ulonglong     with_check;             /* WITH CHECK OPTION */
663 664 665 666 667
  /*
    effective value of WITH CHECK OPTION (differ for temporary table
    algorithm)
  */
  uint8         effective_with_check;
668
  uint8         effective_algorithm;    /* which algorithm was really used */
unknown's avatar
VIEW  
unknown committed
669
  GRANT_INFO	grant;
unknown's avatar
unknown committed
670 671 672 673
  /* 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;
674
  thr_lock_type lock_type;
675
  uint		outer_join;		/* Which join type */
unknown's avatar
unknown committed
676
  uint		shared;			/* Used in multi-upd */
677 678
  uint          db_length;
  uint32        table_name_length;
679
  bool          updatable;		/* VIEW/TABLE can be updated now */
680 681
  bool		straight;		/* optimize with prev table */
  bool          updating;               /* for replicate-do/ignore table */
682 683 684
  bool		force_index;		/* prefer index over table scan */
  bool          ignore_leaves;          /* preload only non-leaf nodes */
  table_map     dep_tables;             /* tables the table depends on      */
685
  table_map     on_expr_dep_tables;     /* tables on expression depends on  */
686
  struct st_nested_join *nested_join;   /* if the element is a nested join  */
687 688
  TABLE_LIST *embedding;             /* nested join containing the table */
  List<TABLE_LIST> *join_list;/* join list the table belongs to   */
unknown's avatar
unknown committed
689
  bool		cacheable_table;	/* stop PS caching */
690
  /* used in multi-upd/views privilege check */
unknown's avatar
VIEW  
unknown committed
691 692
  bool		table_in_first_from_clause;
  bool		skip_temporary;		/* this table shouldn't be temporary */
693
  /* TRUE if this merged view contain auto_increment field */
unknown's avatar
VIEW  
unknown committed
694
  bool          contain_auto_increment;
unknown's avatar
unknown committed
695
  bool          multitable_view;        /* TRUE iff this is multitable view */
696
  bool          compact_view_format;    /* Use compact format for SHOW CREATE VIEW */
697 698
  /* view where processed */
  bool          where_processed;
unknown's avatar
unknown committed
699 700
  /* TRUE <=> VIEW CHECK OPTION expression has been processed */
  bool          check_option_processed;
701 702
  /* FRMTYPE_ERROR if any type is acceptable */
  enum frm_type_enum required_type;
unknown's avatar
VIEW  
unknown committed
703
  char		timestamp_buffer[20];	/* buffer for timestamp (19+1) */
704 705 706 707 708
  /*
    This TABLE_LIST object is just placeholder for prelocking, it will be
    used for implicit LOCK TABLES only and won't be used in real statement.
  */
  bool          prelocking_placeholder;
unknown's avatar
unknown committed
709 710 711 712 713 714
  /*
    This TABLE_LIST object corresponds to the table to be created
    so it is possible that it does not exist (used in CREATE TABLE
    ... SELECT implementation).
  */
  bool          create;
715

716 717 718 719 720 721 722
  /**
    Indicates what triggers we need to pre-load for this TABLE_LIST
    when opening an associated TABLE. This is filled after
    the parsed tree is created.
  */
  uint8 trg_event_map;

723
  enum enum_schema_table_state schema_table_state;
unknown's avatar
VIEW  
unknown committed
724
  void calc_md5(char *buffer);
725
  void set_underlying_merge();
unknown's avatar
unknown committed
726
  int view_check_option(THD *thd, bool ignore_failure);
727
  bool setup_underlying(THD *thd);
unknown's avatar
unknown committed
728
  void cleanup_items();
unknown's avatar
unknown committed
729 730
  bool placeholder()
  {
731
    return derived || view || schema_table || (create && !table->db_stat) ||
unknown's avatar
unknown committed
732 733
           !table;
  }
734
  void print(THD *thd, String *str);
735 736
  bool check_single_table(TABLE_LIST **table, table_map map,
                          TABLE_LIST *view);
737
  bool set_insert_values(MEM_ROOT *mem_root);
738
  void hide_view_error(THD *thd);
739 740 741
  TABLE_LIST *find_underlying_table(TABLE *table);
  TABLE_LIST *first_leaf_for_name_resolution();
  TABLE_LIST *last_leaf_for_name_resolution();
unknown's avatar
unknown committed
742
  bool is_leaf_for_name_resolution();
743
  inline TABLE_LIST *top_table()
744
    { return belong_to_view ? belong_to_view : this; }
745 746 747 748 749 750 751 752 753 754 755 756 757 758
  inline bool prepare_check_option(THD *thd)
  {
    bool res= FALSE;
    if (effective_with_check)
      res= prep_check_option(thd, effective_with_check);
    return res;
  }
  inline bool prepare_where(THD *thd, Item **conds,
                            bool no_where_clause)
  {
    if (effective_algorithm == VIEW_ALGORITHM_MERGE)
      return prep_where(thd, conds, no_where_clause);
    return FALSE;
  }
759 760 761 762 763 764 765

  void register_want_access(ulong want_access);
  bool prepare_security(THD *thd);
#ifndef NO_EMBEDDED_ACCESS_CHECKS
  Security_context *find_view_security_context(THD *thd);
  bool prepare_view_securety_context(THD *thd);
#endif
766 767 768 769 770
  /*
    Cleanup for re-execution in a prepared statement or a stored
    procedure.
  */
  void reinit_before_use(THD *thd);
unknown's avatar
unknown committed
771
  Item_subselect *containing_subselect();
772

773 774 775
private:
  bool prep_check_option(THD *thd, uint8 check_opt_type);
  bool prep_where(THD *thd, Item **conds, bool no_where_clause);
776 777
  void print_index_hint(THD *thd, String *str, const char *hint, 
                        uint32 hint_length, List<String>);
778 779 780 781
  /*
    Cleanup for re-execution in a prepared statement or a stored
    procedure.
  */
782
};
783

unknown's avatar
VIEW  
unknown committed
784 785
class Item;

unknown's avatar
unknown committed
786 787 788 789
/*
  Iterator over the fields of a generic table reference.
*/

unknown's avatar
VIEW  
unknown committed
790 791 792
class Field_iterator: public Sql_alloc
{
public:
793
  Field_iterator() {}                         /* Remove gcc warning */
unknown's avatar
VIEW  
unknown committed
794 795 796
  virtual ~Field_iterator() {}
  virtual void set(TABLE_LIST *)= 0;
  virtual void next()= 0;
797
  virtual bool end_of_fields()= 0;              /* Return 1 at end of list */
unknown's avatar
VIEW  
unknown committed
798
  virtual const char *name()= 0;
799
  virtual Item *create_item(THD *)= 0;
unknown's avatar
VIEW  
unknown committed
800 801 802 803
  virtual Field *field()= 0;
};


unknown's avatar
unknown committed
804 805 806 807 808
/* 
  Iterator over the fields of a base table, view with temporary
  table, or subquery.
*/

unknown's avatar
VIEW  
unknown committed
809 810 811 812 813 814 815 816
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++; }
817
  bool end_of_fields() { return *ptr == 0; }
unknown's avatar
VIEW  
unknown committed
818
  const char *name();
819
  Item *create_item(THD *thd);
unknown's avatar
VIEW  
unknown committed
820 821 822 823
  Field *field() { return *ptr; }
};


unknown's avatar
unknown committed
824 825
/* Iterator over the fields of a merge view. */

unknown's avatar
VIEW  
unknown committed
826 827
class Field_iterator_view: public Field_iterator
{
828
  Field_translator *ptr, *array_end;
829
  TABLE_LIST *view;
unknown's avatar
VIEW  
unknown committed
830 831 832 833
public:
  Field_iterator_view() :ptr(0), array_end(0) {}
  void set(TABLE_LIST *table);
  void next() { ptr++; }
834
  bool end_of_fields() { return ptr == array_end; }
unknown's avatar
VIEW  
unknown committed
835
  const char *name();
836
  Item *create_item(THD *thd);
unknown's avatar
unknown committed
837
  Item **item_ptr() {return &ptr->item; }
unknown's avatar
VIEW  
unknown committed
838
  Field *field() { return 0; }
839
  inline Item *item() { return ptr->item; }
unknown's avatar
unknown committed
840 841 842 843 844 845 846 847 848 849 850
  Field_translator *field_translator() { return ptr; }
};


/*
  Field_iterator interface to the list of materialized fields of a
  NATURAL/USING join.
*/

class Field_iterator_natural_join: public Field_iterator
{
851
  List_iterator_fast<Natural_join_column> column_ref_it;
unknown's avatar
unknown committed
852 853
  Natural_join_column *cur_column_ref;
public:
854 855
  Field_iterator_natural_join() :cur_column_ref(NULL) {}
  ~Field_iterator_natural_join() {}
unknown's avatar
unknown committed
856
  void set(TABLE_LIST *table);
857
  void next();
unknown's avatar
unknown committed
858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
  bool end_of_fields() { return !cur_column_ref; }
  const char *name() { return cur_column_ref->name(); }
  Item *create_item(THD *thd) { return cur_column_ref->create_item(thd); }
  Field *field() { return cur_column_ref->field(); }
  Natural_join_column *column_ref() { return cur_column_ref; }
};


/*
  Generic iterator over the fields of an arbitrary table reference.

  DESCRIPTION
    This class unifies the various ways of iterating over the columns
    of a table reference depending on the type of SQL entity it
    represents. If such an entity represents a nested table reference,
    this iterator encapsulates the iteration over the columns of the
    members of the table reference.

  IMPLEMENTATION
    The implementation assumes that all underlying NATURAL/USING table
    references already contain their result columns and are linked into
    the list TABLE_LIST::next_name_resolution_table.
*/

class Field_iterator_table_ref: public Field_iterator
{
  TABLE_LIST *table_ref, *first_leaf, *last_leaf;
  Field_iterator_table        table_field_it;
  Field_iterator_view         view_field_it;
  Field_iterator_natural_join natural_join_it;
  Field_iterator *field_it;
  void set_field_iterator();
public:
  Field_iterator_table_ref() :field_it(NULL) {}
  void set(TABLE_LIST *table);
  void next();
  bool end_of_fields()
  { return (table_ref == last_leaf && field_it->end_of_fields()); }
  const char *name() { return field_it->name(); }
  const char *table_name();
  const char *db_name();
  GRANT_INFO *grant();
  Item *create_item(THD *thd) { return field_it->create_item(thd); }
  Field *field() { return field_it->field(); }
902
  Natural_join_column *get_or_create_column_ref(THD *thd, TABLE_LIST *parent_table_ref);
903
  Natural_join_column *get_natural_column_ref();
unknown's avatar
VIEW  
unknown committed
904 905
};

906

907 908 909 910
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 */
911
  table_map         not_null_tables; /* tables that rejects nulls           */
912 913 914 915 916
  /**
    Used for pointing out the first table in the plan being covered by this
    join nest. It is used exclusively within make_outerjoin_info().
   */
  struct st_join_table *first_nested;
917 918 919 920 921 922 923 924 925
  /* 
    Used to count tables in the nested join in 2 isolated places:
    1. In make_outerjoin_info(). 
    2. check_interleaving_with_nj/restore_prev_nj_state (these are called
       by the join optimizer. 
    Before each use the counters are zeroed by reset_nj_counters.
  */
  uint              counter;
  nested_join_map   nj_map;          /* Bit used to identify this nested join*/
926 927 928 929 930 931 932 933 934
  /**
     True if this join nest node is completely covered by the query execution
     plan. This means two things.

     1. All tables on its @c join_list are covered by the plan.

     2. All child join nest nodes are fully covered.
   */
  bool is_fully_covered() const { return join_list.elements == counter; }
935
} NESTED_JOIN;
936

937

938 939
typedef struct st_changed_table_list
{
940
  struct	st_changed_table_list *next;
941
  char		*key;
942 943 944
  uint32        key_length;
} CHANGED_TABLE_LIST;

945

946
typedef struct st_open_table_list{
947 948 949 950
  struct st_open_table_list *next;
  char	*db,*table;
  uint32 in_use,locked;
} OPEN_TABLE_LIST;
unknown's avatar
unknown committed
951 952