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>
20
26
#include <drizzled/sql_select.h>
21
27
#include <drizzled/show.h>
28
#include <drizzled/replication/mi.h>
22
29
#include <drizzled/error.h>
23
30
#include <drizzled/name_resolution_context_state.h>
31
#include <drizzled/slave.h>
32
#include <drizzled/sql_parse.h>
24
33
#include <drizzled/probes.h>
34
#include <drizzled/tableop_hooks.h>
25
35
#include <drizzled/sql_base.h>
26
36
#include <drizzled/sql_load.h>
27
37
#include <drizzled/field/timestamp.h>
28
#include <drizzled/lock.h>
29
#include "drizzled/sql_table.h"
30
#include "drizzled/pthread_globals.h"
31
#include "drizzled/transaction_services.h"
32
#include "drizzled/plugin/transactional_storage_engine.h"
37
extern plugin::StorageEngine *heap_engine;
38
extern plugin::StorageEngine *myisam_engine;
39
/* Define to force use of my_malloc() if the allocated memory block is big */
42
#define my_safe_alloca(size, min_length) my_alloca(size)
43
#define my_safe_afree(ptr, size, min_length) my_afree(ptr)
45
#define my_safe_alloca(size, min_length) ((size <= min_length) ? my_alloca(size) : malloc(size))
46
#define my_safe_afree(ptr, size, min_length) if (size > min_length) free(ptr)
41
52
Check if insert fields are correct.
120
131
if (table->timestamp_field) // Don't automaticly set timestamp if used
122
if (table->timestamp_field->isWriteSet())
133
if (bitmap_is_set(table->write_set,
134
table->timestamp_field->field_index))
123
135
clear_timestamp_auto_bits(table->timestamp_field_type,
124
136
TIMESTAMP_AUTO_SET_ON_INSERT);
127
table->setWriteSet(table->timestamp_field->field_index);
139
bitmap_set_bit(table->write_set,
140
table->timestamp_field->field_index);
143
/* Mark all virtual columns for write*/
145
table->mark_virtual_columns();
247
267
upgrade_lock_type(session, &table_list->lock_type, duplic,
248
268
values_list.elements > 1);
250
if (session->openTablesLock(table_list))
271
We can't write-delayed into a table locked with LOCK TABLES:
272
this will lead to a deadlock, since the delayed thread will
273
never be able to get a lock on the table. QQQ: why not
274
upgrade the lock here instead?
276
if (table_list->lock_type == TL_WRITE_DELAYED && session->locked_tables &&
277
find_locked_table(session, table_list->db, table_list->table_name))
252
DRIZZLE_INSERT_DONE(1, 0);
279
my_error(ER_DELAYED_INSERT_TABLE_LOCKED, MYF(0),
280
table_list->table_name);
285
if (open_and_lock_tables(session, table_list))
256
288
lock_type= table_list->lock_type;
258
290
session->set_proc_info("init");
323
355
session->count_cuted_fields= ((values_list.elements == 1 &&
325
CHECK_FIELD_ERROR_FOR_NULL :
357
CHECK_FIELD_ERROR_FOR_NULL :
327
359
session->cuted_fields = 0L;
328
360
table->next_number_field=table->found_next_number_field;
362
if (session->slave_thread &&
363
(info.handle_duplicates == DUP_UPDATE) &&
364
(table->next_number_field != NULL) &&
365
rpl_master_has_bug(&active_mi->rli, 24432))
331
369
session->set_proc_info("update");
332
370
if (duplic == DUP_REPLACE)
333
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
371
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
334
372
if (duplic == DUP_UPDATE)
335
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
373
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
337
375
if (duplic != DUP_ERROR || ignore)
338
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
339
table->cursor->ha_start_bulk_insert(values_list.elements);
376
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
377
table->file->ha_start_bulk_insert(values_list.elements);
370
table->restoreRecordAsDefault(); // Get empty record
372
if (fill_record(session, table->field, *values))
408
if (session->used_tables) // Column used in values()
409
restore_record(table,s->default_values); // Get empty record
413
Fix delete marker. No need to restore rest of record since it will
414
be overwritten by fill_record() anyway (and fill_record() does not
415
use default values in this case).
417
table->record[0][0]= table->s->default_values[0];
419
if (fill_record(session, table->field, *values, 0))
374
421
if (values_list.elements != 1 && ! session->is_error())
402
446
Do not do this release if this is a delayed insert, it would steal
403
447
auto_inc values from the delayed_insert thread as they share Table.
405
table->cursor->ha_release_auto_increment();
406
if (table->cursor->ha_end_bulk_insert() && !error)
449
table->file->ha_release_auto_increment();
450
if (table->file->ha_end_bulk_insert() && !error)
408
table->print_error(errno,MYF(0));
452
table->file->print_error(my_errno,MYF(0));
411
455
if (duplic != DUP_ERROR || ignore)
412
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
414
transactional_table= table->cursor->has_transactions();
416
changed= (info.copied || info.deleted || info.updated);
417
if ((changed && error <= 0) || session->transaction.stmt.hasModifiedNonTransData())
419
if (session->transaction.stmt.hasModifiedNonTransData())
420
session->transaction.all.markModifiedNonTransData();
422
assert(transactional_table || !changed || session->transaction.stmt.hasModifiedNonTransData());
456
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
458
transactional_table= table->file->has_transactions();
460
if ((changed= (info.copied || info.deleted || info.updated)))
463
Invalidate the table in the query cache if something changed.
464
For the transactional algorithm to work the invalidation must be
465
before binlog writing and ha_autocommit_or_rollback
468
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table || was_insert_delayed)
470
if (drizzle_bin_log.is_open())
475
[Guilhem wrote] Temporary errors may have filled
476
session->net.last_error/errno. For example if there has
477
been a disk full error when writing the row, and it was
478
MyISAM, then session->net.last_error/errno will be set to
479
"disk full"... and the my_pwrite() will wait until free
480
space appears, and so when it finishes then the
481
write_row() was entirely successful
483
/* todo: consider removing */
484
session->clear_error();
488
A query which per-row-loop can not be interrupted with
489
KILLED, like INSERT, and that does not invoke stored
490
routines can be binlogged with neglecting the KILLED error.
492
If there was no error (error == zero) until after the end of
493
inserting loop the KILLED flag that appeared later can be
494
disregarded since previously possible invocation of stored
495
routines did not result in any error due to the KILLED. In
496
such case the flag is ignored for constructing binlog event.
498
assert(session->killed != Session::KILL_BAD_DATA || error > 0);
499
if (session->binlog_query(Session::ROW_QUERY_TYPE,
500
session->query, session->query_length,
501
transactional_table, false,
502
(error>0) ? session->killed : Session::NOT_KILLED) &&
508
if (session->transaction.stmt.modified_non_trans_table)
509
session->transaction.all.modified_non_trans_table= true;
511
assert(transactional_table || !changed ||
512
session->transaction.stmt.modified_non_trans_table);
425
515
session->set_proc_info("end");
443
533
session->count_cuted_fields= CHECK_FIELD_IGNORE;
444
534
table->auto_increment_field_not_null= false;
445
535
if (duplic == DUP_REPLACE)
446
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
536
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
450
540
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
451
541
!session->cuted_fields))
453
session->row_count_func= info.copied + info.deleted + info.updated;
454
session->my_ok((ulong) session->row_count_func,
455
info.copied + info.deleted + info.touched, id);
543
session->row_count_func= info.copied + info.deleted +
544
((session->client_capabilities & CLIENT_FOUND_ROWS) ?
545
info.touched : info.updated);
546
my_ok(session, (ulong) session->row_count_func, id);
551
ha_rows updated=((session->client_capabilities & CLIENT_FOUND_ROWS) ?
552
info.touched : info.updated);
461
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
554
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
462
555
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
464
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
465
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
466
session->row_count_func= info.copied + info.deleted + info.updated;
467
session->my_ok((ulong) session->row_count_func,
468
info.copied + info.deleted + info.touched, id, buff);
557
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
558
(ulong) (info.deleted + updated), (ulong) session->cuted_fields);
559
session->row_count_func= info.copied + info.deleted + updated;
560
::my_ok(session, (ulong) session->row_count_func, id, buff);
470
562
session->abort_on_warning= 0;
471
DRIZZLE_INSERT_DONE(0, session->row_count_func);
563
DRIZZLE_INSERT_END();
475
567
if (table != NULL)
476
table->cursor->ha_release_auto_increment();
568
table->file->ha_release_auto_increment();
477
569
if (!joins_freed)
478
570
free_underlaid_joins(session, &session->lex->select_lex);
479
571
session->abort_on_warning= 0;
480
DRIZZLE_INSERT_DONE(1, 0);
572
DRIZZLE_INSERT_END();
530
622
session Thread handler
531
623
table_list Global/local table list
532
624
table Table to insert into (can be NULL if table should
533
be taken from table_list->table)
625
be taken from table_list->table)
534
626
where Where clause (for insert ... select)
535
627
select_insert true if INSERT ... SELECT statement
536
check_fields true if need to check that all INSERT fields are
628
check_fields true if need to check that all INSERT fields are
538
abort_on_warning whether to report if some INSERT field is not
630
abort_on_warning whether to report if some INSERT field is not
539
631
assigned as an error (true) or as a warning (false).
541
633
TODO (in far future)
557
649
Table *table, List<Item> &fields, List_item *values,
558
650
List<Item> &update_fields, List<Item> &update_values,
559
651
enum_duplicates duplic,
652
COND **where __attribute__((unused)),
561
653
bool select_insert,
562
654
bool check_fields, bool abort_on_warning)
564
Select_Lex *select_lex= &session->lex->select_lex;
656
SELECT_LEX *select_lex= &session->lex->select_lex;
565
657
Name_resolution_context *context= &select_lex->context;
566
658
Name_resolution_context_state ctx_state;
567
659
bool insert_into_view= (0 != 0);
569
661
table_map map= 0;
571
663
/* INSERT should have a SELECT or VALUES clause */
572
664
assert (!select_insert || !values);
575
667
For subqueries in VALUES() we should not see the table in which we are
576
668
inserting (for INSERT ... SELECT this is done by changing table_list,
577
because INSERT ... SELECT share Select_Lex it with SELECT.
669
because INSERT ... SELECT share SELECT_LEX it with SELECT.
579
671
if (!select_insert)
581
for (Select_Lex_Unit *un= select_lex->first_inner_unit();
673
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit();
583
675
un= un->next_unit())
585
for (Select_Lex *sl= un->first_select();
677
for (SELECT_LEX *sl= un->first_select();
587
679
sl= sl->next_select())
713
MyBitmap *save_read_set, *save_write_set;
714
uint64_t prev_insert_id= table->cursor->next_insert_id;
803
MY_BITMAP *save_read_set, *save_write_set;
804
uint64_t prev_insert_id= table->file->next_insert_id;
715
805
uint64_t insert_id_for_cur_row= 0;
719
809
save_read_set= table->read_set;
720
810
save_write_set= table->write_set;
722
if (info->handle_duplicates == DUP_REPLACE || info->handle_duplicates == DUP_UPDATE)
812
if (info->handle_duplicates == DUP_REPLACE ||
813
info->handle_duplicates == DUP_UPDATE)
724
while ((error=table->cursor->ha_write_row(table->record[0])))
815
while ((error=table->file->ha_write_row(table->record[0])))
731
822
the autogenerated value to avoid session->insert_id_for_cur_row to become
734
if (table->cursor->insert_id_for_cur_row > 0)
735
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row;
825
if (table->file->insert_id_for_cur_row > 0)
826
insert_id_for_cur_row= table->file->insert_id_for_cur_row;
737
table->cursor->insert_id_for_cur_row= insert_id_for_cur_row;
828
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
738
829
bool is_duplicate_key_error;
739
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
830
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
741
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
832
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
742
833
if (!is_duplicate_key_error)
767
858
key_nr == table->s->next_number_index &&
768
859
(insert_id_for_cur_row > 0))
770
if (table->cursor->getEngine()->check_flag(HTON_BIT_DUPLICATE_POS))
861
if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
772
if (table->cursor->rnd_pos(table->record[1],table->cursor->dup_ref))
863
if (table->file->rnd_pos(table->record[1],table->file->dup_ref))
777
if (table->cursor->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
868
if (table->file->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
785
if (!(key=(char*) malloc(table->s->max_unique_length)))
876
if (!(key=(char*) my_safe_alloca(table->s->max_unique_length,
791
883
key_copy((unsigned char*) key,table->record[0],table->key_info+key_nr,0);
792
if ((error=(table->cursor->index_read_idx_map(table->record[1],key_nr,
884
if ((error=(table->file->index_read_idx_map(table->record[1],key_nr,
793
885
(unsigned char*) key, HA_WHOLE_KEY,
794
886
HA_READ_KEY_EXACT))))
814
table->cursor->restore_auto_increment(prev_insert_id);
906
table->file->restore_auto_increment(prev_insert_id);
815
907
if (table->next_number_field)
816
table->cursor->adjust_next_insert_id_after_explicit_value(
908
table->file->adjust_next_insert_id_after_explicit_value(
817
909
table->next_number_field->val_int());
819
if ((table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ) &&
911
if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
820
912
!bitmap_is_subset(table->write_set, table->read_set)) ||
821
913
table->compare_record())
823
if ((error=table->cursor->ha_update_row(table->record[1],
915
if ((error=table->file->ha_update_row(table->record[1],
824
916
table->record[0])) &&
825
917
error != HA_ERR_RECORD_IS_THE_SAME)
827
919
if (info->ignore &&
828
!table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
920
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
830
922
goto gok_or_after_err;
910
1002
table->write_set != save_write_set)
911
1003
table->column_bitmaps_set(save_read_set, save_write_set);
913
else if ((error=table->cursor->ha_write_row(table->record[0])))
1005
else if ((error=table->file->ha_write_row(table->record[0])))
915
1007
if (!info->ignore ||
916
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
1008
table->file->is_fatal_error(error, HA_CHECK_DUP))
918
table->cursor->restore_auto_increment(prev_insert_id);
1010
table->file->restore_auto_increment(prev_insert_id);
919
1011
goto gok_or_after_err;
922
1014
after_n_copied_inc:
924
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
1016
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
926
1018
gok_or_after_err:
929
if (!table->cursor->has_transactions())
930
session->transaction.stmt.markModifiedNonTransData();
1020
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
1021
if (!table->file->has_transactions())
1022
session->transaction.stmt.modified_non_trans_table= true;
935
1027
/* current_select is NULL if this is a delayed insert */
936
1028
if (session->lex->current_select)
937
1029
session->lex->current_select->no_error= 0; // Give error
938
table->print_error(error,MYF(0));
1030
table->file->print_error(error,MYF(0));
941
table->cursor->restore_auto_increment(prev_insert_id);
1033
table->file->restore_auto_increment(prev_insert_id);
1035
my_safe_afree(key, table->s->max_unique_length, MAX_KEY_LENGTH);
944
1036
table->column_bitmaps_set(save_read_set, save_write_set);
951
1043
******************************************************************************/
953
1045
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1046
TableList *table_list)
1049
MY_BITMAP *write_set= entry->write_set;
958
1051
for (Field **field=entry->field ; *field ; field++)
960
if (((*field)->isWriteSet()) == false)
963
* If the field doesn't have any default value
964
* and there is no actual value specified in the
965
* INSERT statement, throw error ER_NO_DEFAULT_FOR_FIELD.
967
if (((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
1053
if (!bitmap_is_set(write_set, (*field)->field_index) &&
1054
((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
968
1055
((*field)->real_type() != DRIZZLE_TYPE_ENUM))
970
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), (*field)->field_name);
977
* However, if an actual NULL value was specified
978
* for the field and the field is a NOT NULL field,
979
* throw ER_BAD_NULL_ERROR.
981
* Per the SQL standard, inserting NULL into a NOT NULL
982
* field requires an error to be thrown.
984
if (((*field)->flags & NOT_NULL_FLAG) &&
987
my_error(ER_BAD_NULL_ERROR, MYF(0), (*field)->field_name);
1060
table_list= table_list->top_table();
1064
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
1065
ER_NO_DEFAULT_FOR_FIELD,
1066
ER(ER_NO_DEFAULT_FOR_FIELD),
1067
(*field)->field_name);
992
1072
return session->abort_on_warning ? err : 0;
1012
1092
bool mysql_insert_select_prepare(Session *session)
1014
1094
LEX *lex= session->lex;
1015
Select_Lex *select_lex= &lex->select_lex;
1095
SELECT_LEX *select_lex= &lex->select_lex;
1018
Select_Lex do not belong to INSERT statement, so we can't add WHERE
1098
SELECT_LEX do not belong to INSERT statement, so we can't add WHERE
1019
1099
clause if table is VIEW
1022
1102
if (mysql_prepare_insert(session, lex->query_tables,
1023
1103
lex->query_tables->table, lex->field_list, 0,
1024
1104
lex->update_list, lex->value_list,
1162
1242
else if (!(lex->current_select->options & OPTION_BUFFER_RESULT))
1165
We must not yet prepare the result table if it is the same as one of the
1166
source tables (INSERT SELECT). The preparation may disable
1245
We must not yet prepare the result table if it is the same as one of the
1246
source tables (INSERT SELECT). The preparation may disable
1167
1247
indexes on the result table, which may be used during the select, if it
1168
1248
is the same table (Bug #6034). Do the preparation after the select phase
1169
1249
in select_insert::prepare2().
1170
1250
We won't start bulk inserts at all if this statement uses functions or
1171
1251
should invoke triggers since they may access to the same table too.
1173
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1253
table->file->ha_start_bulk_insert((ha_rows) 0);
1175
table->restoreRecordAsDefault(); // Get empty record
1255
restore_record(table,s->default_values); // Get empty record
1176
1256
table->next_number_field=table->found_next_number_field;
1258
if (session->slave_thread &&
1259
(info.handle_duplicates == DUP_UPDATE) &&
1260
(table->next_number_field != NULL) &&
1261
rpl_master_has_bug(&active_mi->rli, 24432))
1178
1264
session->cuted_fields=0;
1179
1265
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1180
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1266
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1181
1267
if (info.handle_duplicates == DUP_REPLACE)
1182
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1268
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1183
1269
if (info.handle_duplicates == DUP_UPDATE)
1184
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1270
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1185
1271
session->abort_on_warning= !info.ignore;
1186
1272
table->mark_columns_needed_for_insert();
1295
1378
void select_insert::store_values(List<Item> &values)
1297
1380
if (fields->elements)
1298
fill_record(session, *fields, values, true);
1381
fill_record(session, *fields, values, 1);
1300
fill_record(session, table->field, values, true);
1383
fill_record(session, table->field, values, 1);
1303
1386
void select_insert::send_error(uint32_t errcode,const char *err)
1307
1390
my_message(errcode, err, MYF(0));
1313
1396
bool select_insert::send_eof()
1316
bool const trans_table= table->cursor->has_transactions();
1399
bool const trans_table= table->file->has_transactions();
1320
error= table->cursor->ha_end_bulk_insert();
1321
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1322
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1402
Session::killed_state killed_status= session->killed;
1404
error= table->file->ha_end_bulk_insert();
1405
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1406
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1324
1408
if ((changed= (info.copied || info.deleted || info.updated)))
1327
1411
We must invalidate the table in the query cache before binlog writing
1328
and autocommitOrRollback.
1412
and ha_autocommit_or_rollback.
1330
if (session->transaction.stmt.hasModifiedNonTransData())
1331
session->transaction.all.markModifiedNonTransData();
1414
if (session->transaction.stmt.modified_non_trans_table)
1415
session->transaction.all.modified_non_trans_table= true;
1333
assert(trans_table || !changed ||
1334
session->transaction.stmt.hasModifiedNonTransData());
1417
assert(trans_table || !changed ||
1418
session->transaction.stmt.modified_non_trans_table);
1336
table->cursor->ha_release_auto_increment();
1421
Write to binlog before commiting transaction. No statement will
1422
be written by the binlog_query() below in RBR mode. All the
1423
events are in the transaction cache and will be written when
1424
ha_autocommit_or_rollback() is issued below.
1426
if (drizzle_bin_log.is_open())
1429
session->clear_error();
1430
session->binlog_query(Session::ROW_QUERY_TYPE,
1431
session->query, session->query_length,
1432
trans_table, false, killed_status);
1434
table->file->ha_release_auto_increment();
1340
table->print_error(error,MYF(0));
1341
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1438
table->file->print_error(error,MYF(0));
1344
1441
char buff[160];
1345
1442
if (info.ignore)
1346
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1443
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1347
1444
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1349
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1446
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1350
1447
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1351
session->row_count_func= info.copied + info.deleted + info.updated;
1448
session->row_count_func= info.copied + info.deleted +
1449
((session->client_capabilities & CLIENT_FOUND_ROWS) ?
1450
info.touched : info.updated);
1353
1452
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1354
1453
session->first_successful_insert_id_in_cur_stmt :
1355
1454
(session->arg_of_last_insert_id_function ?
1356
1455
session->first_successful_insert_id_in_prev_stmt :
1357
1456
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1358
session->my_ok((ulong) session->row_count_func,
1359
info.copied + info.deleted + info.touched, id, buff);
1360
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1457
::my_ok(session, (ulong) session->row_count_func, id, buff);
1364
1461
void select_insert::abort() {
1368
1465
If the creation of the table failed (due to a syntax error, for
1369
1466
example), no table will have been opened and therefore 'table'
1391
1488
zero, so no check for that is made.
1393
1490
changed= (info.copied || info.deleted || info.updated);
1394
transactional_table= table->cursor->has_transactions();
1491
transactional_table= table->file->has_transactions();
1492
if (session->transaction.stmt.modified_non_trans_table)
1494
if (drizzle_bin_log.is_open())
1495
session->binlog_query(Session::ROW_QUERY_TYPE, session->query, session->query_length,
1496
transactional_table, false);
1395
1498
assert(transactional_table || !changed ||
1396
session->transaction.stmt.hasModifiedNonTransData());
1397
table->cursor->ha_release_auto_increment();
1400
if (DRIZZLE_INSERT_SELECT_DONE_ENABLED())
1402
DRIZZLE_INSERT_SELECT_DONE(0, info.copied + info.deleted + info.updated);
1499
session->transaction.stmt.modified_non_trans_table);
1500
table->file->ha_release_auto_increment();
1471
1567
Field *tmp_field;
1474
if (not (identifier.isTmp()) && create_table->table->db_stat)
1570
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1571
create_table->table->db_stat)
1476
/* Table already exists and was open at openTablesLock() stage. */
1477
if (is_if_not_exists)
1573
/* Table already exists and was open at open_and_lock_tables() stage. */
1574
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1479
1576
create_info->table_existed= 1; // Mark that table existed
1480
1577
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1481
1578
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1482
1579
create_table->table_name);
1483
return create_table->table;
1580
return(create_table->table);
1486
1583
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1490
1587
tmp_table.alias= 0;
1491
1588
tmp_table.timestamp_field= 0;
1492
1589
tmp_table.s= &share;
1590
init_tmp_table_share(session, &share, "", 0, "", "");
1494
1592
tmp_table.s->db_create_options=0;
1495
1593
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1497
if (not table_proto.engine().name().compare("MyISAM"))
1498
tmp_table.s->db_low_byte_first= true;
1499
else if (not table_proto.engine().name().compare("MEMORY"))
1500
tmp_table.s->db_low_byte_first= true;
1594
tmp_table.s->db_low_byte_first=
1595
test(create_info->db_type == myisam_hton ||
1596
create_info->db_type == heap_hton);
1502
1597
tmp_table.null_row= false;
1503
1598
tmp_table.maybe_null= false;
1505
1600
while ((item=it++))
1507
CreateField *cr_field;
1602
Create_field *cr_field;
1508
1603
Field *field, *def_field;
1509
1604
if (item->type() == Item::FUNC_ITEM)
1510
1605
if (item->result_type() != STRING_RESULT)
1513
1608
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1515
1610
field= create_tmp_field(session, &tmp_table, item, item->type(),
1516
(Item ***) 0, &tmp_field, &def_field, false,
1611
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1519
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1614
!(cr_field=new Create_field(field,(item->type() == Item::FIELD_ITEM ?
1520
1615
((Item_field *)item)->field :
1523
1618
if (item->maybe_null)
1524
1619
cr_field->flags &= ~NOT_NULL_FLAG;
1525
1620
alter_info->create_list.push_back(cr_field);
1531
1626
Note that we either creating (or opening existing) temporary table or
1532
1627
creating base table on which name we have exclusive lock. So code below
1533
1628
should not cause deadlocks or races.
1630
We don't log the statement, it will be logged later.
1632
If this is a HEAP table, the automatic DELETE FROM which is written to the
1633
binlog when a HEAP table is opened for the first time since startup, must
1634
not be written: 1) it would be wrong (imagine we're in CREATE SELECT: we
1635
don't want to delete from it) 2) it would be written before the CREATE
1636
Table, which is a wrong order. So we keep binary logging disabled when we
1536
if (not mysql_create_table_no_lock(session,
1640
tmp_disable_binlog(session);
1641
if (!mysql_create_table_no_lock(session, create_table->db,
1642
create_table->table_name,
1643
create_info, alter_info, 0,
1644
select_field_count, true))
1545
if (create_info->table_existed && not identifier.isTmp())
1646
if (create_info->table_existed &&
1647
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1548
1650
This means that someone created table underneath server
1550
1652
cluster. We don't have much options but throw an error.
1552
1654
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1556
if (not identifier.isTmp())
1658
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1558
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1559
if (session->reopen_name_locked_table(create_table, false))
1660
pthread_mutex_lock(&LOCK_open);
1661
if (reopen_name_locked_table(session, create_table, false))
1561
quick_rm_table(*session, identifier);
1663
quick_rm_table(create_info->db_type, create_table->db,
1664
table_case_name(create_info, create_table->table_name),
1564
1668
table= create_table->table;
1569
if (not (table= session->openTable(create_table, (bool*) 0,
1570
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1571
not create_info->table_existed)
1673
if (!(table= open_table(session, create_table, (bool*) 0,
1674
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1675
!create_info->table_existed)
1574
1678
This shouldn't happen as creation of temporary table should make
1575
1679
it preparable for open. But let us do close_temporary_table() here
1578
session->drop_temporary_table(create_table);
1682
drop_temporary_table(session, create_table);
1686
reenable_binlog(session);
1582
1687
if (!table) // open failed
1586
1691
table->reginfo.lock_type=TL_WRITE;
1692
hooks->prelock(&table, 1); // Call prelock hooks
1587
1693
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1588
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1694
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)) ||
1695
hooks->postlock(&table, 1))
1596
if (not create_info->table_existed)
1597
session->drop_open_table(table, identifier);
1703
if (!create_info->table_existed)
1704
drop_open_table(session, table, create_table->db, create_table->table_name);
1606
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1712
select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
1608
1714
DRIZZLE_LOCK *extra_lock= NULL;
1717
Tableop_hooks *hook_ptr= NULL;
1610
For replication, the CREATE-SELECT statement is written
1611
in two pieces: the first transaction messsage contains
1612
the CREATE TABLE statement as a CreateTableStatement message
1613
necessary to create the table.
1615
The second transaction message contains all the InsertStatement
1616
and associated InsertRecords that should go into the table.
1719
For row-based replication, the CREATE-SELECT statement is written
1720
in two pieces: the first one contain the CREATE TABLE statement
1721
necessary to create the table and the second part contain the rows
1722
that should go into the table.
1724
For non-temporary tables, the start of the CREATE-SELECT
1725
implicitly commits the previous transaction, and all events
1726
forming the statement will be stored the transaction cache. At end
1727
of the statement, the entire statement is committed as a
1728
transaction, and all events are written to the binary log.
1730
On the master, the table is locked for the duration of the
1731
statement, but since the CREATE part is replicated as a simple
1732
statement, there is no way to lock the table for accesses on the
1733
slave. Hence, we have to hold on to the CREATE part of the
1734
statement until the statement has finished.
1736
class MY_HOOKS : public Tableop_hooks {
1738
MY_HOOKS(select_create *x, TableList *create_table,
1739
TableList *select_tables)
1740
: ptr(x), all_tables(*create_table)
1742
all_tables.next_global= select_tables;
1746
virtual int do_postlock(Table **tables, uint32_t count)
1748
Table const *const table = *tables;
1749
if (drizzle_bin_log.is_open()
1750
&& !table->s->tmp_table
1751
&& !ptr->get_create_info()->table_existed)
1753
ptr->binlog_show_create_table(tables, count);
1759
TableList all_tables;
1762
MY_HOOKS hooks(this, create_table, select_tables);
1621
if (not (table= create_table_from_items(session, create_info, create_table,
1623
alter_info, &values,
1625
&extra_lock, identifier)))
1768
Start a statement transaction before the create if we are using
1769
row-based replication for the statement. If we are creating a
1770
temporary table, we need to start a statement transaction.
1772
if ((session->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0
1773
&& drizzle_bin_log.is_open())
1775
session->binlog_start_trans_and_stmt();
1778
if (!(table= create_table_from_items(session, create_info, create_table,
1779
alter_info, &values,
1780
&extra_lock, hook_ptr)))
1626
1781
return(-1); // abort() deletes table
1628
1783
if (extra_lock)
1630
1785
assert(m_plock == NULL);
1632
if (identifier.isTmp())
1787
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1633
1788
m_plock= &m_lock;
1635
1790
m_plock= &session->extra_lock;
1649
1804
/* Mark all fields that are given values */
1650
1805
for (Field **f= field ; *f ; f++)
1651
table->setWriteSet((*f)->field_index);
1806
bitmap_set_bit(table->write_set, (*f)->field_index);
1653
1808
/* Don't set timestamp if used */
1654
1809
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1655
1810
table->next_number_field=table->found_next_number_field;
1657
table->restoreRecordAsDefault(); // Get empty record
1812
restore_record(table,s->default_values); // Get empty record
1658
1813
session->cuted_fields=0;
1659
1814
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1660
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1815
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1661
1816
if (info.handle_duplicates == DUP_REPLACE)
1662
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1817
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1663
1818
if (info.handle_duplicates == DUP_UPDATE)
1664
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1665
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1819
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1820
table->file->ha_start_bulk_insert((ha_rows) 0);
1666
1821
session->abort_on_warning= !info.ignore;
1667
1822
if (check_that_all_fields_are_given_values(session, table, table_list))
1669
1824
table->mark_columns_needed_for_insert();
1670
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1825
table->file->extra(HA_EXTRA_WRITE_CACHE);
1830
select_create::binlog_show_create_table(Table **tables, uint32_t count)
1833
Note 1: In RBR mode, we generate a CREATE TABLE statement for the
1834
created table by calling store_create_info() (behaves as SHOW
1835
CREATE TABLE). In the event of an error, nothing should be
1836
written to the binary log, even if the table is non-transactional;
1837
therefore we pretend that the generated CREATE TABLE statement is
1838
for a transactional table. The event will then be put in the
1839
transaction cache, and any subsequent events (e.g., table-map
1840
events and binrow events) will also be put there. We can then use
1841
ha_autocommit_or_rollback() to either throw away the entire
1842
kaboodle of events, or write them to the binary log.
1844
We write the CREATE TABLE statement here and not in prepare()
1845
since there potentially are sub-selects or accesses to information
1846
schema that will do a close_thread_tables(), destroying the
1847
statement transaction cache.
1849
assert(tables && *tables && count > 0);
1852
String query(buf, sizeof(buf), system_charset_info);
1854
TableList tmp_table_list;
1856
memset(&tmp_table_list, 0, sizeof(tmp_table_list));
1857
tmp_table_list.table = *tables;
1858
query.length(0); // Have to zero it since constructor doesn't
1860
result= store_create_info(session, &tmp_table_list, &query, create_info);
1861
assert(result == 0); /* store_create_info() always return 0 */
1863
session->binlog_query(Session::STMT_QUERY_TYPE,
1864
query.ptr(), query.length(),
1865
/* is_trans */ true,
1866
/* suppress_use */ false);
1674
1869
void select_create::store_values(List<Item> &values)
1676
fill_record(session, field, values, true);
1871
fill_record(session, field, values, 1);
1680
1875
void select_create::send_error(uint32_t errcode,const char *err)
1683
1880
This will execute any rollbacks that are necessary before writing
1684
1881
the transcation cache.
1711
1910
if (!table->s->tmp_table)
1713
TransactionServices &transaction_services= TransactionServices::singleton();
1714
transaction_services.autocommitOrRollback(session, 0);
1715
(void) session->endActiveTransaction();
1912
ha_autocommit_or_rollback(session, 0);
1913
end_active_trans(session);
1718
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1719
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1916
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1917
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1722
1920
mysql_unlock_tables(session, *m_plock);
1759
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1760
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1761
if (not create_info->table_existed)
1762
session->drop_open_table(table, identifier);
1763
table= NULL; // Safety
1963
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1964
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1965
if (!create_info->table_existed)
1966
drop_open_table(session, table, create_table->db, create_table->table_name);
1767
} /* namespace drizzled */
1973
/*****************************************************************************
1974
Instansiate templates
1975
*****************************************************************************/
1977
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
1978
template class List_iterator_fast<List_item>;
1979
#endif /* HAVE_EXPLICIT_TEMPLATE_INSTANTIATION */