table.h 29 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;
25
class Security_context;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
26 27 28 29 30 31

/* 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
32
  Item	 *item_ptr;			/* Storage for initial item */
33
  Item   **item_copy;			/* For SPs; the original item ptr */
34 35
  int    counter;                       /* position in SELECT list, correct
                                           only if counter_used is true*/
bk@work.mysql.com's avatar
bk@work.mysql.com 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 */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
40 41
  Field  *field;			/* If tmp-table group */
  char	 *buff;				/* If tmp-table group */
42
  table_map used, depend_map;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
43 44 45 46 47 48
} ORDER;

typedef struct st_grant_info
{
  GRANT_TABLE *grant_table;
  uint version;
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;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
56 57
} GRANT_INFO;

58 59
enum tmp_table_type {NO_TMP_TABLE=0, TMP_TABLE=1, TRANSACTIONAL_TMP_TABLE=2,
                     SYSTEM_TMP_TABLE=3};
60

61 62 63 64 65 66 67
enum frm_type_enum
{
  FRMTYPE_ERROR= 0,
  FRMTYPE_TABLE,
  FRMTYPE_VIEW
};

igor@hundin.mysql.fi's avatar
igor@hundin.mysql.fi committed
68 69 70 71 72 73 74 75 76 77 78
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
79

80
/*
81 82 83 84 85 86 87 88
  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.
89 90 91 92 93 94
*/
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
};
95 96
#define clear_timestamp_auto_bits(_target_, _bits_) \
  (_target_)= (enum timestamp_auto_set_type)((int)(_target_) & ~(int)(_bits_))
97

bk@work.mysql.com's avatar
bk@work.mysql.com committed
98 99
class Field_timestamp;
class Field_blob;
100
class Table_triggers_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
101

102 103 104 105
/*
  This structure is shared between different table objects. There is one
  instance of table share per one table in the database.
*/
106 107 108

typedef struct st_table_share
{
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
109
  /* hash of field names (contains pointers to elements of field array) */
110 111
  HASH	name_hash;			/* hash of field names */
  MEM_ROOT mem_root;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
112 113 114
  TYPELIB keynames;			/* Pointers to keynames */
  TYPELIB fieldnames;			/* Pointer to fieldnames */
  TYPELIB *intervals;			/* pointer to interval info */
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
#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) */
135
  LEX_STRING connect_string;
136 137 138 139
  key_map keys_in_use;                  /* Keys in use for table */
  key_map keys_for_keyread;
  ulong   avg_row_length;		/* create information */
  ulong   raid_chunksize;
140
  ulong   version, flush_version, mysql_version;
141 142 143 144
  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
145 146
  enum db_type db_type;			/* table_type for handler */
  enum row_type row_type;		/* How rows are stored */
147 148 149
  enum tmp_table_type tmp_table;

  uint blob_ptr_size;			/* 4 or 8 */
150
  uint null_bytes, last_null_bit_pos;
151 152 153 154 155 156 157 158
  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 */
159
  uint varchar_fields;                  /* number of varchar fields */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
160 161 162
  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 */
163 164 165 166 167 168 169 170 171 172 173 174 175 176
  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;
177 178 179 180 181 182 183
  /*
    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;
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
} 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;
217
  query_id_t	query_id;
218 219 220 221

  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
222

223 224 225 226 227 228 229 230 231 232 233
  /*
    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
234
  */
235
  timestamp_auto_set_type timestamp_field_type;
236
  table_map	map;                    /* ID bit of table (1,2,4,8,16...) */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
237
  
238 239 240 241 242 243 244
  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
245
  my_bool copy_blobs;			/* copy_blobs when storing */
246 247 248 249 250 251 252
  
  /* 
    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;
253
  /*
254 255
    If true, the current table row is considered to have all columns set to 
    NULL, including columns declared as "not null" (see maybe_null).
256 257
  */
  my_bool null_row;
258
  my_bool force_index;
259
  my_bool distinct,const_table,no_rows;
260
  my_bool key_read, no_keyread;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
261
  my_bool locked_by_flush;
262
  my_bool locked_by_name;
263
  my_bool fulltext_searched;
264 265 266
  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
267
  my_bool auto_increment_field_not_null;
268
  my_bool insert_or_update;             /* Can be used by the handler */
269
  my_bool alias_name_used;		/* true if table_name is alias */
270

bk@work.mysql.com's avatar
bk@work.mysql.com committed
271 272 273
  REGINFO reginfo;			/* field connections */
  MEM_ROOT mem_root;
  GRANT_INFO grant;
igor@hundin.mysql.fi's avatar
igor@hundin.mysql.fi committed
274
  FILESORT_INFO sort;
275
  TABLE_SHARE share_not_to_be_used;     /* To be deleted when true shares */
276 277 278

  bool fill_item_list(List<Item> *item_list) const;
  void reset_item_list(List<Item> *item_list) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
279 280 281
};


282 283 284 285 286 287 288 289 290 291 292 293 294
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
{
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
  SCH_CHARSETS= 0,
  SCH_COLLATIONS,
  SCH_COLLATION_CHARACTER_SET_APPLICABILITY,
  SCH_COLUMNS,
  SCH_COLUMN_PRIVILEGES,
  SCH_KEY_COLUMN_USAGE,
  SCH_OPEN_TABLES,
  SCH_PROCEDURES,
  SCH_SCHEMATA,
  SCH_SCHEMA_PRIVILEGES,
  SCH_STATISTICS,
  SCH_STATUS,
  SCH_TABLES,
  SCH_TABLE_CONSTRAINTS,
  SCH_TABLE_NAMES,
  SCH_TABLE_PRIVILEGES,
  SCH_TRIGGERS,
  SCH_VARIABLES,
  SCH_VIEWS,
  SCH_USER_PRIVILEGES
315 316 317 318 319 320 321 322 323 324 325 326 327
};


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;

328

329 330 331 332 333 334 335 336
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 */
337
  TABLE *(*create_table)  (THD *thd, struct st_table_list *table_list);
338 339 340 341 342
  /* 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
343
                        TABLE *table, bool res, const char *base_name,
344 345
                        const char *file_name);
  int idx_field1, idx_field2; 
346
  bool hidden;
347 348 349
} ST_SCHEMA_TABLE;


350 351 352
#define JOIN_TYPE_LEFT	1
#define JOIN_TYPE_RIGHT	2

353 354 355
#define VIEW_ALGORITHM_UNDEFINED        0
#define VIEW_ALGORITHM_TMPTABLE         1
#define VIEW_ALGORITHM_MERGE            2
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
356

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
357
/* view WITH CHECK OPTION parameter options */
358 359 360 361
#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
362 363 364 365 366
/* 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
367
struct st_lex;
368
class select_union;
369
class TMP_TABLE_PARAM;
370

371 372 373
Item *create_view_field(THD *thd, st_table_list *view, Item **field_ref,
                        const char *name);

374 375 376 377 378
struct Field_translator
{
  Item *item;
  const char *name;
};
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
379

380

381 382 383 384 385 386
/*
  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).
*/

387
class Natural_join_column: public Sql_alloc
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
{
public:
  Field_translator *view_field;  /* Column reference of merge view. */
  Field            *table_field; /* Column reference of table or temp view. */
  st_table_list *table_ref; /* Original base table/view reference. */
  /*
    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:
  Natural_join_column(Field_translator *field_param, st_table_list *tab);
  Natural_join_column(Field *field_param, st_table_list *tab);
  const char *name();
  Item *create_item(THD *thd);
  Field *field();
  const char *table_name();
  const char *db_name();
  GRANT_INFO *grant();
#ifndef NO_EMBEDDED_ACCESS_CHECKS
  bool check_grants(THD *thd, const char *name, uint length);
#endif
};


/*
  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)
*/

448 449
typedef struct st_table_list
{
450 451 452 453 454
  /*
    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().
  */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
455 456 457
  struct st_table_list *next_local;
  /* link in a global list of all queries tables */
  struct st_table_list *next_global, **prev_global;
458
  char		*db, *alias, *table_name, *schema_table_name;
459
  char          *option;                /* Used by cache index  */
460
  Item		*on_expr;		/* Used with outer join */
461
  /*
462
    The structure of ON expression presented in the member above
463 464 465 466 467 468 469
    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;
470
  COND_EQUAL    *cond_equal;            /* Used with outer join */
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
  /*
    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).
  */
  struct st_table_list *natural_join;
  /*
    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.
  */
  struct st_table_list *next_name_resolution_table;
  /* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
  List<String> *use_index, *ignore_index;
  TABLE        *table;                   /* opened table */
505 506 507 508 509
  /*
    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
510 511 512 513 514 515 516 517 518
  /*
    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 */
519 520
  ST_SCHEMA_TABLE *schema_table;        /* Information_schema table */
  st_select_lex	*schema_select_lex;
521 522 523 524
  /*
    True when the view field translation table is used to convert
    schema table fields for backwards compatibility with SHOW command.
  */
525
  bool schema_table_reformed;
526
  TMP_TABLE_PARAM *schema_table_param;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
527 528 529
  /* link to select_lex where this table was used */
  st_select_lex	*select_lex;
  st_lex	*view;			/* link on VIEW lex for merging */
530
  Field_translator *field_translation;	/* array of VIEW fields */
531 532
  /* pointer to element after last one in translation table above */
  Field_translator *field_translation_end;
533 534 535 536 537 538 539 540 541 542 543 544
  /*
    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.
  */
  st_table_list	*merge_underlying_list;
  /*
    - 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.
  */
  List<st_table_list> *view_tables;
545 546
  /* most upper view this table belongs to */
  st_table_list	*belong_to_view;
547 548 549 550 551 552
  /*
    The view directly referencing this table
    (non-zero only for merged underlying tables of a view).
  */
  st_table_list	*referencing_view;
  /*
konstantin@mysql.com's avatar
konstantin@mysql.com committed
553 554
    Security  context (non-zero only for tables which belong
    to view with SQL SECURITY DEFINER)
555 556 557
  */
  Security_context *security_ctx;
  /*
konstantin@mysql.com's avatar
konstantin@mysql.com committed
558 559
    This view security context (non-zero only for views with
    SQL SECURITY DEFINER)
560 561
  */
  Security_context *view_sctx;
562 563 564 565 566
  /*
    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().
  */
567
  st_table_list	*next_leaf;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
568
  Item          *where;                 /* VIEW WHERE clause condition */
569
  Item          *check_option;          /* WITH CHECK OPTION condition */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
570
  LEX_STRING	query;			/* text of (CRETE/SELECT) statement */
571
  LEX_STRING	md5;			/* md5 of query text */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
572
  LEX_STRING	source;			/* source of CREATE VIEW */
573 574
  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
575
  LEX_STRING	timestamp;		/* GMT time stamp of last operation */
576
  st_lex_user   definer;                /* definer of view */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
577
  ulonglong	file_version;		/* version of file's field set */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
578
  ulonglong     updatable_view;         /* VIEW can be updated */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
579 580
  ulonglong	revision;		/* revision control number */
  ulonglong	algorithm;		/* 0 any, 1 tmp tables , 2 merging */
581
  ulonglong     view_suid;              /* view is suid (TRUE dy default) */
582
  ulonglong     with_check;             /* WITH CHECK OPTION */
583 584 585 586 587
  /*
    effective value of WITH CHECK OPTION (differ for temporary table
    algorithm)
  */
  uint8         effective_with_check;
588
  uint8         effective_algorithm;    /* which algorithm was really used */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
589
  GRANT_INFO	grant;
590 591 592 593
  /* 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;
594
  thr_lock_type lock_type;
595
  uint		outer_join;		/* Which join type */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
596
  uint		shared;			/* Used in multi-upd */
597
  uint32        db_length, table_name_length;
598
  bool          updatable;		/* VIEW/TABLE can be updated now */
599 600
  bool		straight;		/* optimize with prev table */
  bool          updating;               /* for replicate-do/ignore table */
601 602 603
  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      */
604
  table_map     on_expr_dep_tables;     /* tables on expression depends on  */
605 606
  struct st_nested_join *nested_join;   /* if the element is a nested join  */
  st_table_list *embedding;             /* nested join containing the table */
607
  List<struct st_table_list> *join_list;/* join list the table belongs to   */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
608
  bool		cacheable_table;	/* stop PS caching */
609
  /* used in multi-upd/views privilege check */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
610 611
  bool		table_in_first_from_clause;
  bool		skip_temporary;		/* this table shouldn't be temporary */
612
  /* TRUE if this merged view contain auto_increment field */
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
613
  bool          contain_auto_increment;
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
614
  bool          multitable_view;        /* TRUE iff this is multitable view */
615
  bool          compact_view_format;    /* Use compact format for SHOW CREATE VIEW */
616 617
  /* view where processed */
  bool          where_processed;
618 619
  /* 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
620
  char		timestamp_buffer[20];	/* buffer for timestamp (19+1) */
621 622 623 624 625
  /*
    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;
626

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
627
  void calc_md5(char *buffer);
628
  void set_underlying_merge();
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
629
  int view_check_option(THD *thd, bool ignore_failure);
630
  bool setup_underlying(THD *thd);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
631
  void cleanup_items();
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
632
  bool placeholder() {return derived || view; }
633
  void print(THD *thd, String *str);
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
634 635
  bool check_single_table(st_table_list **table, table_map map,
                          st_table_list *view);
636
  bool set_insert_values(MEM_ROOT *mem_root);
637
  void hide_view_error(THD *thd);
638
  st_table_list *find_underlying_table(TABLE *table);
639 640 641
  st_table_list *first_leaf_for_name_resolution();
  st_table_list *last_leaf_for_name_resolution();
  bool is_leaf_for_name_resolution();
642 643
  inline st_table_list *top_table()
    { return belong_to_view ? belong_to_view : this; }
644 645 646 647 648 649 650 651 652 653 654 655 656 657
  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;
  }
658 659 660 661 662 663 664 665

  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

666 667 668
private:
  bool prep_check_option(THD *thd, uint8 check_opt_type);
  bool prep_where(THD *thd, Item **conds, bool no_where_clause);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
669
} TABLE_LIST;
670

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
671 672
class Item;

673 674 675 676
/*
  Iterator over the fields of a generic table reference.
*/

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
677 678 679 680 681 682
class Field_iterator: public Sql_alloc
{
public:
  virtual ~Field_iterator() {}
  virtual void set(TABLE_LIST *)= 0;
  virtual void next()= 0;
683
  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
684
  virtual const char *name()= 0;
685
  virtual Item *create_item(THD *)= 0;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
686 687 688 689
  virtual Field *field()= 0;
};


690 691 692 693 694
/* 
  Iterator over the fields of a base table, view with temporary
  table, or subquery.
*/

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
695 696 697 698 699 700 701 702
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++; }
703
  bool end_of_fields() { return *ptr == 0; }
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
704
  const char *name();
705
  Item *create_item(THD *thd);
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
706 707 708 709
  Field *field() { return *ptr; }
};


710 711
/* Iterator over the fields of a merge view. */

bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
712 713
class Field_iterator_view: public Field_iterator
{
714
  Field_translator *ptr, *array_end;
715
  TABLE_LIST *view;
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
716 717 718 719
public:
  Field_iterator_view() :ptr(0), array_end(0) {}
  void set(TABLE_LIST *table);
  void next() { ptr++; }
720
  bool end_of_fields() { return ptr == array_end; }
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
721
  const char *name();
722
  Item *create_item(THD *thd);
723
  Item **item_ptr() {return &ptr->item; }
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
724
  Field *field() { return 0; }
725
  inline Item *item() { return ptr->item; }
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
  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
{
  List_iterator_fast<Natural_join_column> *column_ref_it;
  Natural_join_column *cur_column_ref;
public:
  Field_iterator_natural_join() :column_ref_it(NULL), cur_column_ref(NULL) {}
  ~Field_iterator_natural_join() { delete column_ref_it; }
  void set(TABLE_LIST *table);
743
  void next();
744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
  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(); }
  Natural_join_column *get_or_create_column_ref(THD *thd, bool *is_created);
bell@sanja.is.com.ua's avatar
VIEW  
bell@sanja.is.com.ua committed
789 790
};

791

792 793 794 795
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 */
796
  table_map         not_null_tables; /* tables that rejects nulls           */
797
  struct st_join_table *first_nested;/* the first nested table in the plan  */
798 799 800 801 802 803 804 805 806
  /* 
    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*/
807
} NESTED_JOIN;
808

809

810 811
typedef struct st_changed_table_list
{
812
  struct	st_changed_table_list *next;
813
  char		*key;
814 815 816
  uint32        key_length;
} CHANGED_TABLE_LIST;

817

818
typedef struct st_open_table_list{
819 820 821 822
  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
823 824