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>
50 SQL_LIST *order, ha_rows limit, uint64_t,
51 bool reset_auto_increment)
57 bool using_limit=limit != HA_POS_ERROR;
59 uint32_t usable_index= MAX_KEY;
60 Select_Lex *select_lex= &session->lex().select_lex;
61 Session::killed_state_t killed_status= Session::NOT_KILLED;
65 DRIZZLE_DELETE_DONE(1, 0);
69 table= table_list->
table;
75 if (prepare_delete(session, table_list, &conds))
77 DRIZZLE_DELETE_DONE(1, 0);
82 if (order && order->elements)
89 tables.alias = table_list->alias;
91 select_lex->setup_ref_array(session, order->elements);
92 if (
setup_order(session, select_lex->ref_pointer_array, &tables, fields, all_fields, (
Order*) order->first))
96 DRIZZLE_DELETE_DONE(1, 0);
102 bool const_cond= not conds || conds->
const_item();
104 select_lex->no_error= session->lex().ignore;
106 bool const_cond_result= const_cond && (!conds || conds->
val_int());
128 if (!using_limit && const_cond_result)
131 table->
cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
132 ha_rows
const maybe_deleted= table->
cursor->stats.records;
136 deleted= maybe_deleted;
139 if (error != HA_ERR_WRONG_COMMAND)
141 table->print_error(error,MYF(0));
149 Item::cond_result result;
151 if (result == Item::COND_FALSE)
156 table->
cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
158 table->covering_keys.reset();
159 table->quick_keys.reset();
160 select= optimizer::make_select(table, 0, 0, conds, 0, &error);
163 DRIZZLE_DELETE_DONE(1, 0);
167 if ((select && select->check_quick(session,
false, limit)) || !limit)
174 DRIZZLE_DELETE_DONE(0, 0);
180 session->
my_ok((ha_rows) session->rowCount());
190 if (table->quick_keys.none())
192 session->server_status|=SERVER_QUERY_NO_INDEX_USED;
195 if (order && order->elements)
197 if ((!select || table->quick_keys.none()) && limit != HA_POS_ERROR)
198 usable_index= optimizer::get_index_for_order(table, (
Order*)(order->first), limit);
200 if (usable_index == MAX_KEY)
205 SortField* sortorder= make_unireg_sortorder((
Order*) order->first, &length, NULL);
206 ha_rows examined_rows;
207 if ((table->sort.found_records= filesort.
run(table, sortorder, length, select, HA_POS_ERROR, 1, examined_rows)) == HA_POS_ERROR)
212 DRIZZLE_DELETE_DONE(1, 0);
230 DRIZZLE_DELETE_DONE(1, 0);
234 if (usable_index==MAX_KEY)
236 if ((error= info.init_read_record(session,table,select,1,1)))
238 table->print_error(error, MYF(0));
248 table->print_error(error, MYF(0));
257 table->mark_columns_needed_for_delete();
259 while (!(error=info.read_record(&info)) && !session->getKilled() &&
263 if (!(select && select->skip_record())&& ! session->
is_error() )
265 if (!(error= table->
cursor->deleteRecord(table->getInsertRecord())))
268 if (!--limit && using_limit)
276 table->print_error(error,MYF(0));
282 table->
cursor->unlock_row();
284 killed_status= session->getKilled();
285 if (killed_status != Session::NOT_KILLED || session->
is_error())
289 info.end_read_record();
293 if (reset_auto_increment && (error < 0))
301 if (error2 && (error2 != HA_ERR_WRONG_COMMAND))
303 table->print_error(error2, MYF(0));
309 bool transactional_table= table->
cursor->has_transactions();
311 if (!transactional_table && deleted > 0)
322 DRIZZLE_DELETE_DONE((error >= 0 || session->
is_error()), deleted);
323 if (error < 0 || (session->lex().ignore && !session->
is_fatal_error))
331 session->
my_ok((ha_rows) session->rowCount());
333 session->status_var.deleted_row_count+= deleted;
335 return (error >= 0 || session->
is_error());
352 int prepare_delete(Session *session, TableList *table_list, Item **conds)
354 Select_Lex *select_lex= &session->lex().select_lex;
355 session->lex().allow_sum_func= 0;
356 if (setup_tables_and_check_access(session, &session->lex().select_lex.context, &select_lex->top_join_list,
357 table_list, &select_lex->leaf_tables,
false) ||
358 session->setup_conds(table_list, conds))
361 if (unique_table(table_list, table_list->next_global))
363 my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
366 List<Item> all_fields;
367 if (select_lex->inner_refs_list.size() && fix_inner_refs(session, all_fields, select_lex, select_lex->ref_pointer_array))
382 bool truncate(Session& session, TableList *table_list)
384 uint64_t save_options= session.options;
385 table_list->lock_type= TL_WRITE;
386 session.options&= ~(OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT);
387 init_select(&session.lex());
388 int error=
delete_query(&session, table_list, (COND*) 0, (SQL_LIST*) 0, HA_POS_ERROR, 0L,
true);
394 session.options= save_options;