Commit 5df8c7b0 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -415,6 +415,9 @@ static void setup_functions(register ISAM_SHARE *share)
    share->read_rnd=_nisam_read_rnd_dynamic_record;
    share->delete_record=_nisam_delete_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)
    {
      share->update_record=_nisam_update_blob_record;
+17 −354
Original line number Diff line number Diff line
echo "test2 -L -K -W -P"
test2 -L -K -W -P
- 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
echo "test2 -L -K -W -P -A"
test2 -L -K -W -P -A
- 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
Asyncron io with locking used
echo "test2 -L -K -W -P -S -R1 -m500"
test2 -L -K -W -P -S -R1 -m500
- 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
- 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
echo "test2 -L -K -R1 -m2000 ; Should give error 135"
test2 -L -K -R1 -m2000
echo "test2 -L -K -P -S -R3 -m50 -b1000000"
test2 -L -K -P -S -R3 -m50 -b1000000
- 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
- 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
echo "test2 -L -B"
test2 -L -B
- 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: 903
Update records: 86
Same-key-read: 5
Delete records: 903
Locking used
blobs used
echo "test2 -L -K -W -P -m50 -l"
test2 -L -K -W -P -m50 -l
- 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
- 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
isamlog
echo "test2 -L -K -W -P -m50 -l -b100"
test2 -L -K -W -P -m50 -l -b100
- 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
- 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
isamlog
echo "time test2"
time test2
- 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
echo "time test2 -K"
time test2 -K
- 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
echo "time test2 -L"
time test2 -L
- 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
Locking used
echo "time test2 -L -K"
time test2 -L -K
- 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
Locking used
echo "time test2 -L -K -W"
time test2 -L -K -W
- 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
echo "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
+1 −1
Original line number Diff line number Diff line
@@ -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+
    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);
  if (reclength > MI_DYN_MAX_ROW_LENGTH)
  {
+2 −0
Original line number Diff line number Diff line
@@ -602,6 +602,8 @@ void mi_setup_functions(register MYISAM_SHARE *share)
    share->compare_unique=_mi_cmp_dynamic_unique;
    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)
    {
      share->update_record=_mi_update_blob_record;