~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_delete.cc

  • Committer: Lee Bieber
  • Date: 2011-03-29 22:31:41 UTC
  • mfrom: (2257.1.3 build)
  • Revision ID: kalebral@gmail.com-20110329223141-yxc22h3l2he58sk0
Merge Andrew - 743842: Build failure using GCC 4.6
Merge Stewart - 738022: CachedDirectory silently fails to add entries if stat() fails
Merge Olaf - Common fwd: add copyright, add more declaration

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
  Multi-table deletes were introduced by Monty and Sinisa
20
20
*/
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"
 
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>
 
34
#include <drizzled/sql_lex.h>
 
35
#include <drizzled/diagnostics_area.h>
 
36
#include <drizzled/statistics_variables.h>
 
37
#include <drizzled/session/transactions.h>
34
38
 
35
 
namespace drizzled
36
 
{
 
39
namespace drizzled {
37
40
 
38
41
/**
39
42
  Implement DELETE SQL word.
43
46
  end of dispatch_command().
44
47
*/
45
48
 
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)
49
52
{
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;
61
64
 
62
65
  if (session->openTablesLock(table_list))
71
74
  session->set_proc_info("init");
72
75
  table->map=1;
73
76
 
74
 
  if (mysql_prepare_delete(session, table_list, &conds))
 
77
  if (prepare_delete(session, table_list, &conds))
75
78
  {
76
79
    DRIZZLE_DELETE_DONE(1, 0);
77
80
    return true;
92
95
                    fields, all_fields, (Order*) order->first))
93
96
      {
94
97
        delete select;
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);
97
100
 
98
101
        return true;
101
104
 
102
105
  const_cond= (!conds || conds->const_item());
103
106
 
104
 
  select_lex->no_error= session->lex->ignore;
 
107
  select_lex->no_error= session->lex().ignore;
105
108
 
106
109
  const_cond_result= const_cond && (!conds || conds->val_int());
107
110
  if (session->is_error())
173
176
    delete select;
174
177
    free_underlaid_joins(session, select_lex);
175
178
    session->row_count_func= 0;
 
179
    if (session->is_error())
 
180
      return true;
176
181
    DRIZZLE_DELETE_DONE(0, 0);
177
182
    /**
178
183
     * Resetting the Diagnostic area to prevent
179
184
     * lp bug# 439719
180
185
     */
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());
183
188
    /*
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)
216
221
      {
217
222
        delete select;
218
 
        free_underlaid_joins(session, &session->lex->select_lex);
 
223
        free_underlaid_joins(session, &session->lex().select_lex);
219
224
 
220
225
        DRIZZLE_DELETE_DONE(1, 0);
221
226
        return true;
241
246
 
242
247
  if (usable_index==MAX_KEY)
243
248
  {
244
 
    info.init_read_record(session,table,select,1,1);
 
249
    if ((error= info.init_read_record(session,table,select,1,1)))
 
250
    {
 
251
      table->print_error(error, MYF(0));
 
252
      delete select;
 
253
      free_underlaid_joins(session, select_lex);
 
254
      return true;
 
255
    }
245
256
  }
246
257
  else
247
258
  {
248
 
    info.init_read_record_idx(session, table, 1, usable_index);
 
259
    if ((error= info.init_read_record_idx(session, table, 1, usable_index)))
 
260
    {
 
261
      table->print_error(error, MYF(0));
 
262
      delete select;
 
263
      free_underlaid_joins(session, select_lex);
 
264
      return true;
 
265
    }
249
266
  }
250
267
 
251
268
  session->set_proc_info("updating");
325
342
  free_underlaid_joins(session, select_lex);
326
343
 
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))
329
346
  {
330
347
    session->row_count_func= deleted;
331
348
    /**
332
349
     * Resetting the Diagnostic area to prevent
333
350
     * lp bug# 439719
334
351
     */
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());
337
354
  }
338
355
  session->status_var.deleted_row_count+= deleted;
339
356
 
345
362
  Prepare items in DELETE statement
346
363
 
347
364
  SYNOPSIS
348
 
    mysql_prepare_delete()
 
365
    prepare_delete()
349
366
    session                     - thread handler
350
367
    table_list          - global/local table list
351
368
    conds               - conditions
354
371
    false OK
355
372
    true  error
356
373
*/
357
 
int mysql_prepare_delete(Session *session, TableList *table_list, Item **conds)
 
374
int prepare_delete(Session *session, TableList *table_list, Item **conds)
358
375
{
359
 
  Select_Lex *select_lex= &session->lex->select_lex;
 
376
  Select_Lex *select_lex= &session->lex().select_lex;
360
377
 
361
378
  List<Item> all_fields;
362
379
 
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,
366
383
                                    table_list,
367
384
                                    &select_lex->leaf_tables, false) ||
368
385
      session->setup_conds(table_list, conds))
376
393
    }
377
394
  }
378
395
 
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))
381
 
    return(-1);
 
398
    return(true);
382
399
 
383
400
  return(false);
384
401
}
393
410
  This will work even if the .ISM and .ISD tables are destroyed
394
411
*/
395
412
 
396
 
bool mysql_truncate(Session& session, TableList *table_list)
 
413
bool truncate(Session& session, TableList *table_list)
397
414
{
398
415
  bool error;
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);
407
424
  /*
408
425
    Safety, in case the engine ignored ha_enable_transaction(false)
409
426
    above. Also clears session->transaction.*.
410
427
  */
411
 
  error= transaction_services.autocommitOrRollback(&session, error);
 
428
  error= transaction_services.autocommitOrRollback(session, error);
412
429
  session.options= save_options;
413
430
 
414
431
  return error;