1008
1011
if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME))
1011
If the UNIQUE key doesn't have NULL columns and is not a part key
1012
declare this as a primary key.
1015
for (uint32_t i= 0; i < keyinfo->key_parts; i++)
1017
uint32_t fieldnr= key_part[i].fieldnr;
1019
share->field[fieldnr-1]->null_ptr ||
1020
share->field[fieldnr-1]->key_length() != key_part[i].length)
1022
primary_key= MAX_KEY; // Can't be used
1014
If the UNIQUE key doesn't have NULL columns and is not a part key
1015
declare this as a primary key.
1018
for (uint32_t i= 0; i < keyinfo->key_parts; i++)
1020
uint32_t fieldnr= key_part[i].fieldnr;
1022
share->field[fieldnr-1]->null_ptr ||
1023
share->field[fieldnr-1]->key_length() != key_part[i].length)
1025
primary_key= MAX_KEY; // Can't be used
1028
1031
for (uint32_t i= 0 ; i < keyinfo->key_parts ; key_part++,i++)
1031
if (! key_part->fieldnr)
1033
abort(); // goto err;
1035
field= key_part->field= share->field[key_part->fieldnr-1];
1036
key_part->type= field->key_type();
1037
if (field->null_ptr)
1039
key_part->null_offset=(uint32_t) ((unsigned char*) field->null_ptr -
1040
share->default_values);
1041
key_part->null_bit= field->null_bit;
1042
key_part->store_length+=HA_KEY_NULL_LENGTH;
1043
keyinfo->flags|=HA_NULL_PART_KEY;
1044
keyinfo->extra_length+= HA_KEY_NULL_LENGTH;
1045
keyinfo->key_length+= HA_KEY_NULL_LENGTH;
1047
if (field->type() == DRIZZLE_TYPE_BLOB ||
1048
field->real_type() == DRIZZLE_TYPE_VARCHAR)
1050
if (field->type() == DRIZZLE_TYPE_BLOB)
1051
key_part->key_part_flag|= HA_BLOB_PART;
1053
key_part->key_part_flag|= HA_VAR_LENGTH_PART;
1054
keyinfo->extra_length+=HA_KEY_BLOB_LENGTH;
1055
key_part->store_length+=HA_KEY_BLOB_LENGTH;
1056
keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
1058
if (i == 0 && key != primary_key)
1059
field->flags |= (((keyinfo->flags & HA_NOSAME) &&
1060
(keyinfo->key_parts == 1)) ?
1061
UNIQUE_KEY_FLAG : MULTIPLE_KEY_FLAG);
1063
field->key_start.set(key);
1064
if (field->key_length() == key_part->length &&
1065
!(field->flags & BLOB_FLAG))
1067
enum ha_key_alg algo= share->key_info[key].algorithm;
1068
if (share->db_type()->index_flags(algo) & HA_KEYREAD_ONLY)
1070
share->keys_for_keyread.set(key);
1071
field->part_of_key.set(key);
1072
field->part_of_key_not_clustered.set(key);
1074
if (share->db_type()->index_flags(algo) & HA_READ_ORDER)
1075
field->part_of_sortkey.set(key);
1077
if (!(key_part->key_part_flag & HA_REVERSE_SORT) &&
1079
usable_parts++; // For FILESORT
1080
field->flags|= PART_KEY_FLAG;
1081
if (key == primary_key)
1083
field->flags|= PRI_KEY_FLAG;
1085
If this field is part of the primary key and all keys contains
1086
the primary key, then we can use any key to find this column
1088
if (share->storage_engine->check_flag(HTON_BIT_PRIMARY_KEY_IN_READ_INDEX))
1090
field->part_of_key= share->keys_in_use;
1091
if (field->part_of_sortkey.test(key))
1092
field->part_of_sortkey= share->keys_in_use;
1095
if (field->key_length() != key_part->length)
1097
key_part->key_part_flag|= HA_PART_KEY_SEG;
1034
if (! key_part->fieldnr)
1038
field= key_part->field= share->field[key_part->fieldnr-1];
1039
key_part->type= field->key_type();
1040
if (field->null_ptr)
1042
key_part->null_offset=(uint32_t) ((unsigned char*) field->null_ptr - share->default_values);
1043
key_part->null_bit= field->null_bit;
1044
key_part->store_length+=HA_KEY_NULL_LENGTH;
1045
keyinfo->flags|=HA_NULL_PART_KEY;
1046
keyinfo->extra_length+= HA_KEY_NULL_LENGTH;
1047
keyinfo->key_length+= HA_KEY_NULL_LENGTH;
1049
if (field->type() == DRIZZLE_TYPE_BLOB ||
1050
field->real_type() == DRIZZLE_TYPE_VARCHAR)
1052
if (field->type() == DRIZZLE_TYPE_BLOB)
1053
key_part->key_part_flag|= HA_BLOB_PART;
1055
key_part->key_part_flag|= HA_VAR_LENGTH_PART;
1056
keyinfo->extra_length+=HA_KEY_BLOB_LENGTH;
1057
key_part->store_length+=HA_KEY_BLOB_LENGTH;
1058
keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
1060
if (i == 0 && key != primary_key)
1061
field->flags |= (((keyinfo->flags & HA_NOSAME) &&
1062
(keyinfo->key_parts == 1)) ?
1063
UNIQUE_KEY_FLAG : MULTIPLE_KEY_FLAG);
1065
field->key_start.set(key);
1066
if (field->key_length() == key_part->length &&
1067
!(field->flags & BLOB_FLAG))
1069
enum ha_key_alg algo= share->key_info[key].algorithm;
1070
if (share->db_type()->index_flags(algo) & HA_KEYREAD_ONLY)
1072
share->keys_for_keyread.set(key);
1073
field->part_of_key.set(key);
1074
field->part_of_key_not_clustered.set(key);
1076
if (share->db_type()->index_flags(algo) & HA_READ_ORDER)
1077
field->part_of_sortkey.set(key);
1079
if (!(key_part->key_part_flag & HA_REVERSE_SORT) &&
1081
usable_parts++; // For FILESORT
1082
field->flags|= PART_KEY_FLAG;
1083
if (key == primary_key)
1085
field->flags|= PRI_KEY_FLAG;
1087
If this field is part of the primary key and all keys contains
1088
the primary key, then we can use any key to find this column
1090
if (share->storage_engine->check_flag(HTON_BIT_PRIMARY_KEY_IN_READ_INDEX))
1092
field->part_of_key= share->keys_in_use;
1093
if (field->part_of_sortkey.test(key))
1094
field->part_of_sortkey= share->keys_in_use;
1097
if (field->key_length() != key_part->length)
1099
key_part->key_part_flag|= HA_PART_KEY_SEG;
1100
1102
keyinfo->usable_key_parts= usable_parts; // Filesort
1102
1104
set_if_bigger(share->max_key_length,keyinfo->key_length+
1103
keyinfo->key_parts);
1105
keyinfo->key_parts);
1104
1106
share->total_key_length+= keyinfo->key_length;
1106
1108
if (keyinfo->flags & HA_NOSAME)
1108
set_if_bigger(share->max_unique_length,keyinfo->key_length);
1110
set_if_bigger(share->max_unique_length,keyinfo->key_length);
1111
1113
if (primary_key < MAX_KEY &&