17
17
/* Insert of records */
22
Drizzle has a different form of DELAYED then MySQL. DELAYED is just
23
a hint to the the sorage engine (which can then do whatever it likes.
19
25
#include <drizzled/server_includes.h>
20
26
#include <drizzled/sql_select.h>
21
#include <drizzled/show.h>
22
#include <drizzled/error.h>
23
#include <drizzled/name_resolution_context_state.h>
24
#include <drizzled/probes.h>
25
#include <drizzled/sql_base.h>
26
#include <drizzled/sql_load.h>
27
#include <drizzled/field/timestamp.h>
28
#include <drizzled/lock.h>
30
using namespace drizzled;
27
#include <drizzled/sql_show.h>
29
#include <drizzled/drizzled_error_messages.h>
31
/* Define to force use of my_malloc() if the allocated memory block is big */
34
#define my_safe_alloca(size, min_length) my_alloca(size)
35
#define my_safe_afree(ptr, size, min_length) my_afree(ptr)
37
#define my_safe_alloca(size, min_length) ((size <= min_length) ? my_alloca(size) : my_malloc(size,MYF(0)))
38
#define my_safe_afree(ptr, size, min_length) if (size > min_length) my_free(ptr,MYF(0))
33
44
Check if insert fields are correct.
36
47
check_insert_fields()
37
session The current thread.
48
thd The current thread.
38
49
table The table for insert.
39
50
fields The insert fields.
40
51
values The insert values.
107
if (check_unique && session->dup_field)
118
if (check_unique && thd->dup_field)
109
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), session->dup_field->field_name);
120
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), thd->dup_field->field_name);
112
123
if (table->timestamp_field) // Don't automaticly set timestamp if used
114
if (table->timestamp_field->isWriteSet())
125
if (bitmap_is_set(table->write_set,
126
table->timestamp_field->field_index))
115
127
clear_timestamp_auto_bits(table->timestamp_field_type,
116
128
TIMESTAMP_AUTO_SET_ON_INSERT);
119
table->setWriteSet(table->timestamp_field->field_index);
131
bitmap_set_bit(table->write_set,
132
table->timestamp_field->field_index);
157
170
Unmark the timestamp field so that we can check if this is modified
160
timestamp_mark= table->write_set->testAndClear(table->timestamp_field->field_index);
173
timestamp_mark= bitmap_test_and_clear(table->write_set,
174
table->timestamp_field->field_index);
163
177
/* Check the fields we are going to modify */
164
if (setup_fields(session, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
178
if (setup_fields(thd, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
167
181
if (table->timestamp_field)
169
183
/* Don't set timestamp column if this is modified. */
170
if (table->timestamp_field->isWriteSet())
184
if (bitmap_is_set(table->write_set,
185
table->timestamp_field->field_index))
171
186
clear_timestamp_auto_bits(table->timestamp_field_type,
172
187
TIMESTAMP_AUTO_SET_ON_UPDATE);
173
188
if (timestamp_mark)
174
table->setWriteSet(table->timestamp_field->field_index);
189
bitmap_set_bit(table->write_set,
190
table->timestamp_field->field_index);
220
236
bool transactional_table, joins_freed= false;
222
uint32_t value_count;
238
bool was_insert_delayed= (table_list->lock_type == TL_WRITE_DELAYED);
223
240
ulong counter = 1;
227
244
List_iterator_fast<List_item> its(values_list);
228
245
List_item *values;
229
246
Name_resolution_context *context;
230
247
Name_resolution_context_state ctx_state;
231
248
thr_lock_type lock_type;
232
249
Item *unused_conds= 0;
236
253
Upgrade lock type if the requested lock is incompatible with
237
254
the current connection mode or table operation.
239
upgrade_lock_type(session, &table_list->lock_type, duplic,
256
upgrade_lock_type(thd, &table_list->lock_type, duplic,
240
257
values_list.elements > 1);
242
if (session->openTablesLock(table_list))
260
We can't write-delayed into a table locked with LOCK TABLES:
261
this will lead to a deadlock, since the delayed thread will
262
never be able to get a lock on the table. QQQ: why not
263
upgrade the lock here instead?
265
if (table_list->lock_type == TL_WRITE_DELAYED && thd->locked_tables &&
266
find_locked_table(thd, table_list->db, table_list->table_name))
244
DRIZZLE_INSERT_DONE(1, 0);
268
my_error(ER_DELAYED_INSERT_TABLE_LOCKED, MYF(0),
269
table_list->table_name);
274
if (open_and_lock_tables(thd, table_list))
248
277
lock_type= table_list->lock_type;
250
session->set_proc_info("init");
251
session->used_tables=0;
279
thd_proc_info(thd, "init");
253
282
value_count= values->elements;
255
if (mysql_prepare_insert(session, table_list, table, fields, values,
284
if (mysql_prepare_insert(thd, table_list, table, fields, values,
256
285
update_fields, update_values, duplic, &unused_conds,
258
287
(fields.elements || !value_count ||
290
319
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
293
if (setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0))
322
if (setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0))
298
327
/* Restore the current context. */
299
328
ctx_state.restore_state(context, table_list);
302
Fill in the given fields and dump it to the table cursor
331
Fill in the given fields and dump it to the table file
304
333
memset(&info, 0, sizeof(info));
305
334
info.ignore= ignore;
312
341
For single line insert, generate an error if try to set a NOT NULL field
315
session->count_cuted_fields= ((values_list.elements == 1 &&
344
thd->count_cuted_fields= ((values_list.elements == 1 &&
317
346
CHECK_FIELD_ERROR_FOR_NULL :
318
347
CHECK_FIELD_WARN);
319
session->cuted_fields = 0L;
348
thd->cuted_fields = 0L;
320
349
table->next_number_field=table->found_next_number_field;
351
#ifdef HAVE_REPLICATION
352
if (thd->slave_thread &&
353
(info.handle_duplicates == DUP_UPDATE) &&
354
(table->next_number_field != NULL) &&
355
rpl_master_has_bug(&active_mi->rli, 24432))
323
session->set_proc_info("update");
360
thd_proc_info(thd, "update");
324
361
if (duplic == DUP_REPLACE)
325
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
362
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
326
363
if (duplic == DUP_UPDATE)
327
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
364
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
329
366
if (duplic != DUP_ERROR || ignore)
330
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
331
table->cursor->ha_start_bulk_insert(values_list.elements);
367
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
368
table->file->ha_start_bulk_insert(values_list.elements);
335
session->abort_on_warning= !ignore;
372
thd->abort_on_warning= !ignore;
337
374
table->mark_columns_needed_for_insert();
341
378
if (fields.elements || !value_count)
343
table->restoreRecordAsDefault(); // Get empty record
344
if (fill_record(session, fields, *values, 0))
380
restore_record(table,s->default_values); // Get empty record
381
if (fill_record(thd, fields, *values, 0))
346
if (values_list.elements != 1 && ! session->is_error())
383
if (values_list.elements != 1 && ! thd->is_error())
352
TODO: set session->abort_on_warning if values_list.elements == 1
389
TODO: set thd->abort_on_warning if values_list.elements == 1
353
390
and check that all items return warning in case of problem with
362
table->restoreRecordAsDefault(); // Get empty record
364
if (fill_record(session, table->field, *values, 0))
366
if (values_list.elements != 1 && ! session->is_error())
399
if (thd->used_tables) // Column used in values()
400
restore_record(table,s->default_values); // Get empty record
404
Fix delete marker. No need to restore rest of record since it will
405
be overwritten by fill_record() anyway (and fill_record() does not
406
use default values in this case).
408
table->record[0][0]= table->s->default_values[0];
410
if (fill_record(thd, table->field, *values, 0))
412
if (values_list.elements != 1 && ! thd->is_error())
394
437
Do not do this release if this is a delayed insert, it would steal
395
auto_inc values from the delayed_insert thread as they share Table.
438
auto_inc values from the delayed_insert thread as they share TABLE.
397
table->cursor->ha_release_auto_increment();
398
if (table->cursor->ha_end_bulk_insert() && !error)
440
table->file->ha_release_auto_increment();
441
if (table->file->ha_end_bulk_insert() && !error)
400
table->print_error(my_errno,MYF(0));
443
table->file->print_error(my_errno,MYF(0));
403
446
if (duplic != DUP_ERROR || ignore)
404
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
406
transactional_table= table->cursor->has_transactions();
408
changed= (info.copied || info.deleted || info.updated);
409
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
411
if (session->transaction.stmt.modified_non_trans_table)
412
session->transaction.all.modified_non_trans_table= true;
414
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
447
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
449
transactional_table= table->file->has_transactions();
451
if ((changed= (info.copied || info.deleted || info.updated)))
454
Invalidate the table in the query cache if something changed.
455
For the transactional algorithm to work the invalidation must be
456
before binlog writing and ha_autocommit_or_rollback
459
if ((changed && error <= 0) || thd->transaction.stmt.modified_non_trans_table || was_insert_delayed)
461
if (mysql_bin_log.is_open())
466
[Guilhem wrote] Temporary errors may have filled
467
thd->net.last_error/errno. For example if there has
468
been a disk full error when writing the row, and it was
469
MyISAM, then thd->net.last_error/errno will be set to
470
"disk full"... and the my_pwrite() will wait until free
471
space appears, and so when it finishes then the
472
write_row() was entirely successful
474
/* todo: consider removing */
479
A query which per-row-loop can not be interrupted with
480
KILLED, like INSERT, and that does not invoke stored
481
routines can be binlogged with neglecting the KILLED error.
483
If there was no error (error == zero) until after the end of
484
inserting loop the KILLED flag that appeared later can be
485
disregarded since previously possible invocation of stored
486
routines did not result in any error due to the KILLED. In
487
such case the flag is ignored for constructing binlog event.
489
assert(thd->killed != THD::KILL_BAD_DATA || error > 0);
490
if (thd->binlog_query(THD::ROW_QUERY_TYPE,
491
thd->query, thd->query_length,
492
transactional_table, false,
493
(error>0) ? thd->killed : THD::NOT_KILLED) &&
499
if (thd->transaction.stmt.modified_non_trans_table)
500
thd->transaction.all.modified_non_trans_table= true;
502
assert(transactional_table || !changed ||
503
thd->transaction.stmt.modified_non_trans_table);
417
session->set_proc_info("end");
506
thd_proc_info(thd, "end");
419
508
We'll report to the client this id:
420
509
- if the table contains an autoincrement column and we successfully
425
514
inserted, the id of the last "inserted" row (if IGNORE, that value may not
426
515
have been really inserted but ignored).
428
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
429
session->first_successful_insert_id_in_cur_stmt :
430
(session->arg_of_last_insert_id_function ?
431
session->first_successful_insert_id_in_prev_stmt :
517
id= (thd->first_successful_insert_id_in_cur_stmt > 0) ?
518
thd->first_successful_insert_id_in_cur_stmt :
519
(thd->arg_of_last_insert_id_function ?
520
thd->first_successful_insert_id_in_prev_stmt :
432
521
((table->next_number_field && info.copied) ?
433
522
table->next_number_field->val_int() : 0));
434
523
table->next_number_field=0;
435
session->count_cuted_fields= CHECK_FIELD_IGNORE;
524
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
436
525
table->auto_increment_field_not_null= false;
437
526
if (duplic == DUP_REPLACE)
438
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
527
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
442
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
443
!session->cuted_fields))
531
if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) ||
445
session->row_count_func= info.copied + info.deleted + info.updated;
446
session->my_ok((ulong) session->row_count_func,
447
info.copied + info.deleted + info.touched, id);
534
thd->row_count_func= info.copied + info.deleted +
535
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
536
info.touched : info.updated);
537
my_ok(thd, (ulong) thd->row_count_func, id);
542
ha_rows updated=((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
543
info.touched : info.updated);
453
545
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
454
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
546
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
456
548
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
457
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
458
session->row_count_func= info.copied + info.deleted + info.updated;
459
session->my_ok((ulong) session->row_count_func,
460
info.copied + info.deleted + info.touched, id, buff);
549
(ulong) (info.deleted + updated), (ulong) thd->cuted_fields);
550
thd->row_count_func= info.copied + info.deleted + updated;
551
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
462
session->abort_on_warning= 0;
463
DRIZZLE_INSERT_DONE(0, session->row_count_func);
553
thd->abort_on_warning= 0;
554
DRIZZLE_INSERT_END();
467
558
if (table != NULL)
468
table->cursor->ha_release_auto_increment();
559
table->file->ha_release_auto_increment();
469
560
if (!joins_freed)
470
free_underlaid_joins(session, &session->lex->select_lex);
471
session->abort_on_warning= 0;
472
DRIZZLE_INSERT_DONE(1, 0);
561
free_underlaid_joins(thd, &thd->lex->select_lex);
562
thd->abort_on_warning= 0;
563
DRIZZLE_INSERT_END();
540
631
You MUST set table->insert_values to 0 after calling this function
541
632
before releasing the table object.
548
bool mysql_prepare_insert(Session *session, TableList *table_list,
549
Table *table, List<Item> &fields, List_item *values,
639
bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
640
TABLE *table, List<Item> &fields, List_item *values,
550
641
List<Item> &update_fields, List<Item> &update_values,
551
642
enum_duplicates duplic,
643
COND **where __attribute__((unused)),
553
644
bool select_insert,
554
645
bool check_fields, bool abort_on_warning)
556
Select_Lex *select_lex= &session->lex->select_lex;
647
SELECT_LEX *select_lex= &thd->lex->select_lex;
557
648
Name_resolution_context *context= &select_lex->context;
558
649
Name_resolution_context_state ctx_state;
559
650
bool insert_into_view= (0 != 0);
561
652
table_map map= 0;
563
654
/* INSERT should have a SELECT or VALUES clause */
564
655
assert (!select_insert || !values);
567
658
For subqueries in VALUES() we should not see the table in which we are
568
659
inserting (for INSERT ... SELECT this is done by changing table_list,
569
because INSERT ... SELECT share Select_Lex it with SELECT.
660
because INSERT ... SELECT share SELECT_LEX it with SELECT.
571
662
if (!select_insert)
573
for (Select_Lex_Unit *un= select_lex->first_inner_unit();
664
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit();
575
666
un= un->next_unit())
577
for (Select_Lex *sl= un->first_select();
668
for (SELECT_LEX *sl= un->first_select();
579
670
sl= sl->next_select())
610
701
table_list->next_local= 0;
611
702
context->resolve_in_table_list_only(table_list);
613
res= check_insert_fields(session, context->table_list, fields, *values,
704
res= check_insert_fields(thd, context->table_list, fields, *values,
614
705
!insert_into_view, &map) ||
615
setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0);
706
setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0);
617
708
if (!res && check_fields)
619
bool saved_abort_on_warning= session->abort_on_warning;
620
session->abort_on_warning= abort_on_warning;
621
res= check_that_all_fields_are_given_values(session,
710
bool saved_abort_on_warning= thd->abort_on_warning;
711
thd->abort_on_warning= abort_on_warning;
712
res= check_that_all_fields_are_given_values(thd,
623
714
context->table_list->table,
624
715
context->table_list);
625
session->abort_on_warning= saved_abort_on_warning;
716
thd->abort_on_warning= saved_abort_on_warning;
628
719
if (!res && duplic == DUP_UPDATE)
630
res= check_update_fields(session, context->table_list, update_fields, &map);
721
res= check_update_fields(thd, context->table_list, update_fields, &map);
633
724
/* Restore the current context. */
634
725
ctx_state.restore_state(context, table_list);
637
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
728
res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
646
737
if (!select_insert)
648
TableList *duplicate;
649
if ((duplicate= unique_table(table_list, table_list->next_global, true)))
739
TABLE_LIST *duplicate;
740
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 1)))
651
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
742
update_non_unique_table_error(table_list, "INSERT", duplicate);
745
select_lex->first_execution= 0;
656
747
if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
657
748
table->prepare_for_position();
663
753
/* Check if there is more uniq keys after field */
665
static int last_uniq_key(Table *table,uint32_t keynr)
755
static int last_uniq_key(TABLE *table,uint keynr)
667
757
while (++keynr < table->s->keys)
668
758
if (table->key_info[keynr].flags & HA_NOSAME)
701
int write_record(Session *session, Table *table,COPY_INFO *info)
791
int write_record(THD *thd, TABLE *table,COPY_INFO *info)
705
MyBitmap *save_read_set, *save_write_set;
706
uint64_t prev_insert_id= table->cursor->next_insert_id;
795
MY_BITMAP *save_read_set, *save_write_set;
796
uint64_t prev_insert_id= table->file->next_insert_id;
707
797
uint64_t insert_id_for_cur_row= 0;
711
801
save_read_set= table->read_set;
712
802
save_write_set= table->write_set;
714
if (info->handle_duplicates == DUP_REPLACE || info->handle_duplicates == DUP_UPDATE)
804
if (info->handle_duplicates == DUP_REPLACE ||
805
info->handle_duplicates == DUP_UPDATE)
716
while ((error=table->cursor->ha_write_row(table->record[0])))
807
while ((error=table->file->ha_write_row(table->record[0])))
720
811
If we do more than one iteration of this loop, from the second one the
721
812
row will have an explicit value in the autoinc field, which was set at
722
813
the first call of handler::update_auto_increment(). So we must save
723
the autogenerated value to avoid session->insert_id_for_cur_row to become
814
the autogenerated value to avoid thd->insert_id_for_cur_row to become
726
if (table->cursor->insert_id_for_cur_row > 0)
727
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row;
817
if (table->file->insert_id_for_cur_row > 0)
818
insert_id_for_cur_row= table->file->insert_id_for_cur_row;
729
table->cursor->insert_id_for_cur_row= insert_id_for_cur_row;
820
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
730
821
bool is_duplicate_key_error;
731
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
822
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
733
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
824
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
734
825
if (!is_duplicate_key_error)
777
if (!(key=(char*) malloc(table->s->max_unique_length)))
868
if (!(key=(char*) my_safe_alloca(table->s->max_unique_length,
783
key_copy((unsigned char*) key,table->record[0],table->key_info+key_nr,0);
784
if ((error=(table->cursor->index_read_idx_map(table->record[1],key_nr,
785
(unsigned char*) key, HA_WHOLE_KEY,
875
key_copy((uchar*) key,table->record[0],table->key_info+key_nr,0);
876
if ((error=(table->file->index_read_idx_map(table->record[1],key_nr,
877
(uchar*) key, HA_WHOLE_KEY,
786
878
HA_READ_KEY_EXACT))))
794
886
an error is returned
796
888
assert(table->insert_values != NULL);
797
table->storeRecordAsInsert();
798
table->restoreRecord();
889
store_record(table,insert_values);
890
restore_record(table,record[1]);
799
891
assert(info->update_fields->elements ==
800
892
info->update_values->elements);
801
if (fill_record(session, *info->update_fields,
893
if (fill_record(thd, *info->update_fields,
802
894
*info->update_values,
806
table->cursor->restore_auto_increment(prev_insert_id);
898
table->file->restore_auto_increment(prev_insert_id);
807
899
if (table->next_number_field)
808
table->cursor->adjust_next_insert_id_after_explicit_value(
900
table->file->adjust_next_insert_id_after_explicit_value(
809
901
table->next_number_field->val_int());
811
if ((table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ) &&
903
if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
812
904
!bitmap_is_subset(table->write_set, table->read_set)) ||
813
table->compare_record())
905
compare_record(table))
815
if ((error=table->cursor->ha_update_row(table->record[1],
907
if ((error=table->file->ha_update_row(table->record[1],
816
908
table->record[0])) &&
817
909
error != HA_ERR_RECORD_IS_THE_SAME)
819
911
if (info->ignore &&
820
!table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
912
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
822
914
goto gok_or_after_err;
833
925
like a regular UPDATE statement: it should not affect the value of a
834
926
next SELECT LAST_INSERT_ID() or mysql_insert_id().
835
927
Except if LAST_INSERT_ID(#) was in the INSERT query, which is
836
handled separately by Session::arg_of_last_insert_id_function.
928
handled separately by THD::arg_of_last_insert_id_function.
838
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row= 0;
930
insert_id_for_cur_row= table->file->insert_id_for_cur_row= 0;
842
934
if (table->next_number_field)
843
table->cursor->adjust_next_insert_id_after_explicit_value(
935
table->file->adjust_next_insert_id_after_explicit_value(
844
936
table->next_number_field->val_int());
902
994
table->write_set != save_write_set)
903
995
table->column_bitmaps_set(save_read_set, save_write_set);
905
else if ((error=table->cursor->ha_write_row(table->record[0])))
997
else if ((error=table->file->ha_write_row(table->record[0])))
907
999
if (!info->ignore ||
908
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
1000
table->file->is_fatal_error(error, HA_CHECK_DUP))
910
table->cursor->restore_auto_increment(prev_insert_id);
1002
table->file->restore_auto_increment(prev_insert_id);
911
1003
goto gok_or_after_err;
914
1006
after_n_copied_inc:
916
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
1008
thd->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
918
1010
gok_or_after_err:
921
if (!table->cursor->has_transactions())
922
session->transaction.stmt.modified_non_trans_table= true;
1012
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
1013
if (!table->file->has_transactions())
1014
thd->transaction.stmt.modified_non_trans_table= true;
926
1018
info->last_errno= error;
927
1019
/* current_select is NULL if this is a delayed insert */
928
if (session->lex->current_select)
929
session->lex->current_select->no_error= 0; // Give error
930
table->print_error(error,MYF(0));
1020
if (thd->lex->current_select)
1021
thd->lex->current_select->no_error= 0; // Give error
1022
table->file->print_error(error,MYF(0));
933
table->cursor->restore_auto_increment(prev_insert_id);
1025
table->file->restore_auto_increment(prev_insert_id);
1027
my_safe_afree(key, table->s->max_unique_length, MAX_KEY_LENGTH);
936
1028
table->column_bitmaps_set(save_read_set, save_write_set);
942
1034
Check that all fields with arn't null_fields are used
943
1035
******************************************************************************/
945
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1037
int check_that_all_fields_are_given_values(THD *thd, TABLE *entry,
1038
TABLE_LIST *table_list)
1041
MY_BITMAP *write_set= entry->write_set;
950
1043
for (Field **field=entry->field ; *field ; field++)
952
if (((*field)->isWriteSet()) == false)
955
* If the field doesn't have any default value
956
* and there is no actual value specified in the
957
* INSERT statement, throw error ER_NO_DEFAULT_FOR_FIELD.
959
if (((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
1045
if (!bitmap_is_set(write_set, (*field)->field_index) &&
1046
((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
960
1047
((*field)->real_type() != DRIZZLE_TYPE_ENUM))
962
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), (*field)->field_name);
969
* However, if an actual NULL value was specified
970
* for the field and the field is a NOT NULL field,
971
* throw ER_BAD_NULL_ERROR.
973
* Per the SQL standard, inserting NULL into a NOT NULL
974
* field requires an error to be thrown.
976
if (((*field)->flags & NOT_NULL_FLAG) &&
979
my_error(ER_BAD_NULL_ERROR, MYF(0), (*field)->field_name);
1052
table_list= table_list->top_table();
1056
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
1057
ER_NO_DEFAULT_FOR_FIELD,
1058
ER(ER_NO_DEFAULT_FOR_FIELD),
1059
(*field)->field_name);
984
return session->abort_on_warning ? err : 0;
1064
return thd->abort_on_warning ? err : 0;
987
1067
/***************************************************************************
996
1076
mysql_insert_select_prepare()
997
session thread handler
1004
bool mysql_insert_select_prepare(Session *session)
1084
bool mysql_insert_select_prepare(THD *thd)
1006
LEX *lex= session->lex;
1007
Select_Lex *select_lex= &lex->select_lex;
1010
Select_Lex do not belong to INSERT statement, so we can't add WHERE
1087
SELECT_LEX *select_lex= &lex->select_lex;
1088
TABLE_LIST *first_select_leaf_table;
1092
Statement-based replication of INSERT ... SELECT ... LIMIT is not safe
1093
as order of rows is not defined, so in mixed mode we go to row-based.
1095
Note that we may consider a statement as safe if ORDER BY primary_key
1096
is present or we SELECT a constant. However it may confuse users to
1097
see very similiar statements replicated differently.
1099
if (lex->current_select->select_limit)
1101
lex->set_stmt_unsafe();
1102
thd->set_current_stmt_binlog_row_based_if_mixed();
1105
SELECT_LEX do not belong to INSERT statement, so we can't add WHERE
1011
1106
clause if table is VIEW
1014
if (mysql_prepare_insert(session, lex->query_tables,
1109
if (mysql_prepare_insert(thd, lex->query_tables,
1015
1110
lex->query_tables->table, lex->field_list, 0,
1016
1111
lex->update_list, lex->value_list,
1017
1112
lex->duplicates,
1025
1120
assert(select_lex->leaf_tables != 0);
1026
1121
lex->leaf_tables_insert= select_lex->leaf_tables;
1027
1122
/* skip all leaf tables belonged to view where we are insert */
1028
select_lex->leaf_tables= select_lex->leaf_tables->next_leaf;
1123
for (first_select_leaf_table= select_lex->leaf_tables->next_leaf;
1124
first_select_leaf_table &&
1125
first_select_leaf_table->belong_to_view &&
1126
first_select_leaf_table->belong_to_view ==
1127
lex->leaf_tables_insert->belong_to_view;
1128
first_select_leaf_table= first_select_leaf_table->next_leaf)
1130
select_lex->leaf_tables= first_select_leaf_table;
1033
select_insert::select_insert(TableList *table_list_par, Table *table_par,
1135
select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
1034
1136
List<Item> *fields_par,
1035
1137
List<Item> *update_fields,
1036
1138
List<Item> *update_values,
1065
1167
we are fixing fields from insert list.
1067
1169
lex->current_select= &lex->select_lex;
1068
res= check_insert_fields(session, table_list, *fields, values,
1170
res= check_insert_fields(thd, table_list, *fields, values,
1069
1171
!insert_into_view, &map) ||
1070
setup_fields(session, 0, values, MARK_COLUMNS_READ, 0, 0);
1172
setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0);
1072
1174
if (!res && fields->elements)
1074
bool saved_abort_on_warning= session->abort_on_warning;
1075
session->abort_on_warning= !info.ignore;
1076
res= check_that_all_fields_are_given_values(session, table_list->table,
1176
bool saved_abort_on_warning= thd->abort_on_warning;
1177
thd->abort_on_warning= !info.ignore;
1178
res= check_that_all_fields_are_given_values(thd, table_list->table,
1078
session->abort_on_warning= saved_abort_on_warning;
1180
thd->abort_on_warning= saved_abort_on_warning;
1081
1183
if (info.handle_duplicates == DUP_UPDATE && !res)
1090
1192
table_list->next_local= 0;
1091
1193
context->resolve_in_table_list_only(table_list);
1093
res= res || check_update_fields(session, context->table_list,
1195
res= res || check_update_fields(thd, context->table_list,
1094
1196
*info.update_fields, &map);
1096
When we are not using GROUP BY and there are no ungrouped aggregate functions
1198
When we are not using GROUP BY and there are no ungrouped aggregate functions
1097
1199
we can refer to other tables in the ON DUPLICATE KEY part.
1098
1200
We use next_name_resolution_table descructively, so check it first (views?)
1104
1206
We must make a single context out of the two separate name resolution contexts :
1105
1207
the INSERT table and the tables in the SELECT part of INSERT ... SELECT.
1106
1208
To do that we must concatenate the two lists
1108
table_list->next_name_resolution_table=
1210
table_list->next_name_resolution_table=
1109
1211
ctx_state.get_first_name_resolution_table();
1111
res= res || setup_fields(session, 0, *info.update_values,
1213
res= res || setup_fields(thd, 0, *info.update_values,
1112
1214
MARK_COLUMNS_READ, 0, 0);
1154
1256
else if (!(lex->current_select->options & OPTION_BUFFER_RESULT))
1157
We must not yet prepare the result table if it is the same as one of the
1158
source tables (INSERT SELECT). The preparation may disable
1259
We must not yet prepare the result table if it is the same as one of the
1260
source tables (INSERT SELECT). The preparation may disable
1159
1261
indexes on the result table, which may be used during the select, if it
1160
1262
is the same table (Bug #6034). Do the preparation after the select phase
1161
1263
in select_insert::prepare2().
1162
1264
We won't start bulk inserts at all if this statement uses functions or
1163
1265
should invoke triggers since they may access to the same table too.
1165
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1267
table->file->ha_start_bulk_insert((ha_rows) 0);
1167
table->restoreRecordAsDefault(); // Get empty record
1269
restore_record(table,s->default_values); // Get empty record
1168
1270
table->next_number_field=table->found_next_number_field;
1170
session->cuted_fields=0;
1272
#ifdef HAVE_REPLICATION
1273
if (thd->slave_thread &&
1274
(info.handle_duplicates == DUP_UPDATE) &&
1275
(table->next_number_field != NULL) &&
1276
rpl_master_has_bug(&active_mi->rli, 24432))
1280
thd->cuted_fields=0;
1171
1281
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1172
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1282
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1173
1283
if (info.handle_duplicates == DUP_REPLACE)
1174
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1284
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1175
1285
if (info.handle_duplicates == DUP_UPDATE)
1176
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1177
session->abort_on_warning= !info.ignore;
1286
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1287
thd->abort_on_warning= !info.ignore;
1178
1288
table->mark_columns_needed_for_insert();
1287
1394
void select_insert::store_values(List<Item> &values)
1289
1396
if (fields->elements)
1290
fill_record(session, *fields, values, 1);
1397
fill_record(thd, *fields, values, 1);
1292
fill_record(session, table->field, values, 1);
1399
fill_record(thd, table->field, values, 1);
1295
void select_insert::send_error(uint32_t errcode,const char *err)
1402
void select_insert::send_error(uint errcode,const char *err)
1299
1406
my_message(errcode, err, MYF(0));
1319
1427
We must invalidate the table in the query cache before binlog writing
1320
1428
and ha_autocommit_or_rollback.
1322
if (session->transaction.stmt.modified_non_trans_table)
1323
session->transaction.all.modified_non_trans_table= true;
1430
if (thd->transaction.stmt.modified_non_trans_table)
1431
thd->transaction.all.modified_non_trans_table= true;
1325
assert(trans_table || !changed ||
1326
session->transaction.stmt.modified_non_trans_table);
1433
assert(trans_table || !changed ||
1434
thd->transaction.stmt.modified_non_trans_table);
1328
table->cursor->ha_release_auto_increment();
1437
Write to binlog before commiting transaction. No statement will
1438
be written by the binlog_query() below in RBR mode. All the
1439
events are in the transaction cache and will be written when
1440
ha_autocommit_or_rollback() is issued below.
1442
if (mysql_bin_log.is_open())
1446
thd->binlog_query(THD::ROW_QUERY_TYPE,
1447
thd->query, thd->query_length,
1448
trans_table, false, killed_status);
1450
table->file->ha_release_auto_increment();
1332
table->print_error(error,MYF(0));
1333
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1454
table->file->print_error(error,MYF(0));
1336
1457
char buff[160];
1337
1458
if (info.ignore)
1338
1459
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1339
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1460
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
1341
1462
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1342
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1343
session->row_count_func= info.copied + info.deleted + info.updated;
1463
(ulong) (info.deleted+info.updated), (ulong) thd->cuted_fields);
1464
thd->row_count_func= info.copied + info.deleted +
1465
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
1466
info.touched : info.updated);
1345
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1346
session->first_successful_insert_id_in_cur_stmt :
1347
(session->arg_of_last_insert_id_function ?
1348
session->first_successful_insert_id_in_prev_stmt :
1468
id= (thd->first_successful_insert_id_in_cur_stmt > 0) ?
1469
thd->first_successful_insert_id_in_cur_stmt :
1470
(thd->arg_of_last_insert_id_function ?
1471
thd->first_successful_insert_id_in_prev_stmt :
1349
1472
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1350
session->my_ok((ulong) session->row_count_func,
1351
info.copied + info.deleted + info.touched, id, buff);
1352
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1473
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
1356
1477
void select_insert::abort() {
1360
1481
If the creation of the table failed (due to a syntax error, for
1361
1482
example), no table will have been opened and therefore 'table'
1383
1504
zero, so no check for that is made.
1385
1506
changed= (info.copied || info.deleted || info.updated);
1386
transactional_table= table->cursor->has_transactions();
1507
transactional_table= table->file->has_transactions();
1508
if (thd->transaction.stmt.modified_non_trans_table)
1510
if (mysql_bin_log.is_open())
1511
thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query, thd->query_length,
1512
transactional_table, false);
1513
if (!thd->current_stmt_binlog_row_based && !can_rollback_data())
1514
thd->transaction.all.modified_non_trans_table= true;
1387
1516
assert(transactional_table || !changed ||
1388
session->transaction.stmt.modified_non_trans_table);
1389
table->cursor->ha_release_auto_increment();
1392
if (DRIZZLE_INSERT_SELECT_DONE_ENABLED())
1394
DRIZZLE_INSERT_SELECT_DONE(0, info.copied + info.deleted + info.updated);
1517
thd->transaction.stmt.modified_non_trans_table);
1518
table->file->ha_release_auto_increment();
1421
1545
lock out Pointer to the DRIZZLE_LOCK object for table created
1422
1546
(or open temporary table) will be returned in this
1423
1547
parameter. Since this table is not included in
1424
Session::lock caller is responsible for explicitly
1548
THD::lock caller is responsible for explicitly
1425
1549
unlocking this table.
1429
1553
This function behaves differently for base and temporary tables:
1430
1554
- For base table we assume that either table exists and was pre-opened
1431
and locked at openTablesLock() stage (and in this case we just
1432
emit error or warning and return pre-opened Table object) or special
1555
and locked at open_and_lock_tables() stage (and in this case we just
1556
emit error or warning and return pre-opened TABLE object) or special
1433
1557
placeholder was put in table cache that guarantees that this table
1434
1558
won't be created or opened until the placeholder will be removed
1435
1559
(so there is an exclusive lock on this table).
1440
1564
SELECT it should be changed before it can be used in other contexts.
1443
non-zero Pointer to Table object for table created or opened
1567
non-zero Pointer to TABLE object for table created or opened
1447
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1448
TableList *create_table,
1449
message::Table *table_proto,
1450
AlterInfo *alter_info,
1571
static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
1572
TABLE_LIST *create_table,
1573
Alter_info *alter_info,
1451
1574
List<Item> *items,
1452
bool is_if_not_exists,
1453
DRIZZLE_LOCK **lock)
1575
DRIZZLE_LOCK **lock,
1576
TABLEOP_HOOKS *hooks)
1455
Table tmp_table; // Used during 'CreateField()'
1458
uint32_t select_field_count= items->elements;
1578
TABLE tmp_table; // Used during 'Create_field()'
1581
uint select_field_count= items->elements;
1459
1582
/* Add selected items to field list */
1460
1583
List_iterator_fast<Item> it(*items);
1462
1585
Field *tmp_field;
1465
bool lex_identified_temp_table= (table_proto->type() == drizzled::message::Table::TEMPORARY);
1467
if (!(lex_identified_temp_table) &&
1588
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1468
1589
create_table->table->db_stat)
1470
/* Table already exists and was open at openTablesLock() stage. */
1471
if (is_if_not_exists)
1591
/* Table already exists and was open at open_and_lock_tables() stage. */
1592
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1473
1594
create_info->table_existed= 1; // Mark that table existed
1474
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1595
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1475
1596
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1476
1597
create_table->table_name);
1477
return create_table->table;
1598
return(create_table->table);
1480
1601
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1484
1605
tmp_table.alias= 0;
1485
1606
tmp_table.timestamp_field= 0;
1486
1607
tmp_table.s= &share;
1608
init_tmp_table_share(thd, &share, "", 0, "", "");
1488
1610
tmp_table.s->db_create_options=0;
1489
1611
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1490
tmp_table.s->db_low_byte_first=
1491
test(create_info->db_type == myisam_engine ||
1492
create_info->db_type == heap_engine);
1612
tmp_table.s->db_low_byte_first=
1613
test(create_info->db_type == myisam_hton ||
1614
create_info->db_type == heap_hton);
1493
1615
tmp_table.null_row= false;
1494
1616
tmp_table.maybe_null= false;
1496
1618
while ((item=it++))
1498
CreateField *cr_field;
1620
Create_field *cr_field;
1499
1621
Field *field, *def_field;
1500
1622
if (item->type() == Item::FUNC_ITEM)
1501
1623
if (item->result_type() != STRING_RESULT)
1504
1626
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1506
field= create_tmp_field(session, &tmp_table, item, item->type(),
1628
field= create_tmp_field(thd, &tmp_table, item, item->type(),
1507
1629
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1510
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1632
!(cr_field=new Create_field(field,(item->type() == Item::FIELD_ITEM ?
1511
1633
((Item_field *)item)->field :
1514
1636
if (item->maybe_null)
1515
1637
cr_field->flags &= ~NOT_NULL_FLAG;
1516
1638
alter_info->create_list.push_back(cr_field);
1519
TableIdentifier identifier(create_table->db,
1520
create_table->table_name,
1521
lex_identified_temp_table ? NON_TRANSACTIONAL_TMP_TABLE :
1526
1642
Create and lock table.
1528
1644
Note that we either creating (or opening existing) temporary table or
1529
1645
creating base table on which name we have exclusive lock. So code below
1530
1646
should not cause deadlocks or races.
1648
We don't log the statement, it will be logged later.
1650
If this is a HEAP table, the automatic DELETE FROM which is written to the
1651
binlog when a HEAP table is opened for the first time since startup, must
1652
not be written: 1) it would be wrong (imagine we're in CREATE SELECT: we
1653
don't want to delete from it) 2) it would be written before the CREATE
1654
TABLE, which is a wrong order. So we keep binary logging disabled when we
1533
if (!mysql_create_table_no_lock(session,
1658
tmp_disable_binlog(thd);
1659
if (!mysql_create_table_no_lock(thd, create_table->db,
1660
create_table->table_name,
1661
create_info, alter_info, 0,
1662
select_field_count))
1542
1664
if (create_info->table_existed &&
1543
!(lex_identified_temp_table))
1665
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1546
1668
This means that someone created table underneath server
1548
1670
cluster. We don't have much options but throw an error.
1550
1672
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1554
if (!(lex_identified_temp_table))
1676
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1556
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1557
if (session->reopen_name_locked_table(create_table, false))
1678
VOID(pthread_mutex_lock(&LOCK_open));
1679
if (reopen_name_locked_table(thd, create_table, false))
1559
quick_rm_table(*session, create_table->db,
1560
create_table->table_name, false);
1681
quick_rm_table(create_info->db_type, create_table->db,
1682
table_case_name(create_info, create_table->table_name),
1563
1686
table= create_table->table;
1564
pthread_mutex_unlock(&LOCK_open);
1687
VOID(pthread_mutex_unlock(&LOCK_open));
1568
if (!(table= session->openTable(create_table, (bool*) 0,
1569
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1691
if (!(table= open_table(thd, create_table, thd->mem_root, (bool*) 0,
1692
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1570
1693
!create_info->table_existed)
1574
1697
it preparable for open. But let us do close_temporary_table() here
1577
session->drop_temporary_table(create_table);
1700
drop_temporary_table(thd, create_table);
1704
reenable_binlog(thd);
1581
1705
if (!table) // open failed
1585
1709
table->reginfo.lock_type=TL_WRITE;
1586
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1587
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1710
hooks->prelock(&table, 1); // Call prelock hooks
1711
if (! ((*lock)= mysql_lock_tables(thd, &table, 1,
1712
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)) ||
1713
hooks->postlock(&table, 1))
1591
mysql_unlock_tables(session, *lock);
1717
mysql_unlock_tables(thd, *lock);
1595
1721
if (!create_info->table_existed)
1596
session->drop_open_table(table, create_table->db, create_table->table_name);
1722
drop_open_table(thd, table, create_table->db, create_table->table_name);
1605
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1730
select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
1607
bool lex_identified_temp_table= (table_proto->type() == drizzled::message::Table::TEMPORARY);
1609
1732
DRIZZLE_LOCK *extra_lock= NULL;
1735
TABLEOP_HOOKS *hook_ptr= NULL;
1611
1737
For row-based replication, the CREATE-SELECT statement is written
1612
1738
in two pieces: the first one contain the CREATE TABLE statement
1625
1751
slave. Hence, we have to hold on to the CREATE part of the
1626
1752
statement until the statement has finished.
1754
class MY_HOOKS : public TABLEOP_HOOKS {
1756
MY_HOOKS(select_create *x, TABLE_LIST *create_table,
1757
TABLE_LIST *select_tables)
1758
: ptr(x), all_tables(*create_table)
1760
all_tables.next_global= select_tables;
1764
virtual int do_postlock(TABLE **tables, uint count)
1766
THD *thd= const_cast<THD*>(ptr->get_thd());
1767
if (int error= decide_logging_format(thd, &all_tables))
1770
TABLE const *const table = *tables;
1771
if (thd->current_stmt_binlog_row_based &&
1772
!table->s->tmp_table &&
1773
!ptr->get_create_info()->table_existed)
1775
ptr->binlog_show_create_table(tables, count);
1781
TABLE_LIST all_tables;
1784
MY_HOOKS hooks(this, create_table, select_tables);
1633
1791
row-based replication for the statement. If we are creating a
1634
1792
temporary table, we need to start a statement transaction.
1794
if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 &&
1795
thd->current_stmt_binlog_row_based)
1797
thd->binlog_start_trans_and_stmt();
1637
if (!(table= create_table_from_items(session, create_info, create_table,
1800
if (!(table= create_table_from_items(thd, create_info, create_table,
1639
1801
alter_info, &values,
1802
&extra_lock, hook_ptr)))
1642
1803
return(-1); // abort() deletes table
1644
1805
if (extra_lock)
1646
1807
assert(m_plock == NULL);
1648
if (lex_identified_temp_table)
1809
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1649
1810
m_plock= &m_lock;
1651
m_plock= &session->extra_lock;
1812
m_plock= &thd->extra_lock;
1653
1814
*m_plock= extra_lock;
1665
1826
/* Mark all fields that are given values */
1666
1827
for (Field **f= field ; *f ; f++)
1667
table->setWriteSet((*f)->field_index);
1828
bitmap_set_bit(table->write_set, (*f)->field_index);
1669
1830
/* Don't set timestamp if used */
1670
1831
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1671
1832
table->next_number_field=table->found_next_number_field;
1673
table->restoreRecordAsDefault(); // Get empty record
1674
session->cuted_fields=0;
1834
restore_record(table,s->default_values); // Get empty record
1835
thd->cuted_fields=0;
1675
1836
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1676
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1837
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1677
1838
if (info.handle_duplicates == DUP_REPLACE)
1678
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1839
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1679
1840
if (info.handle_duplicates == DUP_UPDATE)
1680
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1681
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1682
session->abort_on_warning= !info.ignore;
1683
if (check_that_all_fields_are_given_values(session, table, table_list))
1841
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1842
table->file->ha_start_bulk_insert((ha_rows) 0);
1843
thd->abort_on_warning= !info.ignore;
1844
if (check_that_all_fields_are_given_values(thd, table, table_list))
1685
1846
table->mark_columns_needed_for_insert();
1686
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1847
table->file->extra(HA_EXTRA_WRITE_CACHE);
1852
select_create::binlog_show_create_table(TABLE **tables, uint count)
1855
Note 1: In RBR mode, we generate a CREATE TABLE statement for the
1856
created table by calling store_create_info() (behaves as SHOW
1857
CREATE TABLE). In the event of an error, nothing should be
1858
written to the binary log, even if the table is non-transactional;
1859
therefore we pretend that the generated CREATE TABLE statement is
1860
for a transactional table. The event will then be put in the
1861
transaction cache, and any subsequent events (e.g., table-map
1862
events and binrow events) will also be put there. We can then use
1863
ha_autocommit_or_rollback() to either throw away the entire
1864
kaboodle of events, or write them to the binary log.
1866
We write the CREATE TABLE statement here and not in prepare()
1867
since there potentially are sub-selects or accesses to information
1868
schema that will do a close_thread_tables(), destroying the
1869
statement transaction cache.
1871
assert(thd->current_stmt_binlog_row_based);
1872
assert(tables && *tables && count > 0);
1875
String query(buf, sizeof(buf), system_charset_info);
1877
TABLE_LIST tmp_table_list;
1879
memset(&tmp_table_list, 0, sizeof(tmp_table_list));
1880
tmp_table_list.table = *tables;
1881
query.length(0); // Have to zero it since constructor doesn't
1883
result= store_create_info(thd, &tmp_table_list, &query, create_info);
1884
assert(result == 0); /* store_create_info() always return 0 */
1886
thd->binlog_query(THD::STMT_QUERY_TYPE,
1887
query.ptr(), query.length(),
1888
/* is_trans */ true,
1889
/* suppress_use */ false);
1690
1892
void select_create::store_values(List<Item> &values)
1692
fill_record(session, field, values, 1);
1894
fill_record(thd, field, values, 1);
1696
void select_create::send_error(uint32_t errcode,const char *err)
1898
void select_create::send_error(uint errcode,const char *err)
1701
1903
This will execute any rollbacks that are necessary before writing
1764
1968
of the table succeeded or not, since we need to reset the binary
1971
tmp_disable_binlog(thd);
1767
1972
select_insert::abort();
1768
session->transaction.stmt.modified_non_trans_table= false;
1973
thd->transaction.stmt.modified_non_trans_table= false;
1974
reenable_binlog(thd);
1773
mysql_unlock_tables(session, *m_plock);
1979
mysql_unlock_tables(thd, *m_plock);
1774
1980
*m_plock= NULL;
1780
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1781
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1986
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1987
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1782
1988
if (!create_info->table_existed)
1783
session->drop_open_table(table, create_table->db, create_table->table_name);
1784
table= NULL; // Safety
1989
drop_open_table(thd, table, create_table->db, create_table->table_name);