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.
25
#include <drizzled/server_includes.h>
26
20
#include <drizzled/sql_select.h>
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))
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>
29
#include "drizzled/sql_table.h"
30
#include "drizzled/pthread_globals.h"
32
using namespace drizzled;
34
extern plugin::StorageEngine *heap_engine;
35
extern plugin::StorageEngine *myisam_engine;
44
38
Check if insert fields are correct.
47
41
check_insert_fields()
48
thd The current thread.
42
session The current thread.
49
43
table The table for insert.
50
44
fields The insert fields.
51
45
values The insert values.
118
if (check_unique && thd->dup_field)
112
if (check_unique && session->dup_field)
120
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), thd->dup_field->field_name);
114
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), session->dup_field->field_name);
123
117
if (table->timestamp_field) // Don't automaticly set timestamp if used
125
if (bitmap_is_set(table->write_set,
126
table->timestamp_field->field_index))
119
if (table->timestamp_field->isWriteSet())
127
120
clear_timestamp_auto_bits(table->timestamp_field_type,
128
121
TIMESTAMP_AUTO_SET_ON_INSERT);
131
bitmap_set_bit(table->write_set,
132
table->timestamp_field->field_index);
124
table->setWriteSet(table->timestamp_field->field_index);
170
162
Unmark the timestamp field so that we can check if this is modified
173
timestamp_mark= bitmap_test_and_clear(table->write_set,
174
table->timestamp_field->field_index);
165
timestamp_mark= table->write_set->testAndClear(table->timestamp_field->field_index);
177
168
/* Check the fields we are going to modify */
178
if (setup_fields(thd, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
169
if (setup_fields(session, 0, update_fields, MARK_COLUMNS_WRITE, 0, 0))
181
172
if (table->timestamp_field)
183
174
/* Don't set timestamp column if this is modified. */
184
if (bitmap_is_set(table->write_set,
185
table->timestamp_field->field_index))
175
if (table->timestamp_field->isWriteSet())
186
176
clear_timestamp_auto_bits(table->timestamp_field_type,
187
177
TIMESTAMP_AUTO_SET_ON_UPDATE);
188
178
if (timestamp_mark)
189
bitmap_set_bit(table->write_set,
190
table->timestamp_field->field_index);
179
table->setWriteSet(table->timestamp_field->field_index);
236
225
bool transactional_table, joins_freed= false;
238
bool was_insert_delayed= (table_list->lock_type == TL_WRITE_DELAYED);
227
uint32_t value_count;
240
228
ulong counter = 1;
244
232
List_iterator_fast<List_item> its(values_list);
245
233
List_item *values;
246
234
Name_resolution_context *context;
247
235
Name_resolution_context_state ctx_state;
248
236
thr_lock_type lock_type;
249
237
Item *unused_conds= 0;
253
241
Upgrade lock type if the requested lock is incompatible with
254
242
the current connection mode or table operation.
256
upgrade_lock_type(thd, &table_list->lock_type, duplic,
244
upgrade_lock_type(session, &table_list->lock_type, duplic,
257
245
values_list.elements > 1);
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))
247
if (session->openTablesLock(table_list))
268
my_error(ER_DELAYED_INSERT_TABLE_LOCKED, MYF(0),
269
table_list->table_name);
249
DRIZZLE_INSERT_DONE(1, 0);
274
if (open_and_lock_tables(thd, table_list))
277
253
lock_type= table_list->lock_type;
279
thd_proc_info(thd, "init");
255
session->set_proc_info("init");
256
session->used_tables=0;
282
258
value_count= values->elements;
284
if (mysql_prepare_insert(thd, table_list, table, fields, values,
260
if (mysql_prepare_insert(session, table_list, table, fields, values,
285
261
update_fields, update_values, duplic, &unused_conds,
287
263
(fields.elements || !value_count ||
319
295
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
322
if (setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0))
298
if (setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0))
327
303
/* Restore the current context. */
328
304
ctx_state.restore_state(context, table_list);
331
Fill in the given fields and dump it to the table file
307
Fill in the given fields and dump it to the table cursor
333
309
memset(&info, 0, sizeof(info));
334
310
info.ignore= ignore;
341
317
For single line insert, generate an error if try to set a NOT NULL field
344
thd->count_cuted_fields= ((values_list.elements == 1 &&
346
CHECK_FIELD_ERROR_FOR_NULL :
348
thd->cuted_fields = 0L;
320
session->count_cuted_fields= ((values_list.elements == 1 &&
322
CHECK_FIELD_ERROR_FOR_NULL :
324
session->cuted_fields = 0L;
349
325
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))
360
thd_proc_info(thd, "update");
328
session->set_proc_info("update");
361
329
if (duplic == DUP_REPLACE)
362
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
330
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
363
331
if (duplic == DUP_UPDATE)
364
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
332
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
366
334
if (duplic != DUP_ERROR || ignore)
367
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
368
table->file->ha_start_bulk_insert(values_list.elements);
335
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
336
table->cursor->ha_start_bulk_insert(values_list.elements);
372
thd->abort_on_warning= !ignore;
340
session->abort_on_warning= !ignore;
374
342
table->mark_columns_needed_for_insert();
378
346
if (fields.elements || !value_count)
380
restore_record(table,s->default_values); // Get empty record
381
if (fill_record(thd, fields, *values, 0))
348
table->restoreRecordAsDefault(); // Get empty record
349
if (fill_record(session, fields, *values))
383
if (values_list.elements != 1 && ! thd->is_error())
351
if (values_list.elements != 1 && ! session->is_error())
389
TODO: set thd->abort_on_warning if values_list.elements == 1
357
TODO: set session->abort_on_warning if values_list.elements == 1
390
358
and check that all items return warning in case of problem with
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())
367
table->restoreRecordAsDefault(); // Get empty record
369
if (fill_record(session, table->field, *values))
371
if (values_list.elements != 1 && ! session->is_error())
437
399
Do not do this release if this is a delayed insert, it would steal
438
auto_inc values from the delayed_insert thread as they share TABLE.
400
auto_inc values from the delayed_insert thread as they share Table.
440
table->file->ha_release_auto_increment();
441
if (table->file->ha_end_bulk_insert() && !error)
402
table->cursor->ha_release_auto_increment();
403
if (table->cursor->ha_end_bulk_insert() && !error)
443
table->file->print_error(my_errno,MYF(0));
405
table->print_error(errno,MYF(0));
446
408
if (duplic != DUP_ERROR || ignore)
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);
409
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
411
transactional_table= table->cursor->has_transactions();
413
changed= (info.copied || info.deleted || info.updated);
414
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
416
if (session->transaction.stmt.modified_non_trans_table)
417
session->transaction.all.modified_non_trans_table= true;
419
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
506
thd_proc_info(thd, "end");
422
session->set_proc_info("end");
508
424
We'll report to the client this id:
509
425
- if the table contains an autoincrement column and we successfully
514
430
inserted, the id of the last "inserted" row (if IGNORE, that value may not
515
431
have been really inserted but ignored).
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 :
433
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
434
session->first_successful_insert_id_in_cur_stmt :
435
(session->arg_of_last_insert_id_function ?
436
session->first_successful_insert_id_in_prev_stmt :
521
437
((table->next_number_field && info.copied) ?
522
438
table->next_number_field->val_int() : 0));
523
439
table->next_number_field=0;
524
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
440
session->count_cuted_fields= CHECK_FIELD_IGNORE;
525
441
table->auto_increment_field_not_null= false;
526
442
if (duplic == DUP_REPLACE)
527
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
443
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
531
if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) ||
447
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
448
!session->cuted_fields))
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);
450
session->row_count_func= info.copied + info.deleted + info.updated;
451
session->my_ok((ulong) session->row_count_func,
452
info.copied + info.deleted + info.touched, id);
542
ha_rows updated=((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
543
info.touched : info.updated);
545
458
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
546
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
459
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
548
461
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
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
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
463
session->row_count_func= info.copied + info.deleted + info.updated;
464
session->my_ok((ulong) session->row_count_func,
465
info.copied + info.deleted + info.touched, id, buff);
553
thd->abort_on_warning= 0;
554
DRIZZLE_INSERT_END();
467
session->abort_on_warning= 0;
468
DRIZZLE_INSERT_DONE(0, session->row_count_func);
558
472
if (table != NULL)
559
table->file->ha_release_auto_increment();
473
table->cursor->ha_release_auto_increment();
560
474
if (!joins_freed)
561
free_underlaid_joins(thd, &thd->lex->select_lex);
562
thd->abort_on_warning= 0;
563
DRIZZLE_INSERT_END();
475
free_underlaid_joins(session, &session->lex->select_lex);
476
session->abort_on_warning= 0;
477
DRIZZLE_INSERT_DONE(1, 0);
631
545
You MUST set table->insert_values to 0 after calling this function
632
546
before releasing the table object.
639
bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
640
TABLE *table, List<Item> &fields, List_item *values,
553
bool mysql_prepare_insert(Session *session, TableList *table_list,
554
Table *table, List<Item> &fields, List_item *values,
641
555
List<Item> &update_fields, List<Item> &update_values,
642
556
enum_duplicates duplic,
643
COND **where __attribute__((unused)),
644
558
bool select_insert,
645
559
bool check_fields, bool abort_on_warning)
647
SELECT_LEX *select_lex= &thd->lex->select_lex;
561
Select_Lex *select_lex= &session->lex->select_lex;
648
562
Name_resolution_context *context= &select_lex->context;
649
563
Name_resolution_context_state ctx_state;
650
564
bool insert_into_view= (0 != 0);
652
566
table_map map= 0;
654
568
/* INSERT should have a SELECT or VALUES clause */
655
569
assert (!select_insert || !values);
658
572
For subqueries in VALUES() we should not see the table in which we are
659
573
inserting (for INSERT ... SELECT this is done by changing table_list,
660
because INSERT ... SELECT share SELECT_LEX it with SELECT.
574
because INSERT ... SELECT share Select_Lex it with SELECT.
662
576
if (!select_insert)
664
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit();
578
for (Select_Lex_Unit *un= select_lex->first_inner_unit();
666
580
un= un->next_unit())
668
for (SELECT_LEX *sl= un->first_select();
582
for (Select_Lex *sl= un->first_select();
670
584
sl= sl->next_select())
701
615
table_list->next_local= 0;
702
616
context->resolve_in_table_list_only(table_list);
704
res= check_insert_fields(thd, context->table_list, fields, *values,
618
res= check_insert_fields(session, context->table_list, fields, *values,
705
619
!insert_into_view, &map) ||
706
setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0);
620
setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0);
708
622
if (!res && check_fields)
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,
624
bool saved_abort_on_warning= session->abort_on_warning;
625
session->abort_on_warning= abort_on_warning;
626
res= check_that_all_fields_are_given_values(session,
714
628
context->table_list->table,
715
629
context->table_list);
716
thd->abort_on_warning= saved_abort_on_warning;
630
session->abort_on_warning= saved_abort_on_warning;
719
633
if (!res && duplic == DUP_UPDATE)
721
res= check_update_fields(thd, context->table_list, update_fields, &map);
635
res= check_update_fields(session, context->table_list, update_fields, &map);
724
638
/* Restore the current context. */
725
639
ctx_state.restore_state(context, table_list);
728
res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
642
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
737
651
if (!select_insert)
739
TABLE_LIST *duplicate;
740
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 1)))
653
TableList *duplicate;
654
if ((duplicate= unique_table(table_list, table_list->next_global, true)))
742
update_non_unique_table_error(table_list, "INSERT", duplicate);
656
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
745
select_lex->first_execution= 0;
747
661
if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
748
662
table->prepare_for_position();
753
668
/* Check if there is more uniq keys after field */
755
static int last_uniq_key(TABLE *table,uint keynr)
670
static int last_uniq_key(Table *table,uint32_t keynr)
757
672
while (++keynr < table->s->keys)
758
673
if (table->key_info[keynr].flags & HA_NOSAME)
791
int write_record(THD *thd, TABLE *table,COPY_INFO *info)
706
int write_record(Session *session, Table *table,COPY_INFO *info)
795
MY_BITMAP *save_read_set, *save_write_set;
796
uint64_t prev_insert_id= table->file->next_insert_id;
710
MyBitmap *save_read_set, *save_write_set;
711
uint64_t prev_insert_id= table->cursor->next_insert_id;
797
712
uint64_t insert_id_for_cur_row= 0;
801
716
save_read_set= table->read_set;
802
717
save_write_set= table->write_set;
804
if (info->handle_duplicates == DUP_REPLACE ||
805
info->handle_duplicates == DUP_UPDATE)
719
if (info->handle_duplicates == DUP_REPLACE || info->handle_duplicates == DUP_UPDATE)
807
while ((error=table->file->ha_write_row(table->record[0])))
721
while ((error=table->cursor->ha_write_row(table->record[0])))
811
725
If we do more than one iteration of this loop, from the second one the
812
726
row will have an explicit value in the autoinc field, which was set at
813
727
the first call of handler::update_auto_increment(). So we must save
814
the autogenerated value to avoid thd->insert_id_for_cur_row to become
728
the autogenerated value to avoid session->insert_id_for_cur_row to become
817
if (table->file->insert_id_for_cur_row > 0)
818
insert_id_for_cur_row= table->file->insert_id_for_cur_row;
731
if (table->cursor->insert_id_for_cur_row > 0)
732
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row;
820
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
734
table->cursor->insert_id_for_cur_row= insert_id_for_cur_row;
821
735
bool is_duplicate_key_error;
822
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
736
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
824
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
738
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
825
739
if (!is_duplicate_key_error)
850
764
key_nr == table->s->next_number_index &&
851
765
(insert_id_for_cur_row > 0))
853
if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
767
if (table->cursor->getEngine()->check_flag(HTON_BIT_DUPLICATE_POS))
855
if (table->file->rnd_pos(table->record[1],table->file->dup_ref))
769
if (table->cursor->rnd_pos(table->record[1],table->cursor->dup_ref))
860
if (table->file->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
774
if (table->cursor->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
868
if (!(key=(char*) my_safe_alloca(table->s->max_unique_length,
782
if (!(key=(char*) malloc(table->s->max_unique_length)))
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,
788
key_copy((unsigned char*) key,table->record[0],table->key_info+key_nr,0);
789
if ((error=(table->cursor->index_read_idx_map(table->record[1],key_nr,
790
(unsigned char*) key, HA_WHOLE_KEY,
878
791
HA_READ_KEY_EXACT))))
886
799
an error is returned
888
801
assert(table->insert_values != NULL);
889
store_record(table,insert_values);
890
restore_record(table,record[1]);
802
table->storeRecordAsInsert();
803
table->restoreRecord();
891
804
assert(info->update_fields->elements ==
892
805
info->update_values->elements);
893
if (fill_record(thd, *info->update_fields,
806
if (fill_record(session, *info->update_fields,
894
807
*info->update_values,
898
table->file->restore_auto_increment(prev_insert_id);
811
table->cursor->restore_auto_increment(prev_insert_id);
899
812
if (table->next_number_field)
900
table->file->adjust_next_insert_id_after_explicit_value(
813
table->cursor->adjust_next_insert_id_after_explicit_value(
901
814
table->next_number_field->val_int());
903
if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
816
if ((table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ) &&
904
817
!bitmap_is_subset(table->write_set, table->read_set)) ||
905
compare_record(table))
818
table->compare_record())
907
if ((error=table->file->ha_update_row(table->record[1],
820
if ((error=table->cursor->ha_update_row(table->record[1],
908
821
table->record[0])) &&
909
822
error != HA_ERR_RECORD_IS_THE_SAME)
911
824
if (info->ignore &&
912
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
825
!table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
914
827
goto gok_or_after_err;
925
838
like a regular UPDATE statement: it should not affect the value of a
926
839
next SELECT LAST_INSERT_ID() or mysql_insert_id().
927
840
Except if LAST_INSERT_ID(#) was in the INSERT query, which is
928
handled separately by THD::arg_of_last_insert_id_function.
841
handled separately by Session::arg_of_last_insert_id_function.
930
insert_id_for_cur_row= table->file->insert_id_for_cur_row= 0;
843
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row= 0;
934
847
if (table->next_number_field)
935
table->file->adjust_next_insert_id_after_explicit_value(
848
table->cursor->adjust_next_insert_id_after_explicit_value(
936
849
table->next_number_field->val_int());
994
907
table->write_set != save_write_set)
995
908
table->column_bitmaps_set(save_read_set, save_write_set);
997
else if ((error=table->file->ha_write_row(table->record[0])))
910
else if ((error=table->cursor->ha_write_row(table->record[0])))
999
912
if (!info->ignore ||
1000
table->file->is_fatal_error(error, HA_CHECK_DUP))
913
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
1002
table->file->restore_auto_increment(prev_insert_id);
915
table->cursor->restore_auto_increment(prev_insert_id);
1003
916
goto gok_or_after_err;
1006
919
after_n_copied_inc:
1008
thd->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
921
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
1010
923
gok_or_after_err:
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
if (!table->cursor->has_transactions())
927
session->transaction.stmt.modified_non_trans_table= true;
1018
931
info->last_errno= error;
1019
932
/* current_select is NULL if this is a delayed insert */
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
if (session->lex->current_select)
934
session->lex->current_select->no_error= 0; // Give error
935
table->print_error(error,MYF(0));
1025
table->file->restore_auto_increment(prev_insert_id);
938
table->cursor->restore_auto_increment(prev_insert_id);
1027
my_safe_afree(key, table->s->max_unique_length, MAX_KEY_LENGTH);
1028
941
table->column_bitmaps_set(save_read_set, save_write_set);
1034
947
Check that all fields with arn't null_fields are used
1035
948
******************************************************************************/
1037
int check_that_all_fields_are_given_values(THD *thd, TABLE *entry,
1038
TABLE_LIST *table_list)
950
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1041
MY_BITMAP *write_set= entry->write_set;
1043
955
for (Field **field=entry->field ; *field ; field++)
1045
if (!bitmap_is_set(write_set, (*field)->field_index) &&
1046
((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
957
if (((*field)->isWriteSet()) == false)
960
* If the field doesn't have any default value
961
* and there is no actual value specified in the
962
* INSERT statement, throw error ER_NO_DEFAULT_FOR_FIELD.
964
if (((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
1047
965
((*field)->real_type() != DRIZZLE_TYPE_ENUM))
967
my_error(ER_NO_DEFAULT_FOR_FIELD, 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);
974
* However, if an actual NULL value was specified
975
* for the field and the field is a NOT NULL field,
976
* throw ER_BAD_NULL_ERROR.
978
* Per the SQL standard, inserting NULL into a NOT NULL
979
* field requires an error to be thrown.
981
if (((*field)->flags & NOT_NULL_FLAG) &&
984
my_error(ER_BAD_NULL_ERROR, MYF(0), (*field)->field_name);
1064
return thd->abort_on_warning ? err : 0;
989
return session->abort_on_warning ? err : 0;
1067
992
/***************************************************************************
1076
1001
mysql_insert_select_prepare()
1002
session thread handler
1084
bool mysql_insert_select_prepare(THD *thd)
1009
bool mysql_insert_select_prepare(Session *session)
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
LEX *lex= session->lex;
1012
Select_Lex *select_lex= &lex->select_lex;
1015
Select_Lex do not belong to INSERT statement, so we can't add WHERE
1106
1016
clause if table is VIEW
1109
if (mysql_prepare_insert(thd, lex->query_tables,
1019
if (mysql_prepare_insert(session, lex->query_tables,
1110
1020
lex->query_tables->table, lex->field_list, 0,
1111
1021
lex->update_list, lex->value_list,
1112
1022
lex->duplicates,
1120
1030
assert(select_lex->leaf_tables != 0);
1121
1031
lex->leaf_tables_insert= select_lex->leaf_tables;
1122
1032
/* skip all leaf tables belonged to view where we are insert */
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_lex->leaf_tables= select_lex->leaf_tables->next_leaf;
1135
select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
1038
select_insert::select_insert(TableList *table_list_par, Table *table_par,
1136
1039
List<Item> *fields_par,
1137
1040
List<Item> *update_fields,
1138
1041
List<Item> *update_values,
1167
1070
we are fixing fields from insert list.
1169
1072
lex->current_select= &lex->select_lex;
1170
res= check_insert_fields(thd, table_list, *fields, values,
1073
res= check_insert_fields(session, table_list, *fields, values,
1171
1074
!insert_into_view, &map) ||
1172
setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0);
1075
setup_fields(session, 0, values, MARK_COLUMNS_READ, 0, 0);
1174
1077
if (!res && fields->elements)
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,
1079
bool saved_abort_on_warning= session->abort_on_warning;
1080
session->abort_on_warning= !info.ignore;
1081
res= check_that_all_fields_are_given_values(session, table_list->table,
1180
thd->abort_on_warning= saved_abort_on_warning;
1083
session->abort_on_warning= saved_abort_on_warning;
1183
1086
if (info.handle_duplicates == DUP_UPDATE && !res)
1192
1095
table_list->next_local= 0;
1193
1096
context->resolve_in_table_list_only(table_list);
1195
res= res || check_update_fields(thd, context->table_list,
1098
res= res || check_update_fields(session, context->table_list,
1196
1099
*info.update_fields, &map);
1198
When we are not using GROUP BY and there are no ungrouped aggregate functions
1101
When we are not using GROUP BY and there are no ungrouped aggregate functions
1199
1102
we can refer to other tables in the ON DUPLICATE KEY part.
1200
1103
We use next_name_resolution_table descructively, so check it first (views?)
1206
1109
We must make a single context out of the two separate name resolution contexts :
1207
1110
the INSERT table and the tables in the SELECT part of INSERT ... SELECT.
1208
1111
To do that we must concatenate the two lists
1210
table_list->next_name_resolution_table=
1113
table_list->next_name_resolution_table=
1211
1114
ctx_state.get_first_name_resolution_table();
1213
res= res || setup_fields(thd, 0, *info.update_values,
1116
res= res || setup_fields(session, 0, *info.update_values,
1214
1117
MARK_COLUMNS_READ, 0, 0);
1256
1159
else if (!(lex->current_select->options & OPTION_BUFFER_RESULT))
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
1162
We must not yet prepare the result table if it is the same as one of the
1163
source tables (INSERT SELECT). The preparation may disable
1261
1164
indexes on the result table, which may be used during the select, if it
1262
1165
is the same table (Bug #6034). Do the preparation after the select phase
1263
1166
in select_insert::prepare2().
1264
1167
We won't start bulk inserts at all if this statement uses functions or
1265
1168
should invoke triggers since they may access to the same table too.
1267
table->file->ha_start_bulk_insert((ha_rows) 0);
1170
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1269
restore_record(table,s->default_values); // Get empty record
1172
table->restoreRecordAsDefault(); // Get empty record
1270
1173
table->next_number_field=table->found_next_number_field;
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;
1175
session->cuted_fields=0;
1281
1176
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1282
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1177
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1283
1178
if (info.handle_duplicates == DUP_REPLACE)
1284
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1179
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1285
1180
if (info.handle_duplicates == DUP_UPDATE)
1286
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1287
thd->abort_on_warning= !info.ignore;
1181
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1182
session->abort_on_warning= !info.ignore;
1288
1183
table->mark_columns_needed_for_insert();
1394
1292
void select_insert::store_values(List<Item> &values)
1396
1294
if (fields->elements)
1397
fill_record(thd, *fields, values, 1);
1295
fill_record(session, *fields, values, true);
1399
fill_record(thd, table->field, values, 1);
1297
fill_record(session, table->field, values, true);
1402
void select_insert::send_error(uint errcode,const char *err)
1300
void select_insert::send_error(uint32_t errcode,const char *err)
1406
1304
my_message(errcode, err, MYF(0));
1427
1324
We must invalidate the table in the query cache before binlog writing
1428
1325
and ha_autocommit_or_rollback.
1430
if (thd->transaction.stmt.modified_non_trans_table)
1431
thd->transaction.all.modified_non_trans_table= true;
1327
if (session->transaction.stmt.modified_non_trans_table)
1328
session->transaction.all.modified_non_trans_table= true;
1433
assert(trans_table || !changed ||
1434
thd->transaction.stmt.modified_non_trans_table);
1330
assert(trans_table || !changed ||
1331
session->transaction.stmt.modified_non_trans_table);
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();
1333
table->cursor->ha_release_auto_increment();
1454
table->file->print_error(error,MYF(0));
1337
table->print_error(error,MYF(0));
1338
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1457
1341
char buff[160];
1458
1342
if (info.ignore)
1459
1343
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1460
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
1344
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1462
1346
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
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);
1347
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1348
session->row_count_func= info.copied + info.deleted + info.updated;
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 :
1350
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1351
session->first_successful_insert_id_in_cur_stmt :
1352
(session->arg_of_last_insert_id_function ?
1353
session->first_successful_insert_id_in_prev_stmt :
1472
1354
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1473
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
1355
session->my_ok((ulong) session->row_count_func,
1356
info.copied + info.deleted + info.touched, id, buff);
1357
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1477
1361
void select_insert::abort() {
1481
1365
If the creation of the table failed (due to a syntax error, for
1482
1366
example), no table will have been opened and therefore 'table'
1504
1388
zero, so no check for that is made.
1506
1390
changed= (info.copied || info.deleted || info.updated);
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;
1391
transactional_table= table->cursor->has_transactions();
1516
1392
assert(transactional_table || !changed ||
1517
thd->transaction.stmt.modified_non_trans_table);
1518
table->file->ha_release_auto_increment();
1393
session->transaction.stmt.modified_non_trans_table);
1394
table->cursor->ha_release_auto_increment();
1397
if (DRIZZLE_INSERT_SELECT_DONE_ENABLED())
1399
DRIZZLE_INSERT_SELECT_DONE(0, info.copied + info.deleted + info.updated);
1545
1426
lock out Pointer to the DRIZZLE_LOCK object for table created
1546
1427
(or open temporary table) will be returned in this
1547
1428
parameter. Since this table is not included in
1548
THD::lock caller is responsible for explicitly
1429
Session::lock caller is responsible for explicitly
1549
1430
unlocking this table.
1553
1434
This function behaves differently for base and temporary tables:
1554
1435
- For base table we assume that either table exists and was pre-opened
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
1436
and locked at openTablesLock() stage (and in this case we just
1437
emit error or warning and return pre-opened Table object) or special
1557
1438
placeholder was put in table cache that guarantees that this table
1558
1439
won't be created or opened until the placeholder will be removed
1559
1440
(so there is an exclusive lock on this table).
1564
1445
SELECT it should be changed before it can be used in other contexts.
1567
non-zero Pointer to TABLE object for table created or opened
1448
non-zero Pointer to Table object for table created or opened
1571
static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
1572
TABLE_LIST *create_table,
1573
Alter_info *alter_info,
1452
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1453
TableList *create_table,
1454
message::Table *table_proto,
1455
AlterInfo *alter_info,
1574
1456
List<Item> *items,
1575
DRIZZLE_LOCK **lock,
1576
TABLEOP_HOOKS *hooks)
1457
bool is_if_not_exists,
1458
DRIZZLE_LOCK **lock)
1578
TABLE tmp_table; // Used during 'Create_field()'
1581
uint select_field_count= items->elements;
1460
Table tmp_table; // Used during 'CreateField()'
1463
uint32_t select_field_count= items->elements;
1582
1464
/* Add selected items to field list */
1583
1465
List_iterator_fast<Item> it(*items);
1585
1467
Field *tmp_field;
1588
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1470
bool lex_identified_temp_table= (table_proto->type() == drizzled::message::Table::TEMPORARY);
1472
if (!(lex_identified_temp_table) &&
1589
1473
create_table->table->db_stat)
1591
/* Table already exists and was open at open_and_lock_tables() stage. */
1592
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1475
/* Table already exists and was open at openTablesLock() stage. */
1476
if (is_if_not_exists)
1594
1478
create_info->table_existed= 1; // Mark that table existed
1595
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1479
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1596
1480
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1597
1481
create_table->table_name);
1598
return(create_table->table);
1482
return create_table->table;
1601
1485
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1605
1489
tmp_table.alias= 0;
1606
1490
tmp_table.timestamp_field= 0;
1607
1491
tmp_table.s= &share;
1608
init_tmp_table_share(thd, &share, "", 0, "", "");
1610
1493
tmp_table.s->db_create_options=0;
1611
1494
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1612
tmp_table.s->db_low_byte_first=
1613
test(create_info->db_type == myisam_hton ||
1614
create_info->db_type == heap_hton);
1495
tmp_table.s->db_low_byte_first=
1496
test(create_info->db_type == myisam_engine ||
1497
create_info->db_type == heap_engine);
1615
1498
tmp_table.null_row= false;
1616
1499
tmp_table.maybe_null= false;
1618
1501
while ((item=it++))
1620
Create_field *cr_field;
1503
CreateField *cr_field;
1621
1504
Field *field, *def_field;
1622
1505
if (item->type() == Item::FUNC_ITEM)
1623
1506
if (item->result_type() != STRING_RESULT)
1626
1509
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1628
field= create_tmp_field(thd, &tmp_table, item, item->type(),
1511
field= create_tmp_field(session, &tmp_table, item, item->type(),
1629
1512
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1632
!(cr_field=new Create_field(field,(item->type() == Item::FIELD_ITEM ?
1515
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1633
1516
((Item_field *)item)->field :
1636
1519
if (item->maybe_null)
1637
1520
cr_field->flags &= ~NOT_NULL_FLAG;
1638
1521
alter_info->create_list.push_back(cr_field);
1524
TableIdentifier identifier(create_table->db,
1525
create_table->table_name,
1526
lex_identified_temp_table ? TEMP_TABLE :
1642
1531
Create and lock table.
1644
1533
Note that we either creating (or opening existing) temporary table or
1645
1534
creating base table on which name we have exclusive lock. So code below
1646
1535
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
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))
1538
if (!mysql_create_table_no_lock(session,
1664
1547
if (create_info->table_existed &&
1665
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1548
!(lex_identified_temp_table))
1668
1551
This means that someone created table underneath server
1670
1553
cluster. We don't have much options but throw an error.
1672
1555
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1676
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1559
if (!(lex_identified_temp_table))
1678
VOID(pthread_mutex_lock(&LOCK_open));
1679
if (reopen_name_locked_table(thd, create_table, false))
1561
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1562
if (session->reopen_name_locked_table(create_table, false))
1681
quick_rm_table(create_info->db_type, create_table->db,
1682
table_case_name(create_info, create_table->table_name),
1564
quick_rm_table(*session, identifier);
1686
1567
table= create_table->table;
1687
VOID(pthread_mutex_unlock(&LOCK_open));
1568
pthread_mutex_unlock(&LOCK_open);
1691
if (!(table= open_table(thd, create_table, thd->mem_root, (bool*) 0,
1692
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1572
if (!(table= session->openTable(create_table, (bool*) 0,
1573
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1693
1574
!create_info->table_existed)
1697
1578
it preparable for open. But let us do close_temporary_table() here
1700
drop_temporary_table(thd, create_table);
1581
session->drop_temporary_table(create_table);
1704
reenable_binlog(thd);
1705
1585
if (!table) // open failed
1709
1589
table->reginfo.lock_type=TL_WRITE;
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))
1590
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1591
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1717
mysql_unlock_tables(thd, *lock);
1595
mysql_unlock_tables(session, *lock);
1721
1599
if (!create_info->table_existed)
1722
drop_open_table(thd, table, create_table->db, create_table->table_name);
1600
session->drop_open_table(table, create_table->db, create_table->table_name);
1730
select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
1609
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1611
bool lex_identified_temp_table= (table_proto->type() == drizzled::message::Table::TEMPORARY);
1732
1613
DRIZZLE_LOCK *extra_lock= NULL;
1735
TABLEOP_HOOKS *hook_ptr= NULL;
1737
1615
For row-based replication, the CREATE-SELECT statement is written
1738
1616
in two pieces: the first one contain the CREATE TABLE statement
1751
1629
slave. Hence, we have to hold on to the CREATE part of the
1752
1630
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);
1791
1637
row-based replication for the statement. If we are creating a
1792
1638
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();
1800
if (!(table= create_table_from_items(thd, create_info, create_table,
1641
if (!(table= create_table_from_items(session, create_info, create_table,
1801
1643
alter_info, &values,
1802
&extra_lock, hook_ptr)))
1803
1646
return(-1); // abort() deletes table
1805
1648
if (extra_lock)
1807
1650
assert(m_plock == NULL);
1809
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1652
if (lex_identified_temp_table)
1810
1653
m_plock= &m_lock;
1812
m_plock= &thd->extra_lock;
1655
m_plock= &session->extra_lock;
1814
1657
*m_plock= extra_lock;
1826
1669
/* Mark all fields that are given values */
1827
1670
for (Field **f= field ; *f ; f++)
1828
bitmap_set_bit(table->write_set, (*f)->field_index);
1671
table->setWriteSet((*f)->field_index);
1830
1673
/* Don't set timestamp if used */
1831
1674
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1832
1675
table->next_number_field=table->found_next_number_field;
1834
restore_record(table,s->default_values); // Get empty record
1835
thd->cuted_fields=0;
1677
table->restoreRecordAsDefault(); // Get empty record
1678
session->cuted_fields=0;
1836
1679
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1837
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1680
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1838
1681
if (info.handle_duplicates == DUP_REPLACE)
1839
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1682
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1840
1683
if (info.handle_duplicates == DUP_UPDATE)
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))
1684
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1685
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1686
session->abort_on_warning= !info.ignore;
1687
if (check_that_all_fields_are_given_values(session, table, table_list))
1846
1689
table->mark_columns_needed_for_insert();
1847
table->file->extra(HA_EXTRA_WRITE_CACHE);
1690
table->cursor->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);
1892
1694
void select_create::store_values(List<Item> &values)
1894
fill_record(thd, field, values, 1);
1696
fill_record(session, field, values, true);
1898
void select_create::send_error(uint errcode,const char *err)
1700
void select_create::send_error(uint32_t errcode,const char *err)
1903
1705
This will execute any rollbacks that are necessary before writing
1968
1768
of the table succeeded or not, since we need to reset the binary
1971
tmp_disable_binlog(thd);
1972
1771
select_insert::abort();
1973
thd->transaction.stmt.modified_non_trans_table= false;
1974
reenable_binlog(thd);
1772
session->transaction.stmt.modified_non_trans_table= false;
1979
mysql_unlock_tables(thd, *m_plock);
1777
mysql_unlock_tables(session, *m_plock);
1980
1778
*m_plock= NULL;
1986
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1987
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1784
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1785
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1988
1786
if (!create_info->table_existed)
1989
drop_open_table(thd, table, create_table->db, create_table->table_name);
1787
session->drop_open_table(table, create_table->db, create_table->table_name);
1788
table= NULL; // Safety
1996
/*****************************************************************************
1997
Instansiate templates
1998
*****************************************************************************/
2000
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
2001
template class List_iterator_fast<List_item>;
2002
#endif /* HAVE_EXPLICIT_TEMPLATE_INSTANTIATION */