~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
1802.10.2 by Monty Taylor
Update all of the copyright headers to include the correct address.
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
1 by brian
clean slate
15
16
17
/*
18
  Single table and multi table updates of tables.
19
*/
2148.7.12 by Brian Aker
Merge in header fixes.
20
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
21
#include <config.h>
2148.7.12 by Brian Aker
Merge in header fixes.
22
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
23
#include <drizzled/sql_select.h>
24
#include <drizzled/error.h>
25
#include <drizzled/probes.h>
26
#include <drizzled/sql_base.h>
27
#include <drizzled/field/epoch.h>
28
#include <drizzled/sql_parse.h>
29
#include <drizzled/optimizer/range.h>
30
#include <drizzled/records.h>
31
#include <drizzled/internal/my_sys.h>
32
#include <drizzled/internal/iocache.h>
33
#include <drizzled/transaction_services.h>
34
#include <drizzled/filesort.h>
35
#include <drizzled/plugin/storage_engine.h>
2198.1.1 by Olaf van der Spek
Remove unnecessary alter* includes
36
#include <drizzled/key.h>
1 by brian
clean slate
37
1802.16.6 by Padraig O'Sullivan
Added temporary conversion of a bitmap to dynamic_bitset in order to remove references to MyBitmap within optimizer code.
38
#include <boost/dynamic_bitset.hpp>
997.4.1 by Padraig O'Sullivan
Removed 1 instance of SQL_LIST from the source base. Replaced it with
39
#include <list>
982.1.3 by Padraig O'Sullivan
Various small cleanups to numerous files to now have calls to the correct
40
41
using namespace std;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
42
43
namespace drizzled
44
{
1005.2.3 by Monty Taylor
Further reversion of P.
45
1 by brian
clean slate
46
/**
47
  Re-read record if more columns are needed for error message.
48
49
  If we got a duplicate key error, we want to write an error
50
  message containing the value of the duplicate key. If we do not have
1672.3.6 by Brian Aker
First pass in encapsulating row
51
  all fields of the key value in getInsertRecord(), we need to re-read the
1 by brian
clean slate
52
  record with a proper read_set.
53
54
  @param[in] error   error number
55
  @param[in] table   table
56
*/
57
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
58
static void prepare_record_for_error_message(int error, Table *table)
1 by brian
clean slate
59
{
1802.16.1 by Padraig O'Sullivan
Replaced one instance of MyBitmap with dynamic_bitset from boost. Added some utility functions to MyBitmap temporarily in order to accomplish this.
60
  Field **field_p= NULL;
61
  Field *field= NULL;
62
  uint32_t keynr= 0;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
63
1 by brian
clean slate
64
  /*
65
    Only duplicate key errors print the key value.
66
    If storage engine does always read all columns, we have the value alraedy.
67
  */
68
  if ((error != HA_ERR_FOUND_DUPP_KEY) ||
1802.16.1 by Padraig O'Sullivan
Replaced one instance of MyBitmap with dynamic_bitset from boost. Added some utility functions to MyBitmap temporarily in order to accomplish this.
69
      ! (table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ)))
51.2.2 by Patrick Galbraith
Removed DBUGs from
70
    return;
1 by brian
clean slate
71
72
  /*
73
    Get the number of the offended index.
74
    We will see MAX_KEY if the engine cannot determine the affected index.
75
  */
1216.1.1 by Brian Aker
Move print_error up to Engine.
76
  if ((keynr= table->get_dup_key(error)) >= MAX_KEY)
51.2.2 by Patrick Galbraith
Removed DBUGs from
77
    return;
1 by brian
clean slate
78
79
  /* Create unique_map with all fields used by that index. */
1835.1.5 by Brian Aker
Cleans up some spots where we were using mutable but did not need too.
80
  boost::dynamic_bitset<> unique_map(table->getShare()->sizeFields()); /* Fields in offended unique. */
1802.16.1 by Padraig O'Sullivan
Replaced one instance of MyBitmap with dynamic_bitset from boost. Added some utility functions to MyBitmap temporarily in order to accomplish this.
81
  table->mark_columns_used_by_index_no_reset(keynr, unique_map);
1 by brian
clean slate
82
83
  /* Subtract read_set and write_set. */
1802.16.8 by Padraig O'Sullivan
Removal of all MyBitmap from the code base. Compiles but test failures exist now.
84
  unique_map-= *table->read_set;
85
  unique_map-= *table->write_set;
1 by brian
clean slate
86
87
  /*
88
    If the unique index uses columns that are neither in read_set
89
    nor in write_set, we must re-read the record.
90
    Otherwise no need to do anything.
91
  */
1802.16.1 by Padraig O'Sullivan
Replaced one instance of MyBitmap with dynamic_bitset from boost. Added some utility functions to MyBitmap temporarily in order to accomplish this.
92
  if (unique_map.none())
51.2.2 by Patrick Galbraith
Removed DBUGs from
93
    return;
1 by brian
clean slate
94
1208.3.2 by brian
Update for Cursor renaming.
95
  /* Get identifier of last read record into table->cursor->ref. */
1672.3.6 by Brian Aker
First pass in encapsulating row
96
  table->cursor->position(table->getInsertRecord());
1 by brian
clean slate
97
  /* Add all fields used by unique index to read_set. */
1802.16.8 by Padraig O'Sullivan
Removal of all MyBitmap from the code base. Compiles but test failures exist now.
98
  *table->read_set|= unique_map;
1208.3.2 by brian
Update for Cursor renaming.
99
  /* Read record that is identified by table->cursor->ref. */
1672.3.6 by Brian Aker
First pass in encapsulating row
100
  (void) table->cursor->rnd_pos(table->getUpdateRecord(), table->cursor->ref);
1 by brian
clean slate
101
  /* Copy the newly read columns into the new record. */
1578.2.16 by Brian Aker
Merge in change to getTable() to private the field objects.
102
  for (field_p= table->getFields(); (field= *field_p); field_p++)
103
  {
1999.4.2 by Brian Aker
Encapsulate the field's position.
104
    if (unique_map.test(field->position()))
1578.2.16 by Brian Aker
Merge in change to getTable() to private the field objects.
105
    {
1574 by Brian Aker
Rollup patch for hiding tableshare.
106
      field->copy_from_tmp(table->getShare()->rec_buff_length);
1578.2.16 by Brian Aker
Merge in change to getTable() to private the field objects.
107
    }
108
  }
109
51.2.2 by Patrick Galbraith
Removed DBUGs from
110
  return;
1 by brian
clean slate
111
}
112
113
114
/*
115
  Process usual UPDATE
116
117
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
118
    update_query()
520.1.22 by Brian Aker
Second pass of thd cleanup
119
    session			thread handler
1 by brian
clean slate
120
    fields		fields for update
121
    values		values of fields for update
122
    conds		WHERE clause expression
1273.2.8 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in sql_update.cc
123
    order_num		number of elemen in ORDER BY clause
327.2.3 by Brian Aker
Refactoring of class Table
124
    order		order_st BY clause list
1 by brian
clean slate
125
    limit		limit clause
126
    handle_duplicates	how to handle duplicates
127
128
  RETURN
129
    0  - OK
130
    1  - error
131
*/
132
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
133
int update_query(Session *session, TableList *table_list,
575.1.2 by Monty Taylor
Changed a bunch of __attribute__((unused)) to removing the parameter name instead.
134
                 List<Item> &fields, List<Item> &values, COND *conds,
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
135
                 uint32_t order_num, Order *order,
575.1.2 by Monty Taylor
Changed a bunch of __attribute__((unused)) to removing the parameter name instead.
136
                 ha_rows limit, enum enum_duplicates,
77.1.45 by Monty Taylor
Warning fixes.
137
                 bool ignore)
1 by brian
clean slate
138
{
139
  bool		using_limit= limit != HA_POS_ERROR;
1235.1.9 by Brian Aker
Remove code around update batch handler (we have no engines supporting
140
  bool		used_key_is_modified;
141
  bool		transactional_table;
2049.2.1 by Stewart Smith
doStartTableScan() result not checked.
142
  int		error= 0;
1 by brian
clean slate
143
  uint		used_index= MAX_KEY, dup_key_found;
56 by brian
Next pass of true/false update.
144
  bool          need_sort= true;
1 by brian
clean slate
145
  ha_rows	updated, found;
146
  key_map	old_covering_keys;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
147
  Table		*table;
1237.13.3 by Padraig O'Sullivan
Performed numerous style cleanups in range.[cc,h].
148
  optimizer::SqlSelect *select= NULL;
1538 by Brian Aker
Code shuffle on ReadRecord
149
  ReadRecord	info;
2187.2.2 by Brian Aker
getLex() usage and fix for table_name creation during admin commands.
150
  Select_Lex    *select_lex= &session->getLex()->select_lex;
151 by Brian Aker
Ulonglong to uint64_t
151
  uint64_t     id;
1 by brian
clean slate
152
  List<Item> all_fields;
1910.2.8 by Brian Aker
Enapsulate Kill.
153
  Session::killed_state_t killed_status= Session::NOT_KILLED;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
154
1932.2.3 by Brian Aker
Updates for D-trace
155
  DRIZZLE_UPDATE_START(session->getQueryString()->c_str());
1109.1.3 by Brian Aker
Move names around a bit (to align similar methods)
156
  if (session->openTablesLock(table_list))
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
157
  {
158
    DRIZZLE_UPDATE_DONE(1, 0, 0);
1109.1.2 by Brian Aker
More from the table patch
159
    return 1;
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
160
  }
1109.1.2 by Brian Aker
More from the table patch
161
520.1.22 by Brian Aker
Second pass of thd cleanup
162
  session->set_proc_info("init");
1 by brian
clean slate
163
  table= table_list->table;
164
165
  /* Calculate "table->covering_keys" based on the WHERE */
1574 by Brian Aker
Rollup patch for hiding tableshare.
166
  table->covering_keys= table->getShare()->keys_in_use;
1005.2.6 by Monty Taylor
Re-added bitset<> as a replacement for Bitmap<>
167
  table->quick_keys.reset();
1 by brian
clean slate
168
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
169
  if (prepare_update(session, table_list, &conds, order_num, order))
1864.3.22 by Brian Aker
Goto removal.
170
  {
171
    DRIZZLE_UPDATE_DONE(1, 0, 0);
172
    return 1;
173
  }
1 by brian
clean slate
174
175
  old_covering_keys= table->covering_keys;		// Keys used in WHERE
176
  /* Check the fields we are going to modify */
520.1.22 by Brian Aker
Second pass of thd cleanup
177
  if (setup_fields_with_no_wrap(session, 0, fields, MARK_COLUMNS_WRITE, 0, 0))
1864.3.22 by Brian Aker
Goto removal.
178
  {
179
    DRIZZLE_UPDATE_DONE(1, 0, 0);
180
    return 1;
181
  }
182
1 by brian
clean slate
183
  if (table->timestamp_field)
184
  {
185
    // Don't set timestamp column if this is modified
1009 by Brian Aker
Merge of Monty
186
    if (table->timestamp_field->isWriteSet())
1607 by Brian Aker
Cursor now fully handles the update to timestamp for the engine.
187
    {
1 by brian
clean slate
188
      table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1607 by Brian Aker
Cursor now fully handles the update to timestamp for the engine.
189
    }
1 by brian
clean slate
190
    else
191
    {
192
      if (table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_UPDATE ||
193
          table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH)
1607 by Brian Aker
Cursor now fully handles the update to timestamp for the engine.
194
      {
1999.4.2 by Brian Aker
Encapsulate the field's position.
195
        table->setWriteSet(table->timestamp_field->position());
1607 by Brian Aker
Cursor now fully handles the update to timestamp for the engine.
196
      }
1 by brian
clean slate
197
    }
198
  }
199
520.1.22 by Brian Aker
Second pass of thd cleanup
200
  if (setup_fields(session, 0, values, MARK_COLUMNS_READ, 0, 0))
1 by brian
clean slate
201
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
202
    free_underlaid_joins(session, select_lex);
1864.3.22 by Brian Aker
Goto removal.
203
    DRIZZLE_UPDATE_DONE(1, 0, 0);
204
205
    return 1;
1 by brian
clean slate
206
  }
207
2183.2.20 by Olaf van der Spek
Use List::size()
208
  if (select_lex->inner_refs_list.size() &&
520.1.22 by Brian Aker
Second pass of thd cleanup
209
    fix_inner_refs(session, all_fields, select_lex, select_lex->ref_pointer_array))
1 by brian
clean slate
210
  {
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
211
    DRIZZLE_UPDATE_DONE(1, 0, 0);
2062.4.1 by Andrew Hutchings
Backport http://bugs.mysql.com/bug.php?id=40113
212
    return 1;
1 by brian
clean slate
213
  }
214
215
  if (conds)
216
  {
217
    Item::cond_result cond_value;
520.1.22 by Brian Aker
Second pass of thd cleanup
218
    conds= remove_eq_conds(session, conds, &cond_value);
1 by brian
clean slate
219
    if (cond_value == Item::COND_FALSE)
220
      limit= 0;                                   // Impossible WHERE
221
  }
222
223
  /*
224
    If a timestamp field settable on UPDATE is present then to avoid wrong
225
    update force the table handler to retrieve write-only fields to be able
226
    to compare records and detect data change.
227
  */
1233.1.4 by Brian Aker
Added:
228
  if (table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ) &&
1 by brian
clean slate
229
      table->timestamp_field &&
230
      (table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_UPDATE ||
231
       table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH))
1607 by Brian Aker
Cursor now fully handles the update to timestamp for the engine.
232
  {
1802.16.8 by Padraig O'Sullivan
Removal of all MyBitmap from the code base. Compiles but test failures exist now.
233
    *table->read_set|= *table->write_set;
1607 by Brian Aker
Cursor now fully handles the update to timestamp for the engine.
234
  }
1 by brian
clean slate
235
  // Don't count on usage of 'only index' when calculating which key to use
1005.2.6 by Monty Taylor
Re-added bitset<> as a replacement for Bitmap<>
236
  table->covering_keys.reset();
1 by brian
clean slate
237
1208.3.2 by brian
Update for Cursor renaming.
238
  /* Update the table->cursor->stats.records number */
239
  table->cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
1 by brian
clean slate
240
1237.9.2 by Padraig O'Sullivan
Moved opt_range.[cc,h] into the optimizer directory and namespace and renamed the files to
241
  select= optimizer::make_select(table, 0, 0, conds, 0, &error);
1 by brian
clean slate
242
  if (error || !limit ||
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
243
      (select && select->check_quick(session, false, limit)))
1 by brian
clean slate
244
  {
245
    delete select;
1124.2.14 by Diego Medina
* On certain UPDATE and DELETE statements, drizzled failed an assert() in
246
    /**
247
     * Resetting the Diagnostic area to prevent
248
     * lp bug# 439719
249
     */
250
    session->main_da.reset_diagnostics_area();
520.1.22 by Brian Aker
Second pass of thd cleanup
251
    free_underlaid_joins(session, select_lex);
2062.4.1 by Andrew Hutchings
Backport http://bugs.mysql.com/bug.php?id=40113
252
    if (error || session->is_error())
1864.3.22 by Brian Aker
Goto removal.
253
    {
254
      DRIZZLE_UPDATE_DONE(1, 0, 0);
255
      return 1;
256
    }
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
257
    DRIZZLE_UPDATE_DONE(0, 0, 0);
836 by Brian Aker
Fixed session call from function to method.
258
    session->my_ok();				// No matching records
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
259
    return 0;
1 by brian
clean slate
260
  }
261
  if (!select && limit != HA_POS_ERROR)
262
  {
1237.9.2 by Padraig O'Sullivan
Moved opt_range.[cc,h] into the optimizer directory and namespace and renamed the files to
263
    if ((used_index= optimizer::get_index_for_order(table, order, limit)) != MAX_KEY)
56 by brian
Next pass of true/false update.
264
      need_sort= false;
1 by brian
clean slate
265
  }
266
  /* If running in safe sql mode, don't allow updates without keys */
1005.2.6 by Monty Taylor
Re-added bitset<> as a replacement for Bitmap<>
267
  if (table->quick_keys.none())
1 by brian
clean slate
268
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
269
    session->server_status|=SERVER_QUERY_NO_INDEX_USED;
1 by brian
clean slate
270
  }
271
272
  table->mark_columns_needed_for_update();
273
274
  /* Check if we are modifying a key that we are used to search with */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
275
1 by brian
clean slate
276
  if (select && select->quick)
277
  {
278
    used_index= select->quick->index;
279
    used_key_is_modified= (!select->quick->unique_key_range() &&
1802.16.8 by Padraig O'Sullivan
Removal of all MyBitmap from the code base. Compiles but test failures exist now.
280
                          select->quick->is_keys_used(*table->write_set));
1 by brian
clean slate
281
  }
282
  else
283
  {
284
    used_key_is_modified= 0;
285
    if (used_index == MAX_KEY)                  // no index for sort order
1208.3.2 by brian
Update for Cursor renaming.
286
      used_index= table->cursor->key_used_on_scan;
1 by brian
clean slate
287
    if (used_index != MAX_KEY)
1802.16.8 by Padraig O'Sullivan
Removal of all MyBitmap from the code base. Compiles but test failures exist now.
288
      used_key_is_modified= is_key_used(table, used_index, *table->write_set);
1 by brian
clean slate
289
  }
290
291
292
  if (used_key_is_modified || order)
293
  {
294
    /*
295
      We can't update table directly;  We must first search after all
296
      matching rows before updating the table!
297
    */
1005.2.6 by Monty Taylor
Re-added bitset<> as a replacement for Bitmap<>
298
    if (used_index < MAX_KEY && old_covering_keys.test(used_index))
1 by brian
clean slate
299
    {
300
      table->key_read=1;
301
      table->mark_columns_used_by_index(used_index);
302
    }
303
    else
304
    {
305
      table->use_all_columns();
306
    }
307
308
    /* note: We avoid sorting avoid if we sort on the used index */
309
    if (order && (need_sort || used_key_is_modified))
310
    {
311
      /*
327.2.3 by Brian Aker
Refactoring of class Table
312
	Doing an order_st BY;  Let filesort find and sort the rows we are going
1 by brian
clean slate
313
	to update
314
        NOTE: filesort will call table->prepare_for_position()
315
      */
482 by Brian Aker
Remove uint.
316
      uint32_t         length= 0;
1711.6.1 by Brian Aker
Style on structure cleanup
317
      SortField  *sortorder;
1 by brian
clean slate
318
      ha_rows examined_rows;
1905.1.1 by Brian Aker
Adding FileSort class.
319
      FileSort filesort(*session);
1 by brian
clean slate
320
1905.1.1 by Brian Aker
Adding FileSort class.
321
      table->sort.io_cache= new internal::IO_CACHE;
641.3.8 by Monty Taylor
Removed my_malloc from drizzled.
322
1 by brian
clean slate
323
      if (!(sortorder=make_unireg_sortorder(order, &length, NULL)) ||
1905.1.1 by Brian Aker
Adding FileSort class.
324
	  (table->sort.found_records= filesort.run(table, sortorder, length,
325
						   select, limit, 1,
1908.1.1 by Brian Aker
Merge in encapsulations in filesort.
326
						   examined_rows)) == HA_POS_ERROR)
1 by brian
clean slate
327
      {
328
	goto err;
329
      }
330
      /*
331
	Filesort has already found and selected the rows we want to update,
332
	so we don't need the where clause
333
      */
2172.3.22 by Brian Aker
This patch adds safe_delete(). All of these locations in the code should be
334
      safe_delete(select);
1 by brian
clean slate
335
    }
336
    else
337
    {
338
      /*
339
	We are doing a search on a key that is updated. In this case
340
	we go trough the matching rows, save a pointer to them and
341
	update these in a separate loop based on the pointer.
342
      */
343
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
344
      internal::IO_CACHE tempfile;
1909.1.2 by Brian Aker
Additional io_cache encapsulation.
345
      if (tempfile.open_cached_file(drizzle_tmpdir.c_str(),TEMP_PREFIX, DISK_BUFFER_SIZE, MYF(MY_WME)))
346
      {
1 by brian
clean slate
347
	goto err;
1909.1.2 by Brian Aker
Additional io_cache encapsulation.
348
      }
1 by brian
clean slate
349
350
      /* If quick select is used, initialize it before retrieving rows. */
351
      if (select && select->quick && select->quick->reset())
352
        goto err;
1208.3.2 by brian
Update for Cursor renaming.
353
      table->cursor->try_semi_consistent_read(1);
1 by brian
clean slate
354
355
      /*
356
        When we get here, we have one of the following options:
357
        A. used_index == MAX_KEY
358
           This means we should use full table scan, and start it with
359
           init_read_record call
360
        B. used_index != MAX_KEY
361
           B.1 quick select is used, start the scan with init_read_record
362
           B.2 quick select is not used, this is full index scan (with LIMIT)
363
               Full index scan must be started with init_read_record_idx
364
      */
365
366
      if (used_index == MAX_KEY || (select && select->quick))
1538 by Brian Aker
Code shuffle on ReadRecord
367
      {
2049.2.1 by Stewart Smith
doStartTableScan() result not checked.
368
        if ((error= info.init_read_record(session, table, select, 0, true)))
369
          goto err;
1538 by Brian Aker
Code shuffle on ReadRecord
370
      }
1 by brian
clean slate
371
      else
1538 by Brian Aker
Code shuffle on ReadRecord
372
      {
2049.2.8 by Stewart Smith
init_read_record_idx return result should be checked now that it checks startIndexScan result. Fix case in sql_update
373
        if ((error= info.init_read_record_idx(session, table, 1, used_index)))
374
          goto err;
1538 by Brian Aker
Code shuffle on ReadRecord
375
      }
1 by brian
clean slate
376
520.1.22 by Brian Aker
Second pass of thd cleanup
377
      session->set_proc_info("Searching rows for update");
1 by brian
clean slate
378
      ha_rows tmp_limit= limit;
379
1910.2.8 by Brian Aker
Enapsulate Kill.
380
      while (not(error= info.read_record(&info)) && not session->getKilled())
1 by brian
clean slate
381
      {
382
	if (!(select && select->skip_record()))
383
	{
1208.3.2 by brian
Update for Cursor renaming.
384
          if (table->cursor->was_semi_consistent_read())
1 by brian
clean slate
385
	    continue;  /* repeat the read of the same row if it still exists */
386
1672.3.6 by Brian Aker
First pass in encapsulating row
387
	  table->cursor->position(table->getInsertRecord());
1208.3.2 by brian
Update for Cursor renaming.
388
	  if (my_b_write(&tempfile,table->cursor->ref,
389
			 table->cursor->ref_length))
1 by brian
clean slate
390
	  {
971.6.11 by Eric Day
Removed purecov messages.
391
	    error=1;
392
	    break;
1 by brian
clean slate
393
	  }
394
	  if (!--limit && using_limit)
395
	  {
396
	    error= -1;
397
	    break;
398
	  }
399
	}
400
	else
1208.3.2 by brian
Update for Cursor renaming.
401
	  table->cursor->unlock_row();
1 by brian
clean slate
402
      }
1910.2.8 by Brian Aker
Enapsulate Kill.
403
      if (session->getKilled() && not error)
1 by brian
clean slate
404
	error= 1;				// Aborted
405
      limit= tmp_limit;
1208.3.2 by brian
Update for Cursor renaming.
406
      table->cursor->try_semi_consistent_read(0);
1538 by Brian Aker
Code shuffle on ReadRecord
407
      info.end_read_record();
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
408
1 by brian
clean slate
409
      /* Change select to use tempfile */
410
      if (select)
411
      {
2172.3.22 by Brian Aker
This patch adds safe_delete(). All of these locations in the code should be
412
	safe_delete(select->quick);
1 by brian
clean slate
413
	if (select->free_cond)
414
	  delete select->cond;
415
	select->cond=0;
416
      }
417
      else
418
      {
2047.1.1 by Andrew Hutchings
Refix using placement new for join code, vector for join cache buffer.
419
	select= new optimizer::SqlSelect();
1 by brian
clean slate
420
	select->head=table;
421
      }
1909.1.1 by Brian Aker
Encapsulation of IO_CACHE.
422
      if (tempfile.reinit_io_cache(internal::READ_CACHE,0L,0,0))
971.6.11 by Eric Day
Removed purecov messages.
423
	error=1;
1241.9.48 by Monty Taylor
Made one of the drizzled instances of IO_CACHE a pointer.
424
      // Read row ptrs from this cursor
425
      memcpy(select->file, &tempfile, sizeof(tempfile));
1 by brian
clean slate
426
      if (error >= 0)
427
	goto err;
428
    }
429
    if (table->key_read)
430
      table->restore_column_maps_after_mark_index();
431
  }
432
433
  if (ignore)
1208.3.2 by brian
Update for Cursor renaming.
434
    table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
435
1 by brian
clean slate
436
  if (select && select->quick && select->quick->reset())
437
    goto err;
1208.3.2 by brian
Update for Cursor renaming.
438
  table->cursor->try_semi_consistent_read(1);
2049.2.1 by Stewart Smith
doStartTableScan() result not checked.
439
  if ((error= info.init_read_record(session, table, select, 0, true)))
440
  {
441
    goto err;
442
  }
1 by brian
clean slate
443
444
  updated= found= 0;
685.4.1 by Jay Pipes
Enabled the null.test.
445
  /*
446
   * Per the SQL standard, inserting NULL into a NOT NULL
447
   * field requires an error to be thrown.
448
   *
449
   * @NOTE
450
   *
451
   * NULL check and handling occurs in field_conv.cc
452
   */
453
  session->count_cuted_fields= CHECK_FIELD_ERROR_FOR_NULL;
454
  session->cuted_fields= 0L;
520.1.22 by Brian Aker
Second pass of thd cleanup
455
  session->set_proc_info("Updating");
1 by brian
clean slate
456
1208.3.2 by brian
Update for Cursor renaming.
457
  transactional_table= table->cursor->has_transactions();
2114.5.1 by Brian Aker
Additional abstract around time (this also makes the abort_on_warnings in
458
  session->setAbortOnWarning(test(!ignore));
1 by brian
clean slate
459
460
  /*
461
    Assure that we can use position()
462
    if we need to create an error message.
463
  */
1233.1.4 by Brian Aker
Added:
464
  if (table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ))
1 by brian
clean slate
465
    table->prepare_for_position();
466
1910.2.8 by Brian Aker
Enapsulate Kill.
467
  while (not (error=info.read_record(&info)) && not session->getKilled())
1 by brian
clean slate
468
  {
1910.2.8 by Brian Aker
Enapsulate Kill.
469
    if (not (select && select->skip_record()))
1 by brian
clean slate
470
    {
1208.3.2 by brian
Update for Cursor renaming.
471
      if (table->cursor->was_semi_consistent_read())
1 by brian
clean slate
472
        continue;  /* repeat the read of the same row if it still exists */
473
997.5.1 by chris
Replace macros around unireg.h, store_record,restore_record,cmp_record,empty_record
474
      table->storeRecord();
1235.1.11 by Brian Aker
Small cleanups, did in MERGE table only engine flag.
475
      if (fill_record(session, fields, values))
971.6.11 by Eric Day
Removed purecov messages.
476
        break;
1 by brian
clean slate
477
478
      found++;
479
1819.9.151 by Martin Hansson, Stewart Smith
Merge Revision revid:martin.hansson@oracle.com-20101007081311-zb72jgqjx2rs831z from MySQL InnoDB
480
      if (! table->records_are_comparable() || table->compare_records())
1 by brian
clean slate
481
      {
1235.1.9 by Brian Aker
Remove code around update batch handler (we have no engines supporting
482
        /* Non-batched update */
1672.3.6 by Brian Aker
First pass in encapsulating row
483
        error= table->cursor->updateRecord(table->getUpdateRecord(),
484
                                            table->getInsertRecord());
1552.1.3 by Brian Aker
Fixes the assertion bug on handling of auto increment (sort of worthless,
485
486
        table->auto_increment_field_not_null= false;
487
1 by brian
clean slate
488
        if (!error || error == HA_ERR_RECORD_IS_THE_SAME)
1861.6.1 by David Shrewsbury
Add method to undo adding records to a Statement message in case of multi-row statement failure.
489
        {
1 by brian
clean slate
490
          if (error != HA_ERR_RECORD_IS_THE_SAME)
491
            updated++;
492
          else
493
            error= 0;
1861.6.1 by David Shrewsbury
Add method to undo adding records to a Statement message in case of multi-row statement failure.
494
        }
495
        else if (! ignore ||
1208.3.2 by brian
Update for Cursor renaming.
496
                 table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
1861.6.1 by David Shrewsbury
Add method to undo adding records to a Statement message in case of multi-row statement failure.
497
        {
1 by brian
clean slate
498
          /*
499
            If (ignore && error is ignorable) we don't have to
500
            do anything; otherwise...
501
          */
502
          myf flags= 0;
503
1208.3.2 by brian
Update for Cursor renaming.
504
          if (table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
1 by brian
clean slate
505
            flags|= ME_FATALERROR; /* Other handler errors are fatal */
506
507
          prepare_record_for_error_message(error, table);
1861.6.1 by David Shrewsbury
Add method to undo adding records to a Statement message in case of multi-row statement failure.
508
          table->print_error(error,MYF(flags));
509
          error= 1;
510
          break;
511
        }
1 by brian
clean slate
512
      }
513
514
      if (!--limit && using_limit)
515
      {
1235.1.9 by Brian Aker
Remove code around update batch handler (we have no engines supporting
516
        error= -1;				// Simulate end of cursor
517
        break;
1 by brian
clean slate
518
      }
519
    }
520
    else
1208.3.2 by brian
Update for Cursor renaming.
521
      table->cursor->unlock_row();
520.1.22 by Brian Aker
Second pass of thd cleanup
522
    session->row_count++;
1 by brian
clean slate
523
  }
524
  dup_key_found= 0;
525
  /*
526
    Caching the killed status to pass as the arg to query event constuctor;
527
    The cached value can not change whereas the killed status can
528
    (externally) since this point and change of the latter won't affect
529
    binlogging.
51.2.2 by Patrick Galbraith
Removed DBUGs from
530
    It's assumed that if an error was set in combination with an effective
1 by brian
clean slate
531
    killed status then the error is due to killing.
532
  */
1910.2.8 by Brian Aker
Enapsulate Kill.
533
  killed_status= session->getKilled(); // get the status of the volatile
1 by brian
clean slate
534
  // simulated killing after the loop must be ineffective for binlogging
520.1.21 by Brian Aker
THD -> Session rename
535
  error= (killed_status == Session::NOT_KILLED)?  error : 1;
51.2.2 by Patrick Galbraith
Removed DBUGs from
536
1235.1.9 by Brian Aker
Remove code around update batch handler (we have no engines supporting
537
  updated-= dup_key_found;
1208.3.2 by brian
Update for Cursor renaming.
538
  table->cursor->try_semi_consistent_read(0);
1 by brian
clean slate
539
540
  if (!transactional_table && updated > 0)
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
541
    session->transaction.stmt.markModifiedNonTransData();
1 by brian
clean slate
542
1538 by Brian Aker
Code shuffle on ReadRecord
543
  info.end_read_record();
1 by brian
clean slate
544
  delete select;
520.1.22 by Brian Aker
Second pass of thd cleanup
545
  session->set_proc_info("end");
1208.3.2 by brian
Update for Cursor renaming.
546
  table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1 by brian
clean slate
547
548
  /*
549
    error < 0 means really no error at all: we processed all rows until the
550
    last one without error. error > 0 means an error (e.g. unique key
551
    violation and no IGNORE or REPLACE). error == 0 is also an error (if
552
    preparing the record or invoking before triggers fails). See
1405.3.5 by Jay Pipes
TransactionServices method names now meet code style guidelines.
553
    autocommitOrRollback(error>=0) and return(error>=0) below.
1 by brian
clean slate
554
    Sometimes we want to binlog even if we updated no rows, in case user used
555
    it to be sure master and slave are in same state.
556
  */
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
557
  if ((error < 0) || session->transaction.stmt.hasModifiedNonTransData())
1 by brian
clean slate
558
  {
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
559
    if (session->transaction.stmt.hasModifiedNonTransData())
560
      session->transaction.all.markModifiedNonTransData();
1 by brian
clean slate
561
  }
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
562
  assert(transactional_table || !updated || session->transaction.stmt.hasModifiedNonTransData());
520.1.22 by Brian Aker
Second pass of thd cleanup
563
  free_underlaid_joins(session, select_lex);
1 by brian
clean slate
564
565
  /* If LAST_INSERT_ID(X) was used, report X */
520.1.22 by Brian Aker
Second pass of thd cleanup
566
  id= session->arg_of_last_insert_id_function ?
567
    session->first_successful_insert_id_in_prev_stmt : 0;
1 by brian
clean slate
568
569
  if (error < 0)
570
  {
571
    char buff[STRING_BUFFER_USUAL_SIZE];
1366.1.12 by Siddharth Prakash Singh
more sprintf->snprintf
572
    snprintf(buff, sizeof(buff), ER(ER_UPDATE_INFO), (ulong) found, (ulong) updated,
520.1.22 by Brian Aker
Second pass of thd cleanup
573
	    (ulong) session->cuted_fields);
971.3.59 by Eric Day
Removed client_capabilities from session and pushed functionality into protocol plugin.
574
    session->row_count_func= updated;
1124.2.14 by Diego Medina
* On certain UPDATE and DELETE statements, drizzled failed an assert() in
575
    /**
576
     * Resetting the Diagnostic area to prevent
577
     * lp bug# 439719
578
     */
579
    session->main_da.reset_diagnostics_area();
2148.5.2 by Brian Aker
Additional remove of current_session.
580
    session->my_ok((ulong) session->rowCount(), found, id, buff);
581
    session->status_var.updated_row_count+= session->rowCount();
1 by brian
clean slate
582
  }
1633.4.8 by Brian Aker
Update for count_cuted_fields.
583
  session->count_cuted_fields= CHECK_FIELD_ERROR_FOR_NULL;		/* calc cuted fields */
2114.5.1 by Brian Aker
Additional abstract around time (this also makes the abort_on_warnings in
584
  session->setAbortOnWarning(false);
1126.10.25 by Padraig O'Sullivan
Updated calls to some dtrace probes to cast the parameter to const char *
585
  DRIZZLE_UPDATE_DONE((error >= 0 || session->is_error()), found, updated);
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
586
  return ((error >= 0 || session->is_error()) ? 1 : 0);
1 by brian
clean slate
587
588
err:
2049.2.1 by Stewart Smith
doStartTableScan() result not checked.
589
  if (error != 0)
590
    table->print_error(error,MYF(0));
591
1 by brian
clean slate
592
  delete select;
520.1.22 by Brian Aker
Second pass of thd cleanup
593
  free_underlaid_joins(session, select_lex);
1 by brian
clean slate
594
  if (table->key_read)
595
  {
596
    table->key_read=0;
1208.3.2 by brian
Update for Cursor renaming.
597
    table->cursor->extra(HA_EXTRA_NO_KEYREAD);
1 by brian
clean slate
598
  }
2114.5.1 by Brian Aker
Additional abstract around time (this also makes the abort_on_warnings in
599
  session->setAbortOnWarning(false);
1 by brian
clean slate
600
1126.10.17 by Padraig O'Sullivan
Added calls to the update related dtrace probes.
601
  DRIZZLE_UPDATE_DONE(1, 0, 0);
602
  return 1;
1 by brian
clean slate
603
}
604
605
/*
606
  Prepare items in UPDATE statement
607
608
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
609
    prepare_update()
520.1.22 by Brian Aker
Second pass of thd cleanup
610
    session			- thread handler
1 by brian
clean slate
611
    table_list		- global/local table list
612
    conds		- conditions
1273.2.8 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in sql_update.cc
613
    order_num		- number of ORDER BY list entries
614
    order		- ORDER BY clause list
1 by brian
clean slate
615
616
  RETURN VALUE
56 by brian
Next pass of true/false update.
617
    false OK
618
    true  error
1 by brian
clean slate
619
*/
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
620
bool prepare_update(Session *session, TableList *table_list,
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
621
			 Item **conds, uint32_t order_num, Order *order)
1 by brian
clean slate
622
{
623
  List<Item> all_fields;
2187.2.2 by Brian Aker
getLex() usage and fix for table_name creation during admin commands.
624
  Select_Lex *select_lex= &session->getLex()->select_lex;
1 by brian
clean slate
625
2187.2.2 by Brian Aker
getLex() usage and fix for table_name creation during admin commands.
626
  session->getLex()->allow_sum_func= 0;
1 by brian
clean slate
627
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
628
  if (setup_tables_and_check_access(session, &select_lex->context,
1 by brian
clean slate
629
                                    &select_lex->top_join_list,
630
                                    table_list,
631
                                    &select_lex->leaf_tables,
632
                                    false) ||
1109.1.5 by Brian Aker
More extraction from sql_base
633
      session->setup_conds(table_list, conds) ||
520.1.22 by Brian Aker
Second pass of thd cleanup
634
      select_lex->setup_ref_array(session, order_num) ||
635
      setup_order(session, select_lex->ref_pointer_array,
1 by brian
clean slate
636
		  table_list, all_fields, all_fields, order))
836 by Brian Aker
Fixed session call from function to method.
637
    return true;
1 by brian
clean slate
638
639
  /* Check that we are not using table that we are updating in a sub select */
640
  {
327.2.4 by Brian Aker
Refactoring table.h
641
    TableList *duplicate;
1220.1.13 by Brian Aker
Remove mysql_lock_have_duplicate() (we don't have merge, and our partition
642
    if ((duplicate= unique_table(table_list, table_list->next_global)))
1 by brian
clean slate
643
    {
1874.1.2 by Brian Aker
Encapsulate table_name from table_list.
644
      my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->getTableName());
836 by Brian Aker
Fixed session call from function to method.
645
      return true;
1 by brian
clean slate
646
    }
647
  }
177.1.1 by brian
Removed dead code around prep.
648
836 by Brian Aker
Fixed session call from function to method.
649
  return false;
1 by brian
clean slate
650
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
651
652
} /* namespace drizzled */