1018
1109
if (null_count & 7)
1019
1110
*(record + null_count / 8)|= ~(((unsigned char) 1 << (null_count & 7)) - 1);
1112
share->null_bytes= (null_pos - (unsigned char*) record +
1113
(null_bit_pos + 7) / 8);
1115
share->last_null_bit_pos= null_bit_pos;
1021
1117
free(field_offsets);
1022
1118
free(field_pack_length);
1120
handler *handler_file;
1122
if(!(handler_file= get_new_handler(share, session->mem_root,
1127
if (share->key_parts)
1129
uint32_t primary_key=(uint32_t) (find_type((char*) "PRIMARY",
1130
&share->keynames, 3) - 1);
1132
int64_t ha_option= handler_file->ha_table_flags();
1134
keyinfo= share->key_info;
1135
key_part= keyinfo->key_part;
1137
for (uint32_t key=0 ; key < share->keys ; key++,keyinfo++)
1139
uint32_t usable_parts= 0;
1141
if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME))
1144
If the UNIQUE key doesn't have NULL columns and is not a part key
1145
declare this as a primary key.
1148
for (uint32_t i=0 ; i < keyinfo->key_parts ;i++)
1150
uint32_t fieldnr= key_part[i].fieldnr;
1152
share->field[fieldnr-1]->null_ptr ||
1153
share->field[fieldnr-1]->key_length() !=
1156
primary_key=MAX_KEY; // Can't be used
1162
for (uint32_t i=0 ; i < keyinfo->key_parts ; key_part++,i++)
1165
if (!key_part->fieldnr)
1167
// error= 4; // Wrong file
1168
abort(); // goto err;
1170
field= key_part->field= share->field[key_part->fieldnr-1];
1171
key_part->type= field->key_type();
1172
if (field->null_ptr)
1174
key_part->null_offset=(uint32_t) ((unsigned char*) field->null_ptr -
1175
share->default_values);
1176
key_part->null_bit= field->null_bit;
1177
key_part->store_length+=HA_KEY_NULL_LENGTH;
1178
keyinfo->flags|=HA_NULL_PART_KEY;
1179
keyinfo->extra_length+= HA_KEY_NULL_LENGTH;
1180
keyinfo->key_length+= HA_KEY_NULL_LENGTH;
1182
if (field->type() == DRIZZLE_TYPE_BLOB ||
1183
field->real_type() == DRIZZLE_TYPE_VARCHAR)
1185
if (field->type() == DRIZZLE_TYPE_BLOB)
1186
key_part->key_part_flag|= HA_BLOB_PART;
1188
key_part->key_part_flag|= HA_VAR_LENGTH_PART;
1189
keyinfo->extra_length+=HA_KEY_BLOB_LENGTH;
1190
key_part->store_length+=HA_KEY_BLOB_LENGTH;
1191
keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
1193
if (i == 0 && key != primary_key)
1194
field->flags |= (((keyinfo->flags & HA_NOSAME) &&
1195
(keyinfo->key_parts == 1)) ?
1196
UNIQUE_KEY_FLAG : MULTIPLE_KEY_FLAG);
1198
field->key_start.set_bit(key);
1199
if (field->key_length() == key_part->length &&
1200
!(field->flags & BLOB_FLAG))
1202
if (handler_file->index_flags(key, i, 0) & HA_KEYREAD_ONLY)
1204
share->keys_for_keyread.set_bit(key);
1205
field->part_of_key.set_bit(key);
1206
field->part_of_key_not_clustered.set_bit(key);
1208
if (handler_file->index_flags(key, i, 1) & HA_READ_ORDER)
1209
field->part_of_sortkey.set_bit(key);
1211
if (!(key_part->key_part_flag & HA_REVERSE_SORT) &&
1213
usable_parts++; // For FILESORT
1214
field->flags|= PART_KEY_FLAG;
1215
if (key == primary_key)
1217
field->flags|= PRI_KEY_FLAG;
1219
If this field is part of the primary key and all keys contains
1220
the primary key, then we can use any key to find this column
1222
if (ha_option & HA_PRIMARY_KEY_IN_READ_INDEX)
1224
field->part_of_key= share->keys_in_use;
1225
if (field->part_of_sortkey.is_set(key))
1226
field->part_of_sortkey= share->keys_in_use;
1229
if (field->key_length() != key_part->length)
1231
key_part->key_part_flag|= HA_PART_KEY_SEG;
1234
keyinfo->usable_key_parts= usable_parts; // Filesort
1236
set_if_bigger(share->max_key_length,keyinfo->key_length+
1237
keyinfo->key_parts);
1238
share->total_key_length+= keyinfo->key_length;
1240
MERGE tables do not have unique indexes. But every key could be
1241
an unique index on the underlying MyISAM table. (Bug #10400)
1243
if ((keyinfo->flags & HA_NOSAME) ||
1244
(ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE))
1245
set_if_bigger(share->max_unique_length,keyinfo->key_length);
1247
if (primary_key < MAX_KEY &&
1248
(share->keys_in_use.is_set(primary_key)))
1250
share->primary_key= primary_key;
1252
If we are using an integer as the primary key then allow the user to
1253
refer to it as '_rowid'
1255
if (share->key_info[primary_key].key_parts == 1)
1257
Field *field= share->key_info[primary_key].key_part[0].field;
1258
if (field && field->result_type() == INT_RESULT)
1260
/* note that fieldnr here (and rowid_field_offset) starts from 1 */
1261
share->rowid_field_offset= (share->key_info[primary_key].key_part[0].
1268
share->primary_key = MAX_KEY; // we do not have a primary key
1271
share->primary_key= MAX_KEY;
1273
delete handler_file;
1457
1706
record= share->default_values-1; /* Fieldstart = 1 */
1459
null_flags= null_pos= (unsigned char*) record+1;
1460
null_bit_pos= (db_create_options & HA_OPTION_PACK_RECORD) ? 0 : 1;
1462
null_bytes below is only correct under the condition that
1463
there are no bit fields. Correct values is set below after the
1464
table struct is initialized
1466
share->null_bytes= (share->null_fields + null_bit_pos + 7) / 8;
1468
use_hash= share->fields >= MAX_FIELDS_BEFORE_HASH;
1470
use_hash= !hash_init(&share->name_hash,
1471
system_charset_info,
1473
(hash_get_key) get_field_name,0,0);
1475
for (i=0 ; i < share->fields; i++, strpos+=field_pack_length, field_ptr++)
1477
uint32_t pack_flag, interval_nr, unireg_type, recpos, field_length;
1478
uint32_t vcol_info_length=0;
1479
enum_field_types field_type;
1480
enum column_format_type column_format= COLUMN_FORMAT_TYPE_DEFAULT;
1481
const CHARSET_INFO *charset= NULL;
1483
virtual_column_info *vcol_info= NULL;
1484
bool fld_is_stored= true;
1486
if (field_extra_info)
1488
char tmp= field_extra_info[i];
1489
column_format= (enum column_format_type)
1490
((tmp >> COLUMN_FORMAT_SHIFT) & COLUMN_FORMAT_MASK);
1492
if (new_frm_ver >= 3)
1494
/* new frm file in 4.1 */
1495
field_length= uint2korr(strpos+3);
1496
recpos= uint3korr(strpos+5);
1497
pack_flag= uint2korr(strpos+8);
1498
unireg_type= (uint32_t) strpos[10];
1499
interval_nr= (uint32_t) strpos[12];
1500
uint32_t comment_length=uint2korr(strpos+15);
1501
field_type=(enum_field_types) (uint32_t) strpos[13];
1505
charset= &my_charset_bin;
1506
else if (!(charset=get_charset((uint32_t) strpos[14])))
1508
error= 5; // Unknown or unavailable charset
1509
errarg= (int) strpos[14];
1513
if (field_type == DRIZZLE_TYPE_VIRTUAL)
1515
assert(interval_nr); // Expect non-null expression
1517
The interval_id byte in the .frm file stores the length of the
1518
expression statement for a virtual column.
1520
vcol_info_length= interval_nr;
1523
if (!comment_length)
1525
comment.str= (char*) "";
1530
comment.str= strmake_root(&share->mem_root, comment_pos, comment_length);
1531
comment.length= comment_length;
1532
comment_pos+= comment_length;
1534
if (vcol_info_length)
1537
Get virtual column data stored in the .frm file as follows:
1538
byte 1 = 1 (always 1 to allow for future extensions)
1540
byte 3 = flags (as of now, 0 - no flags, 1 - field is physically stored)
1541
byte 4-... = virtual column expression (text data)
1543
vcol_info= new virtual_column_info();
1544
if ((uint32_t)vcol_screen_pos[0] != 1)
1549
field_type= (enum_field_types) (unsigned char) vcol_screen_pos[1];
1550
fld_is_stored= (bool) (uint32_t) vcol_screen_pos[2];
1551
vcol_info->expr_str.str= (char *)memdup_root(&share->mem_root,
1553
(uint32_t)FRM_VCOL_HEADER_SIZE,
1555
(uint32_t)FRM_VCOL_HEADER_SIZE);
1556
vcol_info->expr_str.length= vcol_info_length-(uint32_t)FRM_VCOL_HEADER_SIZE;
1557
vcol_screen_pos+= vcol_info_length;
1563
assert(false); /* Old (pre-4.1) FRM file. This is Drizzle. */
1566
if (interval_nr && charset->mbminlen > 1)
1568
/* Unescape UCS2 intervals from HEX notation */
1569
TYPELIB *interval= share->intervals + interval_nr - 1;
1570
unhex_type2(interval);
1573
*field_ptr= reg_field=
1574
make_field(share, record+recpos,
1575
(uint32_t) field_length,
1576
null_pos, null_bit_pos,
1580
(Field::utype) MTYP_TYPENR(unireg_type),
1582
share->intervals+interval_nr-1 :
1584
share->fieldnames.type_names[i]);
1585
if (!reg_field) // Not supported field type
1588
goto err; /* purecov: inspected */
1591
reg_field->flags|= ((uint32_t)column_format << COLUMN_FORMAT_FLAGS);
1592
reg_field->field_index= i;
1593
reg_field->comment=comment;
1594
reg_field->vcol_info= vcol_info;
1595
reg_field->is_stored= fld_is_stored;
1596
if (!(reg_field->flags & NOT_NULL_FLAG))
1598
if (!(null_bit_pos= (null_bit_pos + 1) & 7))
1601
if (f_no_default(pack_flag))
1602
reg_field->flags|= NO_DEFAULT_VALUE_FLAG;
1604
if (reg_field->unireg_check == Field::NEXT_NUMBER)
1605
share->found_next_number_field= field_ptr;
1606
if (share->timestamp_field == reg_field)
1607
share->timestamp_field_offset= i;
1610
(void) my_hash_insert(&share->name_hash,
1611
(unsigned char*) field_ptr); // never fail
1612
if (!reg_field->is_stored)
1614
share->stored_fields--;
1615
if (share->stored_rec_length>=recpos)
1616
share->stored_rec_length= recpos-1;
1619
*field_ptr=0; // End marker
1620
1708
/* Sanity checks: */
1621
1709
assert(share->fields>=share->stored_fields);
1622
1710
assert(share->reclength>=share->stored_rec_length);
1624
/* Fix key->name and key_part->field */
1627
uint32_t primary_key=(uint32_t) (find_type((char*) "PRIMARY",
1628
&share->keynames, 3) - 1);
1629
int64_t ha_option= handler_file->ha_table_flags();
1630
keyinfo= share->key_info;
1631
key_part= keyinfo->key_part;
1633
for (uint32_t key=0 ; key < share->keys ; key++,keyinfo++)
1635
uint32_t usable_parts= 0;
1636
// keyinfo->name=(char*) share->keynames.type_names[key];
1638
if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME))
1641
If the UNIQUE key doesn't have NULL columns and is not a part key
1642
declare this as a primary key.
1645
for (i=0 ; i < keyinfo->key_parts ;i++)
1647
uint32_t fieldnr= key_part[i].fieldnr;
1649
share->field[fieldnr-1]->null_ptr ||
1650
share->field[fieldnr-1]->key_length() !=
1653
primary_key=MAX_KEY; // Can't be used
1659
for (i=0 ; i < keyinfo->key_parts ; key_part++,i++)
1662
if (!key_part->fieldnr)
1664
error= 4; // Wrong file
1667
field= key_part->field= share->field[key_part->fieldnr-1];
1668
key_part->type= field->key_type();
1669
if (field->null_ptr)
1671
key_part->null_offset=(uint32_t) ((unsigned char*) field->null_ptr -
1672
share->default_values);
1673
key_part->null_bit= field->null_bit;
1674
key_part->store_length+=HA_KEY_NULL_LENGTH;
1675
keyinfo->flags|=HA_NULL_PART_KEY;
1676
keyinfo->extra_length+= HA_KEY_NULL_LENGTH;
1677
keyinfo->key_length+= HA_KEY_NULL_LENGTH;
1679
if (field->type() == DRIZZLE_TYPE_BLOB ||
1680
field->real_type() == DRIZZLE_TYPE_VARCHAR)
1682
if (field->type() == DRIZZLE_TYPE_BLOB)
1683
key_part->key_part_flag|= HA_BLOB_PART;
1685
key_part->key_part_flag|= HA_VAR_LENGTH_PART;
1686
keyinfo->extra_length+=HA_KEY_BLOB_LENGTH;
1687
key_part->store_length+=HA_KEY_BLOB_LENGTH;
1688
keyinfo->key_length+= HA_KEY_BLOB_LENGTH;
1690
if (i == 0 && key != primary_key)
1691
field->flags |= (((keyinfo->flags & HA_NOSAME) &&
1692
(keyinfo->key_parts == 1)) ?
1693
UNIQUE_KEY_FLAG : MULTIPLE_KEY_FLAG);
1695
field->key_start.set_bit(key);
1696
if (field->key_length() == key_part->length &&
1697
!(field->flags & BLOB_FLAG))
1699
if (handler_file->index_flags(key, i, 0) & HA_KEYREAD_ONLY)
1701
share->keys_for_keyread.set_bit(key);
1702
field->part_of_key.set_bit(key);
1703
field->part_of_key_not_clustered.set_bit(key);
1705
if (handler_file->index_flags(key, i, 1) & HA_READ_ORDER)
1706
field->part_of_sortkey.set_bit(key);
1708
if (!(key_part->key_part_flag & HA_REVERSE_SORT) &&
1710
usable_parts++; // For FILESORT
1711
field->flags|= PART_KEY_FLAG;
1712
if (key == primary_key)
1714
field->flags|= PRI_KEY_FLAG;
1716
If this field is part of the primary key and all keys contains
1717
the primary key, then we can use any key to find this column
1719
if (ha_option & HA_PRIMARY_KEY_IN_READ_INDEX)
1721
field->part_of_key= share->keys_in_use;
1722
if (field->part_of_sortkey.is_set(key))
1723
field->part_of_sortkey= share->keys_in_use;
1726
if (field->key_length() != key_part->length)
1728
key_part->key_part_flag|= HA_PART_KEY_SEG;
1731
keyinfo->usable_key_parts= usable_parts; // Filesort
1733
set_if_bigger(share->max_key_length,keyinfo->key_length+
1734
keyinfo->key_parts);
1735
share->total_key_length+= keyinfo->key_length;
1737
MERGE tables do not have unique indexes. But every key could be
1738
an unique index on the underlying MyISAM table. (Bug #10400)
1740
if ((keyinfo->flags & HA_NOSAME) ||
1741
(ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE))
1742
set_if_bigger(share->max_unique_length,keyinfo->key_length);
1744
if (primary_key < MAX_KEY &&
1745
(share->keys_in_use.is_set(primary_key)))
1747
share->primary_key= primary_key;
1749
If we are using an integer as the primary key then allow the user to
1750
refer to it as '_rowid'
1752
if (share->key_info[primary_key].key_parts == 1)
1754
Field *field= share->key_info[primary_key].key_part[0].field;
1755
if (field && field->result_type() == INT_RESULT)
1757
/* note that fieldnr here (and rowid_field_offset) starts from 1 */
1758
share->rowid_field_offset= (share->key_info[primary_key].key_part[0].
1764
share->primary_key = MAX_KEY; // we do not have a primary key
1767
share->primary_key= MAX_KEY;
1769
1714
free(disk_buff);
1770
1715
disk_buff= NULL;
1771
if (new_field_pack_flag <= 1)
1773
/* Old file format with default as not null */
1774
uint32_t null_length= (share->null_fields+7)/8;
1775
memset(share->default_values + (null_flags - (unsigned char*) record),
1779
1717
if (share->found_next_number_field)