407
435
Do not do this release if this is a delayed insert, it would steal
408
436
auto_inc values from the delayed_insert thread as they share Table.
410
table->cursor->ha_release_auto_increment();
411
if (table->cursor->ha_end_bulk_insert() && !error)
438
table->file->ha_release_auto_increment();
439
if (table->file->ha_end_bulk_insert() && !error)
413
table->print_error(errno,MYF(0));
441
table->file->print_error(my_errno,MYF(0));
416
444
if (duplic != DUP_ERROR || ignore)
417
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
419
transactional_table= table->cursor->has_transactions();
421
changed= (info.copied || info.deleted || info.updated);
422
if ((changed && error <= 0) || session->transaction.stmt.hasModifiedNonTransData())
424
if (session->transaction.stmt.hasModifiedNonTransData())
425
session->transaction.all.markModifiedNonTransData();
427
assert(transactional_table || !changed || session->transaction.stmt.hasModifiedNonTransData());
445
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
447
transactional_table= table->file->has_transactions();
449
if ((changed= (info.copied || info.deleted || info.updated)))
452
Invalidate the table in the query cache if something changed.
453
For the transactional algorithm to work the invalidation must be
454
before binlog writing and ha_autocommit_or_rollback
457
if ((changed && error <= 0) || thd->transaction.stmt.modified_non_trans_table || was_insert_delayed)
459
if (mysql_bin_log.is_open())
464
[Guilhem wrote] Temporary errors may have filled
465
thd->net.last_error/errno. For example if there has
466
been a disk full error when writing the row, and it was
467
MyISAM, then thd->net.last_error/errno will be set to
468
"disk full"... and the my_pwrite() will wait until free
469
space appears, and so when it finishes then the
470
write_row() was entirely successful
472
/* todo: consider removing */
477
A query which per-row-loop can not be interrupted with
478
KILLED, like INSERT, and that does not invoke stored
479
routines can be binlogged with neglecting the KILLED error.
481
If there was no error (error == zero) until after the end of
482
inserting loop the KILLED flag that appeared later can be
483
disregarded since previously possible invocation of stored
484
routines did not result in any error due to the KILLED. In
485
such case the flag is ignored for constructing binlog event.
487
assert(thd->killed != THD::KILL_BAD_DATA || error > 0);
488
if (thd->binlog_query(THD::ROW_QUERY_TYPE,
489
thd->query, thd->query_length,
490
transactional_table, false,
491
(error>0) ? thd->killed : THD::NOT_KILLED) &&
497
if (thd->transaction.stmt.modified_non_trans_table)
498
thd->transaction.all.modified_non_trans_table= true;
500
assert(transactional_table || !changed ||
501
thd->transaction.stmt.modified_non_trans_table);
430
session->set_proc_info("end");
504
thd->set_proc_info("end");
432
506
We'll report to the client this id:
433
507
- if the table contains an autoincrement column and we successfully
438
512
inserted, the id of the last "inserted" row (if IGNORE, that value may not
439
513
have been really inserted but ignored).
441
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
442
session->first_successful_insert_id_in_cur_stmt :
443
(session->arg_of_last_insert_id_function ?
444
session->first_successful_insert_id_in_prev_stmt :
515
id= (thd->first_successful_insert_id_in_cur_stmt > 0) ?
516
thd->first_successful_insert_id_in_cur_stmt :
517
(thd->arg_of_last_insert_id_function ?
518
thd->first_successful_insert_id_in_prev_stmt :
445
519
((table->next_number_field && info.copied) ?
446
520
table->next_number_field->val_int() : 0));
447
521
table->next_number_field=0;
448
session->count_cuted_fields= CHECK_FIELD_IGNORE;
522
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
449
523
table->auto_increment_field_not_null= false;
450
524
if (duplic == DUP_REPLACE)
451
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
525
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
455
if (values_list.elements == 1 && (!(session->options & OPTION_WARNINGS) ||
456
!session->cuted_fields))
529
if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) ||
458
session->row_count_func= info.copied + info.deleted + info.updated;
459
session->my_ok((ulong) session->row_count_func,
460
info.copied + info.deleted + info.touched, id);
532
thd->row_count_func= info.copied + info.deleted +
533
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
534
info.touched : info.updated);
535
my_ok(thd, (ulong) thd->row_count_func, id);
540
ha_rows updated=((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
541
info.touched : info.updated);
466
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
467
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
543
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
544
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
469
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
470
(ulong) (info.deleted + info.updated), (ulong) session->cuted_fields);
471
session->row_count_func= info.copied + info.deleted + info.updated;
472
session->my_ok((ulong) session->row_count_func,
473
info.copied + info.deleted + info.touched, id, buff);
546
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
547
(ulong) (info.deleted + updated), (ulong) thd->cuted_fields);
548
thd->row_count_func= info.copied + info.deleted + updated;
549
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
475
session->status_var.inserted_row_count+= session->row_count_func;
476
session->abort_on_warning= 0;
477
DRIZZLE_INSERT_DONE(0, session->row_count_func);
551
thd->abort_on_warning= 0;
552
DRIZZLE_INSERT_END();
481
556
if (table != NULL)
482
table->cursor->ha_release_auto_increment();
557
table->file->ha_release_auto_increment();
483
558
if (!joins_freed)
484
free_underlaid_joins(session, &session->lex->select_lex);
485
session->abort_on_warning= 0;
486
DRIZZLE_INSERT_DONE(1, 0);
559
free_underlaid_joins(thd, &thd->lex->select_lex);
560
thd->abort_on_warning= 0;
561
DRIZZLE_INSERT_END();
624
699
table_list->next_local= 0;
625
700
context->resolve_in_table_list_only(table_list);
627
res= check_insert_fields(session, context->table_list, fields, *values,
702
res= check_insert_fields(thd, context->table_list, fields, *values,
628
703
!insert_into_view, &map) ||
629
setup_fields(session, 0, *values, MARK_COLUMNS_READ, 0, 0);
704
setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0);
631
706
if (!res && check_fields)
633
bool saved_abort_on_warning= session->abort_on_warning;
634
session->abort_on_warning= abort_on_warning;
635
res= check_that_all_fields_are_given_values(session,
708
bool saved_abort_on_warning= thd->abort_on_warning;
709
thd->abort_on_warning= abort_on_warning;
710
res= check_that_all_fields_are_given_values(thd,
637
712
context->table_list->table,
638
713
context->table_list);
639
session->abort_on_warning= saved_abort_on_warning;
714
thd->abort_on_warning= saved_abort_on_warning;
642
717
if (!res && duplic == DUP_UPDATE)
644
res= check_update_fields(session, context->table_list, update_fields, &map);
719
res= check_update_fields(thd, context->table_list, update_fields, &map);
647
722
/* Restore the current context. */
648
723
ctx_state.restore_state(context, table_list);
651
res= setup_fields(session, 0, update_values, MARK_COLUMNS_READ, 0, 0);
726
res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
715
int write_record(Session *session, Table *table,CopyInfo *info)
788
int write_record(THD *thd, Table *table,COPY_INFO *info)
718
std::vector<unsigned char> key;
719
MyBitmap *save_read_set, *save_write_set;
720
uint64_t prev_insert_id= table->cursor->next_insert_id;
792
MY_BITMAP *save_read_set, *save_write_set;
793
uint64_t prev_insert_id= table->file->next_insert_id;
721
794
uint64_t insert_id_for_cur_row= 0;
725
798
save_read_set= table->read_set;
726
799
save_write_set= table->write_set;
728
if (info->handle_duplicates == DUP_REPLACE || info->handle_duplicates == DUP_UPDATE)
801
if (info->handle_duplicates == DUP_REPLACE ||
802
info->handle_duplicates == DUP_UPDATE)
730
while ((error=table->cursor->insertRecord(table->getInsertRecord())))
804
while ((error=table->file->ha_write_row(table->record[0])))
734
808
If we do more than one iteration of this loop, from the second one the
735
809
row will have an explicit value in the autoinc field, which was set at
736
810
the first call of handler::update_auto_increment(). So we must save
737
the autogenerated value to avoid session->insert_id_for_cur_row to become
811
the autogenerated value to avoid thd->insert_id_for_cur_row to become
740
if (table->cursor->insert_id_for_cur_row > 0)
741
insert_id_for_cur_row= table->cursor->insert_id_for_cur_row;
814
if (table->file->insert_id_for_cur_row > 0)
815
insert_id_for_cur_row= table->file->insert_id_for_cur_row;
743
table->cursor->insert_id_for_cur_row= insert_id_for_cur_row;
817
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
744
818
bool is_duplicate_key_error;
745
if (table->cursor->is_fatal_error(error, HA_CHECK_DUP))
819
if (table->file->is_fatal_error(error, HA_CHECK_DUP))
747
is_duplicate_key_error= table->cursor->is_fatal_error(error, 0);
821
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
748
822
if (!is_duplicate_key_error)
948
1031
Check that all fields with arn't null_fields are used
949
1032
******************************************************************************/
951
int check_that_all_fields_are_given_values(Session *session, Table *entry,
1034
int check_that_all_fields_are_given_values(THD *thd, Table *entry,
1035
TableList *table_list)
1038
MY_BITMAP *write_set= entry->write_set;
956
for (Field **field=entry->getFields() ; *field ; field++)
1040
for (Field **field=entry->field ; *field ; field++)
958
if (((*field)->isWriteSet()) == false)
961
* If the field doesn't have any default value
962
* and there is no actual value specified in the
963
* INSERT statement, throw error ER_NO_DEFAULT_FOR_FIELD.
965
if (((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
1042
if (!bitmap_is_set(write_set, (*field)->field_index) &&
1043
((*field)->flags & NO_DEFAULT_VALUE_FLAG) &&
966
1044
((*field)->real_type() != DRIZZLE_TYPE_ENUM))
968
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), (*field)->field_name);
975
* However, if an actual NULL value was specified
976
* for the field and the field is a NOT NULL field,
977
* throw ER_BAD_NULL_ERROR.
979
* Per the SQL standard, inserting NULL into a NOT NULL
980
* field requires an error to be thrown.
982
if (((*field)->flags & NOT_NULL_FLAG) &&
985
my_error(ER_BAD_NULL_ERROR, MYF(0), (*field)->field_name);
1049
table_list= table_list->top_table();
1053
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
1054
ER_NO_DEFAULT_FOR_FIELD,
1055
ER(ER_NO_DEFAULT_FOR_FIELD),
1056
(*field)->field_name);
990
return session->abort_on_warning ? err : 0;
1061
return thd->abort_on_warning ? err : 0;
993
1064
/***************************************************************************
1311
1399
bool select_insert::send_eof()
1314
bool const trans_table= table->cursor->has_transactions();
1402
bool const trans_table= table->file->has_transactions();
1318
error= table->cursor->ha_end_bulk_insert();
1319
table->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1320
table->cursor->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1405
THD::killed_state killed_status= thd->killed;
1407
error= table->file->ha_end_bulk_insert();
1408
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1409
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
1322
1411
if ((changed= (info.copied || info.deleted || info.updated)))
1325
1414
We must invalidate the table in the query cache before binlog writing
1326
and autocommitOrRollback.
1415
and ha_autocommit_or_rollback.
1328
if (session->transaction.stmt.hasModifiedNonTransData())
1329
session->transaction.all.markModifiedNonTransData();
1417
if (thd->transaction.stmt.modified_non_trans_table)
1418
thd->transaction.all.modified_non_trans_table= true;
1331
assert(trans_table || !changed ||
1332
session->transaction.stmt.hasModifiedNonTransData());
1420
assert(trans_table || !changed ||
1421
thd->transaction.stmt.modified_non_trans_table);
1334
table->cursor->ha_release_auto_increment();
1424
Write to binlog before commiting transaction. No statement will
1425
be written by the binlog_query() below in RBR mode. All the
1426
events are in the transaction cache and will be written when
1427
ha_autocommit_or_rollback() is issued below.
1429
if (mysql_bin_log.is_open())
1433
thd->binlog_query(THD::ROW_QUERY_TYPE,
1434
thd->query, thd->query_length,
1435
trans_table, false, killed_status);
1437
table->file->ha_release_auto_increment();
1338
table->print_error(error,MYF(0));
1339
DRIZZLE_INSERT_SELECT_DONE(error, 0);
1441
table->file->print_error(error,MYF(0));
1342
1444
char buff[160];
1343
1445
if (info.ignore)
1344
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1345
(ulong) (info.records - info.copied), (ulong) session->cuted_fields);
1446
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1447
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
1347
snprintf(buff, sizeof(buff), ER(ER_INSERT_INFO), (ulong) info.records,
1348
(ulong) (info.deleted+info.updated), (ulong) session->cuted_fields);
1349
session->row_count_func= info.copied + info.deleted + info.updated;
1449
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
1450
(ulong) (info.deleted+info.updated), (ulong) thd->cuted_fields);
1451
thd->row_count_func= info.copied + info.deleted +
1452
((thd->client_capabilities & CLIENT_FOUND_ROWS) ?
1453
info.touched : info.updated);
1351
id= (session->first_successful_insert_id_in_cur_stmt > 0) ?
1352
session->first_successful_insert_id_in_cur_stmt :
1353
(session->arg_of_last_insert_id_function ?
1354
session->first_successful_insert_id_in_prev_stmt :
1455
id= (thd->first_successful_insert_id_in_cur_stmt > 0) ?
1456
thd->first_successful_insert_id_in_cur_stmt :
1457
(thd->arg_of_last_insert_id_function ?
1458
thd->first_successful_insert_id_in_prev_stmt :
1355
1459
(info.copied ? autoinc_value_of_last_inserted_row : 0));
1356
session->my_ok((ulong) session->row_count_func,
1357
info.copied + info.deleted + info.touched, id, buff);
1358
session->status_var.inserted_row_count+= session->row_count_func;
1359
DRIZZLE_INSERT_SELECT_DONE(0, session->row_count_func);
1460
::my_ok(thd, (ulong) thd->row_count_func, id, buff);
1363
1464
void select_insert::abort() {
1367
1468
If the creation of the table failed (due to a syntax error, for
1368
1469
example), no table will have been opened and therefore 'table'
1470
1572
Field *tmp_field;
1473
if (not (identifier.isTmp()) && create_table->table->db_stat)
1575
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
1576
create_table->table->db_stat)
1475
/* Table already exists and was open at openTablesLock() stage. */
1476
if (is_if_not_exists)
1578
/* Table already exists and was open at open_and_lock_tables() stage. */
1579
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
1478
1581
create_info->table_existed= 1; // Mark that table existed
1479
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1582
push_warning_printf(thd, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1480
1583
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
1481
1584
create_table->table_name);
1482
return create_table->table;
1585
return(create_table->table);
1485
1588
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1489
1593
tmp_table.timestamp_field= 0;
1490
tmp_table.setShare(&share);
1492
tmp_table.getMutableShare()->db_create_options= 0;
1493
tmp_table.getMutableShare()->blob_ptr_size= portable_sizeof_char_ptr;
1495
if (not table_proto.engine().name().compare("MyISAM"))
1496
tmp_table.getMutableShare()->db_low_byte_first= true;
1497
else if (not table_proto.engine().name().compare("MEMORY"))
1498
tmp_table.getMutableShare()->db_low_byte_first= true;
1594
tmp_table.s= &share;
1595
init_tmp_table_share(thd, &share, "", 0, "", "");
1597
tmp_table.s->db_create_options=0;
1598
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
1599
tmp_table.s->db_low_byte_first=
1600
test(create_info->db_type == myisam_hton ||
1601
create_info->db_type == heap_hton);
1500
1602
tmp_table.null_row= false;
1501
1603
tmp_table.maybe_null= false;
1503
1605
while ((item=it++))
1505
CreateField *cr_field;
1607
Create_field *cr_field;
1506
1608
Field *field, *def_field;
1507
1609
if (item->type() == Item::FUNC_ITEM)
1508
1610
if (item->result_type() != STRING_RESULT)
1548
1657
cluster. We don't have much options but throw an error.
1550
1659
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_table->table_name);
1554
if (not identifier.isTmp())
1663
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
1556
LOCK_open.lock(); /* CREATE TABLE... has found that the table already exists for insert and is adapting to use it */
1557
if (session->reopen_name_locked_table(create_table, false))
1665
pthread_mutex_lock(&LOCK_open);
1666
if (reopen_name_locked_table(thd, create_table, false))
1559
quick_rm_table(*session, identifier);
1668
quick_rm_table(create_info->db_type, create_table->db,
1669
table_case_name(create_info, create_table->table_name),
1562
1673
table= create_table->table;
1674
pthread_mutex_unlock(&LOCK_open);
1567
if (not (table= session->openTable(create_table, (bool*) 0,
1568
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1569
not create_info->table_existed)
1678
if (!(table= open_table(thd, create_table, (bool*) 0,
1679
DRIZZLE_OPEN_TEMPORARY_ONLY)) &&
1680
!create_info->table_existed)
1572
1683
This shouldn't happen as creation of temporary table should make
1573
1684
it preparable for open. But let us do close_temporary_table() here
1576
session->drop_temporary_table(create_table);
1687
drop_temporary_table(thd, create_table);
1691
reenable_binlog(thd);
1580
1692
if (!table) // open failed
1584
1696
table->reginfo.lock_type=TL_WRITE;
1585
if (! ((*lock)= mysql_lock_tables(session, &table, 1,
1586
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)))
1697
hooks->prelock(&table, 1); // Call prelock hooks
1698
if (! ((*lock)= mysql_lock_tables(thd, &table, 1,
1699
DRIZZLE_LOCK_IGNORE_FLUSH, ¬_used)) ||
1700
hooks->postlock(&table, 1))
1590
mysql_unlock_tables(session, *lock);
1704
mysql_unlock_tables(thd, *lock);
1594
if (not create_info->table_existed)
1595
session->drop_open_table(table, identifier);
1708
if (!create_info->table_existed)
1709
drop_open_table(thd, table, create_table->db, create_table->table_name);
1604
select_create::prepare(List<Item> &values, Select_Lex_Unit *u)
1717
select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
1606
DrizzleLock *extra_lock= NULL;
1719
DRIZZLE_LOCK *extra_lock= NULL;
1722
TABLEOP_HOOKS *hook_ptr= NULL;
1608
For replication, the CREATE-SELECT statement is written
1609
in two pieces: the first transaction messsage contains
1610
the CREATE TABLE statement as a CreateTableStatement message
1611
necessary to create the table.
1613
The second transaction message contains all the InsertStatement
1614
and associated InsertRecords that should go into the table.
1724
For row-based replication, the CREATE-SELECT statement is written
1725
in two pieces: the first one contain the CREATE TABLE statement
1726
necessary to create the table and the second part contain the rows
1727
that should go into the table.
1729
For non-temporary tables, the start of the CREATE-SELECT
1730
implicitly commits the previous transaction, and all events
1731
forming the statement will be stored the transaction cache. At end
1732
of the statement, the entire statement is committed as a
1733
transaction, and all events are written to the binary log.
1735
On the master, the table is locked for the duration of the
1736
statement, but since the CREATE part is replicated as a simple
1737
statement, there is no way to lock the table for accesses on the
1738
slave. Hence, we have to hold on to the CREATE part of the
1739
statement until the statement has finished.
1741
class MY_HOOKS : public TABLEOP_HOOKS {
1743
MY_HOOKS(select_create *x, TableList *create_table,
1744
TableList *select_tables)
1745
: ptr(x), all_tables(*create_table)
1747
all_tables.next_global= select_tables;
1751
virtual int do_postlock(Table **tables, uint32_t count)
1753
THD *thd= const_cast<THD*>(ptr->get_thd());
1754
if (int error= decide_logging_format(thd, &all_tables))
1757
Table const *const table = *tables;
1758
if (thd->current_stmt_binlog_row_based &&
1759
!table->s->tmp_table &&
1760
!ptr->get_create_info()->table_existed)
1762
ptr->binlog_show_create_table(tables, count);
1768
TableList all_tables;
1771
MY_HOOKS hooks(this, create_table, select_tables);
1619
if (not (table= create_table_from_items(session, create_info, create_table,
1621
alter_info, &values,
1623
&extra_lock, identifier)))
1777
Start a statement transaction before the create if we are using
1778
row-based replication for the statement. If we are creating a
1779
temporary table, we need to start a statement transaction.
1781
if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 &&
1782
thd->current_stmt_binlog_row_based)
1784
thd->binlog_start_trans_and_stmt();
1787
if (!(table= create_table_from_items(thd, create_info, create_table,
1788
alter_info, &values,
1789
&extra_lock, hook_ptr)))
1625
1790
return(-1); // abort() deletes table
1628
1792
if (extra_lock)
1630
1794
assert(m_plock == NULL);
1632
if (identifier.isTmp())
1796
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
1633
1797
m_plock= &m_lock;
1635
m_plock= &session->extra_lock;
1799
m_plock= &thd->extra_lock;
1637
1801
*m_plock= extra_lock;
1640
if (table->getShare()->sizeFields() < values.elements)
1804
if (table->s->fields < values.elements)
1642
1806
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1);
1646
1810
/* First field to copy */
1647
field= table->getFields() + table->getShare()->sizeFields() - values.elements;
1811
field= table->field+table->s->fields - values.elements;
1649
1813
/* Mark all fields that are given values */
1650
1814
for (Field **f= field ; *f ; f++)
1651
table->setWriteSet((*f)->field_index);
1815
bitmap_set_bit(table->write_set, (*f)->field_index);
1653
1817
/* Don't set timestamp if used */
1654
1818
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
1655
1819
table->next_number_field=table->found_next_number_field;
1657
table->restoreRecordAsDefault(); // Get empty record
1658
session->cuted_fields=0;
1821
restore_record(table,s->default_values); // Get empty record
1822
thd->cuted_fields=0;
1659
1823
if (info.ignore || info.handle_duplicates != DUP_ERROR)
1660
table->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1824
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
1661
1825
if (info.handle_duplicates == DUP_REPLACE)
1662
table->cursor->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1826
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
1663
1827
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);
1666
session->abort_on_warning= !info.ignore;
1667
if (check_that_all_fields_are_given_values(session, table, table_list))
1828
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
1829
table->file->ha_start_bulk_insert((ha_rows) 0);
1830
thd->abort_on_warning= !info.ignore;
1831
if (check_that_all_fields_are_given_values(thd, table, table_list))
1669
1833
table->mark_columns_needed_for_insert();
1670
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
1834
table->file->extra(HA_EXTRA_WRITE_CACHE);
1839
select_create::binlog_show_create_table(Table **tables, uint32_t count)
1842
Note 1: In RBR mode, we generate a CREATE TABLE statement for the
1843
created table by calling store_create_info() (behaves as SHOW
1844
CREATE TABLE). In the event of an error, nothing should be
1845
written to the binary log, even if the table is non-transactional;
1846
therefore we pretend that the generated CREATE TABLE statement is
1847
for a transactional table. The event will then be put in the
1848
transaction cache, and any subsequent events (e.g., table-map
1849
events and binrow events) will also be put there. We can then use
1850
ha_autocommit_or_rollback() to either throw away the entire
1851
kaboodle of events, or write them to the binary log.
1853
We write the CREATE TABLE statement here and not in prepare()
1854
since there potentially are sub-selects or accesses to information
1855
schema that will do a close_thread_tables(), destroying the
1856
statement transaction cache.
1858
assert(thd->current_stmt_binlog_row_based);
1859
assert(tables && *tables && count > 0);
1862
String query(buf, sizeof(buf), system_charset_info);
1864
TableList tmp_table_list;
1866
memset(&tmp_table_list, 0, sizeof(tmp_table_list));
1867
tmp_table_list.table = *tables;
1868
query.length(0); // Have to zero it since constructor doesn't
1870
result= store_create_info(thd, &tmp_table_list, &query, create_info);
1871
assert(result == 0); /* store_create_info() always return 0 */
1873
thd->binlog_query(THD::STMT_QUERY_TYPE,
1874
query.ptr(), query.length(),
1875
/* is_trans */ true,
1876
/* suppress_use */ false);
1674
1879
void select_create::store_values(List<Item> &values)
1676
fill_record(session, field, values, true);
1881
fill_record(thd, field, values, 1);
1680
1885
void select_create::send_error(uint32_t errcode,const char *err)
1683
1890
This will execute any rollbacks that are necessary before writing
1684
1891
the transcation cache.