~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000 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
  Delete of records and truncate of tables.
18
19
  Multi-table deletes were introduced by Monty and Sinisa
20
*/
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
21
#include <config.h>
22
#include <drizzled/sql_select.h>
23
#include <drizzled/error.h>
24
#include <drizzled/probes.h>
25
#include <drizzled/sql_parse.h>
26
#include <drizzled/sql_base.h>
27
#include <drizzled/lock.h>
28
#include <drizzled/probes.h>
29
#include <drizzled/optimizer/range.h>
30
#include <drizzled/records.h>
31
#include <drizzled/internal/iocache.h>
32
#include <drizzled/transaction_services.h>
33
#include <drizzled/filesort.h>
1 by brian
clean slate
34
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
35
namespace drizzled
36
{
1130.1.4 by Monty Taylor
Moved StorageEngine into plugin namespace.
37
1 by brian
clean slate
38
/**
39
  Implement DELETE SQL word.
40
41
  @note Like implementations of other DDL/DML in MySQL, this function
42
  relies on the caller to close the thread tables. This is done in the
43
  end of dispatch_command().
44
*/
45
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
46
bool delete_query(Session *session, TableList *table_list, COND *conds,
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
47
                  SQL_LIST *order, ha_rows limit, uint64_t,
1 by brian
clean slate
48
                  bool reset_auto_increment)
49
{
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
50
  int		error;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
51
  Table		*table;
1237.13.3 by Padraig O'Sullivan
Performed numerous style cleanups in range.[cc,h].
52
  optimizer::SqlSelect *select= NULL;
1538 by Brian Aker
Code shuffle on ReadRecord
53
  ReadRecord	info;
1 by brian
clean slate
54
  bool          using_limit=limit != HA_POS_ERROR;
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
55
  bool		transactional_table, const_cond;
1 by brian
clean slate
56
  bool          const_cond_result;
57
  ha_rows	deleted= 0;
482 by Brian Aker
Remove uint.
58
  uint32_t usable_index= MAX_KEY;
846 by Brian Aker
Removing on typedeffed class.
59
  Select_Lex   *select_lex= &session->lex->select_lex;
1910.2.8 by Brian Aker
Enapsulate Kill.
60
  Session::killed_state_t killed_status= Session::NOT_KILLED;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
61
1109.1.3 by Brian Aker
Move names around a bit (to align similar methods)
62
  if (session->openTablesLock(table_list))
1126.10.7 by Padraig O'Sullivan
Added calls to the dtrace delete begin/end probes.
63
  {
64
    DRIZZLE_DELETE_DONE(1, 0);
1109.1.2 by Brian Aker
More from the table patch
65
    return true;
1126.10.7 by Padraig O'Sullivan
Added calls to the dtrace delete begin/end probes.
66
  }
737 by Brian Aker
Updates for dead code removal (and forced assert() in delete).
67
68
  table= table_list->table;
69
  assert(table);
70
520.1.22 by Brian Aker
Second pass of thd cleanup
71
  session->set_proc_info("init");
1 by brian
clean slate
72
  table->map=1;
73
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
74
  if (prepare_delete(session, table_list, &conds))
1864.3.21 by Brian Aker
sql_delete removal of goto
75
  {
76
    DRIZZLE_DELETE_DONE(1, 0);
77
    return true;
78
  }
1 by brian
clean slate
79
80
  /* check ORDER BY even if it can be ignored */
81
  if (order && order->elements)
82
  {
327.2.4 by Brian Aker
Refactoring table.h
83
    TableList   tables;
1 by brian
clean slate
84
    List<Item>   fields;
85
    List<Item>   all_fields;
86
87
    tables.table = table;
88
    tables.alias = table_list->alias;
89
520.1.22 by Brian Aker
Second pass of thd cleanup
90
      if (select_lex->setup_ref_array(session, order->elements) ||
91
	  setup_order(session, select_lex->ref_pointer_array, &tables,
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
92
                    fields, all_fields, (Order*) order->first))
1864.3.21 by Brian Aker
sql_delete removal of goto
93
      {
94
        delete select;
95
        free_underlaid_joins(session, &session->lex->select_lex);
96
        DRIZZLE_DELETE_DONE(1, 0);
97
98
        return true;
99
      }
1 by brian
clean slate
100
  }
101
102
  const_cond= (!conds || conds->const_item());
103
520.1.22 by Brian Aker
Second pass of thd cleanup
104
  select_lex->no_error= session->lex->ignore;
1 by brian
clean slate
105
106
  const_cond_result= const_cond && (!conds || conds->val_int());
520.1.22 by Brian Aker
Second pass of thd cleanup
107
  if (session->is_error())
1 by brian
clean slate
108
  {
109
    /* Error evaluating val_int(). */
163 by Brian Aker
Merge Monty's code.
110
    return(true);
1 by brian
clean slate
111
  }
112
113
  /*
114
    Test if the user wants to delete all rows and deletion doesn't have
115
    any side-effects (because of triggers), so we can use optimized
116
    handler::delete_all_rows() method.
117
118
    We implement fast TRUNCATE for InnoDB even if triggers are
119
    present.  TRUNCATE ignores triggers.
120
121
    We can use delete_all_rows() if and only if:
122
    - We allow new functions (not using option --skip-new), and are
123
      not in safe mode (not using option --safe-mode)
124
    - There is no limit clause
125
    - The condition is constant
126
    - If there is a condition, then it it produces a non-zero value
127
    - If the current command is DELETE FROM with no where clause
128
      (i.e., not TRUNCATE) then:
129
      - We should not be binlogging this statement row-based, and
130
      - there should be no delete triggers associated with the table.
131
  */
581 by Brian Aker
Second pass through on replication row patch
132
  if (!using_limit && const_cond_result)
1 by brian
clean slate
133
  {
1208.3.2 by brian
Update for Cursor renaming.
134
    /* Update the table->cursor->stats.records number */
135
    table->cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
136
    ha_rows const maybe_deleted= table->cursor->stats.records;
137
    if (!(error=table->cursor->ha_delete_all_rows()))
1 by brian
clean slate
138
    {
139
      error= -1;				// ok
140
      deleted= maybe_deleted;
141
      goto cleanup;
142
    }
143
    if (error != HA_ERR_WRONG_COMMAND)
144
    {
1216.1.1 by Brian Aker
Move print_error up to Engine.
145
      table->print_error(error,MYF(0));
1 by brian
clean slate
146
      error=0;
147
      goto cleanup;
148
    }
149
    /* Handler didn't support fast delete; Delete rows one by one */
150
  }
151
  if (conds)
152
  {
153
    Item::cond_result result;
520.1.22 by Brian Aker
Second pass of thd cleanup
154
    conds= remove_eq_conds(session, conds, &result);
1 by brian
clean slate
155
    if (result == Item::COND_FALSE)             // Impossible where
156
      limit= 0;
157
  }
158
1208.3.2 by brian
Update for Cursor renaming.
159
  /* Update the table->cursor->stats.records number */
160
  table->cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
1 by brian
clean slate
161
1005.2.6 by Monty Taylor
Re-added bitset<> as a replacement for Bitmap<>
162
  table->covering_keys.reset();
163
  table->quick_keys.reset();		// Can't use 'only index'
1237.9.2 by Padraig O'Sullivan
Moved opt_range.[cc,h] into the optimizer directory and namespace and renamed the files to
164
  select= optimizer::make_select(table, 0, 0, conds, 0, &error);
1 by brian
clean slate
165
  if (error)
1864.3.21 by Brian Aker
sql_delete removal of goto
166
  {
167
    DRIZZLE_DELETE_DONE(1, 0);
168
    return true;
169
  }
170
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
171
  if ((select && select->check_quick(session, false, limit)) || !limit)
1 by brian
clean slate
172
  {
173
    delete select;
520.1.22 by Brian Aker
Second pass of thd cleanup
174
    free_underlaid_joins(session, select_lex);
175
    session->row_count_func= 0;
2062.4.1 by Andrew Hutchings
Backport http://bugs.mysql.com/bug.php?id=40113
176
    if (session->is_error())
177
      return true;
1126.10.18 by Padraig O'Sullivan
Various small build fixes for when dtrace is enabled.
178
    DRIZZLE_DELETE_DONE(0, 0);
1124.2.14 by Diego Medina
* On certain UPDATE and DELETE statements, drizzled failed an assert() in
179
    /**
180
     * Resetting the Diagnostic area to prevent
181
     * lp bug# 439719
182
     */
183
    session->main_da.reset_diagnostics_area();
2148.5.2 by Brian Aker
Additional remove of current_session.
184
    session->my_ok((ha_rows) session->rowCount());
1 by brian
clean slate
185
    /*
186
      We don't need to call reset_auto_increment in this case, because
187
      mysql_truncate always gives a NULL conds argument, hence we never
188
      get here.
189
    */
1126.10.7 by Padraig O'Sullivan
Added calls to the dtrace delete begin/end probes.
190
    return 0; // Nothing to delete
1 by brian
clean slate
191
  }
192
193
  /* 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<>
194
  if (table->quick_keys.none())
1 by brian
clean slate
195
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
196
    session->server_status|=SERVER_QUERY_NO_INDEX_USED;
1 by brian
clean slate
197
  }
198
199
  if (order && order->elements)
200
  {
482 by Brian Aker
Remove uint.
201
    uint32_t         length= 0;
1711.6.1 by Brian Aker
Style on structure cleanup
202
    SortField  *sortorder;
1 by brian
clean slate
203
    ha_rows examined_rows;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
204
1005.2.6 by Monty Taylor
Re-added bitset<> as a replacement for Bitmap<>
205
    if ((!select || table->quick_keys.none()) && limit != HA_POS_ERROR)
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
206
      usable_index= optimizer::get_index_for_order(table, (Order*)(order->first), limit);
1 by brian
clean slate
207
208
    if (usable_index == MAX_KEY)
209
    {
1905.1.1 by Brian Aker
Adding FileSort class.
210
      FileSort filesort(*session);
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
211
      table->sort.io_cache= new internal::IO_CACHE;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
212
213
1905.1.1 by Brian Aker
Adding FileSort class.
214
      if (not (sortorder= make_unireg_sortorder((Order*) order->first, &length, NULL)) ||
215
	  (table->sort.found_records = filesort.run(table, sortorder, length,
216
						    select, HA_POS_ERROR, 1,
1908.1.1 by Brian Aker
Merge in encapsulations in filesort.
217
						    examined_rows)) == HA_POS_ERROR)
1 by brian
clean slate
218
      {
219
        delete select;
520.1.22 by Brian Aker
Second pass of thd cleanup
220
        free_underlaid_joins(session, &session->lex->select_lex);
1864.3.21 by Brian Aker
sql_delete removal of goto
221
222
        DRIZZLE_DELETE_DONE(1, 0);
223
        return true;
1 by brian
clean slate
224
      }
225
      /*
226
        Filesort has already found and selected the rows we want to delete,
227
        so we don't need the where clause
228
      */
229
      delete select;
520.1.22 by Brian Aker
Second pass of thd cleanup
230
      free_underlaid_joins(session, select_lex);
1 by brian
clean slate
231
      select= 0;
232
    }
233
  }
234
235
  /* If quick select is used, initialize it before retrieving rows. */
236
  if (select && select->quick && select->quick->reset())
237
  {
238
    delete select;
520.1.22 by Brian Aker
Second pass of thd cleanup
239
    free_underlaid_joins(session, select_lex);
1864.3.21 by Brian Aker
sql_delete removal of goto
240
    DRIZZLE_DELETE_DONE(1, 0);
241
    return true;
1 by brian
clean slate
242
  }
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
243
1 by brian
clean slate
244
  if (usable_index==MAX_KEY)
1538 by Brian Aker
Code shuffle on ReadRecord
245
  {
2049.2.1 by Stewart Smith
doStartTableScan() result not checked.
246
    if ((error= info.init_read_record(session,table,select,1,1)))
247
    {
248
      table->print_error(error, MYF(0));
249
      delete select;
250
      free_underlaid_joins(session, select_lex);
251
      return true;
252
    }
1538 by Brian Aker
Code shuffle on ReadRecord
253
  }
1 by brian
clean slate
254
  else
1538 by Brian Aker
Code shuffle on ReadRecord
255
  {
2049.2.7 by Stewart Smith
init_read_record_idx return result should be checked now that it checks startIndexScan result.
256
    if ((error= info.init_read_record_idx(session, table, 1, usable_index)))
257
    {
258
      table->print_error(error, MYF(0));
259
      delete select;
260
      free_underlaid_joins(session, select_lex);
261
      return true;
262
    }
1538 by Brian Aker
Code shuffle on ReadRecord
263
  }
1 by brian
clean slate
264
520.1.22 by Brian Aker
Second pass of thd cleanup
265
  session->set_proc_info("updating");
1 by brian
clean slate
266
267
  table->mark_columns_needed_for_delete();
268
1910.2.8 by Brian Aker
Enapsulate Kill.
269
  while (!(error=info.read_record(&info)) && !session->getKilled() &&
520.1.22 by Brian Aker
Second pass of thd cleanup
270
	 ! session->is_error())
1 by brian
clean slate
271
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
272
    // session->is_error() is tested to disallow delete row on error
273
    if (!(select && select->skip_record())&& ! session->is_error() )
1 by brian
clean slate
274
    {
1672.3.6 by Brian Aker
First pass in encapsulating row
275
      if (!(error= table->cursor->deleteRecord(table->getInsertRecord())))
1 by brian
clean slate
276
      {
277
	deleted++;
278
	if (!--limit && using_limit)
279
	{
280
	  error= -1;
281
	  break;
282
	}
283
      }
284
      else
285
      {
1216.1.1 by Brian Aker
Move print_error up to Engine.
286
	table->print_error(error,MYF(0));
1 by brian
clean slate
287
	/*
288
	  In < 4.0.14 we set the error number to 0 here, but that
289
	  was not sensible, because then MySQL would not roll back the
290
	  failed DELETE, and also wrote it to the binlog. For MyISAM
291
	  tables a DELETE probably never should fail (?), but for
292
	  InnoDB it can fail in a FOREIGN KEY error or an
293
	  out-of-tablespace error.
294
	*/
295
 	error= 1;
296
	break;
297
      }
298
    }
299
    else
1208.3.2 by brian
Update for Cursor renaming.
300
      table->cursor->unlock_row();  // Row failed selection, release lock on it
1 by brian
clean slate
301
  }
1910.2.8 by Brian Aker
Enapsulate Kill.
302
  killed_status= session->getKilled();
520.1.22 by Brian Aker
Second pass of thd cleanup
303
  if (killed_status != Session::NOT_KILLED || session->is_error())
1 by brian
clean slate
304
    error= 1;					// Aborted
1237.6.1 by Brian Aker
Remove dead bits in parser/whitespace/etc.
305
520.1.22 by Brian Aker
Second pass of thd cleanup
306
  session->set_proc_info("end");
1538 by Brian Aker
Code shuffle on ReadRecord
307
  info.end_read_record();
1 by brian
clean slate
308
1208.2.2 by Brian Aker
Merge Truncate patch. This fixes all of the "half setup" of Truncate. Still
309
cleanup:
310
1 by brian
clean slate
311
  if (reset_auto_increment && (error < 0))
312
  {
313
    /*
314
      We're really doing a truncate and need to reset the table's
315
      auto-increment counter.
316
    */
1208.3.2 by brian
Update for Cursor renaming.
317
    int error2= table->cursor->ha_reset_auto_increment(0);
1 by brian
clean slate
318
319
    if (error2 && (error2 != HA_ERR_WRONG_COMMAND))
320
    {
1216.1.1 by Brian Aker
Move print_error up to Engine.
321
      table->print_error(error2, MYF(0));
1 by brian
clean slate
322
      error= 1;
323
    }
324
  }
325
326
  delete select;
1208.3.2 by brian
Update for Cursor renaming.
327
  transactional_table= table->cursor->has_transactions();
1 by brian
clean slate
328
329
  if (!transactional_table && deleted > 0)
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
330
    session->transaction.stmt.markModifiedNonTransData();
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
331
1 by brian
clean slate
332
  /* See similar binlogging code in sql_update.cc, for comments */
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
333
  if ((error < 0) || session->transaction.stmt.hasModifiedNonTransData())
1 by brian
clean slate
334
  {
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
335
    if (session->transaction.stmt.hasModifiedNonTransData())
336
      session->transaction.all.markModifiedNonTransData();
1 by brian
clean slate
337
  }
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
338
  assert(transactional_table || !deleted || session->transaction.stmt.hasModifiedNonTransData());
520.1.22 by Brian Aker
Second pass of thd cleanup
339
  free_underlaid_joins(session, select_lex);
1 by brian
clean slate
340
1126.10.25 by Padraig O'Sullivan
Updated calls to some dtrace probes to cast the parameter to const char *
341
  DRIZZLE_DELETE_DONE((error >= 0 || session->is_error()), deleted);
520.1.22 by Brian Aker
Second pass of thd cleanup
342
  if (error < 0 || (session->lex->ignore && !session->is_fatal_error))
1 by brian
clean slate
343
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
344
    session->row_count_func= deleted;
1124.2.14 by Diego Medina
* On certain UPDATE and DELETE statements, drizzled failed an assert() in
345
    /**
346
     * Resetting the Diagnostic area to prevent
347
     * lp bug# 439719
348
     */
1124.2.16 by Diego Medina
uncommented a call to reset_diagnostics_area()
349
    session->main_da.reset_diagnostics_area();    
2148.5.2 by Brian Aker
Additional remove of current_session.
350
    session->my_ok((ha_rows) session->rowCount());
1 by brian
clean slate
351
  }
1625.2.2 by Joe Daly
add counter logic for rows sent/received/inserted/updated
352
  session->status_var.deleted_row_count+= deleted;
1864.3.21 by Brian Aker
sql_delete removal of goto
353
1126.10.7 by Padraig O'Sullivan
Added calls to the dtrace delete begin/end probes.
354
  return (error >= 0 || session->is_error());
1 by brian
clean slate
355
}
356
357
358
/*
359
  Prepare items in DELETE statement
360
361
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
362
    prepare_delete()
520.1.22 by Brian Aker
Second pass of thd cleanup
363
    session			- thread handler
1 by brian
clean slate
364
    table_list		- global/local table list
365
    conds		- conditions
366
367
  RETURN VALUE
163 by Brian Aker
Merge Monty's code.
368
    false OK
369
    true  error
1 by brian
clean slate
370
*/
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
371
int prepare_delete(Session *session, TableList *table_list, Item **conds)
1 by brian
clean slate
372
{
846 by Brian Aker
Removing on typedeffed class.
373
  Select_Lex *select_lex= &session->lex->select_lex;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
374
1 by brian
clean slate
375
  List<Item> all_fields;
376
520.1.22 by Brian Aker
Second pass of thd cleanup
377
  session->lex->allow_sum_func= 0;
378
  if (setup_tables_and_check_access(session, &session->lex->select_lex.context,
379
                                    &session->lex->select_lex.top_join_list,
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
380
                                    table_list,
1 by brian
clean slate
381
                                    &select_lex->leaf_tables, false) ||
1109.1.5 by Brian Aker
More extraction from sql_base
382
      session->setup_conds(table_list, conds))
163 by Brian Aker
Merge Monty's code.
383
    return(true);
1 by brian
clean slate
384
  {
327.2.4 by Brian Aker
Refactoring table.h
385
    TableList *duplicate;
1220.1.13 by Brian Aker
Remove mysql_lock_have_duplicate() (we don't have merge, and our partition
386
    if ((duplicate= unique_table(table_list, table_list->next_global)))
1 by brian
clean slate
387
    {
1054.1.9 by Brian Aker
This is a large number of refactors against the Session class for its
388
      my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
163 by Brian Aker
Merge Monty's code.
389
      return(true);
1 by brian
clean slate
390
    }
391
  }
392
393
  if (select_lex->inner_refs_list.elements &&
520.1.22 by Brian Aker
Second pass of thd cleanup
394
    fix_inner_refs(session, all_fields, select_lex, select_lex->ref_pointer_array))
2062.4.1 by Andrew Hutchings
Backport http://bugs.mysql.com/bug.php?id=40113
395
    return(true);
1 by brian
clean slate
396
163 by Brian Aker
Merge Monty's code.
397
  return(false);
1 by brian
clean slate
398
}
399
400
401
/***************************************************************************
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
402
  TRUNCATE Table
1 by brian
clean slate
403
****************************************************************************/
404
405
/*
406
  Optimize delete of all rows by doing a full generate of the table
407
  This will work even if the .ISM and .ISD tables are destroyed
408
*/
409
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
410
bool truncate(Session& session, TableList *table_list)
1 by brian
clean slate
411
{
412
  bool error;
1273.1.2 by Jay Pipes
This patch does not change any algorithms or code paths,
413
  TransactionServices &transaction_services= TransactionServices::singleton();
1208.2.2 by Brian Aker
Merge Truncate patch. This fixes all of the "half setup" of Truncate. Still
414
1183.1.29 by Brian Aker
Clean up interface so that Truncate sets the propper engine when
415
  uint64_t save_options= session.options;
1 by brian
clean slate
416
  table_list->lock_type= TL_WRITE;
1183.1.29 by Brian Aker
Clean up interface so that Truncate sets the propper engine when
417
  session.options&= ~(OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT);
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
418
  init_select(session.lex);
419
  error= delete_query(&session, table_list, (COND*) 0, (SQL_LIST*) 0,
398.1.8 by Monty Taylor
Enabled -Wlong-long.
420
                      HA_POS_ERROR, 0L, true);
1 by brian
clean slate
421
  /*
163 by Brian Aker
Merge Monty's code.
422
    Safety, in case the engine ignored ha_enable_transaction(false)
520.1.22 by Brian Aker
Second pass of thd cleanup
423
    above. Also clears session->transaction.*.
1 by brian
clean slate
424
  */
2096.2.1 by David Shrewsbury
Initial change to use references to Session in TransactionServices methods rather than pointers.
425
  error= transaction_services.autocommitOrRollback(session, error);
1183.1.29 by Brian Aker
Clean up interface so that Truncate sets the propper engine when
426
  session.options= save_options;
427
1208.2.2 by Brian Aker
Merge Truncate patch. This fixes all of the "half setup" of Truncate. Still
428
  return error;
1 by brian
clean slate
429
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
430
431
} /* namespace drizzled */