~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000-2006 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
17
/* Some general useful functions */
18
19
#include "mysql_priv.h"
20
#include <m_ctype.h>
21
#include "my_md5.h"
22
23
/* INFORMATION_SCHEMA name */
24
LEX_STRING INFORMATION_SCHEMA_NAME= {C_STRING_WITH_LEN("information_schema")};
25
26
/* MYSQL_SCHEMA name */
27
LEX_STRING MYSQL_SCHEMA_NAME= {C_STRING_WITH_LEN("mysql")};
28
29
/* Functions defined in this file */
30
31
void open_table_error(TABLE_SHARE *share, int error, int db_errno,
32
                      myf errortype, int errarg);
33
static int open_binary_frm(THD *thd, TABLE_SHARE *share,
34
                           uchar *head, File file);
35
static void fix_type_pointers(const char ***array, TYPELIB *point_to_type,
36
			      uint types, char **names);
37
static uint find_field(Field **fields, uchar *record, uint start, uint length);
38
39
/**************************************************************************
40
  Object_creation_ctx implementation.
41
**************************************************************************/
42
43
Object_creation_ctx *Object_creation_ctx::set_n_backup(THD *thd)
44
{
45
  Object_creation_ctx *backup_ctx;
46
47
  backup_ctx= create_backup_ctx(thd);
48
  change_env(thd);
49
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
50
  return(backup_ctx);
1 by brian
clean slate
51
}
52
53
void Object_creation_ctx::restore_env(THD *thd, Object_creation_ctx *backup_ctx)
54
{
55
  if (!backup_ctx)
56
    return;
57
58
  backup_ctx->change_env(thd);
59
60
  delete backup_ctx;
61
}
62
63
/**************************************************************************
64
  Default_object_creation_ctx implementation.
65
**************************************************************************/
66
67
Default_object_creation_ctx::Default_object_creation_ctx(THD *thd)
68
  : m_client_cs(thd->variables.character_set_client),
69
    m_connection_cl(thd->variables.collation_connection)
70
{ }
71
72
Default_object_creation_ctx::Default_object_creation_ctx(
73
  CHARSET_INFO *client_cs, CHARSET_INFO *connection_cl)
74
  : m_client_cs(client_cs),
75
    m_connection_cl(connection_cl)
76
{ }
77
78
Object_creation_ctx *
79
Default_object_creation_ctx::create_backup_ctx(THD *thd) const
80
{
81
  return new Default_object_creation_ctx(thd);
82
}
83
84
void Default_object_creation_ctx::change_env(THD *thd) const
85
{
86
  thd->variables.character_set_client= m_client_cs;
87
  thd->variables.collation_connection= m_connection_cl;
88
89
  thd->update_charset();
90
}
91
92
/*************************************************************************/
93
94
/* Get column name from column hash */
95
96
static uchar *get_field_name(Field **buff, size_t *length,
97
                             my_bool not_used __attribute__((unused)))
98
{
99
  *length= (uint) strlen((*buff)->field_name);
100
  return (uchar*) (*buff)->field_name;
101
}
102
103
104
/*
105
  Returns pointer to '.frm' extension of the file name.
106
107
  SYNOPSIS
108
    fn_rext()
109
    name       file name
110
111
  DESCRIPTION
112
    Checks file name part starting with the rightmost '.' character,
113
    and returns it if it is equal to '.frm'. 
114
115
  TODO
116
    It is a good idea to get rid of this function modifying the code
117
    to garantee that the functions presently calling fn_rext() always
118
    get arguments in the same format: either with '.frm' or without '.frm'.
119
120
  RETURN VALUES
121
    Pointer to the '.frm' extension. If there is no extension,
122
    or extension is not '.frm', pointer at the end of file name.
123
*/
124
125
char *fn_rext(char *name)
126
{
127
  char *res= strrchr(name, '.');
128
  if (res && !strcmp(res, reg_ext))
129
    return res;
130
  return name + strlen(name);
131
}
132
133
TABLE_CATEGORY get_table_category(const LEX_STRING *db, const LEX_STRING *name)
134
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
135
  assert(db != NULL);
136
  assert(name != NULL);
1 by brian
clean slate
137
138
  if ((db->length == INFORMATION_SCHEMA_NAME.length) &&
139
      (my_strcasecmp(system_charset_info,
140
                    INFORMATION_SCHEMA_NAME.str,
141
                    db->str) == 0))
142
  {
143
    return TABLE_CATEGORY_INFORMATION;
144
  }
145
146
  return TABLE_CATEGORY_USER;
147
}
148
149
150
/*
151
  Allocate a setup TABLE_SHARE structure
152
153
  SYNOPSIS
154
    alloc_table_share()
155
    TABLE_LIST		Take database and table name from there
156
    key			Table cache key (db \0 table_name \0...)
157
    key_length		Length of key
158
159
  RETURN
160
    0  Error (out of memory)
161
    #  Share
162
*/
163
164
TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key,
165
                               uint key_length)
166
{
167
  MEM_ROOT mem_root;
168
  TABLE_SHARE *share;
169
  char *key_buff, *path_buff;
170
  char path[FN_REFLEN];
171
  uint path_length;
172
173
  path_length= build_table_filename(path, sizeof(path) - 1,
174
                                    table_list->db,
175
                                    table_list->table_name, "", 0);
176
  init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
177
  if (multi_alloc_root(&mem_root,
178
                       &share, sizeof(*share),
179
                       &key_buff, key_length,
180
                       &path_buff, path_length + 1,
181
                       NULL))
182
  {
183
    bzero((char*) share, sizeof(*share));
184
185
    share->set_table_cache_key(key_buff, key, key_length);
186
187
    share->path.str= path_buff;
188
    share->path.length= path_length;
189
    strmov(share->path.str, path);
190
    share->normalized_path.str=    share->path.str;
191
    share->normalized_path.length= path_length;
192
193
    share->version=       refresh_version;
194
195
    /*
196
      This constant is used to mark that no table map version has been
197
      assigned.  No arithmetic is done on the value: it will be
198
      overwritten with a value taken from MYSQL_BIN_LOG.
199
    */
200
    share->table_map_version= ~(uint64_t)0;
201
202
    /*
203
      Since alloc_table_share() can be called without any locking (for
204
      example, ha_create_table... functions), we do not assign a table
205
      map id here.  Instead we assign a value that is not used
206
      elsewhere, and then assign a table map id inside open_table()
207
      under the protection of the LOCK_open mutex.
208
    */
209
    share->table_map_id= ~0UL;
210
    share->cached_row_logging_check= -1;
211
212
    memcpy((char*) &share->mem_root, (char*) &mem_root, sizeof(mem_root));
213
    pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST);
214
    pthread_cond_init(&share->cond, NULL);
215
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
216
  return(share);
1 by brian
clean slate
217
}
218
219
220
/*
221
  Initialize share for temporary tables
222
223
  SYNOPSIS
224
    init_tmp_table_share()
225
    thd         thread handle
226
    share	Share to fill
227
    key		Table_cache_key, as generated from create_table_def_key.
228
		must start with db name.    
229
    key_length	Length of key
230
    table_name	Table name
231
    path	Path to file (possible in lower case) without .frm
232
233
  NOTES
234
    This is different from alloc_table_share() because temporary tables
235
    don't have to be shared between threads or put into the table def
236
    cache, so we can do some things notable simpler and faster
237
238
    If table is not put in thd->temporary_tables (happens only when
239
    one uses OPEN TEMPORARY) then one can specify 'db' as key and
240
    use key_length= 0 as neither table_cache_key or key_length will be used).
241
*/
242
243
void init_tmp_table_share(THD *thd, TABLE_SHARE *share, const char *key,
244
                          uint key_length, const char *table_name,
245
                          const char *path)
246
{
247
248
  bzero((char*) share, sizeof(*share));
249
  init_sql_alloc(&share->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
250
  share->table_category=         TABLE_CATEGORY_TEMPORARY;
251
  share->tmp_table=              INTERNAL_TMP_TABLE;
252
  share->db.str=                 (char*) key;
253
  share->db.length=		 strlen(key);
254
  share->table_cache_key.str=    (char*) key;
255
  share->table_cache_key.length= key_length;
256
  share->table_name.str=         (char*) table_name;
257
  share->table_name.length=      strlen(table_name);
258
  share->path.str=               (char*) path;
259
  share->normalized_path.str=    (char*) path;
260
  share->path.length= share->normalized_path.length= strlen(path);
261
  share->frm_version= 		 FRM_VER_TRUE_VARCHAR;
262
  /*
263
    Temporary tables are not replicated, but we set up these fields
264
    anyway to be able to catch errors.
265
   */
266
  share->table_map_version= ~(uint64_t)0;
267
  share->cached_row_logging_check= -1;
268
269
  /*
270
    table_map_id is also used for MERGE tables to suppress repeated
271
    compatibility checks.
272
  */
273
  share->table_map_id= (ulong) thd->query_id;
274
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
275
  return;
1 by brian
clean slate
276
}
277
278
279
/*
280
  Free table share and memory used by it
281
282
  SYNOPSIS
283
    free_table_share()
284
    share		Table share
285
286
  NOTES
287
    share->mutex must be locked when we come here if it's not a temp table
288
*/
289
290
void free_table_share(TABLE_SHARE *share)
291
{
292
  MEM_ROOT mem_root;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
293
  assert(share->ref_count == 0);
1 by brian
clean slate
294
295
  /*
296
    If someone is waiting for this to be deleted, inform it about this.
297
    Don't do a delete until we know that no one is refering to this anymore.
298
  */
299
  if (share->tmp_table == NO_TMP_TABLE)
300
  {
301
    /* share->mutex is locked in release_table_share() */
302
    while (share->waiting_on_cond)
303
    {
304
      pthread_cond_broadcast(&share->cond);
305
      pthread_cond_wait(&share->cond, &share->mutex);
306
    }
307
    /* No thread refers to this anymore */
308
    pthread_mutex_unlock(&share->mutex);
309
    pthread_mutex_destroy(&share->mutex);
310
    pthread_cond_destroy(&share->cond);
311
  }
312
  hash_free(&share->name_hash);
313
  
314
  plugin_unlock(NULL, share->db_plugin);
315
  share->db_plugin= NULL;
316
317
  /* We must copy mem_root from share because share is allocated through it */
318
  memcpy((char*) &mem_root, (char*) &share->mem_root, sizeof(mem_root));
319
  free_root(&mem_root, MYF(0));                 // Free's share
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
320
  return;
1 by brian
clean slate
321
}
322
323
/*
324
  Read table definition from a binary / text based .frm file
325
  
326
  SYNOPSIS
327
  open_table_def()
328
  thd		Thread handler
329
  share		Fill this with table definition
330
  db_flags	Bit mask of the following flags: OPEN_VIEW
331
332
  NOTES
333
    This function is called when the table definition is not cached in
334
    table_def_cache
335
    The data is returned in 'share', which is alloced by
336
    alloc_table_share().. The code assumes that share is initialized.
337
338
  RETURN VALUES
339
   0	ok
340
   1	Error (see open_table_error)
341
   2    Error (see open_table_error)
342
   3    Wrong data in .frm file
343
   4    Error (see open_table_error)
344
   5    Error (see open_table_error: charset unavailable)
345
   6    Unknown .frm version
346
*/
347
348
int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags)
349
{
350
  int error, table_type;
351
  bool error_given;
352
  File file;
353
  uchar head[64], *disk_buff;
354
  char	path[FN_REFLEN];
355
  MEM_ROOT **root_ptr, *old_root;
356
357
  error= 1;
358
  error_given= 0;
359
  disk_buff= NULL;
360
361
  strxmov(path, share->normalized_path.str, reg_ext, NullS);
362
  if ((file= my_open(path, O_RDONLY | O_SHARE, MYF(0))) < 0)
363
  {
364
    /*
365
      We don't try to open 5.0 unencoded name, if
366
      - non-encoded name contains '@' signs, 
367
        because '@' can be misinterpreted.
368
        It is not clear if '@' is escape character in 5.1,
369
        or a normal character in 5.0.
370
        
371
      - non-encoded db or table name contain "#mysql50#" prefix.
372
        This kind of tables must have been opened only by the
373
        my_open() above.
374
    */
375
    if (strchr(share->table_name.str, '@') ||
376
        !strncmp(share->db.str, MYSQL50_TABLE_NAME_PREFIX,
377
                 MYSQL50_TABLE_NAME_PREFIX_LENGTH) ||
378
        !strncmp(share->table_name.str, MYSQL50_TABLE_NAME_PREFIX,
379
                 MYSQL50_TABLE_NAME_PREFIX_LENGTH))
380
      goto err_not_open;
381
382
    /* Try unencoded 5.0 name */
383
    uint length;
384
    strxnmov(path, sizeof(path)-1,
385
             mysql_data_home, "/", share->db.str, "/",
386
             share->table_name.str, reg_ext, NullS);
387
    length= unpack_filename(path, path) - reg_ext_length;
388
    /*
389
      The following is a safety test and should never fail
390
      as the old file name should never be longer than the new one.
391
    */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
392
    assert(length <= share->normalized_path.length);
1 by brian
clean slate
393
    /*
394
      If the old and the new names have the same length,
395
      then table name does not have tricky characters,
396
      so no need to check the old file name.
397
    */
398
    if (length == share->normalized_path.length ||
399
        ((file= my_open(path, O_RDONLY | O_SHARE, MYF(0))) < 0))
400
      goto err_not_open;
401
402
    /* Unencoded 5.0 table name found */
403
    path[length]= '\0'; // Remove .frm extension
404
    strmov(share->normalized_path.str, path);
405
    share->normalized_path.length= length;
406
  }
407
408
  error= 4;
409
  if (my_read(file, head, 64, MYF(MY_NABP)))
410
    goto err;
411
412
  if (head[0] == (uchar) 254 && head[1] == 1)
413
  {
414
    if (head[2] == FRM_VER || head[2] == FRM_VER+1 ||
415
        (head[2] >= FRM_VER+3 && head[2] <= FRM_VER+4))
416
    {
417
      /* Open view only */
418
      if (db_flags & OPEN_VIEW_ONLY)
419
      {
420
        error_given= 1;
421
        goto err;
422
      }
423
      table_type= 1;
424
    }
425
    else
426
    {
427
      error= 6;                                 // Unkown .frm version
428
      goto err;
429
    }
430
  }
431
  else
432
    goto err;
433
434
  /* No handling of text based files yet */
435
  if (table_type == 1)
436
  {
4 by Brian Aker
Remove my_pthread_getspecific_ptr()
437
    root_ptr= (MEM_ROOT **)pthread_getspecific(THR_MALLOC);
1 by brian
clean slate
438
    old_root= *root_ptr;
439
    *root_ptr= &share->mem_root;
440
    error= open_binary_frm(thd, share, head, file);
441
    *root_ptr= old_root;
442
    error_given= 1;
443
  }
81 by Brian Aker
Small cleanups
444
  else
445
    assert(1);
1 by brian
clean slate
446
447
  share->table_category= get_table_category(& share->db, & share->table_name);
448
449
  if (!error)
450
    thd->status_var.opened_shares++;
451
452
err:
453
  my_close(file, MYF(MY_WME));
454
455
err_not_open:
456
  if (error && !error_given)
457
  {
458
    share->error= error;
459
    open_table_error(share, error, (share->open_errno= my_errno), 0);
460
  }
461
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
462
  return(error);
1 by brian
clean slate
463
}
464
465
466
/*
467
  Read data from a binary .frm file from MySQL 3.23 - 5.0 into TABLE_SHARE
468
*/
469
470
static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
471
                           File file)
472
{
473
  int error, errarg= 0;
474
  uint new_frm_ver, field_pack_length, new_field_pack_flag;
475
  uint interval_count, interval_parts, read_length, int_length;
476
  uint db_create_options, keys, key_parts, n_length;
477
  uint key_info_length, com_length, null_bit_pos;
478
  uint extra_rec_buf_length;
479
  uint i,j;
480
  bool use_hash;
481
  uchar forminfo[288];
482
  char *keynames, *names, *comment_pos;
483
  uchar *record;
484
  uchar *disk_buff, *strpos, *null_flags, *null_pos;
485
  ulong pos, record_offset, *rec_per_key, rec_buff_length;
486
  handler *handler_file= 0;
487
  KEY	*keyinfo;
488
  KEY_PART_INFO *key_part;
489
  SQL_CRYPT *crypted=0;
490
  Field  **field_ptr, *reg_field;
491
  const char **interval_array;
492
  enum legacy_db_type legacy_db_type;
493
  my_bitmap_map *bitmaps;
494
  uchar *buff= 0;
495
  uchar *field_extra_info= 0;
496
497
  new_field_pack_flag= head[27];
498
  new_frm_ver= (head[2] - FRM_VER);
499
  field_pack_length= new_frm_ver < 2 ? 11 : 17;
500
  disk_buff= 0;
501
502
  error= 3;
503
  if (!(pos=get_form_pos(file,head,(TYPELIB*) 0)))
504
    goto err;                                   /* purecov: inspected */
505
  VOID(my_seek(file,pos,MY_SEEK_SET,MYF(0)));
506
  if (my_read(file,forminfo,288,MYF(MY_NABP)))
507
    goto err;
508
509
  share->frm_version= head[2];
510
  /*
511
    Check if .frm file created by MySQL 5.0. In this case we want to
512
    display CHAR fields as CHAR and not as VARCHAR.
513
    We do it this way as we want to keep the old frm version to enable
514
    MySQL 4.1 to read these files.
515
  */
516
  if (share->frm_version == FRM_VER_TRUE_VARCHAR -1 && head[33] == 5)
517
    share->frm_version= FRM_VER_TRUE_VARCHAR;
518
81 by Brian Aker
Small cleanups
519
  legacy_db_type= DB_TYPE_FIRST_DYNAMIC;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
520
  assert(share->db_plugin == NULL);
1 by brian
clean slate
521
  /*
522
    if the storage engine is dynamic, no point in resolving it by its
523
    dynamically allocated legacy_db_type. We will resolve it later by name.
524
  */
525
  if (legacy_db_type > DB_TYPE_UNKNOWN && 
526
      legacy_db_type < DB_TYPE_FIRST_DYNAMIC)
527
    share->db_plugin= ha_lock_engine(NULL, 
528
                                     ha_checktype(thd, legacy_db_type, 0, 0));
529
  share->db_create_options= db_create_options= uint2korr(head+30);
530
  share->db_options_in_use= share->db_create_options;
531
  share->mysql_version= uint4korr(head+51);
532
  share->null_field_first= 0;
533
  if (!head[32])				// New frm file in 3.23
534
  {
535
    share->avg_row_length= uint4korr(head+34);
536
    share->transactional= (ha_choice) (head[39] & 3);
537
    share->page_checksum= (ha_choice) ((head[39] >> 2) & 3);
538
    share->row_type= (row_type) head[40];
539
    share->table_charset= get_charset((uint) head[38],MYF(0));
540
    share->null_field_first= 1;
541
  }
542
  if (!share->table_charset)
543
  {
544
    /* unknown charset in head[38] or pre-3.23 frm */
545
    if (use_mb(default_charset_info))
546
    {
547
      /* Warn that we may be changing the size of character columns */
548
      sql_print_warning("'%s' had no or invalid character set, "
549
                        "and default character set is multi-byte, "
550
                        "so character column sizes may have changed",
551
                        share->path.str);
552
    }
553
    share->table_charset= default_charset_info;
554
  }
555
  share->db_record_offset= 1;
556
  if (db_create_options & HA_OPTION_LONG_BLOB_PTR)
557
    share->blob_ptr_size= portable_sizeof_char_ptr;
558
  /* Set temporarily a good value for db_low_byte_first */
559
  share->db_low_byte_first= test(legacy_db_type != DB_TYPE_ISAM);
560
  error=4;
561
  share->max_rows= uint4korr(head+18);
562
  share->min_rows= uint4korr(head+22);
563
564
  /* Read keyinformation */
565
  key_info_length= (uint) uint2korr(head+28);
566
  VOID(my_seek(file,(ulong) uint2korr(head+6),MY_SEEK_SET,MYF(0)));
567
  if (read_string(file,(uchar**) &disk_buff,key_info_length))
568
    goto err;                                   /* purecov: inspected */
569
  if (disk_buff[0] & 0x80)
570
  {
571
    share->keys=      keys=      (disk_buff[1] << 7) | (disk_buff[0] & 0x7f);
572
    share->key_parts= key_parts= uint2korr(disk_buff+2);
573
  }
574
  else
575
  {
576
    share->keys=      keys=      disk_buff[0];
577
    share->key_parts= key_parts= disk_buff[1];
578
  }
579
  share->keys_for_keyread.init(0);
580
  share->keys_in_use.init(keys);
581
582
  n_length=keys*sizeof(KEY)+key_parts*sizeof(KEY_PART_INFO);
583
  if (!(keyinfo = (KEY*) alloc_root(&share->mem_root,
584
				    n_length + uint2korr(disk_buff+4))))
585
    goto err;                                   /* purecov: inspected */
586
  bzero((char*) keyinfo,n_length);
587
  share->key_info= keyinfo;
588
  key_part= my_reinterpret_cast(KEY_PART_INFO*) (keyinfo+keys);
589
  strpos=disk_buff+6;
590
591
  if (!(rec_per_key= (ulong*) alloc_root(&share->mem_root,
592
					 sizeof(ulong*)*key_parts)))
593
    goto err;
594
595
  for (i=0 ; i < keys ; i++, keyinfo++)
596
  {
597
    keyinfo->table= 0;                           // Updated in open_frm
598
    if (new_frm_ver >= 3)
599
    {
600
      keyinfo->flags=	   (uint) uint2korr(strpos) ^ HA_NOSAME;
601
      keyinfo->key_length= (uint) uint2korr(strpos+2);
602
      keyinfo->key_parts=  (uint) strpos[4];
603
      keyinfo->algorithm=  (enum ha_key_alg) strpos[5];
604
      keyinfo->block_size= uint2korr(strpos+6);
605
      strpos+=8;
606
    }
607
608
    keyinfo->key_part=	 key_part;
609
    keyinfo->rec_per_key= rec_per_key;
610
    for (j=keyinfo->key_parts ; j-- ; key_part++)
611
    {
612
      *rec_per_key++=0;
613
      key_part->fieldnr=	(uint16) (uint2korr(strpos) & FIELD_NR_MASK);
614
      key_part->offset= (uint) uint2korr(strpos+2)-1;
615
      key_part->key_type=	(uint) uint2korr(strpos+5);
616
      // key_part->field=	(Field*) 0;	// Will be fixed later
617
      if (new_frm_ver >= 1)
618
      {
619
	key_part->key_part_flag= *(strpos+4);
620
	key_part->length=	(uint) uint2korr(strpos+7);
621
	strpos+=9;
622
      }
623
      else
624
      {
625
	key_part->length=	*(strpos+4);
626
	key_part->key_part_flag=0;
627
	if (key_part->length > 128)
628
	{
629
	  key_part->length&=127;		/* purecov: inspected */
630
	  key_part->key_part_flag=HA_REVERSE_SORT; /* purecov: inspected */
631
	}
632
	strpos+=7;
633
      }
634
      key_part->store_length=key_part->length;
635
    }
636
  }
637
  keynames=(char*) key_part;
638
  strpos+= (strmov(keynames, (char *) strpos) - keynames)+1;
639
640
  //reading index comments
641
  for (keyinfo= share->key_info, i=0; i < keys; i++, keyinfo++)
642
  {
643
    if (keyinfo->flags & HA_USES_COMMENT)
644
    {
645
      keyinfo->comment.length= uint2korr(strpos);
646
      keyinfo->comment.str= strmake_root(&share->mem_root, (char*) strpos+2,
647
                                         keyinfo->comment.length);
648
      strpos+= 2 + keyinfo->comment.length;
649
    } 
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
650
    assert(test(keyinfo->flags & HA_USES_COMMENT) == 
1 by brian
clean slate
651
               (keyinfo->comment.length > 0));
652
  }
653
654
  share->reclength = uint2korr((head+16));
655
  if (*(head+26) == 1)
656
    share->system= 1;				/* one-record-database */
657
658
  record_offset= (ulong) (uint2korr(head+6)+
659
                          ((uint2korr(head+14) == 0xffff ?
660
                            uint4korr(head+47) : uint2korr(head+14))));
661
 
662
  if ((n_length= uint4korr(head+55)))
663
  {
664
    /* Read extra data segment */
665
    uchar *next_chunk, *buff_end;
666
    if (!(next_chunk= buff= (uchar*) my_malloc(n_length, MYF(MY_WME))))
667
      goto err;
31 by Brian Aker
Removed my versions of pread/pwrite from the Kernel
668
    if (pread(file, buff, n_length, record_offset + share->reclength) == 0)
1 by brian
clean slate
669
    {
670
      goto err;
671
    }
672
    share->connect_string.length= uint2korr(buff);
673
    if (!(share->connect_string.str= strmake_root(&share->mem_root,
674
                                                  (char*) next_chunk + 2,
675
                                                  share->connect_string.
676
                                                  length)))
677
    {
678
      goto err;
679
    }
680
    next_chunk+= share->connect_string.length + 2;
681
    buff_end= buff + n_length;
682
    if (next_chunk + 2 < buff_end)
683
    {
684
      uint str_db_type_length= uint2korr(next_chunk);
685
      LEX_STRING name;
686
      name.str= (char*) next_chunk + 2;
687
      name.length= str_db_type_length;
688
689
      plugin_ref tmp_plugin= ha_resolve_by_name(thd, &name);
690
      if (tmp_plugin != NULL && !plugin_equals(tmp_plugin, share->db_plugin))
691
      {
692
        if (legacy_db_type > DB_TYPE_UNKNOWN &&
693
            legacy_db_type < DB_TYPE_FIRST_DYNAMIC &&
694
            legacy_db_type != ha_legacy_type(
695
                plugin_data(tmp_plugin, handlerton *)))
696
        {
697
          /* bad file, legacy_db_type did not match the name */
698
          my_free(buff, MYF(0));
699
          goto err;
700
        }
701
        /*
702
          tmp_plugin is locked with a local lock.
703
          we unlock the old value of share->db_plugin before
704
          replacing it with a globally locked version of tmp_plugin
705
        */
706
        plugin_unlock(NULL, share->db_plugin);
707
        share->db_plugin= my_plugin_lock(NULL, &tmp_plugin);
708
      }
709
      else if (!tmp_plugin)
710
      {
711
        /* purecov: begin inspected */
712
        error= 8;
713
        my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), name.str);
714
        my_free(buff, MYF(0));
715
        goto err;
716
        /* purecov: end */
717
      }
718
      next_chunk+= str_db_type_length + 2;
719
    }
720
    if (share->mysql_version >= 50110)
721
    {
722
      /* New auto_partitioned indicator introduced in 5.1.11 */
723
      next_chunk++;
724
    }
725
    if (forminfo[46] == (uchar)255)
726
    {
727
      //reading long table comment
728
      if (next_chunk + 2 > buff_end)
729
      {
730
          my_free(buff, MYF(0));
731
          goto err;
732
      }
733
      share->comment.length = uint2korr(next_chunk);
734
      if (! (share->comment.str= strmake_root(&share->mem_root,
735
                               (char*)next_chunk + 2, share->comment.length)))
736
      {
737
          my_free(buff, MYF(0));
738
          goto err;
739
      }
740
      next_chunk+= 2 + share->comment.length;
741
    }
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
742
    assert(next_chunk <= buff_end);
1 by brian
clean slate
743
    if (share->mysql_version >= MYSQL_VERSION_TABLESPACE_IN_FRM_CGE)
744
    {
745
      /*
746
       New frm format in mysql_version 5.2.5 (originally in
747
       mysql-5.1.22-ndb-6.2.5)
748
       New column properties added:
749
       COLUMN_FORMAT DYNAMIC|FIXED and STORAGE DISK|MEMORY
750
       TABLESPACE name is now stored in frm
751
      */
752
      if (next_chunk >= buff_end)
753
      {
754
        if (share->mysql_version >= MYSQL_VERSION_TABLESPACE_IN_FRM)
755
        {
756
          goto err;
757
        }
758
      }
759
      else
760
      {
761
        const uint format_section_header_size= 8;
762
        uint format_section_len= uint2korr(next_chunk+0);
763
106 by Brian Aker
Tablespace removal.
764
        field_extra_info= next_chunk + format_section_header_size + 1;
1 by brian
clean slate
765
        next_chunk+= format_section_len;
766
      }
767
    }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
768
    assert (next_chunk <= buff_end);
1 by brian
clean slate
769
    if (next_chunk > buff_end)
770
    {
771
      goto err;
772
    }
773
  }
774
  share->key_block_size= uint2korr(head+62);
775
776
  error=4;
777
  extra_rec_buf_length= uint2korr(head+59);
778
  rec_buff_length= ALIGN_SIZE(share->reclength + 1 + extra_rec_buf_length);
779
  share->rec_buff_length= rec_buff_length;
780
  if (!(record= (uchar *) alloc_root(&share->mem_root,
781
                                     rec_buff_length)))
782
    goto err;                                   /* purecov: inspected */
783
  share->default_values= record;
31 by Brian Aker
Removed my versions of pread/pwrite from the Kernel
784
  if (pread(file, record, (size_t) share->reclength, record_offset) == 0)
1 by brian
clean slate
785
    goto err;                                   /* purecov: inspected */
786
787
  VOID(my_seek(file,pos+288,MY_SEEK_SET,MYF(0)));
788
789
  share->fields= uint2korr(forminfo+258);
790
  pos= uint2korr(forminfo+260);			/* Length of all screens */
791
  n_length= uint2korr(forminfo+268);
792
  interval_count= uint2korr(forminfo+270);
793
  interval_parts= uint2korr(forminfo+272);
794
  int_length= uint2korr(forminfo+274);
795
  share->null_fields= uint2korr(forminfo+282);
796
  com_length= uint2korr(forminfo+284);
797
  if (forminfo[46] != (uchar)255)
798
  {
799
    share->comment.length=  (int) (forminfo[46]);
800
    share->comment.str= strmake_root(&share->mem_root, (char*) forminfo+47,
801
                                     share->comment.length);
802
  }
803
804
805
  if (!(field_ptr = (Field **)
806
	alloc_root(&share->mem_root,
807
		   (uint) ((share->fields+1)*sizeof(Field*)+
808
			   interval_count*sizeof(TYPELIB)+
809
			   (share->fields+interval_parts+
810
			    keys+3)*sizeof(char *)+
811
			   (n_length+int_length+com_length)))))
812
    goto err;                                   /* purecov: inspected */
813
814
  share->field= field_ptr;
815
  read_length=(uint) (share->fields * field_pack_length +
816
		      pos+ (uint) (n_length+int_length+com_length));
817
  if (read_string(file,(uchar**) &disk_buff,read_length))
818
    goto err;                                   /* purecov: inspected */
819
  strpos= disk_buff+pos;
820
821
  share->intervals= (TYPELIB*) (field_ptr+share->fields+1);
822
  interval_array= (const char **) (share->intervals+interval_count);
823
  names= (char*) (interval_array+share->fields+interval_parts+keys+3);
824
  if (!interval_count)
825
    share->intervals= 0;			// For better debugging
826
  memcpy((char*) names, strpos+(share->fields*field_pack_length),
827
	 (uint) (n_length+int_length));
828
  comment_pos= names+(n_length+int_length);
829
  memcpy(comment_pos, disk_buff+read_length-com_length, com_length);
830
831
  fix_type_pointers(&interval_array, &share->fieldnames, 1, &names);
832
  if (share->fieldnames.count != share->fields)
833
    goto err;
834
  fix_type_pointers(&interval_array, share->intervals, interval_count,
835
		    &names);
836
837
  {
838
    /* Set ENUM and SET lengths */
839
    TYPELIB *interval;
840
    for (interval= share->intervals;
841
         interval < share->intervals + interval_count;
842
         interval++)
843
    {
844
      uint count= (uint) (interval->count + 1) * sizeof(uint);
845
      if (!(interval->type_lengths= (uint *) alloc_root(&share->mem_root,
846
                                                        count)))
847
        goto err;
848
      for (count= 0; count < interval->count; count++)
849
      {
850
        char *val= (char*) interval->type_names[count];
851
        interval->type_lengths[count]= strlen(val);
852
      }
853
      interval->type_lengths[count]= 0;
854
    }
855
  }
856
857
  if (keynames)
858
    fix_type_pointers(&interval_array, &share->keynames, 1, &keynames);
859
860
 /* Allocate handler */
861
  if (!(handler_file= get_new_handler(share, thd->mem_root,
862
                                      share->db_type())))
863
    goto err;
864
865
  record= share->default_values-1;              /* Fieldstart = 1 */
866
  if (share->null_field_first)
867
  {
868
    null_flags= null_pos= (uchar*) record+1;
869
    null_bit_pos= (db_create_options & HA_OPTION_PACK_RECORD) ? 0 : 1;
870
    /*
871
      null_bytes below is only correct under the condition that
872
      there are no bit fields.  Correct values is set below after the
873
      table struct is initialized
874
    */
875
    share->null_bytes= (share->null_fields + null_bit_pos + 7) / 8;
876
  }
877
878
  use_hash= share->fields >= MAX_FIELDS_BEFORE_HASH;
879
  if (use_hash)
880
    use_hash= !hash_init(&share->name_hash,
881
			 system_charset_info,
882
			 share->fields,0,0,
883
			 (hash_get_key) get_field_name,0,0);
884
885
  for (i=0 ; i < share->fields; i++, strpos+=field_pack_length, field_ptr++)
886
  {
887
    uint pack_flag, interval_nr, unireg_type, recpos, field_length;
888
    enum_field_types field_type;
889
    enum column_format_type column_format= COLUMN_FORMAT_TYPE_DEFAULT;
890
    CHARSET_INFO *charset=NULL;
891
    LEX_STRING comment;
892
893
    if (field_extra_info)
894
    {
895
      char tmp= field_extra_info[i];
896
      column_format= (enum column_format_type)
897
                    ((tmp >> COLUMN_FORMAT_SHIFT) & COLUMN_FORMAT_MASK);
898
    }
899
    if (new_frm_ver >= 3)
900
    {
901
      /* new frm file in 4.1 */
902
      field_length= uint2korr(strpos+3);
903
      recpos=	    uint3korr(strpos+5);
904
      pack_flag=    uint2korr(strpos+8);
905
      unireg_type=  (uint) strpos[10];
906
      interval_nr=  (uint) strpos[12];
907
      uint comment_length=uint2korr(strpos+15);
908
      field_type=(enum_field_types) (uint) strpos[13];
909
910
      {
911
        if (!strpos[14])
912
          charset= &my_charset_bin;
913
        else if (!(charset=get_charset((uint) strpos[14], MYF(0))))
914
        {
915
          error= 5; // Unknown or unavailable charset
916
          errarg= (int) strpos[14];
917
          goto err;
918
        }
919
      }
920
      if (!comment_length)
921
      {
922
	comment.str= (char*) "";
923
	comment.length=0;
924
      }
925
      else
926
      {
927
	comment.str=    (char*) comment_pos;
928
	comment.length= comment_length;
929
	comment_pos+=   comment_length;
930
      }
931
    }
932
    else
933
    {
934
      field_length= (uint) strpos[3];
935
      recpos=	    uint2korr(strpos+4),
936
      pack_flag=    uint2korr(strpos+6);
937
      pack_flag&=   ~FIELDFLAG_NO_DEFAULT;     // Safety for old files
938
      unireg_type=  (uint) strpos[8];
939
      interval_nr=  (uint) strpos[10];
940
941
      /* old frm file */
942
      field_type= (enum_field_types) f_packtype(pack_flag);
943
      if (f_is_binary(pack_flag))
944
      {
945
        /*
946
          Try to choose the best 4.1 type:
947
          - for 4.0 "CHAR(N) BINARY" or "VARCHAR(N) BINARY" 
948
            try to find a binary collation for character set.
949
          - for other types (e.g. BLOB) just use my_charset_bin. 
950
        */
951
        if (!f_is_blob(pack_flag))
952
        {
953
          // 3.23 or 4.0 string
954
          if (!(charset= get_charset_by_csname(share->table_charset->csname,
955
                                               MY_CS_BINSORT, MYF(0))))
956
            charset= &my_charset_bin;
957
        }
958
        else
959
          charset= &my_charset_bin;
960
      }
961
      else
962
        charset= share->table_charset;
963
      bzero((char*) &comment, sizeof(comment));
964
    }
965
966
    if (interval_nr && charset->mbminlen > 1)
967
    {
968
      /* Unescape UCS2 intervals from HEX notation */
969
      TYPELIB *interval= share->intervals + interval_nr - 1;
970
      unhex_type2(interval);
971
    }
972
    
973
#ifndef TO_BE_DELETED_ON_PRODUCTION
974
    if (field_type == MYSQL_TYPE_NEWDECIMAL && !share->mysql_version)
975
    {
976
      /*
977
        Fix pack length of old decimal values from 5.0.3 -> 5.0.4
978
        The difference is that in the old version we stored precision
979
        in the .frm table while we now store the display_length
980
      */
981
      uint decimals= f_decimals(pack_flag);
982
      field_length= my_decimal_precision_to_length(field_length,
983
                                                   decimals,
984
                                                   f_is_dec(pack_flag) == 0);
985
      sql_print_error("Found incompatible DECIMAL field '%s' in %s; "
986
                      "Please do \"ALTER TABLE '%s' FORCE\" to fix it!",
987
                      share->fieldnames.type_names[i], share->table_name.str,
988
                      share->table_name.str);
989
      push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
990
                          ER_CRASHED_ON_USAGE,
991
                          "Found incompatible DECIMAL field '%s' in %s; "
992
                          "Please do \"ALTER TABLE '%s' FORCE\" to fix it!",
993
                          share->fieldnames.type_names[i],
994
                          share->table_name.str,
995
                          share->table_name.str);
996
      share->crashed= 1;                        // Marker for CHECK TABLE
997
    }
998
#endif
999
1000
    *field_ptr= reg_field=
1001
      make_field(share, record+recpos,
1002
		 (uint32) field_length,
1003
		 null_pos, null_bit_pos,
1004
		 pack_flag,
1005
		 field_type,
1006
		 charset,
1007
		 (Field::utype) MTYP_TYPENR(unireg_type),
1008
		 (interval_nr ?
1009
		  share->intervals+interval_nr-1 :
1010
		  (TYPELIB*) 0),
1011
		 share->fieldnames.type_names[i]);
1012
    if (!reg_field)				// Not supported field type
1013
    {
1014
      error= 4;
1015
      goto err;			/* purecov: inspected */
1016
    }
1017
1018
    reg_field->flags|= ((uint)column_format << COLUMN_FORMAT_FLAGS);
1019
    reg_field->field_index= i;
1020
    reg_field->comment=comment;
1021
    if (!(reg_field->flags & NOT_NULL_FLAG))
1022
    {
1023
      if (!(null_bit_pos= (null_bit_pos + 1) & 7))
1024
        null_pos++;
1025
    }
1026
    if (f_no_default(pack_flag))
1027
      reg_field->flags|= NO_DEFAULT_VALUE_FLAG;
1028
1029
    if (reg_field->unireg_check == Field::NEXT_NUMBER)
1030
      share->found_next_number_field= field_ptr;
1031
    if (share->timestamp_field == reg_field)
1032
      share->timestamp_field_offset= i;
1033
1034
    if (use_hash)
1035
      (void) my_hash_insert(&share->name_hash,
1036
                            (uchar*) field_ptr); // never fail
1037
  }
1038
  *field_ptr=0;					// End marker
1039
1040
  /* Fix key->name and key_part->field */
1041
  if (key_parts)
1042
  {
1043
    uint primary_key=(uint) (find_type((char*) primary_key_name,
1044
				       &share->keynames, 3) - 1);
1045
    longlong ha_option= handler_file->ha_table_flags();
1046
    keyinfo= share->key_info;
1047
    key_part= keyinfo->key_part;
1048
1049
    for (uint key=0 ; key < share->keys ; key++,keyinfo++)
1050
    {
1051
      uint usable_parts= 0;
1052
      keyinfo->name=(char*) share->keynames.type_names[key];
1053
1054
      if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME))
1055
      {
1056
	/*
1057
	  If the UNIQUE key doesn't have NULL columns and is not a part key
1058
	  declare this as a primary key.
1059
	*/
1060
	primary_key=key;
1061
	for (i=0 ; i < keyinfo->key_parts ;i++)
1062
	{
1063
	  uint fieldnr= key_part[i].fieldnr;
1064
	  if (!fieldnr ||
1065
	      share->field[fieldnr-1]->null_ptr ||
1066
	      share->field[fieldnr-1]->key_length() !=
1067
	      key_part[i].length)
1068
	  {
1069
	    primary_key=MAX_KEY;		// Can't be used
1070
	    break;
1071
	  }
1072
	}
1073
      }
1074
1075
      for (i=0 ; i < keyinfo->key_parts ; key_part++,i++)
1076
      {
1077
        Field *field;
1078
	if (new_field_pack_flag <= 1)
1079
	  key_part->fieldnr= (uint16) find_field(share->field,
1080
                                                 share->default_values,
1081
                                                 (uint) key_part->offset,
1082
                                                 (uint) key_part->length);
1083
	if (!key_part->fieldnr)
1084
        {
1085
          error= 4;                             // Wrong file
1086
          goto err;
1087
        }
1088
        field= key_part->field= share->field[key_part->fieldnr-1];
1089
        key_part->type= field->key_type();
1090
        if (field->null_ptr)
1091
        {
1092
          key_part->null_offset=(uint) ((uchar*) field->null_ptr -
1093
                                        share->default_values);
1094
          key_part->null_bit= field->null_bit;
1095
          key_part->store_length+=HA_KEY_NULL_LENGTH;
1096
          keyinfo->flags|=HA_NULL_PART_KEY;
1097
          keyinfo->extra_length+= HA_KEY_NULL_LENGTH;
1098
          keyinfo->key_length+= HA_KEY_NULL_LENGTH;
1099
        }
1100
        if (field->type() == MYSQL_TYPE_BLOB ||
1101
            field->real_type() == MYSQL_TYPE_VARCHAR)
1102
        {
1103
          if (field->type() == MYSQL_TYPE_BLOB)
1104
            key_part->key_part_flag|= HA_BLOB_PART;
1105
          else
1106
            key_part->key_part_flag|= HA_VAR_LENGTH_PART;
1107
          keyinfo->extra_length+=HA_KEY_BLOB_LENGTH;
1108
          key_part->store_length+=HA_KEY_BLOB_LENGTH;
1109
          keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
1110
        }
1111
        if (i == 0 && key != primary_key)
1112
          field->flags |= (((keyinfo->flags & HA_NOSAME) &&
1113
                           (keyinfo->key_parts == 1)) ?
1114
                           UNIQUE_KEY_FLAG : MULTIPLE_KEY_FLAG);
1115
        if (i == 0)
1116
          field->key_start.set_bit(key);
1117
        if (field->key_length() == key_part->length &&
1118
            !(field->flags & BLOB_FLAG))
1119
        {
1120
          if (handler_file->index_flags(key, i, 0) & HA_KEYREAD_ONLY)
1121
          {
1122
            share->keys_for_keyread.set_bit(key);
1123
            field->part_of_key.set_bit(key);
1124
            field->part_of_key_not_clustered.set_bit(key);
1125
          }
1126
          if (handler_file->index_flags(key, i, 1) & HA_READ_ORDER)
1127
            field->part_of_sortkey.set_bit(key);
1128
        }
1129
        if (!(key_part->key_part_flag & HA_REVERSE_SORT) &&
1130
            usable_parts == i)
1131
          usable_parts++;			// For FILESORT
1132
        field->flags|= PART_KEY_FLAG;
1133
        if (key == primary_key)
1134
        {
1135
          field->flags|= PRI_KEY_FLAG;
1136
          /*
1137
            If this field is part of the primary key and all keys contains
1138
            the primary key, then we can use any key to find this column
1139
          */
1140
          if (ha_option & HA_PRIMARY_KEY_IN_READ_INDEX)
1141
          {
1142
            field->part_of_key= share->keys_in_use;
1143
            if (field->part_of_sortkey.is_set(key))
1144
              field->part_of_sortkey= share->keys_in_use;
1145
          }
1146
        }
1147
        if (field->key_length() != key_part->length)
1148
        {
1149
#ifndef TO_BE_DELETED_ON_PRODUCTION
1150
          if (field->type() == MYSQL_TYPE_NEWDECIMAL)
1151
          {
1152
            /*
1153
              Fix a fatal error in decimal key handling that causes crashes
1154
              on Innodb. We fix it by reducing the key length so that
1155
              InnoDB never gets a too big key when searching.
1156
              This allows the end user to do an ALTER TABLE to fix the
1157
              error.
1158
            */
1159
            keyinfo->key_length-= (key_part->length - field->key_length());
1160
            key_part->store_length-= (uint16)(key_part->length -
1161
                                              field->key_length());
1162
            key_part->length= (uint16)field->key_length();
1163
            sql_print_error("Found wrong key definition in %s; "
1164
                            "Please do \"ALTER TABLE '%s' FORCE \" to fix it!",
1165
                            share->table_name.str,
1166
                            share->table_name.str);
1167
            push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
1168
                                ER_CRASHED_ON_USAGE,
1169
                                "Found wrong key definition in %s; "
1170
                                "Please do \"ALTER TABLE '%s' FORCE\" to fix "
1171
                                "it!",
1172
                                share->table_name.str,
1173
                                share->table_name.str);
1174
            share->crashed= 1;                // Marker for CHECK TABLE
1175
            continue;
1176
          }
1177
#endif
1178
          key_part->key_part_flag|= HA_PART_KEY_SEG;
1179
        }
1180
      }
1181
      keyinfo->usable_key_parts= usable_parts; // Filesort
1182
1183
      set_if_bigger(share->max_key_length,keyinfo->key_length+
1184
                    keyinfo->key_parts);
1185
      share->total_key_length+= keyinfo->key_length;
1186
      /*
1187
        MERGE tables do not have unique indexes. But every key could be
1188
        an unique index on the underlying MyISAM table. (Bug #10400)
1189
      */
1190
      if ((keyinfo->flags & HA_NOSAME) ||
1191
          (ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE))
1192
        set_if_bigger(share->max_unique_length,keyinfo->key_length);
1193
    }
1194
    if (primary_key < MAX_KEY &&
1195
	(share->keys_in_use.is_set(primary_key)))
1196
    {
1197
      share->primary_key= primary_key;
1198
      /*
1199
	If we are using an integer as the primary key then allow the user to
1200
	refer to it as '_rowid'
1201
      */
1202
      if (share->key_info[primary_key].key_parts == 1)
1203
      {
1204
	Field *field= share->key_info[primary_key].key_part[0].field;
1205
	if (field && field->result_type() == INT_RESULT)
1206
        {
1207
          /* note that fieldnr here (and rowid_field_offset) starts from 1 */
1208
	  share->rowid_field_offset= (share->key_info[primary_key].key_part[0].
1209
                                      fieldnr);
1210
        }
1211
      }
1212
    }
1213
    else
1214
      share->primary_key = MAX_KEY; // we do not have a primary key
1215
  }
1216
  else
1217
    share->primary_key= MAX_KEY;
1218
  x_free((uchar*) disk_buff);
1219
  disk_buff=0;
1220
  if (new_field_pack_flag <= 1)
1221
  {
1222
    /* Old file format with default as not null */
1223
    uint null_length= (share->null_fields+7)/8;
1224
    bfill(share->default_values + (null_flags - (uchar*) record),
1225
          null_length, 255);
1226
  }
1227
1228
  if (share->found_next_number_field)
1229
  {
1230
    reg_field= *share->found_next_number_field;
1231
    if ((int) (share->next_number_index= (uint)
1232
	       find_ref_key(share->key_info, share->keys,
1233
                            share->default_values, reg_field,
1234
			    &share->next_number_key_offset,
1235
                            &share->next_number_keypart)) < 0)
1236
    {
1237
      /* Wrong field definition */
1238
      error= 4;
1239
      goto err;
1240
    }
1241
    else
1242
      reg_field->flags |= AUTO_INCREMENT_FLAG;
1243
  }
1244
1245
  if (share->blob_fields)
1246
  {
1247
    Field **ptr;
1248
    uint k, *save;
1249
1250
    /* Store offsets to blob fields to find them fast */
1251
    if (!(share->blob_field= save=
1252
	  (uint*) alloc_root(&share->mem_root,
1253
                             (uint) (share->blob_fields* sizeof(uint)))))
1254
      goto err;
1255
    for (k=0, ptr= share->field ; *ptr ; ptr++, k++)
1256
    {
1257
      if ((*ptr)->flags & BLOB_FLAG)
1258
	(*save++)= k;
1259
    }
1260
  }
1261
1262
  /*
1263
    the correct null_bytes can now be set, since bitfields have been taken
1264
    into account
1265
  */
1266
  share->null_bytes= (null_pos - (uchar*) null_flags +
1267
                      (null_bit_pos + 7) / 8);
1268
  share->last_null_bit_pos= null_bit_pos;
1269
1270
  share->db_low_byte_first= handler_file->low_byte_first();
1271
  share->column_bitmap_size= bitmap_buffer_size(share->fields);
1272
1273
  if (!(bitmaps= (my_bitmap_map*) alloc_root(&share->mem_root,
1274
                                             share->column_bitmap_size)))
1275
    goto err;
1276
  bitmap_init(&share->all_set, bitmaps, share->fields, FALSE);
1277
  bitmap_set_all(&share->all_set);
1278
1279
  delete handler_file;
1280
#ifndef DBUG_OFF
1281
  if (use_hash)
1282
    (void) hash_check(&share->name_hash);
1283
#endif
1284
  if (buff)
1285
    my_free(buff, MYF(0));
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1286
  return (0);
1 by brian
clean slate
1287
1288
 err:
1289
  if (buff)
1290
    my_free(buff, MYF(0));
1291
  share->error= error;
1292
  share->open_errno= my_errno;
1293
  share->errarg= errarg;
1294
  x_free((uchar*) disk_buff);
1295
  delete crypted;
1296
  delete handler_file;
1297
  hash_free(&share->name_hash);
1298
1299
  open_table_error(share, error, share->open_errno, errarg);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1300
  return(error);
1 by brian
clean slate
1301
} /* open_binary_frm */
1302
1303
1304
/*
1305
  Open a table based on a TABLE_SHARE
1306
1307
  SYNOPSIS
1308
    open_table_from_share()
1309
    thd			Thread handler
1310
    share		Table definition
1311
    alias       	Alias for table
1312
    db_stat		open flags (for example HA_OPEN_KEYFILE|
1313
    			HA_OPEN_RNDFILE..) can be 0 (example in
1314
                        ha_example_table)
1315
    prgflag   		READ_ALL etc..
1316
    ha_open_flags	HA_OPEN_ABORT_IF_LOCKED etc..
1317
    outparam       	result table
1318
    open_mode           One of OTM_OPEN|OTM_CREATE|OTM_ALTER
1319
                        if OTM_CREATE some errors are ignore
1320
                        if OTM_ALTER HA_OPEN is not called
1321
1322
  RETURN VALUES
1323
   0	ok
1324
   1	Error (see open_table_error)
1325
   2    Error (see open_table_error)
1326
   3    Wrong data in .frm file
1327
   4    Error (see open_table_error)
1328
   5    Error (see open_table_error: charset unavailable)
1329
   7    Table definition has changed in engine
1330
*/
1331
1332
int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
1333
                          uint db_stat, uint prgflag, uint ha_open_flags,
1334
                          TABLE *outparam, open_table_mode open_mode)
1335
{
1336
  int error;
1337
  uint records, i, bitmap_size;
1338
  bool error_reported= FALSE;
1339
  uchar *record, *bitmaps;
1340
  Field **field_ptr;
1341
1342
  /* Parsing of partitioning information from .frm needs thd->lex set up. */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
1343
  assert(thd->lex->is_lex_started);
1 by brian
clean slate
1344
1345
  error= 1;
1346
  bzero((char*) outparam, sizeof(*outparam));
1347
  outparam->in_use= thd;
1348
  outparam->s= share;
1349
  outparam->db_stat= db_stat;
1350
  outparam->write_row_record= NULL;
1351
1352
  init_sql_alloc(&outparam->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
1353
1354
  if (!(outparam->alias= my_strdup(alias, MYF(MY_WME))))
1355
    goto err;
1356
  outparam->quick_keys.init();
1357
  outparam->covering_keys.init();
1358
  outparam->keys_in_use_for_query.init();
1359
1360
  /* Allocate handler */
1361
  outparam->file= 0;
1362
  if (!(prgflag & OPEN_FRM_FILE_ONLY))
1363
  {
1364
    if (!(outparam->file= get_new_handler(share, &outparam->mem_root,
1365
                                          share->db_type())))
1366
      goto err;
1367
  }
1368
  else
1369
  {
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
1370
    assert(!db_stat);
1 by brian
clean slate
1371
  }
1372
1373
  error= 4;
1374
  outparam->reginfo.lock_type= TL_UNLOCK;
1375
  outparam->current_lock= F_UNLCK;
1376
  records=0;
1377
  if ((db_stat & HA_OPEN_KEYFILE) || (prgflag & DELAYED_OPEN))
1378
    records=1;
1379
  if (prgflag & (READ_ALL+EXTRA_RECORD))
1380
    records++;
1381
1382
  if (!(record= (uchar*) alloc_root(&outparam->mem_root,
1383
                                   share->rec_buff_length * records)))
1384
    goto err;                                   /* purecov: inspected */
1385
1386
  if (records == 0)
1387
  {
1388
    /* We are probably in hard repair, and the buffers should not be used */
1389
    outparam->record[0]= outparam->record[1]= share->default_values;
1390
  }
1391
  else
1392
  {
1393
    outparam->record[0]= record;
1394
    if (records > 1)
1395
      outparam->record[1]= record+ share->rec_buff_length;
1396
    else
1397
      outparam->record[1]= outparam->record[0];   // Safety
1398
  }
1399
1400
#ifdef HAVE_purify
1401
  /*
1402
    We need this because when we read var-length rows, we are not updating
1403
    bytes after end of varchar
1404
  */
1405
  if (records > 1)
1406
  {
1407
    memcpy(outparam->record[0], share->default_values, share->rec_buff_length);
1408
    memcpy(outparam->record[1], share->default_values, share->null_bytes);
1409
    if (records > 2)
1410
      memcpy(outparam->record[1], share->default_values,
1411
             share->rec_buff_length);
1412
  }
1413
#endif
1414
1415
  if (!(field_ptr = (Field **) alloc_root(&outparam->mem_root,
1416
                                          (uint) ((share->fields+1)*
1417
                                                  sizeof(Field*)))))
1418
    goto err;                                   /* purecov: inspected */
1419
1420
  outparam->field= field_ptr;
1421
1422
  record= (uchar*) outparam->record[0]-1;	/* Fieldstart = 1 */
1423
  if (share->null_field_first)
1424
    outparam->null_flags= (uchar*) record+1;
1425
  else
1426
    outparam->null_flags= (uchar*) (record+ 1+ share->reclength -
1427
                                    share->null_bytes);
1428
1429
  /* Setup copy of fields from share, but use the right alias and record */
1430
  for (i=0 ; i < share->fields; i++, field_ptr++)
1431
  {
1432
    if (!((*field_ptr)= share->field[i]->clone(&outparam->mem_root, outparam)))
1433
      goto err;
1434
  }
1435
  (*field_ptr)= 0;                              // End marker
1436
1437
  if (share->found_next_number_field)
1438
    outparam->found_next_number_field=
1439
      outparam->field[(uint) (share->found_next_number_field - share->field)];
1440
  if (share->timestamp_field)
1441
    outparam->timestamp_field= (Field_timestamp*) outparam->field[share->timestamp_field_offset];
1442
1443
1444
  /* Fix key->name and key_part->field */
1445
  if (share->key_parts)
1446
  {
1447
    KEY	*key_info, *key_info_end;
1448
    KEY_PART_INFO *key_part;
1449
    uint n_length;
1450
    n_length= share->keys*sizeof(KEY) + share->key_parts*sizeof(KEY_PART_INFO);
1451
    if (!(key_info= (KEY*) alloc_root(&outparam->mem_root, n_length)))
1452
      goto err;
1453
    outparam->key_info= key_info;
1454
    key_part= (my_reinterpret_cast(KEY_PART_INFO*) (key_info+share->keys));
1455
    
1456
    memcpy(key_info, share->key_info, sizeof(*key_info)*share->keys);
1457
    memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) *
1458
                                                   share->key_parts));
1459
1460
    for (key_info_end= key_info + share->keys ;
1461
         key_info < key_info_end ;
1462
         key_info++)
1463
    {
1464
      KEY_PART_INFO *key_part_end;
1465
1466
      key_info->table= outparam;
1467
      key_info->key_part= key_part;
1468
1469
      for (key_part_end= key_part+ key_info->key_parts ;
1470
           key_part < key_part_end ;
1471
           key_part++)
1472
      {
1473
        Field *field= key_part->field= outparam->field[key_part->fieldnr-1];
1474
1475
        if (field->key_length() != key_part->length &&
1476
            !(field->flags & BLOB_FLAG))
1477
        {
1478
          /*
1479
            We are using only a prefix of the column as a key:
1480
            Create a new field for the key part that matches the index
1481
          */
1482
          field= key_part->field=field->new_field(&outparam->mem_root,
1483
                                                  outparam, 0);
1484
          field->field_length= key_part->length;
1485
        }
1486
      }
1487
    }
1488
  }
1489
1490
  /* Allocate bitmaps */
1491
1492
  bitmap_size= share->column_bitmap_size;
1493
  if (!(bitmaps= (uchar*) alloc_root(&outparam->mem_root, bitmap_size*3)))
1494
    goto err;
1495
  bitmap_init(&outparam->def_read_set,
1496
              (my_bitmap_map*) bitmaps, share->fields, FALSE);
1497
  bitmap_init(&outparam->def_write_set,
1498
              (my_bitmap_map*) (bitmaps+bitmap_size), share->fields, FALSE);
1499
  bitmap_init(&outparam->tmp_set,
1500
              (my_bitmap_map*) (bitmaps+bitmap_size*2), share->fields, FALSE);
1501
  outparam->default_column_bitmaps();
1502
1503
  /* The table struct is now initialized;  Open the table */
1504
  error= 2;
1505
  if (db_stat && open_mode != OTM_ALTER)
1506
  {
1507
    int ha_err;
1508
    if ((ha_err= (outparam->file->
1509
                  ha_open(outparam, share->normalized_path.str,
1510
                          (db_stat & HA_READ_ONLY ? O_RDONLY : O_RDWR),
1511
                          (db_stat & HA_OPEN_TEMPORARY ? HA_OPEN_TMP_TABLE :
1512
                           ((db_stat & HA_WAIT_IF_LOCKED) ||
1513
                            (specialflag & SPECIAL_WAIT_IF_LOCKED)) ?
1514
                           HA_OPEN_WAIT_IF_LOCKED :
1515
                           (db_stat & (HA_ABORT_IF_LOCKED | HA_GET_INFO)) ?
1516
                          HA_OPEN_ABORT_IF_LOCKED :
1517
                           HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
1518
    {
1519
      /* Set a flag if the table is crashed and it can be auto. repaired */
1520
      share->crashed= ((ha_err == HA_ERR_CRASHED_ON_USAGE) &&
1521
                       outparam->file->auto_repair() &&
1522
                       !(ha_open_flags & HA_OPEN_FOR_REPAIR));
1523
1524
      switch (ha_err)
1525
      {
1526
        case HA_ERR_NO_SUCH_TABLE:
1527
	  /*
1528
            The table did not exists in storage engine, use same error message
1529
            as if the .frm file didn't exist
1530
          */
1531
	  error= 1;
1532
	  my_errno= ENOENT;
1533
          break;
1534
        case EMFILE:
1535
	  /*
1536
            Too many files opened, use same error message as if the .frm
1537
            file can't open
1538
           */
1539
	  error= 1;
1540
	  my_errno= EMFILE;
1541
          break;
1542
        default:
1543
          outparam->file->print_error(ha_err, MYF(0));
1544
          error_reported= TRUE;
1545
          if (ha_err == HA_ERR_TABLE_DEF_CHANGED)
1546
            error= 7;
1547
          break;
1548
      }
1549
      goto err;                                 /* purecov: inspected */
1550
    }
1551
  }
1552
1553
#if defined(HAVE_purify) && !defined(DBUG_OFF)
1554
  bzero((char*) bitmaps, bitmap_size*3);
1555
#endif
1556
1557
  outparam->no_replicate= outparam->file &&
1558
                          test(outparam->file->ha_table_flags() &
1559
                               HA_HAS_OWN_BINLOGGING);
1560
  thd->status_var.opened_tables++;
1561
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1562
  return (0);
1 by brian
clean slate
1563
1564
 err:
1565
  if (!error_reported && !(prgflag & DONT_GIVE_ERROR))
1566
    open_table_error(share, error, my_errno, 0);
1567
  delete outparam->file;
1568
  outparam->file= 0;				// For easier error checking
1569
  outparam->db_stat=0;
1570
  free_root(&outparam->mem_root, MYF(0));       // Safe to call on bzero'd root
1571
  my_free((char*) outparam->alias, MYF(MY_ALLOW_ZERO_PTR));
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1572
  return (error);
1 by brian
clean slate
1573
}
1574
1575
1576
/*
1577
  Free information allocated by openfrm
1578
1579
  SYNOPSIS
1580
    closefrm()
1581
    table		TABLE object to free
1582
    free_share		Is 1 if we also want to free table_share
1583
*/
1584
1585
int closefrm(register TABLE *table, bool free_share)
1586
{
1587
  int error=0;
1588
1589
  if (table->db_stat)
1590
    error=table->file->close();
1591
  my_free((char*) table->alias, MYF(MY_ALLOW_ZERO_PTR));
1592
  table->alias= 0;
1593
  if (table->field)
1594
  {
1595
    for (Field **ptr=table->field ; *ptr ; ptr++)
1596
      delete *ptr;
1597
    table->field= 0;
1598
  }
1599
  delete table->file;
1600
  table->file= 0;				/* For easier errorchecking */
1601
  if (free_share)
1602
  {
1603
    if (table->s->tmp_table == NO_TMP_TABLE)
1604
      release_table_share(table->s, RELEASE_NORMAL);
1605
    else
1606
      free_table_share(table->s);
1607
  }
1608
  free_root(&table->mem_root, MYF(0));
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1609
  return(error);
1 by brian
clean slate
1610
}
1611
1612
1613
/* Deallocate temporary blob storage */
1614
1615
void free_blobs(register TABLE *table)
1616
{
1617
  uint *ptr, *end;
1618
  for (ptr= table->s->blob_field, end=ptr + table->s->blob_fields ;
1619
       ptr != end ;
1620
       ptr++)
1621
    ((Field_blob*) table->field[*ptr])->free();
1622
}
1623
1624
1625
	/* Find where a form starts */
1626
	/* if formname is NullS then only formnames is read */
1627
1628
ulong get_form_pos(File file, uchar *head, TYPELIB *save_names)
1629
{
1630
  uint a_length,names,length;
1631
  uchar *pos,*buf;
1632
  ulong ret_value=0;
1633
1634
  names=uint2korr(head+8);
1635
  a_length=(names+2)*sizeof(char *);		/* Room for two extra */
1636
1637
  if (!save_names)
1638
    a_length=0;
1639
  else
1640
    save_names->type_names=0;			/* Clear if error */
1641
1642
  if (names)
1643
  {
1644
    length=uint2korr(head+4);
1645
    VOID(my_seek(file,64L,MY_SEEK_SET,MYF(0)));
1646
    if (!(buf= (uchar*) my_malloc((size_t) length+a_length+names*4,
1647
				  MYF(MY_WME))) ||
1648
	my_read(file, buf+a_length, (size_t) (length+names*4),
1649
		MYF(MY_NABP)))
1650
    {						/* purecov: inspected */
1651
      x_free((uchar*) buf);			/* purecov: inspected */
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1652
      return(0L);				/* purecov: inspected */
1 by brian
clean slate
1653
    }
1654
    pos= buf+a_length+length;
1655
    ret_value=uint4korr(pos);
1656
  }
1657
  if (! save_names)
1658
  {
1659
    if (names)
1660
      my_free((uchar*) buf,MYF(0));
1661
  }
1662
  else if (!names)
1663
    bzero((char*) save_names,sizeof(save_names));
1664
  else
1665
  {
1666
    char *str;
1667
    str=(char *) (buf+a_length);
1668
    fix_type_pointers((const char ***) &buf,save_names,1,&str);
1669
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1670
  return(ret_value);
1 by brian
clean slate
1671
}
1672
1673
1674
/*
1675
  Read string from a file with malloc
1676
1677
  NOTES:
1678
    We add an \0 at end of the read string to make reading of C strings easier
1679
*/
1680
1681
int read_string(File file, uchar**to, size_t length)
1682
{
1683
1684
  x_free(*to);
1685
  if (!(*to= (uchar*) my_malloc(length+1,MYF(MY_WME))) ||
1686
      my_read(file, *to, length,MYF(MY_NABP)))
1687
  {
1688
    x_free(*to);                              /* purecov: inspected */
1689
    *to= 0;                                   /* purecov: inspected */
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1690
    return(1);                           /* purecov: inspected */
1 by brian
clean slate
1691
  }
1692
  *((char*) *to+length)= '\0';
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1693
  return (0);
1 by brian
clean slate
1694
} /* read_string */
1695
1696
1697
	/* Add a new form to a form file */
1698
1699
ulong make_new_entry(File file, uchar *fileinfo, TYPELIB *formnames,
1700
		     const char *newname)
1701
{
1702
  uint i,bufflength,maxlength,n_length,length,names;
1703
  ulong endpos,newpos;
1704
  uchar buff[IO_SIZE];
1705
  uchar *pos;
1706
1707
  length=(uint) strlen(newname)+1;
1708
  n_length=uint2korr(fileinfo+4);
1709
  maxlength=uint2korr(fileinfo+6);
1710
  names=uint2korr(fileinfo+8);
1711
  newpos=uint4korr(fileinfo+10);
1712
1713
  if (64+length+n_length+(names+1)*4 > maxlength)
1714
  {						/* Expand file */
1715
    newpos+=IO_SIZE;
1716
    int4store(fileinfo+10,newpos);
1717
    endpos=(ulong) my_seek(file,0L,MY_SEEK_END,MYF(0));/* Copy from file-end */
1718
    bufflength= (uint) (endpos & (IO_SIZE-1));	/* IO_SIZE is a power of 2 */
1719
1720
    while (endpos > maxlength)
1721
    {
1722
      VOID(my_seek(file,(ulong) (endpos-bufflength),MY_SEEK_SET,MYF(0)));
1723
      if (my_read(file, buff, bufflength, MYF(MY_NABP+MY_WME)))
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1724
	return(0L);
1 by brian
clean slate
1725
      VOID(my_seek(file,(ulong) (endpos-bufflength+IO_SIZE),MY_SEEK_SET,
1726
		   MYF(0)));
1727
      if ((my_write(file, buff,bufflength,MYF(MY_NABP+MY_WME))))
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1728
	return(0);
1 by brian
clean slate
1729
      endpos-=bufflength; bufflength=IO_SIZE;
1730
    }
1731
    bzero(buff,IO_SIZE);			/* Null new block */
1732
    VOID(my_seek(file,(ulong) maxlength,MY_SEEK_SET,MYF(0)));
1733
    if (my_write(file,buff,bufflength,MYF(MY_NABP+MY_WME)))
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1734
	return(0L);
1 by brian
clean slate
1735
    maxlength+=IO_SIZE;				/* Fix old ref */
1736
    int2store(fileinfo+6,maxlength);
1737
    for (i=names, pos= (uchar*) *formnames->type_names+n_length-1; i-- ;
1738
	 pos+=4)
1739
    {
1740
      endpos=uint4korr(pos)+IO_SIZE;
1741
      int4store(pos,endpos);
1742
    }
1743
  }
1744
1745
  if (n_length == 1 )
1746
  {						/* First name */
1747
    length++;
1748
    VOID(strxmov((char*) buff,"/",newname,"/",NullS));
1749
  }
1750
  else
1751
    VOID(strxmov((char*) buff,newname,"/",NullS)); /* purecov: inspected */
1752
  VOID(my_seek(file,63L+(ulong) n_length,MY_SEEK_SET,MYF(0)));
1753
  if (my_write(file, buff, (size_t) length+1,MYF(MY_NABP+MY_WME)) ||
1754
      (names && my_write(file,(uchar*) (*formnames->type_names+n_length-1),
1755
			 names*4, MYF(MY_NABP+MY_WME))) ||
1756
      my_write(file, fileinfo+10, 4,MYF(MY_NABP+MY_WME)))
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1757
    return(0L); /* purecov: inspected */
1 by brian
clean slate
1758
1759
  int2store(fileinfo+8,names+1);
1760
  int2store(fileinfo+4,n_length+length);
30 by Brian Aker
Large file and ftruncate() support
1761
  (void)ftruncate(file, newpos);/* Append file with '\0' */
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1762
  return(newpos);
1 by brian
clean slate
1763
} /* make_new_entry */
1764
1765
1766
	/* error message when opening a form file */
1767
1768
void open_table_error(TABLE_SHARE *share, int error, int db_errno, int errarg)
1769
{
1770
  int err_no;
1771
  char buff[FN_REFLEN];
1772
  myf errortype= ME_ERROR+ME_WAITTANG;
1773
1774
  switch (error) {
1775
  case 7:
1776
  case 1:
1777
    if (db_errno == ENOENT)
1778
      my_error(ER_NO_SUCH_TABLE, MYF(0), share->db.str, share->table_name.str);
1779
    else
1780
    {
1781
      strxmov(buff, share->normalized_path.str, reg_ext, NullS);
1782
      my_error((db_errno == EMFILE) ? ER_CANT_OPEN_FILE : ER_FILE_NOT_FOUND,
1783
               errortype, buff, db_errno);
1784
    }
1785
    break;
1786
  case 2:
1787
  {
1788
    handler *file= 0;
1789
    const char *datext= "";
1790
    
1791
    if (share->db_type() != NULL)
1792
    {
1793
      if ((file= get_new_handler(share, current_thd->mem_root,
1794
                                 share->db_type())))
1795
      {
1796
        if (!(datext= *file->bas_ext()))
1797
          datext= "";
1798
      }
1799
    }
1800
    err_no= (db_errno == ENOENT) ? ER_FILE_NOT_FOUND : (db_errno == EAGAIN) ?
1801
      ER_FILE_USED : ER_CANT_OPEN_FILE;
1802
    strxmov(buff, share->normalized_path.str, datext, NullS);
1803
    my_error(err_no,errortype, buff, db_errno);
1804
    delete file;
1805
    break;
1806
  }
1807
  case 5:
1808
  {
1809
    const char *csname= get_charset_name((uint) errarg);
1810
    char tmp[10];
1811
    if (!csname || csname[0] =='?')
1812
    {
77.1.18 by Monty Taylor
Removed my_vsnprintf and my_snprintf.
1813
      snprintf(tmp, sizeof(tmp), "#%d", errarg);
1 by brian
clean slate
1814
      csname= tmp;
1815
    }
1816
    my_printf_error(ER_UNKNOWN_COLLATION,
1817
                    "Unknown collation '%s' in table '%-.64s' definition", 
1818
                    MYF(0), csname, share->table_name.str);
1819
    break;
1820
  }
1821
  case 6:
1822
    strxmov(buff, share->normalized_path.str, reg_ext, NullS);
1823
    my_printf_error(ER_NOT_FORM_FILE,
1824
                    "Table '%-.64s' was created with a different version "
1825
                    "of MySQL and cannot be read", 
1826
                    MYF(0), buff);
1827
    break;
1828
  case 8:
1829
    break;
1830
  default:				/* Better wrong error than none */
1831
  case 4:
1832
    strxmov(buff, share->normalized_path.str, reg_ext, NullS);
1833
    my_error(ER_NOT_FORM_FILE, errortype, buff, 0);
1834
    break;
1835
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
1836
  return;
1 by brian
clean slate
1837
} /* open_table_error */
1838
1839
1840
	/*
1841
	** fix a str_type to a array type
1842
	** typeparts separated with some char. differents types are separated
1843
	** with a '\0'
1844
	*/
1845
1846
static void
1847
fix_type_pointers(const char ***array, TYPELIB *point_to_type, uint types,
1848
		  char **names)
1849
{
1850
  char *type_name, *ptr;
1851
  char chr;
1852
1853
  ptr= *names;
1854
  while (types--)
1855
  {
1856
    point_to_type->name=0;
1857
    point_to_type->type_names= *array;
1858
1859
    if ((chr= *ptr))			/* Test if empty type */
1860
    {
1861
      while ((type_name=strchr(ptr+1,chr)) != NullS)
1862
      {
1863
	*((*array)++) = ptr+1;
1864
	*type_name= '\0';		/* End string */
1865
	ptr=type_name;
1866
      }
1867
      ptr+=2;				/* Skip end mark and last 0 */
1868
    }
1869
    else
1870
      ptr++;
1871
    point_to_type->count= (uint) (*array - point_to_type->type_names);
1872
    point_to_type++;
1873
    *((*array)++)= NullS;		/* End of type */
1874
  }
1875
  *names=ptr;				/* Update end */
1876
  return;
1877
} /* fix_type_pointers */
1878
1879
1880
TYPELIB *typelib(MEM_ROOT *mem_root, List<String> &strings)
1881
{
1882
  TYPELIB *result= (TYPELIB*) alloc_root(mem_root, sizeof(TYPELIB));
1883
  if (!result)
1884
    return 0;
1885
  result->count=strings.elements;
1886
  result->name="";
1887
  uint nbytes= (sizeof(char*) + sizeof(uint)) * (result->count + 1);
1888
  if (!(result->type_names= (const char**) alloc_root(mem_root, nbytes)))
1889
    return 0;
1890
  result->type_lengths= (uint*) (result->type_names + result->count + 1);
1891
  List_iterator<String> it(strings);
1892
  String *tmp;
1893
  for (uint i=0; (tmp=it++) ; i++)
1894
  {
1895
    result->type_names[i]= tmp->ptr();
1896
    result->type_lengths[i]= tmp->length();
1897
  }
1898
  result->type_names[result->count]= 0;		// End marker
1899
  result->type_lengths[result->count]= 0;
1900
  return result;
1901
}
1902
1903
1904
/*
1905
 Search after a field with given start & length
1906
 If an exact field isn't found, return longest field with starts
1907
 at right position.
1908
 
1909
 NOTES
1910
   This is needed because in some .frm fields 'fieldnr' was saved wrong
1911
1912
 RETURN
1913
   0  error
1914
   #  field number +1
1915
*/
1916
1917
static uint find_field(Field **fields, uchar *record, uint start, uint length)
1918
{
1919
  Field **field;
1920
  uint i, pos;
1921
1922
  pos= 0;
1923
  for (field= fields, i=1 ; *field ; i++,field++)
1924
  {
1925
    if ((*field)->offset(record) == start)
1926
    {
1927
      if ((*field)->key_length() == length)
1928
	return (i);
1929
      if (!pos || fields[pos-1]->pack_length() <
1930
	  (*field)->pack_length())
1931
	pos= i;
1932
    }
1933
  }
1934
  return (pos);
1935
}
1936
1937
1938
	/* Check that the integer is in the internal */
1939
1940
int set_zone(register int nr, int min_zone, int max_zone)
1941
{
1942
  if (nr<=min_zone)
1943
    return (min_zone);
1944
  if (nr>=max_zone)
1945
    return (max_zone);
1946
  return (nr);
1947
} /* set_zone */
1948
1949
	/* Adjust number to next larger disk buffer */
1950
1951
ulong next_io_size(register ulong pos)
1952
{
1953
  register ulong offset;
1954
  if ((offset= pos & (IO_SIZE-1)))
1955
    return pos-offset+IO_SIZE;
1956
  return pos;
1957
} /* next_io_size */
1958
1959
1960
/*
1961
  Store an SQL quoted string.
1962
1963
  SYNOPSIS  
1964
    append_unescaped()
1965
    res		result String
1966
    pos		string to be quoted
1967
    length	it's length
1968
1969
  NOTE
1970
    This function works correctly with utf8 or single-byte charset strings.
1971
    May fail with some multibyte charsets though.
1972
*/
1973
1974
void append_unescaped(String *res, const char *pos, uint length)
1975
{
1976
  const char *end= pos+length;
1977
  res->append('\'');
1978
1979
  for (; pos != end ; pos++)
1980
  {
1981
#if defined(USE_MB) && MYSQL_VERSION_ID < 40100
1982
    uint mblen;
1983
    if (use_mb(default_charset_info) &&
1984
        (mblen= my_ismbchar(default_charset_info, pos, end)))
1985
    {
1986
      res->append(pos, mblen);
1987
      pos+= mblen;
1988
      continue;
1989
    }
1990
#endif
1991
1992
    switch (*pos) {
1993
    case 0:				/* Must be escaped for 'mysql' */
1994
      res->append('\\');
1995
      res->append('0');
1996
      break;
1997
    case '\n':				/* Must be escaped for logs */
1998
      res->append('\\');
1999
      res->append('n');
2000
      break;
2001
    case '\r':
2002
      res->append('\\');		/* This gives better readability */
2003
      res->append('r');
2004
      break;
2005
    case '\\':
2006
      res->append('\\');		/* Because of the sql syntax */
2007
      res->append('\\');
2008
      break;
2009
    case '\'':
2010
      res->append('\'');		/* Because of the sql syntax */
2011
      res->append('\'');
2012
      break;
2013
    default:
2014
      res->append(*pos);
2015
      break;
2016
    }
2017
  }
2018
  res->append('\'');
2019
}
2020
2021
2022
	/* Create a .frm file */
2023
2024
File create_frm(THD *thd, const char *name, const char *db,
2025
                const char *table, uint reclength, uchar *fileinfo,
2026
  		HA_CREATE_INFO *create_info, uint keys, KEY *key_info)
2027
{
2028
  register File file;
2029
  ulong length;
2030
  uchar fill[IO_SIZE];
2031
  int create_flags= O_RDWR | O_TRUNC;
2032
  ulong key_comment_total_bytes= 0;
2033
  uint i;
2034
2035
  if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
2036
    create_flags|= O_EXCL | O_NOFOLLOW;
2037
2038
  /* Fix this when we have new .frm files;  Current limit is 4G rows (QQ) */
2039
  if (create_info->max_rows > UINT_MAX32)
2040
    create_info->max_rows= UINT_MAX32;
2041
  if (create_info->min_rows > UINT_MAX32)
2042
    create_info->min_rows= UINT_MAX32;
2043
2044
  if ((file= my_create(name, CREATE_MODE, create_flags, MYF(0))) >= 0)
2045
  {
2046
    uint key_length, tmp_key_length;
2047
    uint tmp;
2048
    bzero((char*) fileinfo,64);
2049
    /* header */
2050
    fileinfo[0]=(uchar) 254;
2051
    fileinfo[1]= 1;
2052
    fileinfo[2]= FRM_VER+3+ test(create_info->varchar);
2053
2054
    fileinfo[3]= (uchar) ha_legacy_type(
2055
          ha_checktype(thd,ha_legacy_type(create_info->db_type),0,0));
2056
    fileinfo[4]=1;
2057
    int2store(fileinfo+6,IO_SIZE);		/* Next block starts here */
2058
    for (i= 0; i < keys; i++)
2059
    {
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2060
      assert(test(key_info[i].flags & HA_USES_COMMENT) == 
1 by brian
clean slate
2061
                 (key_info[i].comment.length > 0));
2062
      if (key_info[i].flags & HA_USES_COMMENT)
2063
        key_comment_total_bytes += 2 + key_info[i].comment.length;
2064
    }
2065
    /*
2066
      Keep in sync with pack_keys() in unireg.cc
2067
      For each key:
2068
      8 bytes for the key header
2069
      9 bytes for each key-part (MAX_REF_PARTS)
2070
      NAME_LEN bytes for the name
2071
      1 byte for the NAMES_SEP_CHAR (before the name)
2072
      For all keys:
2073
      6 bytes for the header
2074
      1 byte for the NAMES_SEP_CHAR (after the last name)
2075
      9 extra bytes (padding for safety? alignment?)
2076
      comments
2077
    */
2078
    key_length= (keys * (8 + MAX_REF_PARTS * 9 + NAME_LEN + 1) + 16 +
2079
                 key_comment_total_bytes);
2080
    length= next_io_size((ulong) (IO_SIZE+key_length+reclength+
2081
                                  create_info->extra_size));
2082
    int4store(fileinfo+10,length);
2083
    tmp_key_length= (key_length < 0xffff) ? key_length : 0xffff;
2084
    int2store(fileinfo+14,tmp_key_length);
2085
    int2store(fileinfo+16,reclength);
2086
    int4store(fileinfo+18,create_info->max_rows);
2087
    int4store(fileinfo+22,create_info->min_rows);
2088
    /* fileinfo[26] is set in mysql_create_frm() */
2089
    fileinfo[27]=2;				// Use long pack-fields
2090
    /* fileinfo[28 & 29] is set to key_info_length in mysql_create_frm() */
2091
    create_info->table_options|=HA_OPTION_LONG_BLOB_PTR; // Use portable blob pointers
2092
    int2store(fileinfo+30,create_info->table_options);
2093
    fileinfo[32]=0;				// No filename anymore
2094
    fileinfo[33]=5;                             // Mark for 5.0 frm file
2095
    int4store(fileinfo+34,create_info->avg_row_length);
2096
    fileinfo[38]= (create_info->default_table_charset ?
2097
		   create_info->default_table_charset->number : 0);
2098
    fileinfo[39]= (uchar) ((uint) create_info->transactional |
2099
                           ((uint) create_info->page_checksum << 2));
2100
    fileinfo[40]= (uchar) create_info->row_type;
2101
    /* Next few bytes where for RAID support */
2102
    fileinfo[41]= 0;
2103
    fileinfo[42]= 0;
2104
    fileinfo[43]= 0;
2105
    fileinfo[44]= 0;
2106
    fileinfo[45]= 0;
2107
    fileinfo[46]= 0;
2108
    int4store(fileinfo+47, key_length);
2109
    tmp= MYSQL_VERSION_ID;          // Store to avoid warning from int4store
2110
    int4store(fileinfo+51, tmp);
2111
    int4store(fileinfo+55, create_info->extra_size);
2112
    /*
2113
      59-60 is reserved for extra_rec_buf_length,
2114
      61 for default_part_db_type
2115
    */
2116
    int2store(fileinfo+62, create_info->key_block_size);
2117
    bzero(fill,IO_SIZE);
2118
    for (; length > IO_SIZE ; length-= IO_SIZE)
2119
    {
2120
      if (my_write(file,fill, IO_SIZE, MYF(MY_WME | MY_NABP)))
2121
      {
2122
	VOID(my_close(file,MYF(0)));
2123
	VOID(my_delete(name,MYF(0)));
2124
	return(-1);
2125
      }
2126
    }
2127
  }
2128
  else
2129
  {
2130
    if (my_errno == ENOENT)
2131
      my_error(ER_BAD_DB_ERROR,MYF(0),db);
2132
    else
2133
      my_error(ER_CANT_CREATE_TABLE,MYF(0),table,my_errno);
2134
  }
2135
  return (file);
2136
} /* create_frm */
2137
2138
2139
void update_create_info_from_table(HA_CREATE_INFO *create_info, TABLE *table)
2140
{
2141
  TABLE_SHARE *share= table->s;
2142
2143
  create_info->max_rows= share->max_rows;
2144
  create_info->min_rows= share->min_rows;
2145
  create_info->table_options= share->db_create_options;
2146
  create_info->avg_row_length= share->avg_row_length;
2147
  create_info->row_type= share->row_type;
2148
  create_info->default_table_charset= share->table_charset;
2149
  create_info->table_charset= 0;
2150
  create_info->comment= share->comment;
2151
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2152
  return;
1 by brian
clean slate
2153
}
2154
2155
int
2156
rename_file_ext(const char * from,const char * to,const char * ext)
2157
{
2158
  char from_b[FN_REFLEN],to_b[FN_REFLEN];
2159
  VOID(strxmov(from_b,from,ext,NullS));
2160
  VOID(strxmov(to_b,to,ext,NullS));
2161
  return (my_rename(from_b,to_b,MYF(MY_WME)));
2162
}
2163
2164
2165
/*
2166
  Allocate string field in MEM_ROOT and return it as String
2167
2168
  SYNOPSIS
2169
    get_field()
2170
    mem   	MEM_ROOT for allocating
2171
    field 	Field for retrieving of string
2172
    res         result String
2173
2174
  RETURN VALUES
2175
    1   string is empty
2176
    0	all ok
2177
*/
2178
2179
bool get_field(MEM_ROOT *mem, Field *field, String *res)
2180
{
2181
  char buff[MAX_FIELD_WIDTH], *to;
2182
  String str(buff,sizeof(buff),&my_charset_bin);
2183
  uint length;
2184
2185
  field->val_str(&str);
2186
  if (!(length= str.length()))
2187
  {
2188
    res->length(0);
2189
    return 1;
2190
  }
2191
  if (!(to= strmake_root(mem, str.ptr(), length)))
2192
    length= 0;                                  // Safety fix
2193
  res->set(to, length, ((Field_str*)field)->charset());
2194
  return 0;
2195
}
2196
2197
2198
/*
2199
  Allocate string field in MEM_ROOT and return it as NULL-terminated string
2200
2201
  SYNOPSIS
2202
    get_field()
2203
    mem   	MEM_ROOT for allocating
2204
    field 	Field for retrieving of string
2205
2206
  RETURN VALUES
2207
    NullS  string is empty
2208
    #      pointer to NULL-terminated string value of field
2209
*/
2210
2211
char *get_field(MEM_ROOT *mem, Field *field)
2212
{
2213
  char buff[MAX_FIELD_WIDTH], *to;
2214
  String str(buff,sizeof(buff),&my_charset_bin);
2215
  uint length;
2216
2217
  field->val_str(&str);
2218
  length= str.length();
2219
  if (!length || !(to= (char*) alloc_root(mem,length+1)))
2220
    return NullS;
2221
  memcpy(to,str.ptr(),(uint) length);
2222
  to[length]=0;
2223
  return to;
2224
}
2225
2226
/*
2227
  DESCRIPTION
2228
    given a buffer with a key value, and a map of keyparts
2229
    that are present in this value, returns the length of the value
2230
*/
77.1.45 by Monty Taylor
Warning fixes.
2231
uint calculate_key_len(TABLE *table, uint key,
2232
                       const uchar *buf __attribute__((__unused__)),
1 by brian
clean slate
2233
                       key_part_map keypart_map)
2234
{
2235
  /* works only with key prefixes */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2236
  assert(((keypart_map + 1) & keypart_map) == 0);
1 by brian
clean slate
2237
2238
  KEY *key_info= table->s->key_info+key;
2239
  KEY_PART_INFO *key_part= key_info->key_part;
2240
  KEY_PART_INFO *end_key_part= key_part + key_info->key_parts;
2241
  uint length= 0;
2242
2243
  while (key_part < end_key_part && keypart_map)
2244
  {
2245
    length+= key_part->store_length;
2246
    keypart_map >>= 1;
2247
    key_part++;
2248
  }
2249
  return length;
2250
}
2251
2252
/*
2253
  Check if database name is valid
2254
2255
  SYNPOSIS
2256
    check_db_name()
2257
    org_name		Name of database and length
2258
2259
  NOTES
2260
    If lower_case_table_names is set then database is converted to lower case
2261
2262
  RETURN
2263
    0	ok
2264
    1   error
2265
*/
2266
2267
bool check_db_name(LEX_STRING *org_name)
2268
{
2269
  char *name= org_name->str;
2270
  uint name_length= org_name->length;
2271
2272
  if (!name_length || name_length > NAME_LEN || name[name_length - 1] == ' ')
2273
    return 1;
2274
2275
  if (lower_case_table_names && name != any_db)
2276
    my_casedn_str(files_charset_info, name);
2277
2278
  return check_identifier_name(org_name);
2279
}
2280
2281
2282
/*
2283
  Allow anything as a table name, as long as it doesn't contain an
2284
  ' ' at the end
2285
  returns 1 on error
2286
*/
2287
2288
2289
bool check_table_name(const char *name, uint length)
2290
{
2291
  if (!length || length > NAME_LEN || name[length - 1] == ' ')
2292
    return 1;
2293
  LEX_STRING ident;
2294
  ident.str= (char*) name;
2295
  ident.length= length;
2296
  return check_identifier_name(&ident);
2297
}
2298
2299
2300
/*
2301
  Eventually, a "length" argument should be added
2302
  to this function, and the inner loop changed to
2303
  check_identifier_name() call.
2304
*/
2305
bool check_column_name(const char *name)
2306
{
2307
  uint name_length= 0;  // name length in symbols
2308
  bool last_char_is_space= TRUE;
2309
  
2310
  while (*name)
2311
  {
2312
#if defined(USE_MB) && defined(USE_MB_IDENT)
2313
    last_char_is_space= my_isspace(system_charset_info, *name);
2314
    if (use_mb(system_charset_info))
2315
    {
2316
      int len=my_ismbchar(system_charset_info, name, 
2317
                          name+system_charset_info->mbmaxlen);
2318
      if (len)
2319
      {
2320
        if (len > 3) /* Disallow non-BMP characters */
2321
          return 1;
2322
        name += len;
2323
        name_length++;
2324
        continue;
2325
      }
2326
    }
2327
#else
2328
    last_char_is_space= *name==' ';
2329
#endif
2330
    /*
2331
      NAMES_SEP_CHAR is used in FRM format to separate SET and ENUM values.
2332
      It is defined as 0xFF, which is a not valid byte in utf8.
2333
      This assert is to catch use of this byte if we decide to
2334
      use non-utf8 as system_character_set.
2335
    */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2336
    assert(*name != NAMES_SEP_CHAR);
1 by brian
clean slate
2337
    name++;
2338
    name_length++;
2339
  }
2340
  /* Error if empty or too long column name */
2341
  return last_char_is_space || (uint) name_length > NAME_CHAR_LEN;
2342
}
2343
2344
2345
/**
2346
  Checks whether a table is intact. Should be done *just* after the table has
2347
  been opened.
2348
2349
  @param[in] table             The table to check
2350
  @param[in] table_f_count     Expected number of columns in the table
2351
  @param[in] table_def         Expected structure of the table (column name
2352
                               and type)
2353
2354
  @retval  FALSE  OK
2355
  @retval  TRUE   There was an error. An error message is output
2356
                  to the error log.  We do not push an error
2357
                  message into the error stack because this
2358
                  function is currently only called at start up,
2359
                  and such errors never reach the user.
2360
*/
2361
2362
my_bool
2363
table_check_intact(TABLE *table, const uint table_f_count,
2364
                   const TABLE_FIELD_W_TYPE *table_def)
2365
{
2366
  uint i;
2367
  my_bool error= FALSE;
2368
  my_bool fields_diff_count;
2369
2370
  fields_diff_count= (table->s->fields != table_f_count);
2371
  if (fields_diff_count)
2372
  {
2373
2374
    /* previous MySQL version */
2375
    if (MYSQL_VERSION_ID > table->s->mysql_version)
2376
    {
2377
      sql_print_error(ER(ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE),
2378
                      table->alias, table_f_count, table->s->fields,
2379
                      table->s->mysql_version, MYSQL_VERSION_ID);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2380
      return(TRUE);
1 by brian
clean slate
2381
    }
2382
    else if (MYSQL_VERSION_ID == table->s->mysql_version)
2383
    {
2384
      sql_print_error(ER(ER_COL_COUNT_DOESNT_MATCH_CORRUPTED), table->alias,
2385
                      table_f_count, table->s->fields);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2386
      return(TRUE);
1 by brian
clean slate
2387
    }
2388
    /*
2389
      Something has definitely changed, but we're running an older
2390
      version of MySQL with new system tables.
2391
      Let's check column definitions. If a column was added at
2392
      the end of the table, then we don't care much since such change
2393
      is backward compatible.
2394
    */
2395
  }
2396
  char buffer[STRING_BUFFER_USUAL_SIZE];
2397
  for (i=0 ; i < table_f_count; i++, table_def++)
2398
  {
2399
    String sql_type(buffer, sizeof(buffer), system_charset_info);
2400
    sql_type.length(0);
2401
    if (i < table->s->fields)
2402
    {
2403
      Field *field= table->field[i];
2404
2405
      if (strncmp(field->field_name, table_def->name.str,
2406
                  table_def->name.length))
2407
      {
2408
        /*
2409
          Name changes are not fatal, we use ordinal numbers to access columns.
2410
          Still this can be a sign of a tampered table, output an error
2411
          to the error log.
2412
        */
2413
        sql_print_error("Incorrect definition of table %s.%s: "
2414
                        "expected column '%s' at position %d, found '%s'.",
2415
                        table->s->db.str, table->alias, table_def->name.str, i,
2416
                        field->field_name);
2417
      }
2418
      field->sql_type(sql_type);
2419
      /*
2420
        Generally, if column types don't match, then something is
2421
        wrong.
2422
2423
        However, we only compare column definitions up to the
2424
        length of the original definition, since we consider the
2425
        following definitions compatible:
2426
2427
        1. DATETIME and DATETIM
2428
        2. INT(11) and INT(11
2429
        3. SET('one', 'two') and SET('one', 'two', 'more')
2430
2431
        For SETs or ENUMs, if the same prefix is there it's OK to
2432
        add more elements - they will get higher ordinal numbers and
2433
        the new table definition is backward compatible with the
2434
        original one.
2435
       */
2436
      if (strncmp(sql_type.c_ptr_safe(), table_def->type.str,
2437
                  table_def->type.length - 1))
2438
      {
2439
        sql_print_error("Incorrect definition of table %s.%s: "
2440
                        "expected column '%s' at position %d to have type "
2441
                        "%s, found type %s.", table->s->db.str, table->alias,
2442
                        table_def->name.str, i, table_def->type.str,
2443
                        sql_type.c_ptr_safe());
2444
        error= TRUE;
2445
      }
2446
      else if (table_def->cset.str && !field->has_charset())
2447
      {
2448
        sql_print_error("Incorrect definition of table %s.%s: "
2449
                        "expected the type of column '%s' at position %d "
2450
                        "to have character set '%s' but the type has no "
2451
                        "character set.", table->s->db.str, table->alias,
2452
                        table_def->name.str, i, table_def->cset.str);
2453
        error= TRUE;
2454
      }
2455
      else if (table_def->cset.str &&
2456
               strcmp(field->charset()->csname, table_def->cset.str))
2457
      {
2458
        sql_print_error("Incorrect definition of table %s.%s: "
2459
                        "expected the type of column '%s' at position %d "
2460
                        "to have character set '%s' but found "
2461
                        "character set '%s'.", table->s->db.str, table->alias,
2462
                        table_def->name.str, i, table_def->cset.str,
2463
                        field->charset()->csname);
2464
        error= TRUE;
2465
      }
2466
    }
2467
    else
2468
    {
2469
      sql_print_error("Incorrect definition of table %s.%s: "
2470
                      "expected column '%s' at position %d to have type %s "
2471
                      " but the column is not found.",
2472
                      table->s->db.str, table->alias,
2473
                      table_def->name.str, i, table_def->type.str);
2474
      error= TRUE;
2475
    }
2476
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2477
  return(error);
1 by brian
clean slate
2478
}
2479
2480
2481
/*
2482
  Create Item_field for each column in the table.
2483
2484
  SYNPOSIS
2485
    st_table::fill_item_list()
2486
      item_list          a pointer to an empty list used to store items
2487
2488
  DESCRIPTION
2489
    Create Item_field object for each column in the table and
2490
    initialize it with the corresponding Field. New items are
2491
    created in the current THD memory root.
2492
2493
  RETURN VALUE
2494
    0                    success
2495
    1                    out of memory
2496
*/
2497
2498
bool st_table::fill_item_list(List<Item> *item_list) const
2499
{
2500
  /*
2501
    All Item_field's created using a direct pointer to a field
2502
    are fixed in Item_field constructor.
2503
  */
2504
  for (Field **ptr= field; *ptr; ptr++)
2505
  {
2506
    Item_field *item= new Item_field(*ptr);
2507
    if (!item || item_list->push_back(item))
2508
      return TRUE;
2509
  }
2510
  return FALSE;
2511
}
2512
2513
/*
2514
  Reset an existing list of Item_field items to point to the
2515
  Fields of this table.
2516
2517
  SYNPOSIS
2518
    st_table::fill_item_list()
2519
      item_list          a non-empty list with Item_fields
2520
2521
  DESCRIPTION
2522
    This is a counterpart of fill_item_list used to redirect
2523
    Item_fields to the fields of a newly created table.
2524
    The caller must ensure that number of items in the item_list
2525
    is the same as the number of columns in the table.
2526
*/
2527
2528
void st_table::reset_item_list(List<Item> *item_list) const
2529
{
2530
  List_iterator_fast<Item> it(*item_list);
2531
  for (Field **ptr= field; *ptr; ptr++)
2532
  {
2533
    Item_field *item_field= (Item_field*) it++;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2534
    assert(item_field != 0);
1 by brian
clean slate
2535
    item_field->reset_field(*ptr);
2536
  }
2537
}
2538
2539
2540
/*
2541
  Merge ON expressions for a view
2542
2543
  SYNOPSIS
2544
    merge_on_conds()
2545
    thd             thread handle
2546
    table           table for the VIEW
2547
    is_cascaded     TRUE <=> merge ON expressions from underlying views
2548
2549
  DESCRIPTION
2550
    This function returns the result of ANDing the ON expressions
2551
    of the given view and all underlying views. The ON expressions
2552
    of the underlying views are added only if is_cascaded is TRUE.
2553
2554
  RETURN
2555
    Pointer to the built expression if there is any.
2556
    Otherwise and in the case of a failure NULL is returned.
2557
*/
2558
2559
static Item *
2560
merge_on_conds(THD *thd, TABLE_LIST *table, bool is_cascaded)
2561
{
2562
2563
  Item *cond= NULL;
2564
  if (table->on_expr)
2565
    cond= table->on_expr->copy_andor_structure(thd);
2566
  if (!table->nested_join)
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2567
    return(cond);
1 by brian
clean slate
2568
  List_iterator<TABLE_LIST> li(table->nested_join->join_list);
2569
  while (TABLE_LIST *tbl= li++)
2570
  {
2571
    cond= and_conds(cond, merge_on_conds(thd, tbl, is_cascaded));
2572
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2573
  return(cond);
1 by brian
clean slate
2574
}
2575
2576
2577
/*
2578
  Find underlying base tables (TABLE_LIST) which represent given
2579
  table_to_find (TABLE)
2580
2581
  SYNOPSIS
2582
    TABLE_LIST::find_underlying_table()
2583
    table_to_find table to find
2584
2585
  RETURN
2586
    0  table is not found
2587
    found table reference
2588
*/
2589
2590
TABLE_LIST *TABLE_LIST::find_underlying_table(TABLE *table_to_find)
2591
{
2592
  /* is this real table and table which we are looking for? */
2593
  if (table == table_to_find && merge_underlying_list == 0)
2594
    return this;
2595
2596
  for (TABLE_LIST *tbl= merge_underlying_list; tbl; tbl= tbl->next_local)
2597
  {
2598
    TABLE_LIST *result;
2599
    if ((result= tbl->find_underlying_table(table_to_find)))
2600
      return result;
2601
  }
2602
  return 0;
2603
}
2604
2605
/*
2606
  cleunup items belonged to view fields translation table
2607
2608
  SYNOPSIS
2609
    TABLE_LIST::cleanup_items()
2610
*/
2611
2612
void TABLE_LIST::cleanup_items()
2613
{
2614
  if (!field_translation)
2615
    return;
2616
2617
  for (Field_translator *transl= field_translation;
2618
       transl < field_translation_end;
2619
       transl++)
2620
    transl->item->walk(&Item::cleanup_processor, 0, 0);
2621
}
2622
2623
2624
/*
2625
  Set insert_values buffer
2626
2627
  SYNOPSIS
2628
    set_insert_values()
2629
    mem_root   memory pool for allocating
2630
2631
  RETURN
2632
    FALSE - OK
2633
    TRUE  - out of memory
2634
*/
2635
2636
bool TABLE_LIST::set_insert_values(MEM_ROOT *mem_root)
2637
{
2638
  if (table)
2639
  {
2640
    if (!table->insert_values &&
2641
        !(table->insert_values= (uchar *)alloc_root(mem_root,
2642
                                                   table->s->rec_buff_length)))
2643
      return TRUE;
2644
  }
2645
2646
  return FALSE;
2647
}
2648
2649
2650
/*
2651
  Test if this is a leaf with respect to name resolution.
2652
2653
  SYNOPSIS
2654
    TABLE_LIST::is_leaf_for_name_resolution()
2655
2656
  DESCRIPTION
2657
    A table reference is a leaf with respect to name resolution if
2658
    it is either a leaf node in a nested join tree (table, view,
2659
    schema table, subquery), or an inner node that represents a
2660
    NATURAL/USING join, or a nested join with materialized join
2661
    columns.
2662
2663
  RETURN
2664
    TRUE if a leaf, FALSE otherwise.
2665
*/
2666
bool TABLE_LIST::is_leaf_for_name_resolution()
2667
{
2668
  return (is_natural_join || is_join_columns_complete || !nested_join);
2669
}
2670
2671
2672
/*
2673
  Retrieve the first (left-most) leaf in a nested join tree with
2674
  respect to name resolution.
2675
2676
  SYNOPSIS
2677
    TABLE_LIST::first_leaf_for_name_resolution()
2678
2679
  DESCRIPTION
2680
    Given that 'this' is a nested table reference, recursively walk
2681
    down the left-most children of 'this' until we reach a leaf
2682
    table reference with respect to name resolution.
2683
2684
  IMPLEMENTATION
2685
    The left-most child of a nested table reference is the last element
2686
    in the list of children because the children are inserted in
2687
    reverse order.
2688
2689
  RETURN
2690
    If 'this' is a nested table reference - the left-most child of
2691
      the tree rooted in 'this',
2692
    else return 'this'
2693
*/
2694
2695
TABLE_LIST *TABLE_LIST::first_leaf_for_name_resolution()
2696
{
2697
  TABLE_LIST *cur_table_ref;
2698
  NESTED_JOIN *cur_nested_join;
2699
2700
  if (is_leaf_for_name_resolution())
2701
    return this;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2702
  assert(nested_join);
1 by brian
clean slate
2703
2704
  for (cur_nested_join= nested_join;
2705
       cur_nested_join;
2706
       cur_nested_join= cur_table_ref->nested_join)
2707
  {
2708
    List_iterator_fast<TABLE_LIST> it(cur_nested_join->join_list);
2709
    cur_table_ref= it++;
2710
    /*
2711
      If the current nested join is a RIGHT JOIN, the operands in
2712
      'join_list' are in reverse order, thus the first operand is
2713
      already at the front of the list. Otherwise the first operand
2714
      is in the end of the list of join operands.
2715
    */
2716
    if (!(cur_table_ref->outer_join & JOIN_TYPE_RIGHT))
2717
    {
2718
      TABLE_LIST *next;
2719
      while ((next= it++))
2720
        cur_table_ref= next;
2721
    }
2722
    if (cur_table_ref->is_leaf_for_name_resolution())
2723
      break;
2724
  }
2725
  return cur_table_ref;
2726
}
2727
2728
2729
/*
2730
  Retrieve the last (right-most) leaf in a nested join tree with
2731
  respect to name resolution.
2732
2733
  SYNOPSIS
2734
    TABLE_LIST::last_leaf_for_name_resolution()
2735
2736
  DESCRIPTION
2737
    Given that 'this' is a nested table reference, recursively walk
2738
    down the right-most children of 'this' until we reach a leaf
2739
    table reference with respect to name resolution.
2740
2741
  IMPLEMENTATION
2742
    The right-most child of a nested table reference is the first
2743
    element in the list of children because the children are inserted
2744
    in reverse order.
2745
2746
  RETURN
2747
    - If 'this' is a nested table reference - the right-most child of
2748
      the tree rooted in 'this',
2749
    - else - 'this'
2750
*/
2751
2752
TABLE_LIST *TABLE_LIST::last_leaf_for_name_resolution()
2753
{
2754
  TABLE_LIST *cur_table_ref= this;
2755
  NESTED_JOIN *cur_nested_join;
2756
2757
  if (is_leaf_for_name_resolution())
2758
    return this;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2759
  assert(nested_join);
1 by brian
clean slate
2760
2761
  for (cur_nested_join= nested_join;
2762
       cur_nested_join;
2763
       cur_nested_join= cur_table_ref->nested_join)
2764
  {
2765
    cur_table_ref= cur_nested_join->join_list.head();
2766
    /*
2767
      If the current nested is a RIGHT JOIN, the operands in
2768
      'join_list' are in reverse order, thus the last operand is in the
2769
      end of the list.
2770
    */
2771
    if ((cur_table_ref->outer_join & JOIN_TYPE_RIGHT))
2772
    {
2773
      List_iterator_fast<TABLE_LIST> it(cur_nested_join->join_list);
2774
      TABLE_LIST *next;
2775
      cur_table_ref= it++;
2776
      while ((next= it++))
2777
        cur_table_ref= next;
2778
    }
2779
    if (cur_table_ref->is_leaf_for_name_resolution())
2780
      break;
2781
  }
2782
  return cur_table_ref;
2783
}
2784
2785
2786
Natural_join_column::Natural_join_column(Field_translator *field_param,
2787
                                         TABLE_LIST *tab)
2788
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2789
  assert(tab->field_translation);
1 by brian
clean slate
2790
  view_field= field_param;
2791
  table_field= NULL;
2792
  table_ref= tab;
2793
  is_common= FALSE;
2794
}
2795
2796
2797
Natural_join_column::Natural_join_column(Field *field_param,
2798
                                         TABLE_LIST *tab)
2799
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2800
  assert(tab->table == field_param->table);
1 by brian
clean slate
2801
  table_field= field_param;
2802
  view_field= NULL;
2803
  table_ref= tab;
2804
  is_common= FALSE;
2805
}
2806
2807
2808
const char *Natural_join_column::name()
2809
{
2810
  if (view_field)
2811
  {
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2812
    assert(table_field == NULL);
1 by brian
clean slate
2813
    return view_field->name;
2814
  }
2815
2816
  return table_field->field_name;
2817
}
2818
2819
2820
Item *Natural_join_column::create_item(THD *thd)
2821
{
2822
  if (view_field)
2823
  {
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2824
    assert(table_field == NULL);
1 by brian
clean slate
2825
    return create_view_field(thd, table_ref, &view_field->item,
2826
                             view_field->name);
2827
  }
2828
  return new Item_field(thd, &thd->lex->current_select->context, table_field);
2829
}
2830
2831
2832
Field *Natural_join_column::field()
2833
{
2834
  if (view_field)
2835
  {
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2836
    assert(table_field == NULL);
1 by brian
clean slate
2837
    return NULL;
2838
  }
2839
  return table_field;
2840
}
2841
2842
2843
const char *Natural_join_column::table_name()
2844
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2845
  assert(table_ref);
1 by brian
clean slate
2846
  return table_ref->alias;
2847
}
2848
2849
2850
const char *Natural_join_column::db_name()
2851
{
2852
  /*
2853
    Test that TABLE_LIST::db is the same as st_table_share::db to
2854
    ensure consistency. An exception are I_S schema tables, which
2855
    are inconsistent in this respect.
2856
  */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2857
  assert(!strcmp(table_ref->db,
1 by brian
clean slate
2858
                      table_ref->table->s->db.str) ||
2859
              (table_ref->schema_table &&
2860
               table_ref->table->s->db.str[0] == 0));
2861
  return table_ref->db;
2862
}
2863
2864
2865
void Field_iterator_view::set(TABLE_LIST *table)
2866
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2867
  assert(table->field_translation);
1 by brian
clean slate
2868
  view= table;
2869
  ptr= table->field_translation;
2870
  array_end= table->field_translation_end;
2871
}
2872
2873
2874
const char *Field_iterator_table::name()
2875
{
2876
  return (*ptr)->field_name;
2877
}
2878
2879
2880
Item *Field_iterator_table::create_item(THD *thd)
2881
{
2882
  SELECT_LEX *select= thd->lex->current_select;
2883
2884
  Item_field *item= new Item_field(thd, &select->context, *ptr);
2885
  if (item && thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY &&
2886
      !thd->lex->in_sum_func && select->cur_pos_in_select_list != UNDEF_POS)
2887
  {
2888
    select->non_agg_fields.push_back(item);
2889
    item->marker= select->cur_pos_in_select_list;
2890
  }
2891
  return item;
2892
}
2893
2894
2895
const char *Field_iterator_view::name()
2896
{
2897
  return ptr->name;
2898
}
2899
2900
2901
Item *Field_iterator_view::create_item(THD *thd)
2902
{
2903
  return create_view_field(thd, view, &ptr->item, ptr->name);
2904
}
2905
77.1.45 by Monty Taylor
Warning fixes.
2906
Item *create_view_field(THD *thd __attribute__((__unused__)),
2907
                        TABLE_LIST *view, Item **field_ref,
2908
                        const char *name __attribute__((__unused__)))
1 by brian
clean slate
2909
{
2910
  if (view->schema_table_reformed)
2911
  {
2912
    Item *field= *field_ref;
2913
2914
    /*
2915
      Translation table items are always Item_fields and already fixed
2916
      ('mysql_schema_table' function). So we can return directly the
2917
      field. This case happens only for 'show & where' commands.
2918
    */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2919
    assert(field && field->fixed);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2920
    return(field);
1 by brian
clean slate
2921
  }
2922
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2923
  return(NULL);
1 by brian
clean slate
2924
}
2925
2926
2927
void Field_iterator_natural_join::set(TABLE_LIST *table_ref)
2928
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2929
  assert(table_ref->join_columns);
1 by brian
clean slate
2930
  column_ref_it.init(*(table_ref->join_columns));
2931
  cur_column_ref= column_ref_it++;
2932
}
2933
2934
2935
void Field_iterator_natural_join::next()
2936
{
2937
  cur_column_ref= column_ref_it++;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2938
  assert(!cur_column_ref || ! cur_column_ref->table_field ||
1 by brian
clean slate
2939
              cur_column_ref->table_ref->table ==
2940
              cur_column_ref->table_field->table);
2941
}
2942
2943
2944
void Field_iterator_table_ref::set_field_iterator()
2945
{
2946
  /*
2947
    If the table reference we are iterating over is a natural join, or it is
2948
    an operand of a natural join, and TABLE_LIST::join_columns contains all
2949
    the columns of the join operand, then we pick the columns from
2950
    TABLE_LIST::join_columns, instead of the  orginial container of the
2951
    columns of the join operator.
2952
  */
2953
  if (table_ref->is_join_columns_complete)
2954
  {
2955
    /* Necesary, but insufficient conditions. */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2956
    assert(table_ref->is_natural_join ||
1 by brian
clean slate
2957
                table_ref->nested_join ||
2958
                table_ref->join_columns &&
2959
                /* This is a merge view. */
2960
                ((table_ref->field_translation &&
2961
                  table_ref->join_columns->elements ==
2962
                  (ulong)(table_ref->field_translation_end -
2963
                          table_ref->field_translation)) ||
2964
                 /* This is stored table or a tmptable view. */
2965
                 (!table_ref->field_translation &&
2966
                  table_ref->join_columns->elements ==
2967
                  table_ref->table->s->fields)));
2968
    field_it= &natural_join_it;
2969
  }
2970
  /* This is a base table or stored view. */
2971
  else
2972
  {
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2973
    assert(table_ref->table);
1 by brian
clean slate
2974
    field_it= &table_field_it;
2975
  }
2976
  field_it->set(table_ref);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
2977
  return;
1 by brian
clean slate
2978
}
2979
2980
2981
void Field_iterator_table_ref::set(TABLE_LIST *table)
2982
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2983
  assert(table);
1 by brian
clean slate
2984
  first_leaf= table->first_leaf_for_name_resolution();
2985
  last_leaf=  table->last_leaf_for_name_resolution();
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
2986
  assert(first_leaf && last_leaf);
1 by brian
clean slate
2987
  table_ref= first_leaf;
2988
  set_field_iterator();
2989
}
2990
2991
2992
void Field_iterator_table_ref::next()
2993
{
2994
  /* Move to the next field in the current table reference. */
2995
  field_it->next();
2996
  /*
2997
    If all fields of the current table reference are exhausted, move to
2998
    the next leaf table reference.
2999
  */
3000
  if (field_it->end_of_fields() && table_ref != last_leaf)
3001
  {
3002
    table_ref= table_ref->next_name_resolution_table;
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3003
    assert(table_ref);
1 by brian
clean slate
3004
    set_field_iterator();
3005
  }
3006
}
3007
3008
3009
const char *Field_iterator_table_ref::table_name()
3010
{
3011
  if (table_ref->is_natural_join)
3012
    return natural_join_it.column_ref()->table_name();
3013
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3014
  assert(!strcmp(table_ref->table_name,
1 by brian
clean slate
3015
                      table_ref->table->s->table_name.str));
3016
  return table_ref->table_name;
3017
}
3018
3019
3020
const char *Field_iterator_table_ref::db_name()
3021
{
3022
  if (table_ref->is_natural_join)
3023
    return natural_join_it.column_ref()->db_name();
3024
3025
  /*
3026
    Test that TABLE_LIST::db is the same as st_table_share::db to
3027
    ensure consistency. An exception are I_S schema tables, which
3028
    are inconsistent in this respect.
3029
  */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3030
  assert(!strcmp(table_ref->db, table_ref->table->s->db.str) ||
1 by brian
clean slate
3031
              (table_ref->schema_table &&
3032
               table_ref->table->s->db.str[0] == 0));
3033
3034
  return table_ref->db;
3035
}
3036
3037
3038
/*
3039
  Create new or return existing column reference to a column of a
3040
  natural/using join.
3041
3042
  SYNOPSIS
3043
    Field_iterator_table_ref::get_or_create_column_ref()
3044
    parent_table_ref  the parent table reference over which the
3045
                      iterator is iterating
3046
3047
  DESCRIPTION
3048
    Create a new natural join column for the current field of the
3049
    iterator if no such column was created, or return an already
3050
    created natural join column. The former happens for base tables or
3051
    views, and the latter for natural/using joins. If a new field is
3052
    created, then the field is added to 'parent_table_ref' if it is
3053
    given, or to the original table referene of the field if
3054
    parent_table_ref == NULL.
3055
3056
  NOTES
3057
    This method is designed so that when a Field_iterator_table_ref
3058
    walks through the fields of a table reference, all its fields
3059
    are created and stored as follows:
3060
    - If the table reference being iterated is a stored table, view or
3061
      natural/using join, store all natural join columns in a list
3062
      attached to that table reference.
3063
    - If the table reference being iterated is a nested join that is
3064
      not natural/using join, then do not materialize its result
3065
      fields. This is OK because for such table references
3066
      Field_iterator_table_ref iterates over the fields of the nested
3067
      table references (recursively). In this way we avoid the storage
3068
      of unnecessay copies of result columns of nested joins.
3069
3070
  RETURN
3071
    #     Pointer to a column of a natural join (or its operand)
3072
    NULL  No memory to allocate the column
3073
*/
3074
3075
Natural_join_column *
3076
Field_iterator_table_ref::get_or_create_column_ref(TABLE_LIST *parent_table_ref)
3077
{
3078
  Natural_join_column *nj_col;
3079
  bool is_created= TRUE;
3080
  uint field_count;
3081
  TABLE_LIST *add_table_ref= parent_table_ref ?
3082
                             parent_table_ref : table_ref;
3083
3084
  if (field_it == &table_field_it)
3085
  {
3086
    /* The field belongs to a stored table. */
3087
    Field *tmp_field= table_field_it.field();
3088
    nj_col= new Natural_join_column(tmp_field, table_ref);
3089
    field_count= table_ref->table->s->fields;
3090
  }
3091
  else if (field_it == &view_field_it)
3092
  {
3093
    /* The field belongs to a merge view or information schema table. */
3094
    Field_translator *translated_field= view_field_it.field_translator();
3095
    nj_col= new Natural_join_column(translated_field, table_ref);
3096
    field_count= table_ref->field_translation_end -
3097
                 table_ref->field_translation;
3098
  }
3099
  else
3100
  {
3101
    /*
3102
      The field belongs to a NATURAL join, therefore the column reference was
3103
      already created via one of the two constructor calls above. In this case
3104
      we just return the already created column reference.
3105
    */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3106
    assert(table_ref->is_join_columns_complete);
1 by brian
clean slate
3107
    is_created= FALSE;
3108
    nj_col= natural_join_it.column_ref();
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3109
    assert(nj_col);
1 by brian
clean slate
3110
  }
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3111
  assert(!nj_col->table_field ||
1 by brian
clean slate
3112
              nj_col->table_ref->table == nj_col->table_field->table);
3113
3114
  /*
3115
    If the natural join column was just created add it to the list of
3116
    natural join columns of either 'parent_table_ref' or to the table
3117
    reference that directly contains the original field.
3118
  */
3119
  if (is_created)
3120
  {
3121
    /* Make sure not all columns were materialized. */
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3122
    assert(!add_table_ref->is_join_columns_complete);
1 by brian
clean slate
3123
    if (!add_table_ref->join_columns)
3124
    {
3125
      /* Create a list of natural join columns on demand. */
3126
      if (!(add_table_ref->join_columns= new List<Natural_join_column>))
3127
        return NULL;
3128
      add_table_ref->is_join_columns_complete= FALSE;
3129
    }
3130
    add_table_ref->join_columns->push_back(nj_col);
3131
    /*
3132
      If new fields are added to their original table reference, mark if
3133
      all fields were added. We do it here as the caller has no easy way
3134
      of knowing when to do it.
3135
      If the fields are being added to parent_table_ref, then the caller
3136
      must take care to mark when all fields are created/added.
3137
    */
3138
    if (!parent_table_ref &&
3139
        add_table_ref->join_columns->elements == field_count)
3140
      add_table_ref->is_join_columns_complete= TRUE;
3141
  }
3142
3143
  return nj_col;
3144
}
3145
3146
3147
/*
3148
  Return an existing reference to a column of a natural/using join.
3149
3150
  SYNOPSIS
3151
    Field_iterator_table_ref::get_natural_column_ref()
3152
3153
  DESCRIPTION
3154
    The method should be called in contexts where it is expected that
3155
    all natural join columns are already created, and that the column
3156
    being retrieved is a Natural_join_column.
3157
3158
  RETURN
3159
    #     Pointer to a column of a natural join (or its operand)
3160
    NULL  No memory to allocate the column
3161
*/
3162
3163
Natural_join_column *
3164
Field_iterator_table_ref::get_natural_column_ref()
3165
{
3166
  Natural_join_column *nj_col;
3167
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3168
  assert(field_it == &natural_join_it);
1 by brian
clean slate
3169
  /*
3170
    The field belongs to a NATURAL join, therefore the column reference was
3171
    already created via one of the two constructor calls above. In this case
3172
    we just return the already created column reference.
3173
  */
3174
  nj_col= natural_join_it.column_ref();
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3175
  assert(nj_col &&
1 by brian
clean slate
3176
              (!nj_col->table_field ||
3177
               nj_col->table_ref->table == nj_col->table_field->table));
3178
  return nj_col;
3179
}
3180
3181
/*****************************************************************************
3182
  Functions to handle column usage bitmaps (read_set, write_set etc...)
3183
*****************************************************************************/
3184
3185
/* Reset all columns bitmaps */
3186
3187
void st_table::clear_column_bitmaps()
3188
{
3189
  /*
3190
    Reset column read/write usage. It's identical to:
3191
    bitmap_clear_all(&table->def_read_set);
3192
    bitmap_clear_all(&table->def_write_set);
3193
  */
3194
  bzero((char*) def_read_set.bitmap, s->column_bitmap_size*2);
3195
  column_bitmaps_set(&def_read_set, &def_write_set);
3196
}
3197
3198
3199
/*
3200
  Tell handler we are going to call position() and rnd_pos() later.
3201
  
3202
  NOTES:
3203
  This is needed for handlers that uses the primary key to find the
3204
  row. In this case we have to extend the read bitmap with the primary
3205
  key fields.
3206
*/
3207
3208
void st_table::prepare_for_position()
3209
{
3210
3211
  if ((file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) &&
3212
      s->primary_key < MAX_KEY)
3213
  {
3214
    mark_columns_used_by_index_no_reset(s->primary_key, read_set);
3215
    /* signal change */
3216
    file->column_bitmaps_signal();
3217
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3218
  return;
1 by brian
clean slate
3219
}
3220
3221
3222
/*
3223
  Mark that only fields from one key is used
3224
3225
  NOTE:
3226
    This changes the bitmap to use the tmp bitmap
3227
    After this, you can't access any other columns in the table until
3228
    bitmaps are reset, for example with st_table::clear_column_bitmaps()
3229
    or st_table::restore_column_maps_after_mark_index()
3230
*/
3231
3232
void st_table::mark_columns_used_by_index(uint index)
3233
{
3234
  MY_BITMAP *bitmap= &tmp_set;
3235
3236
  (void) file->extra(HA_EXTRA_KEYREAD);
3237
  bitmap_clear_all(bitmap);
3238
  mark_columns_used_by_index_no_reset(index, bitmap);
3239
  column_bitmaps_set(bitmap, bitmap);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3240
  return;
1 by brian
clean slate
3241
}
3242
3243
3244
/*
3245
  Restore to use normal column maps after key read
3246
3247
  NOTES
3248
    This reverse the change done by mark_columns_used_by_index
3249
3250
  WARNING
3251
    For this to work, one must have the normal table maps in place
3252
    when calling mark_columns_used_by_index
3253
*/
3254
3255
void st_table::restore_column_maps_after_mark_index()
3256
{
3257
3258
  key_read= 0;
3259
  (void) file->extra(HA_EXTRA_NO_KEYREAD);
3260
  default_column_bitmaps();
3261
  file->column_bitmaps_signal();
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3262
  return;
1 by brian
clean slate
3263
}
3264
3265
3266
/*
3267
  mark columns used by key, but don't reset other fields
3268
*/
3269
3270
void st_table::mark_columns_used_by_index_no_reset(uint index,
3271
                                                   MY_BITMAP *bitmap)
3272
{
3273
  KEY_PART_INFO *key_part= key_info[index].key_part;
3274
  KEY_PART_INFO *key_part_end= (key_part +
3275
                                key_info[index].key_parts);
3276
  for (;key_part != key_part_end; key_part++)
3277
    bitmap_set_bit(bitmap, key_part->fieldnr-1);
3278
}
3279
3280
3281
/*
3282
  Mark auto-increment fields as used fields in both read and write maps
3283
3284
  NOTES
3285
    This is needed in insert & update as the auto-increment field is
3286
    always set and sometimes read.
3287
*/
3288
3289
void st_table::mark_auto_increment_column()
3290
{
51.2.1 by Patrick Galbraith
Removed DBUG_PRINTs, DBUG_ASSERTs, DBUG_EXECUTE_IFs from
3291
  assert(found_next_number_field);
1 by brian
clean slate
3292
  /*
3293
    We must set bit in read set as update_auto_increment() is using the
3294
    store() to check overflow of auto_increment values
3295
  */
3296
  bitmap_set_bit(read_set, found_next_number_field->field_index);
3297
  bitmap_set_bit(write_set, found_next_number_field->field_index);
3298
  if (s->next_number_keypart)
3299
    mark_columns_used_by_index_no_reset(s->next_number_index, read_set);
3300
  file->column_bitmaps_signal();
3301
}
3302
3303
3304
/*
3305
  Mark columns needed for doing an delete of a row
3306
3307
  DESCRIPTON
3308
    Some table engines don't have a cursor on the retrieve rows
3309
    so they need either to use the primary key or all columns to
3310
    be able to delete a row.
3311
3312
    If the engine needs this, the function works as follows:
3313
    - If primary key exits, mark the primary key columns to be read.
3314
    - If not, mark all columns to be read
3315
3316
    If the engine has HA_REQUIRES_KEY_COLUMNS_FOR_DELETE, we will
3317
    mark all key columns as 'to-be-read'. This allows the engine to
3318
    loop over the given record to find all keys and doesn't have to
3319
    retrieve the row again.
3320
*/
3321
3322
void st_table::mark_columns_needed_for_delete()
3323
{
3324
  if (file->ha_table_flags() & HA_REQUIRES_KEY_COLUMNS_FOR_DELETE)
3325
  {
3326
    Field **reg_field;
3327
    for (reg_field= field ; *reg_field ; reg_field++)
3328
    {
3329
      if ((*reg_field)->flags & PART_KEY_FLAG)
3330
        bitmap_set_bit(read_set, (*reg_field)->field_index);
3331
    }
3332
    file->column_bitmaps_signal();
3333
  }
3334
  if (file->ha_table_flags() & HA_PRIMARY_KEY_REQUIRED_FOR_DELETE ||
3335
      (mysql_bin_log.is_open() && in_use && in_use->current_stmt_binlog_row_based))
3336
  {
3337
    /*
3338
      If the handler has no cursor capabilites, or we have row-based
3339
      replication active for the current statement, we have to read
3340
      either the primary key, the hidden primary key or all columns to
3341
      be able to do an delete
3342
    */
3343
    if (s->primary_key == MAX_KEY)
3344
      file->use_hidden_primary_key();
3345
    else
3346
    {
3347
      mark_columns_used_by_index_no_reset(s->primary_key, read_set);
3348
      file->column_bitmaps_signal();
3349
    }
3350
  }
3351
}
3352
3353
3354
/*
3355
  Mark columns needed for doing an update of a row
3356
3357
  DESCRIPTON
3358
    Some engines needs to have all columns in an update (to be able to
3359
    build a complete row). If this is the case, we mark all not
3360
    updated columns to be read.
3361
3362
    If this is no the case, we do like in the delete case and mark
3363
    if neeed, either the primary key column or all columns to be read.
3364
    (see mark_columns_needed_for_delete() for details)
3365
3366
    If the engine has HA_REQUIRES_KEY_COLUMNS_FOR_DELETE, we will
3367
    mark all USED key columns as 'to-be-read'. This allows the engine to
3368
    loop over the given record to find all changed keys and doesn't have to
3369
    retrieve the row again.
3370
*/
3371
3372
void st_table::mark_columns_needed_for_update()
3373
{
3374
  if (file->ha_table_flags() & HA_REQUIRES_KEY_COLUMNS_FOR_DELETE)
3375
  {
3376
    /* Mark all used key columns for read */
3377
    Field **reg_field;
3378
    for (reg_field= field ; *reg_field ; reg_field++)
3379
    {
3380
      /* Merge keys is all keys that had a column refered to in the query */
3381
      if (merge_keys.is_overlapping((*reg_field)->part_of_key))
3382
        bitmap_set_bit(read_set, (*reg_field)->field_index);
3383
    }
3384
    file->column_bitmaps_signal();
3385
  }
3386
  if ((file->ha_table_flags() & HA_PRIMARY_KEY_REQUIRED_FOR_DELETE) ||
3387
      (mysql_bin_log.is_open() && in_use && in_use->current_stmt_binlog_row_based))
3388
  {
3389
    /*
3390
      If the handler has no cursor capabilites, or we have row-based
3391
      logging active for the current statement, we have to read either
3392
      the primary key, the hidden primary key or all columns to be
3393
      able to do an update
3394
    */
3395
    if (s->primary_key == MAX_KEY)
3396
      file->use_hidden_primary_key();
3397
    else
3398
    {
3399
      mark_columns_used_by_index_no_reset(s->primary_key, read_set);
3400
      file->column_bitmaps_signal();
3401
    }
3402
  }
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3403
  return;
1 by brian
clean slate
3404
}
3405
3406
3407
/*
3408
  Mark columns the handler needs for doing an insert
3409
3410
  For now, this is used to mark fields used by the trigger
3411
  as changed.
3412
*/
3413
3414
void st_table::mark_columns_needed_for_insert()
3415
{
3416
  if (found_next_number_field)
3417
    mark_auto_increment_column();
3418
}
3419
3420
/*
3421
  Cleanup this table for re-execution.
3422
3423
  SYNOPSIS
3424
    TABLE_LIST::reinit_before_use()
3425
*/
3426
3427
void TABLE_LIST::reinit_before_use(THD *thd)
3428
{
3429
  /*
3430
    Reset old pointers to TABLEs: they are not valid since the tables
3431
    were closed in the end of previous prepare or execute call.
3432
  */
3433
  table= 0;
3434
  /* Reset is_schema_table_processed value(needed for I_S tables */
3435
  schema_table_state= NOT_PROCESSED;
3436
3437
  TABLE_LIST *embedded; /* The table at the current level of nesting. */
3438
  TABLE_LIST *parent_embedding= this; /* The parent nested table reference. */
3439
  do
3440
  {
3441
    embedded= parent_embedding;
3442
    if (embedded->prep_on_expr)
3443
      embedded->on_expr= embedded->prep_on_expr->copy_andor_structure(thd);
3444
    parent_embedding= embedded->embedding;
3445
  }
3446
  while (parent_embedding &&
3447
         parent_embedding->nested_join->join_list.head() == embedded);
3448
}
3449
3450
/*
3451
  Return subselect that contains the FROM list this table is taken from
3452
3453
  SYNOPSIS
3454
    TABLE_LIST::containing_subselect()
3455
 
3456
  RETURN
3457
    Subselect item for the subquery that contains the FROM list
3458
    this table is taken from if there is any
3459
    0 - otherwise
3460
3461
*/
3462
3463
Item_subselect *TABLE_LIST::containing_subselect()
3464
{    
3465
  return (select_lex ? select_lex->master_unit()->item : 0);
3466
}
3467
3468
/*
3469
  Compiles the tagged hints list and fills up the bitmasks.
3470
3471
  SYNOPSIS
3472
    process_index_hints()
3473
      table         the TABLE to operate on.
3474
3475
  DESCRIPTION
3476
    The parser collects the index hints for each table in a "tagged list" 
3477
    (TABLE_LIST::index_hints). Using the information in this tagged list
3478
    this function sets the members st_table::keys_in_use_for_query, 
3479
    st_table::keys_in_use_for_group_by, st_table::keys_in_use_for_order_by,
3480
    st_table::force_index and st_table::covering_keys.
3481
3482
    Current implementation of the runtime does not allow mixing FORCE INDEX
3483
    and USE INDEX, so this is checked here. Then the FORCE INDEX list 
3484
    (if non-empty) is appended to the USE INDEX list and a flag is set.
3485
3486
    Multiple hints of the same kind are processed so that each clause 
3487
    is applied to what is computed in the previous clause.
3488
    For example:
3489
        USE INDEX (i1) USE INDEX (i2)
3490
    is equivalent to
3491
        USE INDEX (i1,i2)
3492
    and means "consider only i1 and i2".
3493
        
3494
    Similarly
3495
        USE INDEX () USE INDEX (i1)
3496
    is equivalent to
3497
        USE INDEX (i1)
3498
    and means "consider only the index i1"
3499
3500
    It is OK to have the same index several times, e.g. "USE INDEX (i1,i1)" is
3501
    not an error.
3502
        
3503
    Different kind of hints (USE/FORCE/IGNORE) are processed in the following
3504
    order:
3505
      1. All indexes in USE (or FORCE) INDEX are added to the mask.
3506
      2. All IGNORE INDEX
3507
3508
    e.g. "USE INDEX i1, IGNORE INDEX i1, USE INDEX i1" will not use i1 at all
3509
    as if we had "USE INDEX i1, USE INDEX i1, IGNORE INDEX i1".
3510
3511
    As an optimization if there is a covering index, and we have 
3512
    IGNORE INDEX FOR GROUP/ORDER, and this index is used for the JOIN part, 
3513
    then we have to ignore the IGNORE INDEX FROM GROUP/ORDER.
3514
3515
  RETURN VALUE
3516
    FALSE                no errors found
3517
    TRUE                 found and reported an error.
3518
*/
3519
bool TABLE_LIST::process_index_hints(TABLE *tbl)
3520
{
3521
  /* initialize the result variables */
3522
  tbl->keys_in_use_for_query= tbl->keys_in_use_for_group_by= 
3523
    tbl->keys_in_use_for_order_by= tbl->s->keys_in_use;
3524
3525
  /* index hint list processing */
3526
  if (index_hints)
3527
  {
3528
    key_map index_join[INDEX_HINT_FORCE + 1];
3529
    key_map index_order[INDEX_HINT_FORCE + 1];
3530
    key_map index_group[INDEX_HINT_FORCE + 1];
3531
    Index_hint *hint;
3532
    int type;
3533
    bool have_empty_use_join= FALSE, have_empty_use_order= FALSE, 
3534
         have_empty_use_group= FALSE;
3535
    List_iterator <Index_hint> iter(*index_hints);
3536
3537
    /* initialize temporary variables used to collect hints of each kind */
3538
    for (type= INDEX_HINT_IGNORE; type <= INDEX_HINT_FORCE; type++)
3539
    {
3540
      index_join[type].clear_all();
3541
      index_order[type].clear_all();
3542
      index_group[type].clear_all();
3543
    }
3544
3545
    /* iterate over the hints list */
3546
    while ((hint= iter++))
3547
    {
3548
      uint pos;
3549
3550
      /* process empty USE INDEX () */
3551
      if (hint->type == INDEX_HINT_USE && !hint->key_name.str)
3552
      {
3553
        if (hint->clause & INDEX_HINT_MASK_JOIN)
3554
        {
3555
          index_join[hint->type].clear_all();
3556
          have_empty_use_join= TRUE;
3557
        }
3558
        if (hint->clause & INDEX_HINT_MASK_ORDER)
3559
        {
3560
          index_order[hint->type].clear_all();
3561
          have_empty_use_order= TRUE;
3562
        }
3563
        if (hint->clause & INDEX_HINT_MASK_GROUP)
3564
        {
3565
          index_group[hint->type].clear_all();
3566
          have_empty_use_group= TRUE;
3567
        }
3568
        continue;
3569
      }
3570
3571
      /* 
3572
        Check if an index with the given name exists and get his offset in 
3573
        the keys bitmask for the table 
3574
      */
3575
      if (tbl->s->keynames.type_names == 0 ||
3576
          (pos= find_type(&tbl->s->keynames, hint->key_name.str,
3577
                          hint->key_name.length, 1)) <= 0)
3578
      {
3579
        my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), hint->key_name.str, alias);
3580
        return 1;
3581
      }
3582
3583
      pos--;
3584
3585
      /* add to the appropriate clause mask */
3586
      if (hint->clause & INDEX_HINT_MASK_JOIN)
3587
        index_join[hint->type].set_bit (pos);
3588
      if (hint->clause & INDEX_HINT_MASK_ORDER)
3589
        index_order[hint->type].set_bit (pos);
3590
      if (hint->clause & INDEX_HINT_MASK_GROUP)
3591
        index_group[hint->type].set_bit (pos);
3592
    }
3593
3594
    /* cannot mix USE INDEX and FORCE INDEX */
3595
    if ((!index_join[INDEX_HINT_FORCE].is_clear_all() ||
3596
         !index_order[INDEX_HINT_FORCE].is_clear_all() ||
3597
         !index_group[INDEX_HINT_FORCE].is_clear_all()) &&
3598
        (!index_join[INDEX_HINT_USE].is_clear_all() ||  have_empty_use_join ||
3599
         !index_order[INDEX_HINT_USE].is_clear_all() || have_empty_use_order ||
3600
         !index_group[INDEX_HINT_USE].is_clear_all() || have_empty_use_group))
3601
    {
3602
      my_error(ER_WRONG_USAGE, MYF(0), index_hint_type_name[INDEX_HINT_USE],
3603
               index_hint_type_name[INDEX_HINT_FORCE]);
3604
      return 1;
3605
    }
3606
3607
    /* process FORCE INDEX as USE INDEX with a flag */
3608
    if (!index_join[INDEX_HINT_FORCE].is_clear_all() ||
3609
        !index_order[INDEX_HINT_FORCE].is_clear_all() ||
3610
        !index_group[INDEX_HINT_FORCE].is_clear_all())
3611
    {
3612
      tbl->force_index= TRUE;
3613
      index_join[INDEX_HINT_USE].merge(index_join[INDEX_HINT_FORCE]);
3614
      index_order[INDEX_HINT_USE].merge(index_order[INDEX_HINT_FORCE]);
3615
      index_group[INDEX_HINT_USE].merge(index_group[INDEX_HINT_FORCE]);
3616
    }
3617
3618
    /* apply USE INDEX */
3619
    if (!index_join[INDEX_HINT_USE].is_clear_all() || have_empty_use_join)
3620
      tbl->keys_in_use_for_query.intersect(index_join[INDEX_HINT_USE]);
3621
    if (!index_order[INDEX_HINT_USE].is_clear_all() || have_empty_use_order)
3622
      tbl->keys_in_use_for_order_by.intersect (index_order[INDEX_HINT_USE]);
3623
    if (!index_group[INDEX_HINT_USE].is_clear_all() || have_empty_use_group)
3624
      tbl->keys_in_use_for_group_by.intersect (index_group[INDEX_HINT_USE]);
3625
3626
    /* apply IGNORE INDEX */
3627
    tbl->keys_in_use_for_query.subtract (index_join[INDEX_HINT_IGNORE]);
3628
    tbl->keys_in_use_for_order_by.subtract (index_order[INDEX_HINT_IGNORE]);
3629
    tbl->keys_in_use_for_group_by.subtract (index_group[INDEX_HINT_IGNORE]);
3630
  }
3631
3632
  /* make sure covering_keys don't include indexes disabled with a hint */
3633
  tbl->covering_keys.intersect(tbl->keys_in_use_for_query);
3634
  return 0;
3635
}
3636
3637
3638
size_t max_row_length(TABLE *table, const uchar *data)
3639
{
3640
  TABLE_SHARE *table_s= table->s;
3641
  size_t length= table_s->reclength + 2 * table_s->fields;
3642
  uint *const beg= table_s->blob_field;
3643
  uint *const end= beg + table_s->blob_fields;
3644
3645
  for (uint *ptr= beg ; ptr != end ; ++ptr)
3646
  {
3647
    Field_blob* const blob= (Field_blob*) table->field[*ptr];
3648
    length+= blob->get_length((const uchar*)
3649
                              (data + blob->offset(table->record[0]))) +
3650
      HA_KEY_BLOB_LENGTH;
3651
  }
3652
  return length;
3653
}
3654
3655
/*
3656
  Check type of .frm if we are not going to parse it
3657
3658
  SYNOPSIS
3659
  mysql_frm_type()
3660
  path        path to file
3661
3662
  RETURN
77.1.45 by Monty Taylor
Warning fixes.
3663
  FRMTYPE_ERROR       error
3664
  FRMTYPE_TABLE       table
3665
*/
1 by brian
clean slate
3666
77.1.45 by Monty Taylor
Warning fixes.
3667
frm_type_enum mysql_frm_type(THD *thd __attribute__((__unused__)),
3668
                             char *path, enum legacy_db_type *dbt)
3669
{
1 by brian
clean slate
3670
  File file;
3671
  uchar header[10];     /* This should be optimized */
3672
  int error;
3673
3674
  *dbt= DB_TYPE_UNKNOWN;
3675
3676
  if ((file= my_open(path, O_RDONLY | O_SHARE, MYF(0))) < 0)
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3677
    return(FRMTYPE_ERROR);
1 by brian
clean slate
3678
  error= my_read(file, (uchar*) header, sizeof(header), MYF(MY_NABP));
3679
  my_close(file, MYF(MY_WME));
3680
3681
  if (error)
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3682
    return(FRMTYPE_ERROR);
1 by brian
clean slate
3683
3684
  /*  
3685
    This is just a check for DB_TYPE. We'll return default unknown type
3686
    if the following test is true (arg #3). This should not have effect
3687
    on return value from this function (default FRMTYPE_TABLE)
3688
   */  
3689
  if (header[0] != (uchar) 254 || header[1] != 1 ||
3690
      (header[2] != FRM_VER && header[2] != FRM_VER+1 &&
3691
       (header[2] < FRM_VER+3 || header[2] > FRM_VER+4)))
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3692
    return(FRMTYPE_TABLE);
1 by brian
clean slate
3693
3694
  *dbt= (enum legacy_db_type) (uint) *(header + 3);
51.1.1 by Jay Pipes
Merged PatG's removal of various DBUG stuff with still keeping DBUG_ASSERT calls since they seem to be breaking test runs
3695
  return(FRMTYPE_TABLE);                   // Is probably a .frm table
1 by brian
clean slate
3696
}
3697
3698
3699
/*****************************************************************************
3700
** Instansiate templates
3701
*****************************************************************************/
3702
3703
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
3704
template class List<String>;
3705
template class List_iterator<String>;
3706
#endif