18
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27
#include "drizzled/show.h"
28
#include "drizzled/lock.h"
29
#include "drizzled/session.h"
30
#include "drizzled/statement/alter_table.h"
31
#include "drizzled/global_charset_info.h"
34
#include "drizzled/gettext.h"
35
#include "drizzled/data_home.h"
36
#include "drizzled/sql_table.h"
37
#include "drizzled/table_proto.h"
38
#include "drizzled/optimizer/range.h"
39
#include "drizzled/time_functions.h"
40
#include "drizzled/records.h"
41
#include "drizzled/pthread_globals.h"
42
#include "drizzled/internal/my_sys.h"
43
#include "drizzled/internal/iocache.h"
45
#include "drizzled/transaction_services.h"
47
#include "drizzled/filesort.h"
49
#include "drizzled/message.h"
27
#include <drizzled/show.h>
28
#include <drizzled/lock.h>
29
#include <drizzled/session.h>
30
#include <drizzled/statement/alter_table.h>
31
#include <drizzled/global_charset_info.h>
34
#include <drizzled/gettext.h>
35
#include <drizzled/data_home.h>
36
#include <drizzled/sql_table.h>
37
#include <drizzled/table_proto.h>
38
#include <drizzled/optimizer/range.h>
39
#include <drizzled/time_functions.h>
40
#include <drizzled/records.h>
41
#include <drizzled/pthread_globals.h>
42
#include <drizzled/internal/my_sys.h>
43
#include <drizzled/internal/iocache.h>
44
#include <drizzled/plugin/storage_engine.h>
45
#include <drizzled/copy_field.h>
47
#include <drizzled/transaction_services.h>
49
#include <drizzled/filesort.h>
51
#include <drizzled/message.h>
51
53
using namespace std;
66
68
enum enum_enable_or_disable keys_onoff,
67
69
bool error_if_not_empty);
69
static bool mysql_prepare_alter_table(Session *session,
71
static bool prepare_alter_table(Session *session,
71
73
HA_CREATE_INFO *create_info,
72
74
const message::Table &original_proto,
73
75
message::Table &table_message,
74
76
AlterInfo *alter_info);
76
static int create_temporary_table(Session *session,
77
TableIdentifier &identifier,
78
HA_CREATE_INFO *create_info,
79
message::Table &create_message,
80
AlterInfo *alter_info);
82
static Table *open_alter_table(Session *session, Table *table, TableIdentifier &identifier);
78
static Table *open_alter_table(Session *session, Table *table, identifier::Table &identifier);
82
AlterTable::AlterTable(Session *in_session, Table_ident *ident, drizzled::ha_build_method build_arg) :
83
CreateTable(in_session)
85
in_session->getLex()->sql_command= SQLCOM_ALTER_TABLE;
87
alter_info.build_method= build_arg;
90
} // namespace statement
84
92
bool statement::AlterTable::execute()
86
TableList *first_table= (TableList *) session->lex->select_lex.table_list.first;
87
TableList *all_tables= session->lex->query_tables;
94
TableList *first_table= (TableList *) getSession()->getLex()->select_lex.table_list.first;
95
TableList *all_tables= getSession()->getLex()->query_tables;
88
96
assert(first_table == all_tables && first_table != 0);
89
Select_Lex *select_lex= &session->lex->select_lex;
97
Select_Lex *select_lex= &getSession()->getLex()->select_lex;
90
98
bool need_start_waiting= false;
100
is_engine_set= not createTableMessage().engine().name().empty();
92
102
if (is_engine_set)
95
plugin::StorageEngine::findByName(*session, create_table_message.engine().name());
104
create_info().db_type=
105
plugin::StorageEngine::findByName(*getSession(), createTableMessage().engine().name());
97
if (create_info.db_type == NULL)
107
if (create_info().db_type == NULL)
99
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0),
100
create_table_message.engine().name().c_str());
109
my_error(createTableMessage().engine().name(), ER_UNKNOWN_STORAGE_ENGINE, MYF(0));
136
141
if (not validateCreateTableOption())
139
/* ALTER TABLE ends previous transaction */
140
if (not session->endActiveTransaction())
144
if (getSession()->inTransaction())
146
my_error(ER_TRANSACTIONAL_DDL_NOT_SUPPORTED, MYF(0));
143
if (not (need_start_waiting= not session->wait_if_global_read_lock(0, 1)))
150
if (not (need_start_waiting= not getSession()->wait_if_global_read_lock(0, 1)))
147
154
if (original_table_message->type() == message::Table::STANDARD )
149
TableIdentifier identifier(first_table->getSchemaName(), first_table->getTableName());
150
TableIdentifier new_identifier(select_lex->db ? select_lex->db : first_table->getSchemaName(),
151
session->lex->name.str ? session->lex->name.str : first_table->getTableName());
156
identifier::Table identifier(first_table->getSchemaName(), first_table->getTableName());
157
identifier::Table new_identifier(select_lex->db ? select_lex->db : first_table->getSchemaName(),
158
getSession()->getLex()->name.str ? getSession()->getLex()->name.str : first_table->getTableName());
153
res= alter_table(session,
160
res= alter_table(getSession(),
157
164
*original_table_message,
158
create_table_message,
165
createTableMessage(),
161
168
select_lex->order_list.elements,
162
169
(Order *) select_lex->order_list.first,
163
session->lex->ignore);
170
getSession()->getLex()->ignore);
167
TableIdentifier catch22(first_table->getSchemaName(), first_table->getTableName());
168
Table *table= session->find_temporary_table(catch22);
174
identifier::Table catch22(first_table->getSchemaName(), first_table->getTableName());
175
Table *table= getSession()->find_temporary_table(catch22);
171
TableIdentifier identifier(first_table->getSchemaName(), first_table->getTableName(), table->getMutableShare()->getPath());
172
TableIdentifier new_identifier(select_lex->db ? select_lex->db : first_table->getSchemaName(),
173
session->lex->name.str ? session->lex->name.str : first_table->getTableName(),
174
table->getMutableShare()->getPath());
178
identifier::Table identifier(first_table->getSchemaName(), first_table->getTableName(), table->getMutableShare()->getPath());
179
identifier::Table new_identifier(select_lex->db ? select_lex->db : first_table->getSchemaName(),
180
getSession()->getLex()->name.str ? getSession()->getLex()->name.str : first_table->getTableName(),
181
table->getMutableShare()->getPath());
176
res= alter_table(session,
183
res= alter_table(getSession(),
180
187
*original_table_message,
181
create_table_message,
188
createTableMessage(),
184
191
select_lex->order_list.elements,
185
192
(Order *) select_lex->order_list.first,
186
session->lex->ignore);
193
getSession()->getLex()->ignore);
237
244
Table instructions
238
245
@retval false success
240
static bool mysql_prepare_alter_table(Session *session,
242
HA_CREATE_INFO *create_info,
243
const message::Table &original_proto,
244
message::Table &table_message,
245
AlterInfo *alter_info)
247
static bool prepare_alter_table(Session *session,
249
HA_CREATE_INFO *create_info,
250
const message::Table &original_proto,
251
message::Table &table_message,
252
AlterInfo *alter_info)
247
254
/* New column definitions are added here */
248
255
List<CreateField> new_create_list;
249
256
/* New key definitions are added here */
250
257
List<Key> new_key_list;
251
List_iterator<AlterDrop> drop_it(alter_info->drop_list);
252
List_iterator<CreateField> def_it(alter_info->create_list);
253
List_iterator<AlterColumn> alter_it(alter_info->alter_list);
254
List_iterator<Key> key_it(alter_info->key_list);
255
List_iterator<CreateField> find_it(new_create_list);
256
List_iterator<CreateField> field_it(new_create_list);
258
List<AlterDrop>::iterator drop_it(alter_info->drop_list.begin());
259
List<CreateField>::iterator def_it(alter_info->create_list.begin());
260
List<AlterColumn>::iterator alter_it(alter_info->alter_list.begin());
261
List<Key>::iterator key_it(alter_info->key_list.begin());
262
List<CreateField>::iterator find_it(new_create_list.begin());
263
List<CreateField>::iterator field_it(new_create_list.begin());
257
264
List<Key_part_spec> key_parts;
258
265
uint32_t used_fields= create_info->used_fields;
259
266
KeyInfo *key_info= table->key_info;
696
723
We set this flag so that ha_innobase::open and ::external_lock() do
697
724
not complain when we lock the table
699
session->tablespace_op= true;
700
if (!(table= session->openTableLock(table_list, TL_WRITE)))
726
session->setDoingTablespaceOperation(true);
727
if (not (table= session->openTableLock(table_list, TL_WRITE)))
702
session->tablespace_op= false;
729
session->setDoingTablespaceOperation(false);
706
error= table->cursor->ha_discard_or_import_tablespace(discard);
708
session->set_proc_info("end");
713
/* The ALTER Table is always in its own transaction */
714
error= transaction_services.autocommitOrRollback(session, false);
715
if (not session->endActiveTransaction())
721
write_bin_log(session, *session->getQueryString());
724
(void) transaction_services.autocommitOrRollback(session, error);
725
session->tablespace_op=false;
735
error= table->cursor->ha_discard_or_import_tablespace(discard);
737
session->set_proc_info("end");
742
/* The ALTER Table is always in its own transaction */
743
error= transaction_services.autocommitOrRollback(*session, false);
744
if (not session->endActiveTransaction())
750
write_bin_log(session, *session->getQueryString());
754
(void) transaction_services.autocommitOrRollback(*session, error);
755
session->setDoingTablespaceOperation(false);
970
996
while the fact that the table is still open gives us protection
971
997
from concurrent DDL statements.
973
table::Cache::singleton().mutex().lock(); /* DDL wait for/blocker */
974
wait_while_table_is_used(session, table, HA_EXTRA_FORCE_REOPEN);
975
table::Cache::singleton().mutex().unlock();
1000
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* DDL wait for/blocker */
1001
wait_while_table_is_used(session, table, HA_EXTRA_FORCE_REOPEN);
976
1003
error= table->cursor->ha_enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
977
1005
/* COND_refresh will be signaled in close_thread_tables() */
980
table::Cache::singleton().mutex().lock(); /* DDL wait for/blocker */
981
wait_while_table_is_used(session, table, HA_EXTRA_FORCE_REOPEN);
982
table::Cache::singleton().mutex().unlock();
983
error=table->cursor->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
1010
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* DDL wait for/blocker */
1011
wait_while_table_is_used(session, table, HA_EXTRA_FORCE_REOPEN);
1013
error= table->cursor->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
984
1015
/* COND_refresh will be signaled in close_thread_tables() */
992
1019
if (error == HA_ERR_WRONG_COMMAND)
995
1022
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
996
1023
ER_ILLEGAL_HA, ER(ER_ILLEGAL_HA),
997
1024
table->getAlias());
1000
table::Cache::singleton().mutex().lock(); /* Lock to remove all instances of table from table cache before ALTER */
1027
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* Lock to remove all instances of table from table cache before ALTER */
1002
1029
Unlike to the above case close_cached_table() below will remove ALL
1003
1030
instances of Table from table cache (it will also remove table lock
1004
1031
held by this thread). So to make actual table renaming and writing
1005
1032
to binlog atomic we have to put them into the same critical section
1006
1033
protected by table::Cache::singleton().mutex() mutex. This also removes gap for races between
1007
access() and mysql_rename_table() calls.
1034
access() and rename_table() calls.
1010
if (error == 0 && not (original_table_identifier == new_table_identifier))
1037
if (not error && not (original_table_identifier == new_table_identifier))
1012
1039
session->set_proc_info("rename");
1233
1261
delete new_table;
1236
table::Cache::singleton().mutex().lock(); /* ALTER TABLE */
1239
Data is copied. Now we:
1240
1) Wait until all other threads close old version of table.
1241
2) Close instances of table open by this thread and replace them
1242
with exclusive name-locks.
1243
3) Rename the old table to a temp name, rename the new one to the
1245
4) If we are under LOCK TABLES and don't do ALTER Table ... RENAME
1246
we reopen new version of table.
1247
5) Write statement to the binary log.
1248
6) If we are under LOCK TABLES and do ALTER Table ... RENAME we
1249
remove name-locks from list of open tables and table cache.
1250
7) If we are not not under LOCK TABLES we rely on close_thread_tables()
1251
call to remove name-locks from table cache and list of open table.
1254
session->set_proc_info("rename result table");
1256
snprintf(old_name, sizeof(old_name), "%s2-%lx-%"PRIx64, TMP_FILE_PREFIX, (unsigned long) current_pid, session->thread_id);
1258
my_casedn_str(files_charset_info, old_name);
1260
wait_while_table_is_used(session, table, HA_EXTRA_PREPARE_FOR_RENAME);
1261
session->close_data_files_and_morph_locks(original_table_identifier);
1266
This leads to the storage engine (SE) not being notified for renames in
1267
mysql_rename_table(), because we just juggle with the FRM and nothing
1268
more. If we have an intermediate table, then we notify the SE that
1269
it should become the actual table. Later, we will recycle the old table.
1270
However, in case of ALTER Table RENAME there might be no intermediate
1271
table. This is when the old and new tables are compatible, according to
1272
compare_table(). Then, we need one additional call to
1274
TableIdentifier original_table_to_drop(original_table_identifier.getSchemaName(),
1275
old_name, create_proto.type() != message::Table::TEMPORARY ? message::Table::INTERNAL :
1276
message::Table::TEMPORARY);
1278
if (mysql_rename_table(*session, original_engine, original_table_identifier, original_table_to_drop))
1281
plugin::StorageEngine::dropTable(*session, new_table_as_temporary);
1285
if (mysql_rename_table(*session, new_engine, new_table_as_temporary, new_table_identifier) != 0)
1265
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* ALTER TABLE */
1267
Data is copied. Now we:
1268
1) Wait until all other threads close old version of table.
1269
2) Close instances of table open by this thread and replace them
1270
with exclusive name-locks.
1271
3) Rename the old table to a temp name, rename the new one to the
1273
4) If we are under LOCK TABLES and don't do ALTER Table ... RENAME
1274
we reopen new version of table.
1275
5) Write statement to the binary log.
1276
6) If we are under LOCK TABLES and do ALTER Table ... RENAME we
1277
remove name-locks from list of open tables and table cache.
1278
7) If we are not not under LOCK TABLES we rely on close_thread_tables()
1279
call to remove name-locks from table cache and list of open table.
1282
session->set_proc_info("rename result table");
1284
snprintf(old_name, sizeof(old_name), "%s2-%lx-%"PRIx64, TMP_FILE_PREFIX, (unsigned long) current_pid, session->thread_id);
1286
my_casedn_str(files_charset_info, old_name);
1288
wait_while_table_is_used(session, table, HA_EXTRA_PREPARE_FOR_RENAME);
1289
session->close_data_files_and_morph_locks(original_table_identifier);
1294
This leads to the storage engine (SE) not being notified for renames in
1295
rename_table(), because we just juggle with the FRM and nothing
1296
more. If we have an intermediate table, then we notify the SE that
1297
it should become the actual table. Later, we will recycle the old table.
1298
However, in case of ALTER Table RENAME there might be no intermediate
1299
table. This is when the old and new tables are compatible, according to
1300
compare_table(). Then, we need one additional call to
1302
identifier::Table original_table_to_drop(original_table_identifier.getSchemaName(),
1303
old_name, create_proto.type() != message::Table::TEMPORARY ? message::Table::INTERNAL :
1304
message::Table::TEMPORARY);
1306
drizzled::error_t rename_error= EE_OK;
1307
if (rename_table(*session, original_engine, original_table_identifier, original_table_to_drop))
1287
/* Try to get everything back. */
1290
plugin::StorageEngine::dropTable(*session, new_table_identifier);
1309
error= ER_ERROR_ON_RENAME;
1292
1310
plugin::StorageEngine::dropTable(*session, new_table_as_temporary);
1294
mysql_rename_table(*session, original_engine, original_table_to_drop, original_table_identifier);
1298
plugin::StorageEngine::dropTable(*session, original_table_to_drop);
1305
An error happened while we were holding exclusive name-lock on table
1306
being altered. To be safe under LOCK TABLES we should remove placeholders
1307
from list of open tables list and table cache.
1309
session->unlink_open_table(table);
1310
table::Cache::singleton().mutex().unlock();
1315
table::Cache::singleton().mutex().unlock();
1314
if (rename_table(*session, new_engine, new_table_as_temporary, new_table_identifier) != 0)
1316
/* Try to get everything back. */
1317
rename_error= ER_ERROR_ON_RENAME;
1319
plugin::StorageEngine::dropTable(*session, new_table_identifier);
1321
plugin::StorageEngine::dropTable(*session, new_table_as_temporary);
1323
rename_table(*session, original_engine, original_table_to_drop, original_table_identifier);
1327
plugin::StorageEngine::dropTable(*session, original_table_to_drop);
1334
An error happened while we were holding exclusive name-lock on table
1335
being altered. To be safe under LOCK TABLES we should remove placeholders
1336
from list of open tables list and table cache.
1338
session->unlink_open_table(table);
1317
1344
session->set_proc_info("end");
1480
1506
found_count=delete_count=0;
1484
if (to->getShare()->hasPrimaryKey() && to->cursor->primary_key_is_clustered())
1486
char warn_buff[DRIZZLE_ERRMSG_SIZE];
1487
snprintf(warn_buff, sizeof(warn_buff),
1488
_("order_st BY ignored because there is a user-defined clustered "
1489
"index in the table '%-.192s'"),
1490
from->getMutableShare()->getTableName());
1491
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
1496
FileSort filesort(*session);
1497
from->sort.io_cache= new internal::IO_CACHE;
1499
memset(&tables, 0, sizeof(tables));
1501
tables.setTableName(const_cast<char *>(from->getMutableShare()->getTableName()));
1502
tables.alias= const_cast<char *>(tables.getTableName());
1503
tables.setSchemaName(const_cast<char *>(from->getMutableShare()->getSchemaName()));
1506
if (session->lex->select_lex.setup_ref_array(session, order_num) ||
1507
setup_order(session, session->lex->select_lex.ref_pointer_array,
1508
&tables, fields, all_fields, order) ||
1509
!(sortorder= make_unireg_sortorder(order, &length, NULL)) ||
1510
(from->sort.found_records= filesort.run(from, sortorder, length,
1511
(optimizer::SqlSelect *) 0, HA_POS_ERROR,
1512
1, examined_rows)) == HA_POS_ERROR)
1512
if (to->getShare()->hasPrimaryKey() && to->cursor->primary_key_is_clustered())
1514
char warn_buff[DRIZZLE_ERRMSG_SIZE];
1515
snprintf(warn_buff, sizeof(warn_buff),
1516
_("order_st BY ignored because there is a user-defined clustered "
1517
"index in the table '%-.192s'"),
1518
from->getMutableShare()->getTableName());
1519
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
1519
/* Tell handler that we have values for all columns in the to table */
1520
to->use_all_columns();
1521
info.init_read_record(session, from, (optimizer::SqlSelect *) 0, 1, true);
1523
to->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1524
session->row_count= 0;
1525
to->restoreRecordAsDefault(); // Create empty record
1526
while (!(error=info.read_record(&info)))
1528
if (session->getKilled())
1530
session->send_kill_message();
1534
session->row_count++;
1535
/* Return error if source table isn't empty. */
1536
if (error_if_not_empty)
1541
if (to->next_number_field)
1543
if (auto_increment_field_copied)
1544
to->auto_increment_field_not_null= true;
1546
to->next_number_field->reset();
1549
for (CopyField *copy_ptr= copy; copy_ptr != copy_end ; copy_ptr++)
1551
if (not copy->to_field->hasDefault() and copy->from_null_ptr and *copy->from_null_ptr & copy->from_bit)
1553
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
1554
ER_WARN_DATA_TRUNCATED, 1);
1555
copy->to_field->reset();
1524
FileSort filesort(*session);
1525
from->sort.io_cache= new internal::IO_CACHE;
1528
tables.setTableName(from->getMutableShare()->getTableName());
1529
tables.alias= tables.getTableName();
1530
tables.setSchemaName(const_cast<char *>(from->getMutableShare()->getSchemaName()));
1533
if (session->getLex()->select_lex.setup_ref_array(session, order_num) ||
1534
setup_order(session, session->getLex()->select_lex.ref_pointer_array,
1535
&tables, fields, all_fields, order) ||
1536
!(sortorder= make_unireg_sortorder(order, &length, NULL)) ||
1537
(from->sort.found_records= filesort.run(from, sortorder, length,
1538
(optimizer::SqlSelect *) 0, HA_POS_ERROR,
1539
1, examined_rows)) == HA_POS_ERROR)
1560
copy_ptr->do_copy(copy_ptr);
1546
/* Tell handler that we have values for all columns in the to table */
1547
to->use_all_columns();
1549
error= info.init_read_record(session, from, (optimizer::SqlSelect *) 0, 1, true);
1552
to->print_error(errno, MYF(0));
1568
prev_insert_id= to->cursor->next_insert_id;
1569
error= to->cursor->insertRecord(to->record[0]);
1570
to->auto_increment_field_not_null= false;
1574
if (!ignore || to->cursor->is_fatal_error(error, HA_CHECK_DUP))
1559
to->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1562
session->row_count= 0;
1563
to->restoreRecordAsDefault(); // Create empty record
1564
while (not (error=info.read_record(&info)))
1566
if (session->getKilled())
1568
session->send_kill_message();
1572
session->row_count++;
1573
/* Return error if source table isn't empty. */
1574
if (error_if_not_empty)
1579
if (to->next_number_field)
1581
if (auto_increment_field_copied)
1582
to->auto_increment_field_not_null= true;
1584
to->next_number_field->reset();
1587
for (CopyField *copy_ptr= copy; copy_ptr != copy_end ; copy_ptr++)
1589
if (not copy->to_field->hasDefault() and copy->from_null_ptr and *copy->from_null_ptr & copy->from_bit)
1591
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
1592
ER_WARN_DATA_TRUNCATED, 1);
1593
copy->to_field->reset();
1598
copy_ptr->do_copy(copy_ptr);
1606
prev_insert_id= to->cursor->next_insert_id;
1607
error= to->cursor->insertRecord(to->record[0]);
1608
to->auto_increment_field_not_null= false;
1576
to->print_error(error, MYF(0));
1579
to->cursor->restore_auto_increment(prev_insert_id);
1612
if (!ignore || to->cursor->is_fatal_error(error, HA_CHECK_DUP))
1614
to->print_error(error, MYF(0));
1617
to->cursor->restore_auto_increment(prev_insert_id);
1626
info.end_read_record();
1627
from->free_io_cache();
1628
delete [] copy; // This is never 0
1630
if (to->cursor->ha_end_bulk_insert() && error <= 0)
1632
to->print_error(errno, MYF(0));
1588
info.end_read_record();
1589
from->free_io_cache();
1590
delete [] copy; // This is never 0
1592
if (to->cursor->ha_end_bulk_insert() && error <= 0)
1594
to->print_error(errno, MYF(0));
1597
to->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1600
Ensure that the new table is saved properly to disk so that we
1603
if (transaction_services.autocommitOrRollback(session, false))
1605
if (! session->endActiveTransaction())
1609
session->abort_on_warning= 0;
1635
to->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1638
Ensure that the new table is saved properly to disk so that we
1641
if (transaction_services.autocommitOrRollback(*session, false))
1644
if (not session->endActiveTransaction())
1649
session->setAbortOnWarning(false);
1610
1650
from->free_io_cache();
1611
1651
*copied= found_count;
1612
1652
*deleted=delete_count;
1613
1653
to->cursor->ha_release_auto_increment();
1614
if (to->cursor->ha_external_lock(session,F_UNLCK))
1655
if (to->cursor->ha_external_lock(session, F_UNLCK))
1617
1660
return(error > 0 ? -1 : 0);
1621
create_temporary_table(Session *session,
1622
TableIdentifier &identifier,
1623
HA_CREATE_INFO *create_info,
1624
message::Table &create_proto,
1625
AlterInfo *alter_info)
1630
Create a table with a temporary name.
1631
We don't log the statement, it will be logged later.
1633
create_proto.set_name(identifier.getTableName());
1635
create_proto.mutable_engine()->set_name(create_info->db_type->getName());
1637
error= mysql_create_table(session,
1639
create_info, create_proto, alter_info, true, 0, false);
1644
static Table *open_alter_table(Session *session, Table *table, TableIdentifier &identifier)
1663
static Table *open_alter_table(Session *session, Table *table, identifier::Table &identifier)
1646
1665
Table *new_table;