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"
47
#include "drizzled/filesort.h"
49
#include "drizzled/message.h"
53
51
using namespace std;
82
80
AlterTable::AlterTable(Session *in_session, Table_ident *ident, drizzled::ha_build_method build_arg) :
83
81
CreateTable(in_session)
85
in_session->getLex()->sql_command= SQLCOM_ALTER_TABLE;
83
in_session->lex->sql_command= SQLCOM_ALTER_TABLE;
87
85
alter_info.build_method= build_arg;
92
90
bool statement::AlterTable::execute()
94
TableList *first_table= (TableList *) getSession()->getLex()->select_lex.table_list.first;
95
TableList *all_tables= getSession()->getLex()->query_tables;
92
TableList *first_table= (TableList *) getSession()->lex->select_lex.table_list.first;
93
TableList *all_tables= getSession()->lex->query_tables;
96
94
assert(first_table == all_tables && first_table != 0);
97
Select_Lex *select_lex= &getSession()->getLex()->select_lex;
95
Select_Lex *select_lex= &getSession()->lex->select_lex;
98
96
bool need_start_waiting= false;
100
98
is_engine_set= not createTableMessage().engine().name().empty();
119
117
message::table::shared_ptr original_table_message;
121
119
identifier::Table identifier(first_table->getSchemaName(), first_table->getTableName());
122
if (not (original_table_message= plugin::StorageEngine::getTableMessage(*getSession(), identifier)))
120
if (plugin::StorageEngine::getTableDefinition(*getSession(), identifier, original_table_message) != EEXIST)
124
122
my_error(ER_BAD_TABLE_ERROR, identifier);
156
154
identifier::Table identifier(first_table->getSchemaName(), first_table->getTableName());
157
155
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());
156
getSession()->lex->name.str ? getSession()->lex->name.str : first_table->getTableName());
160
158
res= alter_table(getSession(),
178
176
identifier::Table identifier(first_table->getSchemaName(), first_table->getTableName(), table->getMutableShare()->getPath());
179
177
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(),
178
getSession()->lex->name.str ? getSession()->lex->name.str : first_table->getTableName(),
181
179
table->getMutableShare()->getPath());
183
181
res= alter_table(getSession(),
255
253
List<CreateField> new_create_list;
256
254
/* New key definitions are added here */
257
255
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());
256
List_iterator<AlterDrop> drop_it(alter_info->drop_list);
257
List_iterator<CreateField> def_it(alter_info->create_list);
258
List_iterator<AlterColumn> alter_it(alter_info->alter_list);
259
List_iterator<Key> key_it(alter_info->key_list);
260
List_iterator<CreateField> find_it(new_create_list);
261
List_iterator<CreateField> field_it(new_create_list);
264
262
List<Key_part_spec> key_parts;
265
263
uint32_t used_fields= create_info->used_fields;
266
264
KeyInfo *key_info= table->key_info;
345
343
def= new CreateField(field, field);
346
344
new_create_list.push_back(def);
347
alter_it= alter_info->alter_list.begin(); /* Change default if ALTER */
345
alter_it.rewind(); /* Change default if ALTER */
348
346
AlterColumn *alter;
350
348
while ((alter= alter_it++))
1487
1485
from->cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
1488
1486
to->cursor->ha_start_bulk_insert(from->cursor->stats.records);
1490
List<CreateField>::iterator it(create.begin());
1488
List_iterator<CreateField> it(create);
1491
1489
CreateField *def;
1492
1490
copy_end= copy;
1493
1491
for (Field **ptr= to->getFields(); *ptr ; ptr++)
1525
1523
from->sort.io_cache= new internal::IO_CACHE;
1527
1525
tables.table= from;
1528
tables.setTableName(from->getMutableShare()->getTableName());
1529
tables.alias= tables.getTableName();
1526
tables.setTableName(const_cast<char *>(from->getMutableShare()->getTableName()));
1527
tables.alias= const_cast<char *>(tables.getTableName());
1530
1528
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,
1531
if (session->lex->select_lex.setup_ref_array(session, order_num) ||
1532
setup_order(session, session->lex->select_lex.ref_pointer_array,
1535
1533
&tables, fields, all_fields, order) ||
1536
1534
!(sortorder= make_unireg_sortorder(order, &length, NULL)) ||
1537
1535
(from->sort.found_records= filesort.run(from, sortorder, length,