Parcourir la source

+ added mysql
+ added parameters-tests

git-svn-id: trunk@3774 -

joost il y a 19 ans
Parent
commit
e4fe73dcf8

+ 1 - 0
.gitattributes

@@ -762,6 +762,7 @@ fcl/dbtests/dbftoolsunit.pas -text
 fcl/dbtests/dbtestframework.pas -text
 fcl/dbtests/settings.inc -text
 fcl/dbtests/sqldbtoolsunit.pas -text
+fcl/dbtests/testbasics.pas svneol=native#text/plain
 fcl/dbtests/testdbbasics.pas -text
 fcl/dbtests/testsqlfieldtypes.pas -text
 fcl/dbtests/toolsunit.pas -text

+ 1 - 0
fcl/dbtests/dbtestframework.pas

@@ -11,6 +11,7 @@ program dbtestframework;
 uses
   SysUtils,
   fpcunit,testregistry,
+  testbasics,
 {$ifdef SQLDB_AVAILABLE}
   testsqlfieldtypes,
 {$ENDIF}

+ 78 - 0
fcl/dbtests/testbasics.pas

@@ -0,0 +1,78 @@
+unit TestBasics;
+
+{$IFDEF FPC}
+  {$mode objfpc}{$H+}
+{$ENDIF}
+
+interface
+
+uses
+  fpcunit, testutils, testregistry, testdecorator,
+  Classes, SysUtils;
+
+type
+
+  { TTestBasics }
+
+  TTestBasics = class(TTestCase)
+  private
+  protected
+  published
+    procedure TestParseSQL;
+  end;
+
+implementation
+
+uses db, toolsunit;
+
+
+{ TTestBasics }
+
+procedure TTestBasics.TestParseSQL;
+var Params : TParams;
+begin
+  Params := TParams.Create;
+  AssertEquals(     'select * from table where id = $1',
+    params.ParseSQL('select * from table where id = :id',true,psPostgreSQL));
+
+  AssertEquals(     'select * from table where id = $1',
+    params.ParseSQL('select * from table where id = :id',false,psPostgreSQL));
+
+  AssertEquals(     'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $2)',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :2)',true,psPostgreSQL));
+
+  AssertEquals(     'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $3) and (test=''$test'')',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :par3) and (test=''$test'')',true,psPostgreSQL));
+
+  AssertEquals(     'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 10=$10 11=$11 12=$5 where (id = $3) and (test=''$test'')',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id = :par3) and (test=''$test'')',true,psPostgreSQL));
+
+
+  AssertEquals(     'select * from table where id = $1',
+    params.ParseSQL('select * from table where id = :id',true,psSimulated));
+
+  AssertEquals(     'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $2)',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :2)',true,psSimulated));
+
+  AssertEquals(     'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $3) and (test=''$test'')',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :par3) and (test=''$test'')',true,psSimulated));
+
+  AssertEquals(     'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 10=$10 11=$11 12=$5 where (id = $3) and (test=''$test'')',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id = :par3) and (test=''$test'')',true,psSimulated));
+
+  AssertEquals(     'update test set 1=$$1 2=$$2 3=$$3 4=$$4 5=$$5 6=$$6 7=$$7 8=$$8 9=$$9 10=$$10 11=$$11 12=$$5 where (id$ = $$3) and (test=''$test'')',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id$ = :par3) and (test=''$test'')',true,psSimulated));
+
+  AssertEquals(     'update test set 1=$$$1 2=$$$2 3=$$$3 4=$$$4 5=$$$5 6=$$$6 7=$$$7 8=$$$8 9=$$$9 10=$$$10 11=$$$11 12=$$$5 where (id$$ = $$$3) and (test$=''$test'')',
+    params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id$$ = :par3) and (test$=''$test'')',true,psSimulated));
+
+  AssertEquals(     'select * from table where id = ?',
+    params.ParseSQL('select * from table where id = :id',true,psInterbase));
+
+
+  Params.Free;
+end;
+
+initialization
+  RegisterTest(TTestBasics);
+end.

+ 81 - 0
fcl/dbtests/testsqlfieldtypes.pas

@@ -26,6 +26,8 @@ type
     procedure TestUnlVarChar;
     procedure TestDate;
     procedure TestDateTime;       // bug 6925
+
+    procedure TestParamQuery;
   end;
 
 implementation
@@ -272,6 +274,82 @@ begin
     end;
 end;
 
+procedure TTestFieldTypes.TestParamQuery;
+begin
+  TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (FIELD1 INT, FIELD2 INT, FIELD3 INT, DECOY VARCHAR(30))');
+
+// Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
+  TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
+
+  with TSQLDBConnector(DBConnector).Query do
+    begin
+    sql.clear;
+    sql.append('insert into FPDEV2 (field1) values (:field1)');
+    Params.ParamByName('field1').AsInteger := 1;
+    ExecSQL;
+
+    sql.clear;
+    sql.append('insert into FPDEV2 (field1,field2,decoy) values (:field1,:field2,''decoytest'')');
+    Params.ParamByName('field1').AsInteger := 2;
+    Params.ParamByName('field2').DataType := ftInteger;
+    Params.ParamByName('field2').Value := Null;
+    ExecSQL;
+
+    sql.clear;
+    sql.append('insert into FPDEV2 (field1,field2,field3) values (:field1,:field2,:field3)');
+    Params.ParamByName('field1').AsInteger := 3;
+    Params.ParamByName('field2').AsInteger := 2;
+    Params.ParamByName('field3').AsInteger := 3;
+    ExecSQL;
+
+    sql.clear;
+    sql.append('insert into FPDEV2 (field1,field2,field3,decoy) values (:field1,:field2,:field3,'':decoy ::test $decoy2 $$2'')');
+    Params.ParamByName('field1').AsInteger := 4;
+    Params.ParamByName('field2').AsInteger := 2;
+    Params.ParamByName('field3').AsInteger := 3;
+    ExecSQL;
+
+    sql.clear;
+    sql.append('insert into FPDEV2 (field1,field2,field3) values (:field1,:field2,:field1)');
+    Params.ParamByName('field1').AsInteger := 5;
+    Params.ParamByName('field2').AsInteger := 2;
+    ExecSQL;
+    
+    sql.clear;
+    sql.append('select * from FPDEV2 order by FIELD1');
+    open;
+    AssertEquals(1,FieldByName('FIELD1').asinteger);
+    AssertTrue(FieldByName('FIELD2').IsNull);
+    AssertTrue(FieldByName('FIELD3').IsNull);
+    AssertTrue(FieldByName('DECOY').IsNull);
+    next;
+    AssertEquals(2,FieldByName('FIELD1').asinteger);
+    AssertTrue(FieldByName('FIELD2').IsNull);
+    AssertTrue(FieldByName('FIELD3').IsNull);
+    AssertEquals('decoytest',FieldByName('DECOY').AsString);
+    next;
+    AssertEquals(3,FieldByName('FIELD1').asinteger);
+    AssertEquals(2,FieldByName('FIELD2').asinteger);
+    AssertEquals(3,FieldByName('FIELD3').asinteger);
+    AssertTrue(FieldByName('DECOY').IsNull);
+    next;
+    AssertEquals(4,FieldByName('FIELD1').asinteger);
+    AssertEquals(2,FieldByName('FIELD2').asinteger);
+    AssertEquals(3,FieldByName('FIELD3').asinteger);
+    AssertEquals(':decoy ::test $decoy2 $$2',FieldByName('DECOY').AsString);
+    next;
+    AssertEquals(5,FieldByName('FIELD1').asinteger);
+    AssertEquals(2,FieldByName('FIELD2').asinteger);
+    AssertEquals(5,FieldByName('FIELD3').asinteger);
+    AssertTrue(FieldByName('DECOY').IsNull);
+    close;
+
+    end;
+  TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
+
+
+end;
+
 procedure TTestFieldTypes.CreateTableWithFieldType(ADatatype: TFieldType;
   ASQLTypeDecl: string);
 begin
@@ -313,6 +391,9 @@ end;
 procedure TTestFieldTypes.RunTest;
 begin
   if (dbtype = 'interbase') or
+     (dbtype = 'mysql50') or
+     (dbtype = 'mysql40') or
+     (dbtype = 'mysql41') or
      (dbtype = 'postgresql') then
     inherited RunTest;
 end;

+ 1 - 1
fcl/dbtests/toolsunit.pas

@@ -92,7 +92,7 @@ begin
   ReadIniFile;
   if (1 <> 1) then begin end
 {$IFDEF SQLDB_AVAILABLE}
-  else if (dbtype = 'interbase') or (dbtype = 'postgresql')  then DBConnector := TSQLDBConnector.Create
+  else if (dbtype = 'interbase') or (dbtype = 'postgresql') or (dbtype = 'mysql50') or (dbtype = 'mysql40') or (dbtype = 'mysql41')  then DBConnector := TSQLDBConnector.Create
 {$ENDIF}
 {$IFDEF DBF_AVAILABLE}
   else if dbtype = 'dbf' then DBConnector := TDBFDBConnector.Create