summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
Diffstat (limited to 'myisam')
-rw-r--r--myisam/mi_create.c146
-rw-r--r--myisam/mi_delete.c5
-rw-r--r--myisam/mi_search.c2
-rw-r--r--myisam/myisamchk.c3
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;