Commit 5df8c7b0 authored by unknown's avatar unknown

ixed overflow bug in MyISAM and ISAM when using packed tables with a lot of fields and blobs


isam/open.c:
  Fixed overflow bug when using packed tables and blobs
isam/test_all.res:
  updated test results
myisam/mi_dynrec.c:
  pack_bits not needed here as we do it on open
myisam/mi_open.c:
  Fixed overflow bug when using packed tables and blobs
parent 67f4bfd1
...@@ -415,6 +415,9 @@ static void setup_functions(register ISAM_SHARE *share) ...@@ -415,6 +415,9 @@ static void setup_functions(register ISAM_SHARE *share)
share->read_rnd=_nisam_read_rnd_dynamic_record; share->read_rnd=_nisam_read_rnd_dynamic_record;
share->delete_record=_nisam_delete_dynamic_record; share->delete_record=_nisam_delete_dynamic_record;
share->compare_record=_nisam_cmp_dynamic_record; share->compare_record=_nisam_cmp_dynamic_record;
/* add bits used to pack data to pack_reclength for faster allocation */
share->base.pack_reclength+= share->base.pack_bits;
if (share->base.blobs) if (share->base.blobs)
{ {
share->update_record=_nisam_update_blob_record; share->update_record=_nisam_update_blob_record;
......
echo "test2 -L -K -W -P"
test2 -L -K -W -P test2 -L -K -W -P
- Creating isam-file echo "test2 -L -K -W -P -A"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Key cacheing used
Write cacheing used
Locking used
test2 -L -K -W -P -A test2 -L -K -W -P -A
- Creating isam-file echo "test2 -L -K -W -P -S -R1 -m500"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Key cacheing used
Write cacheing used
Asyncron io with locking used
test2 -L -K -W -P -S -R1 -m500 test2 -L -K -W -P -S -R1 -m500
- Creating isam-file echo "test2 -L -K -R1 -m2000 ; Should give error 135"
- Writing key:s test2 -L -K -R1 -m2000
- Delete echo "test2 -L -K -P -S -R3 -m50 -b1000000"
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 475
Update records: 44
Same-key-read: 4
Delete records: 475
Record pointer size: 1
Key cacheing used
Write cacheing used
Locking used
test2 -L -K -R1 -m2000 ; Should give error 135
- Creating isam-file
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Read first - delete - next -> last
- Read last - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 1647
Update records: 125
Same-key-read: 8
Delete records: 1647
Record pointer size: 1
Key cacheing used
Locking used
test2 -L -K -P -S -R3 -m50 -b1000000 test2 -L -K -P -S -R3 -m50 -b1000000
- Creating isam-file echo "test2 -L -B"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 50
Update records: 5
Same-key-read: 2
Delete records: 50
Record pointer size: 3
Key cacheing used
Locking used
test2 -L -B test2 -L -B
- Creating isam-file echo "test2 -L -K -W -P -m50 -l"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 903
Update records: 86
Same-key-read: 5
Delete records: 903
Locking used
blobs used
test2 -L -K -W -P -m50 -l test2 -L -K -W -P -m50 -l
- Creating isam-file isamlog
- Writing key:s echo "test2 -L -K -W -P -m50 -l -b100"
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 50
Update records: 5
Same-key-read: 2
Delete records: 50
Key cacheing used
Write cacheing used
Locking used
Commands Used count Errors Recover errors
open 14 0 0
write 700 0 0
update 70 0 0
delete 700 0 0
close 14 0 0
extra 84 0 0
Total 1582 0 0
test2 -L -K -W -P -m50 -l -b100 test2 -L -K -W -P -m50 -l -b100
- Creating isam-file isamlog
- Writing key:s echo "time test2"
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 50
Update records: 5
Same-key-read: 2
Delete records: 50
Key cacheing used
Write cacheing used
Locking used
Commands Used count Errors Recover errors
open 15 0 0
write 750 0 0
update 75 0 0
delete 750 0 0
close 15 0 0
extra 90 0 0
Total 1695 0 0
time test2 time test2
- Creating isam-file echo "time test2 -K"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
time test2 -K time test2 -K
- Creating isam-file echo "time test2 -L"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Key cacheing used
time test2 -L time test2 -L
- Creating isam-file echo "time test2 -L -K"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Locking used
time test2 -L -K time test2 -L -K
- Creating isam-file echo "time test2 -L -K -W"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Key cacheing used
Locking used
time test2 -L -K -W time test2 -L -K -W
- Creating isam-file echo "time test2 -L -K -W -S"
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Key cacheing used
Write cacheing used
Locking used
time test2 -L -K -W -S time test2 -L -K -W -S
- Creating isam-file
- Writing key:s
- Delete
- Update
- Same key: first - next -> last - prev -> first
- All keys: first - next -> last - prev -> first
- Test if: Read first - next - prev - prev - next == first
- Test if: Read last - prev - next - next - prev == last
- Test read key-part
- Read key (first) - next - delete - next -> last
- Read last of key - prev - delete - prev -> first
- Test if: Read rrnd - same
- Test nisam_records_in_range
- nisam_info
- nisam_extra(CACHE) + nisam_rrnd.... + nisam_extra(NO_CACHE)
- Removing keys
Following test have been made:
Write records: 907
Update records: 87
Same-key-read: 6
Delete records: 907
Key cacheing used
Write cacheing used
Locking used
...@@ -62,7 +62,7 @@ int _mi_write_blob_record(MI_INFO *info, const byte *record) ...@@ -62,7 +62,7 @@ int _mi_write_blob_record(MI_INFO *info, const byte *record)
extra=ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+ extra=ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+
MI_DYN_DELETE_BLOCK_HEADER+1; MI_DYN_DELETE_BLOCK_HEADER+1;
reclength= (info->s->base.pack_reclength+ info->s->base.pack_bits+ reclength= (info->s->base.pack_reclength+
_my_calc_total_blob_length(info,record)+ extra); _my_calc_total_blob_length(info,record)+ extra);
if (reclength > MI_DYN_MAX_ROW_LENGTH) if (reclength > MI_DYN_MAX_ROW_LENGTH)
{ {
......
...@@ -602,6 +602,8 @@ void mi_setup_functions(register MYISAM_SHARE *share) ...@@ -602,6 +602,8 @@ void mi_setup_functions(register MYISAM_SHARE *share)
share->compare_unique=_mi_cmp_dynamic_unique; share->compare_unique=_mi_cmp_dynamic_unique;
share->calc_checksum= mi_checksum; share->calc_checksum= mi_checksum;
/* add bits used to pack data to pack_reclength for faster allocation */
share->base.pack_reclength+= share->base.pack_bits;
if (share->base.blobs) if (share->base.blobs)
{ {
share->update_record=_mi_update_blob_record; share->update_record=_mi_update_blob_record;
......
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