----------------------------------------------------------------------------
[BUG/PRB.] VFP 9.0 FIX - THE SELECT UNION COMMAND WITH MEMO FIELDS
January 2026
----------------------------------------------------------------------------
CCB
1. BUG:
In vfp9 (and vfp7, vfp8), after we run the SELECT UNION command with memo fields,
sometimes the memo file will be corrupted,
vfp will cause the error "Memo file 'name' is missing or is invalid (Error 41)" when the table is accessed.
The bug occurs in vfp7, vfp8 and vfp9, it does not occur in vfp6.
The bug only occurs when SET("BLOCKSIZE")>1, it does not occur when SET("BLOCKSIZE")=1.
2. CAUSE:
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Label42da0c ::
mov cl , byte ptr [ ebp - 35 ] ;0x0042da0c : 8a4ddd
mov esi , dword ptr [ ebx + 36 ] ;0x0042da0f : 8b7324
shl al , 03h ;0x0042da12 : c0e003
xor al , cl ;0x0042da15 : 32c1
and al , 08h ;0x0042da17 : 2408
xor cl , al ;0x0042da19 : 32c8
cmp dword ptr [ ebp - 24 ] , esi ;0x0042da1b : 3975e8
mov byte ptr [ ebp - 35 ] , cl ;0x0042da1e : 884ddd
jne Label56e2b4 ;0x0042da21 : 0f858d081400
mov eax , dword ptr [ ebp - 16 ] ;0x0042da27 : 8b45f0
Label42da2a ::
;
; -----------------------------------------------------------------
; VFP 9.0 FIX - THE SELECT UNION COMMAND WITH MEMO FIELDS
; March 2017
; -----------------------------------------------------------------
; CCB
;
; After we run the SELECT UNION command with memo fields,
; sometimes the memo file will be corrupted (memo file "name" is missing or is invalid).
;
; 2017/3/12, by ccb
;
cmp dword ptr vfpa_selectunion_isselect,00h
jne Label42da2b
jmp Label42da2e
Label42da2b ::
mov edi , dword ptr [ ebp - 16 ]
dec edi
test edi , edi
jl Label42da2e
mov eax , dword ptr [ ebx + 16 ]
mov ecx , dword ptr [eax]
lea edi , dword ptr [ ecx + 4 * edi ]
mov edx , dword ptr [ ebx + 20 ]
mov eax , dword ptr [edi]
add eax , dword ptr [edx]
IF VFPA_VERSION GE 101
mov ecx , dword ptr [ eax + VFPA_CONST_X64_FILEBLOCK_CUROFFSET64 ][0]
mov edx , dword ptr [ eax + VFPA_CONST_X64_FILEBLOCK_CUROFFSET64 ][4]
add ecx , dword ptr [ eax + 12 ]
adc edx , 00h
cmp edx , dword ptr [ ebx + VFPA_CONST_X64_FOXFILE_FILESIZE64 ][4]
ja Label42da2d
jb Label42da2c
cmp ecx , dword ptr [ ebx + VFPA_CONST_X64_FOXFILE_FILESIZE64 ][0]
ja Label42da2d
jb Label42da2c
jmp Label42da2d
ELSE
mov ecx , dword ptr [ eax + 4 ]
add ecx , dword ptr [ eax + 12 ]
cmp ecx , dword ptr [ebx]
jae Label42da2d
ENDIF
Label42da2c ::
mov ecx , dword ptr [ eax + 8 ]
cmp dword ptr [ eax + 12 ] , ecx
jae Label42da2d
mov dword ptr [ eax + 12 ] , ecx
Label42da2d ::
mov eax , dword ptr [ ebp - 16 ]
Label42da2e ::
mov ecx , dword ptr [ ebx + 16 ] ;0x0042da2a : 8b4b10
mov edx , dword ptr [ecx] ;0x0042da2d : 8b11
sub esi , eax ;0x0042da2f : 2bf0
lea edi , dword ptr [ edx + 4 * eax ] ;0x0042da31 : 8d3c82
shl esi , 02h ;0x0042da34 : c1e602
push esi ;0x0042da37 : 56
lea ecx , dword ptr [ edi + 4 ] ;0x0042da38 : 8d4f04
mov edx , edi ;0x0042da3b : 8bd7
call Fun42c19b ;0x0042da3d : e859e7ffff
mov eax , dword ptr [ ebx + 24 ] ;0x0042da42 : 8b4318
mov dword ptr [edi] , eax ;0x0042da45 : 8907
mov ecx , dword ptr [ ebx + 20 ] ;0x0042da47 : 8b4b14
mov eax , dword ptr [ecx] ;0x0042da4a : 8b01
mov edx , dword ptr [ ebx + 24 ] ;0x0042da4c : 8b5318
mov ecx , dword ptr [ ebx + 36 ] ;0x0042da4f : 8b4b24
add eax , edx ;0x0042da52 : 03c2
mov edx , dword ptr [eax] ;0x0042da54 : 8b10
inc ecx ;0x0042da56 : 41
mov dword ptr [ ebx + 36 ] , ecx ;0x0042da57 : 894b24
mov ecx , dword ptr [ ebp - 16 ] ;0x0042da5a : 8b4df0
mov dword ptr [ ebx + 32 ] , ecx ;0x0042da5d : 894b20
mov ecx , dword ptr [ ebp - 56 ] ;0x0042da60 : 8b4dc8
mov dword ptr [ ebx + 24 ] , edx ;0x0042da63 : 895318
mov edx , eax ;0x0042da66 : 8bd0
mov dword ptr [edx] , ecx ;0x0042da68 : 890a
mov ecx , dword ptr [ ebp - 52 ] ;0x0042da6a : 8b4dcc
mov dword ptr [ edx + 4 ] , ecx ;0x0042da6d : 894a04
mov ecx , dword ptr [ ebp - 48 ] ;0x0042da70 : 8b4dd0
mov dword ptr [ edx + 8 ] , ecx ;0x0042da73 : 894a08
mov ecx , dword ptr [ ebp - 44 ] ;0x0042da76 : 8b4dd4
mov dword ptr [ edx + 12 ] , ecx ;0x0042da79 : 894a0c
mov ecx , dword ptr [ ebp - 40 ] ;0x0042da7c : 8b4dd8
pop edi ;0x0042da7f : 5f
mov dword ptr [ edx + 16 ] , ecx ;0x0042da80 : 894a10
mov ecx , dword ptr [ ebp - 36 ] ;0x0042da83 : 8b4ddc
pop esi ;0x0042da86 : 5e
mov dword ptr [ edx + 20 ] , ecx ;0x0042da87 : 894a14
pop ebx ;0x0042da8a : 5b
mov esp , ebp ;0x0042da8b : 8be5
pop ebp ;0x0042da8d : 5d
ret 04h ;0x0042da8e : c20400
4. APPLIES TO:
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
http://www.baiyujia.com/vfpdocuments/f_vfp9fix337.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix338.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix339.asp
2, microsoft.com:
https://social.msdn.microsoft.com/Forums/en-US/3413009d-17b1-4ae3-9b26-c7eeed230f13/memo-file-missing-or-is-invalid-after-select-union
3, tek-tips.com:
http://www.tek-tips.com/viewthread.cfm?qid=1641620
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|