26
26
#include <drizzled/sql_load.h>
27
27
#include <drizzled/field/timestamp.h>
28
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;
41
32
Check if insert fields are correct.
165
156
Unmark the timestamp field so that we can check if this is modified
168
timestamp_mark= table->write_set->testAndClear(table->timestamp_field->field_index);
159
timestamp_mark= bitmap_test_and_clear(table->write_set,
160
table->timestamp_field->field_index);
171
163
/* Check the fields we are going to modify */
307
296
ctx_state.restore_state(context, table_list);
310
Fill in the given fields and dump it to the table cursor
299
Fill in the given fields and dump it to the table file
312
301
memset(&info, 0, sizeof(info));
313
302
info.ignore= ignore;
323
312
session->count_cuted_fields= ((values_list.elements == 1 &&
325
CHECK_FIELD_ERROR_FOR_NULL :
314
CHECK_FIELD_ERROR_FOR_NULL :
327
316
session->cuted_fields = 0L;
328
317
table->next_number_field=table->found_next_number_field;
331
320
session->set_proc_info("update");
332
321
if (duplic == DUP_REPLACE)
333
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
322
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
334
323
if (duplic == DUP_UPDATE)
335
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
324
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
337
326
if (duplic != DUP_ERROR || ignore)
338
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
339
table->cursor->ha_start_bulk_insert(values_list.elements);
327
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
328
table->file->ha_start_bulk_insert(values_list.elements);
349
338
if (fields.elements || !value_count)
351
340
table->restoreRecordAsDefault(); // Get empty record
352
if (fill_record(session, fields, *values))
341
if (fill_record(session, fields, *values, 0))
354
343
if (values_list.elements != 1 && ! session->is_error())
370
table->restoreRecordAsDefault(); // Get empty record
372
if (fill_record(session, table->field, *values))
359
if (session->used_tables) // Column used in values()
360
table->restoreRecordAsDefault(); // Get empty record
364
Fix delete marker. No need to restore rest of record since it will
365
be overwritten by fill_record() anyway (and fill_record() does not
366
use default values in this case).
368
table->record[0][0]= table->s->default_values[0];
370
if (fill_record(session, table->field, *values, 0))
374
372
if (values_list.elements != 1 && ! session->is_error())
384
382
// Release latches in case bulk insert takes a long time
385
plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
383
ha_release_temporary_latches(session);
387
385
error=write_record(session, table ,&info);
402
400
Do not do this release if this is a delayed insert, it would steal
403
401
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)
403
table->file->ha_release_auto_increment();
404
if (table->file->ha_end_bulk_insert() && !error)
408
table->print_error(errno,MYF(0));
406
table->file->print_error(my_errno,MYF(0));
411
409
if (duplic != DUP_ERROR || ignore)
412
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
410
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
414
transactional_table= table->cursor->has_transactions();
412
transactional_table= table->file->has_transactions();
416
414
changed= (info.copied || info.deleted || info.updated);
417
if ((changed && error <= 0) || session->transaction.stmt.hasModifiedNonTransData())
415
if ((changed && error <= 0) || session->transaction.stmt.modified_non_trans_table)
419
if (session->transaction.stmt.hasModifiedNonTransData())
420
session->transaction.all.markModifiedNonTransData();
417
if (session->transaction.stmt.modified_non_trans_table)
418
session->transaction.all.modified_non_trans_table= true;
422
assert(transactional_table || !changed || session->transaction.stmt.hasModifiedNonTransData());
420
assert(transactional_table || !changed || session->transaction.stmt.modified_non_trans_table);
425
423
session->set_proc_info("end");
443
441
session->count_cuted_fields= CHECK_FIELD_IGNORE;
444
442
table->auto_increment_field_not_null= false;
445
443
if (duplic == DUP_REPLACE)
446
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
444
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
461
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
459
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
462
460
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
464
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
462
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
465
463
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
466
464
session->row_count_func= info.copied + info.deleted + info.updated;
467
465
session->my_ok((ulong) session->row_count_func,
468
466
info.copied + info.deleted + info.touched, id, buff);
470
468
session->abort_on_warning= 0;
471
DRIZZLE_INSERT_DONE(0, session->row_count_func);
469
DRIZZLE_INSERT_END();
475
473
if (table != NULL)
476
table->cursor->ha_release_auto_increment();
474
table->file->ha_release_auto_increment();
477
475
if (!joins_freed)
478
476
free_underlaid_joins(session, &session->lex->select_lex);
479
477
session->abort_on_warning= 0;
480
DRIZZLE_INSERT_DONE(1, 0);
478
DRIZZLE_INSERT_END();
654
652
if (!select_insert)
656
654
TableList *duplicate;
657
if ((duplicate= unique_table(table_list, table_list->next_global, true)))
655
if ((duplicate= unique_table(session, table_list, table_list->next_global, 1)))
659
657
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->alias);
697
695
then both on update triggers will work instead. Similarly both on
698
696
delete triggers will be invoked if we will delete conflicting records.
700
Sets session->transaction.stmt.modified_non_trans_data to true if table which is updated didn't have
698
Sets session->transaction.stmt.modified_non_trans_table to true if table which is updated didn't have
713
MyBitmap *save_read_set, *save_write_set;
714
uint64_t prev_insert_id= table->cursor->next_insert_id;
711
MY_BITMAP *save_read_set, *save_write_set;
712
uint64_t prev_insert_id= table->file->next_insert_id;
715
713
uint64_t insert_id_for_cur_row= 0;
731
729
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;
732
if (table->file->insert_id_for_cur_row > 0)
733
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;
735
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
738
736
bool is_duplicate_key_error;
739
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
737
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
741
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
739
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
742
740
if (!is_duplicate_key_error)
750
748
goto gok_or_after_err; /* Ignoring a not fatal error, return 0 */
753
if ((int) (key_nr = table->get_dup_key(error)) < 0)
751
if ((int) (key_nr = table->file->get_dup_key(error)) < 0)
755
753
error= HA_ERR_FOUND_DUPP_KEY; /* Database can't find key */
767
765
key_nr == table->s->next_number_index &&
768
766
(insert_id_for_cur_row > 0))
770
if (table->cursor->getEngine()->check_flag(HTON_BIT_DUPLICATE_POS))
768
if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
772
if (table->cursor->rnd_pos(table->record[1],table->cursor->dup_ref))
770
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 */
775
if (table->file->extra(HA_EXTRA_FLUSH_CACHE)) /* Not needed with NISAM */
791
789
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,
790
if ((error=(table->file->index_read_idx_map(table->record[1],key_nr,
793
791
(unsigned char*) key, HA_WHOLE_KEY,
794
792
HA_READ_KEY_EXACT))))
814
table->cursor->restore_auto_increment(prev_insert_id);
812
table->file->restore_auto_increment(prev_insert_id);
815
813
if (table->next_number_field)
816
table->cursor->adjust_next_insert_id_after_explicit_value(
814
table->file->adjust_next_insert_id_after_explicit_value(
817
815
table->next_number_field->val_int());
819
if ((table->cursor->getEngine()->check_flag(HTON_BIT_PARTIAL_COLUMN_READ) &&
817
if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
820
818
!bitmap_is_subset(table->write_set, table->read_set)) ||
821
819
table->compare_record())
823
if ((error=table->cursor->ha_update_row(table->record[1],
821
if ((error=table->file->ha_update_row(table->record[1],
824
822
table->record[0])) &&
825
823
error != HA_ERR_RECORD_IS_THE_SAME)
827
825
if (info->ignore &&
828
!table->cursor->is_fatal_error(error, HA_CHECK_DUP_KEY))
826
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
830
828
goto gok_or_after_err;
843
841
Except if LAST_INSERT_ID(#) was in the INSERT query, which is
844
842
handled separately by Session::arg_of_last_insert_id_function.
846
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row= 0;
844
insert_id_for_cur_row= table->file->insert_id_for_cur_row= 0;
850
848
if (table->next_number_field)
851
table->cursor->adjust_next_insert_id_after_explicit_value(
849
table->file->adjust_next_insert_id_after_explicit_value(
852
850
table->next_number_field->val_int());
871
869
ON UPDATE triggers.
873
871
if (last_uniq_key(table,key_nr) &&
874
!table->cursor->referenced_by_foreign_key() &&
872
!table->file->referenced_by_foreign_key() &&
875
873
(table->timestamp_field_type == TIMESTAMP_NO_AUTO_SET ||
876
874
table->timestamp_field_type == TIMESTAMP_AUTO_SET_ON_BOTH))
878
if ((error=table->cursor->ha_update_row(table->record[1],
876
if ((error=table->file->ha_update_row(table->record[1],
879
877
table->record[0])) &&
880
878
error != HA_ERR_RECORD_IS_THE_SAME)
895
if ((error=table->cursor->ha_delete_row(table->record[1])))
893
if ((error=table->file->ha_delete_row(table->record[1])))
898
if (!table->cursor->has_transactions())
899
session->transaction.stmt.markModifiedNonTransData();
896
if (!table->file->has_transactions())
897
session->transaction.stmt.modified_non_trans_table= true;
900
898
/* Let us attempt do write_row() once more */
904
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
902
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
906
904
Restore column maps if they where replaced during an duplicate key
910
908
table->write_set != save_write_set)
911
909
table->column_bitmaps_set(save_read_set, save_write_set);
913
else if ((error=table->cursor->ha_write_row(table->record[0])))
911
else if ((error=table->file->ha_write_row(table->record[0])))
915
913
if (!info->ignore ||
916
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
914
table->file->is_fatal_error(error, HA_CHECK_DUP))
918
table->cursor->restore_auto_increment(prev_insert_id);
916
table->file->restore_auto_increment(prev_insert_id);
919
917
goto gok_or_after_err;
922
920
after_n_copied_inc:
924
session->record_first_successful_insert_id_in_cur_stmt(table->cursor->insert_id_for_cur_row);
922
session->record_first_successful_insert_id_in_cur_stmt(table->file->insert_id_for_cur_row);
926
924
gok_or_after_err:
929
if (!table->cursor->has_transactions())
930
session->transaction.stmt.markModifiedNonTransData();
927
if (!table->file->has_transactions())
928
session->transaction.stmt.modified_non_trans_table= true;
935
933
/* current_select is NULL if this is a delayed insert */
936
934
if (session->lex->current_select)
937
935
session->lex->current_select->no_error= 0; // Give error
938
table->print_error(error,MYF(0));
936
table->file->print_error(error,MYF(0));
941
table->cursor->restore_auto_increment(prev_insert_id);
939
table->file->restore_auto_increment(prev_insert_id);
944
942
table->column_bitmaps_set(save_read_set, save_write_set);
1153
1151
Is table which we are changing used somewhere in other parts of
1156
if (unique_table(table_list, table_list->next_global))
1154
if (unique_table(session, table_list, table_list->next_global, 0))
1158
1156
/* Using same table for INSERT and SELECT */
1159
1157
lex->current_select->options|= OPTION_BUFFER_RESULT;
1170
1168
We won't start bulk inserts at all if this statement uses functions or
1171
1169
should invoke triggers since they may access to the same table too.
1173
table->cursor->ha_start_bulk_insert((ha_rows) 0);
1171
table->file->ha_start_bulk_insert((ha_rows) 0);
1175
1173
table->restoreRecordAsDefault(); // Get empty record
1176
1174
table->next_number_field=table->found_next_number_field;
1178
1176
session->cuted_fields=0;
1179
1177
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1180
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1178
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1181
1179
if (info.handle_duplicates == DUP_REPLACE)
1182
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1180
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1183
1181
if (info.handle_duplicates == DUP_UPDATE)
1184
table->cursor->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1182
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1185
1183
session->abort_on_warning= !info.ignore;
1186
1184
table->mark_columns_needed_for_insert();
1229
1227
table->next_number_field=0;
1230
1228
table->auto_increment_field_not_null= false;
1231
table->cursor->ha_reset();
1229
table->file->ha_reset();
1233
1231
session->count_cuted_fields= CHECK_FIELD_IGNORE;
1234
1232
session->abort_on_warning= 0;
1256
1254
// Release latches in case bulk insert takes a long time
1257
plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
1255
ha_release_temporary_latches(session);
1259
1257
error= write_record(session, table, &info);
1295
1293
void select_insert::store_values(List<Item> &values)
1297
1295
if (fields->elements)
1298
fill_record(session, *fields, values, true);
1296
fill_record(session, *fields, values, 1);
1300
fill_record(session, table->field, values, true);
1298
fill_record(session, table->field, values, 1);
1303
1301
void select_insert::send_error(uint32_t errcode,const char *err)
1313
1311
bool select_insert::send_eof()
1316
bool const trans_table= table->cursor->has_transactions();
1314
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);
1318
error= table->file->ha_end_bulk_insert();
1319
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1320
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1324
1322
if ((changed= (info.copied || info.deleted || info.updated)))
1327
1325
We must invalidate the table in the query cache before binlog writing
1328
1326
and ha_autocommit_or_rollback.
1330
if (session->transaction.stmt.hasModifiedNonTransData())
1331
session->transaction.all.markModifiedNonTransData();
1328
if (session->transaction.stmt.modified_non_trans_table)
1329
session->transaction.all.modified_non_trans_table= true;
1333
1331
assert(trans_table || !changed ||
1334
session->transaction.stmt.hasModifiedNonTransData());
1332
session->transaction.stmt.modified_non_trans_table);
1336
table->cursor->ha_release_auto_increment();
1334
table->file->ha_release_auto_increment();
1340
table->print_error(error,MYF(0));
1341
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1338
table->file->print_error(error,MYF(0));
1344
1341
char buff[160];
1345
1342
if (info.ignore)
1346
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1343
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1347
1344
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1349
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1346
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1350
1347
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1351
1348
session->row_count_func= info.copied + info.deleted + info.updated;
1357
1354
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1358
1355
session->my_ok((ulong) session->row_count_func,
1359
1356
info.copied + info.deleted + info.touched, id, buff);
1360
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1364
1360
void select_insert::abort() {
1391
1387
zero, so no check for that is made.
1393
1389
changed= (info.copied || info.deleted || info.updated);
1394
transactional_table= table->cursor->has_transactions();
1390
transactional_table= table->file->has_transactions();
1395
1391
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);
1392
session->transaction.stmt.modified_non_trans_table);
1393
table->file->ha_release_auto_increment();
1455
1446
static Table *create_table_from_items(Session *session, HA_CREATE_INFO *create_info,
1456
1447
TableList *create_table,
1457
message::Table &table_proto,
1458
AlterInfo *alter_info,
1448
drizzled::message::Table *table_proto,
1449
Alter_info *alter_info,
1459
1450
List<Item> *items,
1460
bool is_if_not_exists,
1461
DRIZZLE_LOCK **lock,
1462
TableIdentifier &identifier)
1451
DRIZZLE_LOCK **lock)
1464
1453
Table tmp_table; // Used during 'CreateField()'
1465
1454
TableShare share;
1471
1460
Field *tmp_field;
1474
if (not (identifier.isTmp()) && create_table->table->db_stat)
1463
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1464
create_table->table->db_stat)
1476
1466
/* Table already exists and was open at openTablesLock() stage. */
1477
if (is_if_not_exists)
1467
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1479
1469
create_info->table_existed= 1; // Mark that table existed
1480
1470
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1494
1484
tmp_table.s->db_create_options=0;
1495
1485
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;
1486
tmp_table.s->db_low_byte_first=
1487
test(create_info->db_type == myisam_engine ||
1488
create_info->db_type == heap_engine);
1502
1489
tmp_table.null_row= false;
1503
1490
tmp_table.maybe_null= false;
1513
1500
field= item->tmp_table_field_from_field_type(&tmp_table, 0);
1515
1502
field= create_tmp_field(session, &tmp_table, item, item->type(),
1516
(Item ***) 0, &tmp_field, &def_field, false,
1503
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
1519
1506
!(cr_field=new CreateField(field,(item->type() == Item::FIELD_ITEM ?
1520
1507
((Item_field *)item)->field :
1533
1520
should not cause deadlocks or races.
1536
if (not mysql_create_table_no_lock(session,
1523
if (!mysql_create_table_no_lock(session, create_table->db,
1524
create_table->table_name,
1528
select_field_count))
1545
if (create_info->table_existed && not identifier.isTmp())
1530
if (create_info->table_existed &&
1531
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1548
1534
This means that someone created table underneath server
1556
if (not identifier.isTmp())
1542
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1558
1544
pthread_mutex_lock(&LOCK_open); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1559
1545
if (session->reopen_name_locked_table(create_table, false))
1561
quick_rm_table(*session, identifier);
1547
quick_rm_table(create_info->db_type, create_table->db,
1548
create_table->table_name, false);
1564
1551
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)
1556
if (!(table= session->openTable(create_table, (bool*) 0,
1557
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1558
!create_info->table_existed)
1574
1561
This shouldn't happen as creation of temporary table should make
1596
if (not create_info->table_existed)
1597
session->drop_open_table(table, identifier);
1583
if (!create_info->table_existed)
1584
session->drop_open_table(table, create_table->db, create_table->table_name);
1608
1595
DRIZZLE_LOCK *extra_lock= 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.
1597
For row-based replication, the CREATE-SELECT statement is written
1598
in two pieces: the first one contain the CREATE TABLE statement
1599
necessary to create the table and the second part contain the rows
1600
that should go into the table.
1602
For non-temporary tables, the start of the CREATE-SELECT
1603
implicitly commits the previous transaction, and all events
1604
forming the statement will be stored the transaction cache. At end
1605
of the statement, the entire statement is committed as a
1606
transaction, and all events are written to the binary log.
1608
On the master, the table is locked for the duration of the
1609
statement, but since the CREATE part is replicated as a simple
1610
statement, there is no way to lock the table for accesses on the
1611
slave. Hence, we have to hold on to the CREATE part of the
1612
statement until the statement has finished.
1621
if (not (table= create_table_from_items(session, create_info, create_table,
1623
alter_info, &values,
1625
&extra_lock, identifier)))
1618
Start a statement transaction before the create if we are using
1619
row-based replication for the statement. If we are creating a
1620
temporary table, we need to start a statement transaction.
1623
if (!(table= create_table_from_items(session, create_info, create_table,
1625
alter_info, &values,
1626
1627
return(-1); // abort() deletes table
1628
1629
if (extra_lock)
1630
1631
assert(m_plock == NULL);
1632
if (identifier.isTmp())
1633
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1633
1634
m_plock= &m_lock;
1635
1636
m_plock= &session->extra_lock;
1657
1658
table->restoreRecordAsDefault(); // Get empty record
1658
1659
session->cuted_fields=0;
1659
1660
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1660
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1661
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1661
1662
if (info.handle_duplicates == DUP_REPLACE)
1662
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1663
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1663
1664
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);
1665
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1666
table->file->ha_start_bulk_insert((ha_rows) 0);
1666
1667
session->abort_on_warning= !info.ignore;
1667
1668
if (check_that_all_fields_are_given_values(session, table, table_list))
1669
1670
table->mark_columns_needed_for_insert();
1670
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1671
table->file->extra(HA_EXTRA_WRITE_CACHE);
1674
1675
void select_create::store_values(List<Item> &values)
1676
fill_record(session, field, values, true);
1677
fill_record(session, field, values, 1);
1680
1681
void select_create::send_error(uint32_t errcode,const char *err)
1683
1686
This will execute any rollbacks that are necessary before writing
1684
1687
the transcation cache.
1711
1714
if (!table->s->tmp_table)
1713
TransactionServices &transaction_services= TransactionServices::singleton();
1714
transaction_services.ha_autocommit_or_rollback(session, 0);
1716
ha_autocommit_or_rollback(session, 0);
1715
1717
(void) session->endActiveTransaction();
1718
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1719
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1720
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1721
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1722
1724
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);
1765
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1766
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1767
if (!create_info->table_existed)
1768
session->drop_open_table(table, create_table->db, create_table->table_name);
1763
1769
table= NULL; // Safety
1767
} /* namespace drizzled */
1774
/*****************************************************************************
1775
Instansiate templates
1776
*****************************************************************************/
1778
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
1779
template class List_iterator_fast<List_item>;
1780
#endif /* HAVE_EXPLICIT_TEMPLATE_INSTANTIATION */