summaryrefslogtreecommitdiff
path: root/sql/ha_heap.cc
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2005-01-14 19:49:45 +0100
committerunknown <serg@serg.mylan>2005-01-14 19:49:45 +0100
commitb7efd8174a9e46ae89337b0364f132a574dc6c2f (patch)
treefc8eed46069b12bdd227706a53e83c9c53c5633c /sql/ha_heap.cc
parent9edcc56cc8af12b5140fcb2ef973b44cb03d8f4c (diff)
downloadmariadb-git-b7efd8174a9e46ae89337b0364f132a574dc6c2f.tar.gz
limit HEAP table size with max_heap_table_size, better estimation for mem_per_row
heap/hp_create.c: limit HEAP table size with max_heap_table_size heap/hp_write.c: limit HEAP table size with max_heap_table_size include/heap.h: limit HEAP table size with max_heap_table_size sql/ha_heap.cc: limit HEAP table size with max_heap_table_size better estimation for mem_per_row
Diffstat (limited to 'sql/ha_heap.cc')
-rw-r--r--sql/ha_heap.cc24
1 files changed, 18 insertions, 6 deletions
diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc
index dbcf7bc9197..96c19ce0705 100644
--- a/sql/ha_heap.cc
+++ b/sql/ha_heap.cc
@@ -460,12 +460,24 @@ int ha_heap::create(const char *name, TABLE *table_arg,
KEY_PART_INFO *key_part= pos->key_part;
KEY_PART_INFO *key_part_end= key_part + pos->key_parts;
- mem_per_row+= (pos->key_length + (sizeof(char*) * 2));
-
keydef[key].keysegs= (uint) pos->key_parts;
keydef[key].flag= (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL));
keydef[key].seg= seg;
- keydef[key].algorithm= ((pos->algorithm == HA_KEY_ALG_UNDEF) ?
+
+ switch (pos->algorithm) {
+ case HA_KEY_ALG_UNDEF:
+ case HA_KEY_ALG_HASH:
+ keydef[key].algorithm= HA_KEY_ALG_HASH;
+ mem_per_row+= sizeof(char*) * 2; // = sizeof(HASH_INFO)
+ break;
+ case HA_KEY_ALG_BTREE:
+ keydef[key].algorithm= HA_KEY_ALG_BTREE;
+ mem_per_row+=sizeof(TREE_ELEMENT)+pos->key_length+sizeof(char*);
+ break;
+ default:
+ DBUG_ASSERT(0); // cannot happen
+ }
+ keydef[key].algorithm= ((pos->algorithm == HA_KEY_ALG_UNDEF) ?
HA_KEY_ALG_HASH : pos->algorithm);
for (; key_part != key_part_end; key_part++, seg++)
@@ -501,17 +513,17 @@ int ha_heap::create(const char *name, TABLE *table_arg,
}
}
mem_per_row+= MY_ALIGN(table_arg->reclength + 1, sizeof(char*));
- max_rows = (ha_rows) (current_thd->variables.max_heap_table_size /
- mem_per_row);
HP_CREATE_INFO hp_create_info;
hp_create_info.auto_key= auto_key;
hp_create_info.auto_key_type= auto_key_type;
hp_create_info.auto_increment= (create_info->auto_increment_value ?
create_info->auto_increment_value - 1 : 0);
+ hp_create_info.max_table_size=current_thd->variables.max_heap_table_size;
+ max_rows = (ha_rows) (hp_create_info.max_table_size / mem_per_row);
error= heap_create(fn_format(buff,name,"","",4+2),
table_arg->keys,keydef, table_arg->reclength,
(ulong) ((table_arg->max_rows < max_rows &&
- table_arg->max_rows) ?
+ table_arg->max_rows) ?
table_arg->max_rows : max_rows),
(ulong) table_arg->min_rows, &hp_create_info);
my_free((gptr) keydef, MYF(0));