Icon View Incident Report

Serious Serious
Reported By: Rolf Frei
Reported On: 8/21/2012
For: Version 2.09 Build 1
# 3620 Committing a Large Transaction with Ordered Inserts Can Cause Stack Overflow

I have done a small routine to convert a DBISAM Table into a EDB 2 Table. The problem is, that this code does throw a EStackOverflow exception on the EDBDatabase1.Commit() line.

procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  Fld: TField;
  SrcFieldName: String;
 
  procedure SetFieldValue(AField, ASrcField: TField);
  begin
    if ASrcField.IsNull then
      AField.Clear
    else
      AField.AsString := ASrcField.AsString;
  end;
 
begin
  tblDBISAMParts.Open;
 
  EDBSession1.Open;
  EDBDatabase1.Open;
 
  EDBDatabase1.StartTransaction(EmptyEDBStringsArray);
  try
    EDBDatabase1.Execute('Delete FROM GroupParts');
    EDBDatabase1.Execute('Delete FROM Parts');
 
    tblParts.Open;
    tblGroupParts.Open;
 
    while not tblDBISAMParts.Eof do
    begin
     tblParts.Insert;
 
      for i := 0 to tblDBISAMParts.Fields.Count - 1 do
      begin
        SrcFieldName := LowerCase(tblDBISAMParts.Fields[i].FieldName);
        Fld := tblParts.FindField(SrcFieldName);
        if Fld = nil then
        begin
          Fld := tblDBISAMParts.Fields[i];
          if SrcFieldName = 'maingroup' then
            SetFieldValue(tblParts.FieldByName('MainGroup1'), Fld)
          else if SrcFieldName = 'category' then
            SetFieldValue(tblParts.FieldByName('Category1'), Fld)
          else if SrcFieldName = 'subcategory' then
            SetFieldValue(tblParts.FieldByName('SubCategory1'), Fld);
        end
        else
          Fld.AsString := tblDBISAMParts.Fields[i].AsString;
      end;
 
      tblParts.Post;
 
      tblGroupParts.Insert;
      SetFieldValue(tblGroupParts.FieldByName('MainGroup'), 
                    tblDBISAMParts.FieldByName('MainGroup'));
      SetFieldValue(tblGroupParts.FieldByName('Category'), 
                    tblDBISAMParts.FieldByName('Category'));
      SetFieldValue(tblGroupParts.FieldByName('SubCategory'), 
                    tblDBISAMParts.FieldByName('SubCategory'));
      SetFieldValue(tblGroupParts.FieldByName('PartNo'),
                    tblDBISAMParts.FieldByName('PartNo'));
      tblGroupParts.Post;
 
      tblDBISAMParts.Next;
    end;
 
     EDBDatabase1.Commit();   // <- this throws a stack overflow error
  except
    EDBDatabase1.Rollback;
    raise;
  end;
end;



Comments Comments
The problem was with the ordered nature of the inserts coming from the source table, which was causing the quick sort to degenerate due to a flaw in the algorithm being used.


Resolution Resolution
Fixed Problem on 8/24/2012 in version 2.10 build 1


Products Affected Products Affected
ElevateDB Additional Software and Utilities
ElevateDB DAC Client-Server
ElevateDB DAC Client-Server with Source
ElevateDB DAC Standard
ElevateDB DAC Standard with Source
ElevateDB DAC Trial
ElevateDB LCL Standard with Source
ElevateDB PHP Standard
ElevateDB PHP Standard with Source
ElevateDB PHP Trial
ElevateDB VCL Client-Server
ElevateDB VCL Client-Server with Source
ElevateDB VCL Standard
ElevateDB VCL Standard with Source
ElevateDB VCL Trial

Image