26
26
#include <drizzled/sql_lex.h>
27
27
#include <drizzled/session.h>
28
28
#include <drizzled/sql_base.h>
29
#include <drizzled/strfunc.h>
29
#include "drizzled/strfunc.h"
30
#include <drizzled/db.h>
30
31
#include <drizzled/lock.h>
31
32
#include <drizzled/unireg.h>
32
33
#include <drizzled/item/int.h>
33
34
#include <drizzled/item/empty_string.h>
34
35
#include <drizzled/transaction_services.h>
35
#include <drizzled/transaction_services.h>
36
#include "drizzled/transaction_services.h"
36
37
#include <drizzled/table_proto.h>
37
38
#include <drizzled/plugin/client.h>
38
39
#include <drizzled/identifier.h>
39
#include <drizzled/internal/m_string.h>
40
#include <drizzled/global_charset_info.h>
41
#include <drizzled/charset.h>
43
#include <drizzled/definition/cache.h>
45
#include <drizzled/statement/alter_table.h>
46
#include <drizzled/sql_table.h>
47
#include <drizzled/pthread_globals.h>
48
#include <drizzled/typelib.h>
49
#include <drizzled/plugin/storage_engine.h>
40
#include "drizzled/internal/m_string.h"
41
#include "drizzled/global_charset_info.h"
42
#include "drizzled/charset.h"
44
#include "drizzled/definition/cache.h"
47
#include "drizzled/statement/alter_table.h"
48
#include "drizzled/sql_table.h"
49
#include "drizzled/pthread_globals.h"
51
51
#include <algorithm>
193
195
if (session->getKilled())
198
goto err_with_placeholders;
199
identifier::Table identifier(table->getSchemaName(), table->getTableName(), table->getInternalTmpTable() ? message::Table::INTERNAL : message::Table::STANDARD);
201
message::table::shared_ptr message= plugin::StorageEngine::getTableMessage(*session, identifier, true);
201
TableIdentifier identifier(table->getSchemaName(), table->getTableName(), table->getInternalTmpTable() ? message::Table::INTERNAL : message::Table::STANDARD);
203
203
if (drop_temporary || not plugin::StorageEngine::doesTableExist(*session, identifier))
205
205
// Table was not found on disk and table can't be created from engine
208
207
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
209
208
ER_BAD_TABLE_ERROR, ER(ER_BAD_TABLE_ERROR),
210
209
table->getTableName());
219
drizzled::error_t local_error;
215
error= plugin::StorageEngine::dropTable(*session, identifier);
221
217
/* Generate transaction event ONLY when we successfully drop */
222
if (plugin::StorageEngine::dropTable(*session, identifier, local_error))
224
if (message) // If we have no definition, we don't know if the table should have been replicated
226
TransactionServices &transaction_services= TransactionServices::singleton();
227
transaction_services.dropTable(*session, identifier, *message, if_exists);
232
if (local_error == HA_ERR_NO_SUCH_TABLE and if_exists)
235
session->clear_error();
238
if (local_error == HA_ERR_ROW_IS_REFERENCED)
240
/* the table is referenced by a foreign key constraint */
241
foreign_key_error= true;
220
TransactionServices &transaction_services= TransactionServices::singleton();
221
transaction_services.dropTable(session, identifier, if_exists);
224
if ((error == ENOENT || error == HA_ERR_NO_SUCH_TABLE) && if_exists)
227
session->clear_error();
230
if (error == HA_ERR_ROW_IS_REFERENCED)
232
/* the table is referenced by a foreign key constraint */
233
foreign_key_error= true;
249
wrong_tables.push_back(table->getTableName());
239
if (wrong_tables.length())
240
wrong_tables.append(',');
241
wrong_tables.append(String(table->getTableName(), system_charset_info));
253
tables->unlock_table_names();
257
if (wrong_tables.size())
245
It's safe to unlock table::Cache::singleton().mutex(): we have an exclusive lock
248
table::Cache::singleton().mutex().unlock();
252
if (wrong_tables.length())
259
254
if (not foreign_key_error)
261
std::string table_error;
263
for (util::string::vector::iterator iter= wrong_tables.begin();
264
iter != wrong_tables.end();
270
table_error.resize(table_error.size() -1);
272
256
my_printf_error(ER_BAD_TABLE_ERROR, ER(ER_BAD_TABLE_ERROR), MYF(0),
273
table_error.c_str());
257
wrong_tables.c_ptr());
483
472
sql_field->length= 8; // Unireg field length
484
473
(*blob_columns)++;
475
case DRIZZLE_TYPE_VARCHAR:
487
477
case DRIZZLE_TYPE_ENUM:
489
if (check_duplicates_in_interval("ENUM",
490
sql_field->field_name,
500
case DRIZZLE_TYPE_MICROTIME:
478
if (check_duplicates_in_interval("ENUM",
479
sql_field->field_name,
485
case DRIZZLE_TYPE_DATE: // Rest of string types
486
case DRIZZLE_TYPE_TIME:
487
case DRIZZLE_TYPE_DATETIME:
488
case DRIZZLE_TYPE_NULL:
490
case DRIZZLE_TYPE_DECIMAL:
501
492
case DRIZZLE_TYPE_TIMESTAMP:
502
493
/* We should replace old TIMESTAMP fields with their newer analogs */
503
494
if (sql_field->unireg_check == Field::TIMESTAMP_OLD_FIELD)
541
518
static int prepare_create_table(Session *session,
542
HA_CREATE_INFO *create_info,
543
message::Table &create_proto,
544
AlterInfo *alter_info,
546
uint32_t *db_options,
547
KeyInfo **key_info_buffer,
549
int select_field_count)
519
HA_CREATE_INFO *create_info,
520
message::Table &create_proto,
521
AlterInfo *alter_info,
523
uint32_t *db_options,
524
KeyInfo **key_info_buffer,
526
int select_field_count)
551
528
const char *key_name;
552
529
CreateField *sql_field,*dup_field;
993
965
message::Table::Field *protofield= NULL;
995
List<Key_part_spec>::iterator cols(key->columns.begin());
996
List<Key_part_spec>::iterator cols2(key->columns.begin());
967
List_iterator<Key_part_spec> cols(key->columns), cols2(key->columns);
997
968
for (uint32_t column_nr=0 ; (column=cols++) ; column_nr++)
1000
971
Key_part_spec *dup_column;
1001
972
int proto_field_nr= 0;
1003
it= alter_info->create_list.begin();
1005
976
while ((sql_field=it++) && ++proto_field_nr &&
1006
977
my_strcasecmp(system_charset_info,
1007
978
column->field_name.str,
1008
979
sql_field->field_name))
1015
983
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
1019
986
while ((dup_column= cols2++) != column)
1021
988
if (!my_strcasecmp(system_charset_info,
1200
1165
key_info->name=(char*) key_name;
1204
1168
if (!key_info->name || check_column_name(key_info->name))
1206
1170
my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key_info->name);
1210
1173
if (!(key_info->flags & HA_NULL_PART_KEY))
1215
1175
key_info->key_length=(uint16_t) key_length;
1217
1176
if (key_length > max_key_length)
1219
1178
my_error(ER_TOO_LONG_KEY,MYF(0),max_key_length);
1226
1183
if (!unique_key && !primary_key &&
1227
1184
(engine->check_flag(HTON_BIT_REQUIRE_PRIMARY_KEY)))
1229
1186
my_message(ER_REQUIRES_PRIMARY_KEY, ER(ER_REQUIRES_PRIMARY_KEY), MYF(0));
1233
1189
if (auto_increment > 0)
1235
1191
my_message(ER_WRONG_AUTO_KEY, ER(ER_WRONG_AUTO_KEY), MYF(0));
1470
1430
/* Build a Table object to pass down to the engine, and the do the actual create. */
1471
1431
if (not prepare_create_table(session, create_info, table_proto, alter_info,
1474
&key_info_buffer, &key_count,
1475
select_field_count))
1434
&key_info_buffer, &key_count,
1435
select_field_count))
1477
1437
boost_unique_lock_t lock(table::Cache::singleton().mutex()); /* CREATE TABLE (some confussion on naming, double check) */
1478
1438
error= locked_create_event(session,
1846
1806
char buff[FN_REFLEN + DRIZZLE_ERRMSG_SIZE];
1847
1807
uint32_t length;
1848
session->getClient()->store(table_name.c_str());
1808
session->getClient()->store(table_name);
1849
1809
session->getClient()->store(operator_name);
1850
1810
session->getClient()->store(STRING_WITH_LEN("error"));
1851
1811
length= snprintf(buff, sizeof(buff), ER(ER_OPEN_AS_READONLY),
1852
table_name.c_str());
1853
1813
session->getClient()->store(buff, length);
1854
transaction_services.autocommitOrRollback(*session, false);
1814
transaction_services.autocommitOrRollback(session, false);
1855
1815
session->endTransaction(COMMIT);
1856
1816
session->close_thread_tables();
1857
session->getLex()->reset_query_tables_list(false);
1817
lex->reset_query_tables_list(false);
1858
1818
table->table=0; // For query cache
1859
1819
if (session->getClient()->flush())
1868
1828
const char *old_message=session->enter_cond(COND_refresh, table::Cache::singleton().mutex(),
1869
1829
"Waiting to get writelock");
1870
1830
session->abortLock(table->table);
1871
identifier::Table identifier(table->table->getShare()->getSchemaName(), table->table->getShare()->getTableName());
1831
TableIdentifier identifier(table->table->getShare()->getSchemaName(), table->table->getShare()->getTableName());
1872
1832
table::Cache::singleton().removeTable(session, identifier, RTFC_WAIT_OTHER_THREAD_FLAG | RTFC_CHECK_KILLED_FLAG);
1873
1833
session->exit_cond(old_message);
1874
1834
if (session->getKilled())
1883
session->getLex()->cleanup_after_one_table_open();
1843
lex->cleanup_after_one_table_open();
1884
1844
session->clear_error(); // these errors shouldn't get client
1886
List<DRIZZLE_ERROR>::iterator it(session->warn_list.begin());
1846
List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
1887
1847
DRIZZLE_ERROR *err;
1888
1848
while ((err= it++))
1890
session->getClient()->store(table_name.c_str());
1850
session->getClient()->store(table_name);
1891
1851
session->getClient()->store(operator_name);
1892
1852
session->getClient()->store(warning_level_names[err->level].str,
1893
1853
warning_level_names[err->level].length);
1972
1932
boost::unique_lock<boost::mutex> lock(table::Cache::singleton().mutex());
1973
identifier::Table identifier(table->table->getShare()->getSchemaName(), table->table->getShare()->getTableName());
1933
TableIdentifier identifier(table->table->getShare()->getSchemaName(), table->table->getShare()->getTableName());
1974
1934
table::Cache::singleton().removeTable(session, identifier, RTFC_NO_FLAG);
1978
transaction_services.autocommitOrRollback(*session, false);
1938
transaction_services.autocommitOrRollback(session, false);
1979
1939
session->endTransaction(COMMIT);
1980
1940
session->close_thread_tables();
1981
1941
table->table=0; // For query cache
2010
1970
during the call to plugin::StorageEngine::createTable().
2011
1971
See bug #28614 for more info.
2013
static bool create_table_wrapper(Session &session,
2014
const message::Table& create_table_proto,
2015
identifier::Table::const_reference destination_identifier,
2016
identifier::Table::const_reference source_identifier,
1973
static bool create_table_wrapper(Session &session, const message::Table& create_table_proto,
1974
const TableIdentifier &destination_identifier,
1975
const TableIdentifier &src_table,
2017
1976
bool is_engine_set)
2019
// We require an additional table message because during parsing we used
2020
// a "new" message and it will not have all of the information that the
2021
// source table message would have.
2022
message::Table new_table_message;
2024
message::table::shared_ptr source_table_message= plugin::StorageEngine::getTableMessage(session, source_identifier);
2026
if (not source_table_message)
2028
my_error(ER_TABLE_UNKNOWN, source_identifier);
2032
new_table_message.CopyFrom(*source_table_message);
1978
int protoerr= EEXIST;
1979
message::Table new_proto;
1980
message::table::shared_ptr src_proto;
1982
protoerr= plugin::StorageEngine::getTableDefinition(session,
1985
new_proto.CopyFrom(*src_proto);
2034
1987
if (destination_identifier.isTmp())
2036
new_table_message.set_type(message::Table::TEMPORARY);
1989
new_proto.set_type(message::Table::TEMPORARY);
2040
new_table_message.set_type(message::Table::STANDARD);
1993
new_proto.set_type(message::Table::STANDARD);
2043
1996
if (is_engine_set)
2045
new_table_message.mutable_engine()->set_name(create_table_proto.engine().name());
1998
new_proto.mutable_engine()->set_name(create_table_proto.engine().name());
2048
2001
{ // We now do a selective copy of elements on to the new table.
2049
new_table_message.set_name(create_table_proto.name());
2050
new_table_message.set_schema(create_table_proto.schema());
2051
new_table_message.set_catalog(create_table_proto.catalog());
2002
new_proto.set_name(create_table_proto.name());
2003
new_proto.set_schema(create_table_proto.schema());
2004
new_proto.set_catalog(create_table_proto.catalog());
2054
/* Fix names of foreign keys being added */
2055
for (int32_t j= 0; j < new_table_message.fk_constraint_size(); j++)
2007
if (protoerr && protoerr != EEXIST)
2057
if (new_table_message.fk_constraint(j).has_name())
2059
std::string name(new_table_message.name());
2062
name.append("_ibfk_");
2063
snprintf(number, sizeof(number), "%d", j+1);
2064
name.append(number);
2066
message::Table::ForeignKeyConstraint *pfkey= new_table_message.mutable_fk_constraint(j);
2067
pfkey->set_name(name);
2009
if (errno == ENOENT)
2010
my_error(ER_BAD_DB_ERROR,MYF(0), destination_identifier.getSchemaName().c_str());
2012
my_error(ER_CANT_CREATE_FILE, MYF(0), destination_identifier.getPath().c_str(), errno);
2072
2018
As mysql_truncate don't work on a new table at this stage of
2073
creation, instead create the table directly (for both normal and temporary tables).
2019
creation, instead create the table directly (for both normal
2020
and temporary tables).
2075
bool success= plugin::StorageEngine::createTable(session,
2076
destination_identifier,
2022
int err= plugin::StorageEngine::createTable(session,
2023
destination_identifier,
2079
if (success && not destination_identifier.isTmp())
2026
if (err == false && not destination_identifier.isTmp())
2081
2028
TransactionServices &transaction_services= TransactionServices::singleton();
2082
transaction_services.createTable(session, new_table_message);
2029
transaction_services.createTable(&session, new_proto);
2032
return err ? false : true;
2103
2050
bool create_like_table(Session* session,
2104
identifier::Table::const_reference destination_identifier,
2105
identifier::Table::const_reference source_identifier,
2106
message::Table &create_table_proto,
2107
bool is_if_not_exists,
2051
const TableIdentifier &destination_identifier,
2052
TableList* table, TableList* src_table,
2053
message::Table &create_table_proto,
2054
bool is_if_not_exists,
2110
2057
bool res= true;
2111
bool table_exists= false;
2061
By opening source table we guarantee that it exists and no concurrent
2062
DDL operation will mess with it. Later we also take an exclusive
2063
name-lock on target table name, which makes copying of .frm cursor,
2064
call to plugin::StorageEngine::createTable() and binlogging atomic
2065
against concurrent DML and DDL operations on target table.
2066
Thus by holding both these "locks" we ensure that our statement is
2067
properly isolated from all concurrent operations which matter.
2069
if (session->open_tables_from_list(&src_table, ¬_used))
2072
TableIdentifier src_identifier(src_table->table->getShare()->getSchemaName(),
2073
src_table->table->getShare()->getTableName(), src_table->table->getShare()->getType());
2114
2078
Check that destination tables does not exist. Note that its name
2202
2164
char warn_buff[DRIZZLE_ERRMSG_SIZE];
2203
2165
snprintf(warn_buff, sizeof(warn_buff),
2204
ER(ER_TABLE_EXISTS_ERROR), destination_identifier.getTableName().c_str());
2166
ER(ER_TABLE_EXISTS_ERROR), table->getTableName());
2205
2167
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
2206
ER_TABLE_EXISTS_ERROR, warn_buff);
2210
my_error(ER_TABLE_EXISTS_ERROR, destination_identifier);
2168
ER_TABLE_EXISTS_ERROR,warn_buff);
2173
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table->getTableName());