table.h 8.69 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
unknown's avatar
unknown committed
2

unknown's avatar
unknown 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.
unknown's avatar
unknown committed
7

unknown's avatar
unknown 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.
unknown's avatar
unknown committed
12

unknown's avatar
unknown 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;
unknown's avatar
unknown 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 */
unknown's avatar
unknown committed
29
  Item	 *item_ptr;			/* Storage for initial item */
unknown's avatar
unknown 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;
unknown's avatar
unknown committed
42 43
  ulong privilege;
  ulong want_privilege;
unknown's avatar
unknown committed
44 45
} GRANT_INFO;

unknown's avatar
unknown committed
46 47
enum tmp_table_type {NO_TMP_TABLE=0, TMP_TABLE=1, TRANSACTIONAL_TMP_TABLE=2};

unknown's avatar
unknown 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;

unknown's avatar
unknown 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
};

unknown's avatar
unknown 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 */
unknown's avatar
unknown 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;
unknown's avatar
unknown committed
81
  byte *record[2];			/* Pointer to records */
82
  byte *default_values;          	/* Default values for INSERT */
unknown's avatar
unknown committed
83
  byte *insert_values;                  /* used by INSERT ... UPDATE */
unknown's avatar
unknown 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;
unknown's avatar
unknown 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;
unknown's avatar
unknown 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 */
unknown's avatar
unknown committed
126
  uint timestamp_field_offset;
127
  
unknown's avatar
unknown 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 */
unknown's avatar
unknown committed
132
  enum tmp_table_type tmp_table;
unknown's avatar
unknown committed
133 134 135
  my_bool copy_blobs;			/* copy_blobs when storing */
  my_bool null_row;			/* All columns are null */
  my_bool maybe_null,outer_join;	/* Used with OUTER JOIN */
136
  my_bool force_index;
137
  my_bool distinct,const_table,no_rows;
138
  my_bool key_read;
unknown's avatar
unknown committed
139 140 141
  my_bool crypted;
  my_bool db_low_byte_first;		/* Portable row format */
  my_bool locked_by_flush;
unknown's avatar
unknown committed
142
  my_bool locked_by_name;
unknown's avatar
unknown committed
143
  my_bool fulltext_searched;
144
  my_bool crashed;
unknown's avatar
unknown committed
145
  my_bool is_view;
146
  my_bool no_keyread, no_cache;
unknown's avatar
unknown committed
147
  my_bool clear_query_id;               /* To reset query_id for tables and cols */
148
  my_bool auto_increment_field_not_null;
unknown's avatar
unknown committed
149 150 151 152
  Field *next_number_field,		/* Set if next_number is activated */
	*found_next_number_field,	/* Set on open */
        *rowid_field;
  Field_timestamp *timestamp_field;
153 154 155 156 157 158 159 160
#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
unknown's avatar
unknown committed
161
  my_string comment;			/* Comment about table */
162
  CHARSET_INFO *table_charset;		/* Default charset of string fields */
unknown's avatar
unknown committed
163 164 165 166
  REGINFO reginfo;			/* field connections */
  MEM_ROOT mem_root;
  GRANT_INFO grant;

167
  /* A pair "database_name\0table_name\0", widely used as simply a db name */
unknown's avatar
unknown committed
168 169 170 171
  char		*table_cache_key;
  char		*table_name,*real_name,*path;
  uint		key_length;		/* Length of key */
  uint		tablenr,used_fields,null_bytes;
unknown's avatar
unknown committed
172
  table_map	map;                    /* ID bit of table (1,2,4,8,16...) */
unknown's avatar
unknown committed
173 174
  ulong		version,flush_version;
  uchar		*null_flags;
unknown's avatar
unknown committed
175
  FILESORT_INFO sort;
unknown's avatar
unknown committed
176 177 178 179 180
  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;
181
  uchar		frm_version;
unknown's avatar
unknown committed
182

unknown's avatar
unknown committed
183 184 185 186 187
  union					/* Temporary variables */
  {
    uint        temp_pool_slot;		/* Used by intern temp tables */
    struct st_table_list *pos_in_table_list;
  };
unknown's avatar
unknown committed
188
  /* number of select if it is derived table */
unknown's avatar
unknown committed
189
  uint          derived_select_number;
unknown's avatar
unknown committed
190
  THD		*in_use;		/* Which thread uses this */
unknown's avatar
unknown committed
191 192 193 194
  struct st_table *next,*prev;
};


195 196 197
#define JOIN_TYPE_LEFT	1
#define JOIN_TYPE_RIGHT	2

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

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

235 236 237 238 239 240
typedef struct st_open_table_list
{
  struct st_open_table_list *next;
  char	*db,*table;
  uint32 in_use,locked;
} OPEN_TABLE_LIST;
unknown's avatar
unknown committed
241 242