diff options
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/mi_create.c | 146 | ||||
-rw-r--r-- | myisam/mi_delete.c | 5 | ||||
-rw-r--r-- | myisam/mi_search.c | 2 | ||||
-rw-r--r-- | myisam/myisamchk.c | 3 |
4 files changed, 79 insertions, 77 deletions
diff --git a/myisam/mi_create.c b/myisam/mi_create.c index 38573951468..6de13f8f84a 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -274,86 +274,86 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, } else { - /* Test if prefix compression */ - if (keydef->flag & HA_PACK_KEY) - { - /* Can't use space_compression on number keys */ - if ((keydef->seg[0].flag & HA_SPACE_PACK) && - keydef->seg[0].type == (int) HA_KEYTYPE_NUM) - keydef->seg[0].flag&= ~HA_SPACE_PACK; - - /* Only use HA_PACK_KEY if the first segment is a variable length key */ - if (!(keydef->seg[0].flag & (HA_SPACE_PACK | HA_BLOB_PART | - HA_VAR_LENGTH))) + /* Test if prefix compression */ + if (keydef->flag & HA_PACK_KEY) { - /* pack relative to previous key */ - keydef->flag&= ~HA_PACK_KEY; - keydef->flag|= HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY; + /* Can't use space_compression on number keys */ + if ((keydef->seg[0].flag & HA_SPACE_PACK) && + keydef->seg[0].type == (int) HA_KEYTYPE_NUM) + keydef->seg[0].flag&= ~HA_SPACE_PACK; + + /* Only use HA_PACK_KEY if the first segment is a variable length key */ + if (!(keydef->seg[0].flag & (HA_SPACE_PACK | HA_BLOB_PART | + HA_VAR_LENGTH))) + { + /* pack relative to previous key */ + keydef->flag&= ~HA_PACK_KEY; + keydef->flag|= HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY; + } + else + { + keydef->seg[0].flag|=HA_PACK_KEY; /* for easyer intern test */ + keydef->flag|=HA_VAR_LENGTH_KEY; + options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ + } } - else - { - keydef->seg[0].flag|=HA_PACK_KEY; /* for easyer intern test */ - keydef->flag|=HA_VAR_LENGTH_KEY; + if (keydef->flag & HA_BINARY_PACK_KEY) options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ - } - } - if (keydef->flag & HA_BINARY_PACK_KEY) - options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ - if (keydef->flag & HA_AUTO_KEY) - share.base.auto_key=i+1; - for (j=0, keyseg=keydef->seg ; j < keydef->keysegs ; j++, keyseg++) - { - /* numbers are stored with high by first to make compression easier */ - switch (keyseg->type) { - case HA_KEYTYPE_SHORT_INT: - case HA_KEYTYPE_LONG_INT: - case HA_KEYTYPE_FLOAT: - case HA_KEYTYPE_DOUBLE: - case HA_KEYTYPE_USHORT_INT: - case HA_KEYTYPE_ULONG_INT: - case HA_KEYTYPE_LONGLONG: - case HA_KEYTYPE_ULONGLONG: - case HA_KEYTYPE_INT24: - case HA_KEYTYPE_UINT24: - case HA_KEYTYPE_INT8: - keyseg->flag|= HA_SWAP_KEY; - /* fall through */ - default: - break; - } - if (keyseg->flag & HA_SPACE_PACK) + if (keydef->flag & HA_AUTO_KEY) + share.base.auto_key=i+1; + for (j=0, keyseg=keydef->seg ; j < keydef->keysegs ; j++, keyseg++) { - keydef->flag |= HA_SPACE_PACK_USED | HA_VAR_LENGTH_KEY; - options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ - length++; /* At least one length byte */ - min_key_length_skipp+=keyseg->length; - if (keyseg->length >= 255) - { /* prefix may be 3 bytes */ - min_key_length_skipp+=2; - length+=2; + /* numbers are stored with high by first to make compression easier */ + switch (keyseg->type) { + case HA_KEYTYPE_SHORT_INT: + case HA_KEYTYPE_LONG_INT: + case HA_KEYTYPE_FLOAT: + case HA_KEYTYPE_DOUBLE: + case HA_KEYTYPE_USHORT_INT: + case HA_KEYTYPE_ULONG_INT: + case HA_KEYTYPE_LONGLONG: + case HA_KEYTYPE_ULONGLONG: + case HA_KEYTYPE_INT24: + case HA_KEYTYPE_UINT24: + case HA_KEYTYPE_INT8: + keyseg->flag|= HA_SWAP_KEY; + /* fall through */ + default: + break; } - } - if (keyseg->flag & (HA_VAR_LENGTH | HA_BLOB_PART)) - { - keydef->flag|=HA_VAR_LENGTH_KEY; - length++; /* At least one length byte */ - options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ - min_key_length_skipp+=keyseg->length; - if (keyseg->length >= 255) - { /* prefix may be 3 bytes */ - min_key_length_skipp+=2; - length+=2; + if (keyseg->flag & HA_SPACE_PACK) + { + keydef->flag |= HA_SPACE_PACK_USED | HA_VAR_LENGTH_KEY; + options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ + length++; /* At least one length byte */ + min_key_length_skipp+=keyseg->length; + if (keyseg->length >= 255) + { /* prefix may be 3 bytes */ + min_key_length_skipp+=2; + length+=2; + } + } + if (keyseg->flag & (HA_VAR_LENGTH | HA_BLOB_PART)) + { + keydef->flag|=HA_VAR_LENGTH_KEY; + length++; /* At least one length byte */ + options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ + min_key_length_skipp+=keyseg->length; + if (keyseg->length >= 255) + { /* prefix may be 3 bytes */ + min_key_length_skipp+=2; + length+=2; + } + } + key_length+= keyseg->length; + if (keyseg->null_bit) + { + key_length++; + options|=HA_OPTION_PACK_KEYS; + keyseg->flag|=HA_NULL_PART; + keydef->flag|=HA_VAR_LENGTH_KEY | HA_NULL_PART_KEY; } - } - key_length+= keyseg->length; - if (keyseg->null_bit) - { - key_length++; - options|=HA_OPTION_PACK_KEYS; - keyseg->flag|=HA_NULL_PART; - keydef->flag|=HA_VAR_LENGTH_KEY | HA_NULL_PART_KEY; - } } } /* if HA_FULLTEXT */ key_segs+=keydef->keysegs; diff --git a/myisam/mi_delete.c b/myisam/mi_delete.c index f8bc37d8e20..445e745b07d 100644 --- a/myisam/mi_delete.c +++ b/myisam/mi_delete.c @@ -707,9 +707,10 @@ static uint remove_key(MI_KEYDEF *keyinfo, uint nod_flag, } else { - /* A variable length first key part */ - if (*keypos & 128) /* Next key is packed */ + /* Check if a variable length first key part */ + if ((keyinfo->seg->flag & HA_PACK_KEY) && *keypos & 128) { + /* Next key is packed against the current one */ uint next_length,prev_length,prev_pack_length,lastkey_length, rest_length; if (keyinfo->seg[0].length >= 127) diff --git a/myisam/mi_search.c b/myisam/mi_search.c index 3ffc348ca5c..7888e73b235 100644 --- a/myisam/mi_search.c +++ b/myisam/mi_search.c @@ -830,6 +830,7 @@ uint _mi_get_static_key(register MI_KEYDEF *keyinfo, uint nod_flag, } /* _mi_get_static_key */ +/* Key with is packed against previous key or key with a NULL column */ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, register uchar **page_pos, register uchar *key) @@ -841,7 +842,6 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, start_key=key; for (keyseg=keyinfo->seg ; keyseg->type ;keyseg++) { - /* First key part is always packed !*/ if (keyseg->flag & HA_PACK_KEY) { /* key with length, packed to previous key */ diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index cb463e338bb..0e6f5927a3a 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -200,7 +200,7 @@ static struct option long_options[] = static void print_version(void) { - printf("%s Ver 1.39 for %s at %s\n",my_progname,SYSTEM_TYPE, + printf("%s Ver 1.40 for %s at %s\n",my_progname,SYSTEM_TYPE, MACHINE_TYPE); } @@ -995,6 +995,7 @@ static void descript(MI_CHECK *param, register MI_INFO *info, my_string name) { keyseg=keyinfo->seg; if (keyinfo->flag & HA_NOSAME) text="unique "; + else if (keyinfo->flag & HA_FULLTEXT) text="fulltext "; else text="multip."; pos=buff; |