tcgensql.pas 81 KB

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