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>
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>
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"
53
47
using namespace std;
58
52
extern pid_t current_pid;
60
static int copy_data_between_tables(Session *session,
61
Table *from,Table *to,
54
static int copy_data_between_tables(Table *from,Table *to,
62
55
List<CreateField> &create,
64
57
uint32_t order_num,
68
61
enum enum_enable_or_disable keys_onoff,
69
62
bool error_if_not_empty);
71
static bool prepare_alter_table(Session *session,
64
static bool mysql_prepare_alter_table(Session *session,
73
66
HA_CREATE_INFO *create_info,
74
67
const message::Table &original_proto,
75
68
message::Table &table_message,
76
69
AlterInfo *alter_info);
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
71
static int create_temporary_table(Session *session,
72
TableIdentifier &identifier,
73
HA_CREATE_INFO *create_info,
74
message::Table &create_message,
75
AlterInfo *alter_info);
77
static Table *open_alter_table(Session *session, Table *table, TableIdentifier &identifier);
92
79
bool statement::AlterTable::execute()
94
TableList *first_table= (TableList *) getSession()->getLex()->select_lex.table_list.first;
95
TableList *all_tables= getSession()->getLex()->query_tables;
81
TableList *first_table= (TableList *) session->lex->select_lex.table_list.first;
82
TableList *all_tables= session->lex->query_tables;
96
83
assert(first_table == all_tables && first_table != 0);
97
Select_Lex *select_lex= &getSession()->getLex()->select_lex;
84
Select_Lex *select_lex= &session->lex->select_lex;
98
85
bool need_start_waiting= false;
100
is_engine_set= not createTableMessage().engine().name().empty();
102
87
if (is_engine_set)
104
create_info().db_type=
105
plugin::StorageEngine::findByName(*getSession(), createTableMessage().engine().name());
90
plugin::StorageEngine::findByName(*session, create_table_message.engine().name());
107
if (create_info().db_type == NULL)
92
if (create_info.db_type == NULL)
109
my_error(createTableMessage().engine().name(), ER_UNKNOWN_STORAGE_ENGINE, MYF(0));
94
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0),
95
create_table_message.engine().name().c_str());
116
102
assert(select_lex->db);
118
104
/* Chicken/Egg... we need to search for the table, to know if the table exists, so we can build a full identifier from it */
119
message::table::shared_ptr original_table_message;
105
message::Table original_table_message;
121
identifier::Table identifier(first_table->getSchemaName(), first_table->getTableName());
122
if (not (original_table_message= plugin::StorageEngine::getTableMessage(*getSession(), identifier)))
107
TableIdentifier identifier(first_table->db, first_table->table_name);
108
if (plugin::StorageEngine::getTableDefinition(*session, identifier, original_table_message) != EEXIST)
124
my_error(ER_BAD_TABLE_ERROR, identifier);
110
my_error(ER_BAD_TABLE_ERROR, MYF(0), identifier.getSQLPath().c_str());
128
if (not create_info().db_type)
114
if (not create_info.db_type)
130
create_info().db_type=
131
plugin::StorageEngine::findByName(*getSession(), original_table_message->engine().name());
117
plugin::StorageEngine::findByName(*session, original_table_message.engine().name());
133
if (not create_info().db_type)
119
if (not create_info.db_type)
135
my_error(ER_BAD_TABLE_ERROR, identifier);
121
my_error(ER_BAD_TABLE_ERROR, MYF(0), identifier.getSQLPath().c_str());
141
127
if (not validateCreateTableOption())
144
if (getSession()->inTransaction())
146
my_error(ER_TRANSACTIONAL_DDL_NOT_SUPPORTED, MYF(0));
150
if (not (need_start_waiting= not getSession()->wait_if_global_read_lock(0, 1)))
132
/* ALTER TABLE ends previous transaction */
133
if (not session->endActiveTransaction())
138
if (not (need_start_waiting= ! wait_if_global_read_lock(session, 0, 1)))
154
if (original_table_message->type() == message::Table::STANDARD )
144
if (original_table_message.type() == message::Table::STANDARD )
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());
146
TableIdentifier identifier(first_table->db, first_table->table_name);
147
TableIdentifier new_identifier(select_lex->db ? select_lex->db : first_table->db,
148
session->lex->name.str ? session->lex->name.str : first_table->table_name);
160
res= alter_table(getSession(),
150
res= alter_table(session,
164
*original_table_message,
165
createTableMessage(),
154
original_table_message,
155
create_table_message,
168
158
select_lex->order_list.elements,
169
(Order *) select_lex->order_list.first,
170
getSession()->getLex()->ignore);
159
(order_st *) select_lex->order_list.first,
160
session->lex->ignore);
174
identifier::Table catch22(first_table->getSchemaName(), first_table->getTableName());
175
Table *table= getSession()->find_temporary_table(catch22);
164
Table *table= session->find_temporary_table(first_table);
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());
167
TableIdentifier identifier(first_table->db, first_table->table_name, table->s->getPath());
168
TableIdentifier new_identifier(select_lex->db ? select_lex->db : first_table->db,
169
session->lex->name.str ? session->lex->name.str : first_table->table_name,
170
table->s->getPath());
183
res= alter_table(getSession(),
172
res= alter_table(session,
187
*original_table_message,
188
createTableMessage(),
176
original_table_message,
177
create_table_message,
191
180
select_lex->order_list.elements,
192
(Order *) select_lex->order_list.first,
193
getSession()->getLex()->ignore);
181
(order_st *) select_lex->order_list.first,
182
session->lex->ignore);
244
232
Table instructions
245
233
@retval false success
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)
235
static bool mysql_prepare_alter_table(Session *session,
237
HA_CREATE_INFO *create_info,
238
const message::Table &original_proto,
239
message::Table &table_message,
240
AlterInfo *alter_info)
254
242
/* New column definitions are added here */
255
243
List<CreateField> new_create_list;
256
244
/* New key definitions are added here */
257
245
List<Key> new_key_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());
246
List_iterator<AlterDrop> drop_it(alter_info->drop_list);
247
List_iterator<CreateField> def_it(alter_info->create_list);
248
List_iterator<AlterColumn> alter_it(alter_info->alter_list);
249
List_iterator<Key> key_it(alter_info->key_list);
250
List_iterator<CreateField> find_it(new_create_list);
251
List_iterator<CreateField> field_it(new_create_list);
264
252
List<Key_part_spec> key_parts;
265
253
uint32_t used_fields= create_info->used_fields;
266
254
KeyInfo *key_info= table->key_info;
345
329
def= new CreateField(field, field);
346
330
new_create_list.push_back(def);
347
alter_it= alter_info->alter_list.begin(); /* Change default if ALTER */
331
alter_it.rewind(); /* Change default if ALTER */
348
332
AlterColumn *alter;
350
333
while ((alter= alter_it++))
352
335
if (! my_strcasecmp(system_charset_info,field->field_name, alter->name))
358
340
if (def->sql_type == DRIZZLE_TYPE_BLOB)
360
342
my_error(ER_BLOB_CANT_HAVE_DEFAULT, MYF(0), def->change);
364
345
if ((def->def= alter->def))
366
347
/* Use new default */
367
348
def->flags&= ~NO_DEFAULT_VALUE_FLAG;
371
351
def->flags|= NO_DEFAULT_VALUE_FLAG;
373
352
alter_it.remove();
378
def_it= alter_info->create_list.begin();
379
357
while ((def= def_it++)) /* Add new columns */
381
359
if (def->change && ! def->field)
383
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change, table->getMutableShare()->getTableName());
361
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change, table->s->getTableName());
387
If we have been given a field which has no default value, and is not null then we need to bail.
365
Check that the DATE/DATETIME not null field we are going to add is
366
either has a default value or the '0000-00-00' is allowed by the
368
If the '0000-00-00' value isn't allowed then raise the error_if_not_empty
369
flag to allow ALTER Table only if the table to be altered is empty.
389
if (not (~def->flags & (NO_DEFAULT_VALUE_FLAG | NOT_NULL_FLAG)) and not def->change)
371
if ((def->sql_type == DRIZZLE_TYPE_DATE ||
372
def->sql_type == DRIZZLE_TYPE_DATETIME) &&
373
! alter_info->datetime_field &&
374
! (~def->flags & (NO_DEFAULT_VALUE_FLAG | NOT_NULL_FLAG)) &&
375
session->variables.sql_mode & MODE_NO_ZERO_DATE)
377
alter_info->datetime_field= def;
391
378
alter_info->error_if_not_empty= true;
393
380
if (! def->after)
395
381
new_create_list.push_back(def);
397
382
else if (def->after == first_keyword)
399
383
new_create_list.push_front(def);
403
386
CreateField *find;
404
find_it= new_create_list.begin();
406
388
while ((find= find_it++)) /* Add new columns */
408
if (not my_strcasecmp(system_charset_info,def->after, find->field_name))
390
if (! my_strcasecmp(system_charset_info,def->after, find->field_name))
414
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->after, table->getMutableShare()->getTableName());
395
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->after, table->s->getTableName());
418
398
find_it.after(def); /* Put element after this */
421
400
XXX: hack for Bug#28427.
422
401
If column order has changed, force OFFLINE ALTER Table
563
533
new_key_list.push_back(key);
567
/* Copy over existing foreign keys */
568
for (int32_t j= 0; j < original_proto.fk_constraint_size(); j++)
571
drop_it= alter_info->drop_list.begin();
572
while ((drop= drop_it++))
574
if (drop->type == AlterDrop::FOREIGN_KEY &&
575
! my_strcasecmp(system_charset_info, original_proto.fk_constraint(j).name().c_str(), drop->name))
586
message::Table::ForeignKeyConstraint *pfkey= table_message.add_fk_constraint();
587
*pfkey= original_proto.fk_constraint(j);
592
538
while ((key= key_it++)) /* Add new keys */
594
if (key->type == Key::FOREIGN_KEY)
596
if (((Foreign_key *)key)->validate(new_create_list))
601
Foreign_key *fkey= (Foreign_key*)key;
602
add_foreign_key_to_table_message(&table_message,
540
if (key->type == Key::FOREIGN_KEY &&
541
((Foreign_key *)key)->validate(new_create_list))
612
543
if (key->type != Key::FOREIGN_KEY)
613
544
new_key_list.push_back(key);
615
545
if (key->name.str && is_primary_key_name(key->name.str))
617
547
my_error(ER_WRONG_NAME_FOR_INDEX,
625
/* Fix names of foreign keys being added */
626
for (int j= 0; j < table_message.fk_constraint_size(); j++)
628
if (! table_message.fk_constraint(j).has_name())
630
std::string name(table->getMutableShare()->getTableName());
633
name.append("_ibfk_");
634
snprintf(number, sizeof(number), "%d", j+1);
637
message::Table::ForeignKeyConstraint *pfkey= table_message.mutable_fk_constraint(j);
638
pfkey->set_name(name);
642
555
if (alter_info->drop_list.elements)
644
557
my_error(ER_CANT_DROP_FIELD_OR_KEY,
646
559
alter_info->drop_list.head()->name);
650
562
if (alter_info->alter_list.elements)
652
564
my_error(ER_CANT_DROP_FIELD_OR_KEY,
654
566
alter_info->alter_list.head()->name);
658
570
if (not table_message.options().has_comment()
659
&& table->getMutableShare()->hasComment())
661
table_options->set_comment(table->getMutableShare()->getComment());
571
&& table->s->hasComment())
572
table_options->set_comment(table->s->getComment());
664
if (table->getShare()->getType())
574
if (table->s->tmp_table)
666
576
table_message.set_type(message::Table::TEMPORARY);
669
table_message.set_creation_timestamp(table->getShare()->getTableMessage()->creation_timestamp());
670
table_message.set_version(table->getShare()->getTableMessage()->version());
671
table_message.set_uuid(table->getShare()->getTableMessage()->uuid());
579
table_message.set_creation_timestamp(table->getShare()->getTableProto()->creation_timestamp());
581
table_message.set_update_timestamp(time(NULL));
674
584
alter_info->create_list.swap(new_create_list);
675
585
alter_info->key_list.swap(new_key_list);
677
588
size_t num_engine_options= table_message.engine().options_size();
678
589
size_t original_num_engine_options= original_proto.engine().options_size();
996
902
while the fact that the table is still open gives us protection
997
903
from concurrent DDL statements.
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);
905
pthread_mutex_lock(&LOCK_open); /* DDL wait for/blocker */
906
wait_while_table_is_used(session, table, HA_EXTRA_FORCE_REOPEN);
907
pthread_mutex_unlock(&LOCK_open);
1003
908
error= table->cursor->ha_enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
1005
909
/* COND_refresh will be signaled in close_thread_tables() */
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);
912
pthread_mutex_lock(&LOCK_open); /* DDL wait for/blocker */
913
wait_while_table_is_used(session, table, HA_EXTRA_FORCE_REOPEN);
914
pthread_mutex_unlock(&LOCK_open);
915
error=table->cursor->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
1015
916
/* COND_refresh will be signaled in close_thread_tables() */
1019
924
if (error == HA_ERR_WRONG_COMMAND)
1022
927
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1023
928
ER_ILLEGAL_HA, ER(ER_ILLEGAL_HA),
1027
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* Lock to remove all instances of table from table cache before ALTER */
932
pthread_mutex_lock(&LOCK_open); /* Lock to remove all instances of table from table cache before ALTER */
1029
934
Unlike to the above case close_cached_table() below will remove ALL
1030
935
instances of Table from table cache (it will also remove table lock
1031
936
held by this thread). So to make actual table renaming and writing
1032
937
to binlog atomic we have to put them into the same critical section
1033
protected by table::Cache::singleton().mutex() mutex. This also removes gap for races between
1034
access() and rename_table() calls.
938
protected by LOCK_open mutex. This also removes gap for races between
939
access() and mysql_rename_table() calls.
1037
if (not error && not (original_table_identifier == new_table_identifier))
942
if (error == 0 && not (original_table_identifier == new_table_identifier))
1039
944
session->set_proc_info("rename");
1254
1187
new_table->intern_close_table();
1256
if (new_table->hasShare())
1258
delete new_table->getMutableShare();
1191
if (new_table->s->newed)
1193
delete new_table->s;
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))
1206
pthread_mutex_lock(&LOCK_open); /* ALTER TABLE */
1209
Data is copied. Now we:
1210
1) Wait until all other threads close old version of table.
1211
2) Close instances of table open by this thread and replace them
1212
with exclusive name-locks.
1213
3) Rename the old table to a temp name, rename the new one to the
1215
4) If we are under LOCK TABLES and don't do ALTER Table ... RENAME
1216
we reopen new version of table.
1217
5) Write statement to the binary log.
1218
6) If we are under LOCK TABLES and do ALTER Table ... RENAME we
1219
remove name-locks from list of open tables and table cache.
1220
7) If we are not not under LOCK TABLES we rely on close_thread_tables()
1221
call to remove name-locks from table cache and list of open table.
1224
session->set_proc_info("rename result table");
1226
snprintf(old_name, sizeof(old_name), "%s2-%lx-%"PRIx64, TMP_FILE_PREFIX, (unsigned long) current_pid, session->thread_id);
1228
my_casedn_str(files_charset_info, old_name);
1230
wait_while_table_is_used(session, table, HA_EXTRA_PREPARE_FOR_RENAME);
1231
session->close_data_files_and_morph_locks(original_table_identifier);
1236
This leads to the storage engine (SE) not being notified for renames in
1237
mysql_rename_table(), because we just juggle with the FRM and nothing
1238
more. If we have an intermediate table, then we notify the SE that
1239
it should become the actual table. Later, we will recycle the old table.
1240
However, in case of ALTER Table RENAME there might be no intermediate
1241
table. This is when the old and new tables are compatible, according to
1242
compare_table(). Then, we need one additional call to
1244
TableIdentifier original_table_to_drop(original_table_identifier.getSchemaName(),
1245
old_name, message::Table::TEMPORARY);
1247
if (mysql_rename_table(original_engine, original_table_identifier, original_table_to_drop))
1250
quick_rm_table(*session, new_table_as_temporary);
1254
if (mysql_rename_table(new_engine, new_table_as_temporary, new_table_identifier) != 0)
1309
error= ER_ERROR_ON_RENAME;
1310
plugin::StorageEngine::dropTable(*session, new_table_as_temporary);
1256
/* Try to get everything back. */
1259
quick_rm_table(*session, new_table_identifier);
1261
quick_rm_table(*session, new_table_as_temporary);
1263
mysql_rename_table(original_engine, original_table_to_drop, original_table_identifier);
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);
1267
quick_rm_table(*session, original_table_to_drop);
1274
An error happened while we were holding exclusive name-lock on table
1275
being altered. To be safe under LOCK TABLES we should remove placeholders
1276
from list of open tables list and table cache.
1278
session->unlink_open_table(table);
1279
pthread_mutex_unlock(&LOCK_open);
1284
pthread_mutex_unlock(&LOCK_open);
1344
1286
session->set_proc_info("end");
1346
write_bin_log(session, *session->getQueryString());
1288
write_bin_log(session, session->query.c_str());
1347
1289
table_list->table= NULL;
1506
1440
found_count=delete_count=0;
1512
if (to->getShare()->hasPrimaryKey() && to->cursor->primary_key_is_clustered())
1444
if (to->s->primary_key != MAX_KEY && to->cursor->primary_key_is_clustered())
1446
char warn_buff[DRIZZLE_ERRMSG_SIZE];
1447
snprintf(warn_buff, sizeof(warn_buff),
1448
_("order_st BY ignored because there is a user-defined clustered "
1449
"index in the table '%-.192s'"),
1450
from->s->getTableName());
1451
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
1456
from->sort.io_cache= new internal::IO_CACHE;
1457
memset(from->sort.io_cache, 0, sizeof(internal::IO_CACHE));
1459
memset(&tables, 0, sizeof(tables));
1461
tables.alias= tables.table_name= const_cast<char *>(from->s->getTableName());
1462
tables.db= const_cast<char *>(from->s->getSchemaName());
1465
if (session->lex->select_lex.setup_ref_array(session, order_num) ||
1466
setup_order(session, session->lex->select_lex.ref_pointer_array,
1467
&tables, fields, all_fields, order) ||
1468
!(sortorder= make_unireg_sortorder(order, &length, NULL)) ||
1469
(from->sort.found_records= filesort(session, from, sortorder, length,
1470
(optimizer::SqlSelect *) 0, HA_POS_ERROR,
1471
1, &examined_rows)) ==
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,
1479
/* Tell handler that we have values for all columns in the to table */
1480
to->use_all_columns();
1481
init_read_record(&info, session, from, (optimizer::SqlSelect *) 0, 1,1);
1483
to->cursor->extra(HA_EXTRA_IGNORE_DUP_KEY);
1484
session->row_count= 0;
1485
to->restoreRecordAsDefault(); // Create empty record
1486
while (!(error=info.read_record(&info)))
1488
if (session->killed)
1490
session->send_kill_message();
1494
session->row_count++;
1495
/* Return error if source table isn't empty. */
1496
if (error_if_not_empty)
1501
if (to->next_number_field)
1503
if (auto_increment_field_copied)
1504
to->auto_increment_field_not_null= true;
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)
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);
1506
to->next_number_field->reset();
1509
for (CopyField *copy_ptr=copy ; copy_ptr != copy_end ; copy_ptr++)
1511
copy_ptr->do_copy(copy_ptr);
1513
prev_insert_id= to->cursor->next_insert_id;
1514
error= to->cursor->insertRecord(to->record[0]);
1515
to->auto_increment_field_not_null= false;
1552
to->print_error(errno, MYF(0));
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;
1519
to->cursor->is_fatal_error(error, HA_CHECK_DUP))
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));
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);
1521
to->print_error(error, MYF(0));
1524
to->cursor->restore_auto_increment(prev_insert_id);
1530
end_read_record(&info);
1531
from->free_io_cache();
1532
delete [] copy; // This is never 0
1534
if (to->cursor->ha_end_bulk_insert() && error <= 0)
1536
to->print_error(errno, MYF(0));
1539
to->cursor->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
1542
Ensure that the new table is saved properly to disk so that we
1545
if (transaction_services.autocommitOrRollback(session, false))
1547
if (! session->endActiveTransaction())
1551
session->abort_on_warning= 0;
1650
1552
from->free_io_cache();
1651
1553
*copied= found_count;
1652
1554
*deleted=delete_count;
1653
1555
to->cursor->ha_release_auto_increment();
1655
if (to->cursor->ha_external_lock(session, F_UNLCK))
1556
if (to->cursor->ha_external_lock(session,F_UNLCK))
1660
1558
return(error > 0 ? -1 : 0);
1663
static Table *open_alter_table(Session *session, Table *table, identifier::Table &identifier)
1562
create_temporary_table(Session *session,
1563
TableIdentifier &identifier,
1564
HA_CREATE_INFO *create_info,
1565
message::Table &create_proto,
1566
AlterInfo *alter_info)
1571
Create a table with a temporary name.
1572
We don't log the statement, it will be logged later.
1574
create_proto.set_name(identifier.getTableName());
1576
create_proto.mutable_engine()->set_name(create_info->db_type->getName());
1578
error= mysql_create_table(session,
1580
create_info, create_proto, alter_info, true, 0, false);
1585
static Table *open_alter_table(Session *session, Table *table, TableIdentifier &identifier)
1665
1587
Table *new_table;
1667
1589
/* Open the table so we need to copy the data to it. */
1668
if (table->getShare()->getType())
1590
if (table->s->tmp_table)
1671
tbl.setSchemaName(const_cast<char *>(identifier.getSchemaName().c_str()));
1593
tbl.db= const_cast<char *>(identifier.getSchemaName().c_str());
1672
1594
tbl.alias= const_cast<char *>(identifier.getTableName().c_str());
1673
tbl.setTableName(const_cast<char *>(identifier.getTableName().c_str()));
1595
tbl.table_name= const_cast<char *>(identifier.getTableName().c_str());
1675
1597
/* Table is in session->temporary_tables */
1676
1598
new_table= session->openTable(&tbl, (bool*) 0, DRIZZLE_LOCK_IGNORE_FLUSH);