19
19
Multi-table deletes were introduced by Monty and Sinisa
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"
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>
34
#include <drizzled/sql_lex.h>
35
#include <drizzled/diagnostics_area.h>
36
#include <drizzled/statistics_variables.h>
37
#include <drizzled/session/transactions.h>
39
42
Implement DELETE SQL word.
43
46
end of dispatch_command().
46
bool mysql_delete(Session *session, TableList *table_list, COND *conds,
49
bool delete_query(Session *session, TableList *table_list, COND *conds,
47
50
SQL_LIST *order, ha_rows limit, uint64_t,
48
51
bool reset_auto_increment)
56
59
bool const_cond_result;
57
60
ha_rows deleted= 0;
58
61
uint32_t usable_index= MAX_KEY;
59
Select_Lex *select_lex= &session->lex->select_lex;
62
Select_Lex *select_lex= &session->lex().select_lex;
60
63
Session::killed_state_t killed_status= Session::NOT_KILLED;
62
65
if (session->openTablesLock(table_list))
71
74
session->set_proc_info("init");
74
if (mysql_prepare_delete(session, table_list, &conds))
77
if (prepare_delete(session, table_list, &conds))
76
79
DRIZZLE_DELETE_DONE(1, 0);
92
95
fields, all_fields, (Order*) order->first))
95
free_underlaid_joins(session, &session->lex->select_lex);
98
free_underlaid_joins(session, &session->lex().select_lex);
96
99
DRIZZLE_DELETE_DONE(1, 0);
174
177
free_underlaid_joins(session, select_lex);
175
178
session->row_count_func= 0;
179
if (session->is_error())
176
181
DRIZZLE_DELETE_DONE(0, 0);
178
183
* Resetting the Diagnostic area to prevent
181
session->main_da.reset_diagnostics_area();
182
session->my_ok((ha_rows) session->row_count_func);
186
session->main_da().reset_diagnostics_area();
187
session->my_ok((ha_rows) session->rowCount());
184
189
We don't need to call reset_auto_increment in this case, because
185
190
mysql_truncate always gives a NULL conds argument, hence we never
215
220
examined_rows)) == HA_POS_ERROR)
218
free_underlaid_joins(session, &session->lex->select_lex);
223
free_underlaid_joins(session, &session->lex().select_lex);
220
225
DRIZZLE_DELETE_DONE(1, 0);
242
247
if (usable_index==MAX_KEY)
244
info.init_read_record(session,table,select,1,1);
249
if ((error= info.init_read_record(session,table,select,1,1)))
251
table->print_error(error, MYF(0));
253
free_underlaid_joins(session, select_lex);
248
info.init_read_record_idx(session, table, 1, usable_index);
259
if ((error= info.init_read_record_idx(session, table, 1, usable_index)))
261
table->print_error(error, MYF(0));
263
free_underlaid_joins(session, select_lex);
251
268
session->set_proc_info("updating");
325
342
free_underlaid_joins(session, select_lex);
327
344
DRIZZLE_DELETE_DONE((error >= 0 || session->is_error()), deleted);
328
if (error < 0 || (session->lex->ignore && !session->is_fatal_error))
345
if (error < 0 || (session->lex().ignore && !session->is_fatal_error))
330
347
session->row_count_func= deleted;
332
349
* Resetting the Diagnostic area to prevent
335
session->main_da.reset_diagnostics_area();
336
session->my_ok((ha_rows) session->row_count_func);
352
session->main_da().reset_diagnostics_area();
353
session->my_ok((ha_rows) session->rowCount());
338
355
session->status_var.deleted_row_count+= deleted;
357
int mysql_prepare_delete(Session *session, TableList *table_list, Item **conds)
374
int prepare_delete(Session *session, TableList *table_list, Item **conds)
359
Select_Lex *select_lex= &session->lex->select_lex;
376
Select_Lex *select_lex= &session->lex().select_lex;
361
378
List<Item> all_fields;
363
session->lex->allow_sum_func= 0;
364
if (setup_tables_and_check_access(session, &session->lex->select_lex.context,
365
&session->lex->select_lex.top_join_list,
380
session->lex().allow_sum_func= 0;
381
if (setup_tables_and_check_access(session, &session->lex().select_lex.context,
382
&session->lex().select_lex.top_join_list,
367
384
&select_lex->leaf_tables, false) ||
368
385
session->setup_conds(table_list, conds))
379
if (select_lex->inner_refs_list.elements &&
396
if (select_lex->inner_refs_list.size() &&
380
397
fix_inner_refs(session, all_fields, select_lex, select_lex->ref_pointer_array))
393
410
This will work even if the .ISM and .ISD tables are destroyed
396
bool mysql_truncate(Session& session, TableList *table_list)
413
bool truncate(Session& session, TableList *table_list)
399
416
TransactionServices &transaction_services= TransactionServices::singleton();
401
418
uint64_t save_options= session.options;
402
419
table_list->lock_type= TL_WRITE;
403
420
session.options&= ~(OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT);
404
mysql_init_select(session.lex);
405
error= mysql_delete(&session, table_list, (COND*) 0, (SQL_LIST*) 0,
421
init_select(&session.lex());
422
error= delete_query(&session, table_list, (COND*) 0, (SQL_LIST*) 0,
406
423
HA_POS_ERROR, 0L, true);
408
425
Safety, in case the engine ignored ha_enable_transaction(false)
409
426
above. Also clears session->transaction.*.
411
error= transaction_services.autocommitOrRollback(&session, error);
428
error= transaction_services.autocommitOrRollback(session, error);
412
429
session.options= save_options;