Browse Source

* Test for mapping numeric to bcd type fields, and a fix for issues in
ibconnection found with it, Mantis #20182

git-svn-id: trunk@19005 -

marco 14 years ago
parent
commit
81d94b9d91

+ 3 - 5
packages/fcl-db/src/sqldb/interbase/ibconnection.pp

@@ -437,14 +437,12 @@ end;
 procedure TIBConnection.TranslateFldType(SQLType, SQLSubType, SQLLen, SQLScale : integer;
 procedure TIBConnection.TranslateFldType(SQLType, SQLSubType, SQLLen, SQLScale : integer;
            var TrType : TFieldType; var TrLen : word);
            var TrType : TFieldType; var TrLen : word);
 begin
 begin
-  trlen := 0;
+  TrLen := 0;
   if SQLScale < 0 then
   if SQLScale < 0 then
     begin
     begin
-    if (SQLScale >= -4) and (SQLScale <= -1) then //in [-4..-1] then
-      begin
-      TrLen := abs(SQLScale);
+    TrLen := abs(SQLScale);
+    if (TrLen <= MaxBCDScale) then //Note: NUMERIC(18,3) or (17,2) must be mapped to ftFmtBCD, but we do not know Precision
       TrType := ftBCD
       TrType := ftBCD
-      end
     else
     else
       TrType := ftFMTBcd;
       TrType := ftFMTBcd;
     end
     end

+ 45 - 10
packages/fcl-db/tests/testfieldtypes.pas

@@ -266,27 +266,62 @@ procedure TTestFieldTypes.TestNumeric;
 const
 const
   testValuesCount = 13;
   testValuesCount = 13;
   testValues : Array[0..testValuesCount-1] of currency = (-123456.789,-10200,-10000,-1875.25,-10,-0.5,0,0.5,10,1875.25,10000,10200,123456.789);
   testValues : Array[0..testValuesCount-1] of currency = (-123456.789,-10200,-10000,-1875.25,-10,-0.5,0,0.5,10,1875.25,10000,10200,123456.789);
+  Sizes: array [0..4] of integer = (4,0,3,5,0); //scale
 
 
 var
 var
   i          : byte;
   i          : byte;
+  s          : string;
 
 
 begin
 begin
-  CreateTableWithFieldType(ftBCD,'NUMERIC(10,4)');
-  TestFieldDeclaration(ftBCD,sizeof(Currency));
-
-  for i := 0 to testValuesCount-1 do
-    TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (' + CurrToStrF(testValues[i],ffFixed,3,DBConnector.FormatSettings) + ')');
+  with TSQLDBConnector(DBConnector) do begin
+    if SQLDbType = INTERBASE then
+      s := '' //Interbase supports precision up to 18 only
+    else
+      s := ', N4 NUMERIC(19,0)';
+    Connection.ExecuteDirect('create table FPDEV2 (FT NUMERIC(18,4), N1 NUMERIC(18,0), N2 NUMERIC(18,3), N3 NUMERIC(18,5)' + s + ')');
+    Transaction.CommitRetaining;
 
 
-  with TSQLDBConnector(DBConnector).Query do
+    with Query do
     begin
     begin
-    Open;
+      SQL.Text := 'select * from FPDEV2';
+      Open;
+
+      AssertEquals(sizeof(Currency), Fields[0].DataSize);
+      AssertTrue(Fields[0].DataType=ftBCD);
+      AssertEquals(Sizes[0], Fields[0].Size);
+
+      AssertTrue(Fields[1].DataType in [ftFmtBCD, ftLargeInt]);
+      AssertEquals(Sizes[1], Fields[1].Size);
+
+      for i := 2 to FieldCount-1 do
+      begin
+        AssertEquals(sizeof(TBCD), Fields[i].DataSize);
+        AssertTrue(Fields[i].DataType=ftFmtBCD);
+        AssertEquals(Sizes[i], Fields[i].Size);
+      end;
+
+      Close;
+    end;
+
     for i := 0 to testValuesCount-1 do
     for i := 0 to testValuesCount-1 do
+    begin
+      s :=CurrToStrF(testValues[i],ffFixed,3,DBConnector.FormatSettings);
+      Connection.ExecuteDirect(format('insert into FPDEV2 (FT,N2,N3) values (%s,%s,%s)', [s,s,s]));
+    end;
+
+    with Query do
+    begin
+      Open;
+      for i := 0 to testValuesCount-1 do
       begin
       begin
-      AssertEquals(testValues[i],fields[0].AsCurrency);
-      Next;
+        AssertEquals(testValues[i], Fields[0].AsCurrency);
+        AssertEquals(testValues[i], Fields[2].AsCurrency);
+        AssertEquals(testValues[i], Fields[3].AsCurrency);
+        Next;
       end;
       end;
-    close;
+      Close;
     end;
     end;
+  end;
 end;
 end;