tcgensql.pas 79 KB

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