tcgensql.pas 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549
  1. {
  2. This file is part of the Free Component Library
  3. Copyright (c) 2010-2014 by the Free Pascal development team
  4. SQL Syntax Tree SQL generation tests
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit tcgensql;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, fpcunit, testutils, testregistry,fpsqltree;
  16. type
  17. TSQLDropStatementClass = Class of TSQLDropStatement;
  18. TSQLGranteeClass = Class of TSQLGrantee;
  19. { TTestGenerateSQL }
  20. TTestGenerateSQL= class(TTestCase)
  21. Private
  22. FToFree:TSQLElement;
  23. protected
  24. Procedure SetUp; override;
  25. Procedure TearDown; override;
  26. Procedure DoTestDropStatement(AClass: TSQLDropStatementClass; const AObjectName: String);
  27. Procedure DoTestAlterCreateProcedure(S: TSQLAlterCreateProcedureStatement; PHEAD: String);
  28. Procedure DoTestAlterCreateTrigger(S: TSQLAlterCreateTriggerStatement; PHEAD: String);
  29. Function CreateIdentifier(Const AName : TSQLStringType) : TSQLIdentifierName;
  30. Function CreateGrantee(Const AName : TSQLStringType; AClass : TSQLGranteeClass = Nil) : TSQLGrantee;
  31. Function CreateLiteral(Const AValue : Integer) : TSQLIntegerLiteral;
  32. Function CreateLiteral(Const AValue : TSQLStringType) : TSQLStringLiteral;
  33. Function CreateLiteral(Const AValue : Double) : TSQLFloatLiteral;
  34. Function CreateTypeDefinition(Const ADataType : TSQLDataType; ALen : Integer = 0): TSQLTypeDefinition;
  35. Function CreateLiteralExpression(Const ALiteral : TSQLLiteral) : TSQLLiteralExpression;
  36. Function CreateIdentifierExpression(Const AName : TSQLStringtype) : TSQLIdentifierExpression;
  37. Function CreateUnaryExpression(Const AOperand : TSQLExpression) : TSQLUnaryExpression;
  38. Function CreateBinaryExpression(Const ALeft,ARight : TSQLExpression) : TSQLBinaryExpression;
  39. Function CreateUpdatePair(Const AField : TSQLStringType; AValue : TSQLExpression) : TSQLUpdatePair;
  40. Function CreateTernaryExpression(Const ALeft,AMiddle,ARight : TSQLExpression) : TSQLTernaryExpression;
  41. Function CreateForeignKey(Const ATable : TSQLStringType; AFieldName1,AFieldName2 : TSQLStringType):TSQLForeignKeyDefinition;
  42. Function CreateSelectField(Const AValue : TSQLExpression; Const AAlias : TSQLStringType) : TSQLSelectField;
  43. Function CreateSimpleTableReference(Const ATableName : TSQLStringType; AAlias : TSQLStringType) : TSQLSimpleTableReference;
  44. Function CreateJoinTablereference(Const ALeft,ARight : TSQLTableReference) : TSQLJoinTableReference;
  45. Function CreateSelect(AField : TSQLExpression; ATable : TSQLStringType) : TSQLSelectStatement;
  46. Procedure AssertSQL(Const AElement : TSQLElement; Const ASQL : TSQLStringType; AOptions : TSQLFormatOptions = []);
  47. published
  48. procedure TestIdentifier;
  49. Procedure TestIntegerLiteral;
  50. procedure TestStringLiteral;
  51. Procedure TestFloatLiteral;
  52. Procedure TestNullLiteral;
  53. Procedure TestUserLiteral;
  54. Procedure TestValueLiteral;
  55. Procedure TestLiteralExpression;
  56. Procedure TestSelectField;
  57. Procedure TestSimpleTablereference;
  58. Procedure TestSimpleSelect;
  59. Procedure TestAnyExpression;
  60. procedure TestAllExpression;
  61. procedure TestExistsExpression;
  62. procedure TestSomeExpression;
  63. procedure TestSingularExpression;
  64. Procedure TestUnaryExpression;
  65. procedure TestBinaryExpression;
  66. procedure TestListExpression;
  67. procedure TestTernaryExpression;
  68. Procedure TestGenIDExpression;
  69. Procedure TestFunctionCall;
  70. procedure TestAggregateFunction;
  71. procedure TestForeignKey;
  72. procedure TestUniqueFieldConstraint;
  73. procedure TestPrimaryKeyFieldConstraint;
  74. procedure TestForeignKeyFieldConstraint;
  75. procedure TestCheckFieldConstraint;
  76. procedure TestTableUniqueConstraintDef;
  77. procedure TestTablePrimaryKeyConstraintDef;
  78. procedure TestTableForeignKeyConstraintDef;
  79. procedure TestTableCheckConstraintDef;
  80. Procedure TestTypeDefinition;
  81. Procedure TestCastExpression;
  82. procedure TestJoinTableReference;
  83. procedure TestPlanNatural;
  84. procedure TestPlanIndex;
  85. procedure TestPlanOrder;
  86. procedure TestPlanExpression;
  87. procedure TestOrderBy;
  88. Procedure TestSelect;
  89. procedure TestInsert;
  90. procedure TestUpdatePair;
  91. procedure TestUpdate;
  92. procedure TestDelete;
  93. procedure TestRollback;
  94. procedure TestCommit;
  95. procedure TestExecuteProcedure;
  96. procedure TestCreateGenerator;
  97. procedure TestCreateRole;
  98. procedure TestCreateDomain;
  99. procedure TestAlterDomainDropDefault;
  100. procedure TestAlterDomainDropCheck;
  101. Procedure TestAlterDomainSetDefault;
  102. Procedure TestAlterDomainRename;
  103. procedure TestAlterDomainNewType;
  104. procedure TestAlterDomainAddCheck;
  105. procedure TestCreateException;
  106. procedure TestAlterException;
  107. procedure TestCreateIndex;
  108. procedure TestAlterIndex;
  109. procedure TestDeclareExternalFunction;
  110. procedure TestTableFieldDefinition;
  111. procedure TestCreateTable;
  112. procedure TestDropFieldOperation;
  113. procedure TestDropConstraintOperation;
  114. procedure TestAlterFieldNameOperation;
  115. procedure TestAlterFieldTypeOperation;
  116. procedure TestAlterFieldPositionOperation;
  117. procedure TestAddFieldOperation;
  118. procedure TestAddConstraintOperation;
  119. procedure TestAlterTable;
  120. procedure TestCreateView;
  121. procedure TestDatabaseFileInfo;
  122. procedure TestCreateDatabase;
  123. procedure TestAlterDatabase;
  124. procedure TestCreateShadow;
  125. procedure TestSuspend;
  126. procedure TestExit;
  127. procedure TestBlock;
  128. procedure TestAssignment;
  129. procedure TestIf;
  130. procedure TestFor;
  131. procedure TestWhile;
  132. Procedure TestWhenSQLError;
  133. Procedure TestWhenGDSError;
  134. Procedure TestWhenException;
  135. Procedure TestWhen;
  136. Procedure TestException;
  137. Procedure TestPostEvent;
  138. Procedure TestTriggerProcedure;
  139. procedure TestCreateProcedure;
  140. procedure TestAlterProcedure;
  141. procedure TestCreateTrigger;
  142. procedure TestAlterTrigger;
  143. Procedure TestDropStatement;
  144. procedure TestConnect;
  145. procedure TestExtract;
  146. procedure TestParamExpression;
  147. Procedure TestGrantTable;
  148. Procedure TestGrantProcedure;
  149. Procedure TestGrantRole;
  150. Procedure TestRevokeTable;
  151. Procedure TestRevokeProcedure;
  152. Procedure TestRevokeRole;
  153. end;
  154. implementation
  155. procedure TTestGenerateSQL.SetUp;
  156. begin
  157. FToFree:=Nil;
  158. end;
  159. procedure TTestGenerateSQL.TearDown;
  160. begin
  161. FreeAndNil(FToFree);
  162. end;
  163. function TTestGenerateSQL.CreateIdentifier(const AName: TSQLStringType
  164. ): TSQLIdentifierName;
  165. begin
  166. Result:=TSQLIdentifierName.Create(Nil);
  167. Result.Name:=AName;
  168. FToFree:=Result;
  169. end;
  170. function TTestGenerateSQL.CreateGrantee(const AName: TSQLStringType;
  171. AClass: TSQLGranteeClass = Nil): TSQLGrantee;
  172. begin
  173. If AClass=Nil then
  174. AClass:=TSQLGrantee;
  175. Result:=AClass.Create(Nil);
  176. Result.Name:=AName;
  177. FToFree:=Result;
  178. end;
  179. procedure TTestGenerateSQL.AssertSQL(const AElement: TSQLElement;
  180. const ASQL: TSQLStringType; AOptions: TSQLFormatOptions = []);
  181. Var
  182. S,S2 : TSQLStringType;
  183. L : TStringList;
  184. I : Integer;
  185. begin
  186. S:=AElement.GetAsSQL(AOptions);
  187. AssertEquals('Correct SQL',ASQL,S);
  188. end;
  189. function TTestGenerateSQL.CreateLiteral(const AValue: Integer
  190. ): TSQLIntegerLiteral;
  191. begin
  192. Result:=TSQLintegerLiteral.Create(Nil);
  193. Result.Value:=AValue;
  194. FToFree:=Result;
  195. end;
  196. function TTestGenerateSQL.CreateLiteral(const AValue: TSQLStringType
  197. ): TSQLStringLiteral;
  198. begin
  199. Result:=TSQLStringLiteral.Create(Nil);
  200. Result.Value:=AValue;
  201. FToFree:=Result;
  202. end;
  203. function TTestGenerateSQL.CreateLiteral(const AValue: Double
  204. ): TSQLFloatLiteral;
  205. begin
  206. Result:=TSQLFloatLiteral.Create(Nil);
  207. Result.Value:=AValue;
  208. FToFree:=Result;
  209. end;
  210. function TTestGenerateSQL.CreateTypeDefinition(const ADataType: TSQLDataType;
  211. ALen: Integer): TSQLTypeDefinition;
  212. begin
  213. Result:=TSQLTypeDefinition.Create(Nil);
  214. Result.DataType:=ADataType;
  215. Result.Len:=ALen;
  216. FToFree:=Result;
  217. end;
  218. function TTestGenerateSQL.CreateLiteralExpression(const ALiteral: TSQLLiteral
  219. ): TSQLLiteralExpression;
  220. begin
  221. Result:=TSQLLiteralExpression.Create(Nil);
  222. FToFree:=Result;
  223. Result.Literal:=ALiteral;
  224. end;
  225. function TTestGenerateSQL.CreateIdentifierExpression(const AName: TSQLStringtype
  226. ): TSQLIdentifierExpression;
  227. begin
  228. Result:=TSQLidentifierExpression.Create(Nil);
  229. Result.Identifier:=CreateIdentifier(AName);
  230. FTofree:=Result;
  231. end;
  232. function TTestGenerateSQL.CreateUnaryExpression(const AOperand: TSQLExpression
  233. ): TSQLUnaryExpression;
  234. begin
  235. Result:=TSQLUnaryExpression.Create(Nil);
  236. Result.Operand:=AOperand;
  237. FTofree:=Result;
  238. end;
  239. function TTestGenerateSQL.CreateBinaryExpression(const ALeft,
  240. ARight: TSQLExpression): TSQLBinaryExpression;
  241. begin
  242. Result:=TSQLBinaryExpression.Create(Nil);
  243. Result.Left:=ALeft;
  244. Result.Right:=ARight;
  245. FToFree:=Result;
  246. end;
  247. function TTestGenerateSQL.CreateUpdatePair(const AField: TSQLStringType;
  248. AValue: TSQLExpression): TSQLUpdatePair;
  249. begin
  250. Result:=TSQLUpdatePair.Create(Nil);
  251. Result.FieldName:=CreateIdentifier(AFIeld);
  252. Result.Value:=AValue;
  253. FTofree:=Result;
  254. end;
  255. function TTestGenerateSQL.CreateTernaryExpression(const ALeft, AMiddle,
  256. ARight: TSQLExpression): TSQLTernaryExpression;
  257. begin
  258. Result:=TSQLTernaryExpression.Create(Nil);
  259. Result.Left:=ALeft;
  260. Result.Middle:=AMiddle;
  261. Result.Right:=ARight;
  262. FToFree:=Result;
  263. end;
  264. function TTestGenerateSQL.CreateForeignKey(const ATable: TSQLStringType;
  265. AFieldName1, AFieldName2: TSQLStringType): TSQLForeignKeyDefinition;
  266. begin
  267. Result:=TSQLForeignKeyDefinition.Create(Nil);
  268. Result.TableName:=CreateIdentifier(ATable);
  269. Result.FieldList.Add(CreateIdentifier(AFieldName1));
  270. If (AFieldName2<>'') then
  271. Result.FieldList.Add(CreateIdentifier(AFieldName2));
  272. FToFree:=Result;
  273. end;
  274. function TTestGenerateSQL.CreateSelectField(const AValue: TSQLExpression;
  275. const AAlias: TSQLStringType): TSQLSelectField;
  276. begin
  277. Result:=TSQLSelectField.Create(Nil);
  278. Result.Expression:=AValue;
  279. If (AAlias<>'') then
  280. Result.AliasName:=CreateIdentifier(AAlias);
  281. FToFree:=Result;
  282. end;
  283. function TTestGenerateSQL.CreateSimpleTableReference(
  284. const ATableName: TSQLStringType; AAlias: TSQLStringType
  285. ): TSQLSimpleTableReference;
  286. begin
  287. Result:=TSQLSimpleTableReference.Create(Nil);
  288. Result.ObjectName:=CreateIdentifier(ATableName);
  289. If AALias<>'' then
  290. Result.AliasName:=CreateIdentifier(AAlias);
  291. FTofree:=Result;
  292. end;
  293. function TTestGenerateSQL.CreateJoinTablereference(const ALeft,
  294. ARight: TSQLTableReference): TSQLJoinTableReference;
  295. begin
  296. Result:=TSQLJoinTableReference.Create(Nil);
  297. Result.Left:=ALeft;
  298. Result.Right:=ARight;
  299. FTofree:=Result;
  300. end;
  301. function TTestGenerateSQL.CreateSelect(AField: TSQLExpression;
  302. ATable: TSQLStringType): TSQLSelectStatement;
  303. begin
  304. Result:=TSQLSelectStatement.Create(Nil);
  305. Result.Fields.Add(AField);
  306. Result.Tables.Add(CreateSimpleTableReference(ATable,''));
  307. FToFree:=Result;
  308. end;
  309. procedure TTestGenerateSQL.TestIdentifier;
  310. Var
  311. E : TSQLElement;
  312. begin
  313. E:=CreateIdentifier('A');
  314. AssertSQL(E,'A',[]);
  315. AssertSQL(E,'"A"',[sfoDoubleQuoteIdentifier]);
  316. AssertSQL(E,'`A`',[sfoBackQuoteIdentifier]);
  317. AssertSQL(E,'''A''',[sfoSingleQuoteIdentifier]);
  318. end;
  319. procedure TTestGenerateSQL.TestIntegerLiteral;
  320. begin
  321. AssertSQL(CreateLiteral(1),'1',[]);
  322. end;
  323. procedure TTestGenerateSQL.TestStringLiteral;
  324. Var
  325. E : TSQLElement;
  326. begin
  327. E:=CreateLiteral('A');
  328. AssertSQL(E,'"A"',[sfoDoubleQuotes]);
  329. AssertSQL(E,'''A''',[]);
  330. end;
  331. procedure TTestGenerateSQL.TestFloatLiteral;
  332. begin
  333. // Needs improvement.
  334. AssertSQL(CreateLiteral(1.2),FloatToStr(1.2));
  335. end;
  336. procedure TTestGenerateSQL.TestNullLiteral;
  337. begin
  338. FToFree:=TSQLNullLiteral.Create(Nil);
  339. AssertSQL(FToFree,'NULL');
  340. AssertSQL(FToFree,'null',[sfoLowerCaseKeyword]);
  341. end;
  342. procedure TTestGenerateSQL.TestUserLiteral;
  343. begin
  344. FToFree:=TSQLUserLiteral.Create(Nil);
  345. AssertSQL(FToFree,'USER');
  346. AssertSQL(FToFree,'user',[sfoLowerCaseKeyword]);
  347. end;
  348. procedure TTestGenerateSQL.TestValueLiteral;
  349. begin
  350. FToFree:=TSQLValueLiteral.Create(Nil);
  351. AssertSQL(FToFree,'VALUE');
  352. AssertSQL(FToFree,'value',[sfoLowerCaseKeyword]);
  353. end;
  354. procedure TTestGenerateSQL.TestLiteralExpression;
  355. Var
  356. E : TSQLStringLiteral;
  357. begin
  358. E:=CreateLiteral('A');
  359. AssertSQL(CreateLiteralExpression(E),E.GetAsSQL([]),[]);
  360. end;
  361. procedure TTestGenerateSQL.TestSelectField;
  362. Var
  363. F : TSQLSelectField;
  364. begin
  365. F:=CreateSelectField(CreateIdentifierExpression('A'),'');
  366. AssertSQL(F,'A');
  367. F.AliasName:=CreateIdentifier('B');
  368. FTofree:=F;
  369. AssertSQL(F,'A AS B');
  370. end;
  371. procedure TTestGenerateSQL.TestSimpleTablereference;
  372. Var
  373. T : TSQLSimpleTablereference;
  374. begin
  375. T:=CreateSimpleTablereference('A','');
  376. AssertSQL(T,'A');
  377. T.AliasName:=CreateIdentifier('B');
  378. AssertSQL(T,'A B');
  379. T.Params:=TSQLElementList.Create(True);
  380. T.Params.Add(CreateIdentifierExpression('C'));
  381. FToFree:=T;
  382. AssertSQL(T,'A(C) B');
  383. T.Params.Add(CreateIdentifierExpression('D'));
  384. FToFree:=T;
  385. AssertSQL(T,'A(C , D) B');
  386. end;
  387. procedure TTestGenerateSQL.TestSimpleSelect;
  388. Var
  389. S : TSQLSelectStatement;
  390. begin
  391. S:=CreateSelect(CreateIdentifierExpression('A'),'B');
  392. AssertSQL(S,'SELECT A FROM B');
  393. end;
  394. procedure TTestGenerateSQL.TestAnyExpression;
  395. Var
  396. A : TSQLAnyExpression;
  397. begin
  398. A:=TSQLAnyExpression.Create(Nil);
  399. A.Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  400. FTofree:=A;
  401. AssertSQL(A,'ANY (SELECT A FROM B)');
  402. end;
  403. procedure TTestGenerateSQL.TestSomeExpression;
  404. Var
  405. A : TSQLSomeExpression;
  406. begin
  407. A:=TSQLSomeExpression.Create(Nil);
  408. A.Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  409. FTofree:=A;
  410. AssertSQL(A,'SOME (SELECT A FROM B)');
  411. end;
  412. procedure TTestGenerateSQL.TestExistsExpression;
  413. Var
  414. A : TSQLExistsExpression;
  415. begin
  416. A:=TSQLExistsExpression.Create(Nil);
  417. A.Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  418. FTofree:=A;
  419. AssertSQL(A,'EXISTS (SELECT A FROM B)');
  420. end;
  421. procedure TTestGenerateSQL.TestAllExpression;
  422. Var
  423. A : TSQLAllExpression;
  424. begin
  425. A:=TSQLAllExpression.Create(Nil);
  426. A.Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  427. FTofree:=A;
  428. AssertSQL(A,'ALL (SELECT A FROM B)');
  429. end;
  430. procedure TTestGenerateSQL.TestSingularExpression;
  431. Var
  432. A : TSQLSingularExpression;
  433. begin
  434. A:=TSQLSingularExpression.Create(Nil);
  435. A.Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  436. FTofree:=A;
  437. AssertSQL(A,'SINGULAR (SELECT A FROM B)');
  438. end;
  439. procedure TTestGenerateSQL.TestUnaryExpression;
  440. Var
  441. U : TSQLUnaryExpression;
  442. begin
  443. U:=CreateUnaryExpression(CreateLiteralExpression(CreateLiteral(1)));
  444. U.Operation:=uoMinus;
  445. AssertSQL(U,'-1');
  446. U.Operation:=uoNot;
  447. AssertSQL(U,'NOT (1)');
  448. end;
  449. procedure TTestGenerateSQL.TestBinaryExpression;
  450. // boIs, boIsNot, boLike, boContaining, boStarting);
  451. Var
  452. B : TSQLBinaryExpression;
  453. begin
  454. B:=CreateBinaryExpression(CreateLiteralExpression(CreateLiteral(1)),CreateLiteralExpression(CreateLiteral(2)));
  455. B.Operation:=boAnd;
  456. AssertSQL(B,'1 AND 2');
  457. AssertSQL(B,'1'+sLineBreak+'AND 2',[sfoOneLogicalPerLine]);
  458. B.Operation:=boOR;
  459. AssertSQL(B,'1 OR 2');
  460. AssertSQL(B,'1'+sLineBreak+'OR 2',[sfoOneLogicalPerLine]);
  461. B.Operation:=boEQ;
  462. AssertSQL(B,'1 = 2');
  463. B.Operation:=boLT;
  464. AssertSQL(B,'1 < 2');
  465. B.Operation:=boGT;
  466. AssertSQL(B,'1 > 2');
  467. B.Operation:=boLE;
  468. AssertSQL(B,'1 <= 2');
  469. B.Operation:=boGE;
  470. AssertSQL(B,'1 >= 2');
  471. B.Operation:=boNE;
  472. AssertSQL(B,'1 <> 2');
  473. B.Operation:=boAdd;
  474. AssertSQL(B,'1 + 2');
  475. B.Operation:=boSubtract;
  476. AssertSQL(B,'1 - 2');
  477. B.Operation:=boMultiply;
  478. AssertSQL(B,'1 * 2');
  479. B.Operation:=boDivide;
  480. AssertSQL(B,'1 / 2');
  481. B.Right.Free;
  482. B.Right:=TSQLSelectExpression.Create(Nil);
  483. TSQLSelectExpression(B.Right).Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  484. FTofree:=B;
  485. B.Operation:=boIn;
  486. AssertSQL(B,'1 IN (SELECT A FROM B)');
  487. B.Operation:=boIS;
  488. B.Right.Free;
  489. B.Right:=CreateLiteralExpression(TSQLNullLiteral.Create(Nil));
  490. FTofree:=B;
  491. AssertSQL(B,'1 IS NULL');
  492. B.Operation:=boISNot;
  493. AssertSQL(B,'1 IS NOT NULL');
  494. B.Right.Free;
  495. B.Right:=CreateLiteralExpression(CreateLiteral('%A%'));
  496. FTofree:=B;
  497. B.Left.Free;
  498. B.Left:=CreateLiteralExpression(CreateLiteral('ADAM'));
  499. FTofree:=B;
  500. B.Operation:=boLike;
  501. AssertSQL(B,'''ADAM'' LIKE ''%A%''');
  502. B.Operation:=boContaining;
  503. AssertSQL(B,'''ADAM'' CONTAINING ''%A%''');
  504. B.Operation:=boStarting;
  505. AssertSQL(B,'''ADAM'' STARTING WITH ''%A%''');
  506. B.Left.Free;
  507. B.Left:=CreateBinaryExpression(CreateLiteralExpression(CreateLiteral(1)),CreateLiteralExpression(CreateLiteral(2)));
  508. TSQLBinaryExpression(B.Left).Operation:=boAdd;
  509. FTofree:=B;
  510. B.Right.Free;
  511. B.Right:=CreateBinaryExpression(CreateLiteralExpression(CreateLiteral(3)),CreateLiteralExpression(CreateLiteral(4)));
  512. FTofree:=B;
  513. TSQLBinaryExpression(B.Right).Operation:=boAdd;
  514. B.Operation:=boLT;
  515. AssertSQL(B,'(1 + 2) < (3 + 4)');
  516. end;
  517. procedure TTestGenerateSQL.TestListExpression;
  518. Var
  519. L:TSQLListExpression;
  520. begin
  521. L:=TSQLListExpression.Create(Nil);
  522. FToFree:=L;
  523. AssertSQL(L,'()');
  524. L.List.Add(CreateLiteralExpression(CreateLiteral(1)));
  525. FToFree:=L;
  526. AssertSQL(L,'(1)');
  527. L.List.Add(CreateLiteralExpression(CreateLiteral(2)));
  528. FToFree:=L;
  529. AssertSQL(L,'(1 , 2)');
  530. AssertSQL(L,'(1, 2)',[sfoListNoSpaceBeforeComma]);
  531. AssertSQL(L,'(1 ,2)',[sfoListNoSpaceAfterComma]);
  532. AssertSQL(L,'(1,2)',[sfoListNoSpaceBeforeComma,sfoListNoSpaceAfterComma]);
  533. end;
  534. procedure TTestGenerateSQL.TestTernaryExpression;
  535. Var
  536. T : TSQLTernaryExpression;
  537. begin
  538. T:=CreateTernaryExpression(CreateLiteralExpression(CreateLiteral(2)),
  539. CreateLiteralExpression(CreateLiteral(1)),
  540. CreateLiteralExpression(CreateLiteral(3)));
  541. T.Operation:=toBetween;
  542. AssertSQL(T,'2 BETWEEN 1 AND 3');
  543. FreeAndNil(FToFree);
  544. T:=CreateTernaryExpression(CreateLiteralExpression(CreateLiteral('A')),
  545. CreateLiteralExpression(CreateLiteral('B')),
  546. CreateLiteralExpression(CreateLiteral('C')));
  547. T.Operation:=toLikeEscape;
  548. AssertSQL(T,'''A'' LIKE ''B'' ESCAPE ''C''');
  549. end;
  550. procedure TTestGenerateSQL.TestGenIDExpression;
  551. Var
  552. G : TSQLGenIDExpression;
  553. begin
  554. G:=TSQLGenIDExpression.Create(Nil);
  555. G.Generator:=self.CreateIdentifier('A');
  556. G.Value:=CreateLiteralExpression(CreateLiteral(1));
  557. FTofree:=G;
  558. AssertSQL(G,'GEN_ID(A,1)');
  559. end;
  560. procedure TTestGenerateSQL.TestFunctionCall;
  561. Var
  562. F : TSQLFunctionCallExpression;
  563. begin
  564. F:=TSQLFunctionCallExpression.Create(Nil);
  565. F.Identifier:='FUNC';
  566. FTofree:=F;
  567. AssertSQL(F,'FUNC()');
  568. F.Arguments:=TSQLElementList.Create(True);
  569. F.Arguments.Add(CreateLiteralExpression(CreateLiteral(1)));
  570. FTofree:=F;
  571. AssertSQL(F,'FUNC(1)');
  572. F.Arguments.Add(CreateLiteralExpression(CreateLiteral(2)));
  573. FTofree:=F;
  574. AssertSQL(F,'FUNC(1 , 2)');
  575. AssertSQL(F,'func(1,2)',[sfoLowerCaseKeyWord,sfoListNoSpaceBeforeComma,sfoListNoSpaceAfterComma]);
  576. end;
  577. procedure TTestGenerateSQL.TestAggregateFunction;
  578. Var
  579. A : TSQLAggregateFunctionExpression;
  580. begin
  581. A:=TSQLAggregateFunctionExpression.Create(Nil);
  582. FToFree:=A;
  583. A.Aggregate:=afCount;
  584. A.Option:=aoAsterisk;
  585. AssertSQL(A,'COUNT(*)');
  586. AssertSQL(A,'count(*)',[sfoLowercaseKeyword]);
  587. A.Option:=aoNone;
  588. A.Expression:=CreateIdentifierExpression('A');
  589. FTofree:=A;
  590. AssertSQL(A,'COUNT(A)');
  591. A.Option:=aoDistinct;
  592. AssertSQL(A,'COUNT(DISTINCT A)');
  593. A.Option:=aoAll;
  594. AssertSQL(A,'COUNT(ALL A)');
  595. A.Aggregate:=afMax;
  596. A.Option:=aoNone;
  597. AssertSQL(A,'MAX(A)');
  598. A.Aggregate:=afMin;
  599. AssertSQL(A,'MIN(A)');
  600. A.Aggregate:=afAVG;
  601. AssertSQL(A,'AVG(A)');
  602. A.Aggregate:=afSUM;
  603. AssertSQL(A,'SUM(A)');
  604. end;
  605. procedure TTestGenerateSQL.TestForeignKey;
  606. Var
  607. K : TSQLForeignKeyDefinition;
  608. begin
  609. K:=CreateForeignKey('A','B','');
  610. FTofree:=K;
  611. AssertSQL(K,'A (B)') ;
  612. K.FieldList.Add(CreateIdentifier('C'));
  613. FTofree:=K;
  614. AssertSQL(K,'A (B , C)');
  615. AssertSQL(K,'A (B,C)',[sfoListNoSpaceBeforeComma,sfoListNoSpaceAfterComma]);
  616. K.OnDelete:=fkaNoAction;
  617. AssertSQL(K,'A (B , C) ON DELETE NO ACTION');
  618. K.OnDelete:=fkaCascade;
  619. AssertSQL(K,'A (B , C) ON DELETE CASCADE');
  620. K.OnDelete:=fkaSetDefault;
  621. AssertSQL(K,'A (B , C) ON DELETE SET DEFAULT');
  622. K.OnDelete:=fkaSetNull;
  623. AssertSQL(K,'A (B , C) ON DELETE SET NULL');
  624. K.OnUpdate:=fkaNoaction;
  625. AssertSQL(K,'A (B , C) ON UPDATE NO ACTION ON DELETE SET NULL');
  626. K.OnUpdate:=fkaCascade;
  627. AssertSQL(K,'A (B , C) ON UPDATE CASCADE ON DELETE SET NULL');
  628. K.OnUpdate:=fkaSetDefault;
  629. AssertSQL(K,'A (B , C) ON UPDATE SET DEFAULT ON DELETE SET NULL');
  630. K.OnUpdate:=fkaSetNull;
  631. AssertSQL(K,'A (B , C) ON UPDATE SET NULL ON DELETE SET NULL');
  632. K.OnDelete:=fkaNone;
  633. AssertSQL(K,'A (B , C) ON UPDATE SET NULL');
  634. end;
  635. procedure TTestGenerateSQL.TestUniqueFieldConstraint;
  636. Var
  637. F : TSQLUniqueFieldConstraint;
  638. begin
  639. F:=TSQLUniqueFieldConstraint.Create(Nil);
  640. FTofree:=F;
  641. AssertSQL(F,'UNIQUE');
  642. F.ConstraintName:=CreateIdentifier('A');
  643. FTofree:=F;
  644. AssertSQL(F,'CONSTRAINT A UNIQUE');
  645. AssertSQL(F,'constraint A unique',[sfoLowercaseKeyWord]);
  646. end;
  647. procedure TTestGenerateSQL.TestPrimaryKeyFieldConstraint;
  648. Var
  649. F : TSQLPrimaryKeyFieldConstraint;
  650. begin
  651. F:=TSQLPrimaryKeyFieldConstraint.Create(Nil);
  652. FTofree:=F;
  653. AssertSQL(F,'PRIMARY KEY');
  654. F.ConstraintName:=CreateIdentifier('A');
  655. FTofree:=F;
  656. AssertSQL(F,'CONSTRAINT A PRIMARY KEY');
  657. AssertSQL(F,'constraint A primary key',[sfoLowercaseKeyWord]);
  658. end;
  659. procedure TTestGenerateSQL.TestForeignKeyFieldConstraint;
  660. Var
  661. F : TSQLForeignKeyFieldConstraint;
  662. begin
  663. F:=TSQLForeignKeyFieldConstraint.Create(Nil);
  664. F.Definition:=CreateForeignKey('B','C','');
  665. FTofree:=F;
  666. AssertSQL(F,'REFERENCES B (C)');
  667. F.ConstraintName:=CreateIdentifier('A');
  668. FTofree:=F;
  669. AssertSQL(F,'CONSTRAINT A REFERENCES B (C)');
  670. AssertSQL(F,'constraint A references B (C)',[sfoLowercaseKeyWord]);
  671. end;
  672. procedure TTestGenerateSQL.TestCheckFieldConstraint;
  673. Var
  674. F : TSQLCheckFieldConstraint;
  675. begin
  676. F:=TSQLCheckFieldConstraint.Create(Nil);
  677. F.Expression:=CreateBinaryExpression(CreateLiteralExpression(TSQLValueLiteral.Create(Nil)),CreateLiteralExpression(CreateLiteral(1)));
  678. TSQLBinaryExpression(F.Expression).Operation:=boGT;
  679. FTofree:=F;
  680. AssertSQL(F,'CHECK (VALUE > 1)');
  681. F.ConstraintName:=CreateIdentifier('A');
  682. FTofree:=F;
  683. AssertSQL(F,'CONSTRAINT A CHECK (VALUE > 1)');
  684. AssertSQL(F,'constraint A check (value > 1)',[sfoLowercaseKeyWord]);
  685. end;
  686. procedure TTestGenerateSQL.TestTableUniqueConstraintDef;
  687. Var
  688. U : TSQLTableUniqueConstraintDef;
  689. begin
  690. U:=TSQLTableUniqueConstraintDef.Create(Nil);
  691. U.FieldList.Add(CreateIdentifier('A'));
  692. FToFree:=U;
  693. AssertSQL(U,'UNIQUE (A)');
  694. U.ConstraintName:=CreateIdentifier('C');
  695. FToFree:=U;
  696. AssertSQL(U,'CONSTRAINT C UNIQUE (A)');
  697. U.FieldList.Add(CreateIdentifier('B'));
  698. FToFree:=U;
  699. AssertSQL(U,'CONSTRAINT C UNIQUE (A , B)');
  700. AssertSQL(U,'constraint C unique (A , B)',[sfoLowercaseKeyWord]);
  701. end;
  702. procedure TTestGenerateSQL.TestTableprimaryKeyConstraintDef;
  703. Var
  704. U : TSQLTablePrimaryKeyConstraintDef;
  705. begin
  706. U:=TSQLTablePrimaryKeyConstraintDef.Create(Nil);
  707. U.FieldList.Add(CreateIdentifier('A'));
  708. FToFree:=U;
  709. AssertSQL(U,'PRIMARY KEY (A)');
  710. U.ConstraintName:=CreateIdentifier('C');
  711. FToFree:=U;
  712. AssertSQL(U,'CONSTRAINT C PRIMARY KEY (A)');
  713. U.FieldList.Add(CreateIdentifier('B'));
  714. FToFree:=U;
  715. AssertSQL(U,'CONSTRAINT C PRIMARY KEY (A , B)');
  716. AssertSQL(U,'constraint C primary key (A , B)',[sfoLowercaseKeyWord]);
  717. end;
  718. procedure TTestGenerateSQL.TestTableForeignKeyConstraintDef;
  719. Var
  720. U : TSQLTableForeignKeyConstraintDef;
  721. begin
  722. U:=TSQLTableForeignKeyConstraintDef.Create(Nil);
  723. U.FieldList.Add(CreateIdentifier('A'));
  724. U.Definition:=CreateForeignKey('D','E','');
  725. FToFree:=U;
  726. AssertSQL(U,'FOREIGN KEY (A) REFERENCES D (E)');
  727. U.ConstraintName:=CreateIdentifier('C');
  728. FToFree:=U;
  729. AssertSQL(U,'CONSTRAINT C FOREIGN KEY (A) REFERENCES D (E)');
  730. U.FieldList.Add(CreateIdentifier('B'));
  731. U.Definition.FieldList.Add(CreateIdentifier('F'));
  732. FToFree:=U;
  733. AssertSQL(U,'CONSTRAINT C FOREIGN KEY (A , B) REFERENCES D (E , F)');
  734. AssertSQL(U,'constraint C foreign key (A,B) references D (E,F)',[sfoLowercaseKeyWord,sfoListNoSpaceBeforeComma,sfoListNoSpaceAfterComma]);
  735. end;
  736. procedure TTestGenerateSQL.TestTableCheckConstraintDef;
  737. Var
  738. F : TSQLTableCheckConstraintDef;
  739. begin
  740. F:=TSQLTableCheckConstraintDef.Create(Nil);
  741. F.Check:=CreateBinaryExpression(CreateIdentifierExpression('A'),CreateLiteralExpression(CreateLiteral(1)));
  742. TSQLBinaryExpression(F.Check).Operation:=boGT;
  743. FTofree:=F;
  744. AssertSQL(F,'CHECK (A > 1)');
  745. F.ConstraintName:=CreateIdentifier('C');
  746. FTofree:=F;
  747. AssertSQL(F,'CONSTRAINT C CHECK (A > 1)');
  748. AssertSQL(F,'constraint C check (A > 1)',[sfoLowercaseKeyWord]);
  749. end;
  750. procedure TTestGenerateSQL.TestTypeDefinition;
  751. Var
  752. T : TSQLTypeDefinition;
  753. begin
  754. T:=CreateTypeDefinition(sdtInteger,0);
  755. AssertSQl(T,'INT');
  756. T.DataType:=sdtSmallInt;
  757. AssertSQl(T,'SMALLINT');
  758. T.DataType:=sdtDoublePrecision;
  759. AssertSQl(T,'DOUBLE PRECISION');
  760. T.DataType:=sdtFloat;
  761. AssertSQl(T,'FLOAT');
  762. T.DataType:=sdtDate;
  763. AssertSQl(T,'DATE');
  764. T.DataType:=sdtDateTime;
  765. AssertSQl(T,'TIMESTAMP');
  766. T.DataType:=sdtTime;
  767. AssertSQl(T,'TIME');
  768. T.DataType:=sdtChar;
  769. T.Len:=5;
  770. AssertSQl(T,'CHAR(5)');
  771. T.DataType:=sdtVarChar;
  772. AssertSQl(T,'VARCHAR(5)');
  773. T.DataType:=sdtNChar;
  774. AssertSQl(T,'NATIONAL CHARACTER(5)');
  775. T.DataType:=sdtNVarChar;
  776. AssertSQl(T,'NATIONAL CHARACTER VARYING(5)');
  777. T.DataType:=sdtDecimal;
  778. T.Scale:=2;
  779. AssertSQl(T,'DECIMAL(5,2)');
  780. T.Scale:=0;
  781. AssertSQl(T,'DECIMAL(5)');
  782. T.DataType:=sdtNumeric;
  783. T.Scale:=2;
  784. AssertSQl(T,'NUMERIC(5,2)');
  785. T.Scale:=0;
  786. AssertSQl(T,'NUMERIC(5)');
  787. T.DataType:=sdtBlob;
  788. AssertSQL(T,'BLOB SUB_TYPE 0 SEGMENT_SIZE 5');
  789. T.Len:=0;
  790. AssertSQL(T,'BLOB SUB_TYPE 0');
  791. T.DataType:=sdtInteger;
  792. T.NotNull:=True;
  793. AssertSQL(T,'INT NOT NULL');
  794. T.DefaultValue:=CreateLiteral(1);
  795. AssertSQL(T,'INT DEFAULT 1 NOT NULL');
  796. T.Check:=CreateBinaryExpression(CreateLiteralExpression(TSQLValueLiteral.Create(Nil)),CreateLiteralExpression(CreateLiteral(1)));
  797. FToFree:=T;
  798. TSQLBinaryExpression(T.Check).Operation:=boGE;
  799. AssertSQL(T,'INT DEFAULT 1 NOT NULL CHECK (VALUE >= 1)');
  800. T.DefaultValue.Free;
  801. T.DefaultValue:=Nil;
  802. AssertSQL(T,'INT NOT NULL CHECK (VALUE >= 1)');
  803. T.Constraint:=TSQLCheckFieldConstraint.Create(Nil);
  804. TSQLCheckFieldConstraint(T.Constraint).Expression:=T.check;
  805. T.Check:=Nil;
  806. AssertSQL(T,'INT NOT NULL CHECK (VALUE >= 1)');
  807. TSQLCheckFieldConstraint(T.Constraint).ConstraintName:=CreateIdentifier('C');
  808. FToFree:=T;
  809. AssertSQL(T,'INT NOT NULL CONSTRAINT C CHECK (VALUE >= 1)');
  810. T.Constraint.Free;
  811. T.Constraint:=Nil;
  812. T.NotNull:=False;
  813. T.DataType:=sdtChar;
  814. T.Len:=50;
  815. T.CharSet:='UTF-8';
  816. AssertSQL(T,'CHAR(50) CHARACTER SET UTF-8');
  817. T.Collation:=TSQLCollation.Create(Nil);
  818. T.Collation.Name:='MyCol';
  819. AssertSQL(T,'CHAR(50) CHARACTER SET UTF-8 COLLATION MYCOL');
  820. end;
  821. procedure TTestGenerateSQL.TestCastExpression;
  822. Var
  823. C : TSQLCastExpression;
  824. begin
  825. C:=TSQLCastExpression.Create(Nil);
  826. FToFree:=C;
  827. C.Value:=CreateLiteralExpression(CreateLiteral(1));
  828. C.NewType:=CreateTypeDefinition(sdtNumeric,5);
  829. C.NewType.Scale:=2;
  830. FToFree:=C;
  831. AssertSQL(C,'CAST(1 AS NUMERIC(5,2))');
  832. end;
  833. procedure TTestGenerateSQL.TestJoinTableReference;
  834. var
  835. J,J2 : TSQLJoinTableReference;
  836. begin
  837. J:=CreateJoinTableReference(CreateSimpleTableReference('A',''),CreateSimpleTableReference('B',''));
  838. J.JoinClause:=CreateBinaryExpression(CreateIdentifierExpression('C'),CreateIdentifierExpression('D'));
  839. TSQLBinaryExpression(J.JoinClause).Operation:=boEQ;
  840. J.JoinType:=jtInner;
  841. FToFree:=J;
  842. AssertSQL(J,'A INNER JOIN B ON (C = D)');
  843. J.JoinType:=jtLeft;
  844. AssertSQL(J,'A LEFT JOIN B ON (C = D)');
  845. J.JoinType:=jtRight;
  846. AssertSQL(J,'A RIGHT JOIN B ON (C = D)');
  847. J.JoinType:=jtFullOuter;
  848. AssertSQL(J,'A FULL OUTER JOIN B ON (C = D)');
  849. AssertSQL(J,'A'+sLinebreak+'FULL OUTER JOIN B ON (C = D)',[sfoOneTablePerLine]);
  850. AssertSQL(J,'A'+sLinebreak+' FULL OUTER JOIN B ON (C = D)',[sfoOneTablePerLine,sfoIndentTables]);
  851. J2:=CreateJoinTableReference(CreateSimpleTableReference('E',''),CreateSimpleTableReference('F',''));
  852. J2.JoinClause:=CreateBinaryExpression(CreateIdentifierExpression('G'),CreateIdentifierExpression('H'));
  853. TSQLBinaryExpression(J2.JoinClause).Operation:=boEQ;
  854. J.Right.Free;
  855. J.Right:=J2;
  856. FTofree:=J;
  857. AssertSQL(J,'A FULL OUTER JOIN (E JOIN F ON (G = H)) ON (C = D)');
  858. AssertSQL(J,'A FULL OUTER JOIN E JOIN F ON (G = H) ON (C = D)',[sfoNoBracketRightJoin]);
  859. J.Right:=J.Left;
  860. J.Left:=J2;
  861. AssertSQL(J,'(E JOIN F ON (G = H)) FULL OUTER JOIN A ON (C = D)',[sfoBracketLeftJoin]);
  862. end;
  863. procedure TTestGenerateSQL.TestPlanNatural;
  864. Var
  865. N : TSQLSelectNaturalPlan;
  866. begin
  867. N:=TSQLSelectNaturalPlan.Create(Nil);
  868. N.TableName:=CreateIdentifier('A');
  869. FToFree:=N;
  870. AssertSQL(N,'A NATURAL');
  871. AssertSQL(N,'A natural',[sfoLowercaseKeyword]);
  872. end;
  873. procedure TTestGenerateSQL.TestPlanIndex;
  874. Var
  875. I : TSQLSelectIndexedPlan;
  876. begin
  877. I:=TSQLSelectIndexedPlan.Create(Nil);
  878. I.TableName:=CreateIdentifier('A');
  879. I.Indexes.Add(CreateIdentifier('B'));
  880. FToFree:=I;
  881. AssertSQL(I,'A INDEX (B)');
  882. AssertSQL(I,'A index (B)',[sfoLowercaseKeyword]);
  883. I.Indexes.Add(CreateIdentifier('C'));
  884. FToFree:=I;
  885. AssertSQL(I,'A INDEX (B,C)',[sfoListNoSpacebeforeComma,sfoListNoSpaceAfterComma]);
  886. end;
  887. procedure TTestGenerateSQL.TestPlanOrder;
  888. Var
  889. I : TSQLSelectOrderedPlan;
  890. begin
  891. I:=TSQLSelectOrderedPlan.Create(Nil);
  892. I.TableName:=CreateIdentifier('A');
  893. I.OrderIndex:=CreateIdentifier('B');
  894. FToFree:=I;
  895. AssertSQL(I,'A ORDER B');
  896. AssertSQL(I,'A order B',[sfoLowercaseKeyword]);
  897. end;
  898. procedure TTestGenerateSQL.TestPlanExpression;
  899. Var
  900. P : TSQLSelectPlanExpr;
  901. N : TSQLSelectNaturalPlan;
  902. I : TSQLSelectIndexedPlan;
  903. begin
  904. P:=TSQLSelectPlanExpr.Create(Nil);
  905. P.JoinType:=pjtJoin;
  906. N:=TSQLSelectNaturalPlan.Create(Nil);
  907. N.TableName:=CreateIdentifier('STATE');
  908. P.Items.Add(N);
  909. I:=TSQLSelectIndexedPlan.Create(Nil);
  910. I.TableName:=CreateIdentifier('CITIES');
  911. I.Indexes.Add(CreateIdentifier('DUPE_CITY'));
  912. P.Items.Add(I);
  913. I:=TSQLSelectIndexedPlan.Create(Nil);
  914. I.TableName:=CreateIdentifier('MAYORS');
  915. I.Indexes.Add(CreateIdentifier('MAYORS_1'));
  916. P.Items.Add(I);
  917. FToFree:=P;
  918. AssertSQL(P,'JOIN (STATE NATURAL , CITIES INDEX (DUPE_CITY) , MAYORS INDEX (MAYORS_1))');
  919. end;
  920. procedure TTestGenerateSQL.TestOrderBy;
  921. Var
  922. O : TSQLOrderByElement;
  923. begin
  924. O:=TSQLOrderByElement.Create(Nil);
  925. FToFree:=O;
  926. O.Field:=CreateLiteral(1);
  927. AssertSQL(O,'1');
  928. AssertSQL(O,'1 ASC',[sfoForceAscending]);
  929. AssertSQL(O,'1 asc',[sfoForceAscending,sfoLowerCaseKeyword]);
  930. O.OrderBy:=obDescending;
  931. O.Field.free;
  932. O.Field:=CreateIdentifier('A');
  933. AssertSQL(O,'A desc',[sfoForceAscending,sfoLowerCaseKeyword]);
  934. AssertSQL(O,'A DESC',[sfoForceAscending]);
  935. AssertSQL(O,'A DESC');
  936. O.Collation:=CreateIdentifier('UTF8');
  937. AssertSQL(O,'A DESC UTF8');
  938. end;
  939. procedure TTestGenerateSQL.TestSelect;
  940. Var
  941. S : TSQLSelectStatement;
  942. begin
  943. S:=CreateSelect(CreateIdentifierExpression('A'),'B');
  944. AssertSQL(S,'SELECT A FROM B');
  945. AssertSQL(S,'SELECT'+sLineBreak+'A'+sLineBreak+'FROM B',[sfoOneFieldPerLine]);
  946. AssertSQL(S,'SELECT'+sLineBreak+' A'+sLineBreak+'FROM B',[sfoOneFieldPerLine,sfoIndentFields]);
  947. AssertSQL(S,'SELECT A FROM'+SlineBreak+'B',[sfoOneTablePerLine]);
  948. AssertSQL(S,'SELECT A FROM'+SlineBreak+' B',[sfoOneTablePerLine,sfoIndentTables]);
  949. AssertSQL(S,'SELECT'+sLineBreak+'A'+sLineBreak+'FROM'+sLineBreak+'B',[sfoOneFieldPerLine,sfoOneTablePerLine]);
  950. S.Where:=CreateBinaryExpression(CreateIdentifierExpression('C'),CreateIdentifierExpression('D'));
  951. TSQLBinaryExpression(S.Where).Operation:=boEQ;
  952. AssertSQL(S,'SELECT A FROM B WHERE C = D');
  953. AssertSQL(S,'SELECT A FROM B WHERE'+sLineBreak+'C = D',[sfoWhereOnSeparateLine]);
  954. AssertSQL(S,'SELECT A FROM B WHERE'+sLineBreak+' C = D',[sfoWhereOnSeparateLine,sfoIndentwhere]);
  955. AssertSQL(S,'SELECT A FROM'+sLineBreak+'B'+sLineBreak+'WHERE'+sLineBreak+' C = D',[sfoOneTablePerLine,sfoWhereOnSeparateLine,sfoIndentwhere]);
  956. AssertSQL(S,'SELECT A FROM'+sLineBreak+'B'+sLineBreak+'WHERE'+sLineBreak+' C = D',[sfoOneTablePerLine,sfoWhereOnSeparateLine,sfoIndentwhere]);
  957. S.GroupBy.Add(CreateIdentifier('A'));
  958. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A');
  959. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY'+sLineBreak+'A',[sfoOneGroupbyFieldPerLine]);
  960. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY'+sLineBreak+' A',[sfoOneGroupbyFieldPerLine,sfoIndentGroupByFields]);
  961. AssertSQL(S,'SELECT A FROM B WHERE'+sLineBreak+'C = D'+sLineBreak+'GROUP BY'+sLineBreak+' A',[sfoWhereOnSeparateLine,sfoOneGroupbyFieldPerLine,sfoIndentGroupByFields]);
  962. S.OrderBy.Add(CreateIdentifier('E'));
  963. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A ORDER BY E');
  964. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A ORDER BY'+sLineBreak+'E',[sfoOneOrderbyFieldPerLine]);
  965. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY'+sLineBreak+'A'+sLineBreak+'ORDER BY'+sLineBreak+' E',[sfoOneGroupbyFieldPerLine,sfoOneOrderbyFieldPerLine,sfoIndentOrderByFields]);
  966. S.Having:=CreateBinaryExpression(CreateIdentifierExpression('F'),CreateIdentifierExpression('G'));
  967. TSQLBinaryExpression(S.Having).Operation:=boGT;
  968. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING F > G ORDER BY E');
  969. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING'+sLineBreak+'F > G'+sLineBreak+'ORDER BY E',[sfoHavingOnSeparateLine]);
  970. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING'+sLineBreak+' F > G'+sLineBreak+'ORDER BY E',[sfoHavingOnSeparateLine,sfoIndentHaving]);
  971. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY'+sLineBreak+'A'+sLineBreak+'HAVING'+sLineBreak+'F > G'+sLineBreak+'ORDER BY E',[sfoOneGroupbyFieldPerLine,sfoHavingOnSeparateLine]);
  972. S.Union:=CreateSelect(CreateIdentifierExpression('H'),'I');
  973. S.OrderBy.Delete(0);
  974. S.OrderBy.Add(CreateLiteral(1));
  975. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING F > G UNION SELECT H FROM I ORDER BY 1');
  976. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING F > G'+sLineBreak+'UNION'+sLineBreak+'SELECT H FROM I'+sLineBreak+'ORDER BY 1',[sfoUnionOnSeparateLine]);
  977. S.Union.Free;
  978. S.Union:=Nil;
  979. FToFree:=S;
  980. S.Plan:=TSQLSelectNaturalPlan.Create(Nil);
  981. TSQLSelectNaturalPlan(S.PLan).TableName:=CreateIdentifier('B');
  982. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING F > G PLAN B NATURAL ORDER BY 1');
  983. AssertSQL(S,'SELECT A FROM B WHERE C = D GROUP BY A HAVING F > G'+sLineBreak+'PLAN'+sLineBreak+'B NATURAL'+sLineBreak+'ORDER BY 1',[sfoPlanOnSeparateLine]);
  984. end;
  985. procedure TTestGenerateSQL.TestInsert;
  986. Var
  987. I : TSQLInsertStatement;
  988. begin
  989. I:=TSQLInsertStatement.Create(Nil);
  990. I.TableName:=CreateIdentifier('A');
  991. FToFree:=I;
  992. I.Values:=TSQLelementList.Create(True);
  993. I.Values.Add(CreateLiteral('B'));
  994. AssertSQL(I,'INSERT INTO A VALUES (''B'')');
  995. I.Fields:=TSQLelementList.Create(True);
  996. I.Fields.Add(CreateIdentifier('C'));
  997. AssertSQL(I,'INSERT INTO A (C) VALUES (''B'')');
  998. AssertSQL(I,'INSERT INTO A'+sLineBreak+'(C)'+sLineBreak+'VALUES'+sLineBreak+'(''B'')',[sfoOneFieldPerLine]);
  999. I.Fields.Add(CreateIdentifier('D'));
  1000. I.Values.Add(CreateLiteral('E'));
  1001. AssertSQL(I,'INSERT INTO A (C, D) VALUES (''B'', ''E'')');
  1002. AssertSQL(I,'INSERT INTO A'+sLineBreak+'(C,'+sLineBreak+'D)'+sLineBreak+'VALUES'+sLineBreak+'(''B'','+sLineBreak+'''E'')',[sfoOneFieldPerLine]);
  1003. AssertSQL(I,'INSERT INTO A'+sLineBreak+' (C,'+sLineBreak+' D)'+sLineBreak+'VALUES'+sLineBreak+' (''B'','+sLineBreak+' ''E'')',[sfoOneFieldPerLine,sfoIndentFields]);
  1004. I.Select:=CreateSelect(CreateIdentifierExpression('E'),'G');
  1005. I.Select.Fields.Add(CreateIdentifierExpression('F'));
  1006. AssertSQL(I,'INSERT INTO A (C, D) SELECT E, F FROM G');
  1007. end;
  1008. procedure TTestGenerateSQL.TestUpdatePair;
  1009. Var
  1010. P : TSQLUpdatePair;
  1011. begin
  1012. P:=CreateUpdatePair('A',CreateLiteralExpression(CreateLiteral(1)));
  1013. AssertSQl(P,'A = 1');
  1014. end;
  1015. procedure TTestGenerateSQL.TestUpdate;
  1016. Var
  1017. U : TSQLUpdateStatement;
  1018. P : TSQLUpdatePair;
  1019. begin
  1020. P:=CreateUpdatePair('A',CreateLiteralExpression(CreateLiteral(1)));
  1021. U:=TSQLUpdateStatement.Create(Nil);
  1022. U.TableName:=CreateIdentifier('B');
  1023. U.Values.Add(P);
  1024. FTofree:=U;
  1025. AssertSQL(U,'UPDATE B SET A = 1');
  1026. AssertSQL(U,'UPDATE B SET'+sLineBreak+'A = 1',[sfoOneFieldPerLine]);
  1027. AssertSQL(U,'UPDATE B SET'+sLineBreak+' A = 1',[sfoOneFieldPerLine,sfoIndentFields]);
  1028. P:=CreateUpdatePair('C',CreateLiteralExpression(CreateLiteral(2)));
  1029. U.Values.Add(P);
  1030. FTofree:=U;
  1031. AssertSQL(U,'UPDATE B SET A = 1, C = 2');
  1032. AssertSQL(U,'UPDATE B SET'+sLineBreak+'A = 1,'+sLineBreak+'C = 2',[sfoOneFieldPerLine]);
  1033. AssertSQL(U,'UPDATE B SET'+sLineBreak+' A = 1,'+sLineBreak+' C = 2',[sfoOneFieldPerLine,sfoIndentFields]);
  1034. U.WhereClause:=CreateBinaryExpression(CreateIdentifierExpression('A'),CreateLiteralExpression(CreateLiteral(1)));
  1035. TSQLBinaryExpression(U.WhereClause).Operation:=boGT;
  1036. AssertSQL(U,'UPDATE B SET A = 1, C = 2 WHERE A > 1');
  1037. AssertSQL(U,'UPDATE B SET'+sLineBreak+' A = 1,'+sLineBreak+' C = 2'+sLineBreak+'WHERE A > 1',[sfoOneFieldPerLine,sfoIndentFields]);
  1038. AssertSQL(U,'UPDATE B SET A = 1, C = 2'+sLineBreak+'WHERE'+sLineBreak+'A > 1',[sfoWhereOnSeparateLine]);
  1039. AssertSQL(U,'UPDATE B SET A = 1, C = 2'+sLineBreak+'WHERE'+sLineBreak+' A > 1',[sfoWhereOnSeparateLine,sfoIndentWhere]);
  1040. end;
  1041. procedure TTestGenerateSQL.TestDelete;
  1042. Var
  1043. D : TSQLDeleteStatement;
  1044. begin
  1045. D:=TSQLDeleteStatement.Create(Nil);
  1046. D.TableName:=CreateIdentifier('A');
  1047. FToFree:=D;
  1048. AssertSQL(D,'DELETE FROM A');
  1049. D.WhereClause:=CreateBinaryExpression(CreateIdentifierExpression('B'),CreateLiteralExpression(CreateLiteral(1)));
  1050. TSQLBinaryExpression(D.WhereClause).Operation:=boGT;
  1051. FToFree:=D;
  1052. AssertSQL(D,'DELETE FROM A WHERE B > 1');
  1053. AssertSQL(D,'DELETE FROM A'+sLineBreak+'WHERE'+sLineBreak+'B > 1',[sfoWhereOnSeparateLine]);
  1054. AssertSQL(D,'DELETE FROM A'+sLineBreak+'WHERE'+sLineBreak+' B > 1',[sfoWhereOnSeparateLine,sfoIndentWhere]);
  1055. end;
  1056. procedure TTestGenerateSQL.TestRollback;
  1057. Var
  1058. R : TSQLRollBackStatement;
  1059. begin
  1060. R:=TSQLRollBackStatement.Create(Nil);
  1061. FTofree:=R;
  1062. AssertSQL(R,'ROLLBACK');
  1063. R.TransactionName:=CreateIdentifier('A');
  1064. FTofree:=R;
  1065. AssertSQL(R,'ROLLBACK TRANSACTION A');
  1066. R.Work:=True;
  1067. AssertSQL(R,'ROLLBACK TRANSACTION A WORK');
  1068. R.Release:=True;
  1069. AssertSQL(R,'ROLLBACK TRANSACTION A WORK RELEASE');
  1070. end;
  1071. procedure TTestGenerateSQL.TestCommit;
  1072. Var
  1073. C : TSQLCommitStatement;
  1074. begin
  1075. C:=TSQLCommitStatement.Create(Nil);
  1076. FTofree:=C;
  1077. AssertSQL(C,'COMMIT');
  1078. C.TransactionName:=CreateIdentifier('A');
  1079. FTofree:=C;
  1080. AssertSQL(C,'COMMIT TRANSACTION A');
  1081. C.Work:=True;
  1082. AssertSQL(C,'COMMIT TRANSACTION A WORK');
  1083. C.Release:=True;
  1084. AssertSQL(C,'COMMIT TRANSACTION A WORK RELEASE');
  1085. C.Release:=False;
  1086. C.Retain:=True;
  1087. AssertSQL(C,'COMMIT TRANSACTION A WORK RETAIN');
  1088. end;
  1089. procedure TTestGenerateSQL.TestExecuteProcedure;
  1090. Var
  1091. E : TSQLExecuteProcedureStatement;
  1092. begin
  1093. E:=TSQLExecuteProcedureStatement.Create(Nil);
  1094. E.ProcedureName:=CreateIdentifier('A');
  1095. FTofree:=E;
  1096. AssertSQL(E,'EXECUTE PROCEDURE A');
  1097. E.Params.Add(CreateLiteralExpression(CreateLiteral(1)));
  1098. FTofree:=E;
  1099. AssertSQL(E,'EXECUTE PROCEDURE A(1)');
  1100. E.Params.Add(CreateLiteralExpression(CreateLiteral(2)));
  1101. FTofree:=E;
  1102. AssertSQL(E,'EXECUTE PROCEDURE A(1 , 2)');
  1103. E.Returning.Add(CreateIdentifier('B'));
  1104. FTofree:=E;
  1105. AssertSQL(E,'EXECUTE PROCEDURE A(1 , 2) RETURNING_VALUES :B');
  1106. end;
  1107. procedure TTestGenerateSQL.TestCreateGenerator;
  1108. Var
  1109. G : TSQLCreateGeneratorStatement;
  1110. begin
  1111. G:=TSQLCreateGeneratorStatement.Create(Nil);
  1112. G.ObjectName:=CreateIdentifier('A');
  1113. FToFree:=G;
  1114. AssertSQL(G,'CREATE GENERATOR A');
  1115. end;
  1116. procedure TTestGenerateSQL.TestCreateRole;
  1117. Var
  1118. R : TSQLCreateRoleStatement;
  1119. begin
  1120. R:=TSQLCreateRoleStatement.Create(Nil);
  1121. R.ObjectName:=CreateIdentifier('A');
  1122. FToFree:=R;
  1123. AssertSQL(R,'CREATE ROLE A');
  1124. end;
  1125. procedure TTestGenerateSQL.TestCreateDomain;
  1126. Var
  1127. D : TSQLCreateDomainStatement;
  1128. begin
  1129. D:=TSQLCreateDomainStatement.Create(Nil);
  1130. D.ObjectName:=CreateIdentifier('A');
  1131. D.TypeDefinition:=CreateTypeDefinition(sdtInteger,0);
  1132. D.TypeDefinition.NotNull:=True;
  1133. FToFree:=D;
  1134. AssertSQL(D,'CREATE DOMAIN A INT NOT NULL');
  1135. end;
  1136. procedure TTestGenerateSQL.TestAlterDomainDropDefault;
  1137. Var
  1138. A : TSQLAlterDomainDropDefaultStatement;
  1139. begin
  1140. A:=TSQLAlterDomainDropDefaultStatement.Create(Nil);
  1141. A.Objectname:=CreateIdentifier('A');
  1142. FToFree:=A;
  1143. AssertSQL(A,'ALTER DOMAIN A DROP DEFAULT');
  1144. end;
  1145. procedure TTestGenerateSQL.TestAlterDomainDropCheck;
  1146. Var
  1147. A : TSQLAlterDomainDropCheckStatement;
  1148. begin
  1149. A:=TSQLAlterDomainDropCheckStatement.Create(Nil);
  1150. A.Objectname:=CreateIdentifier('A');
  1151. FToFree:=A;
  1152. AssertSQL(A,'ALTER DOMAIN A DROP CHECK');
  1153. end;
  1154. procedure TTestGenerateSQL.TestAlterDomainSetDefault;
  1155. Var
  1156. A : TSQLAlterDomainSetDefaultStatement;
  1157. begin
  1158. A:=TSQLAlterDomainSetDefaultStatement.Create(Nil);
  1159. A.Objectname:=CreateIdentifier('A');
  1160. A.DefaultValue:=TSQLNullLiteral.Create(Nil);
  1161. FToFree:=A;
  1162. AssertSQL(A,'ALTER DOMAIN A SET DEFAULT NULL');
  1163. end;
  1164. procedure TTestGenerateSQL.TestAlterDomainRename;
  1165. Var
  1166. A : TSQLAlterDomainRenameStatement;
  1167. begin
  1168. A:=TSQLAlterDomainRenameStatement.Create(Nil);
  1169. A.Objectname:=CreateIdentifier('A');
  1170. A.NewName:=CreateIdentifier('B');
  1171. FToFree:=A;
  1172. AssertSQL(A,'ALTER DOMAIN A B');
  1173. end;
  1174. procedure TTestGenerateSQL.TestAlterDomainNewType;
  1175. Var
  1176. A : TSQLAlterDomainTypeStatement;
  1177. begin
  1178. A:=TSQLAlterDomainTypeStatement.Create(Nil);
  1179. A.Objectname:=CreateIdentifier('A');
  1180. A.NewType:=CreateTypeDefinition(sdtVarChar,5);
  1181. FToFree:=A;
  1182. AssertSQL(A,'ALTER DOMAIN A TYPE VARCHAR(5)');
  1183. end;
  1184. procedure TTestGenerateSQL.TestAlterDomainAddCheck;
  1185. Var
  1186. A : TSQLAlterDomainAddCheckStatement;
  1187. begin
  1188. A:=TSQLAlterDomainAddCheckStatement.Create(Nil);
  1189. A.Objectname:=CreateIdentifier('A');
  1190. A.Check:=CreateBinaryExpression(CreateLiteralExpression(TSQLValueLiteral.Create(Nil)),CreateLiteralExpression(CreateLiteral(1)));
  1191. TSQLBinaryExpression(A.Check).Operation:=boGT;
  1192. FToFree:=A;
  1193. AssertSQL(A,'ALTER DOMAIN A ADD CHECK VALUE > 1');
  1194. end;
  1195. procedure TTestGenerateSQL.TestCreateException;
  1196. Var
  1197. C : TSQLCreateExceptionStatement;
  1198. begin
  1199. C:=TSQLCreateExceptionStatement.Create(Nil);
  1200. C.ObjectName:=CreateIdentifier('A');
  1201. C.ExceptionMessage:=CreateLiteral('B');
  1202. FToFree:=C;
  1203. AssertSQL(C,'CREATE EXCEPTION A ''B''');
  1204. end;
  1205. procedure TTestGenerateSQL.TestAlterException;
  1206. Var
  1207. C : TSQLAlterExceptionStatement;
  1208. begin
  1209. C:=TSQLAlterExceptionStatement.Create(Nil);
  1210. C.ObjectName:=CreateIdentifier('A');
  1211. C.ExceptionMessage:=CreateLiteral('B');
  1212. FToFree:=C;
  1213. AssertSQL(C,'ALTER EXCEPTION A ''B''');
  1214. end;
  1215. procedure TTestGenerateSQL.TestCreateIndex;
  1216. Var
  1217. I : TSQLCreateIndexStatement;
  1218. begin
  1219. I:=TSQLCreateIndexStatement.Create(Nil);
  1220. I.ObjectName:=CreateIdentifier('A');
  1221. I.TableName:=CreateIdentifier('B');
  1222. I.FieldNames.Add(CreateIdentifier('C'));
  1223. FTofree:=I;
  1224. AssertSQL(I,'CREATE INDEX A ON B (C)');
  1225. I.FieldNames.Add(CreateIdentifier('D'));
  1226. FTofree:=I;
  1227. AssertSQL(I,'CREATE INDEX A ON B (C , D)');
  1228. I.Options:=[ioUnique];
  1229. AssertSQL(I,'CREATE UNIQUE INDEX A ON B (C , D)');
  1230. I.Options:=[ioAscending];
  1231. AssertSQL(I,'CREATE ASCENDING INDEX A ON B (C , D)');
  1232. I.Options:=[ioUnique,ioDescending];
  1233. AssertSQL(I,'CREATE UNIQUE DESCENDING INDEX A ON B (C , D)');
  1234. I.Options:=[ioUnique,ioAscending,ioDescending];
  1235. AssertSQL(I,'CREATE UNIQUE ASCENDING INDEX A ON B (C , D)');
  1236. I.Options:=[ioDescending];
  1237. AssertSQL(I,'CREATE DESCENDING INDEX A ON B (C , D)');
  1238. end;
  1239. procedure TTestGenerateSQL.TestAlterIndex;
  1240. Var
  1241. I : TSQLAlterIndexStatement;
  1242. begin
  1243. I:=TSQLAlterIndexStatement.Create(Nil);
  1244. I.ObjectName:=CreateIdentifier('A');
  1245. FTofree:=I;
  1246. AssertSQL(I,'ALTER INDEX A ACTIVE');
  1247. I.Inactive:=True;
  1248. AssertSQL(I,'ALTER INDEX A INACTIVE');
  1249. end;
  1250. procedure TTestGenerateSQL.TestDeclareExternalFunction;
  1251. Var
  1252. F : TSQLDeclareExternalFunctionStatement;
  1253. begin
  1254. F:=TSQLDeclareExternalFunctionStatement.Create(Nil);
  1255. F.ObjectName:=CreateIdentifier('A');
  1256. F.ReturnType:=CreateTypeDefinition(sdtChar,5);
  1257. F.EntryPoint:='B';
  1258. F.ModuleName:='C';
  1259. FToFree:=F;
  1260. AssertSQL(F,'DECLARE EXTERNAL FUNCTION A RETURNS CHAR(5) ENTRY_POINT ''B'' MODULE_NAME ''C''');
  1261. F.Arguments.Add(CreateTypeDefinition(sdtChar,10));
  1262. AssertSQL(F,'DECLARE EXTERNAL FUNCTION A CHAR(10) RETURNS CHAR(5) ENTRY_POINT ''B'' MODULE_NAME ''C''');
  1263. F.Arguments.Add(CreateTypeDefinition(sdtInteger,0));
  1264. AssertSQL(F,'DECLARE EXTERNAL FUNCTION A CHAR(10) , INT RETURNS CHAR(5) ENTRY_POINT ''B'' MODULE_NAME ''C''');
  1265. AssertSQL(F,'DECLARE EXTERNAL FUNCTION A'+sLineBreak+
  1266. ' CHAR(10) , INT'+sLineBreak+
  1267. ' RETURNS CHAR(5)'+sLineBreak+
  1268. ' ENTRY_POINT ''B'''+sLineBreak+
  1269. ' MODULE_NAME ''C''',[sfoMultilineDeclareFunction]);
  1270. end;
  1271. procedure TTestGenerateSQL.TestTableFieldDefinition;
  1272. Var
  1273. F : TSQLTableFieldDef;
  1274. begin
  1275. F:=TSQLTableFieldDef.Create(Nil);
  1276. F.FieldName:=CreateIdentifier('A');
  1277. F.FieldType:=CreateTypeDefinition(sdtInteger,0);
  1278. FTofree:=F;
  1279. AssertSQL(F,'A INT');
  1280. F.FieldType.Free;
  1281. F.FieldType:=Nil;
  1282. F.ComputedBy:=CreateBinaryExpression(CreateIdentifierExpression('B'),CreateLiteralExpression(CreateLiteral(1)));
  1283. TSQLBinaryExpression(F.ComputedBy).Operation:=boAdd;
  1284. FTofree:=F;
  1285. AssertSQL(F,'A COMPUTED BY B + 1');
  1286. end;
  1287. procedure TTestGenerateSQL.TestCreateTable;
  1288. Var
  1289. T : TSQLCreateTableStatement;
  1290. F : TSQLTableFieldDef;
  1291. U : TSQLTableUniqueConstraintDef;
  1292. begin
  1293. F:=TSQLTableFieldDef.Create(Nil);
  1294. F.FieldName:=CreateIdentifier('B');
  1295. F.FieldType:=CreateTypeDefinition(sdtInteger,0);
  1296. T:=TSQLCreateTableStatement.Create(Nil);
  1297. T.ObjectName:=CreateIdentifier('A');
  1298. FTofree:=T;
  1299. T.FieldDefs.Add(F);
  1300. AssertSQL(T,'CREATE TABLE A (B INT)');
  1301. T.ExternalFileName:=CreateLiteral('/my/file');
  1302. AssertSQL(T,'CREATE TABLE A EXTERNAL FILE ''/my/file'' (B INT)');
  1303. T.ExternalFileName.Free;
  1304. T.ExternalFileName:=Nil;
  1305. F:=TSQLTableFieldDef.Create(Nil);
  1306. F.FieldName:=CreateIdentifier('C');
  1307. F.FieldType:=CreateTypeDefinition(sdtChar,5);
  1308. T.FieldDefs.Add(F);
  1309. FTofree:=T;
  1310. AssertSQL(T,'CREATE TABLE A (B INT, C CHAR(5))');
  1311. AssertSQL(T,'CREATE TABLE A ('+sLineBreak+'B INT,'+sLineBreak+'C CHAR(5))',[sfoOneFieldPerLine]);
  1312. AssertSQL(T,'CREATE TABLE A ('+sLineBreak+' B INT,'+sLineBreak+' C CHAR(5))',[sfoOneFieldPerLine,sfoIndentFields]);
  1313. U:=TSQLTableUniqueConstraintDef.Create(Nil);
  1314. U.FieldList.Add(CreateIdentifier('B'));
  1315. T.Constraints.Add(U);
  1316. FTofree:=T;
  1317. AssertSQL(T,'CREATE TABLE A (B INT, C CHAR(5), UNIQUE (B))');
  1318. AssertSQL(T,'CREATE TABLE A ('+sLineBreak+'B INT,'+sLineBreak+'C CHAR(5),'+sLineBreak+'UNIQUE (B))',[sfoOneFieldPerLine]);
  1319. AssertSQL(T,'CREATE TABLE A ('+sLineBreak+' B INT,'+sLineBreak+' C CHAR(5),'+sLineBreak+' UNIQUE (B))',[sfoOneFieldPerLine,sfoIndentFields]);
  1320. U.ConstraintName:=CreateIdentifier('U_A');
  1321. FTofree:=T;
  1322. AssertSQL(T,'CREATE TABLE A (B INT, C CHAR(5), CONSTRAINT U_A UNIQUE (B))');
  1323. end;
  1324. procedure TTestGenerateSQL.TestDropFieldOperation;
  1325. Var
  1326. O : TSQLDropTableFieldOperation;
  1327. begin
  1328. O:=TSQLDropTableFieldOperation.Create(Nil);
  1329. O.ObjectName:=CreateIdentifier('A');
  1330. FTofree:=O;
  1331. AssertSQL(O,'DROP A');
  1332. end;
  1333. procedure TTestGenerateSQL.TestDropConstraintOperation;
  1334. Var
  1335. O : TSQLDropTableConstraintOperation;
  1336. begin
  1337. O:=TSQLDropTableConstraintOperation.Create(Nil);
  1338. O.ObjectName:=CreateIdentifier('A');
  1339. FTofree:=O;
  1340. AssertSQL(O,'DROP CONSTRAINT A');
  1341. end;
  1342. procedure TTestGenerateSQL.TestAlterFieldNameOperation;
  1343. Var
  1344. O : TSQLAlterTableFieldNameOperation;
  1345. begin
  1346. O:=TSQLAlterTableFieldNameOperation.Create(Nil);
  1347. O.ObjectName:=CreateIdentifier('A');
  1348. O.NewName:=CreateIdentifier('B');
  1349. FTofree:=O;
  1350. ASSERTSQl(O,'ALTER COLUMN A TO B');
  1351. end;
  1352. procedure TTestGenerateSQL.TestAlterFieldTypeOperation;
  1353. Var
  1354. O : TSQLAlterTableFieldTypeOperation;
  1355. begin
  1356. O:=TSQLAlterTableFieldTypeOperation.Create(Nil);
  1357. O.ObjectName:=CreateIdentifier('A');
  1358. O.NewType:=CreateTypeDefinition(sdtInteger,0);
  1359. FTofree:=O;
  1360. ASSERTSQl(O,'ALTER COLUMN A TYPE INT');
  1361. end;
  1362. procedure TTestGenerateSQL.TestAlterFieldPositionOperation;
  1363. Var
  1364. O : TSQLAlterTableFieldPositionOperation;
  1365. begin
  1366. O:=TSQLAlterTableFieldPositionOperation.Create(Nil);
  1367. O.ObjectName:=CreateIdentifier('A');
  1368. O.NewPosition:=2;
  1369. FTofree:=O;
  1370. ASSERTSQl(O,'ALTER COLUMN A POSITION 2');
  1371. end;
  1372. procedure TTestGenerateSQL.TestAddFieldOperation;
  1373. Var
  1374. O : TSQLAlterTableAddFieldOperation;
  1375. F : TSQLTableFieldDef;
  1376. begin
  1377. F:=TSQLTableFieldDef.Create(Nil);
  1378. FTofree:=F;
  1379. F.FieldName:=CreateIdentifier('C');
  1380. F.FieldType:=CreateTypeDefinition(sdtChar,5);
  1381. O:=TSQLAlterTableAddFieldOperation.Create(Nil);
  1382. FTofree:=O;
  1383. O.Element:=F;
  1384. AssertSQL(O,'ADD C CHAR(5)');
  1385. end;
  1386. procedure TTestGenerateSQL.TestAddConstraintOperation;
  1387. Var
  1388. O : TSQLAlterTableAddConstraintOperation;
  1389. C : TSQLTableUniqueConstraintDef;
  1390. begin
  1391. C:=TSQLTableUniqueConstraintDef.Create(Nil);
  1392. FTofree:=C;
  1393. C.FieldList.Add(CreateIdentifier('C'));
  1394. O:=TSQLAlterTableAddConstraintOperation.Create(Nil);
  1395. FTofree:=O;
  1396. O.Element:=C;
  1397. AssertSQL(O,'ADD CONSTRAINT UNIQUE (C)');
  1398. C.ConstraintName:=CreateIdentifier('D');
  1399. AssertSQL(O,'ADD CONSTRAINT D UNIQUE (C)');
  1400. end;
  1401. procedure TTestGenerateSQL.TestAlterTable;
  1402. Var
  1403. A : TSQLAlterTableStatement;
  1404. DF : TSQLDropTableFieldOperation;
  1405. AC : TSQLAlterTableAddConstraintOperation;
  1406. C : TSQLTableUniqueConstraintDef;
  1407. begin
  1408. A:=TSQLAlterTableStatement.Create(Nil);
  1409. A.ObjectName:=CreateIdentifier('A');
  1410. DF:=TSQLDropTableFieldOperation.Create(Nil);
  1411. DF.ObjectName:=CreateIdentifier('B');
  1412. A.Operations.Add(DF);
  1413. FTofree:=A;
  1414. AssertSQL(A,'ALTER TABLE A DROP B');
  1415. AssertSQL(A,'ALTER TABLE A'+sLineBreak+'DROP B',[sfoOneFieldPerLine]);
  1416. AssertSQL(A,'ALTER TABLE A'+sLineBreak+' DROP B',[sfoOneFieldPerLine,sfoIndentFields]);
  1417. C:=TSQLTableUniqueConstraintDef.Create(Nil);
  1418. FTofree:=C;
  1419. C.FieldList.Add(CreateIdentifier('C'));
  1420. AC:=TSQLAlterTableAddConstraintOperation.Create(Nil);
  1421. AC.Element:=C;
  1422. A.Operations.Add(AC);
  1423. FTofree:=A;
  1424. AssertSQL(A,'ALTER TABLE A DROP B, ADD CONSTRAINT UNIQUE (C)');
  1425. end;
  1426. procedure TTestGenerateSQL.TestCreateView;
  1427. Var
  1428. V : TSQLCreateViewStatement;
  1429. begin
  1430. V:=TSQLCreateViewStatement.Create(Nil);
  1431. V.ObjectName:=CreateIdentifier('A');
  1432. V.Select:=CreateSelect(CreateIdentifierExpression('B'),'C');
  1433. FToFree:=V;
  1434. AssertSQL(V,'CREATE VIEW A AS SELECT B FROM C');
  1435. V.Fields.Add(CreateIdentifier('D'));
  1436. FToFree:=V;
  1437. AssertSQL(V,'CREATE VIEW A (D) AS SELECT B FROM C');
  1438. end;
  1439. procedure TTestGenerateSQL.TestDatabaseFileInfo;
  1440. Var
  1441. F : TSQLDatabaseFileInfo;
  1442. begin
  1443. F:=TSQLDatabaseFileInfo.Create(Nil);
  1444. F.FileName:='/my/file';
  1445. FTofree:=F;
  1446. AssertSQL(F,'FILE ''/my/file''');
  1447. F.Length:=2;
  1448. AssertSQL(F,'FILE ''/my/file'' LENGTH 2 PAGES');
  1449. F.Length:=0;
  1450. F.StartPage:=3;
  1451. AssertSQL(F,'FILE ''/my/file'' STARTING AT 3');
  1452. end;
  1453. procedure TTestGenerateSQL.TestCreateDatabase;
  1454. Var
  1455. D : TSQLCreateDatabaseStatement;
  1456. F : TSQLDatabaseFileInfo;
  1457. begin
  1458. D:=TSQLCreateDatabaseStatement.Create(Nil);
  1459. D.FileName:='/my/file';
  1460. FTofree:=D;
  1461. AssertSQL(D,'CREATE DATABASE ''/my/file''');
  1462. D.UseSchema:=true;
  1463. AssertSQL(D,'CREATE SCHEMA ''/my/file''');
  1464. D.UseSchema:=False;
  1465. D.Password:='Secret';
  1466. AssertSQL(D,'CREATE DATABASE ''/my/file''');
  1467. D.UserName:='me';
  1468. AssertSQL(D,'CREATE DATABASE ''/my/file'' USER ''me'' PASSWORD ''Secret''');
  1469. AssertSQL(D,'CREATE DATABASE ''/my/file'''+SlineBreak+' USER ''me'' PASSWORD ''Secret''',[sfoMultilineCreateDatabase]);
  1470. D.PageSize:=2048;
  1471. AssertSQL(D,'CREATE DATABASE ''/my/file'' USER ''me'' PASSWORD ''Secret'' PAGE_SIZE 2048');
  1472. AssertSQL(D,'CREATE DATABASE ''/my/file'''+SlineBreak+' USER ''me'' PASSWORD ''Secret'''+SlineBreak+' PAGE_SIZE 2048',[sfoMultilineCreateDatabase]);
  1473. D.Length:=1000;
  1474. AssertSQL(D,'CREATE DATABASE ''/my/file'' USER ''me'' PASSWORD ''Secret'' PAGE_SIZE 2048 LENGTH 1000');
  1475. AssertSQL(D,'CREATE DATABASE ''/my/file'''+SlineBreak+' USER ''me'' PASSWORD ''Secret'''+SlineBreak+' PAGE_SIZE 2048'+SlineBreak+' LENGTH 1000',[sfoMultilineCreateDatabase]);
  1476. D.CharSet:=CreateIdentifier('UTF8');
  1477. FToFree:=D;
  1478. AssertSQL(D,'CREATE DATABASE ''/my/file'' USER ''me'' PASSWORD ''Secret'' PAGE_SIZE 2048 LENGTH 1000 DEFAULT CHARACTER SET UTF8');
  1479. AssertSQL(D,'CREATE DATABASE ''/my/file'''+SlineBreak+' USER ''me'' PASSWORD ''Secret'''+SlineBreak+' PAGE_SIZE 2048'+SlineBreak+' LENGTH 1000'+SlineBreak+' DEFAULT CHARACTER SET UTF8',[sfoMultilineCreateDatabase]);
  1480. F:=TSQLDatabaseFileInfo.Create(Nil);
  1481. FToFree:=D;
  1482. F.FileName:='/my/file2';
  1483. F.StartPage:=3;
  1484. D.SecondaryFiles.Add(F);
  1485. AssertSQL(D,'CREATE DATABASE ''/my/file'' USER ''me'' PASSWORD ''Secret'' PAGE_SIZE 2048 LENGTH 1000 DEFAULT CHARACTER SET UTF8 FILE ''/my/file2'' STARTING AT 3');
  1486. AssertSQL(D,'CREATE DATABASE ''/my/file'''+SlineBreak+' USER ''me'' PASSWORD ''Secret'''+SlineBreak+' PAGE_SIZE 2048'+SlineBreak+' LENGTH 1000'+SlineBreak+' DEFAULT CHARACTER SET UTF8'+SlineBreak+' FILE ''/my/file2'' STARTING AT 3',[sfoMultilineCreateDatabase]);
  1487. F:=TSQLDatabaseFileInfo.Create(Nil);
  1488. FToFree:=D;
  1489. F.FileName:='/my/file3';
  1490. F.StartPage:=4;
  1491. D.SecondaryFiles.Add(F);
  1492. AssertSQL(D,'CREATE DATABASE ''/my/file'' USER ''me'' PASSWORD ''Secret'' PAGE_SIZE 2048 LENGTH 1000 DEFAULT CHARACTER SET UTF8 FILE ''/my/file2'' STARTING AT 3 FILE ''/my/file3'' STARTING AT 4');
  1493. AssertSQL(D,'CREATE DATABASE ''/my/file'''+SlineBreak+' USER ''me'' PASSWORD ''Secret'''+SlineBreak+' PAGE_SIZE 2048'+SlineBreak+' LENGTH 1000'+SlineBreak+' DEFAULT CHARACTER SET UTF8'+SlineBreak+' FILE ''/my/file2'' STARTING AT 3'+SlineBreak+' FILE ''/my/file3'' STARTING AT 4',[sfoMultilineCreateDatabase]);
  1494. end;
  1495. procedure TTestGenerateSQL.TestAlterDatabase;
  1496. Var
  1497. D : TSQLAlterDatabaseStatement;
  1498. F : TSQLDatabaseFileInfo;
  1499. begin
  1500. D:=TSQLAlterDatabaseStatement.Create(Nil);
  1501. F:=TSQLDatabaseFileInfo.Create(Nil);
  1502. FToFree:=D;
  1503. F.FileName:='/my/file2';
  1504. F.StartPage:=3;
  1505. D.Operations.Add(F);
  1506. FToFree:=D;
  1507. AssertSQL(D,'ALTER DATABASE ADD FILE ''/my/file2'' STARTING AT 3');
  1508. AssertSQL(D,'ALTER DATABASE ADD'+SlineBreak+' FILE ''/my/file2'' STARTING AT 3',[sfoMultilineCreateDatabase]);
  1509. D.UseSchema:=True;
  1510. AssertSQL(D,'ALTER SCHEMA ADD FILE ''/my/file2'' STARTING AT 3');
  1511. D.UseSchema:=False;
  1512. F:=TSQLDatabaseFileInfo.Create(Nil);
  1513. F.FileName:='/my/file3';
  1514. F.StartPage:=4;
  1515. D.Operations.Add(F);
  1516. FToFree:=D;
  1517. AssertSQL(D,'ALTER DATABASE ADD FILE ''/my/file2'' STARTING AT 3 FILE ''/my/file3'' STARTING AT 4');
  1518. AssertSQL(D,'ALTER DATABASE ADD'+SlineBreak+' FILE ''/my/file2'' STARTING AT 3'+SlineBreak+' FILE ''/my/file3'' STARTING AT 4',[sfoMultilineCreateDatabase]);
  1519. end;
  1520. procedure TTestGenerateSQL.TestCreateShadow;
  1521. Var
  1522. S : TSQLCreateShadowStatement;
  1523. F : TSQLDatabaseFileInfo;
  1524. begin
  1525. S:=TSQLCreateShadowStatement.Create(Nil);
  1526. S.Number:=1;
  1527. S.FileName:='/my/file';
  1528. FTofree:=S;
  1529. AssertSQL(S,'CREATE SHADOW 1 ''/my/file''');
  1530. S.Manual:=True;
  1531. AssertSQL(S,'CREATE SHADOW 1 MANUAL ''/my/file''');
  1532. S.Conditional:=True;
  1533. AssertSQL(S,'CREATE SHADOW 1 MANUAL CONDITIONAL ''/my/file''');
  1534. S.Length:=4;
  1535. AssertSQL(S,'CREATE SHADOW 1 MANUAL CONDITIONAL ''/my/file'' LENGTH 4 PAGES');
  1536. F:=TSQLDatabaseFileInfo.Create(Nil);
  1537. FTofree:=S;
  1538. F.FileName:='/my/file2';
  1539. F.StartPage:=4;
  1540. S.SecondaryFiles.Add(F);
  1541. AssertSQL(S,'CREATE SHADOW 1 MANUAL CONDITIONAL ''/my/file'' LENGTH 4 PAGES FILE ''/my/file2'' STARTING AT 4');
  1542. AssertSQL(S,'CREATE SHADOW 1 MANUAL CONDITIONAL ''/my/file'' LENGTH 4 PAGES'+sLineBreak+' FILE ''/my/file2'' STARTING AT 4',[sfoMultilineCreateShadow]);
  1543. end;
  1544. procedure TTestGenerateSQL.TestSuspend;
  1545. Var
  1546. S : TSQLSuspendStatement;
  1547. begin
  1548. S:=TSQLSuspendStatement.Create(Nil);
  1549. FToFree:=S;
  1550. AssertSQL(S,'SUSPEND');
  1551. end;
  1552. procedure TTestGenerateSQL.TestExit;
  1553. Var
  1554. S : TSQLExitStatement;
  1555. begin
  1556. S:=TSQLExitStatement.Create(Nil);
  1557. FToFree:=S;
  1558. AssertSQL(S,'EXIT');
  1559. end;
  1560. procedure TTestGenerateSQL.TestBlock;
  1561. Var
  1562. B,B2 : TSQLStatementBlock;
  1563. S : TSQLExitStatement;
  1564. L : TSQLSelectStatement;
  1565. begin
  1566. B:=TSQLStatementBlock.Create(Nil);
  1567. FtoFree:=B;
  1568. B.Statements.Add(TSQLExitStatement.Create(Nil));
  1569. FtoFree:=B;
  1570. AssertSQL(B,'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END');
  1571. B.Statements.Add(TSQLSuspendStatement.Create(Nil));
  1572. FtoFree:=B;
  1573. AssertSQL(B,'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+' SUSPEND;'+sLineBreak+'END');
  1574. B.Statements.Clear;
  1575. L:=CreateSelect(CreateIdentifierExpression('A'),'B');
  1576. FtoFree:=B;
  1577. B.Statements.Add(L);
  1578. AssertSQL(B,'BEGIN'+sLineBreak+' SELECT'+sLineBreak+' A'+sLineBreak+' FROM'+sLineBreak+' B;'+sLineBreak+'END',[sfoOneFieldPerLine,sfoOneTablePerLine]);
  1579. AssertSQL(B,'BEGIN'+sLineBreak+' SELECT'+sLineBreak+' A'+sLineBreak+' FROM'+sLineBreak+' B;'+sLineBreak+'END',[sfoOneFieldPerLine,sfoIndentFields,sfoOneTablePerLine,sfoIndentTables]);
  1580. B.Statements.Clear;
  1581. B2:=TSQLStatementBlock.Create(Nil);
  1582. FtoFree:=B;
  1583. B2.Statements.Add(TSQLExitStatement.Create(Nil));
  1584. FtoFree:=B;
  1585. B.Statements.Add(B2);
  1586. AssertSQL(B,'BEGIN'+sLineBreak+' BEGIN'+sLineBreak+' EXIT;'+sLineBreak+' END'+sLineBreak+'END');
  1587. end;
  1588. procedure TTestGenerateSQL.TestAssignment;
  1589. var
  1590. A : TSQLAssignStatement;
  1591. begin
  1592. A:=TSQLAssignStatement.Create(Nil);
  1593. A.Variable:=CreateIdentifier('A');
  1594. A.Expression:=CreateIdentifierExpression('B');
  1595. FToFree:=A;
  1596. AssertSQL(A,'A = B');
  1597. end;
  1598. procedure TTestGenerateSQL.TestIf;
  1599. Var
  1600. I : TSQLIfStatement;
  1601. C : TSQLBinaryExpression;
  1602. begin
  1603. I:=TSQLIfStatement.Create(Nil);
  1604. C:=CreateBinaryExpression(CreateIdentifierExpression('A'),CreateIdentifierExpression('B'));
  1605. C.Operation:=boEQ;
  1606. I.Condition:=C;
  1607. I.TrueBranch:=TSQLSuspendStatement.Create(Nil);
  1608. FToFree:=I;
  1609. AssertSQL(I,'IF (A = B) THEN'+sLineBreak+' SUSPEND');
  1610. I.FalseBranch:=TSQLExitStatement.Create(Nil);
  1611. AssertSQL(I,'IF (A = B) THEN'+sLineBreak+' SUSPEND'+sLineBreak+'ELSE'+sLineBreak+' EXIT');
  1612. end;
  1613. procedure TTestGenerateSQL.TestFor;
  1614. Var
  1615. F : TSQLForStatement;
  1616. begin
  1617. F:=TSQLForStatement.Create(Nil);
  1618. F.Select:=CreateSelect(CreateIdentifierExpression('A'),'B');
  1619. F.FieldList.Add(CreateIdentifier('ID'));
  1620. F.Statement:=TSQLSuspendStatement.Create(Nil);
  1621. AssertSQL(F,'FOR SELECT A FROM B'+sLineBreak+'INTO'+sLineBreak+':ID'+sLineBreak+'DO'+sLineBreak+' SUSPEND',[sfoIndentFields]);
  1622. F.Select.Fields.Add(CreateIdentifier('C'));
  1623. F.FieldList.Add(CreateIdentifier('ID2'));
  1624. AssertSQL(F,'FOR SELECT A, C FROM B'+sLineBreak+'INTO'+sLineBreak+':ID, :ID2'+sLineBreak+'DO'+sLineBreak+' SUSPEND');
  1625. AssertSQL(F,'FOR SELECT'+sLineBreak+'A,'+sLineBreak+'C'+sLineBreak+'FROM B'+sLineBreak+'INTO'+sLineBreak+':ID,'+sLineBreak+':ID2'+sLineBreak+'DO'+sLineBreak+' SUSPEND',[sfoOneFieldPerLine]);
  1626. end;
  1627. procedure TTestGenerateSQL.TestWhile;
  1628. Var
  1629. W : TSQLWhileStatement;
  1630. C : TSQLBinaryExpression;
  1631. A : TSQLAssignStatement;
  1632. begin
  1633. W:=TSQLWhileStatement.Create(Nil);
  1634. C:=CreateBinaryExpression(CreateIdentifierExpression('A'),CreateIdentifierExpression('B'));
  1635. C.Operation:=boLT;
  1636. W.Condition:=C;
  1637. FToFree:=W;
  1638. A:=TSQLAssignStatement.Create(Nil);
  1639. A.Variable:=CreateIdentifier('A');
  1640. C:=CreateBinaryExpression(CreateIdentifierExpression('A'),CreateLiteralExpression(CreateLiteral(1)));
  1641. C.Operation:=boAdd;
  1642. A.Expression:=C;
  1643. W.Statement:=A;
  1644. FToFree:=W;
  1645. AssertSQL(W,'WHILE (A < B) DO'+slineBreak+' A = A + 1');
  1646. end;
  1647. procedure TTestGenerateSQL.TestWhenSQLError;
  1648. Var
  1649. S : TSQLWhenSQLError;
  1650. begin
  1651. S:=TSQLWhenSQLError.Create(Nil);
  1652. S.ErrorCode:=2;
  1653. FToFree:=S;
  1654. AssertSQL(S,'SQLCODE 2');
  1655. end;
  1656. procedure TTestGenerateSQL.TestWhenGDSError;
  1657. Var
  1658. G : TSQLWhenGDSError;
  1659. begin
  1660. G:=TSQLWhenGDSError.Create(Nil);
  1661. G.GDSErrorNumber:=2;
  1662. FToFree:=G;
  1663. AssertSQL(G,'GDSCODE 2');
  1664. end;
  1665. procedure TTestGenerateSQL.TestWhenException;
  1666. Var
  1667. E : TSQLWhenException;
  1668. begin
  1669. E:=TSQLWhenException.Create(Nil);
  1670. E.ExceptionName:=CreateIdentifier('E');
  1671. FToFree:=E;
  1672. AssertSQL(E,'EXCEPTION E');
  1673. end;
  1674. procedure TTestGenerateSQL.TestWhen;
  1675. Var
  1676. W : TSQLWhenStatement;
  1677. E : TSQLWhenException;
  1678. G : TSQLWhenGDSError;
  1679. S : TSQLWhenSQLError;
  1680. begin
  1681. W:=TSQLWhenStatement.Create(Nil);
  1682. FToFree:=W;
  1683. W.Statement:=TSQLExitStatement.Create(Nil);
  1684. FToFree:=W;
  1685. W.AnyError:=True;
  1686. AssertSQL(W,'WHEN ANY DO'+sLineBreak+' EXIT');
  1687. W.AnyError:=False;
  1688. E:=TSQLWhenException.Create(Nil);
  1689. E.ExceptionName:=CreateIdentifier('E');
  1690. W.Errors.Add(E);
  1691. AssertSQL(W,'WHEN EXCEPTION E DO'+sLineBreak+' EXIT');
  1692. W.Errors.Extract(E);
  1693. S:=TSQLWhenSQLError.Create(Nil);
  1694. S.ErrorCode:=2;
  1695. W.Errors.Add(S);
  1696. AssertSQL(W,'WHEN SQLCODE 2 DO'+sLineBreak+' EXIT');
  1697. W.Errors.Extract(S);
  1698. G:=TSQLWhenGDSError.Create(Nil);
  1699. G.GDSErrorNumber:=3;
  1700. W.Errors.Add(G);
  1701. AssertSQL(W,'WHEN GDSCODE 3 DO'+sLineBreak+' EXIT');
  1702. W.Errors.Add(S);
  1703. AssertSQL(W,'WHEN GDSCODE 3 , SQLCODE 2 DO'+sLineBreak+' EXIT');
  1704. W.Errors.Add(E);
  1705. AssertSQL(W,'WHEN GDSCODE 3 , SQLCODE 2 , EXCEPTION E DO'+sLineBreak+' EXIT');
  1706. end;
  1707. procedure TTestGenerateSQL.TestException;
  1708. Var
  1709. E : TSQLExceptionStatement;
  1710. begin
  1711. E:=TSQLExceptionStatement.Create(Nil);
  1712. E.ExceptionName:=CreateIdentifier('E');
  1713. FToFree:=E;
  1714. AssertSQL(E,'EXCEPTION E');
  1715. end;
  1716. procedure TTestGenerateSQL.TestPostEvent;
  1717. Var
  1718. P : TSQLPostEventStatement;
  1719. begin
  1720. P:=TSQLPostEventStatement.Create(nil);
  1721. P.ColName:=CreateIdentifier('E');
  1722. FTofree:=P;
  1723. AssertSQL(P,'POST_EVENT E');
  1724. P.ColName.Free;
  1725. P.ColName:=Nil;
  1726. P.EventName:='E';
  1727. AssertSQL(P,'POST_EVENT ''E''');
  1728. end;
  1729. procedure TTestGenerateSQL.TestTriggerProcedure;
  1730. Var
  1731. S : TSQLCreateOrAlterProcedureTriggerStatement;
  1732. P : TSQLProcedureParamDef;
  1733. begin
  1734. S:=TSQLCreateOrAlterProcedureTriggerStatement.Create(Nil);
  1735. FToFree:=S;
  1736. AssertSQL(S,'BEGIN'+sLineBreak+'END');
  1737. S.Statements.Add(TSQLExitStatement.Create(Nil));
  1738. AssertSQL(S,'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1739. AssertSQL(S,'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1740. P:=TSQLProcedureParamDef.Create(Nil);
  1741. P.ParamName:=CreateIdentifier('A');
  1742. P.ParamType:=CreateTypeDefinition(sdtInteger,0);
  1743. FToFree:=S;
  1744. S.LocalVariables.Add(P);
  1745. AssertSQL(S,'DECLARE VARIABLE A INT;'+sLineBreak+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1746. AssertSQL(S,'DECLARE VARIABLE A INT;'+sLineBreak+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1747. P:=TSQLProcedureParamDef.Create(Nil);
  1748. P.ParamName:=CreateIdentifier('B');
  1749. P.ParamType:=CreateTypeDefinition(sdtChar,5);
  1750. FToFree:=S;
  1751. S.LocalVariables.Add(P);
  1752. AssertSQL(S,'DECLARE VARIABLE A INT;'+sLineBreak+'DECLARE VARIABLE B CHAR(5);'+sLineBreak+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1753. AssertSQL(S,'DECLARE VARIABLE A INT;'+sLineBreak+'DECLARE VARIABLE B CHAR(5);'+sLineBreak+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1754. end;
  1755. procedure TTestGenerateSQL.DoTestAlterCreateProcedure(S : TSQLAlterCreateProcedureStatement; PHEAD : String);
  1756. Var
  1757. P : TSQLProcedureParamDef;
  1758. H : TSQLStringType;
  1759. begin
  1760. PHead:=PHead+' P';
  1761. FToFree:=S;
  1762. S.ObjectName:=CreateIdentifier('P');
  1763. H:=PHEAD+sLineBreak+'AS'+sLineBreak;
  1764. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1765. S.Statements.Add(TSQLExitStatement.Create(Nil));
  1766. AssertSQL(S,H+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1767. AssertSQL(S,H+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1768. P:=TSQLProcedureParamDef.Create(Nil);
  1769. P.ParamName:=CreateIdentifier('I');
  1770. P.ParamType:=CreateTypeDefinition(sdtInteger,0);
  1771. FToFree:=S;
  1772. S.InputVariables.Add(P);
  1773. H:=PHEAD+' (I INT)'+sLineBreak+'AS'+sLineBreak;
  1774. AssertSQL(S,H+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1775. AssertSQL(S,H+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1776. P:=TSQLProcedureParamDef.Create(Nil);
  1777. P.ParamName:=CreateIdentifier('J');
  1778. P.ParamType:=CreateTypeDefinition(sdtChar,5);
  1779. FToFree:=S;
  1780. S.InputVariables.Add(P);
  1781. H:=PHEAD+' (I INT , J CHAR(5))'+sLineBreak+'AS'+sLineBreak;
  1782. AssertSQL(S,H+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1783. AssertSQL(S,H+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1784. P:=TSQLProcedureParamDef.Create(Nil);
  1785. P.ParamName:=CreateIdentifier('R');
  1786. P.ParamType:=CreateTypeDefinition(sdtInteger,0);
  1787. FToFree:=S;
  1788. S.OutputVariables.Add(P);
  1789. H:=PHEAD+' (I INT , J CHAR(5))'+sLineBreak+'RETURNS (R INT)'+sLineBreak+'AS'+sLineBreak;
  1790. AssertSQL(S,H+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1791. AssertSQL(S,H+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1792. P:=TSQLProcedureParamDef.Create(Nil);
  1793. P.ParamName:=CreateIdentifier('S');
  1794. P.ParamType:=CreateTypeDefinition(sdtChar,5);
  1795. FToFree:=S;
  1796. S.OutputVariables.Add(P);
  1797. H:=PHEAD+' (I INT , J CHAR(5))'+sLineBreak+'RETURNS (R INT , S CHAR(5))'+sLineBreak+'AS'+sLineBreak;
  1798. AssertSQL(S,H+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1799. AssertSQL(S,H+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1800. P:=TSQLProcedureParamDef.Create(Nil);
  1801. P.ParamName:=CreateIdentifier('A');
  1802. P.ParamType:=CreateTypeDefinition(sdtInteger,0);
  1803. FToFree:=S;
  1804. S.LocalVariables.Add(P);
  1805. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1806. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1807. P:=TSQLProcedureParamDef.Create(Nil);
  1808. P.ParamName:=CreateIdentifier('B');
  1809. P.ParamType:=CreateTypeDefinition(sdtChar,5);
  1810. FToFree:=S;
  1811. S.LocalVariables.Add(P);
  1812. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'DECLARE VARIABLE B CHAR(5);'+sLineBreak+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1813. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'DECLARE VARIABLE B CHAR(5);'+sLineBreak+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1814. end;
  1815. procedure TTestGenerateSQL.TestCreateProcedure;
  1816. begin
  1817. DoTestAlterCreateProcedure(TSQLCreateProcedureStatement.Create(Nil),'CREATE PROCEDURE');
  1818. end;
  1819. procedure TTestGenerateSQL.TestAlterProcedure;
  1820. begin
  1821. DoTestAlterCreateProcedure(TSQLAlterProcedureStatement.Create(Nil),'ALTER PROCEDURE');
  1822. end;
  1823. procedure TTestGenerateSQL.DoTestAlterCreateTrigger(
  1824. S: TSQLAlterCreateTriggerStatement; PHEAD: String);
  1825. Var
  1826. P : TSQLProcedureParamDef;
  1827. H : TSQLStringType;
  1828. begin
  1829. FToFree:=S;
  1830. S.ObjectName:=CreateIdentifier('TR');
  1831. S.TableName:=CreateIdentifier('TA');
  1832. S.Position:=1;
  1833. S.Moment:=tmBefore;
  1834. S.Operations:=[toDelete];
  1835. H:=PHEAD+sLineBreak+'BEFORE DELETE'+sLineBreak+'POSITION 1'+sLineBreak+'AS'+sLineBreak;
  1836. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1837. S.Moment:=tmAfter;
  1838. S.Operations:=[toDelete];
  1839. H:=PHEAD+sLineBreak+'AFTER DELETE'+sLineBreak+'POSITION 1'+sLineBreak+'AS'+sLineBreak;
  1840. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1841. S.Operations:=[toUPDATE];
  1842. H:=PHEAD+sLineBreak+'AFTER UPDATE'+sLineBreak+'POSITION 1'+sLineBreak+'AS'+sLineBreak;
  1843. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1844. S.Operations:=[toUPDATE,toDelete];
  1845. H:=PHEAD+sLineBreak+'AFTER DELETE OR UPDATE'+sLineBreak+'POSITION 1'+sLineBreak+'AS'+sLineBreak;
  1846. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1847. S.Operations:=[toInsert];
  1848. S.State:=tsActive;
  1849. H:=PHEAD+sLineBreak+'ACTIVE'+sLineBreak+'AFTER INSERT'+sLineBreak+'POSITION 1'+sLineBreak+'AS'+sLineBreak;
  1850. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1851. S.State:=tsInActive;
  1852. H:=PHEAD+sLineBreak+'INACTIVE'+sLineBreak+'AFTER INSERT'+sLineBreak+'POSITION 1'+sLineBreak+'AS'+sLineBreak;
  1853. AssertSQL(S,H+'BEGIN'+sLineBreak+'END');
  1854. S.Statements.Add(TSQLExitStatement.Create(Nil));
  1855. AssertSQL(S,H+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1856. AssertSQL(S,H+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1857. P:=TSQLProcedureParamDef.Create(Nil);
  1858. P.ParamName:=CreateIdentifier('A');
  1859. P.ParamType:=CreateTypeDefinition(sdtInteger,0);
  1860. FToFree:=S;
  1861. S.LocalVariables.Add(P);
  1862. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1863. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1864. P:=TSQLProcedureParamDef.Create(Nil);
  1865. P.ParamName:=CreateIdentifier('B');
  1866. P.ParamType:=CreateTypeDefinition(sdtChar,5);
  1867. FToFree:=S;
  1868. S.LocalVariables.Add(P);
  1869. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'DECLARE VARIABLE B CHAR(5);'+sLineBreak+'BEGIN'+sLineBreak+'EXIT;'+sLineBreak+'END');
  1870. AssertSQL(S,H+'DECLARE VARIABLE A INT;'+sLineBreak+'DECLARE VARIABLE B CHAR(5);'+sLineBreak+'BEGIN'+sLineBreak+' EXIT;'+sLineBreak+'END',[sfoIndentProcedureBlock]);
  1871. end;
  1872. procedure TTestGenerateSQL.TestCreateTrigger;
  1873. begin
  1874. DoTestAlterCreateTrigger(TSQLCreateTriggerStatement.Create(Nil),'CREATE TRIGGER TR FOR TA');
  1875. end;
  1876. procedure TTestGenerateSQL.TestAlterTrigger;
  1877. begin
  1878. DoTestAlterCreateTrigger(TSQLAlterTriggerStatement.Create(Nil),'ALTER TRIGGER TR');
  1879. end;
  1880. procedure TTestGenerateSQL.DoTestDropStatement(AClass : TSQLDropStatementClass; Const AObjectName : String);
  1881. Var
  1882. D : TSQLDropStatement;
  1883. begin
  1884. D:=AClass.Create(Nil);
  1885. D.ObjectName:=CreateIdentifier('D');
  1886. FToFree:=Nil;
  1887. Try
  1888. AssertSQL(D,'DROP '+AObjectName+' D');
  1889. AssertSQL(D,'drop '+lowercase(AObjectName)+' D',[sfoLowerCaseKeyWord]);
  1890. Finally
  1891. D.Free;
  1892. end;
  1893. end;
  1894. procedure TTestGenerateSQL.TestDropStatement;
  1895. begin
  1896. DoTestDropStatement(TSQLDropTableStatement,'TABLE');
  1897. DoTestDropStatement(TSQLDropIndexStatement,'INDEX');
  1898. DoTestDropStatement(TSQLDropViewStatement,'VIEW');
  1899. DoTestDropStatement(TSQLDropProcedureStatement,'PROCEDURE');
  1900. DoTestDropStatement(TSQLDropDomainStatement,'DOMAIN');
  1901. DoTestDropStatement(TSQLDropGeneratorStatement,'GENERATOR');
  1902. DoTestDropStatement(TSQLDropTriggerStatement,'TRIGGER');
  1903. DoTestDropStatement(TSQLDropExceptionStatement,'EXCEPTION');
  1904. DoTestDropStatement(TSQLDropDatabaseStatement,'DATABASE');
  1905. DoTestDropStatement(TSQLDropRoleStatement,'ROLE');
  1906. DoTestDropStatement(TSQLDropExternalFunctionStatement,'EXTERNAL FUNCTION');
  1907. DoTestDropStatement(TSQLDropShadowStatement,'SHADOW');
  1908. end;
  1909. procedure TTestGenerateSQL.TestConnect;
  1910. Const
  1911. Base = 'CONNECT ''db''';
  1912. Var
  1913. C : TSQLConnectStatement;
  1914. begin
  1915. C:=TSQLConnectStatement.Create(Nil);
  1916. FToFree:=C;
  1917. C.DatabaseName:='db';
  1918. AssertSQL(C,Base);
  1919. C.UserName:='u';
  1920. AssertSQL(C,Base+' USER ''u''');
  1921. C.Password:='p';
  1922. AssertSQL(C,Base+' USER ''u'' PASSWORD ''p''');
  1923. C.UserName:='';
  1924. AssertSQL(C,Base+' PASSWORD ''p''');
  1925. C.Password:='';
  1926. C.Cache:=2048;
  1927. AssertSQL(C,Base+' CACHE 2048');
  1928. C.Cache:=0;
  1929. C.Role:='r';
  1930. AssertSQL(C,Base+' ROLE ''r''');
  1931. end;
  1932. procedure TTestGenerateSQL.TestExtract;
  1933. Var
  1934. C : TSQLExtractExpression;
  1935. begin
  1936. AssertEquals(ExtractElementNames[eeYear],'YEAR');
  1937. AssertEquals(ExtractElementNames[eeMonth],'MONTH');
  1938. AssertEquals(ExtractElementNames[eeDay],'DAY');
  1939. AssertEquals(ExtractElementNames[eeHour],'HOUR');
  1940. AssertEquals(ExtractElementNames[eeMinute],'MINUTE');
  1941. AssertEquals(ExtractElementNames[eeSecond],'SECOND');
  1942. AssertEquals(ExtractElementNames[eeWeekDay],'WEEKDAY');
  1943. AssertEquals(ExtractElementNames[eeYearDay],'YEARDAY');
  1944. C:=TSQLExtractExpression.Create(Nil);
  1945. C.Value:=CreateIdentifierExpression('A');
  1946. C.Element:=eeYear;
  1947. AssertSQL(C,'EXTRACT(YEAR FROM A)');
  1948. C.Element:=eeMonth;
  1949. AssertSQL(C,'EXTRACT(MONTH FROM A)');
  1950. C.Element:=eeDay;
  1951. AssertSQL(C,'EXTRACT(DAY FROM A)');
  1952. C.Element:=eeHour;
  1953. AssertSQL(C,'EXTRACT(HOUR FROM A)');
  1954. C.Element:=eeMinute;
  1955. AssertSQL(C,'EXTRACT(MINUTE FROM A)');
  1956. C.Element:=eeSecond;
  1957. AssertSQL(C,'EXTRACT(SECOND FROM A)');
  1958. C.Element:=eeWeekday;
  1959. AssertSQL(C,'EXTRACT(WEEKDAY FROM A)');
  1960. C.Element:=eeYearday;
  1961. AssertSQL(C,'EXTRACT(YEARDAY FROM A)');
  1962. end;
  1963. procedure TTestGenerateSQL.TestParamExpression;
  1964. Var
  1965. P : TSQLParameterExpression;
  1966. begin
  1967. P:=TSQLParameterExpression.Create(Nil);
  1968. P.Identifier:=CreateIdentifier('P');
  1969. FTofree:=P;
  1970. AssertSQL(P,':P');
  1971. end;
  1972. procedure TTestGenerateSQL.TestGrantTable;
  1973. Var
  1974. G : TSQLTableGrantStatement;
  1975. U : TSQLUserGrantee;
  1976. PU : TSQLColumnPrivilege;
  1977. PG : TSQLProcedureGrantee;
  1978. begin
  1979. G:=TSQLTableGrantStatement.Create(Nil);
  1980. G.TableName:=CreateIdentifier('A');
  1981. FtoFree:=G;
  1982. G.Privileges.Add(TSQLSelectPrivilege.Create(Nil));
  1983. G.Grantees.add(CreateGrantee('B'));
  1984. FtoFree:=G;
  1985. AssertSQl(G,'GRANT SELECT ON A TO B');
  1986. G.Grantees.add(CreateGrantee('C'));
  1987. FtoFree:=G;
  1988. AssertSQl(G,'GRANT SELECT ON A TO B , C');
  1989. G.Privileges.Clear;
  1990. G.Privileges.Add(TSQLUPdatePrivilege.Create(Nil));
  1991. FtoFree:=G;
  1992. AssertSQl(G,'GRANT UPDATE ON A TO B , C');
  1993. G.Privileges.Clear;
  1994. G.Privileges.Add(TSQLDeletePrivilege.Create(Nil));
  1995. FtoFree:=G;
  1996. AssertSQl(G,'GRANT DELETE ON A TO B , C');
  1997. G.Privileges.Clear;
  1998. G.Privileges.Add(TSQLINSERTPrivilege.Create(Nil));
  1999. FtoFree:=G;
  2000. AssertSQl(G,'GRANT INSERT ON A TO B , C');
  2001. G.Privileges.Clear;
  2002. G.Privileges.Add(TSQLReferencePrivilege.Create(Nil));
  2003. FtoFree:=G;
  2004. AssertSQl(G,'GRANT REFERENCES ON A TO B , C');
  2005. G.Privileges.Clear;
  2006. G.Privileges.Add(TSQLAllPrivilege.Create(Nil));
  2007. FtoFree:=G;
  2008. AssertSQl(G,'GRANT ALL PRIVILEGES ON A TO B , C');
  2009. G.GrantOption:=True;
  2010. AssertSQl(G,'GRANT ALL PRIVILEGES ON A TO B , C WITH GRANT OPTION');
  2011. G.GrantOption:=False;
  2012. G.Privileges.Clear;
  2013. G.Privileges.Add(TSQLSelectPrivilege.Create(Nil));
  2014. G.Grantees.Clear;
  2015. G.Grantees.Add(TSQLPublicGrantee.Create(Nil));
  2016. FtoFree:=G;
  2017. AssertSQl(G,'GRANT SELECT ON A TO PUBLIC');
  2018. G.Grantees.Clear;
  2019. G.Grantees.Add(CreateGrantee('B',TSQLProcedureGrantee));
  2020. AssertSQl(G,'GRANT SELECT ON A TO PROCEDURE B');
  2021. G.Grantees.Clear;
  2022. G.Grantees.Add(CreateGrantee('B',TSQLViewGrantee));
  2023. AssertSQl(G,'GRANT SELECT ON A TO VIEW B');
  2024. G.Grantees.Clear;
  2025. G.Grantees.Add(CreateGrantee('B',TSQLTriggerGrantee));
  2026. AssertSQl(G,'GRANT SELECT ON A TO TRIGGER B');
  2027. FtoFree:=G;
  2028. G.Privileges.Clear;
  2029. Pu:=TSQLUPdatePrivilege.Create(Nil);
  2030. PU.Columns:=TSQLElementList.Create(True);
  2031. PU.Columns.Add(CreateIdentifier('C'));
  2032. G.Privileges.Add(PU);
  2033. FtoFree:=G;
  2034. AssertSQl(G,'GRANT UPDATE (C) ON A TO TRIGGER B');
  2035. PU.Columns.Add(CreateIdentifier('D'));
  2036. FtoFree:=G;
  2037. AssertSQl(G,'GRANT UPDATE (C , D) ON A TO TRIGGER B');
  2038. G.Privileges.Clear;
  2039. Pu:=TSQLReferencePrivilege.Create(Nil);
  2040. PU.Columns:=TSQLElementList.Create(True);
  2041. PU.Columns.Add(CreateIdentifier('C'));
  2042. G.Privileges.Add(PU);
  2043. FtoFree:=G;
  2044. AssertSQl(G,'GRANT REFERENCES (C) ON A TO TRIGGER B');
  2045. PU.Columns.Add(CreateIdentifier('D'));
  2046. FtoFree:=G;
  2047. AssertSQl(G,'GRANT REFERENCES (C , D) ON A TO TRIGGER B');
  2048. end;
  2049. procedure TTestGenerateSQL.TestGrantProcedure;
  2050. Var
  2051. G : TSQLProcedureGrantStatement;
  2052. U : TSQLUserGrantee;
  2053. PU : TSQLColumnPrivilege;
  2054. PG : TSQLProcedureGrantee;
  2055. begin
  2056. G:=TSQLProcedureGrantStatement.Create(Nil);
  2057. G.ProcedureName:=CreateIdentifier('A');
  2058. FtoFree:=G;
  2059. G.Grantees.add(CreateGrantee('B'));
  2060. FtoFree:=G;
  2061. AssertSQL(G,'GRANT EXECUTE ON PROCEDURE A TO B');
  2062. G.Grantees.add(CreateGrantee('C'));
  2063. FtoFree:=G;
  2064. AssertSQL(G,'GRANT EXECUTE ON PROCEDURE A TO B , C');
  2065. G.Grantees.Clear;
  2066. G.Grantees.Add(CreateGrantee('B',TSQLTriggerGrantee));
  2067. FtoFree:=G;
  2068. AssertSQL(G,'GRANT EXECUTE ON PROCEDURE A TO TRIGGER B');
  2069. G.Grantees.Clear;
  2070. G.Grantees.Add(CreateGrantee('B',TSQLProcedureGrantee));
  2071. FtoFree:=G;
  2072. AssertSQL(G,'GRANT EXECUTE ON PROCEDURE A TO PROCEDURE B');
  2073. G.Grantees.Clear;
  2074. G.Grantees.Add(CreateGrantee('B',TSQLViewGrantee));
  2075. FtoFree:=G;
  2076. AssertSQL(G,'GRANT EXECUTE ON PROCEDURE A TO VIEW B');
  2077. G.Grantees.Clear;
  2078. G.Grantees.Add(CreateGrantee('B',TSQLPublicGrantee));
  2079. FtoFree:=G;
  2080. AssertSQL(G,'GRANT EXECUTE ON PROCEDURE A TO PUBLIC');
  2081. end;
  2082. procedure TTestGenerateSQL.TestGrantRole;
  2083. Var
  2084. G : TSQLRoleGrantStatement;
  2085. U : TSQLUserGrantee;
  2086. begin
  2087. G:=TSQLRoleGrantStatement.Create(Nil);
  2088. G.Roles.Add(CreateIdentifier('A'));
  2089. FtoFree:=G;
  2090. G.Grantees.add(CreateGrantee('B'));
  2091. FtoFree:=G;
  2092. AssertSQL(G,'GRANT A TO B');
  2093. G.Roles.Add(CreateIdentifier('C'));
  2094. FtoFree:=G;
  2095. AssertSQL(G,'GRANT A , C TO B');
  2096. G.Grantees.add(CreateGrantee('D'));
  2097. FtoFree:=G;
  2098. AssertSQL(G,'GRANT A , C TO B , D');
  2099. G.AdminOption:=True;
  2100. AssertSQL(G,'GRANT A , C TO B , D WITH ADMIN OPTION');
  2101. end;
  2102. procedure TTestGenerateSQL.TestRevokeTable;
  2103. Var
  2104. G : TSQLTableRevokeStatement;
  2105. U : TSQLUserGrantee;
  2106. PU : TSQLColumnPrivilege;
  2107. PG : TSQLProcedureGrantee;
  2108. begin
  2109. G:=TSQLTableRevokeStatement.Create(Nil);
  2110. G.TableName:=CreateIdentifier('A');
  2111. FtoFree:=G;
  2112. G.Privileges.Add(TSQLSelectPrivilege.Create(Nil));
  2113. G.Grantees.add(CreateGrantee('B'));
  2114. FtoFree:=G;
  2115. AssertSQl(G,'REVOKE SELECT ON A FROM B');
  2116. G.Grantees.add(CreateGrantee('C'));
  2117. FtoFree:=G;
  2118. AssertSQl(G,'REVOKE SELECT ON A FROM B , C');
  2119. G.Privileges.Clear;
  2120. G.Privileges.Add(TSQLUPdatePrivilege.Create(Nil));
  2121. FtoFree:=G;
  2122. AssertSQl(G,'REVOKE UPDATE ON A FROM B , C');
  2123. G.Privileges.Clear;
  2124. G.Privileges.Add(TSQLDeletePrivilege.Create(Nil));
  2125. FtoFree:=G;
  2126. AssertSQl(G,'REVOKE DELETE ON A FROM B , C');
  2127. G.Privileges.Clear;
  2128. G.Privileges.Add(TSQLINSERTPrivilege.Create(Nil));
  2129. FtoFree:=G;
  2130. AssertSQl(G,'REVOKE INSERT ON A FROM B , C');
  2131. G.Privileges.Clear;
  2132. G.Privileges.Add(TSQLReferencePrivilege.Create(Nil));
  2133. FtoFree:=G;
  2134. AssertSQl(G,'REVOKE REFERENCES ON A FROM B , C');
  2135. G.Privileges.Clear;
  2136. G.Privileges.Add(TSQLAllPrivilege.Create(Nil));
  2137. FtoFree:=G;
  2138. AssertSQl(G,'REVOKE ALL PRIVILEGES ON A FROM B , C');
  2139. G.GrantOption:=True;
  2140. AssertSQl(G,'REVOKE GRANT OPTION FOR ALL PRIVILEGES ON A FROM B , C');
  2141. G.GrantOption:=False;
  2142. G.Privileges.Clear;
  2143. G.Privileges.Add(TSQLSelectPrivilege.Create(Nil));
  2144. G.Grantees.Clear;
  2145. G.Grantees.Add(TSQLPublicGrantee.Create(Nil));
  2146. FtoFree:=G;
  2147. AssertSQl(G,'REVOKE SELECT ON A FROM PUBLIC');
  2148. G.Grantees.Clear;
  2149. G.Grantees.Add(CreateGrantee('B',TSQLProcedureGrantee));
  2150. AssertSQl(G,'REVOKE SELECT ON A FROM PROCEDURE B');
  2151. G.Grantees.Clear;
  2152. G.Grantees.Add(CreateGrantee('B',TSQLViewGrantee));
  2153. AssertSQl(G,'REVOKE SELECT ON A FROM VIEW B');
  2154. G.Grantees.Clear;
  2155. G.Grantees.Add(CreateGrantee('B',TSQLTriggerGrantee));
  2156. AssertSQl(G,'REVOKE SELECT ON A FROM TRIGGER B');
  2157. FtoFree:=G;
  2158. G.Privileges.Clear;
  2159. Pu:=TSQLUPdatePrivilege.Create(Nil);
  2160. PU.Columns:=TSQLElementList.Create(True);
  2161. PU.Columns.Add(CreateIdentifier('C'));
  2162. G.Privileges.Add(PU);
  2163. FtoFree:=G;
  2164. AssertSQl(G,'REVOKE UPDATE (C) ON A FROM TRIGGER B');
  2165. PU.Columns.Add(CreateIdentifier('D'));
  2166. FtoFree:=G;
  2167. AssertSQl(G,'REVOKE UPDATE (C , D) ON A FROM TRIGGER B');
  2168. G.Privileges.Clear;
  2169. Pu:=TSQLReferencePrivilege.Create(Nil);
  2170. PU.Columns:=TSQLElementList.Create(True);
  2171. PU.Columns.Add(CreateIdentifier('C'));
  2172. G.Privileges.Add(PU);
  2173. FtoFree:=G;
  2174. AssertSQl(G,'REVOKE REFERENCES (C) ON A FROM TRIGGER B');
  2175. PU.Columns.Add(CreateIdentifier('D'));
  2176. FtoFree:=G;
  2177. AssertSQl(G,'REVOKE REFERENCES (C , D) ON A FROM TRIGGER B');
  2178. end;
  2179. procedure TTestGenerateSQL.TestRevokeProcedure;
  2180. Var
  2181. G : TSQLProcedureRevokeStatement;
  2182. PG : TSQLProcedureGrantee;
  2183. begin
  2184. G:=TSQLProcedureRevokeStatement.Create(Nil);
  2185. G.ProcedureName:=CreateIdentifier('A');
  2186. FtoFree:=G;
  2187. G.Grantees.add(CreateGrantee('B'));
  2188. FtoFree:=G;
  2189. AssertSQL(G,'REVOKE EXECUTE ON PROCEDURE A FROM B');
  2190. G.Grantees.add(CreateGrantee('C'));
  2191. FtoFree:=G;
  2192. AssertSQL(G,'REVOKE EXECUTE ON PROCEDURE A FROM B , C');
  2193. G.Grantees.Clear;
  2194. G.Grantees.Add(CreateGrantee('B',TSQLTriggerGrantee));
  2195. FtoFree:=G;
  2196. AssertSQL(G,'REVOKE EXECUTE ON PROCEDURE A FROM TRIGGER B');
  2197. G.Grantees.Clear;
  2198. G.Grantees.Add(CreateGrantee('B',TSQLProcedureGrantee));
  2199. FtoFree:=G;
  2200. AssertSQL(G,'REVOKE EXECUTE ON PROCEDURE A FROM PROCEDURE B');
  2201. G.Grantees.Clear;
  2202. G.Grantees.Add(CreateGrantee('B',TSQLViewGrantee));
  2203. FtoFree:=G;
  2204. AssertSQL(G,'REVOKE EXECUTE ON PROCEDURE A FROM VIEW B');
  2205. G.Grantees.Clear;
  2206. G.Grantees.Add(CreateGrantee('B',TSQLPublicGrantee));
  2207. FtoFree:=G;
  2208. AssertSQL(G,'REVOKE EXECUTE ON PROCEDURE A FROM PUBLIC');
  2209. end;
  2210. procedure TTestGenerateSQL.TestRevokeRole;
  2211. Var
  2212. G : TSQLRoleRevokeStatement;
  2213. begin
  2214. G:=TSQLRoleRevokeStatement.Create(Nil);
  2215. G.Roles.Add(CreateIdentifier('A'));
  2216. FtoFree:=G;
  2217. G.Grantees.add(CreateGrantee('B'));
  2218. FtoFree:=G;
  2219. AssertSQL(G,'REVOKE A FROM B');
  2220. G.Roles.Add(CreateIdentifier('C'));
  2221. FtoFree:=G;
  2222. AssertSQL(G,'REVOKE A , C FROM B');
  2223. G.Grantees.add(CreateGrantee('D'));
  2224. FtoFree:=G;
  2225. AssertSQL(G,'REVOKE A , C FROM B , D');
  2226. G.AdminOption:=True;
  2227. AssertSQL(G,'REVOKE A , C FROM B , D');
  2228. end;
  2229. initialization
  2230. RegisterTest(TTestGenerateSQL);
  2231. end.