57
57
namespace drizzled {
59
bool is_primary_key(KeyInfo *key_info)
61
static const char * primary_key_name="PRIMARY";
62
return (strcmp(key_info->name, primary_key_name)==0);
65
const char* is_primary_key_name(const char* key_name)
67
static const char * primary_key_name="PRIMARY";
68
if (strcmp(key_name, primary_key_name)==0)
59
bool is_primary_key(const char* name)
61
return strcmp(name, "PRIMARY") == 0;
74
64
static bool check_if_keyname_exists(const char *name,KeyInfo *start, KeyInfo *end);
75
static char *make_unique_key_name(const char *field_name,KeyInfo *start,KeyInfo *end);
65
static const char *make_unique_key_name(const char *field_name,KeyInfo *start,KeyInfo *end);
77
66
static bool prepare_blob_field(Session *session, CreateField *sql_field);
79
68
void set_table_default_charset(HA_CREATE_INFO *create_info, const char *db)
83
72
let's fetch the database default character set and
84
73
apply it to the table.
86
identifier::Schema identifier(db);
87
if (create_info->default_table_charset == NULL)
88
create_info->default_table_charset= plugin::StorageEngine::getSchemaCollation(identifier);
75
if (not create_info->default_table_charset)
76
create_info->default_table_charset= plugin::StorageEngine::getSchemaCollation(identifier::Schema(str_ref(db)));
282
270
/* Sort NOT NULL keys before other keys */
283
271
return (a_flags & (HA_NULL_PART_KEY)) ? 1 : -1;
285
if (is_primary_key(a))
273
if (is_primary_key(a->name))
287
if (is_primary_key(b))
275
if (is_primary_key(b->name))
289
277
/* Sort keys don't containing partial segments before others */
290
278
if ((a_flags ^ b_flags) & HA_KEY_HAS_PART_KEY_SEG)
830
818
fk_key->ref_columns.size() != fk_key->columns.size())
832
820
my_error(ER_WRONG_FK_DEF, MYF(0),
833
(fk_key->name.str ? fk_key->name.str :
834
"foreign key without name"),
821
(fk_key->name.data() ? fk_key->name.data() : "foreign key without name"),
835
822
ER(ER_KEY_REF_DO_NOT_MATCH_TABLE_REF));
844
831
my_error(ER_TOO_MANY_KEY_PARTS,MYF(0),tmp);
847
if (check_identifier_name(&key->name, ER_TOO_LONG_IDENT))
834
if (check_identifier_name(key->name, ER_TOO_LONG_IDENT))
849
836
key_iterator2= alter_info->key_list.begin();
850
837
if (key->type != Key::FOREIGN_KEY)
857
844
Then we do not need the generated shorter key.
859
846
if ((key2->type != Key::FOREIGN_KEY &&
860
key2->name.str != ignore_key &&
847
key2->name.data() != ignore_key &&
861
848
!foreign_key_prefix(key, key2)))
863
850
/* @todo issue warning message */
865
852
if (!key2->generated ||
866
853
(key->generated && key->columns.size() <
867
854
key2->columns.size()))
868
key->name.str= ignore_key;
855
key->name.assign(ignore_key, 1);
871
key2->name.str= ignore_key;
858
key2->name.assign(ignore_key, 1);
872
859
key_parts-= key2->columns.size();
879
if (key->name.str != ignore_key)
866
if (key->name.data() != ignore_key)
880
867
key_parts+=key->columns.size();
883
if (key->name.str && !tmp_table && (key->type != Key::PRIMARY) &&
884
is_primary_key_name(key->name.str))
870
if (key->name.data() && !tmp_table && (key->type != Key::PRIMARY) && is_primary_key(key->name.data()))
886
my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name.str);
872
my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name.data());
904
890
uint32_t key_length=0;
905
891
Key_part_spec *column;
907
if (key->name.str == ignore_key)
893
if (key->name.data() == ignore_key)
909
895
/* ignore redundant keys */
911
897
key=key_iterator++;
912
while (key && key->name.str == ignore_key);
898
while (key && key->name.data() == ignore_key);
934
920
key_info->algorithm= key->key_create_info.algorithm;
936
922
uint32_t tmp_len= system_charset_info->cset->charpos(system_charset_info,
937
key->key_create_info.comment.str,
938
key->key_create_info.comment.str +
939
key->key_create_info.comment.length,
923
key->key_create_info.comment.begin(),
924
key->key_create_info.comment.end(),
940
925
INDEX_COMMENT_MAXLEN);
942
if (tmp_len < key->key_create_info.comment.length)
927
if (tmp_len < key->key_create_info.comment.size())
944
my_error(ER_WRONG_STRING_LENGTH, MYF(0),
945
key->key_create_info.comment.str,"INDEX COMMENT",
946
(uint32_t) INDEX_COMMENT_MAXLEN);
929
my_error(ER_WRONG_STRING_LENGTH, MYF(0), key->key_create_info.comment.data(), "INDEX COMMENT", (uint32_t) INDEX_COMMENT_MAXLEN);
950
key_info->comment.length= key->key_create_info.comment.length;
951
if (key_info->comment.length > 0)
933
key_info->comment.assign(key_info->comment.data(), key->key_create_info.comment.size());
934
if (key_info->comment.size() > 0)
953
936
key_info->flags|= HA_USES_COMMENT;
954
key_info->comment.str= key->key_create_info.comment.str;
937
key_info->comment.assign(key->key_create_info.comment.data(), key_info->comment.size()); // weird
957
940
message::Table::Field *protofield= NULL;
979
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
962
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.data());
983
966
while ((dup_column= cols2++) != column)
985
968
if (!my_strcasecmp(system_charset_info,
986
column->field_name.str, dup_column->field_name.str))
969
column->field_name.data(), dup_column->field_name.data()))
988
971
my_printf_error(ER_DUP_FIELDNAME,
989
972
ER(ER_DUP_FIELDNAME),MYF(0),
990
column->field_name.str);
973
column->field_name.data());
1004
987
if (! (engine->check_flag(HTON_BIT_CAN_INDEX_BLOBS)))
1006
my_error(ER_BLOB_USED_AS_KEY, MYF(0), column->field_name.str);
989
my_error(ER_BLOB_USED_AS_KEY, MYF(0), column->field_name.data());
1009
992
if (! column->length)
1011
my_error(ER_BLOB_KEY_WITHOUT_LENGTH, MYF(0), column->field_name.str);
994
my_error(ER_BLOB_KEY_WITHOUT_LENGTH, MYF(0), column->field_name.data());
1034
1017
key_info->flags|= HA_NULL_PART_KEY;
1035
1018
if (! (engine->check_flag(HTON_BIT_NULL_IN_KEY)))
1037
my_error(ER_NULL_COLUMN_IN_INDEX, MYF(0), column->field_name.str);
1020
my_error(ER_NULL_COLUMN_IN_INDEX, MYF(0), column->field_name.data());
1092
1075
else if (length == 0)
1094
my_error(ER_WRONG_KEY_COLUMN, MYF(0), column->field_name.str);
1077
my_error(ER_WRONG_KEY_COLUMN, MYF(0), column->field_name.data());
1097
1080
if (length > engine->max_key_part_length())
1153
1136
key_name=pkey_name;
1156
else if (!(key_name= key->name.str))
1139
else if (!(key_name= key->name.data()))
1157
1140
key_name=make_unique_key_name(sql_field->field_name,
1158
1141
*key_info_buffer, key_info);
1159
1142
if (check_if_keyname_exists(key_name, *key_info_buffer, key_info))
1559
1542
make_unique_key_name(const char *field_name,KeyInfo *start,KeyInfo *end)
1561
1544
char buff[MAX_FIELD_NAME],*buff_end;
1563
if (!check_if_keyname_exists(field_name,start,end) &&
1564
!is_primary_key_name(field_name))
1565
return (char*) field_name; // Use fieldname
1546
if (not check_if_keyname_exists(field_name,start,end) && not is_primary_key(field_name))
1547
return field_name; // Use fieldname
1567
1549
buff_end= strncpy(buff, field_name, sizeof(buff)-4);
1568
1550
buff_end+= strlen(buff);
1824
1806
session->getClient()->store(table_name.c_str());
1825
1807
session->getClient()->store(operator_name);
1826
session->getClient()->store(warning_level_names[err->level].str, warning_level_names[err->level].length);
1808
session->getClient()->store(warning_level_names[err->level].data(), warning_level_names[err->level].size());
1827
1809
session->getClient()->store(err->msg);
1828
1810
if (session->getClient()->flush())
1965
1947
new_table_message.CopyFrom(*source_table_message);
1967
if (destination_identifier.isTmp())
1969
new_table_message.set_type(message::Table::TEMPORARY);
1973
new_table_message.set_type(message::Table::STANDARD);
1948
new_table_message.set_type(destination_identifier.isTmp() ? message::Table::TEMPORARY : message::Table::STANDARD);
1976
1950
if (is_engine_set)
2005
1979
As mysql_truncate don't work on a new table at this stage of
2006
1980
creation, instead create the table directly (for both normal and temporary tables).
2008
bool success= plugin::StorageEngine::createTable(session,
2009
destination_identifier,
1982
bool success= plugin::StorageEngine::createTable(session, destination_identifier, new_table_message);
2012
1984
if (success && not destination_identifier.isTmp())