mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
Bug #26642: create index corrupts table definition in .frm
Thanks to Martin Friebe for finding and submitting a fix for this bug! A table with maximum number of key segments and maximum length key name would have a corrupted .frm file, due to an incorrect calculation of the complete key length. Now the key length is computed correctly (I hope) :-) MyISAM would reject a table with the maximum number of keys and the maximum number of key segments in all keys. It would allow one less than this total maximum. Now MyISAM accepts a table defined with the maximum. (This is a very minor issue.) myisam/mi_open.c: Bug #26642: change >= to > in a comparison (i.e., error only if key_parts_in_table really is greater than MAX_KEY * MAX_KEY_SEG) mysql-test/r/create.result: Bug #26642: test case mysql-test/t/create.test: Bug #26642: test case sql/table.cc: Bug #26642: In create_frm(), fix formula for key_length; it was too small by (keys * 2) bytes
This commit is contained in:
14
sql/table.cc
14
sql/table.cc
@@ -1442,7 +1442,19 @@ File create_frm(THD *thd, my_string name, const char *db,
|
||||
fileinfo[3]= (uchar) ha_checktype(thd,create_info->db_type,0,0);
|
||||
fileinfo[4]=1;
|
||||
int2store(fileinfo+6,IO_SIZE); /* Next block starts here */
|
||||
key_length=keys*(7+NAME_LEN+MAX_REF_PARTS*9)+16;
|
||||
/*
|
||||
Keep in sync with pack_keys() in unireg.cc
|
||||
For each key:
|
||||
8 bytes for the key header
|
||||
9 bytes for each key-part (MAX_REF_PARTS)
|
||||
NAME_LEN bytes for the name
|
||||
1 byte for the NAMES_SEP_CHAR (before the name)
|
||||
For all keys:
|
||||
6 bytes for the header
|
||||
1 byte for the NAMES_SEP_CHAR (after the last name)
|
||||
9 extra bytes (padding for safety? alignment?)
|
||||
*/
|
||||
key_length= keys * (8 + MAX_REF_PARTS * 9 + NAME_LEN + 1) + 16;
|
||||
length= next_io_size((ulong) (IO_SIZE+key_length+reclength+
|
||||
create_info->extra_size));
|
||||
int4store(fileinfo+10,length);
|
||||
|
Reference in New Issue
Block a user