table.h 8.71 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;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
23 24 25 26 27 28

/* Order clause list element */

typedef struct st_order {
  struct st_order *next;
  Item	 **item;			/* Point at item in select fields */
29
  Item	 *item_ptr;			/* Storage for initial item */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
30 31 32 33 34 35 36 37 38 39 40 41
  bool	 asc;				/* true if ascending */
  bool	 free_me;			/* true if item isn't shared  */
  bool	 in_field_list;			/* true if in select field list */
  Field  *field;			/* If tmp-table group */
  char	 *buff;				/* If tmp-table group */
  table_map used,depend_map;
} ORDER;

typedef struct st_grant_info
{
  GRANT_TABLE *grant_table;
  uint version;
42 43
  ulong privilege;
  ulong want_privilege;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
44 45
} GRANT_INFO;

46 47
enum tmp_table_type {NO_TMP_TABLE=0, TMP_TABLE=1, TRANSACTIONAL_TMP_TABLE=2};

igor@hundin.mysql.fi's avatar
igor@hundin.mysql.fi committed
48 49 50 51 52 53 54 55 56 57 58
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
59

60 61 62 63 64 65 66 67 68 69
/*
  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
70 71 72 73 74 75 76
/* Table cache entry struct */

class Field_timestamp;
class Field_blob;

struct st_table {
  handler *file;
77
  Field **field;			/* Pointer to fields */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
78
  Field_blob **blob_field;		/* Pointer to blob fields */
79 80
  /* hash of field names (contains pointers to elements of field array) */
  HASH	name_hash;
81
  byte *record[2];			/* Pointer to records */
82
  byte *default_values;          	/* Default values for INSERT */
83
  byte *insert_values;                  /* used by INSERT ... UPDATE */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
84 85 86 87
  uint fields;				/* field count */
  uint reclength;			/* Recordlength */
  uint rec_buff_length;
  uint keys,key_parts,primary_key,max_key_length,max_unique_length;
88
  uint total_key_length;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
89 90 91
  uint uniques;
  uint null_fields;			/* number of null fields */
  uint blob_fields;			/* number of blob fields */
92
  key_map keys_in_use, keys_for_keyread, read_only_keys;
93
  key_map quick_keys, used_keys, keys_in_use_for_query;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
  KEY  *key_info;			/* data of keys in database */
  TYPELIB keynames;			/* Pointers to keynames */
  ha_rows max_rows;			/* create information */
  ha_rows min_rows;			/* create information */
  ulong   avg_row_length;		/* create information */
  ulong   raid_chunksize;
  TYPELIB fieldnames;			/* Pointer to fieldnames */
  TYPELIB *intervals;			/* pointer to interval info */
  enum db_type db_type;			/* table_type for handler */
  enum row_type row_type;		/* How rows are stored */
  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 */
  uint db_stat;				/* mode of file as in handler.h */
  uint raid_type,raid_chunks;
  uint status;				/* Used by postfix.. */
  uint system;				/* Set if system record */
111

112 113 114 115 116 117 118 119 120 121 122
  /*
    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).
123
  */
124
  timestamp_auto_set_type timestamp_field_type;
125
  /* Index of auto-updated TIMESTAMP field in field array */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
126
  uint timestamp_field_offset;
127
  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
128 129 130 131
  uint next_number_index;
  uint blob_ptr_size;			/* 4 or 8 */
  uint next_number_key_offset;
  int current_lock;			/* Type of lock on table */
132
  enum tmp_table_type tmp_table;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
133
  my_bool copy_blobs;			/* copy_blobs when storing */
134 135 136 137 138 139 140 141
  /*
    Used in outer joins: if true, all columns are considered to have NULL
    values, including columns declared as "not null".
  */
  my_bool null_row;
  /* 0 or JOIN_TYPE_{LEFT|RIGHT}, same as TABLE_LIST::outer_join */
  my_bool outer_join;
  my_bool maybe_null;                   /* true if (outer_join != 0) */
142
  my_bool force_index;
143
  my_bool distinct,const_table,no_rows;
144
  my_bool key_read;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
145 146 147
  my_bool crypted;
  my_bool db_low_byte_first;		/* Portable row format */
  my_bool locked_by_flush;
148
  my_bool locked_by_name;
149
  my_bool fulltext_searched;
150
  my_bool crashed;
151
  my_bool is_view;
152
  my_bool no_keyread, no_cache;
153
  my_bool clear_query_id;               /* To reset query_id for tables and cols */
154
  my_bool auto_increment_field_not_null;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
155 156 157 158
  Field *next_number_field,		/* Set if next_number is activated */
	*found_next_number_field,	/* Set on open */
        *rowid_field;
  Field_timestamp *timestamp_field;
159 160 161 162 163 164 165 166
#if MYSQL_VERSION_ID < 40100
  /*
    Indicates whenever we have to set field_length members of all TIMESTAMP
    fields to 19 (to honour 'new_mode' variable) or to original
    field_length values.
  */
  my_bool timestamp_mode;
#endif
bk@work.mysql.com's avatar
bk@work.mysql.com committed
167
  my_string comment;			/* Comment about table */
168
  CHARSET_INFO *table_charset;		/* Default charset of string fields */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
169 170 171 172
  REGINFO reginfo;			/* field connections */
  MEM_ROOT mem_root;
  GRANT_INFO grant;

173
  /* A pair "database_name\0table_name\0", widely used as simply a db name */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
174 175 176 177
  char		*table_cache_key;
  char		*table_name,*real_name,*path;
  uint		key_length;		/* Length of key */
  uint		tablenr,used_fields,null_bytes;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
178
  table_map	map;                    /* ID bit of table (1,2,4,8,16...) */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
179 180
  ulong		version,flush_version;
  uchar		*null_flags;
igor@hundin.mysql.fi's avatar
igor@hundin.mysql.fi committed
181
  FILESORT_INFO sort;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
182 183 184 185 186
  ORDER		*group;
  ha_rows	quick_rows[MAX_KEY];
  uint		quick_key_parts[MAX_KEY];
  key_part_map  const_key_parts[MAX_KEY];
  ulong		query_id;
187
  uchar		frm_version;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
188

189 190 191 192 193
  union					/* Temporary variables */
  {
    uint        temp_pool_slot;		/* Used by intern temp tables */
    struct st_table_list *pos_in_table_list;
  };
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
194
  /* number of select if it is derived table */
195
  uint          derived_select_number;
196
  THD		*in_use;		/* Which thread uses this */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
197 198 199 200
  struct st_table *next,*prev;
};


201 202 203
#define JOIN_TYPE_LEFT	1
#define JOIN_TYPE_RIGHT	2

204 205
typedef struct st_table_list
{
bk@work.mysql.com's avatar
bk@work.mysql.com committed
206
  struct	st_table_list *next;
207
  char		*db, *alias, *real_name;
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
208
  char          *option;                /* Used by cache index  */ 
209 210
  Item		*on_expr;		/* Used with outer join */
  struct st_table_list *natural_join;	/* natural join on this table*/
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
211
  /* ... join ... USE INDEX ... IGNORE INDEX */
212
  List<String>	*use_index, *ignore_index; 
213 214
  TABLE          *table;      /* opened table */
  st_table_list  *table_list; /* pointer to node of list of all tables */
215
  class st_select_lex_unit *derived;	/* SELECT_LEX_UNIT of derived table */
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
216
 GRANT_INFO	grant;
217
  thr_lock_type lock_type;
218
  uint		outer_join;		/* Which join type */
219
  uint		shared;			/* Used in multi-upd */
220 221 222
  uint32        db_length, real_name_length;
  bool		straight;		/* optimize with prev table */
  bool          updating;               /* for replicate-do/ignore table */
223
  bool		force_index;		/* Prefer index over table scan */
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
224
  bool          ignore_leaves;          /* Preload only non-leaf nodes */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
225
  bool		cacheable_table;	/* stop PS caching */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
226 227
  /* used in multi-upd privelege check */
  bool		table_in_update_from_clause;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
228
} TABLE_LIST;
229

230 231
typedef struct st_changed_table_list
{
232
  struct	st_changed_table_list *next;
233
  char		*key;
234 235 236
  uint32        key_length;
} CHANGED_TABLE_LIST;

237 238 239 240 241 242
typedef struct st_open_table_list
{
  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
243 244