testsqlfieldtypes.pas 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. unit TestSQLFieldTypes;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry,
  6. db;
  7. type
  8. TParamProc = procedure(AParam:TParam; i : integer);
  9. TFieldProc = procedure(AField:TField; i : integer);
  10. { TTestFieldTypes }
  11. TTestFieldTypes= class(TTestCase)
  12. private
  13. procedure CreateTableWithFieldType(ADatatype : TFieldType; ASQLTypeDecl : string);
  14. procedure TestFieldDeclaration(ADatatype: TFieldType; ADataSize: integer);
  15. procedure TestXXParamQuery(ADatatype : TFieldType; ASQLTypeDecl : string; testValuescount : integer; Cross : boolean = false);
  16. protected
  17. procedure SetUp; override;
  18. procedure TearDown; override;
  19. procedure RunTest; override;
  20. published
  21. procedure TestParseJoins; // bug 10148
  22. procedure TestInsertLargeStrFields; // bug 9600
  23. procedure TestNumericNames; // Bug9661
  24. procedure Test11Params;
  25. procedure TestRowsAffected; // bug 9758
  26. procedure TestStringsReplace;
  27. procedure TestCircularParams;
  28. procedure TestBug9744;
  29. procedure TestCrossStringDateParam;
  30. procedure TestGetFieldNames;
  31. procedure TestGetTables;
  32. procedure TestUpdateIndexDefs;
  33. procedure TestSetBlobAsMemoParam;
  34. procedure TestSetBlobAsStringParam;
  35. procedure TestGetIndexDefs;
  36. procedure TestDblQuoteEscComments;
  37. procedure TestpfInUpdateFlag; // bug 7565
  38. procedure TestInt;
  39. procedure TestScript;
  40. procedure TestTemporaryTable;
  41. procedure TestParametersAndDates;
  42. procedure TestExceptOnsecClose;
  43. procedure TestBlob;
  44. procedure TestChangeBlob;
  45. procedure TestBlobGetText;
  46. procedure TestLargeRecordSize;
  47. procedure TestNumeric;
  48. procedure TestFloat;
  49. procedure TestDateTime; // bug 6925
  50. procedure TestString;
  51. procedure TestUnlVarChar;
  52. procedure TestDate;
  53. procedure TestNullValues;
  54. procedure TestParamQuery;
  55. procedure TestStringParamQuery;
  56. procedure TestDateParamQuery;
  57. procedure TestIntParamQuery;
  58. procedure TestFloatParamQuery;
  59. procedure TestAggregates;
  60. end;
  61. implementation
  62. uses sqldbtoolsunit,toolsunit, variants, sqldb, bufdataset;
  63. Type HackedDataset = class(TDataset);
  64. const
  65. testFloatValuesCount = 21;
  66. testFloatValues : Array[0..testFloatValuesCount-1] of double = (-maxSmallint-1,-maxSmallint,-256,-255,-128,-127,-1,0,1,127,128,255,256,maxSmallint,maxSmallint+1,0.123456,-0.123456,4.35,12.434E7,9.876e-5,123.45678);
  67. testIntValuesCount = 17;
  68. testIntValues : Array[0..testIntValuesCount-1] of integer = (-maxInt,-maxSmallint-1,-maxSmallint,-256,-255,-128,-127,-1,0,1,127,128,255,256,maxSmallint,maxSmallint+1,MaxInt);
  69. testStringValuesCount = 20;
  70. testStringValues : Array[0..testStringValuesCount-1] of string = (
  71. '',
  72. 'a',
  73. 'ab',
  74. 'abc',
  75. 'abcd',
  76. 'abcde',
  77. 'abcdef',
  78. 'abcdefg',
  79. 'abcdefgh',
  80. 'abcdefghi',
  81. 'abcdefghij',
  82. 'lMnOpQrStU',
  83. '1234567890',
  84. '_!@#$%^&*(',
  85. ' ''quotes'' ',
  86. ')-;:/?.<>',
  87. '~`|{}- =', // note that there's no \ (backslash) since some db's uses that as escape-character
  88. ' WRaP ',
  89. 'wRaP ',
  90. ' wRAP'
  91. );
  92. testDateValuesCount = 18;
  93. testDateValues : Array[0..testDateValuesCount-1] of string = (
  94. '2000-01-01',
  95. '1999-12-31',
  96. '2004-02-29',
  97. '2004-03-01',
  98. '1991-02-28',
  99. '1991-03-01',
  100. '2040-10-16',
  101. '1977-09-29',
  102. '1800-03-30',
  103. '1650-05-10',
  104. '1754-06-04',
  105. '0904-04-12',
  106. '0199-07-09',
  107. '0001-01-01',
  108. '1899-12-29',
  109. '1899-12-30',
  110. '1899-12-31',
  111. '1900-01-01'
  112. );
  113. procedure TTestFieldTypes.TestpfInUpdateFlag;
  114. var ds : TBufDataset;
  115. AFld1, AFld2, AFld3 : Tfield;
  116. begin
  117. ds := (DBConnector.GetNDataset(True,5) as TBufDataset);
  118. with ds do
  119. begin
  120. AFld1 := TIntegerField.Create(ds);
  121. AFld1.FieldName := 'ID';
  122. AFld1.DataSet := ds;
  123. AFld1.ProviderFlags := AFld1.ProviderFlags + [pfInKey];
  124. AFld2 := TStringField.Create(ds);
  125. AFld2.FieldName := 'NAME';
  126. AFld2.DataSet := ds;
  127. AFld3 := TIntegerField.Create(ds);
  128. AFld3.FieldName := 'CALCFLD';
  129. AFld3.DataSet := ds;
  130. Afld3.FieldKind := fkCalculated;
  131. AFld3.ProviderFlags := [];
  132. Open;
  133. Edit;
  134. FieldByName('ID').AsInteger := 254;
  135. Post;
  136. ApplyUpdates;
  137. Append;
  138. FieldByName('ID').AsInteger := 255;
  139. Post;
  140. ApplyUpdates;
  141. Close;
  142. AFld1.Free;
  143. AFld2.Free;
  144. AFld3.Free;
  145. end;
  146. end;
  147. procedure TTestFieldTypes.TestScript;
  148. var Ascript : TSQLScript;
  149. begin
  150. Ascript := tsqlscript.create(nil);
  151. with Ascript do
  152. begin
  153. DataBase := TSQLDBConnector(DBConnector).Connection;
  154. transaction := TSQLDBConnector(DBConnector).Transaction;
  155. script.clear;
  156. script.append('create table a (id int);');
  157. script.append('create table b (id int);');
  158. ExecuteScript;
  159. end;
  160. end;
  161. procedure TTestFieldTypes.TestInt;
  162. var
  163. i : byte;
  164. begin
  165. CreateTableWithFieldType(ftInteger,'INT');
  166. TestFieldDeclaration(ftInteger,4);
  167. for i := 0 to testIntValuesCount-1 do
  168. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (' + inttostr(testIntValues[i]) + ')');
  169. with TSQLDBConnector(DBConnector).Query do
  170. begin
  171. Open;
  172. for i := 0 to testIntValuesCount-1 do
  173. begin
  174. AssertEquals(testIntValues[i],fields[0].AsInteger);
  175. Next;
  176. end;
  177. close;
  178. end;
  179. end;
  180. procedure TTestFieldTypes.TestLargeRecordSize;
  181. var
  182. i : byte;
  183. begin
  184. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (plant varchar(8192),sampling_type varchar(8192),area varchar(8192), area_description varchar(8192), batch varchar(8192), sampling_datetime timestamp, status varchar(8192), batch_commentary varchar(8192))');
  185. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  186. if UpperCase(dbconnectorparams)='INTERBASE' then TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  187. with TSQLDBConnector(DBConnector).Query do
  188. begin
  189. sql.clear;
  190. sql.append('insert into FPDEV2 (plant,sampling_type,batch,sampling_datetime,status,batch_commentary) values (''ZUBNE PASTE'',''OTISCI POVR￿INA'',''000037756'',''2005-07-01'',''NE ODGOVARA'',''Ovdje se upisuje komentar o kontrolnom broju..............'')');
  191. ExecSQL;
  192. sql.clear;
  193. sql.append('select * from FPDEV2');
  194. open;
  195. AssertEquals('ZUBNE PASTE',FieldByName('plant').AsString);
  196. AssertEquals(EncodeDate(2005,07,01),FieldByName('sampling_datetime').AsDateTime);
  197. close;
  198. end;
  199. end;
  200. procedure TTestFieldTypes.TestNumeric;
  201. const
  202. testValuesCount = 13;
  203. 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);
  204. var
  205. i : byte;
  206. begin
  207. CreateTableWithFieldType(ftBCD,'NUMERIC(10,4)');
  208. TestFieldDeclaration(ftBCD,sizeof(Currency));
  209. for i := 0 to testValuesCount-1 do
  210. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (' + CurrToStrF(testValues[i],ffFixed,3) + ')');
  211. with TSQLDBConnector(DBConnector).Query do
  212. begin
  213. Open;
  214. for i := 0 to testValuesCount-1 do
  215. begin
  216. AssertEquals(testValues[i],fields[0].AsCurrency);
  217. Next;
  218. end;
  219. close;
  220. end;
  221. end;
  222. procedure TTestFieldTypes.TestString;
  223. const
  224. testValuesCount = 19;
  225. testValues : Array[0..testValuesCount-1] of string = (
  226. '',
  227. 'a',
  228. 'ab',
  229. 'abc',
  230. 'abcd',
  231. 'abcde',
  232. 'abcdef',
  233. 'abcdefg',
  234. 'abcdefgh',
  235. 'abcdefghi',
  236. 'abcdefghij',
  237. 'lMnOpQrStU',
  238. '1234567890',
  239. '_!@#$%^&*(',
  240. ')-;:/?.<>',
  241. '~`|{}- =', // note that there's no \ (backslash) since some db's uses that as escape-character
  242. ' WRaP ',
  243. 'wRaP ',
  244. ' wRAP'
  245. );
  246. var
  247. i : byte;
  248. begin
  249. CreateTableWithFieldType(ftString,'VARCHAR(10)');
  250. TestFieldDeclaration(ftString,11);
  251. for i := 0 to testValuesCount-1 do
  252. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (''' + testValues[i] + ''')');
  253. with TSQLDBConnector(DBConnector).Query do
  254. begin
  255. Open;
  256. for i := 0 to testValuesCount-1 do
  257. begin
  258. if (SQLDbType in MySQLdbTypes) then
  259. AssertEquals(TrimRight(testValues[i]),fields[0].AsString) // MySQL automatically trims strings
  260. else
  261. AssertEquals(testValues[i],fields[0].AsString);
  262. Next;
  263. end;
  264. close;
  265. end;
  266. end;
  267. procedure TTestFieldTypes.TestUnlVarChar;
  268. const
  269. testValuesCount = 21;
  270. testValues : Array[0..testValuesCount-1] of string = (
  271. '',
  272. 'a',
  273. 'ab',
  274. 'abc',
  275. 'abcd',
  276. 'abcde',
  277. 'abcdef',
  278. 'abcdefg',
  279. 'abcdefgh',
  280. 'abcdefghi',
  281. 'abcdefghij',
  282. 'lMnOpQrStU',
  283. '1234567890',
  284. '_!@#$%^&*(',
  285. ')-;:/?.<>',
  286. '~`|{}- =',
  287. ' WRaP ',
  288. 'wRaP ',
  289. ' wRAP',
  290. '0123456789',
  291. 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+-=][|}{;:,./<>?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+-=][|}{;:,./<>?' + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+-=][|}{;:,./<>?'
  292. + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+-=][|}{;:,./<>?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+-=][|}{;:,./<>?' + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+-=][|}{;:,./<>?'
  293. );
  294. var
  295. i : byte;
  296. begin
  297. if SQLDbType<>postgresql then Ignore('This test does only apply to Postgres, since others don''t support varchars without length given');
  298. CreateTableWithFieldType(ftString,'VARCHAR');
  299. TestFieldDeclaration(ftString,dsMaxStringSize+1);
  300. for i := 0 to testValuesCount-1 do
  301. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (''' + testValues[i] + ''')');
  302. with TSQLDBConnector(DBConnector).Query do
  303. begin
  304. Open;
  305. for i := 0 to testValuesCount-1 do
  306. begin
  307. AssertEquals(testValues[i],fields[0].AsString);
  308. Next;
  309. end;
  310. close;
  311. end;
  312. end;
  313. procedure TTestFieldTypes.TestDate;
  314. var
  315. i : byte;
  316. begin
  317. CreateTableWithFieldType(ftDate,'DATE');
  318. TestFieldDeclaration(ftDate,8);
  319. for i := 0 to testDateValuesCount-1 do
  320. if SQLDbType=oracle then
  321. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (to_date (''' + testDateValues[i] + ''',''YYYY-MM-DD''))')
  322. else
  323. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (''' + testDateValues[i] + ''')');
  324. // TSQLDBConnector(DBConnector).Transaction.CommitRetaining; // For debug-purposes
  325. with TSQLDBConnector(DBConnector).Query do
  326. begin
  327. Open;
  328. for i := 0 to testDateValuesCount-1 do
  329. begin
  330. AssertEquals(testDateValues[i],FormatDateTime('yyyy/mm/dd',fields[0].AsDateTime));
  331. Next;
  332. end;
  333. close;
  334. end;
  335. end;
  336. procedure TTestFieldTypes.TestChangeBlob;
  337. var s : string;
  338. begin
  339. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (ID int,FT '+FieldtypeDefinitions[ftblob]+')');
  340. TSQLDBConnector(DBConnector).Transaction.CommitRetaining; // For interbase
  341. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (ID,FT) values (1,''Test deze blob'')');
  342. with TSQLDBConnector(DBConnector).Query do
  343. begin
  344. sql.clear;
  345. sql.add('select * from FPDEV2');
  346. Open;
  347. fields[1].ProviderFlags := [pfInUpdate]; // blob niet in de where
  348. UpdateMode := upWhereAll;
  349. AssertEquals('Test deze blob',fields[1].AsString);
  350. edit;
  351. // Dat werkt niet lekker, omdat de stream vernield wordt...
  352. // fields[0].asstring := 'Deze blob is gewijzigd!';
  353. With Createblobstream(fields[1],bmwrite) do
  354. begin
  355. s := 'Deze blob is gewijzigd!';
  356. WriteBuffer(Pointer(s)^,Length(s));
  357. post;
  358. free;
  359. end;
  360. AssertEquals('Deze blob is gewijzigd!',fields[1].AsString);
  361. ApplyUpdates(0);
  362. TSQLDBConnector(DBConnector).Transaction.CommitRetaining; // For debug-purposes
  363. close;
  364. open;
  365. AssertEquals('Deze blob is gewijzigd!',fields[1].AsString);
  366. close;
  367. end;
  368. end;
  369. procedure TTestFieldTypes.TestBlobGetText;
  370. begin
  371. CreateTableWithFieldType(ftBlob,FieldtypeDefinitions[ftBlob]);
  372. TestFieldDeclaration(ftBlob,0);
  373. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (''Test deze blob'')');
  374. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (Null)');
  375. // TSQLDBConnector(DBConnector).Transaction.CommitRetaining; // For debug-purposes
  376. with TSQLDBConnector(DBConnector).Query do
  377. begin
  378. Open;
  379. AssertFalse(fields[0].IsNull);
  380. AssertEquals('(BLOB)',fields[0].DisplayText);
  381. AssertEquals('Test deze blob',fields[0].AsString);
  382. Next;
  383. AssertTrue(fields[0].IsNull);
  384. AssertEquals('(blob)',fields[0].Text);
  385. AssertEquals('',fields[0].AsString);
  386. close;
  387. end;
  388. end;
  389. procedure TTestFieldTypes.TestSetBlobAsStringParam;
  390. var
  391. i : byte;
  392. ASQL : TSQLQuery;
  393. begin
  394. CreateTableWithFieldType(ftBlob,FieldtypeDefinitions[ftBlob]);
  395. // CreateTableWithFieldType(ftBlob,'TEXT');
  396. TestFieldDeclaration(ftBlob,0);
  397. ASQL := DBConnector.GetNDataset(True,1) as tsqlquery;
  398. with ASql do
  399. begin
  400. sql.Text := 'insert into FPDEV2 (FT) values (:BlobParam)';
  401. Params.ParamByName('blobParam').AsString := 'Test deze BLob';
  402. ExecSQL;
  403. end;
  404. with TSQLDBConnector(DBConnector).Query do
  405. begin
  406. Open;
  407. if not eof then
  408. AssertEquals('Test deze BLob',fields[0].AsString);
  409. close;
  410. end;
  411. end;
  412. procedure TTestFieldTypes.TestBlob;
  413. var
  414. i : byte;
  415. begin
  416. CreateTableWithFieldType(ftBlob,FieldtypeDefinitions[ftBlob]);
  417. TestFieldDeclaration(ftBlob,0);
  418. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (''Test deze blob'')');
  419. // TSQLDBConnector(DBConnector).Transaction.CommitRetaining; // For debug-purposes
  420. with TSQLDBConnector(DBConnector).Query do
  421. begin
  422. Open;
  423. AssertEquals('Test deze blob',fields[0].AsString);
  424. close;
  425. end;
  426. end;
  427. procedure TTestFieldTypes.TestDateTime;
  428. const
  429. testValuesCount = 31;
  430. testValues : Array[0..testValuesCount-1] of string = (
  431. '2000-01-01',
  432. '1999-12-31',
  433. '2004-02-29',
  434. '2004-03-01',
  435. '1991-02-28',
  436. '1991-03-01',
  437. '1977-09-29',
  438. '2000-01-01 10:00:00',
  439. '2000-01-01 23:59:59',
  440. '1994-03-06 11:54:30',
  441. '2040-10-16', // MySQL 4.0 doesn't support datetimes before 1970 or after 2038
  442. '1400-02-03 12:21:53',
  443. '0354-11-20 21:25:15',
  444. '1333-02-03 21:44:21',
  445. '1800-03-30',
  446. '1650-05-10',
  447. '1754-06-04',
  448. '0904-04-12',
  449. '0199-07-09',
  450. '0001-01-01',
  451. '1899-12-29',
  452. '1899-12-30',
  453. '1899-12-31',
  454. '1900-01-01',
  455. '1899-12-30 18:00:51',
  456. '1899-12-30 04:00:51',
  457. '1899-12-29 04:00:51',
  458. '1899-12-29 18:00:51',
  459. '1903-04-02 01:04:02',
  460. '1815-09-24 03:47:22',
  461. '2100-01-01 01:01:01'
  462. );
  463. var
  464. i, corrTestValueCount : byte;
  465. begin
  466. CreateTableWithFieldType(ftDateTime,FieldtypeDefinitions[ftDateTime]);
  467. TestFieldDeclaration(ftDateTime,8);
  468. if SQLDbType=mysql40 then corrTestValueCount := testValuesCount-21
  469. else corrTestValueCount := testValuesCount;
  470. for i := 0 to corrTestValueCount-1 do
  471. if SQLDbType=oracle then
  472. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (to_date (''' + testValues[i] + ''',''YYYY-MM-DD HH24:MI:SS''))')
  473. else
  474. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (''' + testValues[i] + ''')');
  475. with TSQLDBConnector(DBConnector).Query do
  476. begin
  477. Open;
  478. for i := 0 to corrTestValueCount-1 do
  479. begin
  480. if length(testValues[i]) < 12 then
  481. AssertEquals(testValues[i],FormatDateTime('yyyy/mm/dd',fields[0].AsDateTime))
  482. else
  483. AssertEquals(testValues[i],FormatDateTime('yyyy/mm/dd hh:mm:ss',fields[0].AsDateTime));
  484. Next;
  485. end;
  486. close;
  487. end;
  488. end;
  489. procedure TTestFieldTypes.TestFloat;
  490. const
  491. testValuesCount = 21;
  492. testValues : Array[0..testValuesCount-1] of double = (-maxSmallint-1,-maxSmallint,-256,-255,-128,-127,-1,0,1,127,128,255,256,maxSmallint,maxSmallint+1,0.123456,-0.123456,4.35,12.434E7,9.876e-5,123.45678);
  493. var
  494. i : byte;
  495. begin
  496. CreateTableWithFieldType(ftFloat,'FLOAT');
  497. TestFieldDeclaration(ftFloat,sizeof(double));
  498. for i := 0 to testValuesCount-1 do
  499. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FT) values (' + floattostr(testValues[i]) + ')');
  500. with TSQLDBConnector(DBConnector).Query do
  501. begin
  502. Open;
  503. for i := 0 to testValuesCount-1 do
  504. begin
  505. AssertEquals(testValues[i],fields[0].AsFloat);
  506. Next;
  507. end;
  508. close;
  509. end;
  510. end;
  511. procedure TTestFieldTypes.TestNullValues;
  512. begin
  513. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (FIELD1 INT, FIELD2 INT)');
  514. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  515. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  516. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 (FIELD1) values (1)');
  517. with TSQLDBConnector(DBConnector).Query do
  518. begin
  519. sql.clear;
  520. sql.append('select * from FPDEV2');
  521. open;
  522. AssertEquals(1,FieldByName('FIELD1').AsInteger);
  523. AssertTrue('Null-values test failed',FieldByName('FIELD2').IsNull);
  524. close;
  525. end;
  526. end;
  527. procedure TTestFieldTypes.TestParamQuery;
  528. begin
  529. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (FIELD1 INT, FIELD2 INT, FIELD3 INT, DECOY VARCHAR(30))');
  530. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  531. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  532. with TSQLDBConnector(DBConnector).Query do
  533. begin
  534. sql.clear;
  535. sql.append('insert into FPDEV2 (field1) values (:field1)');
  536. Params.ParamByName('field1').AsInteger := 1;
  537. ExecSQL;
  538. sql.clear;
  539. sql.append('insert into FPDEV2 (field1,field2,decoy) values (:field1,:field2,''decoytest'')');
  540. Params.ParamByName('field1').AsInteger := 2;
  541. Params.ParamByName('field2').DataType := ftInteger;
  542. Params.ParamByName('field2').Value := Null;
  543. ExecSQL;
  544. sql.clear;
  545. sql.append('insert into FPDEV2 (field1,field2,field3) values (:field1,:field2,:field3)');
  546. Params.ParamByName('field1').AsInteger := 3;
  547. Params.ParamByName('field2').AsInteger := 2;
  548. Params.ParamByName('field3').AsInteger := 3;
  549. ExecSQL;
  550. sql.clear;
  551. sql.append('insert into FPDEV2 (field1,field2,field3,decoy) values (:field1,:field2,:field3,'':decoy ::test $decoy2 $$2'')');
  552. Params.ParamByName('field1').AsInteger := 4;
  553. Params.ParamByName('field2').AsInteger := 2;
  554. Params.ParamByName('field3').AsInteger := 3;
  555. ExecSQL;
  556. sql.clear;
  557. sql.append('insert into FPDEV2 (field1,field2,field3) values (:field1,:field2,:field1)');
  558. Params.ParamByName('field1').AsInteger := 5;
  559. Params.ParamByName('field2').AsInteger := 2;
  560. ExecSQL;
  561. sql.clear;
  562. sql.append('select * from FPDEV2 order by FIELD1');
  563. open;
  564. AssertEquals(1,FieldByName('FIELD1').asinteger);
  565. AssertTrue(FieldByName('FIELD2').IsNull);
  566. AssertTrue(FieldByName('FIELD3').IsNull);
  567. AssertTrue(FieldByName('DECOY').IsNull);
  568. next;
  569. AssertEquals(2,FieldByName('FIELD1').asinteger);
  570. AssertTrue(FieldByName('FIELD2').IsNull);
  571. AssertTrue(FieldByName('FIELD3').IsNull);
  572. AssertEquals('decoytest',FieldByName('DECOY').AsString);
  573. next;
  574. AssertEquals(3,FieldByName('FIELD1').asinteger);
  575. AssertEquals(2,FieldByName('FIELD2').asinteger);
  576. AssertEquals(3,FieldByName('FIELD3').asinteger);
  577. AssertTrue(FieldByName('DECOY').IsNull);
  578. next;
  579. AssertEquals(4,FieldByName('FIELD1').asinteger);
  580. AssertEquals(2,FieldByName('FIELD2').asinteger);
  581. AssertEquals(3,FieldByName('FIELD3').asinteger);
  582. AssertEquals(':decoy ::test $decoy2 $$2',FieldByName('DECOY').AsString);
  583. next;
  584. AssertEquals(5,FieldByName('FIELD1').asinteger);
  585. AssertEquals(2,FieldByName('FIELD2').asinteger);
  586. AssertEquals(5,FieldByName('FIELD3').asinteger);
  587. AssertTrue(FieldByName('DECOY').IsNull);
  588. close;
  589. end;
  590. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  591. end;
  592. procedure TTestFieldTypes.TestIntParamQuery;
  593. begin
  594. TestXXParamQuery(ftInteger,'INT',testIntValuesCount);
  595. end;
  596. procedure TTestFieldTypes.TestFloatParamQuery;
  597. begin
  598. TestXXParamQuery(ftFloat,'FLOAT',testFloatValuesCount);
  599. end;
  600. procedure TTestFieldTypes.TestStringParamQuery;
  601. begin
  602. TestXXParamQuery(ftString,'VARCHAR(10)',testStringValuesCount);
  603. end;
  604. procedure TTestFieldTypes.TestDateParamQuery;
  605. begin
  606. TestXXParamQuery(ftDate,'DATE',testDateValuesCount);
  607. end;
  608. procedure TTestFieldTypes.TestXXParamQuery(ADatatype : TFieldType; ASQLTypeDecl : string; testValuescount : integer; Cross : boolean = false);
  609. var i : integer;
  610. begin
  611. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (ID INT, FIELD1 '+ASQLTypeDecl+')');
  612. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  613. if SQLDbType=interbase then TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  614. with TSQLDBConnector(DBConnector).Query do
  615. begin
  616. PacketRecords := -1;
  617. sql.clear;
  618. sql.append('insert into FPDEV2 (ID,FIELD1) values (:id,:field1)');
  619. ShortDateFormat := 'yyyy-mm-dd';
  620. for i := 0 to testValuesCount -1 do
  621. begin
  622. Params.ParamByName('id').AsInteger := i;
  623. case ADataType of
  624. ftInteger: Params.ParamByName('field1').asinteger := testIntValues[i];
  625. ftFloat : Params.ParamByName('field1').AsFloat := testFloatValues[i];
  626. ftString : Params.ParamByName('field1').AsString := testStringValues[i];
  627. ftDate : if cross then
  628. Params.ParamByName('field1').AsString:= testDateValues[i]
  629. else
  630. Params.ParamByName('field1').AsDateTime:= StrToDate(testDateValues[i]);
  631. else
  632. AssertTrue('no test for paramtype available',False);
  633. end;
  634. ExecSQL;
  635. end;
  636. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  637. sql.clear;
  638. sql.append('select * from FPDEV2 order by ID');
  639. open;
  640. for i := 0 to testValuesCount -1 do
  641. begin
  642. AssertEquals(i,FieldByName('ID').AsInteger);
  643. case ADataType of
  644. ftInteger: AssertEquals(testIntValues[i],FieldByName('FIELD1').AsInteger);
  645. ftFloat : AssertEquals(testFloatValues[i],FieldByName('FIELD1').AsFloat);
  646. ftString : AssertEquals(testStringValues[i],FieldByName('FIELD1').AsString);
  647. ftdate : AssertEquals(testDateValues[i],FormatDateTime('yyyy/mm/dd',FieldByName('FIELD1').AsDateTime));
  648. else
  649. AssertTrue('no test for paramtype available',False);
  650. end;
  651. Next;
  652. end;
  653. close;
  654. end;
  655. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  656. end;
  657. procedure TTestFieldTypes.TestAggregates;
  658. begin
  659. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (FIELD1 INT, FIELD2 INT)');
  660. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  661. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  662. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 values (1,1)');
  663. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 values (2,3)');
  664. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 values (3,4)');
  665. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('insert into FPDEV2 values (4,4)');
  666. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  667. with TSQLDBConnector(DBConnector).Query do
  668. begin
  669. sql.clear;
  670. sql.append('select count(*) from FPDEV2');
  671. open;
  672. AssertEquals(4,Fields[0].AsInteger);
  673. close;
  674. sql.clear;
  675. sql.append('select sum(FIELD1) from FPDEV2');
  676. open;
  677. AssertEquals(10,Fields[0].AsInteger);
  678. close;
  679. sql.clear;
  680. sql.append('select avg(FIELD2) from FPDEV2');
  681. open;
  682. AssertEquals(3,Fields[0].AsInteger);
  683. close;
  684. end;
  685. end;
  686. procedure TTestFieldTypes.CreateTableWithFieldType(ADatatype: TFieldType;
  687. ASQLTypeDecl: string);
  688. begin
  689. TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (FT ' +ASQLTypeDecl+ ')');
  690. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  691. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  692. end;
  693. procedure TTestFieldTypes.TestFieldDeclaration(ADatatype: TFieldType;
  694. ADataSize: integer);
  695. begin
  696. with TSQLDBConnector(DBConnector).Query do
  697. begin
  698. SQL.Clear;
  699. SQL.Add('select * from FPDEV2');
  700. Open;
  701. AssertEquals(1,FieldCount);
  702. AssertTrue(CompareText('FT',fields[0].FieldName)=0);
  703. AssertEquals(ADataSize,fields[0].DataSize);
  704. AssertTrue(ADatatype=fields[0].DataType);
  705. Close;
  706. end;
  707. end;
  708. procedure TTestFieldTypes.SetUp;
  709. begin
  710. InitialiseDBConnector;
  711. end;
  712. procedure TTestFieldTypes.TearDown;
  713. begin
  714. if assigned(DBConnector) then
  715. TSQLDBConnector(DBConnector).Transaction.Rollback;
  716. FreeAndNil(DBConnector);
  717. end;
  718. procedure TTestFieldTypes.RunTest;
  719. begin
  720. // if (SQLDbType in TSQLDBTypes) then
  721. inherited RunTest;
  722. end;
  723. procedure TTestFieldTypes.TestParseJoins;
  724. begin
  725. with TSQLDBConnector(DBConnector) do
  726. begin
  727. with query do
  728. begin
  729. SQL.Text:='select TT.NAME from FPDEV left join FPDEV as TT on TT.ID=FPDEV.ID';
  730. Open;
  731. close;
  732. end;
  733. end;
  734. end;
  735. procedure TTestFieldTypes.TestInsertLargeStrFields;
  736. begin
  737. with TSQLDBConnector(DBConnector) do
  738. begin
  739. Connection.ExecuteDirect('create table FPDEV2 ( ' +
  740. ' ID INT NOT NULL , ' +
  741. ' NAME VARCHAR(16000), ' +
  742. ' PRIMARY KEY (ID) ' +
  743. ') ');
  744. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  745. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  746. Query.SQL.Text := 'insert into FPDEV2(ID,NAME) values (1,''test1'')';
  747. Query.ExecSQL;
  748. query.sql.Text:='select * from FPDEV2';
  749. Query.Open;
  750. AssertEquals(query.FieldByName('NAME').AsString,'test1');
  751. Query.insert;
  752. query.fields[1].AsString:='11';
  753. query.Close;
  754. end;
  755. end;
  756. procedure TTestFieldTypes.TestNumericNames;
  757. begin
  758. with TSQLDBConnector(DBConnector) do
  759. begin
  760. if sqQuoteFieldnames in Connection.ConnOptions then
  761. Connection.ExecuteDirect('create table FPDEV2 ( ' +
  762. ' "2ID" INT NOT NULL , ' +
  763. ' "3TEST" VARCHAR(10), ' +
  764. ' PRIMARY KEY ("2ID") ' +
  765. ') ')
  766. else
  767. Connection.ExecuteDirect('create table FPDEV2 ( ' +
  768. ' 2ID INT NOT NULL , ' +
  769. ' 3TEST VARCHAR(10), ' +
  770. ' PRIMARY KEY (2ID) ' +
  771. ') ');
  772. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  773. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  774. with query do
  775. begin
  776. SQL.Text:='select * from FPDEV2';
  777. Open;
  778. Edit;
  779. fieldbyname('2ID').AsInteger:=1;
  780. fieldbyname('3TEST').AsString:='3test';
  781. Post;
  782. ApplyUpdates(0);
  783. close;
  784. open;
  785. AssertEquals('3test',FieldByName('3TEST').AsString);
  786. Edit;
  787. fieldbyname('3TEST').AsString:='test3';
  788. Post;
  789. ApplyUpdates(0);
  790. open;
  791. AssertEquals('test3',FieldByName('3TEST').AsString);
  792. close;
  793. end;
  794. end;
  795. end;
  796. procedure TTestFieldTypes.TestRowsAffected;
  797. begin
  798. with TSQLDBConnector(DBConnector) do
  799. begin
  800. AssertEquals(-1,query.RowsAffected);
  801. Connection.ExecuteDirect('create table FPDEV2 ( ' +
  802. ' ID INT NOT NULL , ' +
  803. ' NAME VARCHAR(250), ' +
  804. ' PRIMARY KEY (ID) ' +
  805. ') ');
  806. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  807. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  808. Query.SQL.Text := 'insert into FPDEV2(ID,NAME) values (1,''test1'')';
  809. Query.ExecSQL;
  810. AssertEquals(1,query.RowsAffected);
  811. Query.SQL.Text := 'insert into FPDEV2(ID,NAME) values (2,''test2'')';
  812. Query.ExecSQL;
  813. AssertEquals(1,query.RowsAffected);
  814. Query.SQL.Text := 'update FPDEV2 set NAME=''NewTest''';
  815. Query.ExecSQL;
  816. AssertEquals(2,query.RowsAffected);
  817. Query.SQL.Text := 'select * from FPDEV2';
  818. Query.Open;
  819. AssertTrue(query.RowsAffected<>0); // It should return -1 or the number of selected rows.
  820. query.Close;
  821. AssertTrue(query.RowsAffected<>0); // It should return -1 or the same as the last time it was called.
  822. if (SQLDbType = sqlite3) then // sqlite doesn't count the rowsaffected if there is no where-clause
  823. Query.SQL.Text := 'delete from FPDEV2 where 1'
  824. else
  825. Query.SQL.Text := 'delete from FPDEV2';
  826. Query.ExecSQL;
  827. AssertEquals(2,query.RowsAffected);
  828. Query.SQL.Text := 'delete from FPDEV2';
  829. Query.ExecSQL;
  830. AssertEquals(0,query.RowsAffected);
  831. end;
  832. end;
  833. procedure TTestFieldTypes.TestStringsReplace;
  834. begin
  835. AssertEquals('dit is een string',StringsReplace('dit was een string',['was'],['is'],[]));
  836. AssertEquals('dit is een string was een string',StringsReplace('dit was een string was een string',['was'],['is'],[]));
  837. AssertEquals('dit is een string is een string',StringsReplace('dit was een string was een string',['was'],['is'],[rfReplaceAll]));
  838. AssertEquals('dit is een char is een char',StringsReplace('dit was een string was een string',['was','string'],['is','char'],[rfReplaceAll]));
  839. AssertEquals('dit is een string was een string',StringsReplace('dit was een string was een string',['string','was'],['char','is'],[]));
  840. AssertEquals('dit is een char is een strin',StringsReplace('dit was een string was een strin',['string','was'],['char','is'],[rfReplaceAll]));
  841. AssertEquals('dit Was een char is een char',StringsReplace('dit Was een string was een string',['was','string'],['is','char'],[rfReplaceAll]));
  842. AssertEquals('dit wAs een char is een char',StringsReplace('dit wAs een string was een string',['was','string'],['is','char'],[rfReplaceAll]));
  843. AssertEquals('dit is een char is een char',StringsReplace('dit Was een sTring was een string',['was','string'],['is','char'],[rfReplaceAll,rfIgnoreCase]));
  844. AssertEquals('dit is een char is een char',StringsReplace('dit wAs een STRING was een string',['was','string'],['is','char'],[rfReplaceAll,rfIgnoreCase]));
  845. AssertEquals('dit was een si was een sa',StringsReplace('dit was een string was een straat',['straat','string'],['sa','si'],[rfReplaceAll]));
  846. AssertEquals('dit was een si was een sa',StringsReplace('dit was een string was een straat',['string','straat'],['si','sa'],[rfReplaceAll]));
  847. AssertEquals('dit was een sing was een saat',StringsReplace('dit was een string was een straat',['str','string'],['s','si'],[rfReplaceAll]));
  848. AssertEquals('dit was een si was een saat',StringsReplace('dit was een string was een straat',['string','str'],['si','s'],[rfReplaceAll]));
  849. AssertEquals('dit was een string was een string',StringsReplace('dit was een string was een string',[''],['is'],[rfReplaceAll]));
  850. AssertEquals('dit een string een string',StringsReplace('dit was een string was een string',['was'],[''],[rfReplaceAll]));
  851. end;
  852. procedure TTestFieldTypes.TestCircularParams;
  853. begin
  854. with TSQLDBConnector(dbconnector) do
  855. begin
  856. Connection.ExecuteDirect('create table FPDEV2 (id1 int, id2 int,vchar varchar(10))');
  857. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  858. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  859. Query.sql.Text := 'insert into FPDEV2 values(:id1,:id2,:vchar)';
  860. query.params[0].asinteger := 1;
  861. query.params[1].asinteger := 1;
  862. query.params[2].asstring := '$1 :id2 $';
  863. query.ExecSQL;
  864. query.sql.text := 'select * from FPDEV2';
  865. query.open;
  866. AssertEquals(1,query.fields[0].asinteger);
  867. AssertEquals(1,query.fields[1].asinteger);
  868. AssertEquals('$1 :id2 $',query.fields[2].AsString);
  869. query.close;
  870. end;
  871. end;
  872. procedure TTestFieldTypes.Test11Params;
  873. var i : integer;
  874. begin
  875. with TSQLDBConnector(dbconnector) do
  876. begin
  877. Connection.ExecuteDirect('create table FPDEV2 (id1 int, id2 int, id3 int, id4 int,id5 int,id6 int,id7 int,id8 int, id9 int, id10 int, id11 int)');
  878. // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
  879. TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
  880. Query.sql.Text := 'insert into FPDEV2 values(:id1,:id2,:id3,:id4,:id5,:id6,:id7,:id8,:id9,:id10,:id11)';
  881. for i := 0 to 10 do
  882. query.params[i].asinteger := 1;
  883. query.ExecSQL;
  884. query.sql.text := 'select * from FPDEV2';
  885. query.open;
  886. for i := 0 to 10 do
  887. AssertEquals(1,query.fields[i].asinteger);
  888. query.close;
  889. end;
  890. end;
  891. procedure TTestFieldTypes.TestBug9744;
  892. var i : integer;
  893. begin
  894. if SQLDbType in [interbase,postgresql] then Ignore('This test does not apply to this db-engine, since it has no double field-type');
  895. with TSQLDBConnector(DBConnector) do
  896. begin
  897. try
  898. Connection.ExecuteDirect('create table TTTOBJ ( ' +
  899. ' ID INT NOT NULL, ' +
  900. ' NAME VARCHAR(250), ' +
  901. ' PRIMARY KEY (ID) ' +
  902. ') ');
  903. Connection.ExecuteDirect('create table TTTXY ( ' +
  904. ' ID INT NOT NULL, ' +
  905. ' NP INT NOT NULL, ' +
  906. ' X DOUBLE, ' +
  907. ' Y DOUBLE, ' +
  908. ' PRIMARY KEY (ID,NP) ' +
  909. ') ');
  910. for i := 0 to 7 do
  911. begin
  912. connection.ExecuteDirect('insert into TTTOBJ(ID,NAME) values ('+inttostr(i)+',''A'+inttostr(i)+''')');
  913. connection.ExecuteDirect('insert into TTTXY(ID,NP,X,Y) values ('+inttostr(i)+',1,1,1)');
  914. connection.ExecuteDirect('insert into TTTXY(ID,NP,X,Y) values ('+inttostr(i)+',2,2,2)');
  915. end;
  916. Query.SQL.Text := 'select OBJ.ID, OBJ.NAME, count(XY.NP) as NPF from TTTOBJ as OBJ, TTTXY as XY where (OBJ.ID=XY.ID) group by OBJ.ID';
  917. query.Prepare;
  918. query.open;
  919. query.close;
  920. finally
  921. Connection.ExecuteDirect('drop table TTTXY');
  922. Connection.ExecuteDirect('drop table TTTOBJ');
  923. end
  924. end;
  925. end;
  926. procedure TTestFieldTypes.TestCrossStringDateParam;
  927. begin
  928. TestXXParamQuery(ftDate,'DATE',testDateValuesCount,True);
  929. end;
  930. procedure TTestFieldTypes.TestGetFieldNames;
  931. var FieldNames : TStringList;
  932. begin
  933. with TSQLDBConnector(DBConnector) do
  934. begin
  935. FieldNames := TStringList.Create;
  936. try
  937. if SQLDbType in MySQLdbTypes then
  938. Connection.GetFieldNames('FPDEV',FieldNames)
  939. else
  940. Connection.GetFieldNames('fpDEv',FieldNames);
  941. AssertEquals(2,FieldNames.Count);
  942. AssertEquals('ID',UpperCase(FieldNames[0]));
  943. AssertEquals('NAME',UpperCase(FieldNames[1]));
  944. finally
  945. FieldNames.Free;
  946. end;
  947. end;
  948. end;
  949. procedure TTestFieldTypes.TestGetTables;
  950. var TableNames : TStringList;
  951. begin
  952. with TSQLDBConnector(DBConnector) do
  953. begin
  954. TableNames := TStringList.Create;
  955. try
  956. Connection.GetTableNames(TableNames);
  957. AssertTrue(TableNames.Count>0);
  958. AssertTrue(TableNames.IndexOf('FPDEV')>-1);
  959. AssertTrue(TableNames.IndexOf('FPDEV_FIELD')>-1);
  960. finally
  961. TableNames.Free;
  962. end;
  963. end;
  964. end;
  965. procedure TTestFieldTypes.TestUpdateIndexDefs;
  966. var ds : TSQLQuery;
  967. begin
  968. ds := DBConnector.GetNDataset(1) as TSQLQuery;
  969. ds.Prepare;
  970. ds.IndexDefs.Update;
  971. AssertEquals(1,ds.IndexDefs.count);
  972. AssertTrue(CompareText('ID',ds.indexdefs[0].Fields)=0);
  973. Asserttrue(ds.indexdefs[0].Options=[ixPrimary,ixUnique]);
  974. ds.IndexDefs.Update;
  975. AssertEquals(1,ds.IndexDefs.count);
  976. AssertTrue(CompareText('ID',ds.indexdefs[0].Fields)=0);
  977. Asserttrue(ds.indexdefs[0].Options=[ixPrimary,ixUnique]);
  978. end;
  979. procedure TTestFieldTypes.TestSetBlobAsMemoParam;
  980. var
  981. i : byte;
  982. ASQL : TSQLQuery;
  983. begin
  984. CreateTableWithFieldType(ftBlob,FieldtypeDefinitions[ftBlob]);
  985. TestFieldDeclaration(ftBlob,0);
  986. ASQL := DBConnector.GetNDataset(True,1) as tsqlquery;
  987. with ASql do
  988. begin
  989. sql.Text := 'insert into FPDEV2 (FT) values (:BlobParam)';
  990. Params.ParamByName('blobParam').AsMemo := 'Test deze BLob';
  991. ExecSQL;
  992. end;
  993. with TSQLDBConnector(DBConnector).Query do
  994. begin
  995. Open;
  996. if not eof then
  997. AssertEquals('Test deze BLob',fields[0].AsString);
  998. close;
  999. end;
  1000. end;
  1001. procedure TTestFieldTypes.TestTemporaryTable;
  1002. begin
  1003. if SQLDbType=interbase then Ignore('This test does not apply to Interbase/Firebird, since it doesn''t support temporary tables');
  1004. with TSQLDBConnector(DBConnector).Query do
  1005. begin
  1006. SQL.Clear;
  1007. SQL.Add('CREATE TEMPORARY TABLE TEMP1 (id int)');
  1008. ExecSQL;
  1009. SQL.Text := 'INSERT INTO TEMP1(id) values (5)';
  1010. ExecSQL;
  1011. SQL.Text := 'SELECT * FROM TEMP1';
  1012. Open;
  1013. AssertEquals(5,fields[0].AsInteger);
  1014. Close;
  1015. end;
  1016. end;
  1017. procedure TTestFieldTypes.TestGetIndexDefs;
  1018. var ds : TSQLQuery;
  1019. inddefs : TIndexDefs;
  1020. begin
  1021. ds := DBConnector.GetNDataset(1) as TSQLQuery;
  1022. ds.Open;
  1023. AssertEquals(1,ds.IndexDefs.count);
  1024. inddefs := HackedDataset(ds).GetIndexDefs(ds.IndexDefs,[ixPrimary]);
  1025. AssertEquals(1,inddefs.count);
  1026. AssertTrue(CompareText('ID',inddefs[0].Fields)=0);
  1027. Asserttrue(inddefs[0].Options=[ixPrimary,ixUnique]);
  1028. inddefs.Free;
  1029. inddefs := HackedDataset(ds).GetIndexDefs(ds.IndexDefs,[ixPrimary,ixUnique]);
  1030. AssertEquals(1,inddefs.count);
  1031. AssertTrue(CompareText('ID',inddefs[0].Fields)=0);
  1032. Asserttrue(inddefs[0].Options=[ixPrimary,ixUnique]);
  1033. inddefs.Free;
  1034. inddefs := HackedDataset(ds).GetIndexDefs(ds.IndexDefs,[ixDescending]);
  1035. AssertEquals(0,inddefs.count);
  1036. inddefs.Free;
  1037. end;
  1038. procedure TTestFieldTypes.TestDblQuoteEscComments;
  1039. begin
  1040. with TSQLDBConnector(DBConnector).Query do
  1041. begin
  1042. SQL.Clear;
  1043. SQL.Add('select * from FPDEV where name=''test '''' and :ThisIsNotAParameter ''');
  1044. open;
  1045. close;
  1046. end;
  1047. end;
  1048. procedure TTestFieldTypes.TestParametersAndDates;
  1049. // See bug 7205
  1050. var ADateStr : String;
  1051. begin
  1052. if SQLDbType in [interbase,mysql40,mysql41,mysql50] then Ignore('This test does not apply to this sqldb-connection type, since it doesn''t use semicolons for casts');
  1053. with TSQLDBConnector(DBConnector).Query do
  1054. begin
  1055. SQL.Clear;
  1056. sql.add('select now()::date as current_date where 1=1');
  1057. open;
  1058. first;
  1059. ADateStr:=fields[0].asstring; // return the correct date
  1060. // writeln(fields[0].asstring);
  1061. close;
  1062. sql.clear;
  1063. sql.add('select now()::date as current_date where cast(1 as integer) = :PARAM1');
  1064. params.parambyname('PARAM1').asinteger:= 1;
  1065. open;
  1066. first;
  1067. AssertEquals(ADateStr,fields[0].asstring); // return invalid date
  1068. // writeln(fields[0].asstring);
  1069. close;
  1070. end
  1071. end;
  1072. procedure TTestFieldTypes.TestExceptOnsecClose;
  1073. var passed : boolean;
  1074. begin
  1075. with TSQLDBConnector(DBConnector).Query do
  1076. begin
  1077. SQL.Clear;
  1078. SQL.Add('select * from FPDEV');
  1079. Open;
  1080. close;
  1081. SQL.Clear;
  1082. SQL.Add('select blaise from FPDEV');
  1083. passed := false;
  1084. try
  1085. open;
  1086. except
  1087. on E: Exception do
  1088. passed := (E.ClassType.InheritsFrom(EDatabaseError))
  1089. end;
  1090. AssertTrue(passed);
  1091. Close;
  1092. end;
  1093. end;
  1094. initialization
  1095. if uppercase(dbconnectorname)='SQL' then RegisterTest(TTestFieldTypes);
  1096. end.