~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
/*
18
  Single table and multi table updates of tables.
19
  Multi-table updates were introduced by Sinisa & Monty
20
*/
21
22
#include "mysql_priv.h"
23
#include "sql_select.h"
24
25
/* Return 0 if row hasn't changed */
26
27
bool compare_record(TABLE *table)
28
{
29
  if (table->s->blob_fields + table->s->varchar_fields == 0)
30
    return cmp_record(table,record[1]);
31
  /* Compare null bits */
32
  if (memcmp(table->null_flags,
33
	     table->null_flags+table->s->rec_buff_length,
34
	     table->s->null_bytes))
56 by brian
Next pass of true/false update.
35
    return true;				// Diff in NULL value
1 by brian
clean slate
36
  /* Compare updated fields */
37
  for (Field **ptr= table->field ; *ptr ; ptr++)
38
  {
39
    if (bitmap_is_set(table->write_set, (*ptr)->field_index) &&
40
	(*ptr)->cmp_binary_offset(table->s->rec_buff_length))
56 by brian
Next pass of true/false update.
41
      return true;
1 by brian
clean slate
42
  }
56 by brian
Next pass of true/false update.
43
  return false;
1 by brian
clean slate
44
}
45
46
47
/*
48
  check that all fields are real fields
49
50
  SYNOPSIS
51
    check_fields()
52
    thd             thread handler
53
    items           Items for check
54
55
  RETURN
56 by brian
Next pass of true/false update.
56
    true  Items can't be used in UPDATE
57
    false Items are OK
1 by brian
clean slate
58
*/
59
60
static bool check_fields(THD *thd, List<Item> &items)
61
{
62
  List_iterator<Item> it(items);
63
  Item *item;
64
  Item_field *field;
65
66
  while ((item= it++))
67
  {
68
    if (!(field= item->filed_for_view_update()))
69
    {
70
      /* item has name, because it comes from VIEW SELECT list */
71
      my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name);
56 by brian
Next pass of true/false update.
72
      return true;
1 by brian
clean slate
73
    }
74
    /*
75
      we make temporary copy of Item_field, to avoid influence of changing
76
      result_field on Item_ref which refer on this field
77
    */
78
    thd->change_item_tree(it.ref(), new Item_field(thd, field));
79
  }
56 by brian
Next pass of true/false update.
80
  return false;
1 by brian
clean slate
81
}
82
83
84
/**
85
  Re-read record if more columns are needed for error message.
86
87
  If we got a duplicate key error, we want to write an error
88
  message containing the value of the duplicate key. If we do not have
89
  all fields of the key value in record[0], we need to re-read the
90
  record with a proper read_set.
91
92
  @param[in] error   error number
93
  @param[in] table   table
94
*/
95
96
static void prepare_record_for_error_message(int error, TABLE *table)
97
{
98
  Field **field_p;
99
  Field *field;
100
  uint keynr;
101
  MY_BITMAP unique_map; /* Fields in offended unique. */
102
  my_bitmap_map unique_map_buf[bitmap_buffer_size(MAX_FIELDS)];
51.2.2 by Patrick Galbraith
Removed DBUGs from
103
  
1 by brian
clean slate
104
  /*
105
    Only duplicate key errors print the key value.
106
    If storage engine does always read all columns, we have the value alraedy.
107
  */
108
  if ((error != HA_ERR_FOUND_DUPP_KEY) ||
109
      !(table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ))
51.2.2 by Patrick Galbraith
Removed DBUGs from
110
    return;
1 by brian
clean slate
111
112
  /*
113
    Get the number of the offended index.
114
    We will see MAX_KEY if the engine cannot determine the affected index.
115
  */
116
  if ((keynr= table->file->get_dup_key(error)) >= MAX_KEY)
51.2.2 by Patrick Galbraith
Removed DBUGs from
117
    return;
1 by brian
clean slate
118
119
  /* Create unique_map with all fields used by that index. */
56 by brian
Next pass of true/false update.
120
  bitmap_init(&unique_map, unique_map_buf, table->s->fields, false);
1 by brian
clean slate
121
  table->mark_columns_used_by_index_no_reset(keynr, &unique_map);
122
123
  /* Subtract read_set and write_set. */
124
  bitmap_subtract(&unique_map, table->read_set);
125
  bitmap_subtract(&unique_map, table->write_set);
126
127
  /*
128
    If the unique index uses columns that are neither in read_set
129
    nor in write_set, we must re-read the record.
130
    Otherwise no need to do anything.
131
  */
132
  if (bitmap_is_clear_all(&unique_map))
51.2.2 by Patrick Galbraith
Removed DBUGs from
133
    return;
1 by brian
clean slate
134
135
  /* Get identifier of last read record into table->file->ref. */
136
  table->file->position(table->record[0]);
137
  /* Add all fields used by unique index to read_set. */
138
  bitmap_union(table->read_set, &unique_map);
139
  /* Tell the engine about the new set. */
140
  table->file->column_bitmaps_signal();
141
  /* Read record that is identified by table->file->ref. */
142
  (void) table->file->rnd_pos(table->record[1], table->file->ref);
143
  /* Copy the newly read columns into the new record. */
144
  for (field_p= table->field; (field= *field_p); field_p++)
145
    if (bitmap_is_set(&unique_map, field->field_index))
146
      field->copy_from_tmp(table->s->rec_buff_length);
147
51.2.2 by Patrick Galbraith
Removed DBUGs from
148
  return;
1 by brian
clean slate
149
}
150
151
152
/*
153
  Process usual UPDATE
154
155
  SYNOPSIS
156
    mysql_update()
157
    thd			thread handler
158
    fields		fields for update
159
    values		values of fields for update
160
    conds		WHERE clause expression
161
    order_num		number of elemen in ORDER BY clause
162
    order		ORDER BY clause list
163
    limit		limit clause
164
    handle_duplicates	how to handle duplicates
165
166
  RETURN
167
    0  - OK
168
    2  - privilege check and openning table passed, but we need to convert to
169
         multi-update because of view substitution
170
    1  - error
171
*/
172
173
int mysql_update(THD *thd,
174
                 TABLE_LIST *table_list,
175
                 List<Item> &fields,
77.1.45 by Monty Taylor
Warning fixes.
176
                 List<Item> &values,
1 by brian
clean slate
177
                 COND *conds,
178
                 uint order_num, ORDER *order,
77.1.45 by Monty Taylor
Warning fixes.
179
                 ha_rows limit,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
180
                 enum enum_duplicates handle_duplicates __attribute__((unused)),
77.1.45 by Monty Taylor
Warning fixes.
181
                 bool ignore)
1 by brian
clean slate
182
{
183
  bool		using_limit= limit != HA_POS_ERROR;
184
  bool		safe_update= test(thd->options & OPTION_SAFE_UPDATES);
185
  bool		used_key_is_modified, transactional_table, will_batch;
186
  bool		can_compare_record;
187
  int		error, loc_error;
188
  uint		used_index= MAX_KEY, dup_key_found;
56 by brian
Next pass of true/false update.
189
  bool          need_sort= true;
1 by brian
clean slate
190
  uint          table_count= 0;
191
  ha_rows	updated, found;
192
  key_map	old_covering_keys;
193
  TABLE		*table;
194
  SQL_SELECT	*select;
195
  READ_RECORD	info;
196
  SELECT_LEX    *select_lex= &thd->lex->select_lex;
197
  bool          need_reopen;
151 by Brian Aker
Ulonglong to uint64_t
198
  uint64_t     id;
1 by brian
clean slate
199
  List<Item> all_fields;
200
  THD::killed_state killed_status= THD::NOT_KILLED;
51.2.2 by Patrick Galbraith
Removed DBUGs from
201
  
1 by brian
clean slate
202
  for ( ; ; )
203
  {
204
    if (open_tables(thd, &table_list, &table_count, 0))
51.2.2 by Patrick Galbraith
Removed DBUGs from
205
      return(1);
1 by brian
clean slate
206
207
    if (!lock_tables(thd, table_list, table_count, &need_reopen))
208
      break;
209
    if (!need_reopen)
51.2.2 by Patrick Galbraith
Removed DBUGs from
210
      return(1);
1 by brian
clean slate
211
    close_tables_for_reopen(thd, &table_list);
212
  }
213
214
  if (mysql_handle_derived(thd->lex, &mysql_derived_prepare) ||
215
      (thd->fill_derived_tables() &&
216
       mysql_handle_derived(thd->lex, &mysql_derived_filling)))
51.2.2 by Patrick Galbraith
Removed DBUGs from
217
    return(1);
1 by brian
clean slate
218
219
  MYSQL_UPDATE_START();
220
  thd_proc_info(thd, "init");
221
  table= table_list->table;
222
223
  /* Calculate "table->covering_keys" based on the WHERE */
224
  table->covering_keys= table->s->keys_in_use;
225
  table->quick_keys.clear_all();
226
227
  if (mysql_prepare_update(thd, table_list, &conds, order_num, order))
228
    goto abort;
229
230
  old_covering_keys= table->covering_keys;		// Keys used in WHERE
231
  /* Check the fields we are going to modify */
232
  if (setup_fields_with_no_wrap(thd, 0, fields, MARK_COLUMNS_WRITE, 0, 0))
233
    goto abort;                               /* purecov: inspected */
234
  if (table->timestamp_field)
235
  {
236
    // Don't set timestamp column if this is modified
237
    if (bitmap_is_set(table->write_set,
238
                      table->timestamp_field->field_index))
239
      table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
240
    else
241
    {
242
      if (table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_UPDATE ||
243
          table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH)
244
        bitmap_set_bit(table->write_set,
245
                       table->timestamp_field->field_index);
246
    }
247
  }
248
249
  if (setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0))
250
  {
251
    free_underlaid_joins(thd, select_lex);
252
    goto abort;                               /* purecov: inspected */
253
  }
254
255
  if (select_lex->inner_refs_list.elements &&
256
    fix_inner_refs(thd, all_fields, select_lex, select_lex->ref_pointer_array))
257
  {
258
    MYSQL_UPDATE_END();
51.2.2 by Patrick Galbraith
Removed DBUGs from
259
    return(-1);
1 by brian
clean slate
260
  }
261
262
  if (conds)
263
  {
264
    Item::cond_result cond_value;
265
    conds= remove_eq_conds(thd, conds, &cond_value);
266
    if (cond_value == Item::COND_FALSE)
267
      limit= 0;                                   // Impossible WHERE
268
  }
269
270
  /*
271
    If a timestamp field settable on UPDATE is present then to avoid wrong
272
    update force the table handler to retrieve write-only fields to be able
273
    to compare records and detect data change.
274
  */
275
  if (table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
276
      table->timestamp_field &&
277
      (table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_UPDATE ||
278
       table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH))
279
    bitmap_union(table->read_set, table->write_set);
280
  // Don't count on usage of 'only index' when calculating which key to use
281
  table->covering_keys.clear_all();
282
283
  /* Update the table->file->stats.records number */
284
  table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
285
286
  select= make_select(table, 0, 0, conds, 0, &error);
287
  if (error || !limit ||
288
      (select && select->check_quick(thd, safe_update, limit)))
289
  {
290
    delete select;
291
    free_underlaid_joins(thd, select_lex);
292
    if (error)
293
      goto abort;				// Error in where
294
    MYSQL_UPDATE_END();
295
    my_ok(thd);				// No matching records
51.2.2 by Patrick Galbraith
Removed DBUGs from
296
    return(0);
1 by brian
clean slate
297
  }
298
  if (!select && limit != HA_POS_ERROR)
299
  {
300
    if ((used_index= get_index_for_order(table, order, limit)) != MAX_KEY)
56 by brian
Next pass of true/false update.
301
      need_sort= false;
1 by brian
clean slate
302
  }
303
  /* If running in safe sql mode, don't allow updates without keys */
304
  if (table->quick_keys.is_clear_all())
305
  {
306
    thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
307
    if (safe_update && !using_limit)
308
    {
309
      my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
310
		 ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
311
      goto err;
312
    }
313
  }
314
315
  table->mark_columns_needed_for_update();
316
317
  /* Check if we are modifying a key that we are used to search with */
318
  
319
  if (select && select->quick)
320
  {
321
    used_index= select->quick->index;
322
    used_key_is_modified= (!select->quick->unique_key_range() &&
323
                          select->quick->is_keys_used(table->write_set));
324
  }
325
  else
326
  {
327
    used_key_is_modified= 0;
328
    if (used_index == MAX_KEY)                  // no index for sort order
329
      used_index= table->file->key_used_on_scan;
330
    if (used_index != MAX_KEY)
331
      used_key_is_modified= is_key_used(table, used_index, table->write_set);
332
  }
333
334
335
  if (used_key_is_modified || order)
336
  {
337
    /*
338
      We can't update table directly;  We must first search after all
339
      matching rows before updating the table!
340
    */
341
    if (used_index < MAX_KEY && old_covering_keys.is_set(used_index))
342
    {
343
      table->key_read=1;
344
      table->mark_columns_used_by_index(used_index);
345
    }
346
    else
347
    {
348
      table->use_all_columns();
349
    }
350
351
    /* note: We avoid sorting avoid if we sort on the used index */
352
    if (order && (need_sort || used_key_is_modified))
353
    {
354
      /*
355
	Doing an ORDER BY;  Let filesort find and sort the rows we are going
356
	to update
357
        NOTE: filesort will call table->prepare_for_position()
358
      */
359
      uint         length= 0;
360
      SORT_FIELD  *sortorder;
361
      ha_rows examined_rows;
362
363
      table->sort.io_cache = (IO_CACHE *) my_malloc(sizeof(IO_CACHE),
364
						    MYF(MY_FAE | MY_ZEROFILL));
365
      if (!(sortorder=make_unireg_sortorder(order, &length, NULL)) ||
366
          (table->sort.found_records= filesort(thd, table, sortorder, length,
367
                                               select, limit, 1,
368
                                               &examined_rows))
369
          == HA_POS_ERROR)
370
      {
371
	goto err;
372
      }
373
      /*
374
	Filesort has already found and selected the rows we want to update,
375
	so we don't need the where clause
376
      */
377
      delete select;
378
      select= 0;
379
    }
380
    else
381
    {
382
      /*
383
	We are doing a search on a key that is updated. In this case
384
	we go trough the matching rows, save a pointer to them and
385
	update these in a separate loop based on the pointer.
386
      */
387
388
      IO_CACHE tempfile;
389
      if (open_cached_file(&tempfile, mysql_tmpdir,TEMP_PREFIX,
390
			   DISK_BUFFER_SIZE, MYF(MY_WME)))
391
	goto err;
392
393
      /* If quick select is used, initialize it before retrieving rows. */
394
      if (select && select->quick && select->quick->reset())
395
        goto err;
396
      table->file->try_semi_consistent_read(1);
397
398
      /*
399
        When we get here, we have one of the following options:
400
        A. used_index == MAX_KEY
401
           This means we should use full table scan, and start it with
402
           init_read_record call
403
        B. used_index != MAX_KEY
404
           B.1 quick select is used, start the scan with init_read_record
405
           B.2 quick select is not used, this is full index scan (with LIMIT)
406
               Full index scan must be started with init_read_record_idx
407
      */
408
409
      if (used_index == MAX_KEY || (select && select->quick))
410
        init_read_record(&info,thd,table,select,0,1);
411
      else
412
        init_read_record_idx(&info, thd, table, 1, used_index);
413
414
      thd_proc_info(thd, "Searching rows for update");
415
      ha_rows tmp_limit= limit;
416
417
      while (!(error=info.read_record(&info)) && !thd->killed)
418
      {
419
	if (!(select && select->skip_record()))
420
	{
421
          if (table->file->was_semi_consistent_read())
422
	    continue;  /* repeat the read of the same row if it still exists */
423
424
	  table->file->position(table->record[0]);
425
	  if (my_b_write(&tempfile,table->file->ref,
426
			 table->file->ref_length))
427
	  {
428
	    error=1; /* purecov: inspected */
429
	    break; /* purecov: inspected */
430
	  }
431
	  if (!--limit && using_limit)
432
	  {
433
	    error= -1;
434
	    break;
435
	  }
436
	}
437
	else
438
	  table->file->unlock_row();
439
      }
440
      if (thd->killed && !error)
441
	error= 1;				// Aborted
442
      limit= tmp_limit;
443
      table->file->try_semi_consistent_read(0);
444
      end_read_record(&info);
445
     
446
      /* Change select to use tempfile */
447
      if (select)
448
      {
449
	delete select->quick;
450
	if (select->free_cond)
451
	  delete select->cond;
452
	select->quick=0;
453
	select->cond=0;
454
      }
455
      else
456
      {
457
	select= new SQL_SELECT;
458
	select->head=table;
459
      }
460
      if (reinit_io_cache(&tempfile,READ_CACHE,0L,0,0))
461
	error=1; /* purecov: inspected */
462
      select->file=tempfile;			// Read row ptrs from this file
463
      if (error >= 0)
464
	goto err;
465
    }
466
    if (table->key_read)
467
      table->restore_column_maps_after_mark_index();
468
  }
469
470
  if (ignore)
471
    table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
472
  
473
  if (select && select->quick && select->quick->reset())
474
    goto err;
475
  table->file->try_semi_consistent_read(1);
476
  init_read_record(&info,thd,table,select,0,1);
477
478
  updated= found= 0;
479
  /* Generate an error when trying to set a NOT NULL field to NULL. */
480
  thd->count_cuted_fields= ignore ? CHECK_FIELD_WARN
481
                                  : CHECK_FIELD_ERROR_FOR_NULL;
482
  thd->cuted_fields=0L;
483
  thd_proc_info(thd, "Updating");
484
485
  transactional_table= table->file->has_transactions();
486
  thd->abort_on_warning= test(!ignore &&
487
                              (thd->variables.sql_mode &
488
                               (MODE_STRICT_TRANS_TABLES |
489
                                MODE_STRICT_ALL_TABLES)));
490
  will_batch= !table->file->start_bulk_update();
491
492
  /*
493
    Assure that we can use position()
494
    if we need to create an error message.
495
  */
496
  if (table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ)
497
    table->prepare_for_position();
498
499
  /*
500
    We can use compare_record() to optimize away updates if
501
    the table handler is returning all columns OR if
502
    if all updated columns are read
503
  */
504
  can_compare_record= (!(table->file->ha_table_flags() &
505
                         HA_PARTIAL_COLUMN_READ) ||
506
                       bitmap_is_subset(table->write_set, table->read_set));
507
508
  while (!(error=info.read_record(&info)) && !thd->killed)
509
  {
510
    if (!(select && select->skip_record()))
511
    {
512
      if (table->file->was_semi_consistent_read())
513
        continue;  /* repeat the read of the same row if it still exists */
514
515
      store_record(table,record[1]);
516
      if (fill_record(thd, fields, values, 0))
517
        break; /* purecov: inspected */
518
519
      found++;
520
521
      if (!can_compare_record || compare_record(table))
522
      {
523
        if (will_batch)
524
        {
525
          /*
526
            Typically a batched handler can execute the batched jobs when:
527
            1) When specifically told to do so
528
            2) When it is not a good idea to batch anymore
529
            3) When it is necessary to send batch for other reasons
530
               (One such reason is when READ's must be performed)
531
532
            1) is covered by exec_bulk_update calls.
533
            2) and 3) is handled by the bulk_update_row method.
534
            
535
            bulk_update_row can execute the updates including the one
536
            defined in the bulk_update_row or not including the row
537
            in the call. This is up to the handler implementation and can
538
            vary from call to call.
539
540
            The dup_key_found reports the number of duplicate keys found
541
            in those updates actually executed. It only reports those if
542
            the extra call with HA_EXTRA_IGNORE_DUP_KEY have been issued.
543
            If this hasn't been issued it returns an error code and can
544
            ignore this number. Thus any handler that implements batching
545
            for UPDATE IGNORE must also handle this extra call properly.
546
547
            If a duplicate key is found on the record included in this
548
            call then it should be included in the count of dup_key_found
549
            and error should be set to 0 (only if these errors are ignored).
550
          */
551
          error= table->file->ha_bulk_update_row(table->record[1],
552
                                                 table->record[0],
553
                                                 &dup_key_found);
554
          limit+= dup_key_found;
555
          updated-= dup_key_found;
556
        }
557
        else
558
        {
559
          /* Non-batched update */
560
	  error= table->file->ha_update_row(table->record[1],
561
                                            table->record[0]);
562
        }
563
        if (!error || error == HA_ERR_RECORD_IS_THE_SAME)
564
	{
565
          if (error != HA_ERR_RECORD_IS_THE_SAME)
566
            updated++;
567
          else
568
            error= 0;
569
	}
570
 	else if (!ignore ||
571
                 table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
572
	{
573
          /*
574
            If (ignore && error is ignorable) we don't have to
575
            do anything; otherwise...
576
          */
577
          myf flags= 0;
578
579
          if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
580
            flags|= ME_FATALERROR; /* Other handler errors are fatal */
581
582
          prepare_record_for_error_message(error, table);
583
	  table->file->print_error(error,MYF(flags));
584
	  error= 1;
585
	  break;
586
	}
587
      }
588
589
      if (!--limit && using_limit)
590
      {
591
        /*
592
          We have reached end-of-file in most common situations where no
593
          batching has occurred and if batching was supposed to occur but
594
          no updates were made and finally when the batch execution was
595
          performed without error and without finding any duplicate keys.
596
          If the batched updates were performed with errors we need to
597
          check and if no error but duplicate key's found we need to
598
          continue since those are not counted for in limit.
599
        */
600
        if (will_batch &&
601
            ((error= table->file->exec_bulk_update(&dup_key_found)) ||
602
             dup_key_found))
603
        {
604
 	  if (error)
605
          {
606
            /* purecov: begin inspected */
607
            /*
608
              The handler should not report error of duplicate keys if they
609
              are ignored. This is a requirement on batching handlers.
610
            */
611
            prepare_record_for_error_message(error, table);
612
            table->file->print_error(error,MYF(0));
613
            error= 1;
614
            break;
615
            /* purecov: end */
616
          }
617
          /*
618
            Either an error was found and we are ignoring errors or there
619
            were duplicate keys found. In both cases we need to correct
620
            the counters and continue the loop.
621
          */
622
          limit= dup_key_found; //limit is 0 when we get here so need to +
623
          updated-= dup_key_found;
624
        }
625
        else
626
        {
627
	  error= -1;				// Simulate end of file
628
	  break;
629
        }
630
      }
631
    }
632
    else
633
      table->file->unlock_row();
634
    thd->row_count++;
635
  }
636
  dup_key_found= 0;
637
  /*
638
    Caching the killed status to pass as the arg to query event constuctor;
639
    The cached value can not change whereas the killed status can
640
    (externally) since this point and change of the latter won't affect
641
    binlogging.
51.2.2 by Patrick Galbraith
Removed DBUGs from
642
    It's assumed that if an error was set in combination with an effective
1 by brian
clean slate
643
    killed status then the error is due to killing.
644
  */
51.2.2 by Patrick Galbraith
Removed DBUGs from
645
  killed_status= thd->killed; // get the status of the volatile
1 by brian
clean slate
646
  // simulated killing after the loop must be ineffective for binlogging
647
  error= (killed_status == THD::NOT_KILLED)?  error : 1;
51.2.2 by Patrick Galbraith
Removed DBUGs from
648
1 by brian
clean slate
649
  if (error &&
650
      will_batch &&
651
      (loc_error= table->file->exec_bulk_update(&dup_key_found)))
652
    /*
653
      An error has occurred when a batched update was performed and returned
654
      an error indication. It cannot be an allowed duplicate key error since
655
      we require the batching handler to treat this as a normal behavior.
656
657
      Otherwise we simply remove the number of duplicate keys records found
658
      in the batched update.
659
    */
660
  {
661
    /* purecov: begin inspected */
662
    prepare_record_for_error_message(loc_error, table);
663
    table->file->print_error(loc_error,MYF(ME_FATALERROR));
664
    error= 1;
665
    /* purecov: end */
666
  }
667
  else
668
    updated-= dup_key_found;
669
  if (will_batch)
670
    table->file->end_bulk_update();
671
  table->file->try_semi_consistent_read(0);
672
673
  if (!transactional_table && updated > 0)
56 by brian
Next pass of true/false update.
674
    thd->transaction.stmt.modified_non_trans_table= true;
1 by brian
clean slate
675
676
  end_read_record(&info);
677
  delete select;
678
  thd_proc_info(thd, "end");
679
  VOID(table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY));
680
681
  /*
682
    error < 0 means really no error at all: we processed all rows until the
683
    last one without error. error > 0 means an error (e.g. unique key
684
    violation and no IGNORE or REPLACE). error == 0 is also an error (if
685
    preparing the record or invoking before triggers fails). See
51.2.2 by Patrick Galbraith
Removed DBUGs from
686
    ha_autocommit_or_rollback(error>=0) and return(error>=0) below.
1 by brian
clean slate
687
    Sometimes we want to binlog even if we updated no rows, in case user used
688
    it to be sure master and slave are in same state.
689
  */
690
  if ((error < 0) || thd->transaction.stmt.modified_non_trans_table)
691
  {
692
    if (mysql_bin_log.is_open())
693
    {
694
      if (error < 0)
695
        thd->clear_error();
696
      if (thd->binlog_query(THD::ROW_QUERY_TYPE,
697
                            thd->query, thd->query_length,
56 by brian
Next pass of true/false update.
698
                            transactional_table, false, killed_status) &&
1 by brian
clean slate
699
          transactional_table)
700
      {
701
        error=1;				// Rollback update
702
      }
703
    }
704
    if (thd->transaction.stmt.modified_non_trans_table)
56 by brian
Next pass of true/false update.
705
      thd->transaction.all.modified_non_trans_table= true;
1 by brian
clean slate
706
  }
51.2.2 by Patrick Galbraith
Removed DBUGs from
707
  assert(transactional_table || !updated || thd->transaction.stmt.modified_non_trans_table);
1 by brian
clean slate
708
  free_underlaid_joins(thd, select_lex);
709
710
  /* If LAST_INSERT_ID(X) was used, report X */
711
  id= thd->arg_of_last_insert_id_function ?
712
    thd->first_successful_insert_id_in_prev_stmt : 0;
713
714
  MYSQL_UPDATE_END();
715
  if (error < 0)
716
  {
717
    char buff[STRING_BUFFER_USUAL_SIZE];
718
    sprintf(buff, ER(ER_UPDATE_INFO), (ulong) found, (ulong) updated,
719
	    (ulong) thd->cuted_fields);
720
    thd->row_count_func=
721
      (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated;
722
    my_ok(thd, (ulong) thd->row_count_func, id, buff);
723
  }
724
  thd->count_cuted_fields= CHECK_FIELD_IGNORE;		/* calc cuted fields */
725
  thd->abort_on_warning= 0;
51.2.2 by Patrick Galbraith
Removed DBUGs from
726
  return((error >= 0 || thd->is_error()) ? 1 : 0);
1 by brian
clean slate
727
728
err:
729
  delete select;
730
  free_underlaid_joins(thd, select_lex);
731
  if (table->key_read)
732
  {
733
    table->key_read=0;
734
    table->file->extra(HA_EXTRA_NO_KEYREAD);
735
  }
736
  thd->abort_on_warning= 0;
737
738
abort:
739
  MYSQL_UPDATE_END();
51.2.2 by Patrick Galbraith
Removed DBUGs from
740
  return(1);
1 by brian
clean slate
741
}
742
743
/*
744
  Prepare items in UPDATE statement
745
746
  SYNOPSIS
747
    mysql_prepare_update()
748
    thd			- thread handler
749
    table_list		- global/local table list
750
    conds		- conditions
751
    order_num		- number of ORDER BY list entries
752
    order		- ORDER BY clause list
753
754
  RETURN VALUE
56 by brian
Next pass of true/false update.
755
    false OK
756
    true  error
1 by brian
clean slate
757
*/
758
bool mysql_prepare_update(THD *thd, TABLE_LIST *table_list,
759
			 Item **conds, uint order_num, ORDER *order)
760
{
761
  List<Item> all_fields;
762
  SELECT_LEX *select_lex= &thd->lex->select_lex;
51.2.2 by Patrick Galbraith
Removed DBUGs from
763
  
1 by brian
clean slate
764
  /*
765
    Statement-based replication of UPDATE ... LIMIT is not safe as order of
766
    rows is not defined, so in mixed mode we go to row-based.
767
768
    Note that we may consider a statement as safe if ORDER BY primary_key
769
    is present. However it may confuse users to see very similiar statements
770
    replicated differently.
771
  */
772
  if (thd->lex->current_select->select_limit)
773
  {
774
    thd->lex->set_stmt_unsafe();
775
    thd->set_current_stmt_binlog_row_based_if_mixed();
776
  }
777
778
  thd->lex->allow_sum_func= 0;
779
780
  if (setup_tables_and_check_access(thd, &select_lex->context, 
781
                                    &select_lex->top_join_list,
782
                                    table_list,
783
                                    &select_lex->leaf_tables,
784
                                    false) ||
785
      setup_conds(thd, table_list, select_lex->leaf_tables, conds) ||
786
      select_lex->setup_ref_array(thd, order_num) ||
787
      setup_order(thd, select_lex->ref_pointer_array,
788
		  table_list, all_fields, all_fields, order))
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
789
    return(true);
1 by brian
clean slate
790
791
  /* Check that we are not using table that we are updating in a sub select */
792
  {
793
    TABLE_LIST *duplicate;
794
    if ((duplicate= unique_table(thd, table_list, table_list->next_global, 0)))
795
    {
796
      update_non_unique_table_error(table_list, "UPDATE", duplicate);
797
      my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->table_name);
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
798
      return(true);
1 by brian
clean slate
799
    }
800
  }
177.1.1 by brian
Removed dead code around prep.
801
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
802
  return(false);
1 by brian
clean slate
803
}
804
805
806
/***************************************************************************
807
  Update multiple tables from join 
808
***************************************************************************/
809
810
/*
811
  Get table map for list of Item_field
812
*/
813
814
static table_map get_table_map(List<Item> *items)
815
{
816
  List_iterator_fast<Item> item_it(*items);
817
  Item_field *item;
818
  table_map map= 0;
819
820
  while ((item= (Item_field *) item_it++)) 
821
    map|= item->used_tables();
822
  return map;
823
}
824
825
826
/*
827
  make update specific preparation and checks after opening tables
828
829
  SYNOPSIS
830
    mysql_multi_update_prepare()
831
    thd         thread handler
832
833
  RETURN
56 by brian
Next pass of true/false update.
834
    false OK
835
    true  Error
1 by brian
clean slate
836
*/
837
838
int mysql_multi_update_prepare(THD *thd)
839
{
840
  LEX *lex= thd->lex;
841
  TABLE_LIST *table_list= lex->query_tables;
842
  TABLE_LIST *tl, *leaves;
843
  List<Item> *fields= &lex->select_lex.item_list;
844
  table_map tables_for_update;
845
  bool update_view= 0;
846
  /*
847
    if this multi-update was converted from usual update, here is table
848
    counter else junk will be assigned here, but then replaced with real
849
    count in open_tables()
850
  */
851
  uint  table_count= lex->table_count;
852
  const bool using_lock_tables= thd->locked_tables != 0;
853
  bool original_multiupdate= (thd->lex->sql_command == SQLCOM_UPDATE_MULTI);
56 by brian
Next pass of true/false update.
854
  bool need_reopen= false;
51.2.2 by Patrick Galbraith
Removed DBUGs from
855
  
1 by brian
clean slate
856
857
  /* following need for prepared statements, to run next time multi-update */
858
  thd->lex->sql_command= SQLCOM_UPDATE_MULTI;
859
860
reopen_tables:
861
862
  /* open tables and create derived ones, but do not lock and fill them */
863
  if (((original_multiupdate || need_reopen) &&
864
       open_tables(thd, &table_list, &table_count, 0)) ||
865
      mysql_handle_derived(lex, &mysql_derived_prepare))
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
866
    return(true);
1 by brian
clean slate
867
  /*
868
    setup_tables() need for VIEWs. JOIN::prepare() will call setup_tables()
869
    second time, but this call will do nothing (there are check for second
870
    call in setup_tables()).
871
  */
872
873
  if (setup_tables_and_check_access(thd, &lex->select_lex.context,
874
                                    &lex->select_lex.top_join_list,
875
                                    table_list,
876
                                    &lex->select_lex.leaf_tables, false))
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
877
    return(true);
1 by brian
clean slate
878
879
  if (setup_fields_with_no_wrap(thd, 0, *fields, MARK_COLUMNS_WRITE, 0, 0))
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
880
    return(true);
1 by brian
clean slate
881
882
  if (update_view && check_fields(thd, *fields))
883
  {
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
884
    return(true);
1 by brian
clean slate
885
  }
886
887
  tables_for_update= get_table_map(fields);
888
889
  /*
890
    Setup timestamp handling and locking mode
891
  */
892
  leaves= lex->select_lex.leaf_tables;
893
  for (tl= leaves; tl; tl= tl->next_leaf)
894
  {
895
    TABLE *table= tl->table;
896
    /* Only set timestamp column if this is not modified */
897
    if (table->timestamp_field &&
898
        bitmap_is_set(table->write_set,
899
                      table->timestamp_field->field_index))
900
      table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
901
902
    /* if table will be updated then check that it is unique */
903
    if (table->map & tables_for_update)
904
    {
905
      table->mark_columns_needed_for_update();
906
      /*
907
        If table will be updated we should not downgrade lock for it and
908
        leave it as is.
909
      */
910
    }
911
    else
912
    {
913
      /*
914
        If we are using the binary log, we need TL_READ_NO_INSERT to get
915
        correct order of statements. Otherwise, we use a TL_READ lock to
916
        improve performance.
917
      */
918
      tl->lock_type= using_update_log ? TL_READ_NO_INSERT : TL_READ;
919
      tl->updating= 0;
920
      /* Update TABLE::lock_type accordingly. */
921
      if (!tl->placeholder() && !using_lock_tables)
922
        tl->table->reginfo.lock_type= tl->lock_type;
923
    }
924
  }
925
926
  /* now lock and fill tables */
927
  if (lock_tables(thd, table_list, table_count, &need_reopen))
928
  {
929
    if (!need_reopen)
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
930
      return(true);
1 by brian
clean slate
931
932
    /*
933
      We have to reopen tables since some of them were altered or dropped
934
      during lock_tables() or something was done with their triggers.
935
      Let us do some cleanups to be able do setup_table() and setup_fields()
936
      once again.
937
    */
938
    List_iterator_fast<Item> it(*fields);
939
    Item *item;
940
    while ((item= it++))
941
      item->cleanup();
942
943
    /* We have to cleanup translation tables of views. */
944
    for (TABLE_LIST *tbl= table_list; tbl; tbl= tbl->next_global)
945
      tbl->cleanup_items();
946
947
    close_tables_for_reopen(thd, &table_list);
948
    goto reopen_tables;
949
  }
950
951
  /*
952
    Check that we are not using table that we are updating, but we should
953
    skip all tables of UPDATE SELECT itself
954
  */
56 by brian
Next pass of true/false update.
955
  lex->select_lex.exclude_from_table_unique_test= true;
1 by brian
clean slate
956
  /* We only need SELECT privilege for columns in the values list */
957
  for (tl= leaves; tl; tl= tl->next_leaf)
958
  {
959
    if (tl->lock_type != TL_READ &&
960
        tl->lock_type != TL_READ_NO_INSERT)
961
    {
962
      TABLE_LIST *duplicate;
963
      if ((duplicate= unique_table(thd, tl, table_list, 0)))
964
      {
965
        update_non_unique_table_error(table_list, "UPDATE", duplicate);
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
966
        return(true);
1 by brian
clean slate
967
      }
968
    }
969
  }
970
  /*
56 by brian
Next pass of true/false update.
971
    Set exclude_from_table_unique_test value back to false. It is needed for
1 by brian
clean slate
972
    further check in multi_update::prepare whether to use record cache.
973
  */
56 by brian
Next pass of true/false update.
974
  lex->select_lex.exclude_from_table_unique_test= false;
1 by brian
clean slate
975
 
976
  if (thd->fill_derived_tables() &&
977
      mysql_handle_derived(lex, &mysql_derived_filling))
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
978
    return(true);
1 by brian
clean slate
979
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
980
  return (false);
1 by brian
clean slate
981
}
982
983
984
/*
985
  Setup multi-update handling and call SELECT to do the join
986
*/
987
988
bool mysql_multi_update(THD *thd,
989
                        TABLE_LIST *table_list,
990
                        List<Item> *fields,
991
                        List<Item> *values,
992
                        COND *conds,
151 by Brian Aker
Ulonglong to uint64_t
993
                        uint64_t options,
1 by brian
clean slate
994
                        enum enum_duplicates handle_duplicates, bool ignore,
995
                        SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex)
996
{
997
  multi_update *result;
998
  bool res;
51.2.2 by Patrick Galbraith
Removed DBUGs from
999
  
1 by brian
clean slate
1000
  if (!(result= new multi_update(table_list,
1001
				 thd->lex->select_lex.leaf_tables,
1002
				 fields, values,
1003
				 handle_duplicates, ignore)))
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
1004
    return(true);
1 by brian
clean slate
1005
1006
  thd->abort_on_warning= test(thd->variables.sql_mode &
1007
                              (MODE_STRICT_TRANS_TABLES |
1008
                               MODE_STRICT_ALL_TABLES));
1009
1010
  List<Item> total_list;
1011
  res= mysql_select(thd, &select_lex->ref_pointer_array,
1012
                      table_list, select_lex->with_wild,
1013
                      total_list,
1014
                      conds, 0, (ORDER *) NULL, (ORDER *)NULL, (Item *) NULL,
1015
                      (ORDER *)NULL,
1016
                      options | SELECT_NO_JOIN_CACHE | SELECT_NO_UNLOCK |
1017
                      OPTION_SETUP_TABLES_DONE,
1018
                      result, unit, select_lex);
1019
  res|= thd->is_error();
1020
  if (unlikely(res))
1021
  {
1022
    /* If we had a another error reported earlier then this will be ignored */
1023
    result->send_error(ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR));
1024
    result->abort();
1025
  }
1026
  delete result;
1027
  thd->abort_on_warning= 0;
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
1028
  return(false);
1 by brian
clean slate
1029
}
1030
1031
1032
multi_update::multi_update(TABLE_LIST *table_list,
1033
			   TABLE_LIST *leaves_list,
1034
			   List<Item> *field_list, List<Item> *value_list,
1035
			   enum enum_duplicates handle_duplicates_arg,
1036
                           bool ignore_arg)
1037
  :all_tables(table_list), leaves(leaves_list), update_tables(0),
1038
   tmp_tables(0), updated(0), found(0), fields(field_list),
1039
   values(value_list), table_count(0), copy_field(0),
1040
   handle_duplicates(handle_duplicates_arg), do_update(1), trans_safe(1),
1041
   transactional_tables(0), ignore(ignore_arg), error_handled(0)
1042
{}
1043
1044
1045
/*
1046
  Connect fields with tables and create list of tables that are updated
1047
*/
1048
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1049
int multi_update::prepare(List<Item> &not_used_values __attribute__((unused)),
1050
                          SELECT_LEX_UNIT *lex_unit __attribute__((unused)))
1 by brian
clean slate
1051
{
1052
  TABLE_LIST *table_ref;
1053
  SQL_LIST update;
1054
  table_map tables_to_update;
1055
  Item_field *item;
1056
  List_iterator_fast<Item> field_it(*fields);
1057
  List_iterator_fast<Item> value_it(*values);
1058
  uint i, max_fields;
1059
  uint leaf_table_count= 0;
51.2.2 by Patrick Galbraith
Removed DBUGs from
1060
  
1 by brian
clean slate
1061
  thd->count_cuted_fields= CHECK_FIELD_WARN;
1062
  thd->cuted_fields=0L;
1063
  thd_proc_info(thd, "updating main table");
1064
1065
  tables_to_update= get_table_map(fields);
1066
1067
  if (!tables_to_update)
1068
  {
1069
    my_message(ER_NO_TABLES_USED, ER(ER_NO_TABLES_USED), MYF(0));
51.2.2 by Patrick Galbraith
Removed DBUGs from
1070
    return(1);
1 by brian
clean slate
1071
  }
1072
1073
  /*
1074
    We have to check values after setup_tables to get covering_keys right in
1075
    reference tables
1076
  */
1077
1078
  if (setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0))
51.2.2 by Patrick Galbraith
Removed DBUGs from
1079
    return(1);
1 by brian
clean slate
1080
1081
  /*
1082
    Save tables beeing updated in update_tables
1083
    update_table->shared is position for table
1084
    Don't use key read on tables that are updated
1085
  */
1086
1087
  update.empty();
1088
  for (table_ref= leaves; table_ref; table_ref= table_ref->next_leaf)
1089
  {
1090
    /* TODO: add support of view of join support */
1091
    TABLE *table=table_ref->table;
1092
    leaf_table_count++;
1093
    if (tables_to_update & table->map)
1094
    {
1095
      TABLE_LIST *tl= (TABLE_LIST*) thd->memdup((char*) table_ref,
1096
						sizeof(*tl));
1097
      if (!tl)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1098
	return(1);
1 by brian
clean slate
1099
      update.link_in_list((uchar*) tl, (uchar**) &tl->next_local);
1100
      tl->shared= table_count++;
1101
      table->no_keyread=1;
1102
      table->covering_keys.clear_all();
1103
      table->pos_in_table_list= tl;
1104
    }
1105
  }
1106
1107
1108
  table_count=  update.elements;
1109
  update_tables= (TABLE_LIST*) update.first;
1110
1111
  tmp_tables = (TABLE**) thd->calloc(sizeof(TABLE *) * table_count);
1112
  tmp_table_param = (TMP_TABLE_PARAM*) thd->calloc(sizeof(TMP_TABLE_PARAM) *
1113
						   table_count);
1114
  fields_for_table= (List_item **) thd->alloc(sizeof(List_item *) *
1115
					      table_count);
1116
  values_for_table= (List_item **) thd->alloc(sizeof(List_item *) *
1117
					      table_count);
1118
  if (thd->is_fatal_error)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1119
    return(1);
1 by brian
clean slate
1120
  for (i=0 ; i < table_count ; i++)
1121
  {
1122
    fields_for_table[i]= new List_item;
1123
    values_for_table[i]= new List_item;
1124
  }
1125
  if (thd->is_fatal_error)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1126
    return(1);
1 by brian
clean slate
1127
1128
  /* Split fields into fields_for_table[] and values_by_table[] */
1129
1130
  while ((item= (Item_field *) field_it++))
1131
  {
1132
    Item *value= value_it++;
1133
    uint offset= item->field->table->pos_in_table_list->shared;
1134
    fields_for_table[offset]->push_back(item);
1135
    values_for_table[offset]->push_back(value);
1136
  }
1137
  if (thd->is_fatal_error)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1138
    return(1);
1 by brian
clean slate
1139
1140
  /* Allocate copy fields */
1141
  max_fields=0;
1142
  for (i=0 ; i < table_count ; i++)
1143
    set_if_bigger(max_fields, fields_for_table[i]->elements + leaf_table_count);
1144
  copy_field= new Copy_field[max_fields];
51.2.2 by Patrick Galbraith
Removed DBUGs from
1145
  return(thd->is_fatal_error != 0);
1 by brian
clean slate
1146
}
1147
1148
1149
/*
1150
  Check if table is safe to update on fly
1151
1152
  SYNOPSIS
1153
    safe_update_on_fly()
1154
    thd                 Thread handler
1155
    join_tab            How table is used in join
1156
    all_tables          List of tables
1157
1158
  NOTES
1159
    We can update the first table in join on the fly if we know that
1160
    a row in this table will never be read twice. This is true under
1161
    the following conditions:
1162
1163
    - We are doing a table scan and the data is in a separate file (MyISAM) or
1164
      if we don't update a clustered key.
1165
1166
    - We are doing a range scan and we don't update the scan key or
1167
      the primary key for a clustered table handler.
1168
1169
    - Table is not joined to itself.
1170
1171
    This function gets information about fields to be updated from
1172
    the TABLE::write_set bitmap.
1173
1174
  WARNING
1175
    This code is a bit dependent of how make_join_readinfo() works.
1176
1177
  RETURN
1178
    0		Not safe to update
1179
    1		Safe to update
1180
*/
1181
1182
static bool safe_update_on_fly(THD *thd, JOIN_TAB *join_tab,
1183
                               TABLE_LIST *table_ref, TABLE_LIST *all_tables)
1184
{
1185
  TABLE *table= join_tab->table;
1186
  if (unique_table(thd, table_ref, all_tables, 0))
1187
    return 0;
1188
  switch (join_tab->type) {
1189
  case JT_SYSTEM:
1190
  case JT_CONST:
1191
  case JT_EQ_REF:
56 by brian
Next pass of true/false update.
1192
    return true;				// At most one matching row
1 by brian
clean slate
1193
  case JT_REF:
1194
  case JT_REF_OR_NULL:
1195
    return !is_key_used(table, join_tab->ref.key, table->write_set);
1196
  case JT_ALL:
1197
    /* If range search on index */
1198
    if (join_tab->quick)
1199
      return !join_tab->quick->is_keys_used(table->write_set);
1200
    /* If scanning in clustered key */
1201
    if ((table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) &&
1202
	table->s->primary_key < MAX_KEY)
1203
      return !is_key_used(table, table->s->primary_key, table->write_set);
56 by brian
Next pass of true/false update.
1204
    return true;
1 by brian
clean slate
1205
  default:
1206
    break;					// Avoid compler warning
1207
  }
56 by brian
Next pass of true/false update.
1208
  return false;
1 by brian
clean slate
1209
1210
}
1211
1212
1213
/*
1214
  Initialize table for multi table
1215
1216
  IMPLEMENTATION
1217
    - Update first table in join on the fly, if possible
1218
    - Create temporary tables to store changed values for all other tables
1219
      that are updated (and main_table if the above doesn't hold).
1220
*/
1221
1222
bool
1223
multi_update::initialize_tables(JOIN *join)
1224
{
1225
  TABLE_LIST *table_ref;
51.2.2 by Patrick Galbraith
Removed DBUGs from
1226
  
1 by brian
clean slate
1227
  if ((thd->options & OPTION_SAFE_UPDATES) && error_if_full_join(join))
51.2.2 by Patrick Galbraith
Removed DBUGs from
1228
    return(1);
1 by brian
clean slate
1229
  main_table=join->join_tab->table;
1230
  table_to_update= 0;
1231
1232
  /* Any update has at least one pair (field, value) */
51.2.2 by Patrick Galbraith
Removed DBUGs from
1233
  assert(fields->elements);
1 by brian
clean slate
1234
1235
  /* Create a temporary table for keys to all tables, except main table */
1236
  for (table_ref= update_tables; table_ref; table_ref= table_ref->next_local)
1237
  {
1238
    TABLE *table=table_ref->table;
1239
    uint cnt= table_ref->shared;
1240
    List<Item> temp_fields;
1241
    ORDER     group;
1242
    TMP_TABLE_PARAM *tmp_param;
1243
1244
    table->mark_columns_needed_for_update();
1245
    if (ignore)
1246
      table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1247
    if (table == main_table)			// First table in join
1248
    {
1249
      if (safe_update_on_fly(thd, join->join_tab, table_ref, all_tables))
1250
      {
1251
	table_to_update= main_table;		// Update table on the fly
1252
	continue;
1253
      }
1254
    }
1255
    table->prepare_for_position();
1256
1257
    tmp_param= tmp_table_param+cnt;
1258
1259
    /*
1260
      Create a temporary table to store all fields that are changed for this
1261
      table. The first field in the temporary table is a pointer to the
1262
      original row so that we can find and update it. For the updatable
1263
      VIEW a few following fields are rowids of tables used in the CHECK
1264
      OPTION condition.
1265
    */
1266
1267
    List_iterator_fast<TABLE> tbl_it(unupdated_check_opt_tables);
1268
    TABLE *tbl= table;
1269
    do
1270
    {
1271
      Field_string *field= new Field_string(tbl->file->ref_length, 0,
1272
                                            tbl->alias, &my_charset_bin);
1273
      if (!field)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1274
        return(1);
1 by brian
clean slate
1275
      field->init(tbl);
1276
      /*
1277
        The field will be converted to varstring when creating tmp table if
1278
        table to be updated was created by mysql 4.1. Deny this.
1279
      */
1280
      field->can_alter_field_type= 0;
1281
      Item_field *ifield= new Item_field((Field *) field);
1282
      if (!ifield)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1283
         return(1);
1 by brian
clean slate
1284
      ifield->maybe_null= 0;
1285
      if (temp_fields.push_back(ifield))
51.2.2 by Patrick Galbraith
Removed DBUGs from
1286
        return(1);
1 by brian
clean slate
1287
    } while ((tbl= tbl_it++));
1288
1289
    temp_fields.concat(fields_for_table[cnt]);
1290
1291
    /* Make an unique key over the first field to avoid duplicated updates */
1292
    bzero((char*) &group, sizeof(group));
1293
    group.asc= 1;
1294
    group.item= (Item**) temp_fields.head_ref();
1295
1296
    tmp_param->quick_group=1;
1297
    tmp_param->field_count=temp_fields.elements;
1298
    tmp_param->group_parts=1;
1299
    tmp_param->group_length= table->file->ref_length;
1300
    if (!(tmp_tables[cnt]=create_tmp_table(thd,
1301
					   tmp_param,
1302
					   temp_fields,
1303
					   (ORDER*) &group, 0, 0,
1304
					   TMP_TABLE_ALL_COLUMNS,
1305
					   HA_POS_ERROR,
1306
					   (char *) "")))
51.2.2 by Patrick Galbraith
Removed DBUGs from
1307
      return(1);
1 by brian
clean slate
1308
    tmp_tables[cnt]->file->extra(HA_EXTRA_WRITE_CACHE);
1309
  }
51.2.2 by Patrick Galbraith
Removed DBUGs from
1310
  return(0);
1 by brian
clean slate
1311
}
1312
1313
1314
multi_update::~multi_update()
1315
{
1316
  TABLE_LIST *table;
1317
  for (table= update_tables ; table; table= table->next_local)
1318
  {
1319
    table->table->no_keyread= table->table->no_cache= 0;
1320
    if (ignore)
1321
      table->table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1322
  }
1323
1324
  if (tmp_tables)
1325
  {
1326
    for (uint cnt = 0; cnt < table_count; cnt++)
1327
    {
1328
      if (tmp_tables[cnt])
1329
      {
1330
	free_tmp_table(thd, tmp_tables[cnt]);
1331
	tmp_table_param[cnt].cleanup();
1332
      }
1333
    }
1334
  }
1335
  if (copy_field)
1336
    delete [] copy_field;
1337
  thd->count_cuted_fields= CHECK_FIELD_IGNORE;		// Restore this setting
77.1.45 by Monty Taylor
Warning fixes.
1338
  assert(trans_safe || !updated ||
1 by brian
clean slate
1339
              thd->transaction.all.modified_non_trans_table);
1340
}
1341
1342
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1343
bool multi_update::send_data(List<Item> &not_used_values __attribute__((unused)))
1 by brian
clean slate
1344
{
1345
  TABLE_LIST *cur_table;
51.2.2 by Patrick Galbraith
Removed DBUGs from
1346
  
1 by brian
clean slate
1347
  for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local)
1348
  {
1349
    TABLE *table= cur_table->table;
1350
    uint offset= cur_table->shared;
1351
    /*
1352
      Check if we are using outer join and we didn't find the row
1353
      or if we have already updated this row in the previous call to this
1354
      function.
1355
1356
      The same row may be presented here several times in a join of type
1357
      UPDATE t1 FROM t1,t2 SET t1.a=t2.a
1358
1359
      In this case we will do the update for the first found row combination.
1360
      The join algorithm guarantees that we will not find the a row in
1361
      t1 several times.
1362
    */
1363
    if (table->status & (STATUS_NULL_ROW | STATUS_UPDATED))
1364
      continue;
1365
1366
    /*
1367
      We can use compare_record() to optimize away updates if
1368
      the table handler is returning all columns OR if
1369
      if all updated columns are read
1370
    */
1371
    if (table == table_to_update)
1372
    {
1373
      bool can_compare_record;
1374
      can_compare_record= (!(table->file->ha_table_flags() &
1375
                             HA_PARTIAL_COLUMN_READ) ||
1376
                           bitmap_is_subset(table->write_set,
1377
                                            table->read_set));
1378
      table->status|= STATUS_UPDATED;
1379
      store_record(table,record[1]);
1380
      if (fill_record(thd, *fields_for_table[offset],
1381
                      *values_for_table[offset], 0))
51.2.2 by Patrick Galbraith
Removed DBUGs from
1382
	return(1);
1 by brian
clean slate
1383
1384
      found++;
1385
      if (!can_compare_record || compare_record(table))
1386
      {
1387
	int error;
1388
        if (!updated++)
1389
        {
1390
          /*
1391
            Inform the main table that we are going to update the table even
1392
            while we may be scanning it.  This will flush the read cache
1393
            if it's used.
1394
          */
1395
          main_table->file->extra(HA_EXTRA_PREPARE_FOR_UPDATE);
1396
        }
1397
        if ((error=table->file->ha_update_row(table->record[1],
1398
                                              table->record[0])) &&
1399
            error != HA_ERR_RECORD_IS_THE_SAME)
1400
        {
1401
          updated--;
1402
          if (!ignore ||
1403
              table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
1404
          {
1405
            /*
1406
              If (ignore && error == is ignorable) we don't have to
1407
              do anything; otherwise...
1408
            */
1409
            myf flags= 0;
1410
1411
            if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
1412
              flags|= ME_FATALERROR; /* Other handler errors are fatal */
1413
1414
            prepare_record_for_error_message(error, table);
1415
            table->file->print_error(error,MYF(flags));
51.2.2 by Patrick Galbraith
Removed DBUGs from
1416
            return(1);
1 by brian
clean slate
1417
          }
1418
        }
1419
        else
1420
        {
1421
          if (error == HA_ERR_RECORD_IS_THE_SAME)
1422
          {
1423
            error= 0;
1424
            updated--;
1425
          }
1426
          /* non-transactional or transactional table got modified   */
1427
          /* either multi_update class' flag is raised in its branch */
1428
          if (table->file->has_transactions())
1429
            transactional_tables= 1;
1430
          else
1431
          {
1432
            trans_safe= 0;
56 by brian
Next pass of true/false update.
1433
            thd->transaction.stmt.modified_non_trans_table= true;
1 by brian
clean slate
1434
          }
1435
        }
1436
      }
1437
    }
1438
    else
1439
    {
1440
      int error;
1441
      TABLE *tmp_table= tmp_tables[offset];
1442
      /*
1443
       For updatable VIEW store rowid of the updated table and
1444
       rowids of tables used in the CHECK OPTION condition.
1445
      */
1446
      uint field_num= 0;
1447
      List_iterator_fast<TABLE> tbl_it(unupdated_check_opt_tables);
1448
      TABLE *tbl= table;
1449
      do
1450
      {
1451
        tbl->file->position(tbl->record[0]);
1452
        memcpy((char*) tmp_table->field[field_num]->ptr,
1453
               (char*) tbl->file->ref, tbl->file->ref_length);
1454
        field_num++;
1455
      } while ((tbl= tbl_it++));
1456
1457
      /* Store regular updated fields in the row. */
1458
      fill_record(thd,
1459
                  tmp_table->field + 1 + unupdated_check_opt_tables.elements,
1460
                  *values_for_table[offset], 1);
1461
1462
      /* Write row, ignoring duplicated updates to a row */
1463
      error= tmp_table->file->ha_write_row(tmp_table->record[0]);
1464
      if (error != HA_ERR_FOUND_DUPP_KEY && error != HA_ERR_FOUND_DUPP_UNIQUE)
1465
      {
1466
        if (error &&
1467
            create_myisam_from_heap(thd, tmp_table,
1468
                                         tmp_table_param[offset].start_recinfo,
1469
                                         &tmp_table_param[offset].recinfo,
1470
                                         error, 1))
1471
        {
1472
          do_update=0;
51.2.2 by Patrick Galbraith
Removed DBUGs from
1473
	  return(1);			// Not a table_is_full error
1 by brian
clean slate
1474
	}
1475
        found++;
1476
      }
1477
    }
1478
  }
51.2.2 by Patrick Galbraith
Removed DBUGs from
1479
  return(0);
1 by brian
clean slate
1480
}
1481
1482
1483
void multi_update::send_error(uint errcode,const char *err)
1484
{
1485
  /* First send error what ever it is ... */
1486
  my_error(errcode, MYF(0), err);
1487
}
1488
1489
1490
void multi_update::abort()
1491
{
1492
  /* the error was handled or nothing deleted and no side effects return */
1493
  if (error_handled ||
1494
      (!thd->transaction.stmt.modified_non_trans_table && !updated))
1495
    return;
1496
  /*
1497
    If all tables that has been updated are trans safe then just do rollback.
1498
    If not attempt to do remaining updates.
1499
  */
1500
1501
  if (! trans_safe)
1502
  {
51.2.2 by Patrick Galbraith
Removed DBUGs from
1503
    assert(thd->transaction.stmt.modified_non_trans_table);
1 by brian
clean slate
1504
    if (do_update && table_count > 1)
1505
    {
1506
      /* Add warning here */
1507
      /* 
1508
         todo/fixme: do_update() is never called with the arg 1.
1509
         should it change the signature to become argless?
1510
      */
1511
      VOID(do_updates());
1512
    }
1513
  }
1514
  if (thd->transaction.stmt.modified_non_trans_table)
1515
  {
1516
    /*
1517
      The query has to binlog because there's a modified non-transactional table
1518
      either from the query's list or via a stored routine: bug#13270,23333
1519
    */
1520
    if (mysql_bin_log.is_open())
1521
    {
1522
      /*
1523
        THD::killed status might not have been set ON at time of an error
1524
        got caught and if happens later the killed error is written
1525
        into repl event.
1526
      */
1527
      thd->binlog_query(THD::ROW_QUERY_TYPE,
1528
                        thd->query, thd->query_length,
56 by brian
Next pass of true/false update.
1529
                        transactional_tables, false);
1 by brian
clean slate
1530
    }
56 by brian
Next pass of true/false update.
1531
    thd->transaction.all.modified_non_trans_table= true;
1 by brian
clean slate
1532
  }
51.2.2 by Patrick Galbraith
Removed DBUGs from
1533
  assert(trans_safe || !updated || thd->transaction.stmt.modified_non_trans_table);
1 by brian
clean slate
1534
}
1535
1536
1537
int multi_update::do_updates()
1538
{
1539
  TABLE_LIST *cur_table;
1540
  int local_error= 0;
1541
  ha_rows org_updated;
1542
  TABLE *table, *tmp_table;
1543
  List_iterator_fast<TABLE> check_opt_it(unupdated_check_opt_tables);
51.2.2 by Patrick Galbraith
Removed DBUGs from
1544
  
1 by brian
clean slate
1545
  do_update= 0;					// Don't retry this function
1546
  if (!found)
51.2.2 by Patrick Galbraith
Removed DBUGs from
1547
    return(0);
1 by brian
clean slate
1548
  for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local)
1549
  {
1550
    bool can_compare_record;
1551
    uint offset= cur_table->shared;
1552
1553
    table = cur_table->table;
1554
    if (table == table_to_update)
1555
      continue;					// Already updated
1556
    org_updated= updated;
1557
    tmp_table= tmp_tables[cur_table->shared];
1558
    tmp_table->file->extra(HA_EXTRA_CACHE);	// Change to read cache
1559
    (void) table->file->ha_rnd_init(0);
1560
    table->file->extra(HA_EXTRA_NO_CACHE);
1561
1562
    check_opt_it.rewind();
1563
    while(TABLE *tbl= check_opt_it++)
1564
    {
1565
      if (tbl->file->ha_rnd_init(1))
1566
        goto err;
1567
      tbl->file->extra(HA_EXTRA_CACHE);
1568
    }
1569
1570
    /*
1571
      Setup copy functions to copy fields from temporary table
1572
    */
1573
    List_iterator_fast<Item> field_it(*fields_for_table[offset]);
1574
    Field **field= tmp_table->field + 
1575
                   1 + unupdated_check_opt_tables.elements; // Skip row pointers
1576
    Copy_field *copy_field_ptr= copy_field, *copy_field_end;
1577
    for ( ; *field ; field++)
1578
    {
1579
      Item_field *item= (Item_field* ) field_it++;
1580
      (copy_field_ptr++)->set(item->field, *field, 0);
1581
    }
1582
    copy_field_end=copy_field_ptr;
1583
1584
    if ((local_error = tmp_table->file->ha_rnd_init(1)))
1585
      goto err;
1586
1587
    can_compare_record= (!(table->file->ha_table_flags() &
1588
                           HA_PARTIAL_COLUMN_READ) ||
1589
                         bitmap_is_subset(table->write_set,
1590
                                          table->read_set));
1591
1592
    for (;;)
1593
    {
1594
      if (thd->killed && trans_safe)
1595
	goto err;
1596
      if ((local_error=tmp_table->file->rnd_next(tmp_table->record[0])))
1597
      {
1598
	if (local_error == HA_ERR_END_OF_FILE)
1599
	  break;
1600
	if (local_error == HA_ERR_RECORD_DELETED)
1601
	  continue;				// May happen on dup key
1602
	goto err;
1603
      }
1604
1605
      /* call rnd_pos() using rowids from temporary table */
1606
      check_opt_it.rewind();
1607
      TABLE *tbl= table;
1608
      uint field_num= 0;
1609
      do
1610
      {
1611
        if((local_error=
1612
              tbl->file->rnd_pos(tbl->record[0],
1613
                                (uchar *) tmp_table->field[field_num]->ptr)))
1614
          goto err;
1615
        field_num++;
1616
      } while((tbl= check_opt_it++));
1617
1618
      table->status|= STATUS_UPDATED;
1619
      store_record(table,record[1]);
1620
1621
      /* Copy data from temporary table to current table */
1622
      for (copy_field_ptr=copy_field;
1623
	   copy_field_ptr != copy_field_end;
1624
	   copy_field_ptr++)
1625
	(*copy_field_ptr->do_copy)(copy_field_ptr);
1626
1627
      if (!can_compare_record || compare_record(table))
1628
      {
1629
	if ((local_error=table->file->ha_update_row(table->record[1],
1630
						    table->record[0])) &&
1631
            local_error != HA_ERR_RECORD_IS_THE_SAME)
1632
	{
1633
	  if (!ignore ||
1634
              table->file->is_fatal_error(local_error, HA_CHECK_DUP_KEY))
1635
	    goto err;
1636
	}
1637
        if (local_error != HA_ERR_RECORD_IS_THE_SAME)
1638
          updated++;
1639
        else
1640
          local_error= 0;
1641
      }
1642
    }
1643
1644
    if (updated != org_updated)
1645
    {
1646
      if (table->file->has_transactions())
1647
        transactional_tables= 1;
1648
      else
1649
      {
1650
        trans_safe= 0;				// Can't do safe rollback
56 by brian
Next pass of true/false update.
1651
        thd->transaction.stmt.modified_non_trans_table= true;
1 by brian
clean slate
1652
      }
1653
    }
1654
    (void) table->file->ha_rnd_end();
1655
    (void) tmp_table->file->ha_rnd_end();
1656
    check_opt_it.rewind();
1657
    while (TABLE *tbl= check_opt_it++)
1658
        tbl->file->ha_rnd_end();
1659
1660
  }
51.2.2 by Patrick Galbraith
Removed DBUGs from
1661
  return(0);
1 by brian
clean slate
1662
1663
err:
1664
  {
1665
    prepare_record_for_error_message(local_error, table);
1666
    table->file->print_error(local_error,MYF(ME_FATALERROR));
1667
  }
1668
1669
  (void) table->file->ha_rnd_end();
1670
  (void) tmp_table->file->ha_rnd_end();
1671
  check_opt_it.rewind();
1672
  while (TABLE *tbl= check_opt_it++)
1673
      tbl->file->ha_rnd_end();
1674
1675
  if (updated != org_updated)
1676
  {
1677
    if (table->file->has_transactions())
1678
      transactional_tables= 1;
1679
    else
1680
    {
1681
      trans_safe= 0;
56 by brian
Next pass of true/false update.
1682
      thd->transaction.stmt.modified_non_trans_table= true;
1 by brian
clean slate
1683
    }
1684
  }
51.2.2 by Patrick Galbraith
Removed DBUGs from
1685
  return(1);
1 by brian
clean slate
1686
}
1687
1688
1689
/* out: 1 if error, 0 if success */
1690
1691
bool multi_update::send_eof()
1692
{
1693
  char buff[STRING_BUFFER_USUAL_SIZE];
151 by Brian Aker
Ulonglong to uint64_t
1694
  uint64_t id;
1 by brian
clean slate
1695
  THD::killed_state killed_status= THD::NOT_KILLED;
51.2.2 by Patrick Galbraith
Removed DBUGs from
1696
  
1 by brian
clean slate
1697
  thd_proc_info(thd, "updating reference tables");
1698
1699
  /* 
1700
     Does updates for the last n - 1 tables, returns 0 if ok;
1701
     error takes into account killed status gained in do_updates()
1702
  */
1703
  int local_error = (table_count) ? do_updates() : 0;
1704
  /*
1705
    if local_error is not set ON until after do_updates() then
1706
    later carried out killing should not affect binlogging.
1707
  */
1708
  killed_status= (local_error == 0)? THD::NOT_KILLED : thd->killed;
1709
  thd_proc_info(thd, "end");
1710
1711
  /*
1712
    Write the SQL statement to the binlog if we updated
1713
    rows and we succeeded or if we updated some non
1714
    transactional tables.
1715
    
1716
    The query has to binlog because there's a modified non-transactional table
1717
    either from the query's list or via a stored routine: bug#13270,23333
1718
  */
1719
51.2.2 by Patrick Galbraith
Removed DBUGs from
1720
  assert(trans_safe || !updated || 
1 by brian
clean slate
1721
              thd->transaction.stmt.modified_non_trans_table);
1722
  if (local_error == 0 || thd->transaction.stmt.modified_non_trans_table)
1723
  {
1724
    if (mysql_bin_log.is_open())
1725
    {
1726
      if (local_error == 0)
1727
        thd->clear_error();
1728
      if (thd->binlog_query(THD::ROW_QUERY_TYPE,
1729
                            thd->query, thd->query_length,
56 by brian
Next pass of true/false update.
1730
                            transactional_tables, false, killed_status) &&
1 by brian
clean slate
1731
          trans_safe)
1732
      {
51.2.2 by Patrick Galbraith
Removed DBUGs from
1733
        local_error= 1;				// Rollback update
1 by brian
clean slate
1734
      }
1735
    }
1736
    if (thd->transaction.stmt.modified_non_trans_table)
56 by brian
Next pass of true/false update.
1737
      thd->transaction.all.modified_non_trans_table= true;
1 by brian
clean slate
1738
  }
1739
  if (local_error != 0)
56 by brian
Next pass of true/false update.
1740
    error_handled= true; // to force early leave from ::send_error()
1 by brian
clean slate
1741
1742
  if (local_error > 0) // if the above log write did not fail ...
1743
  {
1744
    /* Safety: If we haven't got an error before (can happen in do_updates) */
1745
    my_message(ER_UNKNOWN_ERROR, "An error occured in multi-table update",
1746
	       MYF(0));
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
1747
    return(true);
1 by brian
clean slate
1748
  }
1749
1750
  id= thd->arg_of_last_insert_id_function ?
1751
    thd->first_successful_insert_id_in_prev_stmt : 0;
1752
  sprintf(buff, ER(ER_UPDATE_INFO), (ulong) found, (ulong) updated,
1753
	  (ulong) thd->cuted_fields);
1754
  thd->row_count_func=
1755
    (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated;
1756
  ::my_ok(thd, (ulong) thd->row_count_func, id, buff);
51.1.8 by Jay Pipes
Resolving conflicts for a few files regarding FALSE=>false
1757
  return(false);
1 by brian
clean slate
1758
}