Hi.
Valgrind uncover me error in TDataset.ClearCalcFields. I think that this code is entirely bad.
Procedure TDataset.ClearCalcFields(Buffer: PChar);
begin
if FCalcFieldsSize > 0 then
FillByte((Buffer+RecordSize)^,FCalcFieldsSize,0);
end;With ZEOSDB this code clears data behind allocated buffer. Buffer size is here RecordSize.
For allocating buffers is responsible overrided method AllocRecordBuffer. And I think that for clearing calc fields must be responsible overrided method ClearCalcFields too if driver requires it. Not this code in base class. I suggest this patch:
Index: packages/fcl-db/src/base/dataset.inc
=================================================================== --- packages/fcl-db/src/base/dataset.inc (revision 10565) +++ packages/fcl-db/src/base/dataset.inc (working copy) @@ -180,8 +180,6 @@
Procedure TDataset.ClearCalcFields(Buffer: PChar);
begin
- if FCalcFieldsSize > 0 then
- FillByte((Buffer+RecordSize)^,FCalcFieldsSize,0);
end;
Procedure TDataset.CloseBlob(Field: TField);For me this solves problems with SIGSEGV.
I look into Borland TDataset.ClearCalcFields implementation and here is this method empty too.
Petr
