mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
fix for byte ordering bug in HEAP rb-tree
This commit is contained in:
@ -55,6 +55,22 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
||||
if (keyinfo->algorithm == HA_KEY_ALG_BTREE)
|
||||
keyinfo->rb_tree.size_of_element++;
|
||||
}
|
||||
switch (keyinfo->seg[j].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:
|
||||
keyinfo->seg[j].flag|= HA_SWAP_KEY;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
keyinfo->length= length;
|
||||
length+= keyinfo->rb_tree.size_of_element +
|
||||
|
@ -443,6 +443,43 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key,
|
||||
if (!(*key++= 1 - test(rec[seg->null_pos] & seg->null_bit)))
|
||||
continue;
|
||||
}
|
||||
if (seg->flag & HA_SWAP_KEY)
|
||||
{
|
||||
uint length= seg->length;
|
||||
byte *pos= (byte*) rec + seg->start;
|
||||
|
||||
#ifdef HAVE_ISNAN
|
||||
if (seg->type == HA_KEYTYPE_FLOAT)
|
||||
{
|
||||
float nr;
|
||||
float4get(nr, pos);
|
||||
if (isnan(nr))
|
||||
{
|
||||
/* Replace NAN with zero */
|
||||
bzero(key, length);
|
||||
key+= length;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (seg->type == HA_KEYTYPE_DOUBLE)
|
||||
{
|
||||
double nr;
|
||||
float8get(nr, pos);
|
||||
if (isnan(nr))
|
||||
{
|
||||
bzero(key, length);
|
||||
key+= length;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
pos+= length;
|
||||
while (length--)
|
||||
{
|
||||
*key++= *--pos;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
memcpy(key, rec + seg->start, (size_t) seg->length);
|
||||
key+= seg->length;
|
||||
}
|
||||
@ -467,6 +504,18 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (seg->flag & HA_SWAP_KEY)
|
||||
{
|
||||
uint length= seg->length;
|
||||
byte *pos= (byte*) old + length;
|
||||
|
||||
k_len-= length;
|
||||
while (length--)
|
||||
{
|
||||
*key++= *--pos;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
memcpy((byte*) key, old, seg->length);
|
||||
key+= seg->length;
|
||||
k_len-= seg->length;
|
||||
|
Reference in New Issue
Block a user