Commit b80fa400 authored by Sergei Golubchik's avatar Sergei Golubchik

bug: ha_heap was unilaterally increasing reclength

MEMORY engine needs the record length to be at least sizeof(void*),
because it stores a pointer there (linking deleted records into a list).
So when the reclength is less than sizeof(void*), it's set to sizeof(void*).
That is done inside heap_create(), and the upper layer doesn't know
that the engine writes beyond share->reclength.

While it's usually safe (in-memory record size is rounded up to
sizeof(double), so even if share->reclength is too small,
share->rec_buff_len is not), it could cause problems in the code that
copies records and expects them to fix in share->reclength,
e.g. in partitioning.
parent 444587d8
...@@ -100,6 +100,7 @@ const char **ha_heap::bas_ext() const ...@@ -100,6 +100,7 @@ const char **ha_heap::bas_ext() const
int ha_heap::open(const char *name, int mode, uint test_if_locked) int ha_heap::open(const char *name, int mode, uint test_if_locked)
{ {
set_if_bigger(table->s->reclength, sizeof (uchar*));
internal_table= test(test_if_locked & HA_OPEN_INTERNAL_TABLE); internal_table= test(test_if_locked & HA_OPEN_INTERNAL_TABLE);
if (internal_table || (!(file= heap_open(name, mode)) && my_errno == ENOENT)) if (internal_table || (!(file= heap_open(name, mode)) && my_errno == ENOENT))
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment