~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
/* Basic functions needed by many modules */
243.1.17 by Jay Pipes
FINAL PHASE removal of mysql_priv.h (Bye, bye my friend.)
18
#include <drizzled/server_includes.h>
19
#include <drizzled/sql_select.h>
212.5.38 by Monty Taylor
Moved my_dir (and removed references to a lot of places)
20
#include <mysys/my_dir.h>
202.3.6 by Monty Taylor
First pass at gettexizing the error messages.
21
#include <drizzled/drizzled_error_messages.h>
338 by Monty Taylor
Tagged more strings.
22
#include <libdrizzle/gettext.h>
1 by brian
clean slate
23
24
#define FLAGSTR(S,F) ((S) & (F) ? #F " " : "")
25
26
/**
27
  @defgroup Data_Dictionary Data Dictionary
28
  @{
29
*/
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
30
Table *unused_tables;				/* Used by mysql_test */
1 by brian
clean slate
31
HASH open_cache;				/* Used by mysql_test */
32
static HASH table_def_cache;
33
static TABLE_SHARE *oldest_unused_share, end_of_unused_share;
34
static pthread_mutex_t LOCK_table_share;
35
static bool table_def_inited= 0;
36
327.2.4 by Brian Aker
Refactoring table.h
37
static int open_unireg_entry(THD *thd, Table *entry, TableList *table_list,
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
38
                             const char *alias,
39
                             char *cache_key, uint cache_key_length);
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
40
static void free_cache_entry(Table *entry);
41
static void close_old_data_files(THD *thd, Table *table, bool morph_locks,
1 by brian
clean slate
42
                                 bool send_refresh);
43
44
45
extern "C" uchar *table_cache_key(const uchar *record, size_t *length,
146 by Brian Aker
my_bool cleanup.
46
                                  bool not_used __attribute__((unused)))
1 by brian
clean slate
47
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
48
  Table *entry=(Table*) record;
1 by brian
clean slate
49
  *length= entry->s->table_cache_key.length;
50
  return (uchar*) entry->s->table_cache_key.str;
51
}
52
53
54
bool table_cache_init(void)
55
{
56
  return hash_init(&open_cache, &my_charset_bin, table_cache_size+16,
57
		   0, 0, table_cache_key,
202.3.7 by Monty Taylor
Gettext error compiles and passes test!
58
		   (hash_free_key) free_cache_entry, 0);
1 by brian
clean slate
59
}
60
61
void table_cache_free(void)
62
{
63
  if (table_def_inited)
64
  {
55 by brian
Update for using real bool types.
65
    close_cached_tables(NULL, NULL, false, false, false);
1 by brian
clean slate
66
    if (!open_cache.records)			// Safety first
67
      hash_free(&open_cache);
68
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
69
  return;
1 by brian
clean slate
70
}
71
72
uint cached_open_tables(void)
73
{
74
  return open_cache.records;
75
}
76
77
/*
78
  Create a table cache key
79
80
  SYNOPSIS
81
    create_table_def_key()
82
    thd			Thread handler
83
    key			Create key here (must be of size MAX_DBKEY_LENGTH)
84
    table_list		Table definition
85
    tmp_table		Set if table is a tmp table
86
87
 IMPLEMENTATION
88
    The table cache_key is created from:
89
    db_name + \0
90
    table_name + \0
91
92
    if the table is a tmp table, we add the following to make each tmp table
93
    unique on the slave:
94
95
    4 bytes for master thread id
96
    4 bytes pseudo thread id
97
98
  RETURN
99
    Length of key
100
*/
101
327.2.4 by Brian Aker
Refactoring table.h
102
uint create_table_def_key(THD *thd, char *key, TableList *table_list,
1 by brian
clean slate
103
                          bool tmp_table)
104
{
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
105
  uint key_length= (uint) (stpcpy(stpcpy(key, table_list->db)+1,
1 by brian
clean slate
106
                                  table_list->table_name)-key)+1;
107
  if (tmp_table)
108
  {
109
    int4store(key + key_length, thd->server_id);
110
    int4store(key + key_length + 4, thd->variables.pseudo_thread_id);
111
    key_length+= TMP_TABLE_KEY_EXTRA;
112
  }
113
  return key_length;
114
}
115
116
117
118
/*****************************************************************************
119
  Functions to handle table definition cach (TABLE_SHARE)
120
*****************************************************************************/
121
122
extern "C" uchar *table_def_key(const uchar *record, size_t *length,
146 by Brian Aker
my_bool cleanup.
123
                                bool not_used __attribute__((unused)))
1 by brian
clean slate
124
{
125
  TABLE_SHARE *entry=(TABLE_SHARE*) record;
126
  *length= entry->table_cache_key.length;
127
  return (uchar*) entry->table_cache_key.str;
128
}
129
130
131
static void table_def_free_entry(TABLE_SHARE *share)
132
{
133
  if (share->prev)
134
  {
135
    /* remove from old_unused_share list */
136
    pthread_mutex_lock(&LOCK_table_share);
137
    *share->prev= share->next;
138
    share->next->prev= share->prev;
139
    pthread_mutex_unlock(&LOCK_table_share);
140
  }
141
  free_table_share(share);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
142
  return;
1 by brian
clean slate
143
}
144
145
146
bool table_def_init(void)
147
{
148
  table_def_inited= 1;
149
  pthread_mutex_init(&LOCK_table_share, MY_MUTEX_INIT_FAST);
150
  oldest_unused_share= &end_of_unused_share;
151
  end_of_unused_share.prev= &oldest_unused_share;
152
153
  return hash_init(&table_def_cache, &my_charset_bin, table_def_size,
154
		   0, 0, table_def_key,
202.3.7 by Monty Taylor
Gettext error compiles and passes test!
155
		   (hash_free_key) table_def_free_entry, 0);
1 by brian
clean slate
156
}
157
158
159
void table_def_free(void)
160
{
161
  if (table_def_inited)
162
  {
163
    table_def_inited= 0;
164
    pthread_mutex_destroy(&LOCK_table_share);
165
    hash_free(&table_def_cache);
166
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
167
  return;
1 by brian
clean slate
168
}
169
170
171
uint cached_table_definitions(void)
172
{
173
  return table_def_cache.records;
174
}
175
176
177
/*
178
  Get TABLE_SHARE for a table.
179
180
  get_table_share()
181
  thd			Thread handle
182
  table_list		Table that should be opened
183
  key			Table cache key
184
  key_length		Length of key
185
  db_flags		Flags to open_table_def():
186
			OPEN_VIEW
187
  error			out: Error code from open_table_def()
188
189
  IMPLEMENTATION
190
    Get a table definition from the table definition cache.
191
    If it doesn't exist, create a new from the table definition file.
192
193
  NOTES
194
    We must have wrlock on LOCK_open when we come here
195
    (To be changed later)
196
197
  RETURN
198
   0  Error
199
   #  Share for table
200
*/
201
327.2.4 by Brian Aker
Refactoring table.h
202
TABLE_SHARE *get_table_share(THD *thd, TableList *table_list, char *key,
1 by brian
clean slate
203
                             uint key_length, uint db_flags, int *error)
204
{
205
  TABLE_SHARE *share;
206
207
  *error= 0;
208
209
  /* Read table definition from cache */
210
  if ((share= (TABLE_SHARE*) hash_search(&table_def_cache,(uchar*) key,
211
                                         key_length)))
212
    goto found;
213
214
  if (!(share= alloc_table_share(table_list, key, key_length)))
215
  {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
216
    return(0);
1 by brian
clean slate
217
  }
218
219
  /*
220
    Lock mutex to be able to read table definition from file without
221
    conflicts
222
  */
223
  (void) pthread_mutex_lock(&share->mutex);
224
225
  /*
226
    We assign a new table id under the protection of the LOCK_open and
227
    the share's own mutex.  We do this insted of creating a new mutex
228
    and using it for the sole purpose of serializing accesses to a
229
    static variable, we assign the table id here.  We assign it to the
230
    share before inserting it into the table_def_cache to be really
231
    sure that it cannot be read from the cache without having a table
232
    id assigned.
233
234
    CAVEAT. This means that the table cannot be used for
235
    binlogging/replication purposes, unless get_table_share() has been
236
    called directly or indirectly.
237
   */
238
  assign_new_table_id(share);
239
240
  if (my_hash_insert(&table_def_cache, (uchar*) share))
241
  {
242
    free_table_share(share);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
243
    return(0);				// return error
1 by brian
clean slate
244
  }
245
  if (open_table_def(thd, share, db_flags))
246
  {
247
    *error= share->error;
248
    (void) hash_delete(&table_def_cache, (uchar*) share);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
249
    return(0);
1 by brian
clean slate
250
  }
251
  share->ref_count++;				// Mark in use
252
  (void) pthread_mutex_unlock(&share->mutex);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
253
  return(share);
1 by brian
clean slate
254
255
found:
256
  /* 
257
     We found an existing table definition. Return it if we didn't get
258
     an error when reading the table definition from file.
259
  */
260
261
  /* We must do a lock to ensure that the structure is initialized */
262
  (void) pthread_mutex_lock(&share->mutex);
263
  if (share->error)
264
  {
265
    /* Table definition contained an error */
266
    open_table_error(share, share->error, share->open_errno, share->errarg);
267
    (void) pthread_mutex_unlock(&share->mutex);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
268
    return(0);
1 by brian
clean slate
269
  }
270
271
  if (!share->ref_count++ && share->prev)
272
  {
273
    /*
274
      Share was not used before and it was in the old_unused_share list
275
      Unlink share from this list
276
    */
277
    pthread_mutex_lock(&LOCK_table_share);
278
    *share->prev= share->next;
279
    share->next->prev= share->prev;
280
    share->next= 0;
281
    share->prev= 0;
282
    pthread_mutex_unlock(&LOCK_table_share);
283
  }
284
  (void) pthread_mutex_unlock(&share->mutex);
285
286
   /* Free cache if too big */
287
  while (table_def_cache.records > table_def_size &&
288
         oldest_unused_share->next)
289
  {
290
    pthread_mutex_lock(&oldest_unused_share->mutex);
291
    VOID(hash_delete(&table_def_cache, (uchar*) oldest_unused_share));
292
  }
293
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
294
  return(share);
1 by brian
clean slate
295
}
296
297
298
/*
299
  Get a table share. If it didn't exist, try creating it from engine
300
301
  For arguments and return values, see get_table_from_share()
302
*/
303
304
static TABLE_SHARE
327.2.4 by Brian Aker
Refactoring table.h
305
*get_table_share_with_create(THD *thd, TableList *table_list,
1 by brian
clean slate
306
                             char *key, uint key_length,
307
                             uint db_flags, int *error)
308
{
309
  TABLE_SHARE *share;
310
  int tmp;
311
312
  share= get_table_share(thd, table_list, key, key_length, db_flags, error);
313
  /*
314
    If share is not NULL, we found an existing share.
315
316
    If share is NULL, and there is no error, we're inside
317
    pre-locking, which silences 'ER_NO_SUCH_TABLE' errors
318
    with the intention to silently drop non-existing tables 
319
    from the pre-locking list. In this case we still need to try
320
    auto-discover before returning a NULL share.
321
322
    If share is NULL and the error is ER_NO_SUCH_TABLE, this is
323
    the same as above, only that the error was not silenced by 
324
    pre-locking. Once again, we need to try to auto-discover
325
    the share.
326
327
    Finally, if share is still NULL, it's a real error and we need
328
    to abort.
329
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
330
    @todo Rework alternative ways to deal with ER_NO_SUCH Table.
1 by brian
clean slate
331
  */
332
  if (share || (thd->is_error() && (thd->main_da.sql_errno() != ER_NO_SUCH_TABLE)))
333
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
334
    return(share);
1 by brian
clean slate
335
336
  /* Table didn't exist. Check if some engine can provide it */
337
  if ((tmp= ha_create_table_from_engine(thd, table_list->db,
338
                                        table_list->table_name)) < 0)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
339
    return(0);
327.1.7 by Brian Aker
Removed belong_to_view variable
340
1 by brian
clean slate
341
  if (tmp)
342
  {
343
    /* Give right error message */
344
    thd->clear_error();
345
    my_printf_error(ER_UNKNOWN_ERROR,
346
                    "Failed to open '%-.64s', error while "
347
                    "unpacking from engine",
348
                    MYF(0), table_list->table_name);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
349
    return(0);
1 by brian
clean slate
350
  }
351
  /* Table existed in engine. Let's open it */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
352
  drizzle_reset_errors(thd, 1);                   // Clear warnings
1 by brian
clean slate
353
  thd->clear_error();                           // Clear error message
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
354
  return(get_table_share(thd, table_list, key, key_length,
1 by brian
clean slate
355
                              db_flags, error));
356
}
357
358
359
/* 
360
   Mark that we are not using table share anymore.
361
362
   SYNOPSIS
363
     release_table_share()
364
     share		Table share
365
     release_type	How the release should be done:
366
     			RELEASE_NORMAL
367
                         - Release without checking
368
                        RELEASE_WAIT_FOR_DROP
369
                         - Don't return until we get a signal that the
370
                           table is deleted or the thread is killed.
371
372
   IMPLEMENTATION
373
     If ref_count goes to zero and (we have done a refresh or if we have
374
     already too many open table shares) then delete the definition.
375
376
     If type == RELEASE_WAIT_FOR_DROP then don't return until we get a signal
377
     that the table is deleted or the thread is killed.
378
*/
379
77.1.45 by Monty Taylor
Warning fixes.
380
void release_table_share(TABLE_SHARE *share,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
381
                         enum release_type type __attribute__((unused)))
1 by brian
clean slate
382
{
383
  bool to_be_deleted= 0;
384
385
  safe_mutex_assert_owner(&LOCK_open);
386
387
  pthread_mutex_lock(&share->mutex);
388
  if (!--share->ref_count)
389
  {
390
    if (share->version != refresh_version)
391
      to_be_deleted=1;
392
    else
393
    {
394
      /* Link share last in used_table_share list */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
395
      assert(share->next == 0);
1 by brian
clean slate
396
      pthread_mutex_lock(&LOCK_table_share);
397
      share->prev= end_of_unused_share.prev;
398
      *end_of_unused_share.prev= share;
399
      end_of_unused_share.prev= &share->next;
400
      share->next= &end_of_unused_share;
401
      pthread_mutex_unlock(&LOCK_table_share);
402
403
      to_be_deleted= (table_def_cache.records > table_def_size);
404
    }
405
  }
406
407
  if (to_be_deleted)
408
  {
409
    hash_delete(&table_def_cache, (uchar*) share);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
410
    return;
1 by brian
clean slate
411
  }
412
  pthread_mutex_unlock(&share->mutex);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
413
  return;
1 by brian
clean slate
414
}
415
416
417
/*
418
  Check if table definition exits in cache
419
420
  SYNOPSIS
421
    get_cached_table_share()
422
    db			Database name
423
    table_name		Table name
424
425
  RETURN
426
    0  Not cached
427
    #  TABLE_SHARE for table
428
*/
429
430
TABLE_SHARE *get_cached_table_share(const char *db, const char *table_name)
431
{
432
  char key[NAME_LEN*2+2];
327.2.4 by Brian Aker
Refactoring table.h
433
  TableList table_list;
1 by brian
clean slate
434
  uint key_length;
435
  safe_mutex_assert_owner(&LOCK_open);
436
437
  table_list.db= (char*) db;
438
  table_list.table_name= (char*) table_name;
439
  key_length= create_table_def_key((THD*) 0, key, &table_list, 0);
440
  return (TABLE_SHARE*) hash_search(&table_def_cache,(uchar*) key, key_length);
441
}  
442
443
444
/*
445
  Close file handle, but leave the table in the table cache
446
447
  SYNOPSIS
448
    close_handle_and_leave_table_as_lock()
449
    table		Table handler
450
451
  NOTES
452
    By leaving the table in the table cache, it disallows any other thread
453
    to open the table
454
455
    thd->killed will be set if we run out of memory
456
457
    If closing a MERGE child, the calling function has to take care for
458
    closing the parent too, if necessary.
459
*/
460
461
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
462
void close_handle_and_leave_table_as_lock(Table *table)
1 by brian
clean slate
463
{
464
  TABLE_SHARE *share, *old_share= table->s;
465
  char *key_buff;
466
  MEM_ROOT *mem_root= &table->mem_root;
467
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
468
  assert(table->db_stat);
1 by brian
clean slate
469
470
  /*
471
    Make a local copy of the table share and free the current one.
472
    This has to be done to ensure that the table share is removed from
473
    the table defintion cache as soon as the last instance is removed
474
  */
475
  if (multi_alloc_root(mem_root,
476
                       &share, sizeof(*share),
477
                       &key_buff, old_share->table_cache_key.length,
478
                       NULL))
479
  {
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
480
    memset(share, 0, sizeof(*share));
1 by brian
clean slate
481
    share->set_table_cache_key(key_buff, old_share->table_cache_key.str,
482
                               old_share->table_cache_key.length);
483
    share->tmp_table= INTERNAL_TMP_TABLE;       // for intern_close_table()
484
  }
485
486
  table->file->close();
487
  table->db_stat= 0;                            // Mark file closed
488
  release_table_share(table->s, RELEASE_NORMAL);
489
  table->s= share;
490
  table->file->change_table_ptr(table, table->s);
491
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
492
  return;
1 by brian
clean slate
493
}
494
495
496
497
/*
498
  Create a list for all open tables matching SQL expression
499
500
  SYNOPSIS
501
    list_open_tables()
502
    thd			Thread THD
503
    wild		SQL like expression
504
505
  NOTES
506
    One gets only a list of tables for which one has any kind of privilege.
507
    db and table names are allocated in result struct, so one doesn't need
508
    a lock on LOCK_open when traversing the return list.
509
510
  RETURN VALUES
511
    NULL	Error (Probably OOM)
512
    #		Pointer to list of names of open tables.
513
*/
514
327.2.4 by Brian Aker
Refactoring table.h
515
OPEN_TableList *list_open_tables(THD *thd __attribute__((unused)),
77.1.45 by Monty Taylor
Warning fixes.
516
                                  const char *db, const char *wild)
1 by brian
clean slate
517
{
518
  int result = 0;
327.2.4 by Brian Aker
Refactoring table.h
519
  OPEN_TableList **start_list, *open_list;
520
  TableList table_list;
1 by brian
clean slate
521
522
  VOID(pthread_mutex_lock(&LOCK_open));
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
523
  memset(&table_list, 0, sizeof(table_list));
1 by brian
clean slate
524
  start_list= &open_list;
525
  open_list=0;
526
527
  for (uint idx=0 ; result == 0 && idx < open_cache.records; idx++)
528
  {
327.2.4 by Brian Aker
Refactoring table.h
529
    OPEN_TableList *table;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
530
    Table *entry=(Table*) hash_element(&open_cache,idx);
1 by brian
clean slate
531
    TABLE_SHARE *share= entry->s;
532
533
    if (db && my_strcasecmp(system_charset_info, db, share->db.str))
534
      continue;
535
    if (wild && wild_compare(share->table_name.str, wild, 0))
536
      continue;
537
538
    /* Check if user has SELECT privilege for any column in the table */
539
    table_list.db=         share->db.str;
540
    table_list.table_name= share->table_name.str;
541
542
    /* need to check if we haven't already listed it */
543
    for (table= open_list  ; table ; table=table->next)
544
    {
545
      if (!strcmp(table->table, share->table_name.str) &&
546
	  !strcmp(table->db,    share->db.str))
547
      {
548
	if (entry->in_use)
549
	  table->in_use++;
550
	if (entry->locked_by_name)
551
	  table->locked++;
552
	break;
553
      }
554
    }
555
    if (table)
556
      continue;
327.2.4 by Brian Aker
Refactoring table.h
557
    if (!(*start_list = (OPEN_TableList *)
1 by brian
clean slate
558
	  sql_alloc(sizeof(**start_list)+share->table_cache_key.length)))
559
    {
560
      open_list=0;				// Out of memory
561
      break;
562
    }
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
563
    stpcpy((*start_list)->table=
564
	   stpcpy(((*start_list)->db= (char*) ((*start_list)+1)),
1 by brian
clean slate
565
		  share->db.str)+1,
566
	   share->table_name.str);
567
    (*start_list)->in_use= entry->in_use ? 1 : 0;
568
    (*start_list)->locked= entry->locked_by_name ? 1 : 0;
569
    start_list= &(*start_list)->next;
570
    *start_list=0;
571
  }
572
  VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
573
  return(open_list);
1 by brian
clean slate
574
}
575
576
/*****************************************************************************
577
 *	 Functions to free open table cache
578
 ****************************************************************************/
579
580
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
581
void intern_close_table(Table *table)
1 by brian
clean slate
582
{						// Free all structures
583
  free_io_cache(table);
584
  if (table->file)                              // Not true if name lock
585
    VOID(closefrm(table, 1));			// close file
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
586
  return;
1 by brian
clean slate
587
}
588
589
/*
590
  Remove table from the open table cache
591
592
  SYNOPSIS
593
    free_cache_entry()
594
    table		Table to remove
595
596
  NOTE
597
    We need to have a lock on LOCK_open when calling this
598
*/
599
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
600
static void free_cache_entry(Table *table)
1 by brian
clean slate
601
{
602
  intern_close_table(table);
603
  if (!table->in_use)
604
  {
605
    table->next->prev=table->prev;		/* remove from used chain */
606
    table->prev->next=table->next;
607
    if (table == unused_tables)
608
    {
609
      unused_tables=unused_tables->next;
610
      if (table == unused_tables)
611
	unused_tables=0;
612
    }
613
  }
614
  my_free((uchar*) table,MYF(0));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
615
  return;
1 by brian
clean slate
616
}
617
618
/* Free resources allocated by filesort() and read_record() */
619
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
620
void free_io_cache(Table *table)
1 by brian
clean slate
621
{
622
  if (table->sort.io_cache)
623
  {
624
    close_cached_file(table->sort.io_cache);
625
    my_free((uchar*) table->sort.io_cache,MYF(0));
626
    table->sort.io_cache=0;
627
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
628
  return;
1 by brian
clean slate
629
}
630
631
632
/*
633
  Close all tables which aren't in use by any thread
634
635
  @param thd Thread context
636
  @param tables List of tables to remove from the cache
637
  @param have_lock If LOCK_open is locked
638
  @param wait_for_refresh Wait for a impending flush
639
  @param wait_for_placeholders Wait for tables being reopened so that the GRL
640
         won't proceed while write-locked tables are being reopened by other
641
         threads.
642
55 by brian
Update for using real bool types.
643
  @remark THD can be NULL, but then wait_for_refresh must be false
1 by brian
clean slate
644
          and tables must be NULL.
645
*/
646
327.2.4 by Brian Aker
Refactoring table.h
647
bool close_cached_tables(THD *thd, TableList *tables, bool have_lock,
1 by brian
clean slate
648
                         bool wait_for_refresh, bool wait_for_placeholders)
649
{
650
  bool result=0;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
651
  assert(thd || (!wait_for_refresh && !tables));
1 by brian
clean slate
652
653
  if (!have_lock)
654
    VOID(pthread_mutex_lock(&LOCK_open));
655
  if (!tables)
656
  {
657
    refresh_version++;				// Force close of open tables
658
    while (unused_tables)
659
    {
660
#ifdef EXTRA_DEBUG
661
      if (hash_delete(&open_cache,(uchar*) unused_tables))
662
	printf("Warning: Couldn't delete open table from hash\n");
663
#else
664
      VOID(hash_delete(&open_cache,(uchar*) unused_tables));
665
#endif
666
    }
667
    /* Free table shares */
668
    while (oldest_unused_share->next)
669
    {
670
      pthread_mutex_lock(&oldest_unused_share->mutex);
671
      VOID(hash_delete(&table_def_cache, (uchar*) oldest_unused_share));
672
    }
673
    if (wait_for_refresh)
674
    {
675
      /*
676
        Other threads could wait in a loop in open_and_lock_tables(),
677
        trying to lock one or more of our tables.
678
679
        If they wait for the locks in thr_multi_lock(), their lock
680
        request is aborted. They loop in open_and_lock_tables() and
681
        enter open_table(). Here they notice the table is refreshed and
682
        wait for COND_refresh. Then they loop again in
683
        open_and_lock_tables() and this time open_table() succeeds. At
684
        this moment, if we (the FLUSH TABLES thread) are scheduled and
685
        on another FLUSH TABLES enter close_cached_tables(), they could
686
        awake while we sleep below, waiting for others threads (us) to
687
        close their open tables. If this happens, the other threads
688
        would find the tables unlocked. They would get the locks, one
689
        after the other, and could do their destructive work. This is an
690
        issue if we have LOCK TABLES in effect.
691
692
        The problem is that the other threads passed all checks in
693
        open_table() before we refresh the table.
694
695
        The fix for this problem is to set some_tables_deleted for all
696
        threads with open tables. These threads can still get their
697
        locks, but will immediately release them again after checking
698
        this variable. They will then loop in open_and_lock_tables()
699
        again. There they will wait until we update all tables version
700
        below.
701
702
        Setting some_tables_deleted is done by remove_table_from_cache()
703
        in the other branch.
704
705
        In other words (reviewer suggestion): You need this setting of
706
        some_tables_deleted for the case when table was opened and all
707
        related checks were passed before incrementing refresh_version
708
        (which you already have) but attempt to lock the table happened
709
        after the call to close_old_data_files() i.e. after removal of
710
        current thread locks.
711
      */
712
      for (uint idx=0 ; idx < open_cache.records ; idx++)
713
      {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
714
        Table *table=(Table*) hash_element(&open_cache,idx);
1 by brian
clean slate
715
        if (table->in_use)
716
          table->in_use->some_tables_deleted= 1;
717
      }
718
    }
719
  }
720
  else
721
  {
722
    bool found=0;
327.2.4 by Brian Aker
Refactoring table.h
723
    for (TableList *table= tables; table; table= table->next_local)
1 by brian
clean slate
724
    {
725
      if (remove_table_from_cache(thd, table->db, table->table_name,
726
                                  RTFC_OWNED_BY_THD_FLAG))
727
	found=1;
728
    }
729
    if (!found)
730
      wait_for_refresh=0;			// Nothing to wait for
731
  }
732
733
  if (wait_for_refresh)
734
  {
735
    /*
736
      If there is any table that has a lower refresh_version, wait until
737
      this is closed (or this thread is killed) before returning
738
    */
739
    thd->mysys_var->current_mutex= &LOCK_open;
740
    thd->mysys_var->current_cond= &COND_refresh;
741
    thd_proc_info(thd, "Flushing tables");
742
743
    close_old_data_files(thd,thd->open_tables,1,1);
744
    mysql_ha_flush(thd);
745
746
    bool found=1;
747
    /* Wait until all threads has closed all the tables we had locked */
748
    while (found && ! thd->killed)
749
    {
750
      found=0;
751
      for (uint idx=0 ; idx < open_cache.records ; idx++)
752
      {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
753
	Table *table=(Table*) hash_element(&open_cache,idx);
1 by brian
clean slate
754
        /* Avoid a self-deadlock. */
755
        if (table->in_use == thd)
756
          continue;
757
        /*
758
          Note that we wait here only for tables which are actually open, and
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
759
          not for placeholders with Table::open_placeholder set. Waiting for
1 by brian
clean slate
760
          latter will cause deadlock in the following scenario, for example:
761
762
          conn1: lock table t1 write;
763
          conn2: lock table t2 write;
764
          conn1: flush tables;
765
          conn2: flush tables;
766
767
          It also does not make sense to wait for those of placeholders that
768
          are employed by CREATE TABLE as in this case table simply does not
769
          exist yet.
770
        */
771
	if (table->needs_reopen_or_name_lock() && (table->db_stat ||
772
            (table->open_placeholder && wait_for_placeholders)))
773
	{
774
	  found=1;
775
	  pthread_cond_wait(&COND_refresh,&LOCK_open);
776
	  break;
777
	}
778
      }
779
    }
780
    /*
781
      No other thread has the locked tables open; reopen them and get the
782
      old locks. This should always succeed (unless some external process
783
      has removed the tables)
784
    */
785
    thd->in_lock_tables=1;
786
    result=reopen_tables(thd,1,1);
787
    thd->in_lock_tables=0;
788
    /* Set version for table */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
789
    for (Table *table=thd->open_tables; table ; table= table->next)
1 by brian
clean slate
790
    {
791
      /*
792
        Preserve the version (0) of write locked tables so that a impending
793
        global read lock won't sneak in.
794
      */
795
      if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
796
        table->s->version= refresh_version;
797
    }
798
  }
799
  if (!have_lock)
800
    VOID(pthread_mutex_unlock(&LOCK_open));
801
  if (wait_for_refresh)
802
  {
803
    pthread_mutex_lock(&thd->mysys_var->mutex);
804
    thd->mysys_var->current_mutex= 0;
805
    thd->mysys_var->current_cond= 0;
806
    thd_proc_info(thd, 0);
807
    pthread_mutex_unlock(&thd->mysys_var->mutex);
808
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
809
  return(result);
1 by brian
clean slate
810
}
811
812
813
/*
814
  Close all tables which match specified connection string or
815
  if specified string is NULL, then any table with a connection string.
816
*/
817
818
bool close_cached_connection_tables(THD *thd, bool if_wait_for_refresh,
819
                                    LEX_STRING *connection, bool have_lock)
820
{
821
  uint idx;
327.2.4 by Brian Aker
Refactoring table.h
822
  TableList tmp, *tables= NULL;
55 by brian
Update for using real bool types.
823
  bool result= false;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
824
  assert(thd);
1 by brian
clean slate
825
327.2.4 by Brian Aker
Refactoring table.h
826
  memset(&tmp, 0, sizeof(TableList));
1 by brian
clean slate
827
828
  if (!have_lock)
829
    VOID(pthread_mutex_lock(&LOCK_open));
830
831
  for (idx= 0; idx < table_def_cache.records; idx++)
832
  {
833
    TABLE_SHARE *share= (TABLE_SHARE *) hash_element(&table_def_cache, idx);
834
835
    /* Ignore if table is not open or does not have a connect_string */
836
    if (!share->connect_string.length || !share->ref_count)
837
      continue;
838
839
    /* Compare the connection string */
840
    if (connection &&
841
        (connection->length > share->connect_string.length ||
842
         (connection->length < share->connect_string.length &&
843
          (share->connect_string.str[connection->length] != '/' &&
844
           share->connect_string.str[connection->length] != '\\')) ||
845
         strncasecmp(connection->str, share->connect_string.str,
846
                     connection->length)))
847
      continue;
848
849
    /* close_cached_tables() only uses these elements */
850
    tmp.db= share->db.str;
851
    tmp.table_name= share->table_name.str;
852
    tmp.next_local= tables;
853
327.2.4 by Brian Aker
Refactoring table.h
854
    tables= (TableList *) memdup_root(thd->mem_root, (char*)&tmp, 
855
                                       sizeof(TableList));
1 by brian
clean slate
856
  }
857
858
  if (tables)
55 by brian
Update for using real bool types.
859
    result= close_cached_tables(thd, tables, true, false, false);
1 by brian
clean slate
860
861
  if (!have_lock)
862
    VOID(pthread_mutex_unlock(&LOCK_open));
863
864
  if (if_wait_for_refresh)
865
  {
866
    pthread_mutex_lock(&thd->mysys_var->mutex);
867
    thd->mysys_var->current_mutex= 0;
868
    thd->mysys_var->current_cond= 0;
322.2.2 by Mats Kindahl
Hiding THD::proc_info field and providing a setter and getter.
869
    thd->set_proc_info(0);
1 by brian
clean slate
870
    pthread_mutex_unlock(&thd->mysys_var->mutex);
871
  }
872
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
873
  return(result);
1 by brian
clean slate
874
}
875
876
877
/**
878
  Mark all temporary tables which were used by the current statement or
879
  substatement as free for reuse, but only if the query_id can be cleared.
880
881
  @param thd thread context
882
883
  @remark For temp tables associated with a open SQL HANDLER the query_id
884
          is not reset until the HANDLER is closed.
885
*/
886
887
static void mark_temp_tables_as_free_for_reuse(THD *thd)
888
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
889
  for (Table *table= thd->temporary_tables ; table ; table= table->next)
1 by brian
clean slate
890
  {
891
    if ((table->query_id == thd->query_id) && ! table->open_by_handler)
892
    {
893
      table->query_id= 0;
894
      table->file->ha_reset();
895
    }
896
  }
897
}
898
899
900
/*
901
  Mark all tables in the list which were used by current substatement
902
  as free for reuse.
903
904
  SYNOPSIS
905
    mark_used_tables_as_free_for_reuse()
906
      thd   - thread context
907
      table - head of the list of tables
908
909
  DESCRIPTION
910
    Marks all tables in the list which were used by current substatement
911
    (they are marked by its query_id) as free for reuse.
912
913
  NOTE
914
    The reason we reset query_id is that it's not enough to just test
915
    if table->query_id != thd->query_id to know if a table is in use.
916
917
    For example
918
    SELECT f1_that_uses_t1() FROM t1;
919
    In f1_that_uses_t1() we will see one instance of t1 where query_id is
920
    set to query_id of original query.
921
*/
922
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
923
static void mark_used_tables_as_free_for_reuse(THD *thd, Table *table)
1 by brian
clean slate
924
{
925
  for (; table ; table= table->next)
926
  {
927
    if (table->query_id == thd->query_id)
928
    {
929
      table->query_id= 0;
930
      table->file->ha_reset();
931
    }
932
  }
933
}
934
935
936
/**
937
  Auxiliary function to close all tables in the open_tables list.
938
939
  @param thd Thread context.
940
941
  @remark It should not ordinarily be called directly.
942
*/
943
944
static void close_open_tables(THD *thd)
945
{
946
  bool found_old_table= 0;
947
948
  safe_mutex_assert_not_owner(&LOCK_open);
949
950
  VOID(pthread_mutex_lock(&LOCK_open));
951
952
  while (thd->open_tables)
953
    found_old_table|= close_thread_table(thd, &thd->open_tables);
954
  thd->some_tables_deleted= 0;
955
956
  /* Free tables to hold down open files */
957
  while (open_cache.records > table_cache_size && unused_tables)
958
    VOID(hash_delete(&open_cache,(uchar*) unused_tables)); /* purecov: tested */
959
  if (found_old_table)
960
  {
961
    /* Tell threads waiting for refresh that something has happened */
962
    broadcast_refresh();
963
  }
964
965
  VOID(pthread_mutex_unlock(&LOCK_open));
966
}
967
968
969
/*
970
  Close all tables used by the current substatement, or all tables
971
  used by this thread if we are on the upper level.
972
973
  SYNOPSIS
974
    close_thread_tables()
975
    thd			Thread handler
976
977
  IMPLEMENTATION
978
    Unlocks tables and frees derived tables.
979
    Put all normal tables used by thread in free list.
980
981
    It will only close/mark as free for reuse tables opened by this
982
    substatement, it will also check if we are closing tables after
983
    execution of complete query (i.e. we are on upper level) and will
984
    leave prelocked mode if needed.
985
*/
986
987
void close_thread_tables(THD *thd)
988
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
989
  Table *table;
1 by brian
clean slate
990
991
  /*
992
    We are assuming here that thd->derived_tables contains ONLY derived
993
    tables for this substatement. i.e. instead of approach which uses
994
    query_id matching for determining which of the derived tables belong
995
    to this substatement we rely on the ability of substatements to
996
    save/restore thd->derived_tables during their execution.
997
998
    TODO: Probably even better approach is to simply associate list of
999
          derived tables with (sub-)statement instead of thread and destroy
1000
          them at the end of its execution.
1001
  */
1002
  if (thd->derived_tables)
1003
  {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1004
    Table *next;
1 by brian
clean slate
1005
    /*
1006
      Close all derived tables generated in queries like
1007
      SELECT * FROM (SELECT * FROM t1)
1008
    */
1009
    for (table= thd->derived_tables ; table ; table= next)
1010
    {
1011
      next= table->next;
327.1.2 by Brian Aker
Commiting next pass of Table class cleanup.
1012
      table->free_tmp_table(thd);
1 by brian
clean slate
1013
    }
1014
    thd->derived_tables= 0;
1015
  }
1016
1017
  /*
1018
    Mark all temporary tables used by this statement as free for reuse.
1019
  */
1020
  mark_temp_tables_as_free_for_reuse(thd);
1021
  /*
1022
    Let us commit transaction for statement. Since in 5.0 we only have
1023
    one statement transaction and don't allow several nested statement
1024
    transactions this call will do nothing if we are inside of stored
1025
    function or trigger (i.e. statement transaction is already active and
1026
    does not belong to statement for which we do close_thread_tables()).
1027
    TODO: This should be fixed in later releases.
1028
   */
1029
  if (!(thd->state_flags & Open_tables_state::BACKUPS_AVAIL))
1030
  {
55 by brian
Update for using real bool types.
1031
    thd->main_da.can_overwrite_status= true;
1 by brian
clean slate
1032
    ha_autocommit_or_rollback(thd, thd->is_error());
55 by brian
Update for using real bool types.
1033
    thd->main_da.can_overwrite_status= false;
1 by brian
clean slate
1034
    thd->transaction.stmt.reset();
1035
  }
1036
1037
  if (thd->locked_tables)
1038
  {
1039
1040
    /* Ensure we are calling ha_reset() for all used tables */
1041
    mark_used_tables_as_free_for_reuse(thd, thd->open_tables);
1042
1043
    /*
1044
      We are under simple LOCK TABLES so should not do anything else.
1045
    */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1046
    return;
1 by brian
clean slate
1047
  }
1048
1049
  if (thd->lock)
1050
  {
1051
    /*
1052
      For RBR we flush the pending event just before we unlock all the
1053
      tables.  This means that we are at the end of a topmost
1054
      statement, so we ensure that the STMT_END_F flag is set on the
1055
      pending event.  For statements that are *inside* stored
1056
      functions, the pending event will not be flushed: that will be
1057
      handled either before writing a query log event (inside
1058
      binlog_query()) or when preparing a pending event.
1059
     */
55 by brian
Update for using real bool types.
1060
    thd->binlog_flush_pending_rows_event(true);
1 by brian
clean slate
1061
    mysql_unlock_tables(thd, thd->lock);
1062
    thd->lock=0;
1063
  }
1064
  /*
1065
    Note that we need to hold LOCK_open while changing the
1066
    open_tables list. Another thread may work on it.
1067
    (See: remove_table_from_cache(), mysql_wait_completed_table())
1068
    Closing a MERGE child before the parent would be fatal if the
1069
    other thread tries to abort the MERGE lock in between.
1070
  */
1071
  if (thd->open_tables)
1072
    close_open_tables(thd);
1073
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1074
  return;
1 by brian
clean slate
1075
}
1076
1077
1078
/* move one table to free list */
1079
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1080
bool close_thread_table(THD *thd, Table **table_ptr)
1 by brian
clean slate
1081
{
1082
  bool found_old_table= 0;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1083
  Table *table= *table_ptr;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1084
1085
  assert(table->key_read == 0);
1086
  assert(!table->file || table->file->inited == handler::NONE);
1 by brian
clean slate
1087
1088
  *table_ptr=table->next;
1089
1090
  if (table->needs_reopen_or_name_lock() ||
1091
      thd->version != refresh_version || !table->db_stat)
1092
  {
1093
    VOID(hash_delete(&open_cache,(uchar*) table));
1094
    found_old_table=1;
1095
  }
1096
  else
1097
  {
1098
    /*
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1099
      Open placeholders have Table::db_stat set to 0, so they should be
1 by brian
clean slate
1100
      handled by the first alternative.
1101
    */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1102
    assert(!table->open_placeholder);
1 by brian
clean slate
1103
1104
    /* Free memory and reset for next loop */
1105
    table->file->ha_reset();
1106
    table->in_use=0;
1107
    if (unused_tables)
1108
    {
1109
      table->next=unused_tables;		/* Link in last */
1110
      table->prev=unused_tables->prev;
1111
      unused_tables->prev=table;
1112
      table->prev->next=table;
1113
    }
1114
    else
1115
      unused_tables=table->next=table->prev=table;
1116
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1117
  return(found_old_table);
1 by brian
clean slate
1118
}
1119
1120
1121
/* close_temporary_tables' internal, 4 is due to uint4korr definition */
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1122
static inline uint  tmpkeyval(THD *thd __attribute__((unused)),
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1123
                              Table *table)
1 by brian
clean slate
1124
{
1125
  return uint4korr(table->s->table_cache_key.str + table->s->table_cache_key.length - 4);
1126
}
1127
1128
1129
/*
1130
  Close all temporary tables created by 'CREATE TEMPORARY TABLE' for thread
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1131
  creates one DROP TEMPORARY Table binlog event for each pseudo-thread 
1 by brian
clean slate
1132
*/
1133
1134
void close_temporary_tables(THD *thd)
1135
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1136
  Table *table;
1137
  Table *next= NULL;
1138
  Table *prev_table;
1 by brian
clean slate
1139
  /* Assume thd->options has OPTION_QUOTE_SHOW_CREATE */
55 by brian
Update for using real bool types.
1140
  bool was_quote_show= true;
1 by brian
clean slate
1141
1142
  if (!thd->temporary_tables)
1143
    return;
1144
1145
  if (!mysql_bin_log.is_open() || thd->current_stmt_binlog_row_based)
1146
  {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1147
    Table *tmp_next;
1 by brian
clean slate
1148
    for (table= thd->temporary_tables; table; table= tmp_next)
1149
    {
1150
      tmp_next= table->next;
1151
      close_temporary(table, 1, 1);
1152
    }
1153
    thd->temporary_tables= 0;
1154
    return;
1155
  }
1156
1157
  /* Better add "if exists", in case a RESET MASTER has been done */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1158
  const char stub[]= "DROP /*!40005 TEMPORARY */ Table IF EXISTS ";
1 by brian
clean slate
1159
  uint stub_len= sizeof(stub) - 1;
1160
  char buf[256];
1161
  String s_query= String(buf, sizeof(buf), system_charset_info);
55 by brian
Update for using real bool types.
1162
  bool found_user_tables= false;
1 by brian
clean slate
1163
1164
  memcpy(buf, stub, stub_len);
1165
1166
  /*
1167
    Insertion sort of temp tables by pseudo_thread_id to build ordered list
1168
    of sublists of equal pseudo_thread_id
1169
  */
1170
1171
  for (prev_table= thd->temporary_tables, table= prev_table->next;
1172
       table;
1173
       prev_table= table, table= table->next)
1174
  {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1175
    Table *prev_sorted /* same as for prev_table */, *sorted;
1 by brian
clean slate
1176
    if (is_user_table(table))
1177
    {
1178
      if (!found_user_tables)
1179
        found_user_tables= true;
1180
      for (prev_sorted= NULL, sorted= thd->temporary_tables; sorted != table;
1181
           prev_sorted= sorted, sorted= sorted->next)
1182
      {
1183
        if (!is_user_table(sorted) ||
1184
            tmpkeyval(thd, sorted) > tmpkeyval(thd, table))
1185
        {
1186
          /* move into the sorted part of the list from the unsorted */
1187
          prev_table->next= table->next;
1188
          table->next= sorted;
1189
          if (prev_sorted)
1190
          {
1191
            prev_sorted->next= table;
1192
          }
1193
          else
1194
          {
1195
            thd->temporary_tables= table;
1196
          }
1197
          table= prev_table;
1198
          break;
1199
        }
1200
      }
1201
    }
1202
  }
1203
1204
  /* We always quote db,table names though it is slight overkill */
1205
  if (found_user_tables &&
1206
      !(was_quote_show= test(thd->options & OPTION_QUOTE_SHOW_CREATE)))
1207
  {
1208
    thd->options |= OPTION_QUOTE_SHOW_CREATE;
1209
  }
1210
1211
  /* scan sorted tmps to generate sequence of DROP */
1212
  for (table= thd->temporary_tables; table; table= next)
1213
  {
1214
    if (is_user_table(table))
1215
    {
1216
      my_thread_id save_pseudo_thread_id= thd->variables.pseudo_thread_id;
1217
      /* Set pseudo_thread_id to be that of the processed table */
1218
      thd->variables.pseudo_thread_id= tmpkeyval(thd, table);
1219
      /*
1220
        Loop forward through all tables within the sublist of
1221
        common pseudo_thread_id to create single DROP query.
1222
      */
1223
      for (s_query.length(stub_len);
1224
           table && is_user_table(table) &&
1225
             tmpkeyval(thd, table) == thd->variables.pseudo_thread_id;
1226
           table= next)
1227
      {
1228
        /*
1229
          We are going to add 4 ` around the db/table names and possible more
1230
          due to special characters in the names
1231
        */
1232
        append_identifier(thd, &s_query, table->s->db.str, strlen(table->s->db.str));
1233
        s_query.append('.');
1234
        append_identifier(thd, &s_query, table->s->table_name.str,
1235
                          strlen(table->s->table_name.str));
1236
        s_query.append(',');
1237
        next= table->next;
1238
        close_temporary(table, 1, 1);
1239
      }
1240
      thd->clear_error();
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
1241
      const CHARSET_INFO * const cs_save= thd->variables.character_set_client;
1 by brian
clean slate
1242
      thd->variables.character_set_client= system_charset_info;
1243
      Query_log_event qinfo(thd, s_query.ptr(),
1244
                            s_query.length() - 1 /* to remove trailing ',' */,
55 by brian
Update for using real bool types.
1245
                            0, false);
1 by brian
clean slate
1246
      thd->variables.character_set_client= cs_save;
1247
      /*
1248
        Imagine the thread had created a temp table, then was doing a
1249
        SELECT, and the SELECT was killed. Then it's not clever to
1250
        mark the statement above as "killed", because it's not really
1251
        a statement updating data, and there are 99.99% chances it
1252
        will succeed on slave.  If a real update (one updating a
1253
        persistent table) was killed on the master, then this real
1254
        update will be logged with error_code=killed, rightfully
1255
        causing the slave to stop.
1256
      */
1257
      qinfo.error_code= 0;
1258
      mysql_bin_log.write(&qinfo);
1259
      thd->variables.pseudo_thread_id= save_pseudo_thread_id;
1260
    }
1261
    else
1262
    {
1263
      next= table->next;
1264
      close_temporary(table, 1, 1);
1265
    }
1266
  }
1267
  if (!was_quote_show)
1268
    thd->options&= ~OPTION_QUOTE_SHOW_CREATE; /* restore option */
1269
  thd->temporary_tables=0;
1270
}
1271
1272
/*
1273
  Find table in list.
1274
1275
  SYNOPSIS
1276
    find_table_in_list()
1277
    table		Pointer to table list
1278
    offset		Offset to which list in table structure to use
1279
    db_name		Data base name
1280
    table_name		Table name
1281
1282
  NOTES:
1283
    This is called by find_table_in_local_list() and
1284
    find_table_in_global_list().
1285
1286
  RETURN VALUES
1287
    NULL	Table not found
1288
    #		Pointer to found table.
1289
*/
1290
327.2.4 by Brian Aker
Refactoring table.h
1291
TableList *find_table_in_list(TableList *table,
1292
                               TableList *TableList::*link,
1 by brian
clean slate
1293
                               const char *db_name,
1294
                               const char *table_name)
1295
{
1296
  for (; table; table= table->*link )
1297
  {
1298
    if ((table->table == 0 || table->table->s->tmp_table == NO_TMP_TABLE) &&
1299
        strcmp(table->db, db_name) == 0 &&
1300
        strcmp(table->table_name, table_name) == 0)
1301
      break;
1302
  }
1303
  return table;
1304
}
1305
1306
1307
/*
1308
  Test that table is unique (It's only exists once in the table list)
1309
1310
  SYNOPSIS
1311
    unique_table()
1312
    thd                   thread handle
1313
    table                 table which should be checked
1314
    table_list            list of tables
1315
    check_alias           whether to check tables' aliases
1316
1317
  NOTE: to exclude derived tables from check we use following mechanism:
1318
    a) during derived table processing set THD::derived_tables_processing
1319
    b) JOIN::prepare set SELECT::exclude_from_table_unique_test if
1320
       THD::derived_tables_processing set. (we can't use JOIN::execute
1321
       because for PS we perform only JOIN::prepare, but we can't set this
1322
       flag in JOIN::prepare if we are not sure that we are in derived table
1323
       processing loop, because multi-update call fix_fields() for some its
1324
       items (which mean JOIN::prepare for subqueries) before unique_table
1325
       call to detect which tables should be locked for write).
1326
    c) unique_table skip all tables which belong to SELECT with
1327
       SELECT::exclude_from_table_unique_test set.
1328
    Also SELECT::exclude_from_table_unique_test used to exclude from check
1329
    tables of main SELECT of multi-delete and multi-update
1330
327.2.4 by Brian Aker
Refactoring table.h
1331
    We also skip tables with TableList::prelocking_placeholder set,
1 by brian
clean slate
1332
    because we want to allow SELECTs from them, and their modification
1333
    will rise the error anyway.
1334
1335
    TODO: when we will have table/view change detection we can do this check
1336
          only once for PS/SP
1337
1338
  RETURN
1339
    found duplicate
1340
    0 if table is unique
1341
*/
1342
327.2.4 by Brian Aker
Refactoring table.h
1343
TableList* unique_table(THD *thd, TableList *table, TableList *table_list,
1 by brian
clean slate
1344
                         bool check_alias)
1345
{
327.2.4 by Brian Aker
Refactoring table.h
1346
  TableList *res;
1 by brian
clean slate
1347
  const char *d_name, *t_name, *t_alias;
1348
1349
  /*
1350
    If this function called for query which update table (INSERT/UPDATE/...)
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1351
    then we have in table->table pointer to Table object which we are
327.2.4 by Brian Aker
Refactoring table.h
1352
    updating even if it is VIEW so we need TableList of this Table object
1 by brian
clean slate
1353
    to get right names (even if lower_case_table_names used).
1354
1355
    If this function called for CREATE command that we have not opened table
327.2.4 by Brian Aker
Refactoring table.h
1356
    (table->table equal to 0) and right names is in current TableList
1 by brian
clean slate
1357
    object.
1358
  */
1359
  if (table->table)
1360
  {
1361
    /* temporary table is always unique */
1362
    if (table->table && table->table->s->tmp_table != NO_TMP_TABLE)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1363
      return(0);
1 by brian
clean slate
1364
    table= table->find_underlying_table(table->table);
1365
    /*
327.2.4 by Brian Aker
Refactoring table.h
1366
      as far as we have table->table we have to find real TableList of
1 by brian
clean slate
1367
      it in underlying tables
1368
    */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1369
    assert(table);
1 by brian
clean slate
1370
  }
1371
  d_name= table->db;
1372
  t_name= table->table_name;
1373
  t_alias= table->alias;
1374
1375
  for (;;)
1376
  {
1377
    if (((! (res= find_table_in_global_list(table_list, d_name, t_name))) &&
1378
         (! (res= mysql_lock_have_duplicate(thd, table, table_list)))) ||
1379
        ((!res->table || res->table != table->table) &&
1380
         (!check_alias || !(lower_case_table_names ?
1381
          my_strcasecmp(files_charset_info, t_alias, res->alias) :
1382
          strcmp(t_alias, res->alias))) &&
1383
         res->select_lex && !res->select_lex->exclude_from_table_unique_test))
1384
      break;
1385
    /*
1386
      If we found entry of this table or table of SELECT which already
1387
      processed in derived table or top select of multi-update/multi-delete
1388
      (exclude_from_table_unique_test) or prelocking placeholder.
1389
    */
1390
    table_list= res->next_global;
1391
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1392
  return(res);
1 by brian
clean slate
1393
}
1394
1395
1396
/*
1397
  Issue correct error message in case we found 2 duplicate tables which
1398
  prevent some update operation
1399
1400
  SYNOPSIS
1401
    update_non_unique_table_error()
1402
    update      table which we try to update
1403
    operation   name of update operation
1404
    duplicate   duplicate table which we found
1405
1406
  NOTE:
1407
    here we hide view underlying tables if we have them
1408
*/
1409
327.2.4 by Brian Aker
Refactoring table.h
1410
void update_non_unique_table_error(TableList *update,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1411
                                   const char *operation __attribute__((unused)),
327.2.4 by Brian Aker
Refactoring table.h
1412
                                   TableList *duplicate __attribute__((unused)))
1 by brian
clean slate
1413
{
1414
  my_error(ER_UPDATE_TABLE_USED, MYF(0), update->alias);
1415
}
1416
1417
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1418
Table *find_temporary_table(THD *thd, const char *db, const char *table_name)
1 by brian
clean slate
1419
{
327.2.4 by Brian Aker
Refactoring table.h
1420
  TableList table_list;
1 by brian
clean slate
1421
1422
  table_list.db= (char*) db;
1423
  table_list.table_name= (char*) table_name;
1424
  return find_temporary_table(thd, &table_list);
1425
}
1426
1427
327.2.4 by Brian Aker
Refactoring table.h
1428
Table *find_temporary_table(THD *thd, TableList *table_list)
1 by brian
clean slate
1429
{
1430
  char	key[MAX_DBKEY_LENGTH];
1431
  uint	key_length;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1432
  Table *table;
1 by brian
clean slate
1433
1434
  key_length= create_table_def_key(thd, key, table_list, 1);
1435
  for (table=thd->temporary_tables ; table ; table= table->next)
1436
  {
1437
    if (table->s->table_cache_key.length == key_length &&
1438
	!memcmp(table->s->table_cache_key.str, key, key_length))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1439
      return(table);
1 by brian
clean slate
1440
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1441
  return(0);                               // Not a temporary table
1 by brian
clean slate
1442
}
1443
1444
1445
/**
1446
  Drop a temporary table.
1447
1448
  Try to locate the table in the list of thd->temporary_tables.
1449
  If the table is found:
1450
   - if the table is being used by some outer statement, fail.
1451
   - if the table is in thd->locked_tables, unlock it and
1452
     remove it from the list of locked tables. Currently only transactional
1453
     temporary tables are present in the locked_tables list.
1454
   - Close the temporary table, remove its .FRM
1455
   - remove the table from the list of temporary tables
1456
1457
  This function is used to drop user temporary tables, as well as
1458
  internal tables created in CREATE TEMPORARY TABLE ... SELECT
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1459
  or ALTER Table. Even though part of the work done by this function
1 by brian
clean slate
1460
  is redundant when the table is internal, as long as we
1461
  link both internal and user temporary tables into the same
1462
  thd->temporary_tables list, it's impossible to tell here whether
1463
  we're dealing with an internal or a user temporary table.
1464
1465
  @retval  0  the table was found and dropped successfully.
1466
  @retval  1  the table was not found in the list of temporary tables
1467
              of this thread
1468
  @retval -1  the table is in use by a outer query
1469
*/
1470
327.2.4 by Brian Aker
Refactoring table.h
1471
int drop_temporary_table(THD *thd, TableList *table_list)
1 by brian
clean slate
1472
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1473
  Table *table;
1 by brian
clean slate
1474
1475
  if (!(table= find_temporary_table(thd, table_list)))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1476
    return(1);
1 by brian
clean slate
1477
1478
  /* Table might be in use by some outer statement. */
1479
  if (table->query_id && table->query_id != thd->query_id)
1480
  {
1481
    my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1482
    return(-1);
1 by brian
clean slate
1483
  }
1484
1485
  /*
1486
    If LOCK TABLES list is not empty and contains this table,
1487
    unlock the table and remove the table from this list.
1488
  */
55 by brian
Update for using real bool types.
1489
  mysql_lock_remove(thd, thd->locked_tables, table, false);
1 by brian
clean slate
1490
  close_temporary_table(thd, table, 1, 1);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1491
  return(0);
1 by brian
clean slate
1492
}
1493
1494
/*
1495
  unlink from thd->temporary tables and close temporary table
1496
*/
1497
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1498
void close_temporary_table(THD *thd, Table *table,
1 by brian
clean slate
1499
                           bool free_share, bool delete_table)
1500
{
1501
  if (table->prev)
1502
  {
1503
    table->prev->next= table->next;
1504
    if (table->prev->next)
1505
      table->next->prev= table->prev;
1506
  }
1507
  else
1508
  {
1509
    /* removing the item from the list */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1510
    assert(table == thd->temporary_tables);
1 by brian
clean slate
1511
    /*
1512
      slave must reset its temporary list pointer to zero to exclude
1513
      passing non-zero value to end_slave via rli->save_temporary_tables
1514
      when no temp tables opened, see an invariant below.
1515
    */
1516
    thd->temporary_tables= table->next;
1517
    if (thd->temporary_tables)
1518
      table->next->prev= 0;
1519
  }
1520
  if (thd->slave_thread)
1521
  {
1522
    /* natural invariant of temporary_tables */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1523
    assert(slave_open_temp_tables || !thd->temporary_tables);
1 by brian
clean slate
1524
    slave_open_temp_tables--;
1525
  }
1526
  close_temporary(table, free_share, delete_table);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1527
  return;
1 by brian
clean slate
1528
}
1529
1530
1531
/*
1532
  Close and delete a temporary table
1533
1534
  NOTE
1535
    This dosn't unlink table from thd->temporary
1536
    If this is needed, use close_temporary_table()
1537
*/
1538
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1539
void close_temporary(Table *table, bool free_share, bool delete_table)
1 by brian
clean slate
1540
{
1541
  handlerton *table_type= table->s->db_type();
1542
1543
  free_io_cache(table);
1544
  closefrm(table, 0);
1545
  /*
1546
     Check that temporary table has not been created with
1547
     frm_only because it has then not been created in any storage engine
1548
   */
1549
  if (delete_table)
1550
    rm_temporary_table(table_type, table->s->path.str, 
1551
                       table->s->tmp_table == TMP_TABLE_FRM_FILE_ONLY);
1552
  if (free_share)
1553
  {
1554
    free_table_share(table->s);
1555
    my_free((char*) table,MYF(0));
1556
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1557
  return;
1 by brian
clean slate
1558
}
1559
1560
1561
/*
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1562
  Used by ALTER Table when the table is a temporary one. It changes something
1 by brian
clean slate
1563
  only if the ALTER contained a RENAME clause (otherwise, table_name is the old
1564
  name).
1565
  Prepares a table cache key, which is the concatenation of db, table_name and
1566
  thd->slave_proxy_id, separated by '\0'.
1567
*/
1568
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1569
bool rename_temporary_table(THD* thd, Table *table, const char *db,
1 by brian
clean slate
1570
			    const char *table_name)
1571
{
1572
  char *key;
1573
  uint key_length;
1574
  TABLE_SHARE *share= table->s;
327.2.4 by Brian Aker
Refactoring table.h
1575
  TableList table_list;
1 by brian
clean slate
1576
1577
  if (!(key=(char*) alloc_root(&share->mem_root, MAX_DBKEY_LENGTH)))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1578
    return(1);				/* purecov: inspected */
1 by brian
clean slate
1579
1580
  table_list.db= (char*) db;
1581
  table_list.table_name= (char*) table_name;
1582
  key_length= create_table_def_key(thd, key, &table_list, 1);
1583
  share->set_table_cache_key(key, key_length);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1584
  return(0);
1 by brian
clean slate
1585
}
1586
1587
1588
	/* move table first in unused links */
1589
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1590
static void relink_unused(Table *table)
1 by brian
clean slate
1591
{
1592
  if (table != unused_tables)
1593
  {
1594
    table->prev->next=table->next;		/* Remove from unused list */
1595
    table->next->prev=table->prev;
1596
    table->next=unused_tables;			/* Link in unused tables */
1597
    table->prev=unused_tables->prev;
1598
    unused_tables->prev->next=table;
1599
    unused_tables->prev=table;
1600
    unused_tables=table;
1601
  }
1602
}
1603
1604
1605
/**
1606
    Remove all instances of table from thread's open list and
1607
    table cache.
1608
1609
    @param  thd     Thread context
1610
    @param  find    Table to remove
55 by brian
Update for using real bool types.
1611
    @param  unlock  true  - free all locks on tables removed that are
1 by brian
clean slate
1612
                            done with LOCK TABLES
55 by brian
Update for using real bool types.
1613
                    false - otherwise
1 by brian
clean slate
1614
55 by brian
Update for using real bool types.
1615
    @note When unlock parameter is false or current thread doesn't have
1 by brian
clean slate
1616
          any tables locked with LOCK TABLES, tables are assumed to be
1617
          not locked (for example already unlocked).
1618
*/
1619
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1620
void unlink_open_table(THD *thd, Table *find, bool unlock)
1 by brian
clean slate
1621
{
1622
  char key[MAX_DBKEY_LENGTH];
1623
  uint key_length= find->s->table_cache_key.length;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1624
  Table *list, **prev;
1 by brian
clean slate
1625
1626
  safe_mutex_assert_owner(&LOCK_open);
1627
1628
  memcpy(key, find->s->table_cache_key.str, key_length);
1629
  /*
1630
    Note that we need to hold LOCK_open while changing the
1631
    open_tables list. Another thread may work on it.
1632
    (See: remove_table_from_cache(), mysql_wait_completed_table())
1633
    Closing a MERGE child before the parent would be fatal if the
1634
    other thread tries to abort the MERGE lock in between.
1635
  */
1636
  for (prev= &thd->open_tables; *prev; )
1637
  {
1638
    list= *prev;
1639
1640
    if (list->s->table_cache_key.length == key_length &&
1641
	!memcmp(list->s->table_cache_key.str, key, key_length))
1642
    {
1643
      if (unlock && thd->locked_tables)
55 by brian
Update for using real bool types.
1644
        mysql_lock_remove(thd, thd->locked_tables, list, true);
1 by brian
clean slate
1645
1646
      /* Remove table from open_tables list. */
1647
      *prev= list->next;
1648
      /* Close table. */
1649
      VOID(hash_delete(&open_cache,(uchar*) list)); // Close table
1650
    }
1651
    else
1652
    {
1653
      /* Step to next entry in open_tables list. */
1654
      prev= &list->next;
1655
    }
1656
  }
1657
1658
  // Notify any 'refresh' threads
1659
  broadcast_refresh();
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1660
  return;
1 by brian
clean slate
1661
}
1662
1663
1664
/**
1665
    Auxiliary routine which closes and drops open table.
1666
1667
    @param  thd         Thread handle
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1668
    @param  table       Table object for table to be dropped
1 by brian
clean slate
1669
    @param  db_name     Name of database for this table
1670
    @param  table_name  Name of this table
1671
1672
    @note This routine assumes that table to be closed is open only
1673
          by calling thread so we needn't wait until other threads
1674
          will close the table. Also unless called under implicit or
1675
          explicit LOCK TABLES mode it assumes that table to be
1676
          dropped is already unlocked. In the former case it will
1677
          also remove lock on the table. But one should not rely on
1678
          this behaviour as it may change in future.
1679
          Currently, however, this function is never called for a
1680
          table that was locked with LOCK TABLES.
1681
*/
1682
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1683
void drop_open_table(THD *thd, Table *table, const char *db_name,
1 by brian
clean slate
1684
                     const char *table_name)
1685
{
1686
  if (table->s->tmp_table)
1687
    close_temporary_table(thd, table, 1, 1);
1688
  else
1689
  {
1690
    handlerton *table_type= table->s->db_type();
1691
    VOID(pthread_mutex_lock(&LOCK_open));
1692
    /*
1693
      unlink_open_table() also tells threads waiting for refresh or close
1694
      that something has happened.
1695
    */
55 by brian
Update for using real bool types.
1696
    unlink_open_table(thd, table, false);
1 by brian
clean slate
1697
    quick_rm_table(table_type, db_name, table_name, 0);
1698
    VOID(pthread_mutex_unlock(&LOCK_open));
1699
  }
1700
}
1701
1702
1703
/*
1704
   Wait for condition but allow the user to send a kill to mysqld
1705
1706
   SYNOPSIS
1707
     wait_for_condition()
1708
     thd	Thread handler
1709
     mutex	mutex that is currently hold that is associated with condition
1710
	        Will be unlocked on return     
1711
     cond	Condition to wait for
1712
*/
1713
1714
void wait_for_condition(THD *thd, pthread_mutex_t *mutex, pthread_cond_t *cond)
1715
{
1716
  /* Wait until the current table is up to date */
1717
  const char *proc_info;
1718
  thd->mysys_var->current_mutex= mutex;
1719
  thd->mysys_var->current_cond= cond;
322.2.2 by Mats Kindahl
Hiding THD::proc_info field and providing a setter and getter.
1720
  proc_info=thd->get_proc_info();
1 by brian
clean slate
1721
  thd_proc_info(thd, "Waiting for table");
1722
  if (!thd->killed)
1723
    (void) pthread_cond_wait(cond, mutex);
1724
1725
  /*
1726
    We must unlock mutex first to avoid deadlock becasue conditions are
1727
    sent to this thread by doing locks in the following order:
1728
    lock(mysys_var->mutex)
1729
    lock(mysys_var->current_mutex)
1730
1731
    One by effect of this that one can only use wait_for_condition with
1732
    condition variables that are guranteed to not disapper (freed) even if this
1733
    mutex is unlocked
1734
  */
1735
    
1736
  pthread_mutex_unlock(mutex);
1737
  pthread_mutex_lock(&thd->mysys_var->mutex);
1738
  thd->mysys_var->current_mutex= 0;
1739
  thd->mysys_var->current_cond= 0;
1740
  thd_proc_info(thd, proc_info);
1741
  pthread_mutex_unlock(&thd->mysys_var->mutex);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1742
  return;
1 by brian
clean slate
1743
}
1744
1745
1746
/**
1747
  Exclusively name-lock a table that is already write-locked by the
1748
  current thread.
1749
1750
  @param thd current thread context
1751
  @param tables table list containing one table to open.
1752
55 by brian
Update for using real bool types.
1753
  @return false on success, true otherwise.
1 by brian
clean slate
1754
*/
1755
327.2.4 by Brian Aker
Refactoring table.h
1756
bool name_lock_locked_table(THD *thd, TableList *tables)
1 by brian
clean slate
1757
{
1758
  /* Under LOCK TABLES we must only accept write locked tables. */
1759
  tables->table= find_locked_table(thd, tables->db, tables->table_name);
1760
1761
  if (!tables->table)
1762
    my_error(ER_TABLE_NOT_LOCKED, MYF(0), tables->alias);
1763
  else if (tables->table->reginfo.lock_type < TL_WRITE_LOW_PRIORITY)
1764
    my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE, MYF(0), tables->alias);
1765
  else
1766
  {
1767
    /*
1768
      Ensures that table is opened only by this thread and that no
1769
      other statement will open this table.
1770
    */
1771
    wait_while_table_is_used(thd, tables->table, HA_EXTRA_FORCE_REOPEN);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1772
    return(false);
1 by brian
clean slate
1773
  }
1774
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1775
  return(true);
1 by brian
clean slate
1776
}
1777
1778
1779
/*
1780
  Open table which is already name-locked by this thread.
1781
1782
  SYNOPSIS
1783
    reopen_name_locked_table()
1784
      thd         Thread handle
327.2.4 by Brian Aker
Refactoring table.h
1785
      table_list  TableList object for table to be open, TableList::table
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1786
                  member should point to Table object which was used for
1 by brian
clean slate
1787
                  name-locking.
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1788
      link_in     true  - if Table object for table to be opened should be
1 by brian
clean slate
1789
                          linked into THD::open_tables list.
55 by brian
Update for using real bool types.
1790
                  false - placeholder used for name-locking is already in
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1791
                          this list so we only need to preserve Table::next
1 by brian
clean slate
1792
                          pointer.
1793
1794
  NOTE
1795
    This function assumes that its caller already acquired LOCK_open mutex.
1796
1797
  RETURN VALUE
55 by brian
Update for using real bool types.
1798
    false - Success
1799
    true  - Error
1 by brian
clean slate
1800
*/
1801
327.2.4 by Brian Aker
Refactoring table.h
1802
bool reopen_name_locked_table(THD* thd, TableList* table_list, bool link_in)
1 by brian
clean slate
1803
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1804
  Table *table= table_list->table;
1 by brian
clean slate
1805
  TABLE_SHARE *share;
1806
  char *table_name= table_list->table_name;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1807
  Table orig_table;
1 by brian
clean slate
1808
1809
  safe_mutex_assert_owner(&LOCK_open);
1810
1811
  if (thd->killed || !table)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1812
    return(true);
1 by brian
clean slate
1813
1814
  orig_table= *table;
1815
1816
  if (open_unireg_entry(thd, table, table_list, table_name,
1817
                        table->s->table_cache_key.str,
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
1818
                        table->s->table_cache_key.length))
1 by brian
clean slate
1819
  {
1820
    intern_close_table(table);
1821
    /*
1822
      If there was an error during opening of table (for example if it
1823
      does not exist) '*table' object can be wiped out. To be able
1824
      properly release name-lock in this case we should restore this
1825
      object to its original state.
1826
    */
1827
    *table= orig_table;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1828
    return(true);
1 by brian
clean slate
1829
  }
1830
1831
  share= table->s;
1832
  /*
1833
    We want to prevent other connections from opening this table until end
1834
    of statement as it is likely that modifications of table's metadata are
1835
    not yet finished (for example CREATE TRIGGER have to change .TRG file,
1836
    or we might want to drop table if CREATE TABLE ... SELECT fails).
1837
    This also allows us to assume that no other connection will sneak in
1838
    before we will get table-level lock on this table.
1839
  */
1840
  share->version=0;
1841
  table->in_use = thd;
1842
1843
  if (link_in)
1844
  {
1845
    table->next= thd->open_tables;
1846
    thd->open_tables= table;
1847
  }
1848
  else
1849
  {
1850
    /*
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1851
      Table object should be already in THD::open_tables list so we just
1852
      need to set Table::next correctly.
1 by brian
clean slate
1853
    */
1854
    table->next= orig_table.next;
1855
  }
1856
1857
  table->tablenr=thd->current_tablenr++;
1858
  table->used_fields=0;
1859
  table->const_table=0;
274 by Brian Aker
my_bool conversion in Table
1860
  table->null_row= false;
1861
  table->maybe_null= false;
1862
  table->force_index= false;
1 by brian
clean slate
1863
  table->status=STATUS_NO_RECORD;
274 by Brian Aker
my_bool conversion in Table
1864
  return false;
1 by brian
clean slate
1865
}
1866
1867
1868
/**
1869
    Create and insert into table cache placeholder for table
1870
    which will prevent its opening (or creation) (a.k.a lock
1871
    table name).
1872
1873
    @param thd         Thread context
1874
    @param key         Table cache key for name to be locked
1875
    @param key_length  Table cache key length
1876
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1877
    @return Pointer to Table object used for name locking or 0 in
1 by brian
clean slate
1878
            case of failure.
1879
*/
1880
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1881
Table *table_cache_insert_placeholder(THD *thd, const char *key,
1 by brian
clean slate
1882
                                      uint key_length)
1883
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1884
  Table *table;
1 by brian
clean slate
1885
  TABLE_SHARE *share;
1886
  char *key_buff;
1887
1888
  safe_mutex_assert_owner(&LOCK_open);
1889
1890
  /*
1891
    Create a table entry with the right key and with an old refresh version
1892
    Note that we must use my_multi_malloc() here as this is freed by the
1893
    table cache
1894
  */
1895
  if (!my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
1896
                       &table, sizeof(*table),
1897
                       &share, sizeof(*share),
1898
                       &key_buff, key_length,
1899
                       NULL))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1900
    return(NULL);
1 by brian
clean slate
1901
1902
  table->s= share;
1903
  share->set_table_cache_key(key_buff, key, key_length);
1904
  share->tmp_table= INTERNAL_TMP_TABLE;  // for intern_close_table
1905
  table->in_use= thd;
1906
  table->locked_by_name=1;
1907
1908
  if (my_hash_insert(&open_cache, (uchar*)table))
1909
  {
1910
    my_free((uchar*) table, MYF(0));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1911
    return(NULL);
1 by brian
clean slate
1912
  }
1913
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1914
  return(table);
1 by brian
clean slate
1915
}
1916
1917
1918
/**
1919
    Obtain an exclusive name lock on the table if it is not cached
1920
    in the table cache.
1921
1922
    @param      thd         Thread context
1923
    @param      db          Name of database
1924
    @param      table_name  Name of table
1925
    @param[out] table       Out parameter which is either:
1926
                            - set to NULL if table cache contains record for
1927
                              the table or
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1928
                            - set to point to the Table instance used for
1 by brian
clean slate
1929
                              name-locking.
1930
1931
    @note This function takes into account all records for table in table
1932
          cache, even placeholders used for name-locking. This means that
1933
          'table' parameter can be set to NULL for some situations when
1934
          table does not really exist.
1935
55 by brian
Update for using real bool types.
1936
    @retval  true   Error occured (OOM)
1937
    @retval  false  Success. 'table' parameter set according to above rules.
1 by brian
clean slate
1938
*/
1939
1940
bool lock_table_name_if_not_cached(THD *thd, const char *db,
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
1941
                                   const char *table_name, Table **table)
1 by brian
clean slate
1942
{
1943
  char key[MAX_DBKEY_LENGTH];
1944
  uint key_length;
1945
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
1946
  key_length= (uint)(stpcpy(stpcpy(key, db) + 1, table_name) - key) + 1;
1 by brian
clean slate
1947
  VOID(pthread_mutex_lock(&LOCK_open));
1948
1949
  if (hash_search(&open_cache, (uchar *)key, key_length))
1950
  {
1951
    VOID(pthread_mutex_unlock(&LOCK_open));
1952
    *table= 0;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1953
    return(false);
1 by brian
clean slate
1954
  }
1955
  if (!(*table= table_cache_insert_placeholder(thd, key, key_length)))
1956
  {
1957
    VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1958
    return(true);
1 by brian
clean slate
1959
  }
1960
  (*table)->open_placeholder= 1;
1961
  (*table)->next= thd->open_tables;
1962
  thd->open_tables= *table;
1963
  VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1964
  return(false);
1 by brian
clean slate
1965
}
1966
1967
1968
/**
1969
    Check that table exists in table definition cache, on disk
1970
    or in some storage engine.
1971
1972
    @param       thd     Thread context
1973
    @param       table   Table list element
55 by brian
Update for using real bool types.
1974
    @param[out]  exists  Out parameter which is set to true if table
1975
                         exists and to false otherwise.
1 by brian
clean slate
1976
1977
    @note This function assumes that caller owns LOCK_open mutex.
1978
          It also assumes that the fact that there are no name-locks
1979
          on the table was checked beforehand.
1980
1981
    @note If there is no .FRM file for the table but it exists in one
1982
          of engines (e.g. it was created on another node of NDB cluster)
1983
          this function will fetch and create proper .FRM file for it.
1984
55 by brian
Update for using real bool types.
1985
    @retval  true   Some error occured
1986
    @retval  false  No error. 'exists' out parameter set accordingly.
1 by brian
clean slate
1987
*/
1988
327.2.4 by Brian Aker
Refactoring table.h
1989
bool check_if_table_exists(THD *thd, TableList *table, bool *exists)
1 by brian
clean slate
1990
{
1991
  char path[FN_REFLEN];
1992
  int rc;
1993
1994
  safe_mutex_assert_owner(&LOCK_open);
1995
55 by brian
Update for using real bool types.
1996
  *exists= true;
1 by brian
clean slate
1997
1998
  if (get_cached_table_share(table->db, table->table_name))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1999
    return(false);
1 by brian
clean slate
2000
2001
  build_table_filename(path, sizeof(path) - 1, table->db, table->table_name,
2002
                       reg_ext, 0);
2003
2004
  if (!access(path, F_OK))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2005
    return(false);
1 by brian
clean slate
2006
2007
  /* .FRM file doesn't exist. Check if some engine can provide it. */
2008
2009
  rc= ha_create_table_from_engine(thd, table->db, table->table_name);
2010
2011
  if (rc < 0)
2012
  {
2013
    /* Table does not exists in engines as well. */
55 by brian
Update for using real bool types.
2014
    *exists= false;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2015
    return(false);
1 by brian
clean slate
2016
  }
2017
  else if (!rc)
2018
  {
2019
    /* Table exists in some engine and .FRM for it was created. */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2020
    return(false);
1 by brian
clean slate
2021
  }
2022
  else /* (rc > 0) */
2023
  {
2024
    my_printf_error(ER_UNKNOWN_ERROR, "Failed to open '%-.64s', error while "
2025
                    "unpacking from engine", MYF(0), table->table_name);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2026
    return(true);
1 by brian
clean slate
2027
  }
2028
}
2029
2030
2031
/*
2032
  Open a table.
2033
2034
  SYNOPSIS
2035
    open_table()
2036
    thd                 Thread context.
2037
    table_list          Open first table in list.
2038
    refresh      INOUT  Pointer to memory that will be set to 1 if
2039
                        we need to close all tables and reopen them.
2040
                        If this is a NULL pointer, then the table is not
2041
                        put in the thread-open-list.
2042
    flags               Bitmap of flags to modify how open works:
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2043
                          DRIZZLE_LOCK_IGNORE_FLUSH - Open table even if
1 by brian
clean slate
2044
                          someone has done a flush or namelock on it.
2045
                          No version number checking is done.
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2046
                          DRIZZLE_OPEN_TEMPORARY_ONLY - Open only temporary
1 by brian
clean slate
2047
                          table not the base table or view.
2048
2049
  IMPLEMENTATION
2050
    Uses a cache of open tables to find a table not in use.
2051
2052
    If table list element for the table to be opened has "create" flag
2053
    set and table does not exist, this function will automatically insert
2054
    a placeholder for exclusive name lock into the open tables cache and
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2055
    will return the Table instance that corresponds to this placeholder.
1 by brian
clean slate
2056
2057
  RETURN
2058
    NULL  Open failed.  If refresh is set then one should close
2059
          all other tables and retry the open.
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2060
    #     Success. Pointer to Table object for open table.
1 by brian
clean slate
2061
*/
2062
2063
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
2064
Table *open_table(THD *thd, TableList *table_list, bool *refresh, uint flags)
1 by brian
clean slate
2065
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2066
  register Table *table;
1 by brian
clean slate
2067
  char key[MAX_DBKEY_LENGTH];
2068
  unsigned int key_length;
2069
  char *alias= table_list->alias;
2070
  HASH_SEARCH_STATE state;
2071
2072
  /* Parsing of partitioning information from .frm needs thd->lex set up. */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2073
  assert(thd->lex->is_lex_started);
1 by brian
clean slate
2074
2075
  /* find a unused table in the open table cache */
2076
  if (refresh)
2077
    *refresh=0;
2078
2079
  /* an open table operation needs a lot of the stack space */
2080
  if (check_stack_overrun(thd, STACK_MIN_SIZE_FOR_OPEN, (uchar *)&alias))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2081
    return(0);
1 by brian
clean slate
2082
2083
  if (thd->killed)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2084
    return(0);
1 by brian
clean slate
2085
2086
  key_length= (create_table_def_key(thd, key, table_list, 1) -
2087
               TMP_TABLE_KEY_EXTRA);
2088
2089
  /*
2090
    Unless requested otherwise, try to resolve this table in the list
2091
    of temporary tables of this thread. In MySQL temporary tables
2092
    are always thread-local and "shadow" possible base tables with the
2093
    same name. This block implements the behaviour.
2094
    TODO: move this block into a separate function.
2095
  */
2096
  {
2097
    for (table= thd->temporary_tables; table ; table=table->next)
2098
    {
2099
      if (table->s->table_cache_key.length == key_length +
2100
          TMP_TABLE_KEY_EXTRA &&
2101
	  !memcmp(table->s->table_cache_key.str, key,
2102
		  key_length + TMP_TABLE_KEY_EXTRA))
2103
      {
2104
        /*
2105
          We're trying to use the same temporary table twice in a query.
2106
          Right now we don't support this because a temporary table
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2107
          is always represented by only one Table object in THD, and
1 by brian
clean slate
2108
          it can not be cloned. Emit an error for an unsupported behaviour.
2109
        */
2110
	if (table->query_id)
2111
	{
2112
	  my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2113
	  return(0);
1 by brian
clean slate
2114
	}
2115
	table->query_id= thd->query_id;
55 by brian
Update for using real bool types.
2116
	thd->thread_specific_used= true;
1 by brian
clean slate
2117
        goto reset;
2118
      }
2119
    }
2120
  }
2121
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2122
  if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1 by brian
clean slate
2123
  {
2124
    my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2125
    return(0);
1 by brian
clean slate
2126
  }
2127
2128
  /*
2129
    The table is not temporary - if we're in pre-locked or LOCK TABLES
2130
    mode, let's try to find the requested table in the list of pre-opened
2131
    and locked tables. If the table is not there, return an error - we can't
2132
    open not pre-opened tables in pre-locked/LOCK TABLES mode.
2133
    TODO: move this block into a separate function.
2134
  */
2135
  if (thd->locked_tables)
2136
  {						// Using table locks
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2137
    Table *best_table= 0;
1 by brian
clean slate
2138
    int best_distance= INT_MIN;
2139
    bool check_if_used= false;
2140
    for (table=thd->open_tables; table ; table=table->next)
2141
    {
2142
      if (table->s->table_cache_key.length == key_length &&
2143
	  !memcmp(table->s->table_cache_key.str, key, key_length))
2144
      {
2145
        if (check_if_used && table->query_id &&
2146
            table->query_id != thd->query_id)
2147
        {
2148
          /*
2149
            If we are in stored function or trigger we should ensure that
2150
            we won't change table that is already used by calling statement.
2151
            So if we are opening table for writing, we should check that it
2152
            is not already open by some calling stamement.
2153
          */
2154
          my_error(ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG, MYF(0),
2155
                   table->s->table_name.str);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2156
          return(0);
1 by brian
clean slate
2157
        }
2158
        /*
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2159
          When looking for a usable Table, ignore MERGE children, as they
1 by brian
clean slate
2160
          belong to their parent and cannot be used explicitly.
2161
        */
2162
        if (!my_strcasecmp(system_charset_info, table->alias, alias) &&
2163
            table->query_id != thd->query_id)  /* skip tables already used */
2164
        {
2165
          int distance= ((int) table->reginfo.lock_type -
2166
                         (int) table_list->lock_type);
2167
          /*
2168
            Find a table that either has the exact lock type requested,
2169
            or has the best suitable lock. In case there is no locked
2170
            table that has an equal or higher lock than requested,
2171
            we us the closest matching lock to be able to produce an error
2172
            message about wrong lock mode on the table. The best_table
2173
            is changed if bd < 0 <= d or bd < d < 0 or 0 <= d < bd.
2174
2175
            distance <  0 - No suitable lock found
2176
            distance >  0 - we have lock mode higher then we require
2177
            distance == 0 - we have lock mode exactly which we need
2178
          */
2179
          if ((best_distance < 0 && distance > best_distance) || (distance >= 0 && distance < best_distance))
2180
          {
2181
            best_distance= distance;
2182
            best_table= table;
2183
            if (best_distance == 0 && !check_if_used)
2184
            {
2185
              /*
2186
                If we have found perfect match and we don't need to check that
2187
                table is not used by one of calling statements (assuming that
2188
                we are inside of function or trigger) we can finish iterating
2189
                through open tables list.
2190
              */
2191
              break;
2192
            }
2193
          }
2194
        }
2195
      }
2196
    }
2197
    if (best_table)
2198
    {
2199
      table= best_table;
2200
      table->query_id= thd->query_id;
2201
      goto reset;
2202
    }
2203
    /*
2204
      No table in the locked tables list. In case of explicit LOCK TABLES
2205
      this can happen if a user did not include the able into the list.
2206
      In case of pre-locked mode locked tables list is generated automatically,
2207
      so we may only end up here if the table did not exist when
2208
      locked tables list was created.
2209
    */
2210
    my_error(ER_TABLE_NOT_LOCKED, MYF(0), alias);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2211
    return(0);
1 by brian
clean slate
2212
  }
2213
2214
  /*
2215
    Non pre-locked/LOCK TABLES mode, and the table is not temporary:
2216
    this is the normal use case.
2217
    Now we should:
2218
    - try to find the table in the table cache.
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2219
    - if one of the discovered Table instances is name-locked
1 by brian
clean slate
2220
      (table->s->version == 0) or some thread has started FLUSH TABLES
2221
      (refresh_version > table->s->version), back off -- we have to wait
2222
      until no one holds a name lock on the table.
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2223
    - if there is no such Table in the name cache, read the table definition
1 by brian
clean slate
2224
    and insert it into the cache.
2225
    We perform all of the above under LOCK_open which currently protects
2226
    the open cache (also known as table cache) and table definitions stored
2227
    on disk.
2228
  */
2229
2230
  VOID(pthread_mutex_lock(&LOCK_open));
2231
2232
  /*
2233
    If it's the first table from a list of tables used in a query,
2234
    remember refresh_version (the version of open_cache state).
2235
    If the version changes while we're opening the remaining tables,
2236
    we will have to back off, close all the tables opened-so-far,
2237
    and try to reopen them.
2238
    Note: refresh_version is currently changed only during FLUSH TABLES.
2239
  */
2240
  if (!thd->open_tables)
2241
    thd->version=refresh_version;
2242
  else if ((thd->version != refresh_version) &&
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2243
           ! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1 by brian
clean slate
2244
  {
2245
    /* Someone did a refresh while thread was opening tables */
2246
    if (refresh)
2247
      *refresh=1;
2248
    VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2249
    return(0);
1 by brian
clean slate
2250
  }
2251
2252
  /*
2253
    In order for the back off and re-start process to work properly,
2254
    handler tables having old versions (due to FLUSH TABLES or pending
2255
    name-lock) MUST be closed. This is specially important if a name-lock
2256
    is pending for any table of the handler_tables list, otherwise a
2257
    deadlock may occur.
2258
  */
2259
  if (thd->handler_tables)
2260
    mysql_ha_flush(thd);
2261
2262
  /*
2263
    Actually try to find the table in the open_cache.
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2264
    The cache may contain several "Table" instances for the same
1 by brian
clean slate
2265
    physical table. The instances that are currently "in use" by
2266
    some thread have their "in_use" member != NULL.
2267
    There is no good reason for having more than one entry in the
2268
    hash for the same physical table, except that we use this as
2269
    an implicit "pending locks queue" - see
2270
    wait_for_locked_table_names for details.
2271
  */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2272
  for (table= (Table*) hash_first(&open_cache, (uchar*) key, key_length,
1 by brian
clean slate
2273
                                  &state);
2274
       table && table->in_use ;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2275
       table= (Table*) hash_next(&open_cache, (uchar*) key, key_length,
1 by brian
clean slate
2276
                                 &state))
2277
  {
2278
    /*
2279
      Here we flush tables marked for flush.
2280
      Normally, table->s->version contains the value of
2281
      refresh_version from the moment when this table was
2282
      (re-)opened and added to the cache.
2283
      If since then we did (or just started) FLUSH TABLES
2284
      statement, refresh_version has been increased.
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2285
      For "name-locked" Table instances, table->s->version is set
1 by brian
clean slate
2286
      to 0 (see lock_table_name for details).
2287
      In case there is a pending FLUSH TABLES or a name lock, we
2288
      need to back off and re-start opening tables.
2289
      If we do not back off now, we may dead lock in case of lock
2290
      order mismatch with some other thread:
2291
      c1: name lock t1; -- sort of exclusive lock 
2292
      c2: open t2;      -- sort of shared lock
2293
      c1: name lock t2; -- blocks
2294
      c2: open t1; -- blocks
2295
    */
2296
    if (table->needs_reopen_or_name_lock())
2297
    {
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2298
      if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1 by brian
clean slate
2299
      {
2300
        /* Force close at once after usage */
2301
        thd->version= table->s->version;
2302
        continue;
2303
      }
2304
2305
      /* Avoid self-deadlocks by detecting self-dependencies. */
2306
      if (table->open_placeholder && table->in_use == thd)
2307
      {
2308
	VOID(pthread_mutex_unlock(&LOCK_open));
2309
        my_error(ER_UPDATE_TABLE_USED, MYF(0), table->s->table_name.str);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2310
        return(0);
1 by brian
clean slate
2311
      }
2312
2313
      /*
2314
        Back off, part 1: mark the table as "unused" for the
2315
        purpose of name-locking by setting table->db_stat to 0. Do
2316
        that only for the tables in this thread that have an old
2317
        table->s->version (this is an optimization (?)).
2318
        table->db_stat == 0 signals wait_for_locked_table_names
2319
        that the tables in question are not used any more. See
2320
        table_is_used call for details.
2321
2322
        Notice that HANDLER tables were already taken care of by
2323
        the earlier call to mysql_ha_flush() in this same critical
2324
        section.
2325
      */
2326
      close_old_data_files(thd,thd->open_tables,0,0);
2327
      /*
2328
        Back-off part 2: try to avoid "busy waiting" on the table:
2329
        if the table is in use by some other thread, we suspend
2330
        and wait till the operation is complete: when any
2331
        operation that juggles with table->s->version completes,
2332
        it broadcasts COND_refresh condition variable.
2333
        If 'old' table we met is in use by current thread we return
2334
        without waiting since in this situation it's this thread
2335
        which is responsible for broadcasting on COND_refresh
2336
        (and this was done already in close_old_data_files()).
2337
        Good example of such situation is when we have statement
2338
        that needs two instances of table and FLUSH TABLES comes
2339
        after we open first instance but before we open second
2340
        instance.
2341
      */
2342
      if (table->in_use != thd)
2343
      {
2344
        /* wait_for_conditionwill unlock LOCK_open for us */
2345
        wait_for_condition(thd, &LOCK_open, &COND_refresh);
2346
      }
2347
      else
2348
      {
2349
	VOID(pthread_mutex_unlock(&LOCK_open));
2350
      }
2351
      /*
2352
        There is a refresh in progress for this table.
2353
        Signal the caller that it has to try again.
2354
      */
2355
      if (refresh)
2356
	*refresh=1;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2357
      return(0);
1 by brian
clean slate
2358
    }
2359
  }
2360
  if (table)
2361
  {
2362
    /* Unlink the table from "unused_tables" list. */
2363
    if (table == unused_tables)
2364
    {						// First unused
2365
      unused_tables=unused_tables->next;	// Remove from link
2366
      if (table == unused_tables)
2367
	unused_tables=0;
2368
    }
2369
    table->prev->next=table->next;		/* Remove from unused list */
2370
    table->next->prev=table->prev;
2371
    table->in_use= thd;
2372
  }
2373
  else
2374
  {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2375
    /* Insert a new Table instance into the open cache */
1 by brian
clean slate
2376
    int error;
2377
    /* Free cache if too big */
2378
    while (open_cache.records > table_cache_size && unused_tables)
2379
      VOID(hash_delete(&open_cache,(uchar*) unused_tables)); /* purecov: tested */
2380
2381
    if (table_list->create)
2382
    {
2383
      bool exists;
2384
2385
      if (check_if_table_exists(thd, table_list, &exists))
2386
      {
2387
        VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2388
        return(NULL);
1 by brian
clean slate
2389
      }
2390
2391
      if (!exists)
2392
      {
2393
        /*
2394
          Table to be created, so we need to create placeholder in table-cache.
2395
        */
2396
        if (!(table= table_cache_insert_placeholder(thd, key, key_length)))
2397
        {
2398
          VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2399
          return(NULL);
1 by brian
clean slate
2400
        }
2401
        /*
2402
          Link placeholder to the open tables list so it will be automatically
2403
          removed once tables are closed. Also mark it so it won't be ignored
2404
          by other trying to take name-lock.
2405
        */
2406
        table->open_placeholder= 1;
2407
        table->next= thd->open_tables;
2408
        thd->open_tables= table;
2409
        VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2410
        return(table);
1 by brian
clean slate
2411
      }
2412
      /* Table exists. Let us try to open it. */
2413
    }
2414
2415
    /* make a new table */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2416
    if (!(table=(Table*) my_malloc(sizeof(*table),MYF(MY_WME))))
1 by brian
clean slate
2417
    {
2418
      VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2419
      return(NULL);
1 by brian
clean slate
2420
    }
2421
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
2422
    error= open_unireg_entry(thd, table, table_list, alias, key, key_length);
1 by brian
clean slate
2423
    /* Combine the follow two */
2424
    if (error > 0)
2425
    {
2426
      my_free((uchar*)table, MYF(0));
2427
      VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2428
      return(NULL);
1 by brian
clean slate
2429
    }
2430
    if (error < 0)
2431
    {
2432
      my_free((uchar*)table, MYF(0));
2433
      VOID(pthread_mutex_unlock(&LOCK_open));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2434
      return(0); // VIEW
1 by brian
clean slate
2435
    }
2436
    VOID(my_hash_insert(&open_cache,(uchar*) table));
2437
  }
2438
2439
  VOID(pthread_mutex_unlock(&LOCK_open));
2440
  if (refresh)
2441
  {
2442
    table->next=thd->open_tables;		/* Link into simple list */
2443
    thd->open_tables=table;
2444
  }
2445
  table->reginfo.lock_type=TL_READ;		/* Assume read */
2446
2447
 reset:
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2448
  assert(table->s->ref_count > 0 || table->s->tmp_table != NO_TMP_TABLE);
1 by brian
clean slate
2449
2450
  if (thd->lex->need_correct_ident())
2451
    table->alias_name_used= my_strcasecmp(table_alias_charset,
2452
                                          table->s->table_name.str, alias);
2453
  /* Fix alias if table name changes */
2454
  if (strcmp(table->alias, alias))
2455
  {
2456
    uint length=(uint) strlen(alias)+1;
2457
    table->alias= (char*) my_realloc((char*) table->alias, length,
2458
                                     MYF(MY_WME));
212.6.7 by Mats Kindahl
Minor compile issue fixed.
2459
    memcpy((void*) table->alias, alias, length);
1 by brian
clean slate
2460
  }
2461
  /* These variables are also set in reopen_table() */
2462
  table->tablenr=thd->current_tablenr++;
2463
  table->used_fields=0;
2464
  table->const_table=0;
274 by Brian Aker
my_bool conversion in Table
2465
  table->null_row= false;
2466
  table->maybe_null= false;
2467
  table->force_index= false;
1 by brian
clean slate
2468
  table->status=STATUS_NO_RECORD;
2469
  table->insert_values= 0;
2470
  /* Catch wrong handling of the auto_increment_field_not_null. */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2471
  assert(!table->auto_increment_field_not_null);
55 by brian
Update for using real bool types.
2472
  table->auto_increment_field_not_null= false;
1 by brian
clean slate
2473
  if (table->timestamp_field)
2474
    table->timestamp_field_type= table->timestamp_field->get_auto_set_type();
2475
  table->pos_in_table_list= table_list;
2476
  table->clear_column_bitmaps();
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2477
  assert(table->key_read == 0);
2478
  return(table);
1 by brian
clean slate
2479
}
2480
2481
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2482
Table *find_locked_table(THD *thd, const char *db,const char *table_name)
1 by brian
clean slate
2483
{
2484
  char	key[MAX_DBKEY_LENGTH];
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
2485
  uint key_length=(uint) (stpcpy(stpcpy(key,db)+1,table_name)-key)+1;
1 by brian
clean slate
2486
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2487
  for (Table *table=thd->open_tables; table ; table=table->next)
1 by brian
clean slate
2488
  {
2489
    if (table->s->table_cache_key.length == key_length &&
2490
	!memcmp(table->s->table_cache_key.str, key, key_length))
2491
      return table;
2492
  }
2493
  return(0);
2494
}
2495
2496
2497
/*
2498
  Reopen an table because the definition has changed.
2499
2500
  SYNOPSIS
2501
    reopen_table()
2502
    table	Table object
2503
2504
  NOTES
2505
   The data file for the table is already closed and the share is released
2506
   The table has a 'dummy' share that mainly contains database and table name.
2507
2508
 RETURN
2509
   0  ok
2510
   1  error. The old table object is not changed.
2511
*/
2512
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2513
bool reopen_table(Table *table)
1 by brian
clean slate
2514
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2515
  Table tmp;
1 by brian
clean slate
2516
  bool error= 1;
2517
  Field **field;
2518
  uint key,part;
327.2.4 by Brian Aker
Refactoring table.h
2519
  TableList table_list;
1 by brian
clean slate
2520
  THD *thd= table->in_use;
2521
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2522
  assert(table->s->ref_count == 0);
2523
  assert(!table->sort.io_cache);
1 by brian
clean slate
2524
2525
#ifdef EXTRA_DEBUG
2526
  if (table->db_stat)
338 by Monty Taylor
Tagged more strings.
2527
    sql_print_error(_("Table %s had a open data handler in reopen_table"),
1 by brian
clean slate
2528
		    table->alias);
2529
#endif
327.2.4 by Brian Aker
Refactoring table.h
2530
  memset(&table_list, 0, sizeof(TableList));
1 by brian
clean slate
2531
  table_list.db=         table->s->db.str;
2532
  table_list.table_name= table->s->table_name.str;
2533
  table_list.table=      table;
2534
2535
  if (wait_for_locked_table_names(thd, &table_list))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2536
    return(1);                             // Thread was killed
1 by brian
clean slate
2537
2538
  if (open_unireg_entry(thd, &tmp, &table_list,
2539
			table->alias,
2540
                        table->s->table_cache_key.str,
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
2541
                        table->s->table_cache_key.length))
1 by brian
clean slate
2542
    goto end;
2543
2544
  /* This list copies variables set by open_table */
2545
  tmp.tablenr=		table->tablenr;
2546
  tmp.used_fields=	table->used_fields;
2547
  tmp.const_table=	table->const_table;
2548
  tmp.null_row=		table->null_row;
2549
  tmp.maybe_null=	table->maybe_null;
2550
  tmp.status=		table->status;
2551
2552
  tmp.s->table_map_id=  table->s->table_map_id;
2553
2554
  /* Get state */
2555
  tmp.in_use=    	thd;
2556
  tmp.reginfo.lock_type=table->reginfo.lock_type;
2557
2558
  /* Replace table in open list */
2559
  tmp.next=		table->next;
2560
  tmp.prev=		table->prev;
2561
2562
  if (table->file)
2563
    VOID(closefrm(table, 1));		// close file, free everything
2564
2565
  *table= tmp;
2566
  table->default_column_bitmaps();
2567
  table->file->change_table_ptr(table, table->s);
2568
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2569
  assert(table->alias != 0);
1 by brian
clean slate
2570
  for (field=table->field ; *field ; field++)
2571
  {
2572
    (*field)->table= (*field)->orig_table= table;
2573
    (*field)->table_name= &table->alias;
2574
  }
2575
  for (key=0 ; key < table->s->keys ; key++)
2576
  {
2577
    for (part=0 ; part < table->key_info[key].usable_key_parts ; part++)
2578
      table->key_info[key].key_part[part].field->table= table;
2579
  }
2580
  /*
2581
    Do not attach MERGE children here. The children might be reopened
2582
    after the parent. Attach children after reopening all tables that
2583
    require reopen. See for example reopen_tables().
2584
  */
2585
2586
  broadcast_refresh();
2587
  error=0;
2588
2589
 end:
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2590
  return(error);
1 by brian
clean slate
2591
}
2592
2593
2594
/**
2595
    Close all instances of a table open by this thread and replace
2596
    them with exclusive name-locks.
2597
2598
    @param thd        Thread context
2599
    @param db         Database name for the table to be closed
2600
    @param table_name Name of the table to be closed
2601
2602
    @note This function assumes that if we are not under LOCK TABLES,
2603
          then there is only one table open and locked. This means that
2604
          the function probably has to be adjusted before it can be used
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2605
          anywhere outside ALTER Table.
1 by brian
clean slate
2606
2607
    @note Must not use TABLE_SHARE::table_name/db of the table being closed,
2608
          the strings are used in a loop even after the share may be freed.
2609
*/
2610
2611
void close_data_files_and_morph_locks(THD *thd, const char *db,
2612
                                      const char *table_name)
2613
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2614
  Table *table;
1 by brian
clean slate
2615
2616
  safe_mutex_assert_owner(&LOCK_open);
2617
2618
  if (thd->lock)
2619
  {
2620
    /*
2621
      If we are not under LOCK TABLES we should have only one table
2622
      open and locked so it makes sense to remove the lock at once.
2623
    */
2624
    mysql_unlock_tables(thd, thd->lock);
2625
    thd->lock= 0;
2626
  }
2627
2628
  /*
2629
    Note that open table list may contain a name-lock placeholder
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2630
    for target table name if we process ALTER Table ... RENAME.
1 by brian
clean slate
2631
    So loop below makes sense even if we are not under LOCK TABLES.
2632
  */
2633
  for (table=thd->open_tables; table ; table=table->next)
2634
  {
2635
    if (!strcmp(table->s->table_name.str, table_name) &&
2636
	!strcmp(table->s->db.str, db))
2637
    {
2638
      if (thd->locked_tables)
2639
      {
55 by brian
Update for using real bool types.
2640
        mysql_lock_remove(thd, thd->locked_tables, table, true);
1 by brian
clean slate
2641
      }
2642
      table->open_placeholder= 1;
2643
      close_handle_and_leave_table_as_lock(table);
2644
    }
2645
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2646
  return;
1 by brian
clean slate
2647
}
2648
2649
2650
/**
2651
    Reopen all tables with closed data files.
2652
2653
    @param thd         Thread context
2654
    @param get_locks   Should we get locks after reopening tables ?
2655
    @param mark_share_as_old  Mark share as old to protect from a impending
2656
                              global read lock.
2657
2658
    @note Since this function can't properly handle prelocking and
2659
          create placeholders it should be used in very special
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2660
          situations like FLUSH TABLES or ALTER Table. In general
1 by brian
clean slate
2661
          case one should just repeat open_tables()/lock_tables()
2662
          combination when one needs tables to be reopened (for
2663
          example see open_and_lock_tables()).
2664
2665
    @note One should have lock on LOCK_open when calling this.
2666
55 by brian
Update for using real bool types.
2667
    @return false in case of success, true - otherwise.
1 by brian
clean slate
2668
*/
2669
2670
bool reopen_tables(THD *thd, bool get_locks, bool mark_share_as_old)
2671
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2672
  Table *table,*next,**prev;
2673
  Table **tables,**tables_ptr;			// For locks
1 by brian
clean slate
2674
  bool error=0, not_used;
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2675
  const uint flags= DRIZZLE_LOCK_NOTIFY_IF_NEED_REOPEN |
2676
                    DRIZZLE_LOCK_IGNORE_GLOBAL_READ_LOCK |
2677
                    DRIZZLE_LOCK_IGNORE_FLUSH;
1 by brian
clean slate
2678
2679
  if (!thd->open_tables)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2680
    return(0);
1 by brian
clean slate
2681
2682
  safe_mutex_assert_owner(&LOCK_open);
2683
  if (get_locks)
2684
  {
2685
    /*
2686
      The ptr is checked later
2687
      Do not handle locks of MERGE children.
2688
    */
2689
    uint opens=0;
2690
    for (table= thd->open_tables; table ; table=table->next)
2691
      opens++;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2692
    tables= (Table**) my_alloca(sizeof(Table*)*opens);
1 by brian
clean slate
2693
  }
2694
  else
2695
    tables= &thd->open_tables;
2696
  tables_ptr =tables;
2697
2698
  prev= &thd->open_tables;
2699
  for (table=thd->open_tables; table ; table=next)
2700
  {
2701
    uint db_stat=table->db_stat;
2702
    next=table->next;
2703
    if (!tables || (!db_stat && reopen_table(table)))
2704
    {
2705
      my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
2706
      VOID(hash_delete(&open_cache,(uchar*) table));
2707
      error=1;
2708
    }
2709
    else
2710
    {
2711
      *prev= table;
2712
      prev= &table->next;
2713
      /* Do not handle locks of MERGE children. */
2714
      if (get_locks && !db_stat)
2715
	*tables_ptr++= table;			// need new lock on this
2716
      if (mark_share_as_old)
2717
      {
2718
	table->s->version=0;
2719
	table->open_placeholder= 0;
2720
      }
2721
    }
2722
  }
2723
  *prev=0;
2724
  if (tables != tables_ptr)			// Should we get back old locks
2725
  {
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
2726
    DRIZZLE_LOCK *lock;
1 by brian
clean slate
2727
    /*
2728
      We should always get these locks. Anyway, we must not go into
2729
      wait_for_tables() as it tries to acquire LOCK_open, which is
2730
      already locked.
2731
    */
2732
    thd->some_tables_deleted=0;
2733
    if ((lock= mysql_lock_tables(thd, tables, (uint) (tables_ptr - tables),
2734
                                 flags, &not_used)))
2735
    {
2736
      thd->locked_tables=mysql_lock_merge(thd->locked_tables,lock);
2737
    }
2738
    else
2739
    {
2740
      /*
2741
        This case should only happen if there is a bug in the reopen logic.
2742
        Need to issue error message to have a reply for the application.
2743
        Not exactly what happened though, but close enough.
2744
      */
2745
      my_error(ER_LOCK_DEADLOCK, MYF(0));
2746
      error=1;
2747
    }
2748
  }
2749
  if (get_locks && tables)
2750
  {
2751
    my_afree((uchar*) tables);
2752
  }
2753
  broadcast_refresh();
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2754
  return(error);
1 by brian
clean slate
2755
}
2756
2757
2758
/**
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2759
    Close handlers for tables in list, but leave the Table structure
1 by brian
clean slate
2760
    intact so that we can re-open these quickly.
2761
2762
    @param thd           Thread context
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2763
    @param table         Head of the list of Table objects
55 by brian
Update for using real bool types.
2764
    @param morph_locks   true  - remove locks which we have on tables being closed
1 by brian
clean slate
2765
                                 but ensure that no DML or DDL will sneak in before
2766
                                 we will re-open the table (i.e. temporarily morph
2767
                                 our table-level locks into name-locks).
55 by brian
Update for using real bool types.
2768
                         false - otherwise
1 by brian
clean slate
2769
    @param send_refresh  Should we awake waiters even if we didn't close any tables?
2770
*/
2771
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2772
static void close_old_data_files(THD *thd, Table *table, bool morph_locks,
1 by brian
clean slate
2773
                                 bool send_refresh)
2774
{
2775
  bool found= send_refresh;
2776
2777
  for (; table ; table=table->next)
2778
  {
2779
    /*
2780
      Reopen marked for flush.
2781
    */
2782
    if (table->needs_reopen_or_name_lock())
2783
    {
2784
      found=1;
2785
      if (table->db_stat)
2786
      {
2787
	if (morph_locks)
2788
	{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2789
          Table *ulcktbl= table;
1 by brian
clean slate
2790
          if (ulcktbl->lock_count)
2791
          {
2792
            /*
2793
              Wake up threads waiting for table-level lock on this table
2794
              so they won't sneak in when we will temporarily remove our
2795
              lock on it. This will also give them a chance to close their
2796
              instances of this table.
2797
            */
55 by brian
Update for using real bool types.
2798
            mysql_lock_abort(thd, ulcktbl, true);
2799
            mysql_lock_remove(thd, thd->locked_tables, ulcktbl, true);
1 by brian
clean slate
2800
            ulcktbl->lock_count= 0;
2801
          }
2802
          if ((ulcktbl != table) && ulcktbl->db_stat)
2803
          {
2804
            /*
2805
              Close the parent too. Note that parent can come later in
2806
              the list of tables. It will then be noticed as closed and
2807
              as a placeholder. When this happens, do not clear the
2808
              placeholder flag. See the branch below ("***").
2809
            */
2810
            ulcktbl->open_placeholder= 1;
2811
            close_handle_and_leave_table_as_lock(ulcktbl);
2812
          }
2813
          /*
2814
            We want to protect the table from concurrent DDL operations
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2815
            (like RENAME Table) until we will re-open and re-lock it.
1 by brian
clean slate
2816
          */
2817
	  table->open_placeholder= 1;
2818
	}
2819
        close_handle_and_leave_table_as_lock(table);
2820
      }
2821
      else if (table->open_placeholder && !morph_locks)
2822
      {
2823
        /*
2824
          We come here only in close-for-back-off scenario. So we have to
2825
          "close" create placeholder here to avoid deadlocks (for example,
2826
          in case of concurrent execution of CREATE TABLE t1 SELECT * FROM t2
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2827
          and RENAME Table t2 TO t1). In close-for-re-open scenario we will
1 by brian
clean slate
2828
          probably want to let it stay.
2829
2830
          Note "***": We must not enter this branch if the placeholder
2831
          flag has been set because of a former close through a child.
2832
          See above the comment that refers to this note.
2833
        */
2834
        table->open_placeholder= 0;
2835
      }
2836
    }
2837
  }
2838
  if (found)
2839
    broadcast_refresh();
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2840
  return;
1 by brian
clean slate
2841
}
2842
2843
2844
/*
2845
  Wait until all threads has closed the tables in the list
2846
  We have also to wait if there is thread that has a lock on this table even
2847
  if the table is closed
2848
*/
2849
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2850
bool table_is_used(Table *table, bool wait_for_name_lock)
1 by brian
clean slate
2851
{
2852
  do
2853
  {
2854
    char *key= table->s->table_cache_key.str;
2855
    uint key_length= table->s->table_cache_key.length;
2856
2857
    HASH_SEARCH_STATE state;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2858
    for (Table *search= (Table*) hash_first(&open_cache, (uchar*) key,
1 by brian
clean slate
2859
                                             key_length, &state);
2860
	 search ;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2861
         search= (Table*) hash_next(&open_cache, (uchar*) key,
1 by brian
clean slate
2862
                                    key_length, &state))
2863
    {
2864
      if (search->in_use == table->in_use)
2865
        continue;                               // Name locked by this thread
2866
      /*
2867
        We can't use the table under any of the following conditions:
2868
        - There is an name lock on it (Table is to be deleted or altered)
2869
        - If we are in flush table and we didn't execute the flush
2870
        - If the table engine is open and it's an old version
2871
        (We must wait until all engines are shut down to use the table)
2872
      */
2873
      if ( (search->locked_by_name && wait_for_name_lock) ||
2874
           (search->is_name_opened() && search->needs_reopen_or_name_lock()))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2875
        return(1);
1 by brian
clean slate
2876
    }
2877
  } while ((table=table->next));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2878
  return(0);
1 by brian
clean slate
2879
}
2880
2881
2882
/* Wait until all used tables are refreshed */
2883
2884
bool wait_for_tables(THD *thd)
2885
{
2886
  bool result;
2887
2888
  thd_proc_info(thd, "Waiting for tables");
2889
  pthread_mutex_lock(&LOCK_open);
2890
  while (!thd->killed)
2891
  {
2892
    thd->some_tables_deleted=0;
2893
    close_old_data_files(thd,thd->open_tables,0,dropping_tables != 0);
2894
    mysql_ha_flush(thd);
2895
    if (!table_is_used(thd->open_tables,1))
2896
      break;
2897
    (void) pthread_cond_wait(&COND_refresh,&LOCK_open);
2898
  }
2899
  if (thd->killed)
2900
    result= 1;					// aborted
2901
  else
2902
  {
2903
    /* Now we can open all tables without any interference */
2904
    thd_proc_info(thd, "Reopen tables");
2905
    thd->version= refresh_version;
2906
    result=reopen_tables(thd,0,0);
2907
  }
2908
  pthread_mutex_unlock(&LOCK_open);
2909
  thd_proc_info(thd, 0);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2910
  return(result);
1 by brian
clean slate
2911
}
2912
2913
2914
/*
2915
  drop tables from locked list
2916
2917
  SYNOPSIS
2918
    drop_locked_tables()
2919
    thd			Thread thandler
2920
    db			Database
2921
    table_name		Table name
2922
2923
  INFORMATION
2924
    This is only called on drop tables
2925
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2926
    The Table object for the dropped table is unlocked but still kept around
1 by brian
clean slate
2927
    as a name lock, which means that the table will be available for other
2928
    thread as soon as we call unlock_table_names().
2929
    If there is multiple copies of the table locked, all copies except
2930
    the first, which acts as a name lock, is removed.
2931
2932
  RETURN
2933
    #    If table existed, return table
2934
    0	 Table was not locked
2935
*/
2936
2937
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2938
Table *drop_locked_tables(THD *thd,const char *db, const char *table_name)
1 by brian
clean slate
2939
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2940
  Table *table,*next,**prev, *found= 0;
1 by brian
clean slate
2941
  prev= &thd->open_tables;
2942
2943
  /*
2944
    Note that we need to hold LOCK_open while changing the
2945
    open_tables list. Another thread may work on it.
2946
    (See: remove_table_from_cache(), mysql_wait_completed_table())
2947
    Closing a MERGE child before the parent would be fatal if the
2948
    other thread tries to abort the MERGE lock in between.
2949
  */
2950
  for (table= thd->open_tables; table ; table=next)
2951
  {
2952
    next=table->next;
2953
    if (!strcmp(table->s->table_name.str, table_name) &&
2954
	!strcmp(table->s->db.str, db))
2955
    {
55 by brian
Update for using real bool types.
2956
      mysql_lock_remove(thd, thd->locked_tables, table, true);
1 by brian
clean slate
2957
2958
      if (!found)
2959
      {
2960
        found= table;
2961
        /* Close engine table, but keep object around as a name lock */
2962
        if (table->db_stat)
2963
        {
2964
          table->db_stat= 0;
2965
          table->file->close();
2966
        }
2967
      }
2968
      else
2969
      {
2970
        /* We already have a name lock, remove copy */
2971
        VOID(hash_delete(&open_cache,(uchar*) table));
2972
      }
2973
    }
2974
    else
2975
    {
2976
      *prev=table;
2977
      prev= &table->next;
2978
    }
2979
  }
2980
  *prev=0;
2981
  if (found)
2982
    broadcast_refresh();
2983
  if (thd->locked_tables && thd->locked_tables->table_count == 0)
2984
  {
2985
    my_free((uchar*) thd->locked_tables,MYF(0));
2986
    thd->locked_tables=0;
2987
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2988
  return(found);
1 by brian
clean slate
2989
}
2990
2991
2992
/*
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
2993
  If we have the table open, which only happens when a LOCK Table has been
1 by brian
clean slate
2994
  done on the table, change the lock type to a lock that will abort all
2995
  other threads trying to get the lock.
2996
*/
2997
2998
void abort_locked_tables(THD *thd,const char *db, const char *table_name)
2999
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3000
  Table *table;
1 by brian
clean slate
3001
  for (table= thd->open_tables; table ; table= table->next)
3002
  {
3003
    if (!strcmp(table->s->table_name.str, table_name) &&
3004
	!strcmp(table->s->db.str, db))
3005
    {
3006
      /* If MERGE child, forward lock handling to parent. */
55 by brian
Update for using real bool types.
3007
      mysql_lock_abort(thd, table, true);
1 by brian
clean slate
3008
      break;
3009
    }
3010
  }
3011
}
3012
3013
3014
/*
3015
  Function to assign a new table map id to a table share.
3016
3017
  PARAMETERS
3018
3019
    share - Pointer to table share structure
3020
3021
  DESCRIPTION
3022
3023
    We are intentionally not checking that share->mutex is locked
3024
    since this function should only be called when opening a table
3025
    share and before it is entered into the table_def_cache (meaning
3026
    that it cannot be fetched by another thread, even accidentally).
3027
3028
  PRE-CONDITION(S)
3029
3030
    share is non-NULL
3031
    The LOCK_open mutex is locked
3032
3033
  POST-CONDITION(S)
3034
3035
    share->table_map_id is given a value that with a high certainty is
3036
    not used by any other table (the only case where a table id can be
3037
    reused is on wrap-around, which means more than 4 billion table
3038
    share opens have been executed while one table was open all the
3039
    time).
3040
365.2.7 by Monty Taylor
INT32_MAX stuff.
3041
    share->table_map_id is not UINT32_MAX.
1 by brian
clean slate
3042
 */
3043
void assign_new_table_id(TABLE_SHARE *share)
3044
{
365.2.7 by Monty Taylor
INT32_MAX stuff.
3045
  static uint32_t last_table_id= UINT32_MAX;
1 by brian
clean slate
3046
3047
  /* Preconditions */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3048
  assert(share != NULL);
1 by brian
clean slate
3049
  safe_mutex_assert_owner(&LOCK_open);
3050
3051
  ulong tid= ++last_table_id;                   /* get next id */
3052
  /*
3053
    There is one reserved number that cannot be used.  Remember to
3054
    change this when 6-byte global table id's are introduced.
3055
  */
365.2.4 by Monty Taylor
Updated some Long refs to use stdint constants.
3056
  if (unlikely(tid == UINT32_MAX))
1 by brian
clean slate
3057
    tid= ++last_table_id;
3058
  share->table_map_id= tid;
3059
3060
  /* Post conditions */
365.2.4 by Monty Taylor
Updated some Long refs to use stdint constants.
3061
  assert(share->table_map_id != UINT32_MAX);
1 by brian
clean slate
3062
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3063
  return;
1 by brian
clean slate
3064
}
3065
3066
/*
3067
  Load a table definition from file and open unireg table
3068
3069
  SYNOPSIS
3070
    open_unireg_entry()
3071
    thd			Thread handle
3072
    entry		Store open table definition here
327.2.4 by Brian Aker
Refactoring table.h
3073
    table_list		TableList with db, table_name
1 by brian
clean slate
3074
    alias		Alias name
3075
    cache_key		Key for share_cache
3076
    cache_key_length	length of cache_key
3077
3078
  NOTES
3079
   Extra argument for open is taken from thd->open_options
3080
   One must have a lock on LOCK_open when calling this function
3081
3082
  RETURN
3083
    0	ok
3084
    #	Error
3085
*/
3086
327.2.4 by Brian Aker
Refactoring table.h
3087
static int open_unireg_entry(THD *thd, Table *entry, TableList *table_list,
1 by brian
clean slate
3088
                             const char *alias,
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
3089
                             char *cache_key, uint cache_key_length)
1 by brian
clean slate
3090
{
3091
  int error;
3092
  TABLE_SHARE *share;
3093
  uint discover_retry_count= 0;
3094
3095
  safe_mutex_assert_owner(&LOCK_open);
3096
retry:
3097
  if (!(share= get_table_share_with_create(thd, table_list, cache_key,
3098
                                           cache_key_length, 
3099
                                           table_list->i_s_requested_object,
3100
                                           &error)))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3101
    return(1);
1 by brian
clean slate
3102
3103
  while ((error= open_table_from_share(thd, share, alias,
3104
                                       (uint) (HA_OPEN_KEYFILE |
3105
                                               HA_OPEN_RNDFILE |
3106
                                               HA_GET_INDEX |
3107
                                               HA_TRY_READ_ONLY),
365.1.1 by Brian Aker
Dead define removal.
3108
                                       (EXTRA_RECORD),
1 by brian
clean slate
3109
                                       thd->open_options, entry, OTM_OPEN)))
3110
  {
3111
    if (error == 7)                             // Table def changed
3112
    {
3113
      share->version= 0;                        // Mark share as old
3114
      if (discover_retry_count++)               // Retry once
3115
        goto err;
3116
3117
      /*
3118
        TODO:
3119
        Here we should wait until all threads has released the table.
3120
        For now we do one retry. This may cause a deadlock if there
3121
        is other threads waiting for other tables used by this thread.
3122
        
3123
        Proper fix would be to if the second retry failed:
3124
        - Mark that table def changed
3125
        - Return from open table
3126
        - Close all tables used by this thread
3127
        - Start waiting that the share is released
3128
        - Retry by opening all tables again
3129
      */
3130
      if (ha_create_table_from_engine(thd, table_list->db,
3131
                                      table_list->table_name))
3132
        goto err;
3133
      /*
3134
        TO BE FIXED
3135
        To avoid deadlock, only wait for release if no one else is
3136
        using the share.
3137
      */
3138
      if (share->ref_count != 1)
3139
        goto err;
3140
      /* Free share and wait until it's released by all threads */
3141
      release_table_share(share, RELEASE_WAIT_FOR_DROP);
3142
      if (!thd->killed)
3143
      {
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
3144
        drizzle_reset_errors(thd, 1);         // Clear warnings
1 by brian
clean slate
3145
        thd->clear_error();                 // Clear error message
3146
        goto retry;
3147
      }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3148
      return(1);
1 by brian
clean slate
3149
    }
3150
    if (!entry->s || !entry->s->crashed)
3151
      goto err;
3152
     // Code below is for repairing a crashed file
55 by brian
Update for using real bool types.
3153
     if ((error= lock_table_name(thd, table_list, true)))
1 by brian
clean slate
3154
     {
3155
       if (error < 0)
3156
 	goto err;
3157
       if (wait_for_locked_table_names(thd, table_list))
3158
       {
3159
 	unlock_table_name(thd, table_list);
3160
 	goto err;
3161
       }
3162
     }
3163
     pthread_mutex_unlock(&LOCK_open);
3164
     thd->clear_error();				// Clear error message
3165
     error= 0;
3166
     if (open_table_from_share(thd, share, alias,
3167
                               (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
3168
                                       HA_GET_INDEX |
3169
                                       HA_TRY_READ_ONLY),
365.1.1 by Brian Aker
Dead define removal.
3170
                               EXTRA_RECORD,
1 by brian
clean slate
3171
                               ha_open_options | HA_OPEN_FOR_REPAIR,
3172
                               entry, OTM_OPEN) || ! entry->file ||
3173
        (entry->file->is_crashed() && entry->file->ha_check_and_repair(thd)))
3174
     {
3175
       /* Give right error message */
3176
       thd->clear_error();
3177
       my_error(ER_NOT_KEYFILE, MYF(0), share->table_name.str, my_errno);
338 by Monty Taylor
Tagged more strings.
3178
       sql_print_error(_("Couldn't repair table: %s.%s"), share->db.str,
1 by brian
clean slate
3179
                       share->table_name.str);
3180
       if (entry->file)
3181
 	closefrm(entry, 0);
3182
       error=1;
3183
     }
3184
     else
3185
       thd->clear_error();			// Clear error message
3186
     pthread_mutex_lock(&LOCK_open);
3187
     unlock_table_name(thd, table_list);
3188
 
3189
     if (error)
3190
       goto err;
3191
     break;
3192
   }
3193
3194
  /*
3195
    If we are here, there was no fatal error (but error may be still
3196
    unitialized).
3197
  */
3198
  if (unlikely(entry->file->implicit_emptied))
3199
  {
3200
    entry->file->implicit_emptied= 0;
3201
    if (mysql_bin_log.is_open())
3202
    {
3203
      char *query, *end;
3204
      uint query_buf_size= 20 + share->db.length + share->table_name.length +1;
3205
      if ((query= (char*) my_malloc(query_buf_size,MYF(MY_WME))))
3206
      {
3207
        /* this DELETE FROM is needed even with row-based binlogging */
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
3208
        end = strxmov(stpcpy(query, "DELETE FROM `"),
1 by brian
clean slate
3209
                      share->db.str,"`.`",share->table_name.str,"`", NullS);
3210
        thd->binlog_query(THD::STMT_QUERY_TYPE,
55 by brian
Update for using real bool types.
3211
                          query, (ulong)(end-query), false, false);
1 by brian
clean slate
3212
        my_free(query, MYF(0));
3213
      }
3214
      else
3215
      {
3216
        /*
3217
          As replication is maybe going to be corrupted, we need to warn the
3218
          DBA on top of warning the client (which will automatically be done
3219
          because of MYF(MY_WME) in my_malloc() above).
3220
        */
338 by Monty Taylor
Tagged more strings.
3221
        sql_print_error(_("When opening HEAP table, could not allocate memory "
3222
                          "to write 'DELETE FROM `%s`.`%s`' to the binary log"),
1 by brian
clean slate
3223
                        table_list->db, table_list->table_name);
3224
        closefrm(entry, 0);
3225
        goto err;
3226
      }
3227
    }
3228
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3229
  return(0);
1 by brian
clean slate
3230
3231
err:
3232
  release_table_share(share, RELEASE_NORMAL);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3233
  return(1);
1 by brian
clean slate
3234
}
3235
3236
3237
/*
3238
  Open all tables in list
3239
3240
  SYNOPSIS
3241
    open_tables()
3242
    thd - thread handler
3243
    start - list of tables in/out
3244
    counter - number of opened tables will be return using this parameter
3245
    flags   - bitmap of flags to modify how the tables will be open:
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
3246
              DRIZZLE_LOCK_IGNORE_FLUSH - open table even if someone has
1 by brian
clean slate
3247
              done a flush or namelock on it.
3248
3249
  NOTE
3250
    Unless we are already in prelocked mode, this function will also precache
3251
    all SP/SFs explicitly or implicitly (via views and triggers) used by the
3252
    query and add tables needed for their execution to table list. If resulting
3253
    tables list will be non empty it will mark query as requiring precaching.
3254
    Prelocked mode will be enabled for such query during lock_tables() call.
3255
3256
    If query for which we are opening tables is already marked as requiring
3257
    prelocking it won't do such precaching and will simply reuse table list
3258
    which is already built.
3259
3260
  RETURN
3261
    0  - OK
3262
    -1 - error
3263
*/
3264
327.2.4 by Brian Aker
Refactoring table.h
3265
int open_tables(THD *thd, TableList **start, uint *counter, uint flags)
1 by brian
clean slate
3266
{
327.2.4 by Brian Aker
Refactoring table.h
3267
  TableList *tables= NULL;
1 by brian
clean slate
3268
  bool refresh;
3269
  int result=0;
3270
  MEM_ROOT new_frm_mem;
3271
  /* Also used for indicating that prelocking is need */
3272
  bool safe_to_ignore_table;
3273
3274
  /*
3275
    temporary mem_root for new .frm parsing.
3276
    TODO: variables for size
3277
  */
3278
  init_sql_alloc(&new_frm_mem, 8024, 8024);
3279
3280
  thd->current_tablenr= 0;
3281
 restart:
3282
  *counter= 0;
3283
  thd_proc_info(thd, "Opening tables");
3284
3285
  /*
3286
    For every table in the list of tables to open, try to find or open
3287
    a table.
3288
  */
3289
  for (tables= *start; tables ;tables= tables->next_global)
3290
  {
55 by brian
Update for using real bool types.
3291
    safe_to_ignore_table= false;
1 by brian
clean slate
3292
3293
    /*
3294
      Ignore placeholders for derived tables. After derived tables
3295
      processing, link to created temporary table will be put here.
3296
      If this is derived table for view then we still want to process
3297
      routines used by this view.
3298
     */
3299
    if (tables->derived)
3300
    {
3301
      continue;
3302
    }
3303
    /*
327.2.4 by Brian Aker
Refactoring table.h
3304
      If this TableList object is a placeholder for an information_schema
1 by brian
clean slate
3305
      table, create a temporary table to represent the information_schema
3306
      table in the query. Do not fill it yet - will be filled during
3307
      execution.
3308
    */
3309
    if (tables->schema_table)
3310
    {
3311
      if (!mysql_schema_table(thd, thd->lex, tables))
3312
        continue;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3313
      return(-1);
1 by brian
clean slate
3314
    }
3315
    (*counter)++;
3316
3317
    /*
3318
      Not a placeholder: must be a base table or a view, and the table is
3319
      not opened yet. Try to open the table.
3320
    */
3321
    if (!tables->table)
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
3322
      tables->table= open_table(thd, tables, &refresh, flags);
1 by brian
clean slate
3323
3324
    if (!tables->table)
3325
    {
3326
      free_root(&new_frm_mem, MYF(MY_KEEP_PREALLOC));
3327
3328
      if (refresh)				// Refresh in progress
3329
      {
3330
        /*
3331
          We have met name-locked or old version of table. Now we have
3332
          to close all tables which are not up to date. We also have to
3333
          throw away set of prelocked tables (and thus close tables from
3334
          this set that were open by now) since it possible that one of
3335
          tables which determined its content was changed.
3336
3337
          Instead of implementing complex/non-robust logic mentioned
3338
          above we simply close and then reopen all tables.
3339
3340
          In order to prepare for recalculation of set of prelocked tables
3341
          we pretend that we have finished calculation which we were doing
3342
          currently.
3343
        */
3344
        close_tables_for_reopen(thd, start);
3345
	goto restart;
3346
      }
3347
3348
      if (safe_to_ignore_table)
3349
        continue;
3350
3351
      result= -1;				// Fatal error
3352
      break;
3353
    }
3354
    if (tables->lock_type != TL_UNLOCK && ! thd->locked_tables)
3355
    {
3356
      if (tables->lock_type == TL_WRITE_DEFAULT)
3357
        tables->table->reginfo.lock_type= thd->update_lock_default;
3358
      else if (tables->table->s->tmp_table == NO_TMP_TABLE)
3359
        tables->table->reginfo.lock_type= tables->lock_type;
3360
    }
3361
  }
3362
3363
  thd_proc_info(thd, 0);
3364
  free_root(&new_frm_mem, MYF(0));              // Free pre-alloced block
3365
3366
  if (result && tables)
3367
  {
3368
    /*
3369
      Some functions determine success as (tables->table != NULL).
327.1.6 by Brian Aker
Removed merge engine reference
3370
      tables->table is in thd->open_tables.
1 by brian
clean slate
3371
    */
3372
    tables->table= NULL;
3373
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3374
  return(result);
1 by brian
clean slate
3375
}
3376
3377
3378
/*
3379
  Check that lock is ok for tables; Call start stmt if ok
3380
3381
  SYNOPSIS
3382
    check_lock_and_start_stmt()
3383
    thd			Thread handle
3384
    table_list		Table to check
3385
    lock_type		Lock used for table
3386
3387
  RETURN VALUES
3388
  0	ok
3389
  1	error
3390
*/
3391
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3392
static bool check_lock_and_start_stmt(THD *thd, Table *table,
1 by brian
clean slate
3393
				      thr_lock_type lock_type)
3394
{
3395
  int error;
3396
3397
  if ((int) lock_type >= (int) TL_WRITE_ALLOW_READ &&
3398
      (int) table->reginfo.lock_type < (int) TL_WRITE_ALLOW_READ)
3399
  {
3400
    my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE, MYF(0),table->alias);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3401
    return(1);
1 by brian
clean slate
3402
  }
3403
  if ((error=table->file->start_stmt(thd, lock_type)))
3404
  {
3405
    table->file->print_error(error,MYF(0));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3406
    return(1);
1 by brian
clean slate
3407
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3408
  return(0);
1 by brian
clean slate
3409
}
3410
3411
3412
/**
3413
  @brief Open and lock one table
3414
3415
  @param[in]    thd             thread handle
3416
  @param[in]    table_l         table to open is first table in this list
3417
  @param[in]    lock_type       lock to use for table
3418
3419
  @return       table
3420
    @retval     != NULL         OK, opened table returned
3421
    @retval     NULL            Error
3422
3423
  @note
3424
    If ok, the following are also set:
3425
      table_list->lock_type 	lock_type
3426
      table_list->table		table
3427
3428
  @note
3429
    If table_l is a list, not a single table, the list is temporarily
3430
    broken.
3431
3432
  @detail
3433
    This function is meant as a replacement for open_ltable() when
3434
    MERGE tables can be opened. open_ltable() cannot open MERGE tables.
3435
3436
    There may be more differences between open_n_lock_single_table() and
3437
    open_ltable(). One known difference is that open_ltable() does
3438
    neither call decide_logging_format() nor handle some other logging
3439
    and locking issues because it does not call lock_tables().
3440
*/
3441
327.2.4 by Brian Aker
Refactoring table.h
3442
Table *open_n_lock_single_table(THD *thd, TableList *table_l,
1 by brian
clean slate
3443
                                thr_lock_type lock_type)
3444
{
327.2.4 by Brian Aker
Refactoring table.h
3445
  TableList *save_next_global;
1 by brian
clean slate
3446
3447
  /* Remember old 'next' pointer. */
3448
  save_next_global= table_l->next_global;
3449
  /* Break list. */
3450
  table_l->next_global= NULL;
3451
3452
  /* Set requested lock type. */
3453
  table_l->lock_type= lock_type;
3454
3455
  /* Open the table. */
3456
  if (simple_open_n_lock_tables(thd, table_l))
3457
    table_l->table= NULL; /* Just to be sure. */
3458
3459
  /* Restore list. */
3460
  table_l->next_global= save_next_global;
3461
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3462
  return(table_l->table);
1 by brian
clean slate
3463
}
3464
3465
3466
/*
3467
  Open and lock one table
3468
3469
  SYNOPSIS
3470
    open_ltable()
3471
    thd			Thread handler
3472
    table_list		Table to open is first table in this list
3473
    lock_type		Lock to use for open
3474
    lock_flags          Flags passed to mysql_lock_table
3475
3476
  NOTE
3477
    This function don't do anything like SP/SF/views/triggers analysis done
3478
    in open_tables(). It is intended for opening of only one concrete table.
3479
    And used only in special contexts.
3480
3481
  RETURN VALUES
3482
    table		Opened table
3483
    0			Error
3484
  
3485
    If ok, the following are also set:
3486
      table_list->lock_type 	lock_type
3487
      table_list->table		table
3488
*/
3489
327.2.4 by Brian Aker
Refactoring table.h
3490
Table *open_ltable(THD *thd, TableList *table_list, thr_lock_type lock_type,
1 by brian
clean slate
3491
                   uint lock_flags)
3492
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3493
  Table *table;
1 by brian
clean slate
3494
  bool refresh;
3495
3496
  thd_proc_info(thd, "Opening table");
3497
  thd->current_tablenr= 0;
356 by Brian Aker
Class cleanups... duplicates are in definitions and unireg :(
3498
  while (!(table= open_table(thd, table_list, &refresh, 0)) &&
1 by brian
clean slate
3499
         refresh)
3500
    ;
3501
3502
  if (table)
3503
  {
3504
    table_list->lock_type= lock_type;
3505
    table_list->table=	   table;
3506
    if (thd->locked_tables)
3507
    {
3508
      if (check_lock_and_start_stmt(thd, table, lock_type))
3509
	table= 0;
3510
    }
3511
    else
3512
    {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3513
      assert(thd->lock == 0);	// You must lock everything at once
1 by brian
clean slate
3514
      if ((table->reginfo.lock_type= lock_type) != TL_UNLOCK)
3515
	if (! (thd->lock= mysql_lock_tables(thd, &table_list->table, 1,
3516
                                            lock_flags, &refresh)))
3517
	  table= 0;
3518
    }
3519
  }
3520
3521
  thd_proc_info(thd, 0);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3522
  return(table);
1 by brian
clean slate
3523
}
3524
3525
3526
/*
3527
  Open all tables in list, locks them and optionally process derived tables.
3528
3529
  SYNOPSIS
3530
    open_and_lock_tables_derived()
3531
    thd		- thread handler
3532
    tables	- list of tables for open&locking
3533
    derived     - if to handle derived tables
3534
3535
  RETURN
55 by brian
Update for using real bool types.
3536
    false - ok
3537
    true  - error
1 by brian
clean slate
3538
3539
  NOTE
3540
    The lock will automaticaly be freed by close_thread_tables()
3541
3542
  NOTE
3543
    There are two convenience functions:
3544
    - simple_open_n_lock_tables(thd, tables)  without derived handling
3545
    - open_and_lock_tables(thd, tables)       with derived handling
3546
    Both inline functions call open_and_lock_tables_derived() with
3547
    the third argument set appropriately.
3548
*/
3549
327.2.4 by Brian Aker
Refactoring table.h
3550
int open_and_lock_tables_derived(THD *thd, TableList *tables, bool derived)
1 by brian
clean slate
3551
{
3552
  uint counter;
3553
  bool need_reopen;
3554
3555
  for ( ; ; ) 
3556
  {
3557
    if (open_tables(thd, &tables, &counter, 0))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3558
      return(-1);
1 by brian
clean slate
3559
3560
    if (!lock_tables(thd, tables, counter, &need_reopen))
3561
      break;
3562
    if (!need_reopen)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3563
      return(-1);
1 by brian
clean slate
3564
    close_tables_for_reopen(thd, &tables);
3565
  }
3566
  if (derived &&
3567
      (mysql_handle_derived(thd->lex, &mysql_derived_prepare) ||
3568
       (thd->fill_derived_tables() &&
3569
        mysql_handle_derived(thd->lex, &mysql_derived_filling))))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3570
    return(true); /* purecov: inspected */
3571
  return(0);
1 by brian
clean slate
3572
}
3573
3574
3575
/*
3576
  Open all tables in list and process derived tables
3577
3578
  SYNOPSIS
3579
    open_normal_and_derived_tables
3580
    thd		- thread handler
3581
    tables	- list of tables for open
3582
    flags       - bitmap of flags to modify how the tables will be open:
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
3583
                  DRIZZLE_LOCK_IGNORE_FLUSH - open table even if someone has
1 by brian
clean slate
3584
                  done a flush or namelock on it.
3585
3586
  RETURN
55 by brian
Update for using real bool types.
3587
    false - ok
3588
    true  - error
1 by brian
clean slate
3589
3590
  NOTE 
3591
    This is to be used on prepare stage when you don't read any
3592
    data from the tables.
3593
*/
3594
327.2.4 by Brian Aker
Refactoring table.h
3595
bool open_normal_and_derived_tables(THD *thd, TableList *tables, uint flags)
1 by brian
clean slate
3596
{
3597
  uint counter;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3598
  assert(!thd->fill_derived_tables());
1 by brian
clean slate
3599
  if (open_tables(thd, &tables, &counter, flags) ||
3600
      mysql_handle_derived(thd->lex, &mysql_derived_prepare))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3601
    return(true); /* purecov: inspected */
3602
  return(0);
1 by brian
clean slate
3603
}
3604
3605
3606
/**
3607
   Decide on logging format to use for the statement.
3608
3609
   Compute the capabilities vector for the involved storage engines
3610
   and mask out the flags for the binary log. Right now, the binlog
3611
   flags only include the capabilities of the storage engines, so this
3612
   is safe.
3613
3614
   We now have three alternatives that prevent the statement from
3615
   being loggable:
3616
3617
   1. If there are no capabilities left (all flags are clear) it is
3618
      not possible to log the statement at all, so we roll back the
3619
      statement and report an error.
3620
3621
   2. Statement mode is set, but the capabilities indicate that
3622
      statement format is not possible.
3623
3624
   3. Row mode is set, but the capabilities indicate that row
3625
      format is not possible.
3626
3627
   4. Statement is unsafe, but the capabilities indicate that row
3628
      format is not possible.
3629
3630
   If we are in MIXED mode, we then decide what logging format to use:
3631
3632
   1. If the statement is unsafe, row-based logging is used.
3633
3634
   2. If statement-based logging is not possible, row-based logging is
3635
      used.
3636
3637
   3. Otherwise, statement-based logging is used.
3638
3639
   @param thd    Client thread
3640
   @param tables Tables involved in the query
3641
 */
3642
327.2.4 by Brian Aker
Refactoring table.h
3643
int decide_logging_format(THD *thd, TableList *tables)
1 by brian
clean slate
3644
{
3645
  if (mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG))
3646
  {
3647
    handler::Table_flags flags_some_set= handler::Table_flags();
3648
    handler::Table_flags flags_all_set= ~handler::Table_flags();
199 by Brian Aker
my_bool...
3649
    bool multi_engine= false;
1 by brian
clean slate
3650
    void* prev_ht= NULL;
327.2.4 by Brian Aker
Refactoring table.h
3651
    for (TableList *table= tables; table; table= table->next_global)
1 by brian
clean slate
3652
    {
3653
      if (!table->placeholder() && table->lock_type >= TL_WRITE_ALLOW_WRITE)
3654
      {
151 by Brian Aker
Ulonglong to uint64_t
3655
        uint64_t const flags= table->table->file->ha_table_flags();
1 by brian
clean slate
3656
        if (prev_ht && prev_ht != table->table->file->ht)
55 by brian
Update for using real bool types.
3657
          multi_engine= true;
1 by brian
clean slate
3658
        prev_ht= table->table->file->ht;
3659
        flags_all_set &= flags;
3660
        flags_some_set |= flags;
3661
      }
3662
    }
3663
3664
    int error= 0;
3665
    if (flags_all_set == 0)
3666
    {
3667
      my_error((error= ER_BINLOG_LOGGING_IMPOSSIBLE), MYF(0),
3668
               "Statement cannot be logged to the binary log in"
3669
               " row-based nor statement-based format");
3670
    }
3671
    else if (thd->variables.binlog_format == BINLOG_FORMAT_STMT &&
3672
             (flags_all_set & HA_BINLOG_STMT_CAPABLE) == 0)
3673
    {
3674
      my_error((error= ER_BINLOG_LOGGING_IMPOSSIBLE), MYF(0),
3675
                "Statement-based format required for this statement,"
3676
                " but not allowed by this combination of engines");
3677
    }
3678
    else if ((thd->variables.binlog_format == BINLOG_FORMAT_ROW ||
3679
              thd->lex->is_stmt_unsafe()) &&
3680
             (flags_all_set & HA_BINLOG_ROW_CAPABLE) == 0)
3681
    {
3682
      my_error((error= ER_BINLOG_LOGGING_IMPOSSIBLE), MYF(0),
3683
                "Row-based format required for this statement,"
3684
                " but not allowed by this combination of engines");
3685
    }
3686
3687
    /*
3688
      If more than one engine is involved in the statement and at
3689
      least one is doing it's own logging (is *self-logging*), the
3690
      statement cannot be logged atomically, so we generate an error
3691
      rather than allowing the binlog to become corrupt.
3692
     */
3693
    if (multi_engine &&
3694
        (flags_some_set & HA_HAS_OWN_BINLOGGING))
3695
    {
3696
      error= ER_BINLOG_LOGGING_IMPOSSIBLE;
3697
      my_error(error, MYF(0),
3698
               "Statement cannot be written atomically since more"
3699
               " than one engine involved and at least one engine"
3700
               " is self-logging");
3701
    }
3702
3703
    if (error)
3704
      return -1;
3705
3706
    /*
3707
      We switch to row-based format if we are in mixed mode and one of
3708
      the following are true:
3709
3710
      1. If the statement is unsafe
3711
      2. If statement format cannot be used
3712
3713
      Observe that point to cannot be decided before the tables
3714
      involved in a statement has been checked, i.e., we cannot put
3715
      this code in reset_current_stmt_binlog_row_based(), it has to be
3716
      here.
3717
    */
3718
    if (thd->lex->is_stmt_unsafe() ||
3719
        (flags_all_set & HA_BINLOG_STMT_CAPABLE) == 0)
3720
    {
3721
      thd->set_current_stmt_binlog_row_based_if_mixed();
3722
    }
3723
  }
3724
3725
  return 0;
3726
}
3727
3728
/*
3729
  Lock all tables in list
3730
3731
  SYNOPSIS
3732
    lock_tables()
3733
    thd			Thread handler
3734
    tables		Tables to lock
3735
    count		Number of opened tables
55 by brian
Update for using real bool types.
3736
    need_reopen         Out parameter which if true indicates that some
1 by brian
clean slate
3737
                        tables were dropped or altered during this call
3738
                        and therefore invoker should reopen tables and
3739
                        try to lock them once again (in this case
3740
                        lock_tables() will also return error).
3741
3742
  NOTES
3743
    You can't call lock_tables twice, as this would break the dead-lock-free
3744
    handling thr_lock gives us.  You most always get all needed locks at
3745
    once.
3746
3747
    If query for which we are calling this function marked as requring
3748
    prelocking, this function will do implicit LOCK TABLES and change
3749
    thd::prelocked_mode accordingly.
3750
3751
  RETURN VALUES
3752
   0	ok
3753
   -1	Error
3754
*/
3755
327.2.4 by Brian Aker
Refactoring table.h
3756
int lock_tables(THD *thd, TableList *tables, uint count, bool *need_reopen)
1 by brian
clean slate
3757
{
327.2.4 by Brian Aker
Refactoring table.h
3758
  TableList *table;
1 by brian
clean slate
3759
3760
  /*
3761
    We can't meet statement requiring prelocking if we already
3762
    in prelocked mode.
3763
  */
55 by brian
Update for using real bool types.
3764
  *need_reopen= false;
1 by brian
clean slate
3765
3766
  if (!tables)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3767
    return(decide_logging_format(thd, tables));
1 by brian
clean slate
3768
3769
  if (!thd->locked_tables)
3770
  {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3771
    assert(thd->lock == 0);	// You must lock everything at once
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3772
    Table **start,**ptr;
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
3773
    uint lock_flag= DRIZZLE_LOCK_NOTIFY_IF_NEED_REOPEN;
1 by brian
clean slate
3774
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3775
    if (!(ptr=start=(Table**) thd->alloc(sizeof(Table*)*count)))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3776
      return(-1);
1 by brian
clean slate
3777
    for (table= tables; table; table= table->next_global)
3778
    {
3779
      if (!table->placeholder())
3780
	*(ptr++)= table->table;
3781
    }
3782
3783
    if (!(thd->lock= mysql_lock_tables(thd, start, (uint) (ptr - start),
3784
                                       lock_flag, need_reopen)))
3785
    {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3786
      return(-1);
1 by brian
clean slate
3787
    }
3788
  }
3789
  else
3790
  {
327.2.4 by Brian Aker
Refactoring table.h
3791
    TableList *first_not_own= thd->lex->first_not_own_table();
1 by brian
clean slate
3792
    /*
3793
      When open_and_lock_tables() is called for a single table out of
3794
      a table list, the 'next_global' chain is temporarily broken. We
3795
      may not find 'first_not_own' before the end of the "list".
3796
      Look for example at those places where open_n_lock_single_table()
3797
      is called. That function implements the temporary breaking of
3798
      a table list for opening a single table.
3799
    */
3800
    for (table= tables;
3801
         table && table != first_not_own;
3802
         table= table->next_global)
3803
    {
3804
      if (!table->placeholder() &&
3805
	  check_lock_and_start_stmt(thd, table->table, table->lock_type))
3806
      {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3807
	return(-1);
1 by brian
clean slate
3808
      }
3809
    }
3810
  }
3811
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3812
  return(decide_logging_format(thd, tables));
1 by brian
clean slate
3813
}
3814
3815
3816
/*
3817
  Prepare statement for reopening of tables and recalculation of set of
3818
  prelocked tables.
3819
3820
  SYNOPSIS
3821
    close_tables_for_reopen()
3822
      thd    in     Thread context
3823
      tables in/out List of tables which we were trying to open and lock
3824
3825
*/
3826
327.2.4 by Brian Aker
Refactoring table.h
3827
void close_tables_for_reopen(THD *thd, TableList **tables)
1 by brian
clean slate
3828
{
3829
  /*
3830
    If table list consists only from tables from prelocking set, table list
3831
    for new attempt should be empty, so we have to update list's root pointer.
3832
  */
3833
  if (thd->lex->first_not_own_table() == *tables)
3834
    *tables= 0;
3835
  thd->lex->chop_off_not_own_tables();
327.2.4 by Brian Aker
Refactoring table.h
3836
  for (TableList *tmp= *tables; tmp; tmp= tmp->next_global)
1 by brian
clean slate
3837
    tmp->table= 0;
3838
  close_thread_tables(thd);
3839
}
3840
3841
3842
/*
3843
  Open a single table without table caching and don't set it in open_list
3844
3845
  SYNPOSIS
3846
    open_temporary_table()
3847
    thd		  Thread object
3848
    path	  Path (without .frm)
3849
    db		  database
3850
    table_name	  Table name
3851
    link_in_list  1 if table should be linked into thd->temporary_tables
3852
3853
 NOTES:
3854
    Used by alter_table to open a temporary table and when creating
3855
    a temporary table with CREATE TEMPORARY ...
3856
3857
 RETURN
3858
   0  Error
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3859
   #  Table object
1 by brian
clean slate
3860
*/
3861
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3862
Table *open_temporary_table(THD *thd, const char *path, const char *db,
1 by brian
clean slate
3863
			    const char *table_name, bool link_in_list,
3864
                            open_table_mode open_mode)
3865
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3866
  Table *tmp_table;
1 by brian
clean slate
3867
  TABLE_SHARE *share;
3868
  char cache_key[MAX_DBKEY_LENGTH], *saved_cache_key, *tmp_path;
3869
  uint key_length;
327.2.4 by Brian Aker
Refactoring table.h
3870
  TableList table_list;
1 by brian
clean slate
3871
3872
  table_list.db=         (char*) db;
3873
  table_list.table_name= (char*) table_name;
3874
  /* Create the cache_key for temporary tables */
3875
  key_length= create_table_def_key(thd, cache_key, &table_list, 1);
3876
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3877
  if (!(tmp_table= (Table*) my_malloc(sizeof(*tmp_table) + sizeof(*share) +
1 by brian
clean slate
3878
                                      strlen(path)+1 + key_length,
3879
                                      MYF(MY_WME))))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3880
    return(0);				/* purecov: inspected */
1 by brian
clean slate
3881
3882
  share= (TABLE_SHARE*) (tmp_table+1);
3883
  tmp_path= (char*) (share+1);
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
3884
  saved_cache_key= stpcpy(tmp_path, path)+1;
1 by brian
clean slate
3885
  memcpy(saved_cache_key, cache_key, key_length);
3886
3887
  init_tmp_table_share(thd, share, saved_cache_key, key_length,
376 by Brian Aker
strend remove
3888
                       strchr(saved_cache_key, '\0')+1, tmp_path);
1 by brian
clean slate
3889
3890
  if (open_table_def(thd, share, 0) ||
3891
      open_table_from_share(thd, share, table_name,
3892
                            (open_mode == OTM_ALTER) ? 0 :
3893
                            (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
3894
                                    HA_GET_INDEX),
3895
                            (open_mode == OTM_ALTER) ?
365.1.1 by Brian Aker
Dead define removal.
3896
                              (EXTRA_RECORD | OPEN_FRM_FILE_ONLY)
3897
                            : (EXTRA_RECORD),
1 by brian
clean slate
3898
                            ha_open_options,
3899
                            tmp_table, open_mode))
3900
  {
3901
    /* No need to lock share->mutex as this is not needed for tmp tables */
3902
    free_table_share(share);
3903
    my_free((char*) tmp_table,MYF(0));
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3904
    return(0);
1 by brian
clean slate
3905
  }
3906
3907
  tmp_table->reginfo.lock_type= TL_WRITE;	 // Simulate locked
3908
  if (open_mode == OTM_ALTER)
3909
  {
3910
    /*
3911
       Temporary table has been created with frm_only
3912
       and has not been created in any storage engine
3913
    */
3914
    share->tmp_table= TMP_TABLE_FRM_FILE_ONLY;
3915
  }
3916
  else
3917
    share->tmp_table= (tmp_table->file->has_transactions() ?
3918
                       TRANSACTIONAL_TMP_TABLE : NON_TRANSACTIONAL_TMP_TABLE);
3919
3920
  if (link_in_list)
3921
  {
3922
    /* growing temp list at the head */
3923
    tmp_table->next= thd->temporary_tables;
3924
    if (tmp_table->next)
3925
      tmp_table->next->prev= tmp_table;
3926
    thd->temporary_tables= tmp_table;
3927
    thd->temporary_tables->prev= 0;
3928
    if (thd->slave_thread)
3929
      slave_open_temp_tables++;
3930
  }
3931
  tmp_table->pos_in_table_list= 0;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3932
  return(tmp_table);
1 by brian
clean slate
3933
}
3934
3935
3936
bool rm_temporary_table(handlerton *base, char *path, bool frm_only)
3937
{
3938
  bool error=0;
3939
  handler *file;
3940
  char *ext;
3941
376 by Brian Aker
strend remove
3942
  stpcpy(ext= strchr(path, '\0'), reg_ext);
1 by brian
clean slate
3943
  if (my_delete(path,MYF(0)))
3944
    error=1; /* purecov: inspected */
3945
  *ext= 0;				// remove extension
3946
  file= get_new_handler((TABLE_SHARE*) 0, current_thd->mem_root, base);
3947
  if (!frm_only && file && file->ha_delete_table(path))
3948
  {
3949
    error=1;
338 by Monty Taylor
Tagged more strings.
3950
    sql_print_warning(_("Could not remove temporary table: '%s', error: %d"),
1 by brian
clean slate
3951
                      path, my_errno);
3952
  }
3953
  delete file;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
3954
  return(error);
1 by brian
clean slate
3955
}
3956
3957
3958
/*****************************************************************************
3959
* The following find_field_in_XXX procedures implement the core of the
3960
* name resolution functionality. The entry point to resolve a column name in a
3961
* list of tables is 'find_field_in_tables'. It calls 'find_field_in_table_ref'
3962
* for each table reference. In turn, depending on the type of table reference,
3963
* 'find_field_in_table_ref' calls one of the 'find_field_in_XXX' procedures
3964
* below specific for the type of table reference.
3965
******************************************************************************/
3966
3967
/* Special Field pointers as return values of find_field_in_XXX functions. */
3968
Field *not_found_field= (Field*) 0x1;
3969
Field *view_ref_found= (Field*) 0x2; 
3970
3971
#define WRONG_GRANT (Field*) -1
3972
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
3973
static void update_field_dependencies(THD *thd, Field *field, Table *table)
1 by brian
clean slate
3974
{
3975
  if (thd->mark_used_columns != MARK_COLUMNS_NONE)
3976
  {
3977
    MY_BITMAP *current_bitmap, *other_bitmap;
3978
3979
    /*
3980
      We always want to register the used keys, as the column bitmap may have
3981
      been set for all fields (for example for view).
3982
    */
3983
      
3984
    table->covering_keys.intersect(field->part_of_key);
3985
    table->merge_keys.merge(field->part_of_key);
3986
3987
    if (thd->mark_used_columns == MARK_COLUMNS_READ)
3988
    {
3989
      current_bitmap= table->read_set;
3990
      other_bitmap=   table->write_set;
3991
    }
3992
    else
3993
    {
3994
      current_bitmap= table->write_set;
3995
      other_bitmap=   table->read_set;
3996
    }
3997
3998
    if (bitmap_fast_test_and_set(current_bitmap, field->field_index))
3999
    {
4000
      if (thd->mark_used_columns == MARK_COLUMNS_WRITE)
4001
        thd->dup_field= field;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4002
      return;
1 by brian
clean slate
4003
    }
4004
    if (table->get_fields_in_item_tree)
4005
      field->flags|= GET_FIXED_FIELDS_FLAG;
4006
    table->used_fields++;
4007
  }
4008
  else if (table->get_fields_in_item_tree)
4009
    field->flags|= GET_FIXED_FIELDS_FLAG;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4010
  return;
1 by brian
clean slate
4011
}
4012
4013
4014
/*
4015
  Find field by name in a NATURAL/USING join table reference.
4016
4017
  SYNOPSIS
4018
    find_field_in_natural_join()
4019
    thd			 [in]  thread handler
4020
    table_ref            [in]  table reference to search
4021
    name		 [in]  name of field
4022
    length		 [in]  length of name
4023
    ref                  [in/out] if 'name' is resolved to a view field, ref is
4024
                               set to point to the found view field
55 by brian
Update for using real bool types.
4025
    register_tree_change [in]  true if ref is not stack variable and we
1 by brian
clean slate
4026
                               need register changes in item tree
4027
    actual_table         [out] the original table reference where the field
4028
                               belongs - differs from 'table_list' only for
4029
                               NATURAL/USING joins
4030
4031
  DESCRIPTION
4032
    Search for a field among the result fields of a NATURAL/USING join.
4033
    Notice that this procedure is called only for non-qualified field
4034
    names. In the case of qualified fields, we search directly the base
4035
    tables of a natural join.
4036
4037
  RETURN
4038
    NULL        if the field was not found
4039
    WRONG_GRANT if no access rights to the found field
4040
    #           Pointer to the found Field
4041
*/
4042
4043
static Field *
327.2.4 by Brian Aker
Refactoring table.h
4044
find_field_in_natural_join(THD *thd, TableList *table_ref, const char *name,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
4045
                           uint length __attribute__((unused)),
327.2.6 by Brian Aker
Removed old base view code.
4046
                           Item **ref __attribute__((unused)), bool register_tree_change __attribute__((unused)),
327.2.4 by Brian Aker
Refactoring table.h
4047
                           TableList **actual_table)
1 by brian
clean slate
4048
{
4049
  List_iterator_fast<Natural_join_column>
4050
    field_it(*(table_ref->join_columns));
4051
  Natural_join_column *nj_col, *curr_nj_col;
4052
  Field *found_field;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4053
4054
  assert(table_ref->is_natural_join && table_ref->join_columns);
4055
  assert(*actual_table == NULL);
1 by brian
clean slate
4056
4057
  for (nj_col= NULL, curr_nj_col= field_it++; curr_nj_col; 
4058
       curr_nj_col= field_it++)
4059
  {
4060
    if (!my_strcasecmp(system_charset_info, curr_nj_col->name(), name))
4061
    {
4062
      if (nj_col)
4063
      {
4064
        my_error(ER_NON_UNIQ_ERROR, MYF(0), name, thd->where);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4065
        return(NULL);
1 by brian
clean slate
4066
      }
4067
      nj_col= curr_nj_col;
4068
    }
4069
  }
4070
  if (!nj_col)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4071
    return(NULL);
1 by brian
clean slate
4072
  {
4073
    /* This is a base table. */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4074
    assert(nj_col->table_ref->table == nj_col->table_field->table);
1 by brian
clean slate
4075
    found_field= nj_col->table_field;
4076
    update_field_dependencies(thd, found_field, nj_col->table_ref->table);
4077
  }
4078
4079
  *actual_table= nj_col->table_ref;
4080
  
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4081
  return(found_field);
1 by brian
clean slate
4082
}
4083
4084
4085
/*
4086
  Find field by name in a base table or a view with temp table algorithm.
4087
4088
  SYNOPSIS
4089
    find_field_in_table()
4090
    thd				thread handler
4091
    table			table where to search for the field
4092
    name			name of field
4093
    length			length of name
4094
    allow_rowid			do allow finding of "_rowid" field?
4095
    cached_field_index_ptr	cached position in field list (used to speedup
4096
                                lookup for fields in prepared tables)
4097
4098
  RETURN
4099
    0	field is not found
4100
    #	pointer to field
4101
*/
4102
4103
Field *
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
4104
find_field_in_table(THD *thd, Table *table, const char *name, uint length,
1 by brian
clean slate
4105
                    bool allow_rowid, uint *cached_field_index_ptr)
4106
{
4107
  Field **field_ptr, *field;
4108
  uint cached_field_index= *cached_field_index_ptr;
4109
4110
  /* We assume here that table->field < NO_CACHED_FIELD_INDEX = UINT_MAX */
4111
  if (cached_field_index < table->s->fields &&
4112
      !my_strcasecmp(system_charset_info,
4113
                     table->field[cached_field_index]->field_name, name))
4114
    field_ptr= table->field + cached_field_index;
4115
  else if (table->s->name_hash.records)
4116
  {
4117
    field_ptr= (Field**) hash_search(&table->s->name_hash, (uchar*) name,
4118
                                     length);
4119
    if (field_ptr)
4120
    {
4121
      /*
4122
        field_ptr points to field in TABLE_SHARE. Convert it to the matching
4123
        field in table
4124
      */
4125
      field_ptr= (table->field + (field_ptr - table->s->field));
4126
    }
4127
  }
4128
  else
4129
  {
4130
    if (!(field_ptr= table->field))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4131
      return((Field *)0);
1 by brian
clean slate
4132
    for (; *field_ptr; ++field_ptr)
4133
      if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name, name))
4134
        break;
4135
  }
4136
4137
  if (field_ptr && *field_ptr)
4138
  {
4139
    *cached_field_index_ptr= field_ptr - table->field;
4140
    field= *field_ptr;
4141
  }
4142
  else
4143
  {
4144
    if (!allow_rowid ||
4145
        my_strcasecmp(system_charset_info, name, "_rowid") ||
4146
        table->s->rowid_field_offset == 0)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4147
      return((Field*) 0);
1 by brian
clean slate
4148
    field= table->field[table->s->rowid_field_offset-1];
4149
  }
4150
4151
  update_field_dependencies(thd, field, table);
4152
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4153
  return(field);
1 by brian
clean slate
4154
}
4155
4156
4157
/*
4158
  Find field in a table reference.
4159
4160
  SYNOPSIS
4161
    find_field_in_table_ref()
4162
    thd			   [in]  thread handler
4163
    table_list		   [in]  table reference to search
4164
    name		   [in]  name of field
4165
    length		   [in]  field length of name
4166
    item_name              [in]  name of item if it will be created (VIEW)
4167
    db_name                [in]  optional database name that qualifies the
4168
    table_name             [in]  optional table name that qualifies the field
4169
    ref		       [in/out] if 'name' is resolved to a view field, ref
4170
                                 is set to point to the found view field
4171
    check_privileges       [in]  check privileges
4172
    allow_rowid		   [in]  do allow finding of "_rowid" field?
4173
    cached_field_index_ptr [in]  cached position in field list (used to
4174
                                 speedup lookup for fields in prepared tables)
55 by brian
Update for using real bool types.
4175
    register_tree_change   [in]  true if ref is not stack variable and we
1 by brian
clean slate
4176
                                 need register changes in item tree
4177
    actual_table           [out] the original table reference where the field
4178
                                 belongs - differs from 'table_list' only for
4179
                                 NATURAL_USING joins.
4180
4181
  DESCRIPTION
4182
    Find a field in a table reference depending on the type of table
4183
    reference. There are three types of table references with respect
4184
    to the representation of their result columns:
4185
    - an array of Field_translator objects for MERGE views and some
4186
      information_schema tables,
4187
    - an array of Field objects (and possibly a name hash) for stored
4188
      tables,
4189
    - a list of Natural_join_column objects for NATURAL/USING joins.
4190
    This procedure detects the type of the table reference 'table_list'
4191
    and calls the corresponding search routine.
4192
4193
  RETURN
4194
    0			field is not found
4195
    view_ref_found	found value in VIEW (real result is in *ref)
4196
    #			pointer to field
4197
*/
4198
4199
Field *
327.2.4 by Brian Aker
Refactoring table.h
4200
find_field_in_table_ref(THD *thd, TableList *table_list,
1 by brian
clean slate
4201
                        const char *name, uint length,
4202
                        const char *item_name, const char *db_name,
4203
                        const char *table_name, Item **ref,
4204
                        bool check_privileges, bool allow_rowid,
4205
                        uint *cached_field_index_ptr,
327.2.4 by Brian Aker
Refactoring table.h
4206
                        bool register_tree_change, TableList **actual_table)
1 by brian
clean slate
4207
{
327.2.5 by Brian Aker
Refactoring show command
4208
  Field *fld= NULL;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4209
4210
  assert(table_list->alias);
4211
  assert(name);
4212
  assert(item_name);
1 by brian
clean slate
4213
4214
  /*
4215
    Check that the table and database that qualify the current field name
4216
    are the same as the table reference we are going to search for the field.
4217
4218
    Exclude from the test below nested joins because the columns in a
4219
    nested join generally originate from different tables. Nested joins
4220
    also have no table name, except when a nested join is a merge view
4221
    or an information schema table.
4222
4223
    We include explicitly table references with a 'field_translation' table,
4224
    because if there are views over natural joins we don't want to search
4225
    inside the view, but we want to search directly in the view columns
4226
    which are represented as a 'field_translation'.
4227
4228
    TODO: Ensure that table_name, db_name and tables->db always points to
4229
          something !
4230
  */
4231
  if (/* Exclude nested joins. */
4232
      (!table_list->nested_join ||
4233
       /* Include merge views and information schema tables. */
4234
       table_list->field_translation) &&
4235
      /*
4236
        Test if the field qualifiers match the table reference we plan
4237
        to search.
4238
      */
4239
      table_name && table_name[0] &&
4240
      (my_strcasecmp(table_alias_charset, table_list->alias, table_name) ||
4241
       (db_name && db_name[0] && table_list->db && table_list->db[0] &&
4242
        strcmp(db_name, table_list->db))))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4243
    return(0);
1 by brian
clean slate
4244
4245
  *actual_table= NULL;
4246
4247
  if (table_list->field_translation)
4248
  {
4249
  }
4250
  else if (!table_list->nested_join)
4251
  {
4252
    /* 'table_list' is a stored table. */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4253
    assert(table_list->table);
1 by brian
clean slate
4254
    if ((fld= find_field_in_table(thd, table_list->table, name, length,
4255
                                  allow_rowid,
4256
                                  cached_field_index_ptr)))
4257
      *actual_table= table_list;
4258
  }
4259
  else
4260
  {
4261
    /*
4262
      'table_list' is a NATURAL/USING join, or an operand of such join that
4263
      is a nested join itself.
4264
4265
      If the field name we search for is qualified, then search for the field
4266
      in the table references used by NATURAL/USING the join.
4267
    */
4268
    if (table_name && table_name[0])
4269
    {
327.2.4 by Brian Aker
Refactoring table.h
4270
      List_iterator<TableList> it(table_list->nested_join->join_list);
4271
      TableList *table;
1 by brian
clean slate
4272
      while ((table= it++))
4273
      {
4274
        if ((fld= find_field_in_table_ref(thd, table, name, length, item_name,
4275
                                          db_name, table_name, ref,
4276
                                          check_privileges, allow_rowid,
4277
                                          cached_field_index_ptr,
4278
                                          register_tree_change, actual_table)))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4279
          return(fld);
1 by brian
clean slate
4280
      }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4281
      return(0);
1 by brian
clean slate
4282
    }
4283
    /*
4284
      Non-qualified field, search directly in the result columns of the
4285
      natural join. The condition of the outer IF is true for the top-most
4286
      natural join, thus if the field is not qualified, we will search
4287
      directly the top-most NATURAL/USING join.
4288
    */
4289
    fld= find_field_in_natural_join(thd, table_list, name, length, ref,
4290
                                    register_tree_change, actual_table);
4291
  }
4292
4293
  if (fld)
4294
  {
4295
      if (thd->mark_used_columns != MARK_COLUMNS_NONE)
4296
      {
4297
        /*
4298
          Get rw_set correct for this field so that the handler
4299
          knows that this field is involved in the query and gets
4300
          retrieved/updated
4301
         */
4302
        Field *field_to_set= NULL;
4303
        if (fld == view_ref_found)
4304
        {
4305
          Item *it= (*ref)->real_item();
4306
          if (it->type() == Item::FIELD_ITEM)
4307
            field_to_set= ((Item_field*)it)->field;
4308
          else
4309
          {
4310
            if (thd->mark_used_columns == MARK_COLUMNS_READ)
4311
              it->walk(&Item::register_field_in_read_map, 1, (uchar *) 0);
4312
          }
4313
        }
4314
        else
4315
          field_to_set= fld;
4316
        if (field_to_set)
4317
        {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
4318
          Table *table= field_to_set->table;
1 by brian
clean slate
4319
          if (thd->mark_used_columns == MARK_COLUMNS_READ)
4320
            bitmap_set_bit(table->read_set, field_to_set->field_index);
4321
          else
4322
            bitmap_set_bit(table->write_set, field_to_set->field_index);
4323
        }
4324
      }
4325
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4326
  return(fld);
1 by brian
clean slate
4327
}
4328
4329
4330
/*
4331
  Find field in table, no side effects, only purpose is to check for field
4332
  in table object and get reference to the field if found.
4333
4334
  SYNOPSIS
4335
  find_field_in_table_sef()
4336
4337
  table                         table where to find
4338
  name                          Name of field searched for
4339
4340
  RETURN
4341
    0                   field is not found
4342
    #                   pointer to field
4343
*/
4344
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
4345
Field *find_field_in_table_sef(Table *table, const char *name)
1 by brian
clean slate
4346
{
4347
  Field **field_ptr;
4348
  if (table->s->name_hash.records)
4349
  {
4350
    field_ptr= (Field**)hash_search(&table->s->name_hash,(uchar*) name,
4351
                                    strlen(name));
4352
    if (field_ptr)
4353
    {
4354
      /*
4355
        field_ptr points to field in TABLE_SHARE. Convert it to the matching
4356
        field in table
4357
      */
4358
      field_ptr= (table->field + (field_ptr - table->s->field));
4359
    }
4360
  }
4361
  else
4362
  {
4363
    if (!(field_ptr= table->field))
4364
      return (Field *)0;
4365
    for (; *field_ptr; ++field_ptr)
4366
      if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name, name))
4367
        break;
4368
  }
4369
  if (field_ptr)
4370
    return *field_ptr;
4371
  else
4372
    return (Field *)0;
4373
}
4374
4375
4376
/*
4377
  Find field in table list.
4378
4379
  SYNOPSIS
4380
    find_field_in_tables()
4381
    thd			  pointer to current thread structure
4382
    item		  field item that should be found
4383
    first_table           list of tables to be searched for item
4384
    last_table            end of the list of tables to search for item. If NULL
4385
                          then search to the end of the list 'first_table'.
4386
    ref			  if 'item' is resolved to a view field, ref is set to
4387
                          point to the found view field
4388
    report_error	  Degree of error reporting:
4389
                          - IGNORE_ERRORS then do not report any error
4390
                          - IGNORE_EXCEPT_NON_UNIQUE report only non-unique
4391
                            fields, suppress all other errors
4392
                          - REPORT_EXCEPT_NON_UNIQUE report all other errors
4393
                            except when non-unique fields were found
4394
                          - REPORT_ALL_ERRORS
4395
    check_privileges      need to check privileges
55 by brian
Update for using real bool types.
4396
    register_tree_change  true if ref is not a stack variable and we
1 by brian
clean slate
4397
                          to need register changes in item tree
4398
4399
  RETURN VALUES
4400
    0			If error: the found field is not unique, or there are
4401
                        no sufficient access priviliges for the found field,
4402
                        or the field is qualified with non-existing table.
4403
    not_found_field	The function was called with report_error ==
4404
                        (IGNORE_ERRORS || IGNORE_EXCEPT_NON_UNIQUE) and a
4405
			field was not found.
4406
    view_ref_found	View field is found, item passed through ref parameter
4407
    found field         If a item was resolved to some field
4408
*/
4409
4410
Field *
4411
find_field_in_tables(THD *thd, Item_ident *item,
327.2.4 by Brian Aker
Refactoring table.h
4412
                     TableList *first_table, TableList *last_table,
1 by brian
clean slate
4413
		     Item **ref, find_item_error_report_type report_error,
4414
                     bool check_privileges, bool register_tree_change)
4415
{
4416
  Field *found=0;
4417
  const char *db= item->db_name;
4418
  const char *table_name= item->table_name;
4419
  const char *name= item->field_name;
4420
  uint length=(uint) strlen(name);
4421
  char name_buff[NAME_LEN+1];
327.2.4 by Brian Aker
Refactoring table.h
4422
  TableList *cur_table= first_table;
4423
  TableList *actual_table;
1 by brian
clean slate
4424
  bool allow_rowid;
4425
4426
  if (!table_name || !table_name[0])
4427
  {
4428
    table_name= 0;                              // For easier test
4429
    db= 0;
4430
  }
4431
4432
  allow_rowid= table_name || (cur_table && !cur_table->next_local);
4433
4434
  if (item->cached_table)
4435
  {
4436
    /*
4437
      This shortcut is used by prepared statements. We assume that
327.2.4 by Brian Aker
Refactoring table.h
4438
      TableList *first_table is not changed during query execution (which
1 by brian
clean slate
4439
      is true for all queries except RENAME but luckily RENAME doesn't
4440
      use fields...) so we can rely on reusing pointer to its member.
4441
      With this optimization we also miss case when addition of one more
4442
      field makes some prepared query ambiguous and so erroneous, but we
4443
      accept this trade off.
4444
    */
327.2.4 by Brian Aker
Refactoring table.h
4445
    TableList *table_ref= item->cached_table;
1 by brian
clean slate
4446
    /*
4447
      The condition (table_ref->view == NULL) ensures that we will call
4448
      find_field_in_table even in the case of information schema tables
4449
      when table_ref->field_translation != NULL.
4450
      */
4451
    if (table_ref->table)
4452
      found= find_field_in_table(thd, table_ref->table, name, length,
55 by brian
Update for using real bool types.
4453
                                 true, &(item->cached_field_index));
1 by brian
clean slate
4454
    else
4455
      found= find_field_in_table_ref(thd, table_ref, name, length, item->name,
4456
                                     NULL, NULL, ref, check_privileges,
55 by brian
Update for using real bool types.
4457
                                     true, &(item->cached_field_index),
1 by brian
clean slate
4458
                                     register_tree_change,
4459
                                     &actual_table);
4460
    if (found)
4461
    {
4462
      if (found == WRONG_GRANT)
4463
	return (Field*) 0;
4464
4465
      /*
4466
        Only views fields should be marked as dependent, not an underlying
4467
        fields.
4468
      */
4469
      {
4470
        SELECT_LEX *current_sel= thd->lex->current_select;
4471
        SELECT_LEX *last_select= table_ref->select_lex;
4472
        /*
4473
          If the field was an outer referencee, mark all selects using this
4474
          sub query as dependent on the outer query
4475
        */
4476
        if (current_sel != last_select)
4477
          mark_select_range_as_dependent(thd, last_select, current_sel,
4478
                                         found, *ref, item);
4479
      }
4480
      return found;
4481
    }
4482
  }
4483
4484
  if (db && lower_case_table_names)
4485
  {
4486
    /*
4487
      convert database to lower case for comparison.
4488
      We can't do this in Item_field as this would change the
4489
      'name' of the item which may be used in the select list
4490
    */
4491
    strmake(name_buff, db, sizeof(name_buff)-1);
4492
    my_casedn_str(files_charset_info, name_buff);
4493
    db= name_buff;
4494
  }
4495
4496
  if (last_table)
4497
    last_table= last_table->next_name_resolution_table;
4498
4499
  for (; cur_table != last_table ;
4500
       cur_table= cur_table->next_name_resolution_table)
4501
  {
4502
    Field *cur_field= find_field_in_table_ref(thd, cur_table, name, length,
4503
                                              item->name, db, table_name, ref,
4504
                                              (thd->lex->sql_command ==
4505
                                               SQLCOM_SHOW_FIELDS)
4506
                                              ? false : check_privileges,
4507
                                              allow_rowid,
4508
                                              &(item->cached_field_index),
4509
                                              register_tree_change,
4510
                                              &actual_table);
4511
    if (cur_field)
4512
    {
4513
      if (cur_field == WRONG_GRANT)
4514
      {
4515
        if (thd->lex->sql_command != SQLCOM_SHOW_FIELDS)
4516
          return (Field*) 0;
4517
4518
        thd->clear_error();
4519
        cur_field= find_field_in_table_ref(thd, cur_table, name, length,
4520
                                           item->name, db, table_name, ref,
4521
                                           false,
4522
                                           allow_rowid,
4523
                                           &(item->cached_field_index),
4524
                                           register_tree_change,
4525
                                           &actual_table);
4526
        if (cur_field)
4527
        {
4528
          Field *nf=new Field_null(NULL,0,Field::NONE,
4529
                                   cur_field->field_name,
4530
                                   &my_charset_bin);
4531
          nf->init(cur_table->table);
4532
          cur_field= nf;
4533
        }
4534
      }
4535
4536
      /*
4537
        Store the original table of the field, which may be different from
4538
        cur_table in the case of NATURAL/USING join.
4539
      */
4540
      item->cached_table= (!actual_table->cacheable_table || found) ?
4541
                          0 : actual_table;
4542
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
4543
      assert(thd->where);
1 by brian
clean slate
4544
      /*
4545
        If we found a fully qualified field we return it directly as it can't
4546
        have duplicates.
4547
       */
4548
      if (db)
4549
        return cur_field;
4550
4551
      if (found)
4552
      {
4553
        if (report_error == REPORT_ALL_ERRORS ||
4554
            report_error == IGNORE_EXCEPT_NON_UNIQUE)
4555
          my_error(ER_NON_UNIQ_ERROR, MYF(0),
4556
                   table_name ? item->full_name() : name, thd->where);
4557
        return (Field*) 0;
4558
      }
4559
      found= cur_field;
4560
    }
4561
  }
4562
4563
  if (found)
4564
    return found;
4565
4566
  /*
4567
    If the field was qualified and there were no tables to search, issue
4568
    an error that an unknown table was given. The situation is detected
4569
    as follows: if there were no tables we wouldn't go through the loop
4570
    and cur_table wouldn't be updated by the loop increment part, so it
4571
    will be equal to the first table.
4572
  */
4573
  if (table_name && (cur_table == first_table) &&
4574
      (report_error == REPORT_ALL_ERRORS ||
4575
       report_error == REPORT_EXCEPT_NON_UNIQUE))
4576
  {
4577
    char buff[NAME_LEN*2+1];
4578
    if (db && db[0])
4579
    {
4580
      strxnmov(buff,sizeof(buff)-1,db,".",table_name,NullS);
4581
      table_name=buff;
4582
    }
4583
    my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, thd->where);
4584
  }
4585
  else
4586
  {
4587
    if (report_error == REPORT_ALL_ERRORS ||
4588
        report_error == REPORT_EXCEPT_NON_UNIQUE)
4589
      my_error(ER_BAD_FIELD_ERROR, MYF(0), item->full_name(), thd->where);
4590
    else
4591
      found= not_found_field;
4592
  }
4593
  return found;
4594
}
4595
4596
4597
/*
4598
  Find Item in list of items (find_field_in_tables analog)
4599
4600
  TODO
4601
    is it better return only counter?
4602
4603
  SYNOPSIS
4604
    find_item_in_list()
4605
    find			Item to find
4606
    items			List of items
4607
    counter			To return number of found item
4608
    report_error
4609
      REPORT_ALL_ERRORS		report errors, return 0 if error
4610
      REPORT_EXCEPT_NOT_FOUND	Do not report 'not found' error and
4611
				return not_found_item, report other errors,
4612
				return 0
4613
      IGNORE_ERRORS		Do not report errors, return 0 if error
4614
    resolution                  Set to the resolution type if the item is found 
4615
                                (it says whether the item is resolved 
4616
                                 against an alias name,
4617
                                 or as a field name without alias,
4618
                                 or as a field hidden by alias,
4619
                                 or ignoring alias)
4620
                                
4621
  RETURN VALUES
4622
    0			Item is not found or item is not unique,
4623
			error message is reported
4624
    not_found_item	Function was called with
4625
			report_error == REPORT_EXCEPT_NOT_FOUND and
4626
			item was not found. No error message was reported
4627
                        found field
4628
*/
4629
4630
/* Special Item pointer to serve as a return value from find_item_in_list(). */
4631
Item **not_found_item= (Item**) 0x1;
4632
4633
4634
Item **
4635
find_item_in_list(Item *find, List<Item> &items, uint *counter,
4636
                  find_item_error_report_type report_error,
4637
                  enum_resolution_type *resolution)
4638
{
4639
  List_iterator<Item> li(items);
4640
  Item **found=0, **found_unaliased= 0, *item;
4641
  const char *db_name=0;
4642
  const char *field_name=0;
4643
  const char *table_name=0;
4644
  bool found_unaliased_non_uniq= 0;
4645
  /*
4646
    true if the item that we search for is a valid name reference
4647
    (and not an item that happens to have a name).
4648
  */
4649
  bool is_ref_by_name= 0;
4650
  uint unaliased_counter= 0;
4651
4652
  *resolution= NOT_RESOLVED;
4653
4654
  is_ref_by_name= (find->type() == Item::FIELD_ITEM  || 
4655
                   find->type() == Item::REF_ITEM);
4656
  if (is_ref_by_name)
4657
  {
4658
    field_name= ((Item_ident*) find)->field_name;
4659
    table_name= ((Item_ident*) find)->table_name;
4660
    db_name=    ((Item_ident*) find)->db_name;
4661
  }
4662
4663
  for (uint i= 0; (item=li++); i++)
4664
  {
4665
    if (field_name && item->real_item()->type() == Item::FIELD_ITEM)
4666
    {
4667
      Item_ident *item_field= (Item_ident*) item;
4668
4669
      /*
4670
	In case of group_concat() with ORDER BY condition in the QUERY
4671
	item_field can be field of temporary table without item name 
4672
	(if this field created from expression argument of group_concat()),
4673
	=> we have to check presence of name before compare
4674
      */ 
4675
      if (!item_field->name)
4676
        continue;
4677
4678
      if (table_name)
4679
      {
4680
        /*
4681
          If table name is specified we should find field 'field_name' in
4682
          table 'table_name'. According to SQL-standard we should ignore
4683
          aliases in this case.
4684
4685
          Since we should NOT prefer fields from the select list over
4686
          other fields from the tables participating in this select in
4687
          case of ambiguity we have to do extra check outside this function.
4688
4689
          We use strcmp for table names and database names as these may be
4690
          case sensitive. In cases where they are not case sensitive, they
4691
          are always in lower case.
4692
4693
	  item_field->field_name and item_field->table_name can be 0x0 if
4694
	  item is not fix_field()'ed yet.
4695
        */
4696
        if (item_field->field_name && item_field->table_name &&
4697
	    !my_strcasecmp(system_charset_info, item_field->field_name,
4698
                           field_name) &&
4699
            !my_strcasecmp(table_alias_charset, item_field->table_name, 
4700
                           table_name) &&
4701
            (!db_name || (item_field->db_name &&
4702
                          !strcmp(item_field->db_name, db_name))))
4703
        {
4704
          if (found_unaliased)
4705
          {
4706
            if ((*found_unaliased)->eq(item, 0))
4707
              continue;
4708
            /*
4709
              Two matching fields in select list.
4710
              We already can bail out because we are searching through
4711
              unaliased names only and will have duplicate error anyway.
4712
            */
4713
            if (report_error != IGNORE_ERRORS)
4714
              my_error(ER_NON_UNIQ_ERROR, MYF(0),
4715
                       find->full_name(), current_thd->where);
4716
            return (Item**) 0;
4717
          }
4718
          found_unaliased= li.ref();
4719
          unaliased_counter= i;
4720
          *resolution= RESOLVED_IGNORING_ALIAS;
4721
          if (db_name)
4722
            break;                              // Perfect match
4723
        }
4724
      }
4725
      else
4726
      {
4727
        int fname_cmp= my_strcasecmp(system_charset_info,
4728
                                     item_field->field_name,
4729
                                     field_name);
4730
        if (!my_strcasecmp(system_charset_info,
4731
                           item_field->name,field_name))
4732
        {
4733
          /*
4734
            If table name was not given we should scan through aliases
4735
            and non-aliased fields first. We are also checking unaliased
4736
            name of the field in then next  else-if, to be able to find
4737
            instantly field (hidden by alias) if no suitable alias or
4738
            non-aliased field was found.
4739
          */
4740
          if (found)
4741
          {
4742
            if ((*found)->eq(item, 0))
4743
              continue;                           // Same field twice
4744
            if (report_error != IGNORE_ERRORS)
4745
              my_error(ER_NON_UNIQ_ERROR, MYF(0),
4746
                       find->full_name(), current_thd->where);
4747
            return (Item**) 0;
4748
          }
4749
          found= li.ref();
4750
          *counter= i;
4751
          *resolution= fname_cmp ? RESOLVED_AGAINST_ALIAS:
4752
	                           RESOLVED_WITH_NO_ALIAS;
4753
        }
4754
        else if (!fname_cmp)
4755
        {
4756
          /*
4757
            We will use non-aliased field or react on such ambiguities only if
4758
            we won't be able to find aliased field.
4759
            Again if we have ambiguity with field outside of select list
4760
            we should prefer fields from select list.
4761
          */
4762
          if (found_unaliased)
4763
          {
4764
            if ((*found_unaliased)->eq(item, 0))
4765
              continue;                           // Same field twice
4766
            found_unaliased_non_uniq= 1;
4767
          }
4768
          found_unaliased= li.ref();
4769
          unaliased_counter= i;
4770
        }
4771
      }
4772
    }
4773
    else if (!table_name)
4774
    { 
4775
      if (is_ref_by_name && find->name && item->name &&
4776
	  !my_strcasecmp(system_charset_info,item->name,find->name))
4777
      {
4778
        found= li.ref();
4779
        *counter= i;
4780
        *resolution= RESOLVED_AGAINST_ALIAS;
4781
        break;
4782
      }
4783
      else if (find->eq(item,0))
4784
      {
4785
        found= li.ref();
4786
        *counter= i;
4787
        *resolution= RESOLVED_IGNORING_ALIAS;
4788
        break;
4789
      }
4790
    }
4791
    else if (table_name && item->type() == Item::REF_ITEM &&
4792
             ((Item_ref *)item)->ref_type() == Item_ref::VIEW_REF)
4793
    {
4794
      /*
4795
        TODO:Here we process prefixed view references only. What we should 
4796
        really do is process all types of Item_refs. But this will currently 
4797
        lead to a clash with the way references to outer SELECTs (from the 
4798
        HAVING clause) are handled in e.g. :
4799
        SELECT 1 FROM t1 AS t1_o GROUP BY a
4800
          HAVING (SELECT t1_o.a FROM t1 AS t1_i GROUP BY t1_i.a LIMIT 1).
4801
        Processing all Item_refs here will cause t1_o.a to resolve to itself.
4802
        We still need to process the special case of Item_direct_view_ref 
4803
        because in the context of views they have the same meaning as 
4804
        Item_field for tables.
4805
      */
4806
      Item_ident *item_ref= (Item_ident *) item;
4807
      if (item_ref->name && item_ref->table_name &&
4808
          !my_strcasecmp(system_charset_info, item_ref->name, field_name) &&
4809
          !my_strcasecmp(table_alias_charset, item_ref->table_name,
4810
                         table_name) &&
4811
          (!db_name || (item_ref->db_name && 
4812
                        !strcmp (item_ref->db_name, db_name))))
4813
      {
4814
        found= li.ref();
4815
        *counter= i;
4816
        *resolution= RESOLVED_IGNORING_ALIAS;
4817
        break;
4818
      }
4819
    }
4820
  }
4821
  if (!found)
4822
  {
4823
    if (found_unaliased_non_uniq)
4824
    {
4825
      if (report_error != IGNORE_ERRORS)
4826
        my_error(ER_NON_UNIQ_ERROR, MYF(0),
4827
                 find->full_name(), current_thd->where);
4828
      return (Item **) 0;
4829
    }
4830
    if (found_unaliased)
4831
    {
4832
      found= found_unaliased;
4833
      *counter= unaliased_counter;
4834
      *resolution= RESOLVED_BEHIND_ALIAS;
4835
    }
4836
  }
4837
  if (found)
4838
    return found;
4839
  if (report_error != REPORT_EXCEPT_NOT_FOUND)
4840
  {
4841
    if (report_error == REPORT_ALL_ERRORS)
4842
      my_error(ER_BAD_FIELD_ERROR, MYF(0),
4843
               find->full_name(), current_thd->where);
4844
    return (Item **) 0;
4845
  }
4846
  else
4847
    return (Item **) not_found_item;
4848
}
4849
4850
4851
/*
4852
  Test if a string is a member of a list of strings.
4853
4854
  SYNOPSIS
4855
    test_if_string_in_list()
4856
    find      the string to look for
4857
    str_list  a list of strings to be searched
4858
4859
  DESCRIPTION
4860
    Sequentially search a list of strings for a string, and test whether
4861
    the list contains the same string.
4862
4863
  RETURN
55 by brian
Update for using real bool types.
4864
    true  if find is in str_list
4865
    false otherwise
1 by brian
clean slate
4866
*/
4867
4868
static bool
4869
test_if_string_in_list(const char *find, List<String> *str_list)
4870
{
4871
  List_iterator<String> str_list_it(*str_list);
4872
  String *curr_str;
4873
  size_t find_length= strlen(find);
4874
  while ((curr_str= str_list_it++))
4875
  {
4876
    if (find_length != curr_str->length())
4877
      continue;
4878
    if (!my_strcasecmp(system_charset_info, find, curr_str->ptr()))
55 by brian
Update for using real bool types.
4879
      return true;
1 by brian
clean slate
4880
  }
55 by brian
Update for using real bool types.
4881
  return false;
1 by brian
clean slate
4882
}
4883
4884
4885
/*
4886
  Create a new name resolution context for an item so that it is
4887
  being resolved in a specific table reference.
4888
4889
  SYNOPSIS
4890
    set_new_item_local_context()
4891
    thd        pointer to current thread
4892
    item       item for which new context is created and set
4893
    table_ref  table ref where an item showld be resolved
4894
4895
  DESCRIPTION
4896
    Create a new name resolution context for an item, so that the item
4897
    is resolved only the supplied 'table_ref'.
4898
4899
  RETURN
55 by brian
Update for using real bool types.
4900
    false  if all OK
4901
    true   otherwise
1 by brian
clean slate
4902
*/
4903
4904
static bool
327.2.4 by Brian Aker
Refactoring table.h
4905
set_new_item_local_context(THD *thd, Item_ident *item, TableList *table_ref)
1 by brian
clean slate
4906
{
4907
  Name_resolution_context *context;
4908
  if (!(context= new (thd->mem_root) Name_resolution_context))
55 by brian
Update for using real bool types.
4909
    return true;
1 by brian
clean slate
4910
  context->init();
4911
  context->first_name_resolution_table=
4912
    context->last_name_resolution_table= table_ref;
4913
  item->context= context;
55 by brian
Update for using real bool types.
4914
  return false;
1 by brian
clean slate
4915
}
4916
4917
4918
/*
4919
  Find and mark the common columns of two table references.
4920
4921
  SYNOPSIS
4922
    mark_common_columns()
4923
    thd                [in] current thread
4924
    table_ref_1        [in] the first (left) join operand
4925
    table_ref_2        [in] the second (right) join operand
4926
    using_fields       [in] if the join is JOIN...USING - the join columns,
4927
                            if NATURAL join, then NULL
4928
    found_using_fields [out] number of fields from the USING clause that were
4929
                             found among the common fields
4930
4931
  DESCRIPTION
4932
    The procedure finds the common columns of two relations (either
4933
    tables or intermediate join results), and adds an equi-join condition
4934
    to the ON clause of 'table_ref_2' for each pair of matching columns.
4935
    If some of table_ref_XXX represents a base table or view, then we
4936
    create new 'Natural_join_column' instances for each column
4937
    reference and store them in the 'join_columns' of the table
4938
    reference.
4939
4940
  IMPLEMENTATION
4941
    The procedure assumes that store_natural_using_join_columns() was
4942
    called for the previous level of NATURAL/USING joins.
4943
4944
  RETURN
55 by brian
Update for using real bool types.
4945
    true   error when some common column is non-unique, or out of memory
4946
    false  OK
1 by brian
clean slate
4947
*/
4948
4949
static bool
327.2.4 by Brian Aker
Refactoring table.h
4950
mark_common_columns(THD *thd, TableList *table_ref_1, TableList *table_ref_2,
1 by brian
clean slate
4951
                    List<String> *using_fields, uint *found_using_fields)
4952
{
4953
  Field_iterator_table_ref it_1, it_2;
4954
  Natural_join_column *nj_col_1, *nj_col_2;
55 by brian
Update for using real bool types.
4955
  bool result= true;
4956
  bool first_outer_loop= true;
1 by brian
clean slate
4957
  /*
4958
    Leaf table references to which new natural join columns are added
4959
    if the leaves are != NULL.
4960
  */
327.2.4 by Brian Aker
Refactoring table.h
4961
  TableList *leaf_1= (table_ref_1->nested_join &&
1 by brian
clean slate
4962
                       !table_ref_1->is_natural_join) ?
4963
                      NULL : table_ref_1;
327.2.4 by Brian Aker
Refactoring table.h
4964
  TableList *leaf_2= (table_ref_2->nested_join &&
1 by brian
clean slate
4965
                       !table_ref_2->is_natural_join) ?
4966
                      NULL : table_ref_2;
4967
4968
  *found_using_fields= 0;
4969
4970
  for (it_1.set(table_ref_1); !it_1.end_of_fields(); it_1.next())
4971
  {
55 by brian
Update for using real bool types.
4972
    bool found= false;
1 by brian
clean slate
4973
    const char *field_name_1;
4974
    /* true if field_name_1 is a member of using_fields */
4975
    bool is_using_column_1;
4976
    if (!(nj_col_1= it_1.get_or_create_column_ref(leaf_1)))
4977
      goto err;
4978
    field_name_1= nj_col_1->name();
4979
    is_using_column_1= using_fields && 
4980
      test_if_string_in_list(field_name_1, using_fields);
4981
4982
    /*
4983
      Find a field with the same name in table_ref_2.
4984
4985
      Note that for the second loop, it_2.set() will iterate over
4986
      table_ref_2->join_columns and not generate any new elements or
4987
      lists.
4988
    */
4989
    nj_col_2= NULL;
4990
    for (it_2.set(table_ref_2); !it_2.end_of_fields(); it_2.next())
4991
    {
4992
      Natural_join_column *cur_nj_col_2;
4993
      const char *cur_field_name_2;
4994
      if (!(cur_nj_col_2= it_2.get_or_create_column_ref(leaf_2)))
4995
        goto err;
4996
      cur_field_name_2= cur_nj_col_2->name();
4997
4998
      /*
4999
        Compare the two columns and check for duplicate common fields.
5000
        A common field is duplicate either if it was already found in
55 by brian
Update for using real bool types.
5001
        table_ref_2 (then found == true), or if a field in table_ref_2
1 by brian
clean slate
5002
        was already matched by some previous field in table_ref_1
55 by brian
Update for using real bool types.
5003
        (then cur_nj_col_2->is_common == true).
1 by brian
clean slate
5004
        Note that it is too early to check the columns outside of the
5005
        USING list for ambiguity because they are not actually "referenced"
5006
        here. These columns must be checked only on unqualified reference 
5007
        by name (e.g. in SELECT list).
5008
      */
5009
      if (!my_strcasecmp(system_charset_info, field_name_1, cur_field_name_2))
5010
      {
5011
        if (cur_nj_col_2->is_common ||
5012
            (found && (!using_fields || is_using_column_1)))
5013
        {
5014
          my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1, thd->where);
5015
          goto err;
5016
        }
5017
        nj_col_2= cur_nj_col_2;
55 by brian
Update for using real bool types.
5018
        found= true;
1 by brian
clean slate
5019
      }
5020
    }
5021
    if (first_outer_loop && leaf_2)
5022
    {
5023
      /*
5024
        Make sure that the next inner loop "knows" that all columns
5025
        are materialized already.
5026
      */
55 by brian
Update for using real bool types.
5027
      leaf_2->is_join_columns_complete= true;
5028
      first_outer_loop= false;
1 by brian
clean slate
5029
    }
5030
    if (!found)
5031
      continue;                                 // No matching field
5032
5033
    /*
5034
      field_1 and field_2 have the same names. Check if they are in the USING
5035
      clause (if present), mark them as common fields, and add a new
5036
      equi-join condition to the ON clause.
5037
    */
5038
    if (nj_col_2 && (!using_fields ||is_using_column_1))
5039
    {
5040
      Item *item_1=   nj_col_1->create_item(thd);
5041
      Item *item_2=   nj_col_2->create_item(thd);
5042
      Field *field_1= nj_col_1->field();
5043
      Field *field_2= nj_col_2->field();
5044
      Item_ident *item_ident_1, *item_ident_2;
5045
      Item_func_eq *eq_cond;
5046
5047
      if (!item_1 || !item_2)
5048
        goto err;                               // out of memory
5049
5050
      /*
5051
        In the case of no_wrap_view_item == 0, the created items must be
5052
        of sub-classes of Item_ident.
5053
      */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5054
      assert(item_1->type() == Item::FIELD_ITEM ||
1 by brian
clean slate
5055
                  item_1->type() == Item::REF_ITEM);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5056
      assert(item_2->type() == Item::FIELD_ITEM ||
1 by brian
clean slate
5057
                  item_2->type() == Item::REF_ITEM);
5058
5059
      /*
5060
        We need to cast item_1,2 to Item_ident, because we need to hook name
5061
        resolution contexts specific to each item.
5062
      */
5063
      item_ident_1= (Item_ident*) item_1;
5064
      item_ident_2= (Item_ident*) item_2;
5065
      /*
5066
        Create and hook special name resolution contexts to each item in the
5067
        new join condition . We need this to both speed-up subsequent name
5068
        resolution of these items, and to enable proper name resolution of
5069
        the items during the execute phase of PS.
5070
      */
5071
      if (set_new_item_local_context(thd, item_ident_1, nj_col_1->table_ref) ||
5072
          set_new_item_local_context(thd, item_ident_2, nj_col_2->table_ref))
5073
        goto err;
5074
5075
      if (!(eq_cond= new Item_func_eq(item_ident_1, item_ident_2)))
5076
        goto err;                               /* Out of memory. */
5077
5078
      /*
5079
        Add the new equi-join condition to the ON clause. Notice that
5080
        fix_fields() is applied to all ON conditions in setup_conds()
5081
        so we don't do it here.
5082
       */
5083
      add_join_on((table_ref_1->outer_join & JOIN_TYPE_RIGHT ?
5084
                   table_ref_1 : table_ref_2),
5085
                  eq_cond);
5086
55 by brian
Update for using real bool types.
5087
      nj_col_1->is_common= nj_col_2->is_common= true;
1 by brian
clean slate
5088
5089
      if (field_1)
5090
      {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
5091
        Table *table_1= nj_col_1->table_ref->table;
1 by brian
clean slate
5092
        /* Mark field_1 used for table cache. */
5093
        bitmap_set_bit(table_1->read_set, field_1->field_index);
5094
        table_1->covering_keys.intersect(field_1->part_of_key);
5095
        table_1->merge_keys.merge(field_1->part_of_key);
5096
      }
5097
      if (field_2)
5098
      {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
5099
        Table *table_2= nj_col_2->table_ref->table;
1 by brian
clean slate
5100
        /* Mark field_2 used for table cache. */
5101
        bitmap_set_bit(table_2->read_set, field_2->field_index);
5102
        table_2->covering_keys.intersect(field_2->part_of_key);
5103
        table_2->merge_keys.merge(field_2->part_of_key);
5104
      }
5105
5106
      if (using_fields != NULL)
5107
        ++(*found_using_fields);
5108
    }
5109
  }
5110
  if (leaf_1)
55 by brian
Update for using real bool types.
5111
    leaf_1->is_join_columns_complete= true;
1 by brian
clean slate
5112
5113
  /*
5114
    Everything is OK.
5115
    Notice that at this point there may be some column names in the USING
5116
    clause that are not among the common columns. This is an SQL error and
5117
    we check for this error in store_natural_using_join_columns() when
5118
    (found_using_fields < length(join_using_fields)).
5119
  */
55 by brian
Update for using real bool types.
5120
  result= false;
1 by brian
clean slate
5121
5122
err:
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5123
  return(result);
1 by brian
clean slate
5124
}
5125
5126
5127
5128
/*
5129
  Materialize and store the row type of NATURAL/USING join.
5130
5131
  SYNOPSIS
5132
    store_natural_using_join_columns()
5133
    thd                current thread
5134
    natural_using_join the table reference of the NATURAL/USING join
5135
    table_ref_1        the first (left) operand (of a NATURAL/USING join).
5136
    table_ref_2        the second (right) operand (of a NATURAL/USING join).
5137
    using_fields       if the join is JOIN...USING - the join columns,
5138
                       if NATURAL join, then NULL
5139
    found_using_fields number of fields from the USING clause that were
5140
                       found among the common fields
5141
5142
  DESCRIPTION
5143
    Iterate over the columns of both join operands and sort and store
5144
    all columns into the 'join_columns' list of natural_using_join
5145
    where the list is formed by three parts:
5146
      part1: The coalesced columns of table_ref_1 and table_ref_2,
5147
             sorted according to the column order of the first table.
5148
      part2: The other columns of the first table, in the order in
5149
             which they were defined in CREATE TABLE.
5150
      part3: The other columns of the second table, in the order in
5151
             which they were defined in CREATE TABLE.
5152
    Time complexity - O(N1+N2), where Ni = length(table_ref_i).
5153
5154
  IMPLEMENTATION
5155
    The procedure assumes that mark_common_columns() has been called
5156
    for the join that is being processed.
5157
5158
  RETURN
55 by brian
Update for using real bool types.
5159
    true    error: Some common column is ambiguous
5160
    false   OK
1 by brian
clean slate
5161
*/
5162
5163
static bool
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
5164
store_natural_using_join_columns(THD *thd __attribute__((unused)),
327.2.4 by Brian Aker
Refactoring table.h
5165
                                 TableList *natural_using_join,
5166
                                 TableList *table_ref_1,
5167
                                 TableList *table_ref_2,
1 by brian
clean slate
5168
                                 List<String> *using_fields,
5169
                                 uint found_using_fields)
5170
{
5171
  Field_iterator_table_ref it_1, it_2;
5172
  Natural_join_column *nj_col_1, *nj_col_2;
55 by brian
Update for using real bool types.
5173
  bool result= true;
1 by brian
clean slate
5174
  List<Natural_join_column> *non_join_columns;
5175
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5176
  assert(!natural_using_join->join_columns);
1 by brian
clean slate
5177
5178
  if (!(non_join_columns= new List<Natural_join_column>) ||
5179
      !(natural_using_join->join_columns= new List<Natural_join_column>))
5180
    goto err;
5181
5182
  /* Append the columns of the first join operand. */
5183
  for (it_1.set(table_ref_1); !it_1.end_of_fields(); it_1.next())
5184
  {
5185
    nj_col_1= it_1.get_natural_column_ref();
5186
    if (nj_col_1->is_common)
5187
    {
5188
      natural_using_join->join_columns->push_back(nj_col_1);
5189
      /* Reset the common columns for the next call to mark_common_columns. */
55 by brian
Update for using real bool types.
5190
      nj_col_1->is_common= false;
1 by brian
clean slate
5191
    }
5192
    else
5193
      non_join_columns->push_back(nj_col_1);
5194
  }
5195
5196
  /*
5197
    Check that all columns in the USING clause are among the common
5198
    columns. If this is not the case, report the first one that was
5199
    not found in an error.
5200
  */
5201
  if (using_fields && found_using_fields < using_fields->elements)
5202
  {
5203
    String *using_field_name;
5204
    List_iterator_fast<String> using_fields_it(*using_fields);
5205
    while ((using_field_name= using_fields_it++))
5206
    {
5207
      const char *using_field_name_ptr= using_field_name->c_ptr();
5208
      List_iterator_fast<Natural_join_column>
5209
        it(*(natural_using_join->join_columns));
5210
      Natural_join_column *common_field;
5211
5212
      for (;;)
5213
      {
5214
        /* If reached the end of fields, and none was found, report error. */
5215
        if (!(common_field= it++))
5216
        {
5217
          my_error(ER_BAD_FIELD_ERROR, MYF(0), using_field_name_ptr,
5218
                   current_thd->where);
5219
          goto err;
5220
        }
5221
        if (!my_strcasecmp(system_charset_info,
5222
                           common_field->name(), using_field_name_ptr))
5223
          break;                                // Found match
5224
      }
5225
    }
5226
  }
5227
5228
  /* Append the non-equi-join columns of the second join operand. */
5229
  for (it_2.set(table_ref_2); !it_2.end_of_fields(); it_2.next())
5230
  {
5231
    nj_col_2= it_2.get_natural_column_ref();
5232
    if (!nj_col_2->is_common)
5233
      non_join_columns->push_back(nj_col_2);
5234
    else
5235
    {
5236
      /* Reset the common columns for the next call to mark_common_columns. */
55 by brian
Update for using real bool types.
5237
      nj_col_2->is_common= false;
1 by brian
clean slate
5238
    }
5239
  }
5240
5241
  if (non_join_columns->elements > 0)
5242
    natural_using_join->join_columns->concat(non_join_columns);
55 by brian
Update for using real bool types.
5243
  natural_using_join->is_join_columns_complete= true;
1 by brian
clean slate
5244
55 by brian
Update for using real bool types.
5245
  result= false;
1 by brian
clean slate
5246
5247
err:
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5248
  return(result);
1 by brian
clean slate
5249
}
5250
5251
5252
/*
5253
  Precompute and store the row types of the top-most NATURAL/USING joins.
5254
5255
  SYNOPSIS
5256
    store_top_level_join_columns()
5257
    thd            current thread
5258
    table_ref      nested join or table in a FROM clause
5259
    left_neighbor  neighbor table reference to the left of table_ref at the
5260
                   same level in the join tree
5261
    right_neighbor neighbor table reference to the right of table_ref at the
5262
                   same level in the join tree
5263
5264
  DESCRIPTION
5265
    The procedure performs a post-order traversal of a nested join tree
5266
    and materializes the row types of NATURAL/USING joins in a
327.2.4 by Brian Aker
Refactoring table.h
5267
    bottom-up manner until it reaches the TableList elements that
1 by brian
clean slate
5268
    represent the top-most NATURAL/USING joins. The procedure should be
5269
    applied to each element of SELECT_LEX::top_join_list (i.e. to each
5270
    top-level element of the FROM clause).
5271
5272
  IMPLEMENTATION
5273
    Notice that the table references in the list nested_join->join_list
5274
    are in reverse order, thus when we iterate over it, we are moving
5275
    from the right to the left in the FROM clause.
5276
5277
  RETURN
55 by brian
Update for using real bool types.
5278
    true   Error
5279
    false  OK
1 by brian
clean slate
5280
*/
5281
5282
static bool
327.2.4 by Brian Aker
Refactoring table.h
5283
store_top_level_join_columns(THD *thd, TableList *table_ref,
5284
                             TableList *left_neighbor,
5285
                             TableList *right_neighbor)
1 by brian
clean slate
5286
{
55 by brian
Update for using real bool types.
5287
  bool result= true;
1 by brian
clean slate
5288
5289
  /* Call the procedure recursively for each nested table reference. */
5290
  if (table_ref->nested_join)
5291
  {
327.2.4 by Brian Aker
Refactoring table.h
5292
    List_iterator_fast<TableList> nested_it(table_ref->nested_join->join_list);
5293
    TableList *same_level_left_neighbor= nested_it++;
5294
    TableList *same_level_right_neighbor= NULL;
1 by brian
clean slate
5295
    /* Left/right-most neighbors, possibly at higher levels in the join tree. */
327.2.4 by Brian Aker
Refactoring table.h
5296
    TableList *real_left_neighbor, *real_right_neighbor;
1 by brian
clean slate
5297
5298
    while (same_level_left_neighbor)
5299
    {
327.2.4 by Brian Aker
Refactoring table.h
5300
      TableList *cur_table_ref= same_level_left_neighbor;
1 by brian
clean slate
5301
      same_level_left_neighbor= nested_it++;
5302
      /*
5303
        The order of RIGHT JOIN operands is reversed in 'join list' to
5304
        transform it into a LEFT JOIN. However, in this procedure we need
5305
        the join operands in their lexical order, so below we reverse the
5306
        join operands. Notice that this happens only in the first loop,
5307
        and not in the second one, as in the second loop
5308
        same_level_left_neighbor == NULL.
5309
        This is the correct behavior, because the second loop sets
5310
        cur_table_ref reference correctly after the join operands are
5311
        swapped in the first loop.
5312
      */
5313
      if (same_level_left_neighbor &&
5314
          cur_table_ref->outer_join & JOIN_TYPE_RIGHT)
5315
      {
5316
        /* This can happen only for JOIN ... ON. */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5317
        assert(table_ref->nested_join->join_list.elements == 2);
322.2.2 by Mats Kindahl
Hiding THD::proc_info field and providing a setter and getter.
5318
        std::swap(same_level_left_neighbor, cur_table_ref);
1 by brian
clean slate
5319
      }
5320
5321
      /*
5322
        Pick the parent's left and right neighbors if there are no immediate
5323
        neighbors at the same level.
5324
      */
5325
      real_left_neighbor=  (same_level_left_neighbor) ?
5326
                           same_level_left_neighbor : left_neighbor;
5327
      real_right_neighbor= (same_level_right_neighbor) ?
5328
                           same_level_right_neighbor : right_neighbor;
5329
5330
      if (cur_table_ref->nested_join &&
5331
          store_top_level_join_columns(thd, cur_table_ref,
5332
                                       real_left_neighbor, real_right_neighbor))
5333
        goto err;
5334
      same_level_right_neighbor= cur_table_ref;
5335
    }
5336
  }
5337
5338
  /*
5339
    If this is a NATURAL/USING join, materialize its result columns and
5340
    convert to a JOIN ... ON.
5341
  */
5342
  if (table_ref->is_natural_join)
5343
  {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5344
    assert(table_ref->nested_join &&
1 by brian
clean slate
5345
                table_ref->nested_join->join_list.elements == 2);
327.2.4 by Brian Aker
Refactoring table.h
5346
    List_iterator_fast<TableList> operand_it(table_ref->nested_join->join_list);
1 by brian
clean slate
5347
    /*
5348
      Notice that the order of join operands depends on whether table_ref
5349
      represents a LEFT or a RIGHT join. In a RIGHT join, the operands are
5350
      in inverted order.
5351
     */
327.2.4 by Brian Aker
Refactoring table.h
5352
    TableList *table_ref_2= operand_it++; /* Second NATURAL join operand.*/
5353
    TableList *table_ref_1= operand_it++; /* First NATURAL join operand. */
1 by brian
clean slate
5354
    List<String> *using_fields= table_ref->join_using_fields;
5355
    uint found_using_fields;
5356
5357
    /*
5358
      The two join operands were interchanged in the parser, change the order
5359
      back for 'mark_common_columns'.
5360
    */
5361
    if (table_ref_2->outer_join & JOIN_TYPE_RIGHT)
322.2.2 by Mats Kindahl
Hiding THD::proc_info field and providing a setter and getter.
5362
      std::swap(table_ref_1, table_ref_2);
1 by brian
clean slate
5363
    if (mark_common_columns(thd, table_ref_1, table_ref_2,
5364
                            using_fields, &found_using_fields))
5365
      goto err;
5366
5367
    /*
5368
      Swap the join operands back, so that we pick the columns of the second
5369
      one as the coalesced columns. In this way the coalesced columns are the
5370
      same as of an equivalent LEFT JOIN.
5371
    */
5372
    if (table_ref_1->outer_join & JOIN_TYPE_RIGHT)
322.2.2 by Mats Kindahl
Hiding THD::proc_info field and providing a setter and getter.
5373
      std::swap(table_ref_1, table_ref_2);
1 by brian
clean slate
5374
    if (store_natural_using_join_columns(thd, table_ref, table_ref_1,
5375
                                         table_ref_2, using_fields,
5376
                                         found_using_fields))
5377
      goto err;
5378
5379
    /*
5380
      Change NATURAL JOIN to JOIN ... ON. We do this for both operands
5381
      because either one of them or the other is the one with the
5382
      natural join flag because RIGHT joins are transformed into LEFT,
5383
      and the two tables may be reordered.
5384
    */
5385
    table_ref_1->natural_join= table_ref_2->natural_join= NULL;
5386
55 by brian
Update for using real bool types.
5387
    /* Add a true condition to outer joins that have no common columns. */
1 by brian
clean slate
5388
    if (table_ref_2->outer_join &&
5389
        !table_ref_1->on_expr && !table_ref_2->on_expr)
152 by Brian Aker
longlong replacement
5390
      table_ref_2->on_expr= new Item_int((int64_t) 1,1);   /* Always true. */
1 by brian
clean slate
5391
5392
    /* Change this table reference to become a leaf for name resolution. */
5393
    if (left_neighbor)
5394
    {
327.2.4 by Brian Aker
Refactoring table.h
5395
      TableList *last_leaf_on_the_left;
1 by brian
clean slate
5396
      last_leaf_on_the_left= left_neighbor->last_leaf_for_name_resolution();
5397
      last_leaf_on_the_left->next_name_resolution_table= table_ref;
5398
    }
5399
    if (right_neighbor)
5400
    {
327.2.4 by Brian Aker
Refactoring table.h
5401
      TableList *first_leaf_on_the_right;
1 by brian
clean slate
5402
      first_leaf_on_the_right= right_neighbor->first_leaf_for_name_resolution();
5403
      table_ref->next_name_resolution_table= first_leaf_on_the_right;
5404
    }
5405
    else
5406
      table_ref->next_name_resolution_table= NULL;
5407
  }
55 by brian
Update for using real bool types.
5408
  result= false; /* All is OK. */
1 by brian
clean slate
5409
5410
err:
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5411
  return(result);
1 by brian
clean slate
5412
}
5413
5414
5415
/*
5416
  Compute and store the row types of the top-most NATURAL/USING joins
5417
  in a FROM clause.
5418
5419
  SYNOPSIS
5420
    setup_natural_join_row_types()
5421
    thd          current thread
5422
    from_clause  list of top-level table references in a FROM clause
5423
5424
  DESCRIPTION
5425
    Apply the procedure 'store_top_level_join_columns' to each of the
5426
    top-level table referencs of the FROM clause. Adjust the list of tables
5427
    for name resolution - context->first_name_resolution_table to the
5428
    top-most, lef-most NATURAL/USING join.
5429
5430
  IMPLEMENTATION
5431
    Notice that the table references in 'from_clause' are in reverse
5432
    order, thus when we iterate over it, we are moving from the right
5433
    to the left in the FROM clause.
5434
5435
  RETURN
55 by brian
Update for using real bool types.
5436
    true   Error
5437
    false  OK
1 by brian
clean slate
5438
*/
5439
static bool setup_natural_join_row_types(THD *thd,
327.2.4 by Brian Aker
Refactoring table.h
5440
                                         List<TableList> *from_clause,
1 by brian
clean slate
5441
                                         Name_resolution_context *context)
5442
{
5443
  thd->where= "from clause";
5444
  if (from_clause->elements == 0)
55 by brian
Update for using real bool types.
5445
    return false; /* We come here in the case of UNIONs. */
1 by brian
clean slate
5446
327.2.4 by Brian Aker
Refactoring table.h
5447
  List_iterator_fast<TableList> table_ref_it(*from_clause);
5448
  TableList *table_ref; /* Current table reference. */
1 by brian
clean slate
5449
  /* Table reference to the left of the current. */
327.2.4 by Brian Aker
Refactoring table.h
5450
  TableList *left_neighbor;
1 by brian
clean slate
5451
  /* Table reference to the right of the current. */
327.2.4 by Brian Aker
Refactoring table.h
5452
  TableList *right_neighbor= NULL;
1 by brian
clean slate
5453
5454
  /* Note that tables in the list are in reversed order */
5455
  for (left_neighbor= table_ref_it++; left_neighbor ; )
5456
  {
5457
    table_ref= left_neighbor;
5458
    left_neighbor= table_ref_it++;
5459
    /* For stored procedures do not redo work if already done. */
5460
    if (context->select_lex->first_execution)
5461
    {
5462
      if (store_top_level_join_columns(thd, table_ref,
5463
                                       left_neighbor, right_neighbor))
55 by brian
Update for using real bool types.
5464
        return true;
1 by brian
clean slate
5465
      if (left_neighbor)
5466
      {
327.2.4 by Brian Aker
Refactoring table.h
5467
        TableList *first_leaf_on_the_right;
1 by brian
clean slate
5468
        first_leaf_on_the_right= table_ref->first_leaf_for_name_resolution();
5469
        left_neighbor->next_name_resolution_table= first_leaf_on_the_right;
5470
      }
5471
    }
5472
    right_neighbor= table_ref;
5473
  }
5474
5475
  /*
5476
    Store the top-most, left-most NATURAL/USING join, so that we start
5477
    the search from that one instead of context->table_list. At this point
5478
    right_neighbor points to the left-most top-level table reference in the
5479
    FROM clause.
5480
  */
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5481
  assert(right_neighbor);
1 by brian
clean slate
5482
  context->first_name_resolution_table=
5483
    right_neighbor->first_leaf_for_name_resolution();
5484
55 by brian
Update for using real bool types.
5485
  return false;
1 by brian
clean slate
5486
}
5487
5488
5489
/****************************************************************************
5490
** Expand all '*' in given fields
5491
****************************************************************************/
5492
77.1.45 by Monty Taylor
Warning fixes.
5493
int setup_wild(THD *thd,
327.2.4 by Brian Aker
Refactoring table.h
5494
               TableList *tables __attribute__((unused)),
77.1.45 by Monty Taylor
Warning fixes.
5495
               List<Item> &fields,
5496
               List<Item> *sum_func_list,
5497
               uint wild_num)
1 by brian
clean slate
5498
{
5499
  if (!wild_num)
5500
    return(0);
5501
5502
  Item *item;
5503
  List_iterator<Item> it(fields);
5504
5505
  thd->lex->current_select->cur_pos_in_select_list= 0;
5506
  while (wild_num && (item= it++))
5507
  {
5508
    if (item->type() == Item::FIELD_ITEM &&
5509
        ((Item_field*) item)->field_name &&
5510
	((Item_field*) item)->field_name[0] == '*' &&
5511
	!((Item_field*) item)->field)
5512
    {
5513
      uint elem= fields.elements;
5514
      bool any_privileges= ((Item_field *) item)->any_privileges;
5515
      Item_subselect *subsel= thd->lex->current_select->master_unit()->item;
5516
      if (subsel &&
5517
          subsel->substype() == Item_subselect::EXISTS_SUBS)
5518
      {
5519
        /*
5520
          It is EXISTS(SELECT * ...) and we can replace * by any constant.
5521
5522
          Item_int do not need fix_fields() because it is basic constant.
5523
        */
152 by Brian Aker
longlong replacement
5524
        it.replace(new Item_int("Not_used", (int64_t) 1,
1 by brian
clean slate
5525
                                MY_INT64_NUM_DECIMAL_DIGITS));
5526
      }
5527
      else if (insert_fields(thd, ((Item_field*) item)->context,
5528
                             ((Item_field*) item)->db_name,
5529
                             ((Item_field*) item)->table_name, &it,
5530
                             any_privileges))
5531
      {
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5532
	return(-1);
1 by brian
clean slate
5533
      }
5534
      if (sum_func_list)
5535
      {
5536
	/*
5537
	  sum_func_list is a list that has the fields list as a tail.
5538
	  Because of this we have to update the element count also for this
5539
	  list after expanding the '*' entry.
5540
	*/
5541
	sum_func_list->elements+= fields.elements - elem;
5542
      }
5543
      wild_num--;
5544
    }
5545
    else
5546
      thd->lex->current_select->cur_pos_in_select_list++;
5547
  }
5548
  thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5549
  return(0);
1 by brian
clean slate
5550
}
5551
5552
/****************************************************************************
5553
** Check that all given fields exists and fill struct with current data
5554
****************************************************************************/
5555
5556
bool setup_fields(THD *thd, Item **ref_pointer_array,
5557
                  List<Item> &fields, enum_mark_columns mark_used_columns,
5558
                  List<Item> *sum_func_list, bool allow_sum_func)
5559
{
5560
  register Item *item;
5561
  enum_mark_columns save_mark_used_columns= thd->mark_used_columns;
5562
  nesting_map save_allow_sum_func= thd->lex->allow_sum_func;
5563
  List_iterator<Item> it(fields);
5564
  bool save_is_item_list_lookup;
5565
5566
  thd->mark_used_columns= mark_used_columns;
5567
  if (allow_sum_func)
5568
    thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
5569
  thd->where= THD::DEFAULT_WHERE;
5570
  save_is_item_list_lookup= thd->lex->current_select->is_item_list_lookup;
5571
  thd->lex->current_select->is_item_list_lookup= 0;
5572
5573
  /*
5574
    To prevent fail on forward lookup we fill it with zerows,
5575
    then if we got pointer on zero after find_item_in_list we will know
5576
    that it is forward lookup.
5577
5578
    There is other way to solve problem: fill array with pointers to list,
5579
    but it will be slower.
5580
5581
    TODO: remove it when (if) we made one list for allfields and
5582
    ref_pointer_array
5583
  */
5584
  if (ref_pointer_array)
212.6.1 by Mats Kindahl
Replacing all bzero() calls with memset() calls and removing the bzero.c file.
5585
    memset(ref_pointer_array, 0, sizeof(Item *) * fields.elements);
1 by brian
clean slate
5586
5587
  Item **ref= ref_pointer_array;
5588
  thd->lex->current_select->cur_pos_in_select_list= 0;
5589
  while ((item= it++))
5590
  {
5591
    if ((!item->fixed && item->fix_fields(thd, it.ref())) || (item= *(it.ref()))->check_cols(1))
5592
    {
5593
      thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
5594
      thd->lex->allow_sum_func= save_allow_sum_func;
5595
      thd->mark_used_columns= save_mark_used_columns;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5596
      return(true); /* purecov: inspected */
1 by brian
clean slate
5597
    }
5598
    if (ref)
5599
      *(ref++)= item;
5600
    if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM &&
5601
	sum_func_list)
5602
      item->split_sum_func(thd, ref_pointer_array, *sum_func_list);
5603
    thd->used_tables|= item->used_tables();
5604
    thd->lex->current_select->cur_pos_in_select_list++;
5605
  }
5606
  thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
5607
  thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
5608
5609
  thd->lex->allow_sum_func= save_allow_sum_func;
5610
  thd->mark_used_columns= save_mark_used_columns;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5611
  return(test(thd->is_error()));
1 by brian
clean slate
5612
}
5613
5614
5615
/*
5616
  make list of leaves of join table tree
5617
5618
  SYNOPSIS
5619
    make_leaves_list()
5620
    list    pointer to pointer on list first element
5621
    tables  table list
5622
5623
  RETURN pointer on pointer to next_leaf of last element
5624
*/
5625
327.2.4 by Brian Aker
Refactoring table.h
5626
TableList **make_leaves_list(TableList **list, TableList *tables)
1 by brian
clean slate
5627
{
327.2.4 by Brian Aker
Refactoring table.h
5628
  for (TableList *table= tables; table; table= table->next_local)
1 by brian
clean slate
5629
  {
5630
    {
5631
      *list= table;
5632
      list= &table->next_leaf;
5633
    }
5634
  }
5635
  return list;
5636
}
5637
5638
/*
5639
  prepare tables
5640
5641
  SYNOPSIS
5642
    setup_tables()
5643
    thd		  Thread handler
5644
    context       name resolution contest to setup table list there
5645
    from_clause   Top-level list of table references in the FROM clause
5646
    tables	  Table list (select_lex->table_list)
5647
    leaves        List of join table leaves list (select_lex->leaf_tables)
5648
    refresh       It is onle refresh for subquery
5649
    select_insert It is SELECT ... INSERT command
5650
5651
  NOTE
5652
    Check also that the 'used keys' and 'ignored keys' exists and set up the
5653
    table structure accordingly.
5654
    Create a list of leaf tables. For queries with NATURAL/USING JOINs,
5655
    compute the row types of the top most natural/using join table references
5656
    and link these into a list of table references for name resolution.
5657
5658
    This has to be called for all tables that are used by items, as otherwise
5659
    table->map is not set and all Item_field will be regarded as const items.
5660
5661
  RETURN
55 by brian
Update for using real bool types.
5662
    false ok;  In this case *map will includes the chosen index
5663
    true  error
1 by brian
clean slate
5664
*/
5665
5666
bool setup_tables(THD *thd, Name_resolution_context *context,
327.2.4 by Brian Aker
Refactoring table.h
5667
                  List<TableList> *from_clause, TableList *tables,
5668
                  TableList **leaves, bool select_insert)
1 by brian
clean slate
5669
{
5670
  uint tablenr= 0;
5671
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5672
  assert ((select_insert && !tables->next_name_resolution_table) || !tables || 
1 by brian
clean slate
5673
               (context->table_list && context->first_name_resolution_table));
5674
  /*
5675
    this is used for INSERT ... SELECT.
5676
    For select we setup tables except first (and its underlying tables)
5677
  */
327.2.4 by Brian Aker
Refactoring table.h
5678
  TableList *first_select_table= (select_insert ?
1 by brian
clean slate
5679
                                   tables->next_local:
5680
                                   0);
5681
  if (!(*leaves))
5682
    make_leaves_list(leaves, tables);
5683
327.2.4 by Brian Aker
Refactoring table.h
5684
  TableList *table_list;
1 by brian
clean slate
5685
  for (table_list= *leaves;
5686
       table_list;
5687
       table_list= table_list->next_leaf, tablenr++)
5688
  {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
5689
    Table *table= table_list->table;
1 by brian
clean slate
5690
    table->pos_in_table_list= table_list;
5691
    if (first_select_table &&
5692
        table_list->top_table() == first_select_table)
5693
    {
5694
      /* new counting for SELECT of INSERT ... SELECT command */
5695
      first_select_table= 0;
5696
      tablenr= 0;
5697
    }
5698
    setup_table_map(table, table_list, tablenr);
5699
    if (table_list->process_index_hints(table))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5700
      return(1);
1 by brian
clean slate
5701
  }
5702
  if (tablenr > MAX_TABLES)
5703
  {
5704
    my_error(ER_TOO_MANY_TABLES,MYF(0),MAX_TABLES);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5705
    return(1);
1 by brian
clean slate
5706
  }
5707
5708
  /* Precompute and store the row types of NATURAL/USING joins. */
5709
  if (setup_natural_join_row_types(thd, from_clause, context))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5710
    return(1);
1 by brian
clean slate
5711
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5712
  return(0);
1 by brian
clean slate
5713
}
5714
5715
5716
/*
5717
  prepare tables and check access for the view tables
5718
5719
  SYNOPSIS
5720
    setup_tables_and_check_view_access()
5721
    thd		  Thread handler
5722
    context       name resolution contest to setup table list there
5723
    from_clause   Top-level list of table references in the FROM clause
5724
    tables	  Table list (select_lex->table_list)
5725
    conds	  Condition of current SELECT (can be changed by VIEW)
5726
    leaves        List of join table leaves list (select_lex->leaf_tables)
5727
    refresh       It is onle refresh for subquery
5728
    select_insert It is SELECT ... INSERT command
5729
    want_access   what access is needed
5730
5731
  NOTE
5732
    a wrapper for check_tables that will also check the resulting
5733
    table leaves list for access to all the tables that belong to a view
5734
5735
  RETURN
55 by brian
Update for using real bool types.
5736
    false ok;  In this case *map will include the chosen index
5737
    true  error
1 by brian
clean slate
5738
*/
5739
bool setup_tables_and_check_access(THD *thd, 
5740
                                   Name_resolution_context *context,
327.2.4 by Brian Aker
Refactoring table.h
5741
                                   List<TableList> *from_clause,
5742
                                   TableList *tables,
5743
                                   TableList **leaves,
1 by brian
clean slate
5744
                                   bool select_insert)
5745
{
327.2.4 by Brian Aker
Refactoring table.h
5746
  TableList *leaves_tmp= NULL;
1 by brian
clean slate
5747
  bool first_table= true;
5748
5749
  if (setup_tables(thd, context, from_clause, tables,
5750
                   &leaves_tmp, select_insert))
55 by brian
Update for using real bool types.
5751
    return true;
1 by brian
clean slate
5752
5753
  if (leaves)
5754
    *leaves= leaves_tmp;
5755
5756
  for (; leaves_tmp; leaves_tmp= leaves_tmp->next_leaf)
5757
  {
5758
    first_table= 0;
5759
  }
55 by brian
Update for using real bool types.
5760
  return false;
1 by brian
clean slate
5761
}
5762
5763
5764
/*
5765
   Create a key_map from a list of index names
5766
5767
   SYNOPSIS
5768
     get_key_map_from_key_list()
5769
     map		key_map to fill in
5770
     table		Table
5771
     index_list		List of index names
5772
5773
   RETURN
5774
     0	ok;  In this case *map will includes the choosed index
5775
     1	error
5776
*/
5777
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
5778
bool get_key_map_from_key_list(key_map *map, Table *table,
1 by brian
clean slate
5779
                               List<String> *index_list)
5780
{
5781
  List_iterator_fast<String> it(*index_list);
5782
  String *name;
5783
  uint pos;
5784
5785
  map->clear_all();
5786
  while ((name=it++))
5787
  {
5788
    if (table->s->keynames.type_names == 0 ||
5789
        (pos= find_type(&table->s->keynames, name->ptr(),
5790
                        name->length(), 1)) <=
5791
        0)
5792
    {
5793
      my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), name->c_ptr(),
5794
	       table->pos_in_table_list->alias);
5795
      map->set_all();
5796
      return 1;
5797
    }
5798
    map->set_bit(pos-1);
5799
  }
5800
  return 0;
5801
}
5802
5803
5804
/*
5805
  Drops in all fields instead of current '*' field
5806
5807
  SYNOPSIS
5808
    insert_fields()
5809
    thd			Thread handler
5810
    context             Context for name resolution
5811
    db_name		Database name in case of 'database_name.table_name.*'
5812
    table_name		Table name in case of 'table_name.*'
5813
    it			Pointer to '*'
5814
    any_privileges	0 If we should ensure that we have SELECT privileges
5815
		          for all columns
5816
                        1 If any privilege is ok
5817
  RETURN
5818
    0	ok     'it' is updated to point at last inserted
5819
    1	error.  Error message is generated but not sent to client
5820
*/
5821
5822
bool
5823
insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
77.1.45 by Monty Taylor
Warning fixes.
5824
              const char *table_name, List_iterator<Item> *it,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
5825
              bool any_privileges __attribute__((unused)))
1 by brian
clean slate
5826
{
5827
  Field_iterator_table_ref field_iterator;
5828
  bool found;
5829
  char name_buff[NAME_LEN+1];
5830
5831
  if (db_name && lower_case_table_names)
5832
  {
5833
    /*
5834
      convert database to lower case for comparison
5835
      We can't do this in Item_field as this would change the
5836
      'name' of the item which may be used in the select list
5837
    */
5838
    strmake(name_buff, db_name, sizeof(name_buff)-1);
5839
    my_casedn_str(files_charset_info, name_buff);
5840
    db_name= name_buff;
5841
  }
5842
55 by brian
Update for using real bool types.
5843
  found= false;
1 by brian
clean slate
5844
5845
  /*
5846
    If table names are qualified, then loop over all tables used in the query,
5847
    else treat natural joins as leaves and do not iterate over their underlying
5848
    tables.
5849
  */
327.2.4 by Brian Aker
Refactoring table.h
5850
  for (TableList *tables= (table_name ? context->table_list :
1 by brian
clean slate
5851
                            context->first_name_resolution_table);
5852
       tables;
5853
       tables= (table_name ? tables->next_local :
5854
                tables->next_name_resolution_table)
5855
       )
5856
  {
5857
    Field *field;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
5858
    Table *table= tables->table;
1 by brian
clean slate
5859
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5860
    assert(tables->is_leaf_for_name_resolution());
1 by brian
clean slate
5861
5862
    if ((table_name && my_strcasecmp(table_alias_charset, table_name, tables->alias)) || 
5863
        (db_name && strcmp(tables->db,db_name)))
5864
      continue;
5865
5866
    /*
5867
      Update the tables used in the query based on the referenced fields. For
5868
      views and natural joins this update is performed inside the loop below.
5869
    */
5870
    if (table)
5871
      thd->used_tables|= table->map;
5872
5873
    /*
5874
      Initialize a generic field iterator for the current table reference.
5875
      Notice that it is guaranteed that this iterator will iterate over the
5876
      fields of a single table reference, because 'tables' is a leaf (for
5877
      name resolution purposes).
5878
    */
5879
    field_iterator.set(tables);
5880
5881
    for (; !field_iterator.end_of_fields(); field_iterator.next())
5882
    {
5883
      Item *item;
5884
5885
      if (!(item= field_iterator.create_item(thd)))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5886
        return(true);
1 by brian
clean slate
5887
5888
      if (!found)
5889
      {
55 by brian
Update for using real bool types.
5890
        found= true;
1 by brian
clean slate
5891
        it->replace(item); /* Replace '*' with the first found item. */
5892
      }
5893
      else
5894
        it->after(item);   /* Add 'item' to the SELECT list. */
5895
5896
      if ((field= field_iterator.field()))
5897
      {
5898
        /* Mark fields as used to allow storage engine to optimze access */
5899
        bitmap_set_bit(field->table->read_set, field->field_index);
5900
        if (table)
5901
        {
5902
          table->covering_keys.intersect(field->part_of_key);
5903
          table->merge_keys.merge(field->part_of_key);
5904
        }
5905
        if (tables->is_natural_join)
5906
        {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
5907
          Table *field_table;
1 by brian
clean slate
5908
          /*
5909
            In this case we are sure that the column ref will not be created
5910
            because it was already created and stored with the natural join.
5911
          */
5912
          Natural_join_column *nj_col;
5913
          if (!(nj_col= field_iterator.get_natural_column_ref()))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5914
            return(true);
5915
          assert(nj_col->table_field);
1 by brian
clean slate
5916
          field_table= nj_col->table_ref->table;
5917
          if (field_table)
5918
          {
5919
            thd->used_tables|= field_table->map;
5920
            field_table->covering_keys.intersect(field->part_of_key);
5921
            field_table->merge_keys.merge(field->part_of_key);
5922
            field_table->used_fields++;
5923
          }
5924
        }
5925
      }
5926
      else
5927
        thd->used_tables|= item->used_tables();
5928
      thd->lex->current_select->cur_pos_in_select_list++;
5929
    }
5930
    /*
5931
      In case of stored tables, all fields are considered as used,
5932
      while in the case of views, the fields considered as used are the
5933
      ones marked in setup_tables during fix_fields of view columns.
5934
      For NATURAL joins, used_tables is updated in the IF above.
5935
    */
5936
    if (table)
5937
      table->used_fields= table->s->fields;
5938
  }
5939
  if (found)
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5940
    return(false);
1 by brian
clean slate
5941
5942
  /*
5943
    TODO: in the case when we skipped all columns because there was a
5944
    qualified '*', and all columns were coalesced, we have to give a more
5945
    meaningful message than ER_BAD_TABLE_ERROR.
5946
  */
5947
  if (!table_name)
5948
    my_message(ER_NO_TABLES_USED, ER(ER_NO_TABLES_USED), MYF(0));
5949
  else
5950
    my_error(ER_BAD_TABLE_ERROR, MYF(0), table_name);
5951
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
5952
  return(true);
1 by brian
clean slate
5953
}
5954
5955
5956
/*
5957
  Fix all conditions and outer join expressions.
5958
5959
  SYNOPSIS
5960
    setup_conds()
5961
    thd     thread handler
5962
    tables  list of tables for name resolving (select_lex->table_list)
5963
    leaves  list of leaves of join table tree (select_lex->leaf_tables)
5964
    conds   WHERE clause
5965
5966
  DESCRIPTION
5967
    TODO
5968
5969
  RETURN
55 by brian
Update for using real bool types.
5970
    true  if some error occured (e.g. out of memory)
5971
    false if all is OK
1 by brian
clean slate
5972
*/
5973
327.2.4 by Brian Aker
Refactoring table.h
5974
int setup_conds(THD *thd, TableList *tables __attribute__((unused)),
5975
                TableList *leaves,
1 by brian
clean slate
5976
                COND **conds)
5977
{
5978
  SELECT_LEX *select_lex= thd->lex->current_select;
327.2.4 by Brian Aker
Refactoring table.h
5979
  TableList *table= NULL;	// For HP compilers
1 by brian
clean slate
5980
  void *save_thd_marker= thd->thd_marker;
5981
  /*
55 by brian
Update for using real bool types.
5982
    it_is_update set to true when tables of primary SELECT_LEX (SELECT_LEX
1 by brian
clean slate
5983
    which belong to LEX, i.e. most up SELECT) will be updated by
5984
    INSERT/UPDATE/LOAD
5985
    NOTE: using this condition helps to prevent call of prepare_check_option()
5986
    from subquery of VIEW, because tables of subquery belongs to VIEW
5987
    (see condition before prepare_check_option() call)
5988
  */
5989
  bool save_is_item_list_lookup= select_lex->is_item_list_lookup;
5990
  select_lex->is_item_list_lookup= 0;
5991
5992
  thd->mark_used_columns= MARK_COLUMNS_READ;
5993
  select_lex->cond_count= 0;
5994
  select_lex->between_count= 0;
5995
  select_lex->max_equal_elems= 0;
5996
5997
  thd->thd_marker= (void*)1;
5998
  if (*conds)
5999
  {
6000
    thd->where="where clause";
6001
    if ((!(*conds)->fixed && (*conds)->fix_fields(thd, conds)) ||
6002
	(*conds)->check_cols(1))
6003
      goto err_no_arena;
6004
  }
6005
  thd->thd_marker= save_thd_marker;
6006
6007
  /*
6008
    Apply fix_fields() to all ON clauses at all levels of nesting,
6009
    including the ones inside view definitions.
6010
  */
6011
  for (table= leaves; table; table= table->next_leaf)
6012
  {
327.2.4 by Brian Aker
Refactoring table.h
6013
    TableList *embedded; /* The table at the current level of nesting. */
6014
    TableList *embedding= table; /* The parent nested table reference. */
1 by brian
clean slate
6015
    do
6016
    {
6017
      embedded= embedding;
6018
      if (embedded->on_expr)
6019
      {
6020
        /* Make a join an a expression */
6021
        thd->thd_marker= (void*)embedded;
6022
        thd->where="on clause";
6023
        if ((!embedded->on_expr->fixed && embedded->on_expr->fix_fields(thd, &embedded->on_expr)) ||
6024
	    embedded->on_expr->check_cols(1))
6025
	  goto err_no_arena;
6026
        select_lex->cond_count++;
6027
      }
6028
      embedding= embedded->embedding;
6029
    }
6030
    while (embedding &&
6031
           embedding->nested_join->join_list.head() == embedded);
6032
6033
  }
6034
  thd->thd_marker= save_thd_marker;
6035
6036
  thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6037
  return(test(thd->is_error()));
1 by brian
clean slate
6038
6039
err_no_arena:
6040
  select_lex->is_item_list_lookup= save_is_item_list_lookup;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6041
  return(1);
1 by brian
clean slate
6042
}
6043
6044
6045
/******************************************************************************
6046
** Fill a record with data (for INSERT or UPDATE)
6047
** Returns : 1 if some field has wrong type
6048
******************************************************************************/
6049
6050
6051
/*
6052
  Fill fields with given items.
6053
6054
  SYNOPSIS
6055
    fill_record()
6056
    thd           thread handler
6057
    fields        Item_fields list to be filled
6058
    values        values to fill with
55 by brian
Update for using real bool types.
6059
    ignore_errors true if we should ignore errors
1 by brian
clean slate
6060
6061
  NOTE
6062
    fill_record() may set table->auto_increment_field_not_null and a
6063
    caller should make sure that it is reset after their last call to this
6064
    function.
6065
6066
  RETURN
55 by brian
Update for using real bool types.
6067
    false   OK
6068
    true    error occured
1 by brian
clean slate
6069
*/
6070
6071
bool
6072
fill_record(THD * thd, List<Item> &fields, List<Item> &values, bool ignore_errors)
6073
{
6074
  List_iterator_fast<Item> f(fields),v(values);
6075
  Item *value, *fld;
6076
  Item_field *field;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6077
  Table *table= 0;
1 by brian
clean slate
6078
6079
  /*
6080
    Reset the table->auto_increment_field_not_null as it is valid for
6081
    only one row.
6082
  */
6083
  if (fields.elements)
6084
  {
6085
    /*
6086
      On INSERT or UPDATE fields are checked to be from the same table,
6087
      thus we safely can take table from the first field.
6088
    */
6089
    fld= (Item_field*)f++;
6090
    if (!(field= fld->filed_for_view_update()))
6091
    {
6092
      my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name);
6093
      goto err;
6094
    }
6095
    table= field->field->table;
55 by brian
Update for using real bool types.
6096
    table->auto_increment_field_not_null= false;
1 by brian
clean slate
6097
    f.rewind();
6098
  }
6099
  while ((fld= f++))
6100
  {
6101
    if (!(field= fld->filed_for_view_update()))
6102
    {
6103
      my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name);
6104
      goto err;
6105
    }
6106
    value=v++;
6107
    Field *rfield= field->field;
6108
    table= rfield->table;
6109
    if (rfield == table->next_number_field)
55 by brian
Update for using real bool types.
6110
      table->auto_increment_field_not_null= true;
1 by brian
clean slate
6111
    if ((value->save_in_field(rfield, 0) < 0) && !ignore_errors)
6112
    {
6113
      my_message(ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR), MYF(0));
6114
      goto err;
6115
    }
6116
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6117
  return(thd->is_error());
1 by brian
clean slate
6118
err:
6119
  if (table)
55 by brian
Update for using real bool types.
6120
    table->auto_increment_field_not_null= false;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6121
  return(true);
1 by brian
clean slate
6122
}
6123
6124
6125
/*
6126
  Fill field buffer with values from Field list
6127
6128
  SYNOPSIS
6129
    fill_record()
6130
    thd           thread handler
6131
    ptr           pointer on pointer to record
6132
    values        list of fields
55 by brian
Update for using real bool types.
6133
    ignore_errors true if we should ignore errors
1 by brian
clean slate
6134
6135
  NOTE
6136
    fill_record() may set table->auto_increment_field_not_null and a
6137
    caller should make sure that it is reset after their last call to this
6138
    function.
6139
6140
  RETURN
55 by brian
Update for using real bool types.
6141
    false   OK
6142
    true    error occured
1 by brian
clean slate
6143
*/
6144
6145
bool
77.1.45 by Monty Taylor
Warning fixes.
6146
fill_record(THD *thd, Field **ptr, List<Item> &values,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
6147
            bool ignore_errors __attribute__((unused)))
1 by brian
clean slate
6148
{
6149
  List_iterator_fast<Item> v(values);
6150
  Item *value;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6151
  Table *table= 0;
1 by brian
clean slate
6152
6153
  Field *field;
6154
  /*
6155
    Reset the table->auto_increment_field_not_null as it is valid for
6156
    only one row.
6157
  */
6158
  if (*ptr)
6159
  {
6160
    /*
6161
      On INSERT or UPDATE fields are checked to be from the same table,
6162
      thus we safely can take table from the first field.
6163
    */
6164
    table= (*ptr)->table;
55 by brian
Update for using real bool types.
6165
    table->auto_increment_field_not_null= false;
1 by brian
clean slate
6166
  }
6167
  while ((field = *ptr++) && ! thd->is_error())
6168
  {
6169
    value=v++;
6170
    table= field->table;
6171
    if (field == table->next_number_field)
55 by brian
Update for using real bool types.
6172
      table->auto_increment_field_not_null= true;
1 by brian
clean slate
6173
    if (value->save_in_field(field, 0) < 0)
6174
      goto err;
6175
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6176
  return(thd->is_error());
1 by brian
clean slate
6177
6178
err:
6179
  if (table)
55 by brian
Update for using real bool types.
6180
    table->auto_increment_field_not_null= false;
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6181
  return(true);
1 by brian
clean slate
6182
}
6183
6184
198 by Brian Aker
More my_bool... man am I getting tired of writing this.
6185
bool mysql_rm_tmp_tables(void)
1 by brian
clean slate
6186
{
6187
  uint i, idx;
6188
  char	filePath[FN_REFLEN], *tmpdir, filePathCopy[FN_REFLEN];
6189
  MY_DIR *dirp;
6190
  FILEINFO *file;
6191
  TABLE_SHARE share;
6192
  THD *thd;
6193
6194
  if (!(thd= new THD))
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6195
    return(1);
1 by brian
clean slate
6196
  thd->thread_stack= (char*) &thd;
6197
  thd->store_globals();
6198
6199
  for (i=0; i<=mysql_tmpdir_list.max; i++)
6200
  {
6201
    tmpdir=mysql_tmpdir_list.list[i];
6202
    /* See if the directory exists */
6203
    if (!(dirp = my_dir(tmpdir,MYF(MY_WME | MY_DONT_SORT))))
6204
      continue;
6205
6206
    /* Remove all SQLxxx tables from directory */
6207
6208
    for (idx=0 ; idx < (uint) dirp->number_off_files ; idx++)
6209
    {
6210
      file=dirp->dir_entry+idx;
6211
6212
      /* skiping . and .. */
6213
      if (file->name[0] == '.' && (!file->name[1] ||
6214
                                   (file->name[1] == '.' &&  !file->name[2])))
6215
        continue;
6216
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
6217
      if (!memcmp(file->name, tmp_file_prefix, tmp_file_prefix_length))
1 by brian
clean slate
6218
      {
6219
        char *ext= fn_ext(file->name);
6220
        uint ext_len= strlen(ext);
77.1.18 by Monty Taylor
Removed my_vsnprintf and my_snprintf.
6221
        uint filePath_len= snprintf(filePath, sizeof(filePath),
6222
                                    "%s%c%s", tmpdir, FN_LIBCHAR,
6223
                                    file->name);
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
6224
        if (!memcmp(reg_ext, ext, ext_len))
1 by brian
clean slate
6225
        {
6226
          handler *handler_file= 0;
6227
          /* We should cut file extention before deleting of table */
6228
          memcpy(filePathCopy, filePath, filePath_len - ext_len);
6229
          filePathCopy[filePath_len - ext_len]= 0;
6230
          init_tmp_table_share(thd, &share, "", 0, "", filePathCopy);
6231
          if (!open_table_def(thd, &share, 0) &&
6232
              ((handler_file= get_new_handler(&share, thd->mem_root,
6233
                                              share.db_type()))))
6234
          {
6235
            handler_file->ha_delete_table(filePathCopy);
6236
            delete handler_file;
6237
          }
6238
          free_table_share(&share);
6239
        }
6240
        /*
6241
          File can be already deleted by tmp_table.file->delete_table().
6242
          So we hide error messages which happnes during deleting of these
6243
          files(MYF(0)).
6244
        */
6245
        VOID(my_delete(filePath, MYF(0))); 
6246
      }
6247
    }
6248
    my_dirend(dirp);
6249
  }
6250
  delete thd;
6251
  my_pthread_setspecific_ptr(THR_THD,  0);
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6252
  return(0);
1 by brian
clean slate
6253
}
6254
6255
6256
6257
/*****************************************************************************
6258
	unireg support functions
6259
*****************************************************************************/
6260
6261
/*
6262
  Invalidate any cache entries that are for some DB
6263
6264
  SYNOPSIS
6265
    remove_db_from_cache()
6266
    db		Database name. This will be in lower case if
6267
		lower_case_table_name is set
6268
6269
  NOTE:
6270
  We can't use hash_delete when looping hash_elements. We mark them first
6271
  and afterwards delete those marked unused.
6272
*/
6273
6274
void remove_db_from_cache(const char *db)
6275
{
6276
  for (uint idx=0 ; idx < open_cache.records ; idx++)
6277
  {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6278
    Table *table=(Table*) hash_element(&open_cache,idx);
1 by brian
clean slate
6279
    if (!strcmp(table->s->db.str, db))
6280
    {
6281
      table->s->version= 0L;			/* Free when thread is ready */
6282
      if (!table->in_use)
6283
	relink_unused(table);
6284
    }
6285
  }
6286
  while (unused_tables && !unused_tables->s->version)
6287
    VOID(hash_delete(&open_cache,(uchar*) unused_tables));
6288
}
6289
6290
6291
/*
6292
  free all unused tables
6293
6294
  NOTE
6295
    This is called by 'handle_manager' when one wants to periodicly flush
6296
    all not used tables.
6297
*/
6298
6299
void flush_tables()
6300
{
6301
  (void) pthread_mutex_lock(&LOCK_open);
6302
  while (unused_tables)
6303
    hash_delete(&open_cache,(uchar*) unused_tables);
6304
  (void) pthread_mutex_unlock(&LOCK_open);
6305
}
6306
6307
6308
/*
6309
  Mark all entries with the table as deleted to force an reopen of the table
6310
6311
  The table will be closed (not stored in cache) by the current thread when
6312
  close_thread_tables() is called.
6313
6314
  PREREQUISITES
6315
    Lock on LOCK_open()
6316
6317
  RETURN
6318
    0  This thread now have exclusive access to this table and no other thread
6319
       can access the table until close_thread_tables() is called.
6320
    1  Table is in use by another thread
6321
*/
6322
6323
bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
6324
                             uint flags)
6325
{
6326
  char key[MAX_DBKEY_LENGTH];
6327
  uint key_length;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6328
  Table *table;
1 by brian
clean slate
6329
  TABLE_SHARE *share;
6330
  bool result= 0, signalled= 0;
6331
266.1.21 by Monty Taylor
Removed references to strmov and strnmov
6332
  key_length=(uint) (stpcpy(stpcpy(key,db)+1,table_name)-key)+1;
1 by brian
clean slate
6333
  for (;;)
6334
  {
6335
    HASH_SEARCH_STATE state;
6336
    result= signalled= 0;
6337
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6338
    for (table= (Table*) hash_first(&open_cache, (uchar*) key, key_length,
1 by brian
clean slate
6339
                                    &state);
6340
         table;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6341
         table= (Table*) hash_next(&open_cache, (uchar*) key, key_length,
1 by brian
clean slate
6342
                                   &state))
6343
    {
6344
      THD *in_use;
6345
6346
      table->s->version=0L;		/* Free when thread is ready */
6347
      if (!(in_use=table->in_use))
6348
      {
6349
        relink_unused(table);
6350
      }
6351
      else if (in_use != thd)
6352
      {
6353
        /*
6354
          Mark that table is going to be deleted from cache. This will
6355
          force threads that are in mysql_lock_tables() (but not yet
6356
          in thr_multi_lock()) to abort it's locks, close all tables and retry
6357
        */
6358
        in_use->some_tables_deleted= 1;
6359
        if (table->is_name_opened())
6360
        {
6361
  	  result=1;
6362
        }
6363
        /*
6364
	  Now we must abort all tables locks used by this thread
6365
	  as the thread may be waiting to get a lock for another table.
6366
          Note that we need to hold LOCK_open while going through the
6367
          list. So that the other thread cannot change it. The other
6368
          thread must also hold LOCK_open whenever changing the
6369
          open_tables list. Aborting the MERGE lock after a child was
6370
          closed and before the parent is closed would be fatal.
6371
        */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6372
        for (Table *thd_table= in_use->open_tables;
1 by brian
clean slate
6373
	     thd_table ;
6374
	     thd_table= thd_table->next)
6375
        {
6376
          /* Do not handle locks of MERGE children. */
6377
	  if (thd_table->db_stat)	// If table is open
6378
	    signalled|= mysql_lock_abort_for_thread(thd, thd_table);
6379
        }
6380
      }
6381
      else
6382
        result= result || (flags & RTFC_OWNED_BY_THD_FLAG);
6383
    }
6384
    while (unused_tables && !unused_tables->s->version)
6385
      VOID(hash_delete(&open_cache,(uchar*) unused_tables));
6386
6387
    /* Remove table from table definition cache if it's not in use */
6388
    if ((share= (TABLE_SHARE*) hash_search(&table_def_cache,(uchar*) key,
6389
                                           key_length)))
6390
    {
6391
      share->version= 0;                          // Mark for delete
6392
      if (share->ref_count == 0)
6393
      {
6394
        pthread_mutex_lock(&share->mutex);
6395
        VOID(hash_delete(&table_def_cache, (uchar*) share));
6396
      }
6397
    }
6398
6399
    if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
6400
    {
6401
      /*
6402
        Signal any thread waiting for tables to be freed to
6403
        reopen their tables
6404
      */
6405
      broadcast_refresh();
6406
      if (!(flags & RTFC_CHECK_KILLED_FLAG) || !thd->killed)
6407
      {
6408
        dropping_tables++;
6409
        if (likely(signalled))
6410
          (void) pthread_cond_wait(&COND_refresh, &LOCK_open);
6411
        else
6412
        {
6413
          struct timespec abstime;
6414
          /*
6415
            It can happen that another thread has opened the
6416
            table but has not yet locked any table at all. Since
6417
            it can be locked waiting for a table that our thread
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
6418
            has done LOCK Table x WRITE on previously, we need to
1 by brian
clean slate
6419
            ensure that the thread actually hears our signal
6420
            before we go to sleep. Thus we wait for a short time
6421
            and then we retry another loop in the
6422
            remove_table_from_cache routine.
6423
          */
6424
          set_timespec(abstime, 10);
6425
          pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);
6426
        }
6427
        dropping_tables--;
6428
        continue;
6429
      }
6430
    }
6431
    break;
6432
  }
51.1.48 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
6433
  return(result);
1 by brian
clean slate
6434
}
6435
6436
6437
bool is_equal(const LEX_STRING *a, const LEX_STRING *b)
6438
{
6439
  return a->length == b->length && !strncmp(a->str, b->str, a->length);
6440
}
6441
/**
6442
  @} (end of group Data_Dictionary)
6443
*/