summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorserg@serg.mylan <>2005-01-14 19:49:45 +0100
committerserg@serg.mylan <>2005-01-14 19:49:45 +0100
commit367bcf8c40202a884ba6b9dfc8f94b7bcf2a2adc (patch)
treefc8eed46069b12bdd227706a53e83c9c53c5633c /sql
parent78756fe7b116d3fad45bd756f800eec084961e67 (diff)
downloadmariadb-git-367bcf8c40202a884ba6b9dfc8f94b7bcf2a2adc.tar.gz
limit HEAP table size with max_heap_table_size, better estimation for mem_per_row
Diffstat (limited to 'sql')
-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));