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)
|
if (keyinfo->algorithm == HA_KEY_ALG_BTREE)
|
||||||
keyinfo->rb_tree.size_of_element++;
|
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;
|
keyinfo->length= length;
|
||||||
length+= keyinfo->rb_tree.size_of_element +
|
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)))
|
if (!(*key++= 1 - test(rec[seg->null_pos] & seg->null_bit)))
|
||||||
continue;
|
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);
|
memcpy(key, rec + seg->start, (size_t) seg->length);
|
||||||
key+= 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;
|
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);
|
memcpy((byte*) key, old, seg->length);
|
||||||
key+= seg->length;
|
key+= seg->length;
|
||||||
k_len-= seg->length;
|
k_len-= seg->length;
|
||||||
|
Reference in New Issue
Block a user