tcparser.pas 246 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025
  1. {
  2. This file is part of the Free Component Library
  3. Copyright (c) 2010 by the Free Pascal development team
  4. SQL source syntax parser test suite
  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 tcparser;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, fpcunit, testutils, fpsqltree, fpsqlscanner, fpsqlparser, testregistry;
  16. type
  17. { TTestParser }
  18. TTestParser = Class(TSQLparser)
  19. public
  20. Procedure ParseStringDef(Out DT : TSQLDataType; Out Len : Integer; Out ACharset : TSQLStringtype);
  21. Function ParseType(Flags : TParseTypeFlags) : TSQLTypeDefinition;
  22. Function ParseConstraint : TSQLExpression;
  23. Function ParseProcedureStatements : TSQLStatement;
  24. end;
  25. { TTestSQLParser }
  26. TTestSQLParser = class(TTestCase)
  27. Private
  28. FSource : TStringStream;
  29. FParser : TTestParser;
  30. FToFree: TSQLElement;
  31. FErrSource : string;
  32. protected
  33. procedure AssertTypeDefaults(TD: TSQLTypeDefinition; Len: Integer=0);
  34. Procedure TestStringDef(ASource: String; ExpectDT: TSQLDataType; ExpectLen: Integer; ExpectCharset : TSQLStringType='');
  35. Function TestType(ASource : string; AFlags : TParseTypeFlags; AExpectedType : TSQLDataType) : TSQLTypeDefinition;
  36. Function TestCheck(ASource : string; AExpectedConstraint : TSQLElementClass) : TSQLExpression;
  37. Procedure CreateParser(Const ASource : string);
  38. Function CheckClass(E : TSQLElement; C : TSQLElementClass) : TSQLElement;
  39. procedure TestDropStatement(Const ASource : string;C : TSQLElementClass);
  40. Function TestCreateStatement(Const ASource,AName : string;C: TSQLElementClass) : TSQLCreateOrAlterStatement;
  41. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLToken); overload;
  42. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLBinaryoperation); overload;
  43. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLUnaryoperation); overload;
  44. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLternaryoperation); overload;
  45. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLDataType); overload;
  46. procedure AssertEquals(const AMessage: String; Expected, Actual: TForeignKeyAction); overload;
  47. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLJoinType); overload;
  48. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLAggregateFunction); overload;
  49. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLAggregateOption); overload;
  50. procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLOrderDirection); overload;
  51. procedure AssertEquals(const AMessage: String; Expected, Actual: TPlanJoinType); overload;
  52. procedure AssertEquals(const AMessage: String; Expected, Actual: TTriggerMoment); overload;
  53. procedure AssertEquals(const AMessage: String; Expected, Actual: TTriggerState); overload;
  54. procedure AssertEquals(const AMessage: String; Expected, Actual: TTriggerOperations); overload;
  55. function AssertLiteralExpr(Const AMessage : String; Element : TSQLExpression; ALiteralClass : TSQLElementClass) : TSQLLiteral;
  56. Procedure AssertIdentifierName(Const AMessage : String; Const AExpected : String; Element : TSQLElement);
  57. Procedure AssertField(AField : TSQLElement; Const AName : String; Const AAlias : String = '');
  58. Procedure AssertAggregate(AField : TSQLElement; AAgregate : TSQLAggregateFunction; Const AFieldName : String; AOption : TSQLAggregateOption; Const AAlias : String = '');
  59. Procedure AssertAggregateExpression(E : TSQLElement; AAgregate : TSQLAggregateFunction; Const AFieldName : String; AOption : TSQLAggregateOption);
  60. Procedure AssertTable(ATable : TSQLElement; Const AName : String; Const AAlias : String = '');
  61. Function AssertJoin(AJoin : TSQLElement; Const AFirst,ASecond : String; Const aJoinType : TSQLJoinType) : TSQLJoinTableReference;
  62. Function AssertJoinOn(AJoin : TSQLExpression; Const AFirst,ASecond : String; Const AOperation : TSQLBinaryOperation) : TSQLBinaryExpression;
  63. Function AssertOrderBy(AOrderBy : TSQLElement; Const AField : String; Const ANumber : Integer; Const AOrdering : TSQLOrderDirection) : TSQLOrderByElement;
  64. Function AssertSecondaryFile(ASecondaryFile : TSQLElement; Const AFile : String; Const ALength,AStart : Integer) : TSQLDatabaseFileInfo;
  65. procedure TestTypeError;
  66. Procedure TestStringError;
  67. Procedure TestCheckError;
  68. Procedure TestParseError;
  69. procedure SetUp; override;
  70. procedure TearDown; override;
  71. Property Parser : TTestParser Read FParser;
  72. Property ToFree : TSQLElement Read FToFree Write FTofree;
  73. end;
  74. { TTestDropParser }
  75. TTestDropParser = Class(TTestSQLParser)
  76. published
  77. procedure TestDropDatabase;
  78. procedure TestDropDomain;
  79. procedure TestDropException;
  80. procedure TestDropGenerator;
  81. procedure TestDropIndex;
  82. procedure TestDropProcedure;
  83. procedure TestDropRole;
  84. procedure TestDropTable;
  85. procedure TestDropTrigger;
  86. procedure TestDropView;
  87. procedure TestDropShadow;
  88. procedure TestDropExternalFunction;
  89. end;
  90. { TTestGeneratorParser }
  91. TTestGeneratorParser = Class(TTestSQLParser)
  92. Published
  93. Procedure TestCreateGenerator;
  94. Procedure TestSetGenerator;
  95. end;
  96. { TTestRoleParser }
  97. TTestRoleParser = Class(TTestSQLParser)
  98. Published
  99. Procedure TestCreateRole;
  100. Procedure TestAlterRole;
  101. end;
  102. { TTestTypeParser }
  103. TTestTypeParser = Class(TTestSQLParser)
  104. private
  105. Published
  106. Procedure TestStringType1;
  107. procedure TestStringType2;
  108. procedure TestStringType3;
  109. procedure TestStringType4;
  110. procedure TestStringType5;
  111. procedure TestStringType6;
  112. procedure TestStringType7;
  113. procedure TestStringType8;
  114. procedure TestStringType9;
  115. procedure TestStringType10;
  116. procedure TestStringType11;
  117. procedure TestStringType12;
  118. procedure TestStringType13;
  119. procedure TestStringType14;
  120. Procedure TestStringType15;
  121. procedure TestStringType16;
  122. procedure TestStringType17;
  123. procedure TestStringType18;
  124. procedure TestStringType19;
  125. Procedure TestStringTypeErrors1;
  126. procedure TestStringTypeErrors2;
  127. procedure TestStringTypeErrors3;
  128. procedure TestTypeInt1;
  129. procedure TestTypeInt2;
  130. procedure TestTypeInt3;
  131. procedure TestTypeInt4;
  132. procedure TestTypeInt5;
  133. procedure TestNumerical1;
  134. procedure TestNumerical2;
  135. procedure TestNumerical3;
  136. procedure TestNumericalError1;
  137. procedure TestNumericalError2;
  138. procedure TestNumericalError3;
  139. procedure TestNumericalError4;
  140. procedure TestNumericalError5;
  141. procedure TestNumericalError6;
  142. procedure TestNumericalError7;
  143. procedure TestBlob1;
  144. procedure TestBlob2;
  145. procedure TestBlob3;
  146. procedure TestBlob4;
  147. procedure TestBlob5;
  148. procedure TestBlob6;
  149. procedure TestBlobError1;
  150. procedure TestBlobError2;
  151. procedure TestBlobError3;
  152. procedure TestBlobError4;
  153. procedure TestBlobError5;
  154. procedure TestBlobError6;
  155. procedure TestBlobError7;
  156. procedure TestSmallInt;
  157. procedure TestFloat;
  158. end;
  159. { TTestCheckParser }
  160. TTestCheckParser = Class (TTestSQLParser)
  161. private
  162. published
  163. procedure TestCheckNull;
  164. procedure TestCheckNotNull;
  165. procedure TestCheckBraces;
  166. procedure TestCheckBracesError;
  167. Procedure TestCheckParamError;
  168. procedure TestCheckIdentifierError;
  169. procedure TestIsEqual;
  170. procedure TestIsNotEqual1;
  171. procedure TestIsNotEqual2;
  172. procedure TestGreaterThan;
  173. procedure TestGreaterThanEqual1;
  174. procedure TestGreaterThanEqual2;
  175. procedure TestLessThan;
  176. procedure TestLessThanEqual1;
  177. procedure TestLessThanEqual2;
  178. procedure TestLike;
  179. procedure TestNotLike;
  180. procedure TestContaining;
  181. procedure TestNotContaining;
  182. procedure TestStarting;
  183. procedure TestNotStarting;
  184. procedure TestBetween;
  185. procedure TestNotBetween;
  186. procedure TestLikeEscape;
  187. procedure TestNotLikeEscape;
  188. Procedure TestAnd;
  189. procedure TestOr;
  190. procedure TestNotOr;
  191. end;
  192. { TTestDomainParser }
  193. // Most relevant tests are in type definition testing.
  194. TTestDomainParser = Class(TTestSQLParser)
  195. private
  196. Published
  197. Procedure TestSimpleDomain;
  198. Procedure TestSimpleDomainAs;
  199. Procedure TestNotNullDomain;
  200. procedure TestDefaultNotNullDomain;
  201. procedure TestAlterDomainDropDefault;
  202. procedure TestAlterDomainDropCheck;
  203. procedure TestAlterDomainDropCheckError;
  204. procedure TestAlterDomainAddCheck;
  205. procedure TestAlterDomainAddConstraintCheck;
  206. procedure TestAlterDomainAddConstraintError;
  207. procedure TestAlterDomainSetDefault;
  208. procedure TestAlterDomainRename;
  209. procedure TestAlterDomainNewType;
  210. procedure TestAlterDomainNewTypeError1;
  211. procedure TestAlterDomainNewTypeError2;
  212. end;
  213. { TTestExceptionParser }
  214. TTestExceptionParser = Class(TTestSQLParser)
  215. Published
  216. Procedure TestException;
  217. procedure TestAlterException;
  218. Procedure TestExceptionError1;
  219. procedure TestExceptionError2;
  220. end;
  221. { TTestIndexParser }
  222. TTestIndexParser = Class(TTestSQLParser)
  223. private
  224. Published
  225. procedure TestAlterindexActive;
  226. procedure TestAlterindexInactive;
  227. procedure TestCreateIndexSimple;
  228. procedure TestIndexIndexDouble;
  229. procedure TestCreateIndexAscending;
  230. procedure TestCreateIndexDescending;
  231. procedure TestCreateIndexUnique;
  232. procedure TestCreateIndexUniqueAscending;
  233. procedure TestCreateIndexUniqueDescending;
  234. procedure TestIndexError1;
  235. procedure TestIndexError2;
  236. procedure TestIndexError3;
  237. procedure TestIndexError4;
  238. procedure TestIndexError5;
  239. procedure TestIndexError6;
  240. end;
  241. { TTestTableParser }
  242. TTestTableParser = Class(TTestSQLParser)
  243. private
  244. procedure DoTestCreateReferencesField(Const ASource : String; AOnUpdate,AOnDelete : TForeignKeyAction);
  245. Published
  246. Procedure TestCreateOneSimpleField;
  247. procedure TestCreateTwoSimpleFields;
  248. procedure TestCreateOnePrimaryField;
  249. procedure TestCreateOneNamedPrimaryField;
  250. procedure TestCreateOneUniqueField;
  251. procedure TestCreateOneNamedUniqueField;
  252. procedure TestCreateNotNullPrimaryField;
  253. procedure TestCreateNotNullDefaultPrimaryField;
  254. procedure TestCreateComputedByField;
  255. procedure TestCreateCheckField;
  256. procedure TestCreateNamedCheckField;
  257. procedure TestCreateReferencesField;
  258. procedure TestCreateReferencesOnUpdateCascadeField;
  259. procedure TestCreateReferencesOnUpdateNoActionField;
  260. procedure TestCreateReferencesOnUpdateSetDefaultField;
  261. procedure TestCreateReferencesOnUpdateSetNullField;
  262. procedure TestCreateReferencesOnDeleteCascadeField;
  263. procedure TestCreateReferencesOnDeleteNoActionField;
  264. procedure TestCreateReferencesOnDeleteSetDefaultField;
  265. procedure TestCreateReferencesOnDeleteSetNullField;
  266. procedure TestCreateReferencesOnUpdateAndDeleteSetNullField;
  267. procedure TestCreateNamedReferencesField;
  268. procedure TestCreatePrimaryKeyConstraint;
  269. procedure TestCreateNamedPrimaryKeyConstraint;
  270. procedure TestCreateForeignKeyConstraint;
  271. procedure TestCreateNamedForeignKeyConstraint;
  272. procedure TestCreateUniqueConstraint;
  273. procedure TestCreateNamedUniqueConstraint;
  274. procedure TestCreateCheckConstraint;
  275. procedure TestCreateNamedCheckConstraint;
  276. Procedure TestAlterDropField;
  277. Procedure TestAlterDropFields;
  278. Procedure TestAlterDropConstraint;
  279. Procedure TestAlterDropConstraints;
  280. Procedure TestAlterRenameField;
  281. procedure TestAlterRenameColumnField;
  282. Procedure TestAlterFieldType;
  283. Procedure TestAlterFieldPosition;
  284. Procedure TestAlterAddField;
  285. Procedure TestAlterAddFields;
  286. Procedure TestAlterAddPrimarykey;
  287. Procedure TestAlterAddNamedPrimarykey;
  288. Procedure TestAlterAddCheckConstraint;
  289. procedure TestAlterAddNamedCheckConstraint;
  290. Procedure TestAlterAddForeignkey;
  291. Procedure TestAlterAddNamedForeignkey;
  292. end;
  293. { TTestDeleteParser }
  294. TTestDeleteParser = Class(TTestSQLParser)
  295. Private
  296. Function TestDelete(Const ASource , ATable: String) : TSQLDeleteStatement;
  297. Published
  298. Procedure TestSimpleDelete;
  299. Procedure TestSimpleDeleteAlias;
  300. Procedure TestDeleteWhereNull;
  301. end;
  302. { TTestUpdateParser }
  303. TTestUpdateParser = Class(TTestSQLParser)
  304. Private
  305. Function TestUpdate(Const ASource , ATable: String) : TSQLUpdateStatement;
  306. Published
  307. Procedure TestUpdateOneField;
  308. Procedure TestUpdateOneFieldFull;
  309. Procedure TestUpdateTwoFields;
  310. Procedure TestUpdateOneFieldWhereIsNull;
  311. end;
  312. { TTestInsertParser }
  313. TTestInsertParser = Class(TTestSQLParser)
  314. Private
  315. Function TestInsert(Const ASource , ATable: String) : TSQLInsertStatement;
  316. Published
  317. Procedure TestInsertOneField;
  318. procedure TestInsertTwoFields;
  319. Procedure TestInsertOneValue;
  320. procedure TestInsertTwoValues;
  321. end;
  322. { TTestSelectParser }
  323. TTestSelectParser = Class(TTestSQLParser)
  324. Private
  325. FSelect : TSQLSelectStatement;
  326. Function TestSelect(Const ASource : String) : TSQLSelectStatement;
  327. Procedure TestSelectError(Const ASource : String);
  328. Procedure DoExtractSimple(Expected : TSQLExtractElement);
  329. Property Select : TSQLSelectStatement Read FSelect;
  330. Published
  331. Procedure TestSelectOneFieldOneTable;
  332. Procedure TestSelectOneFieldOneTableTransaction;
  333. Procedure TestSelectOneArrayFieldOneTable;
  334. Procedure TestSelectTwoFieldsOneTable;
  335. procedure TestSelectOneFieldAliasOneTable;
  336. procedure TestSelectTwoFieldAliasesOneTable;
  337. Procedure TestSelectOneDistinctFieldOneTable;
  338. procedure TestSelectOneAllFieldOneTable;
  339. procedure TestSelectAsteriskOneTable;
  340. procedure TestSelectDistinctAsteriskOneTable;
  341. procedure TestSelectOneFieldOneTableAlias;
  342. procedure TestSelectTwoFieldsTwoTables;
  343. procedure TestSelectTwoFieldsTwoTablesJoin;
  344. procedure TestSelectTwoFieldsTwoInnerTablesJoin;
  345. procedure TestSelectTwoFieldsTwoLeftTablesJoin;
  346. procedure TestSelectTwoFieldsTwoOuterTablesJoin;
  347. procedure TestSelectTwoFieldsTwoRightTablesJoin;
  348. procedure TestSelectTwoFieldsThreeTablesJoin;
  349. procedure TestSelectTwoFieldsBracketThreeTablesJoin;
  350. procedure TestSelectTwoFieldsThreeBracketTablesJoin;
  351. Procedure TestAggregateCount;
  352. procedure TestAggregateCountAsterisk;
  353. procedure TestAggregateCountAll;
  354. procedure TestAggregateCountDistinct;
  355. procedure TestAggregateMax;
  356. procedure TestAggregateMaxAll;
  357. procedure TestAggregateMaxAsterisk;
  358. procedure TestAggregateMaxDistinct;
  359. procedure TestAggregateMin;
  360. procedure TestAggregateMinAll;
  361. procedure TestAggregateMinAsterisk;
  362. procedure TestAggregateMinDistinct;
  363. procedure TestAggregateSum;
  364. procedure TestAggregateSumAll;
  365. procedure TestAggregateSumAsterisk;
  366. procedure TestAggregateSumDistinct;
  367. procedure TestAggregateAvg;
  368. procedure TestAggregateAvgAll;
  369. procedure TestAggregateAvgAsterisk;
  370. procedure TestAggregateAvgDistinct;
  371. Procedure TestUpperConst;
  372. procedure TestUpperError;
  373. Procedure TestGenID;
  374. Procedure TestGenIDError1;
  375. Procedure TestGenIDError2;
  376. Procedure TestCastSimple;
  377. Procedure TestExtractSimple;
  378. procedure TestOrderByOneField;
  379. procedure TestOrderByTwoFields;
  380. procedure TestOrderByThreeFields;
  381. procedure TestOrderByOneDescField;
  382. procedure TestOrderByTwoDescFields;
  383. procedure TestOrderByThreeDescFields;
  384. procedure TestOrderByOneColumn;
  385. procedure TestOrderByTwoColumns;
  386. procedure TestOrderByTwoColumnsDesc;
  387. procedure TestOrderByCollate;
  388. procedure TestOrderByCollateDesc;
  389. procedure TestOrderByCollateDescTwoFields;
  390. procedure TestGroupByOne;
  391. procedure TestGroupByTwo;
  392. procedure TestHavingOne;
  393. Procedure TestUnionSimple;
  394. procedure TestUnionSimpleAll;
  395. procedure TestUnionSimpleOrderBy;
  396. Procedure TestUnionDouble;
  397. procedure TestUnionError1;
  398. procedure TestUnionError2;
  399. procedure TestPlanOrderNatural;
  400. procedure TestPlanOrderOrder;
  401. procedure TestPlanOrderIndex1;
  402. procedure TestPlanOrderIndex2;
  403. procedure TestPlanJoinNatural;
  404. procedure TestPlanDefaultNatural;
  405. procedure TestPlanMergeNatural;
  406. procedure TestPlanMergeNested;
  407. procedure TestSubSelect;
  408. procedure TestWhereExists;
  409. procedure TestWhereSingular;
  410. procedure TestWhereAll;
  411. procedure TestWhereAny;
  412. procedure TestWhereSome;
  413. Procedure TestParam;
  414. procedure TestParamExpr;
  415. end;
  416. { TTestRollBackParser }
  417. TTestRollBackParser = Class(TTestSQLParser)
  418. Private
  419. FRollback : TSQLRollbackStatement;
  420. Function TestRollback(Const ASource : String) : TSQLRollbackStatement;
  421. Procedure TestRollbackError(Const ASource : String);
  422. Property Rollback : TSQLRollbackStatement Read FRollback;
  423. Published
  424. Procedure TestRollback;
  425. Procedure TestRollbackWork;
  426. Procedure TestRollbackRelease;
  427. Procedure TestRollbackWorkRelease;
  428. Procedure TestRollbackTransaction;
  429. Procedure TestRollbackTransactionWork;
  430. Procedure TestRollbackTransactionRelease;
  431. Procedure TestRollbackTransactionWorkRelease;
  432. end;
  433. { TTestCommitParser }
  434. TTestCommitParser = Class(TTestSQLParser)
  435. Private
  436. FCommit : TSQLCommitStatement;
  437. Function TestCommit(Const ASource : String) : TSQLCommitStatement;
  438. Procedure TestCommitError(Const ASource : String);
  439. Property Commit : TSQLCommitStatement Read FCommit;
  440. Published
  441. Procedure TestCommit;
  442. Procedure TestCommitWork;
  443. Procedure TestCommitRelease;
  444. Procedure TestCommitWorkRelease;
  445. Procedure TestCommitTransaction;
  446. Procedure TestCommitTransactionWork;
  447. Procedure TestCommitTransactionRelease;
  448. Procedure TestCommitTransactionWorkRelease;
  449. Procedure TestCommitRetain;
  450. Procedure TestCommitWorkRetain;
  451. Procedure TestCommitReleaseRetain;
  452. Procedure TestCommitWorkReleaseRetain;
  453. Procedure TestCommitTransactionRetain;
  454. Procedure TestCommitTransactionWorkRetain;
  455. Procedure TestCommitTransactionReleaseRetain;
  456. Procedure TestCommitTransactionWorkReleaseRetain;
  457. procedure TestCommitRetainSnapShot;
  458. end;
  459. { TTestExecuteProcedureParser }
  460. TTestExecuteProcedureParser = Class(TTestSQLParser)
  461. Private
  462. FExecute : TSQLExecuteProcedureStatement;
  463. Function TestExecute(Const ASource : String) : TSQLExecuteProcedureStatement;
  464. Procedure TestExecuteError(Const ASource : String);
  465. Property Execute: TSQLExecuteProcedureStatement Read FExecute;
  466. Published
  467. Procedure TestExecuteSimple;
  468. Procedure TestExecuteSimpleTransaction;
  469. Procedure TestExecuteSimpleReturningValues;
  470. procedure TestExecuteSimpleReturning2Values;
  471. procedure TestExecuteOneArg;
  472. procedure TestExecuteOneArgNB;
  473. procedure TestExecuteTwoArgs;
  474. procedure TestExecuteTwoArgsNB;
  475. procedure TestExecuteOneArgSelect;
  476. procedure TestExecuteOneArgSelectNB;
  477. procedure TestExecuteTwoArgsSelect;
  478. procedure TestExecuteTwoArgsSelectNB;
  479. procedure TestExecuteOneArgSelectErr;
  480. procedure TestExecuteOneArgSelectErr2;
  481. procedure TestExecuteOneArgSelectErr3;
  482. procedure TestExecuteOneArgSelectErr4;
  483. end;
  484. { TTestConnectParser }
  485. TTestConnectParser = Class(TTestSQLParser)
  486. Private
  487. FConnect : TSQLConnectStatement;
  488. Function TestConnect(Const ASource : String) : TSQLConnectStatement;
  489. Procedure TestConnectError(Const ASource : String);
  490. Property Connect: TSQLConnectStatement Read FConnect;
  491. Published
  492. Procedure TestConnectSimple;
  493. Procedure TestConnectUser;
  494. procedure TestConnectPassword;
  495. procedure TestConnectUserPassword;
  496. procedure TestConnectUserPasswordRole;
  497. procedure TestConnectUserPasswordRoleCache;
  498. procedure TestConnectSimpleCache;
  499. end;
  500. { TTestCreateDatabaseParser }
  501. TTestCreateDatabaseParser = Class(TTestSQLParser)
  502. Private
  503. FCreateDB : TSQLCreateDatabaseStatement;
  504. Function TestCreate(Const ASource : String) : TSQLCreateDatabaseStatement;
  505. Procedure TestCreateError(Const ASource : String);
  506. Property CreateDB : TSQLCreateDatabaseStatement Read FCreateDB;
  507. published
  508. Procedure TestSimple;
  509. procedure TestSimpleSchema;
  510. procedure TestSimpleUSer;
  511. procedure TestSimpleUSerPassword;
  512. procedure TestSimplePassword;
  513. procedure TestPageSize;
  514. procedure TestPageSize2;
  515. procedure TestPageSizeLength;
  516. procedure TestPageSizeLength2;
  517. procedure TestPageSizeLength3;
  518. procedure TestPageSizeLength4;
  519. procedure TestCharset;
  520. procedure TestSecondaryFile1;
  521. procedure TestSecondaryFile2;
  522. procedure TestSecondaryFile3;
  523. procedure TestSecondaryFile4;
  524. procedure TestSecondaryFile5;
  525. procedure TestSecondaryFile6;
  526. procedure TestSecondaryFile7;
  527. procedure TestSecondaryFile8;
  528. procedure TestSecondaryFile9;
  529. procedure TestSecondaryFile10;
  530. procedure TestSecondaryFileS;
  531. procedure TestSecondaryFileError1;
  532. procedure TestSecondaryFileError2;
  533. procedure TestSecondaryFileError3;
  534. end;
  535. { TTestAlterDatabaseParser }
  536. TTestAlterDatabaseParser = Class(TTestSQLParser)
  537. Private
  538. FAlterDB : TSQLAlterDatabaseStatement;
  539. Function TestAlter(Const ASource : String) : TSQLAlterDatabaseStatement;
  540. Procedure TestAlterError(Const ASource : String);
  541. Property AlterDB : TSQLAlterDatabaseStatement Read FAlterDB;
  542. published
  543. Procedure TestSimple;
  544. procedure TestLength;
  545. procedure TestStarting;
  546. procedure TestStartingLength;
  547. procedure TestFiles;
  548. procedure TestFiles2;
  549. procedure TestError;
  550. procedure TestFilesError;
  551. end;
  552. { TTestCreateViewParser }
  553. TTestCreateViewParser = Class(TTestSQLParser)
  554. Private
  555. FView : TSQLCreateViewStatement;
  556. Function TestCreate(Const ASource : String) : TSQLCreateViewStatement;
  557. Procedure TestCreateError(Const ASource : String);
  558. Property View : TSQLCreateViewStatement Read FView;
  559. Published
  560. Procedure TestSimple;
  561. procedure TestFieldList;
  562. procedure TestFieldList2;
  563. procedure TestSimpleWithCheckoption;
  564. end;
  565. { TTestCreateShadowParser }
  566. TTestCreateShadowParser = Class(TTestSQLParser)
  567. Private
  568. FShadow : TSQLCreateShadowStatement;
  569. Function TestCreate(Const ASource : String) : TSQLCreateShadowStatement;
  570. Procedure TestCreateError(Const ASource : String);
  571. Property Shadow : TSQLCreateShadowStatement Read FShadow;
  572. published
  573. Procedure TestSimple;
  574. procedure TestLength;
  575. procedure TestLength2;
  576. procedure TestLength3;
  577. procedure TestLength4;
  578. procedure TestSecondaryFile1;
  579. procedure TestSecondaryFile2;
  580. procedure TestSecondaryFile3;
  581. procedure TestSecondaryFile4;
  582. procedure TestSecondaryFile5;
  583. procedure TestSecondaryFile6;
  584. procedure TestSecondaryFile7;
  585. procedure TestSecondaryFile8;
  586. procedure TestSecondaryFileS;
  587. end;
  588. { TTestProcedureStatement }
  589. TTestProcedureStatement = Class(TTestSQLParser)
  590. Private
  591. FStatement : TSQLStatement;
  592. procedure TestParseStatementError;
  593. Function TestStatement(Const ASource : String) : TSQLStatement;
  594. Procedure TestStatementError(Const ASource : String);
  595. Property Statement : TSQLStatement Read FStatement;
  596. Published
  597. Procedure TestException;
  598. Procedure TestExceptionError;
  599. Procedure TestExit;
  600. procedure TestSuspend;
  601. procedure TestEmptyBlock;
  602. procedure TestExitBlock;
  603. procedure TestExitBlockError;
  604. procedure TestPostEvent;
  605. procedure TestPostEventColName;
  606. procedure TestPostError;
  607. procedure TestAssignSimple;
  608. procedure TestAssignSimpleNew;
  609. procedure TestAssignSelect;
  610. procedure TestBlockAssignSimple;
  611. procedure TestIf;
  612. procedure TestIfBlock;
  613. procedure TestIfElse;
  614. procedure TestIfBlockElse;
  615. procedure TestIfElseError;
  616. procedure TestIfBlockElseBlock;
  617. procedure TestIfErrorBracketLeft;
  618. procedure TestIfErrorBracketRight;
  619. procedure TestIfErrorNoThen;
  620. procedure TestIfErrorSemicolonElse;
  621. procedure TestWhile;
  622. procedure TestWhileBlock;
  623. procedure TestWhileErrorBracketLeft;
  624. procedure TestWhileErrorBracketRight;
  625. procedure TestWhileErrorNoDo;
  626. procedure TestWhenAny;
  627. procedure TestWhenSQLCode;
  628. procedure TestWhenGDSCode;
  629. procedure TestWhenException;
  630. procedure TestWhenExceptionGDS;
  631. procedure TestWhenAnyBlock;
  632. procedure TestWhenErrorAny;
  633. procedure TestWhenErrorNoDo;
  634. procedure TestWhenErrorExceptionInt;
  635. procedure TestWhenErrorExceptionString;
  636. procedure TestWhenErrorSqlCode;
  637. procedure TestWhenErrorGDSCode;
  638. procedure TestExecuteStatement;
  639. procedure TestExecuteStatementReturningValues;
  640. procedure TestExecuteStatementReturningValuesColon;
  641. procedure TestExecuteStatementReturningValuesBrackets;
  642. procedure TestForSimple;
  643. procedure TestForSimpleNoColon;
  644. procedure TestForSimple2fields;
  645. procedure TestForBlock;
  646. end;
  647. { TTestCreateProcedureParser }
  648. TTestCreateProcedureParser = Class(TTestSQLParser)
  649. Private
  650. FStatement : TSQLCreateProcedureStatement;
  651. Function TestCreate(Const ASource : String) : TSQLCreateProcedureStatement;
  652. Procedure TestCreateError(Const ASource : String);
  653. Property Statement : TSQLCreateProcedureStatement Read FStatement;
  654. Published
  655. Procedure TestEmptyProcedure;
  656. procedure TestExitProcedure;
  657. procedure TestProcedureOneArgument;
  658. procedure TestProcedureTwoArguments;
  659. procedure TestProcedureOneReturnValue;
  660. procedure TestProcedureTwoReturnValues;
  661. procedure TestProcedureOneLocalVariable;
  662. procedure TestProcedureTwoLocalVariable;
  663. procedure TestProcedureInputOutputLocal;
  664. end;
  665. { TTestCreateTriggerParser }
  666. TTestCreateTriggerParser = Class(TTestSQLParser)
  667. Private
  668. FStatement : TSQLAlterCreateTriggerStatement;
  669. Function TestCreate(Const ASource : String) : TSQLCreateTriggerStatement;
  670. Function TestAlter(Const ASource : String) : TSQLAlterTriggerStatement;
  671. Procedure TestCreateError(Const ASource : String);
  672. Property Statement : TSQLAlterCreateTriggerStatement Read FStatement;
  673. Published
  674. Procedure TestEmptyTrigger;
  675. Procedure TestExitTrigger;
  676. procedure TestEmptyTriggerAfterUpdate;
  677. procedure TestEmptyTriggerBeforeDelete;
  678. procedure TestEmptyTriggerBeforeInsert;
  679. procedure TestEmptyTriggerBeforeInsertPosition1;
  680. procedure TestEmptyTriggerBeforeInsertPosition1inActive;
  681. procedure TestEmptyTriggerBeforeInsertPosition1Active;
  682. procedure TestTriggerOneLocalVariable;
  683. procedure TestTriggerTwoLocalVariables;
  684. procedure TestAlterTrigger;
  685. end;
  686. { TTestDeclareExternalFunctionParser }
  687. TTestDeclareExternalFunctionParser = Class(TTestSQLParser)
  688. Private
  689. FStatement : TSQLDeclareExternalFunctionStatement;
  690. Function TestCreate(Const ASource : String) : TSQLDeclareExternalFunctionStatement;
  691. Procedure TestCreateError(Const ASource : String);
  692. Property Statement : TSQLDeclareExternalFunctionStatement Read FStatement;
  693. Published
  694. Procedure TestEmptyfunction;
  695. Procedure TestEmptyfunctionByValue;
  696. procedure TestCStringfunction;
  697. procedure TestCStringFreeItfunction;
  698. procedure TestOneArgumentFunction;
  699. procedure TestTwoArgumentsFunction;
  700. end;
  701. implementation
  702. uses typinfo;
  703. { --------------------------------------------------------------------
  704. TTestParser
  705. --------------------------------------------------------------------}
  706. procedure TTestParser.ParseStringDef(Out DT: TSQLDataType; Out Len: Integer; Out ACharset : TSQLStringtype);
  707. begin
  708. ParseCharTypeDefinition(DT,Len,ACharset);
  709. end;
  710. function TTestParser.ParseType(Flags: TParseTypeFlags): TSQLTypeDefinition;
  711. begin
  712. Result:=ParseTypeDefinition(Nil,Flags);
  713. end;
  714. function TTestParser.ParseConstraint: TSQLExpression;
  715. begin
  716. // GetNextToken;
  717. Result:=ParseCheckConstraint(Nil);
  718. end;
  719. function TTestParser.ParseProcedureStatements: TSQLStatement;
  720. begin
  721. Result:=Self.ParseProcedureStatement(Nil);
  722. end;
  723. { --------------------------------------------------------------------
  724. TTestSQLParser
  725. --------------------------------------------------------------------}
  726. procedure TTestSQLParser.SetUp;
  727. begin
  728. end;
  729. procedure TTestSQLParser.TearDown;
  730. begin
  731. FreeAndNil(FParser);
  732. FreeAndNil(FSource);
  733. FreeAndNil(FToFree);
  734. end;
  735. procedure TTestSQLParser.CreateParser(const ASource: string);
  736. begin
  737. FSource:=TStringStream.Create(ASource);
  738. FParser:=TTestParser.Create(FSource);
  739. end;
  740. Function TTestSQLParser.CheckClass(E: TSQLElement; C: TSQLElementClass) : TSQLElement;
  741. begin
  742. AssertEquals(C,E.ClassType);
  743. Result:=E;
  744. end;
  745. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected, Actual: TSQLToken);
  746. Var
  747. NE,NA : String;
  748. begin
  749. NE:=GetEnumName(TypeInfo(TSQLToken),Ord(Expected));
  750. NA:=GetEnumName(TypeInfo(TSQLToken),Ord(Actual));
  751. AssertEquals(AMessage,NE,NA);
  752. end;
  753. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  754. Actual: TSQLBinaryOperation);
  755. Var
  756. NE,NA : String;
  757. begin
  758. NE:=GetEnumName(TypeInfo(TSQLBinaryOperation),Ord(Expected));
  759. NA:=GetEnumName(TypeInfo(TSQLBinaryOperation),Ord(Actual));
  760. AssertEquals(AMessage,NE,NA);
  761. end;
  762. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  763. Actual: TSQLUnaryoperation);
  764. Var
  765. NE,NA : String;
  766. begin
  767. NE:=GetEnumName(TypeInfo(TSQLUnaryOperation),Ord(Expected));
  768. NA:=GetEnumName(TypeInfo(TSQLUnaryOperation),Ord(Actual));
  769. AssertEquals(AMessage,NE,NA);
  770. end;
  771. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  772. Actual: TSQLternaryoperation);
  773. Var
  774. NE,NA : String;
  775. begin
  776. NE:=GetEnumName(TypeInfo(TSQLTernaryOperation),Ord(Expected));
  777. NA:=GetEnumName(TypeInfo(TSQLTernaryOperation),Ord(Actual));
  778. AssertEquals(AMessage,NE,NA);
  779. end;
  780. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected, Actual: TSQLDataType);
  781. Var
  782. NE,NA : String;
  783. begin
  784. NE:=GetEnumName(TypeInfo(TSQLDataType),Ord(Expected));
  785. NA:=GetEnumName(TypeInfo(TSQLDataType),Ord(Actual));
  786. AssertEquals(AMessage,NE,NA);
  787. end;
  788. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  789. Actual: TForeignKeyAction);
  790. Var
  791. NE,NA : String;
  792. begin
  793. NE:=GetEnumName(TypeInfo(TForeignKeyAction),Ord(Expected));
  794. NA:=GetEnumName(TypeInfo(TForeignKeyAction),Ord(Actual));
  795. AssertEquals(AMessage,NE,NA);
  796. end;
  797. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  798. Actual: TSQLJoinType);
  799. Var
  800. NE,NA : String;
  801. begin
  802. NE:=GetEnumName(TypeInfo(TSQLJoinType),Ord(Expected));
  803. NA:=GetEnumName(TypeInfo(TSQLJoinType),Ord(Actual));
  804. AssertEquals(AMessage,NE,NA);
  805. end;
  806. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  807. Actual: TSQLAggregateFunction);
  808. Var
  809. NE,NA : String;
  810. begin
  811. NE:=GetEnumName(TypeInfo(TSQLAggregateFunction),Ord(Expected));
  812. NA:=GetEnumName(TypeInfo(TSQLAggregateFunction),Ord(Actual));
  813. AssertEquals(AMessage,NE,NA);
  814. end;
  815. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  816. Actual: TSQLAggregateOption);
  817. Var
  818. NE,NA : String;
  819. begin
  820. NE:=GetEnumName(TypeInfo(TSQLAggregateOption),Ord(Expected));
  821. NA:=GetEnumName(TypeInfo(TSQLAggregateOption),Ord(Actual));
  822. AssertEquals(AMessage,NE,NA);
  823. end;
  824. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  825. Actual: TSQLOrderDirection);
  826. Var
  827. NE,NA : String;
  828. begin
  829. NE:=GetEnumName(TypeInfo(TSQLOrderDirection),Ord(Expected));
  830. NA:=GetEnumName(TypeInfo(TSQLOrderDirection),Ord(Actual));
  831. AssertEquals(AMessage,NE,NA);
  832. end;
  833. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  834. Actual: TPlanJoinType);
  835. Var
  836. NE,NA : String;
  837. begin
  838. NE:=GetEnumName(TypeInfo(TPlanJoinType),Ord(Expected));
  839. NA:=GetEnumName(TypeInfo(TPlanJoinType),Ord(Actual));
  840. AssertEquals(AMessage,NE,NA);
  841. end;
  842. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  843. Actual: TTriggerMoment);
  844. Var
  845. NE,NA : String;
  846. begin
  847. NE:=GetEnumName(TypeInfo(TTriggerMoment),Ord(Expected));
  848. NA:=GetEnumName(TypeInfo(TTriggerMoment),Ord(Actual));
  849. AssertEquals(AMessage,NE,NA);
  850. end;
  851. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  852. Actual: TTriggerState);
  853. Var
  854. NE,NA : String;
  855. begin
  856. NE:=GetEnumName(TypeInfo(TTriggerState),Ord(Expected));
  857. NA:=GetEnumName(TypeInfo(TTriggerState),Ord(Actual));
  858. AssertEquals(AMessage,NE,NA);
  859. end;
  860. procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
  861. Actual: TTriggerOperations);
  862. Var
  863. NE,NA : String;
  864. begin
  865. If Expected<>Actual then
  866. Fail(Amessage)
  867. end;
  868. Function TTestSQLParser.AssertLiteralExpr(const AMessage: String;
  869. Element: TSQLExpression; ALiteralClass: TSQLElementClass) : TSQLLiteral;
  870. begin
  871. CheckClass(Element,TSQLLiteralExpression);
  872. Result:=TSQLLiteral(Checkclass(TSQLLiteralExpression(Element).Literal,ALiteralClass));
  873. end;
  874. procedure TTestSQLParser.AssertIdentifierName(const AMessage : String;
  875. const AExpected: String; Element: TSQLElement);
  876. begin
  877. AssertNotNull(AMessage+': Have identifier ',Element);
  878. CheckClass(Element,TSQLidentifierName);
  879. AssertEquals(AMessage+': Correct identifier name',AExpected,TSQLidentifierName(Element).Name);
  880. end;
  881. procedure TTestSQLParser.AssertField(AField: TSQLElement; const AName: String;
  882. const AAlias: String);
  883. Var
  884. F : TSQLSelectField;
  885. E : TSQLidentifierExpression;
  886. begin
  887. AssertNotNull('Have field',AField);
  888. F:=TSQLSelectField(CheckClass(AField,TSQLSelectField));
  889. AssertNotNull('Have field expresssion,',F.Expression);
  890. E:=TSQLidentifierExpression(CheckClass(F.Expression,TSQLidentifierExpression));
  891. AssertIdentifierName('Correct field name',AName,E.Identifier);
  892. If (AAlias<>'') then
  893. AssertIdentifierName('Correct alias',AALias,F.AliasName);
  894. end;
  895. procedure TTestSQLParser.AssertAggregate(AField: TSQLElement;
  896. AAgregate: TSQLAggregateFunction; const AFieldName: String;
  897. AOption: TSQLAggregateOption; const AAlias: String);
  898. Var
  899. F : TSQLSelectField;
  900. begin
  901. AssertNotNull('Have field',AField);
  902. F:=TSQLSelectField(CheckClass(AField,TSQLSelectField));
  903. AssertNotNull('Have field expresssion,',F.Expression);
  904. AssertAggregateExpression(F.Expression,AAgregate,AFieldName,AOption);
  905. If (AAlias<>'') then
  906. AssertIdentifierName('Correct alias',AALias,F.AliasName);
  907. end;
  908. procedure TTestSQLParser.AssertAggregateExpression(E: TSQLElement;
  909. AAgregate: TSQLAggregateFunction; const AFieldName: String;
  910. AOption: TSQLAggregateOption);
  911. Var
  912. AF : TSQLAggregateFunctionExpression;
  913. I : TSQLIdentifierExpression;
  914. begin
  915. AF:=TSQLAggregateFunctionExpression(CheckClass(E,TSQLAggregateFunctionExpression));
  916. AssertEquals('Correct function',AAgregate,AF.Aggregate);
  917. AssertEquals('Correct function',AOption,AF.Option);
  918. If (AFieldName<>'') then
  919. begin
  920. I:=TSQLIdentifierExpression(CheckClass(AF.Expression, TSQLIdentifierExpression));
  921. AssertIdentifierName('Correct field name',AFieldName,I.Identifier);
  922. end;
  923. end;
  924. procedure TTestSQLParser.AssertTable(ATable: TSQLElement; const AName: String;
  925. const AAlias: String);
  926. Var
  927. T : TSQLSimpleTablereference;
  928. begin
  929. AssertNotNull('Have table',ATable);
  930. T:=TSQLSimpleTablereference(CheckClass(ATable,TSQLSimpleTablereference));
  931. AssertIdentifierName('Correct table name',AName,T.ObjectName);
  932. If (AAlias<>'') then
  933. AssertIdentifierName('Correct alias',AALias,T.AliasName);
  934. end;
  935. function TTestSQLParser.AssertJoin(AJoin: TSQLElement; const AFirst,
  936. ASecond: String; const ajointype: TSQLJoinType):TSQLJoinTableReference;
  937. Var
  938. J : TSQLJoinTableReference;
  939. begin
  940. AssertNotNull('Have join',AJoin);
  941. J:=TSQLJoinTableReference(CheckClass(AJoin,TSQLJoinTableReference));
  942. if (AFirst<>'') then
  943. AssertTable(J.Left,AFirst,'');
  944. if (ASecond<>'') then
  945. AssertTable(J.Right,ASecond,'');
  946. AssertEquals('Correct join type',AJoinType,J.JoinType);
  947. Result:=J;
  948. end;
  949. function TTestSQLParser.AssertJoinOn(AJoin: TSQLExpression; const AFirst,
  950. ASecond: String; const AOperation: TSQLBinaryOperation): TSQLBinaryExpression;
  951. Var
  952. I : TSQLIdentifierExpression;
  953. begin
  954. Result:=TSQLBinaryExpression(CheckClass(AJoin,TSQLBinaryExpression));
  955. AssertEquals('Correct ON operation',AOperation,Result.Operation);
  956. I:=TSQLIdentifierExpression(CheckClass(Result.Left,TSQLIdentifierExpression));
  957. AssertIdentifierName('Left field name',AFirst,I.Identifier);
  958. I:=TSQLIdentifierExpression(CheckClass(Result.Right,TSQLIdentifierExpression));
  959. AssertIdentifierName('Right field name',ASecond,I.Identifier);
  960. end;
  961. function TTestSQLParser.AssertOrderBy(AOrderBy: TSQLElement;
  962. const AField: String; const ANumber: Integer; const AOrdering: TSQLOrderDirection
  963. ): TSQLOrderByElement;
  964. Var
  965. I : TSQLIntegerLiteral;
  966. begin
  967. Result:=TSQLOrderByElement(CheckClass(AorderBy,TSQLOrderByElement));
  968. If (AField<>'') then
  969. AssertIdentifierName('Correct order by field',AField,Result.Field)
  970. else if (ANumber>0) then
  971. begin
  972. I:=TSQLIntegerLiteral(CheckClass(Result.Field,TSQLIntegerLiteral));
  973. AssertEquals('Correct order by column number',ANumber,I.Value);
  974. end;
  975. AssertEquals('Correct ordering',AOrdering,Result.OrderBy);
  976. end;
  977. function TTestSQLParser.AssertSecondaryFile(ASecondaryFile: TSQLElement;
  978. const AFile: String; const ALength, AStart: Integer): TSQLDatabaseFileInfo;
  979. begin
  980. Result:=TSQLDatabaseFileInfo(CheckClass(ASecondaryFile,TSQLDatabaseFileInfo));
  981. AssertEquals('Secondary file name',AFile,Result.FileName);
  982. AssertEquals('Secondary file length',ALength,Result.Length);
  983. AssertEquals('Secondary file start',AStart,Result.StartPage);
  984. end;
  985. procedure TTestSQLParser.TestTypeError;
  986. begin
  987. TestType(FErrSource,[],sdtInteger);
  988. end;
  989. procedure TTestSQLParser.TestStringError;
  990. begin
  991. TestStringDef(FErrSource,sdtchar,0);
  992. end;
  993. procedure TTestSQLParser.TestCheckError;
  994. begin
  995. TestCheck(FErrSource,TSQLExpression);
  996. end;
  997. procedure TTestSQLParser.TestParseError;
  998. begin
  999. CreateParser(FErrSource);
  1000. FToFree:=Parser.Parse;
  1001. end;
  1002. Procedure TTestSQLParser.TestStringDef(ASource : String; ExpectDT : TSQLDataType; ExpectLen : Integer; ExpectCharset : TSQLStringType='');
  1003. Var
  1004. Dt : TSQLDataType;
  1005. L : integer;
  1006. cs : TSQLStringType;
  1007. begin
  1008. CreateParser(ASOURCE);
  1009. Parser.GetNextToken;
  1010. Parser.ParseStringDef(dt,l,cs);
  1011. AssertEquals('Datatype is CHAR',ExpectDT,Dt);
  1012. AssertEquals('Length is 1',ExpectLen,l);
  1013. AssertEquals('End of Stream reached',tsqlEOF,Parser.CurrentToken);
  1014. AssertEquals('Correct character set',ExpectCharset,CS);
  1015. end;
  1016. Function TTestSQLParser.TestType(ASource : string; AFlags : TParseTypeFlags; AExpectedType : TSQLDataType) : TSQLTypeDefinition;
  1017. begin
  1018. CreateParser(ASource);
  1019. FToFree:=Parser.ParseType(AFlags);
  1020. AssertNotNull('ParseType returns result',FToFree);
  1021. CheckClass(FTofree,TSQLTypeDefinition);
  1022. Result:=TSQLTypeDefinition(FToFree);
  1023. AssertEquals('Type definition has correct data type',AExpectedType,Result.Datatype);
  1024. end;
  1025. function TTestSQLParser.TestCheck(ASource: string; AExpectedConstraint: TSQLElementClass
  1026. ): TSQLExpression;
  1027. begin
  1028. CreateParser('('+ASource+')');
  1029. FToFree:=Parser.ParseConstraint();
  1030. AssertNotNull('ParseType returns result',FToFree);
  1031. CheckClass(FTofree,AExpectedConstraint);
  1032. Result:=TSQLExpression(FToFree);
  1033. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1034. end;
  1035. procedure TTestSQLParser.AssertTypeDefaults(TD : TSQLTypeDefinition;Len : Integer = 0);
  1036. begin
  1037. AssertNull(TD.DefaultValue);
  1038. AssertNull(TD.Check);
  1039. AssertNull(TD.Collation);
  1040. AssertEquals('Array dim 0',0,TD.ArrayDim);
  1041. AssertEquals('Blob type 0',0,TD.BlobType);
  1042. AssertEquals('Not required',False,TD.NotNull);
  1043. AssertEquals('Length',Len,TD.Len);
  1044. end;
  1045. procedure TTestSQLParser.TestDropStatement(const ASource: string;
  1046. C: TSQLElementClass);
  1047. Var
  1048. D : TSQLDropStatement;
  1049. begin
  1050. If ASOURCE='SHADOW' then
  1051. CreateParser('DROP '+ASource+' 1')
  1052. else
  1053. CreateParser('DROP '+ASource+' A');
  1054. FToFree:=Parser.Parse;
  1055. AssertNotNull('Parse returns result',FTofree);
  1056. If Not FToFree.InheritsFrom(TSQLDropStatement) then
  1057. Fail('Drop statement is not of type TSQLDropStatement');
  1058. CheckClass(FToFree ,C);
  1059. D:=TSQLDropStatement(FToFree);
  1060. If ASOURCE='SHADOW' then
  1061. AssertIdentifierName('object name','1',D.ObjectName)
  1062. else
  1063. AssertIdentifierName('object name','A',D.ObjectName);
  1064. end;
  1065. function TTestSQLParser.TestCreateStatement(const ASource,AName: string;
  1066. C: TSQLElementClass): TSQLCreateOrAlterStatement;
  1067. begin
  1068. CreateParser(ASource);
  1069. FToFree:=Parser.Parse;
  1070. AssertNotNull('Parse returns result',FTofree);
  1071. If Not FToFree.InheritsFrom(TSQLCreateOrAlterStatement) then
  1072. Fail('create statement is not of type TSQLCreateOrAlterStatement');
  1073. CheckClass(FToFree ,C);
  1074. Result:=TSQLCreateOrAlterStatement(FToFree);
  1075. AssertIdentifierName('Correct identifier',AName,Result.ObjectName);
  1076. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1077. end;
  1078. { --------------------------------------------------------------------
  1079. TTestDropParser
  1080. --------------------------------------------------------------------}
  1081. procedure TTestDropParser.TestDropDatabase;
  1082. begin
  1083. TestDropStatement('DATABASE',TSQLDropDatabaseStatement);
  1084. end;
  1085. procedure TTestDropParser.TestDropDomain;
  1086. begin
  1087. TestDropStatement('DOMAIN',TSQLDropDomainStatement);
  1088. end;
  1089. procedure TTestDropParser.TestDropException;
  1090. begin
  1091. TestDropStatement('EXCEPTION',TSQLDropExceptionStatement);
  1092. end;
  1093. procedure TTestDropParser.TestDropGenerator;
  1094. begin
  1095. TestDropStatement('GENERATOR',TSQLDropGeneratorStatement);
  1096. end;
  1097. procedure TTestDropParser.TestDropIndex;
  1098. begin
  1099. TestDropStatement('INDEX',TSQLDropIndexStatement);
  1100. end;
  1101. procedure TTestDropParser.TestDropProcedure;
  1102. begin
  1103. TestDropStatement('PROCEDURE',TSQLDropProcedureStatement);
  1104. end;
  1105. procedure TTestDropParser.TestDropRole;
  1106. begin
  1107. TestDropStatement('ROLE',TSQLDropRoleStatement);
  1108. end;
  1109. procedure TTestDropParser.TestDropTable;
  1110. begin
  1111. TestDropStatement('TABLE',TSQLDropTableStatement);
  1112. end;
  1113. procedure TTestDropParser.TestDropTrigger;
  1114. begin
  1115. TestDropStatement('TRIGGER',TSQLDropTriggerStatement);
  1116. end;
  1117. procedure TTestDropParser.TestDropView;
  1118. begin
  1119. TestDropStatement('VIEW',TSQLDropViewStatement);
  1120. end;
  1121. procedure TTestDropParser.TestDropShadow;
  1122. begin
  1123. TestDropStatement('SHADOW',TSQLDropShadowStatement);
  1124. end;
  1125. procedure TTestDropParser.TestDropExternalFunction;
  1126. begin
  1127. TestDropStatement('EXTERNAL FUNCTION',TSQLDropExternalFunctionStatement);
  1128. end;
  1129. { --------------------------------------------------------------------
  1130. TTestGeneratorParser
  1131. --------------------------------------------------------------------}
  1132. procedure TTestGeneratorParser.TestCreateGenerator;
  1133. begin
  1134. TestCreateStatement('CREATE GENERATOR A','A',TSQLCreateGeneratorStatement);
  1135. end;
  1136. procedure TTestGeneratorParser.TestSetGenerator;
  1137. Var
  1138. S : TSQLSetGeneratorStatement;
  1139. begin
  1140. CreateParser('SET GENERATOR A TO 1');
  1141. FToFree:=Parser.Parse;
  1142. S:=TSQLSetGeneratorStatement(CheckClass(FToFree,TSQLSetGeneratorStatement));
  1143. AssertIdentifierName('Correct generator name','A',S.Objectname);
  1144. AssertEquals('New value',1,S.NewValue);
  1145. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1146. end;
  1147. { --------------------------------------------------------------------
  1148. TTestTypeParser
  1149. --------------------------------------------------------------------}
  1150. procedure TTestTypeParser.TestStringType1;
  1151. begin
  1152. TestStringDef('CHAR(1)',sdtChar,1);
  1153. end;
  1154. procedure TTestTypeParser.TestStringType2;
  1155. begin
  1156. TestStringDef('CHAR',sdtChar,0);
  1157. end;
  1158. procedure TTestTypeParser.TestStringType3;
  1159. begin
  1160. TestStringDef('CHARACTER',sdtChar,0);
  1161. end;
  1162. procedure TTestTypeParser.TestStringType4;
  1163. begin
  1164. TestStringDef('CHARACTER VARYING',sdtVarChar,0);
  1165. end;
  1166. procedure TTestTypeParser.TestStringType5;
  1167. begin
  1168. TestStringDef('VARCHAR',sdtVarChar,0);
  1169. end;
  1170. procedure TTestTypeParser.TestStringType6;
  1171. begin
  1172. TestStringDef('VARCHAR(2)',sdtVarChar,2);
  1173. end;
  1174. procedure TTestTypeParser.TestStringType7;
  1175. begin
  1176. TestStringDef('CHARACTER VARYING (2)',sdtVarChar,2);
  1177. end;
  1178. procedure TTestTypeParser.TestStringType8;
  1179. begin
  1180. TestStringDef('NATIONAL CHARACTER VARYING (2)',sdtNVarChar,2);
  1181. end;
  1182. procedure TTestTypeParser.TestStringType9;
  1183. begin
  1184. TestStringDef('NATIONAL CHARACTER (2)',sdtNChar,2);
  1185. end;
  1186. procedure TTestTypeParser.TestStringType10;
  1187. begin
  1188. TestStringDef('NATIONAL CHARACTER',sdtNChar,0);
  1189. end;
  1190. procedure TTestTypeParser.TestStringType11;
  1191. begin
  1192. TestStringDef('NATIONAL CHARACTER VARYING',sdtNVarChar,0);
  1193. end;
  1194. procedure TTestTypeParser.TestStringType12;
  1195. begin
  1196. TestStringDef('NCHAR',sdtNChar,0);
  1197. end;
  1198. procedure TTestTypeParser.TestStringType13;
  1199. begin
  1200. TestStringDef('NCHAR(2)',sdtNChar,2);
  1201. end;
  1202. procedure TTestTypeParser.TestStringType14;
  1203. begin
  1204. TestStringDef('NCHAR VARYING(2)',sdtNVarChar,2);
  1205. end;
  1206. procedure TTestTypeParser.TestStringType15;
  1207. begin
  1208. TestStringDef('CHAR (15) CHARACTER SET UTF8',sdtChar,15,'UTF8');
  1209. end;
  1210. procedure TTestTypeParser.TestStringType16;
  1211. begin
  1212. TestStringDef('CHAR VARYING (15) CHARACTER SET UTF8',sdtVarChar,15,'UTF8');
  1213. end;
  1214. procedure TTestTypeParser.TestStringType17;
  1215. begin
  1216. TestStringDef('CHAR VARYING CHARACTER SET UTF8',sdtVarChar,0,'UTF8');
  1217. end;
  1218. procedure TTestTypeParser.TestStringType18;
  1219. begin
  1220. TestStringDef('CHARACTER CHARACTER SET UTF8',sdtChar,0,'UTF8');
  1221. end;
  1222. procedure TTestTypeParser.TestStringType19;
  1223. Var
  1224. T : TSQLTypeDefinition;
  1225. begin
  1226. T:=TestType('CHAR(10) COLLATE UTF8',[],sdtChar);
  1227. AssertNotNull('Have collation',T.Collation);
  1228. AssertEquals('Correct collation','UTF8',T.Collation.Name);
  1229. end;
  1230. procedure TTestTypeParser.TestStringTypeErrors1;
  1231. begin
  1232. FErrSource:='VARCHAR VARYING';
  1233. AssertException(ESQLParser,@TestStringError);
  1234. end;
  1235. procedure TTestTypeParser.TestStringTypeErrors2;
  1236. begin
  1237. FErrSource:='CHAR(A)';
  1238. AssertException(ESQLParser,@TestStringError);
  1239. end;
  1240. procedure TTestTypeParser.TestStringTypeErrors3;
  1241. begin
  1242. FErrSource:='CHAR(1]';
  1243. AssertException(ESQLParser,@TestStringError);
  1244. end;
  1245. procedure TTestTypeParser.TestTypeInt1;
  1246. Var
  1247. TD : TSQLTypeDefinition;
  1248. begin
  1249. TD:=TestType('INT',[],sdtInteger);
  1250. AssertTypeDefaults(TD);
  1251. end;
  1252. procedure TTestTypeParser.TestTypeInt2;
  1253. Var
  1254. TD : TSQLTypeDefinition;
  1255. begin
  1256. TD:=TestType('INT DEFAULT NULL',[],sdtInteger);
  1257. AssertNotNull('Have Default value',TD.DefaultValue);
  1258. CheckClass(TD.DefaultValue,TSQLNullLiteral);
  1259. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1260. end;
  1261. procedure TTestTypeParser.TestTypeInt3;
  1262. Var
  1263. TD : TSQLTypeDefinition;
  1264. begin
  1265. TD:=TestType('INT DEFAULT 1',[],sdtInteger);
  1266. AssertNotNull('Have Default value',TD.DefaultValue);
  1267. CheckClass(TD.DefaultValue,TSQLIntegerLiteral);
  1268. AssertEquals('Correct default value ',1,TSQLIntegerLiteral(TD.DefaultValue).Value);
  1269. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1270. end;
  1271. procedure TTestTypeParser.TestTypeInt4;
  1272. Var
  1273. TD : TSQLTypeDefinition;
  1274. begin
  1275. TD:=TestType('INT NOT NULL',[],sdtInteger);
  1276. AssertNull('No Default value',TD.DefaultValue);
  1277. AssertEquals('Required field',True,TD.NotNull);
  1278. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1279. end;
  1280. procedure TTestTypeParser.TestTypeInt5;
  1281. Var
  1282. TD : TSQLTypeDefinition;
  1283. begin
  1284. TD:=TestType('INT [3]',[],sdtInteger);
  1285. AssertEquals('Array of length 3',3,TD.ArrayDim);
  1286. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  1287. end;
  1288. procedure TTestTypeParser.TestNumerical1;
  1289. Var
  1290. TD : TSQLTypeDefinition;
  1291. begin
  1292. TD:=TestType('NUMERIC (10)',[],sdtNumeric);
  1293. AssertEquals('Correct length',10,TD.Len);
  1294. end;
  1295. procedure TTestTypeParser.TestNumerical2;
  1296. Var
  1297. TD : TSQLTypeDefinition;
  1298. begin
  1299. TD:=TestType('NUMERIC (10,3)',[],sdtNumeric);
  1300. AssertEquals('Correct length',10,TD.Len);
  1301. AssertEquals('Correct scale',3,TD.Scale);
  1302. end;
  1303. procedure TTestTypeParser.TestNumerical3;
  1304. Var
  1305. TD : TSQLTypeDefinition;
  1306. begin
  1307. TD:=TestType('NUMERIC',[],sdtNumeric);
  1308. AssertEquals('Correct length',0,TD.Len);
  1309. AssertEquals('Correct scale',0,TD.Scale);
  1310. end;
  1311. procedure TTestTypeParser.TestNumericalError1;
  1312. begin
  1313. FErrSource:='NUMERIC ()';
  1314. AssertException(ESQLParser,@TestTypeError);
  1315. end;
  1316. procedure TTestTypeParser.TestNumericalError2;
  1317. begin
  1318. FErrSource:='NUMERIC (A)';
  1319. AssertException(ESQLParser,@TestTypeError);
  1320. end;
  1321. procedure TTestTypeParser.TestNumericalError3;
  1322. begin
  1323. FErrSource:='NUMERIC (,1)';
  1324. AssertException(ESQLParser,@TestTypeError);
  1325. end;
  1326. procedure TTestTypeParser.TestNumericalError4;
  1327. begin
  1328. FErrSource:='NUMERIC (1,)';
  1329. AssertException(ESQLParser,@TestTypeError);
  1330. end;
  1331. procedure TTestTypeParser.TestNumericalError5;
  1332. begin
  1333. FErrSource:='NUMERIC (1';
  1334. AssertException(ESQLParser,@TestTypeError);
  1335. end;
  1336. procedure TTestTypeParser.TestNumericalError6;
  1337. begin
  1338. FErrSource:='NUMERIC (1,';
  1339. AssertException(ESQLParser,@TestTypeError);
  1340. end;
  1341. procedure TTestTypeParser.TestNumericalError7;
  1342. begin
  1343. FErrSource:='NUMERIC (1 NOT';
  1344. AssertException(ESQLParser,@TestTypeError);
  1345. end;
  1346. procedure TTestTypeParser.TestBlob1;
  1347. Var
  1348. TD : TSQLTypeDefinition;
  1349. begin
  1350. TD:=TestType('BLOB sub_type 1 SEGMENT SIZE 80 CHARACTER SET UTF8',[],sdtBlob);
  1351. AssertEquals('Blob type 1',1,TD.BlobType);
  1352. AssertEquals('Blob segment size',80,TD.Len);
  1353. AssertEquals('Character set','UTF8',TD.Charset);
  1354. end;
  1355. procedure TTestTypeParser.TestBlob2;
  1356. Var
  1357. TD : TSQLTypeDefinition;
  1358. begin
  1359. TD:=TestType('BLOB (80,1) CHARACTER SET UTF8',[],sdtBlob);
  1360. AssertEquals('Blob type 1',1,TD.BlobType);
  1361. AssertEquals('Blob segment size',80,TD.Len);
  1362. AssertEquals('Character set','UTF8',TD.Charset);
  1363. end;
  1364. procedure TTestTypeParser.TestBlob3;
  1365. Var
  1366. TD : TSQLTypeDefinition;
  1367. begin
  1368. TD:=TestType('BLOB SEGMENT SIZE 80',[],sdtBlob);
  1369. AssertEquals('Blob type 0',0,TD.BlobType);
  1370. AssertEquals('Blob segment size',80,TD.Len);
  1371. AssertEquals('Character set','',TD.Charset);
  1372. end;
  1373. procedure TTestTypeParser.TestBlob4;
  1374. Var
  1375. TD : TSQLTypeDefinition;
  1376. begin
  1377. TD:=TestType('BLOB SUB_TYPE 1',[],sdtBlob);
  1378. AssertEquals('Blob type 1',1,TD.BlobType);
  1379. AssertEquals('Blob segment size',0,TD.Len);
  1380. AssertEquals('Character set','',TD.Charset);
  1381. end;
  1382. procedure TTestTypeParser.TestBlob5;
  1383. Var
  1384. TD : TSQLTypeDefinition;
  1385. begin
  1386. TD:=TestType('BLOB (80)',[],sdtBlob);
  1387. AssertEquals('Blob type 0',0,TD.BlobType);
  1388. AssertEquals('Blob segment size',80,TD.Len);
  1389. AssertEquals('Character set','',TD.Charset);
  1390. end;
  1391. procedure TTestTypeParser.TestBlob6;
  1392. Var
  1393. TD : TSQLTypeDefinition;
  1394. begin
  1395. TD:=TestType('BLOB',[],sdtBlob);
  1396. AssertEquals('Blob type 0',0,TD.BlobType);
  1397. AssertEquals('Blob segment size',0,TD.Len);
  1398. AssertEquals('Character set','',TD.Charset);
  1399. end;
  1400. procedure TTestTypeParser.TestSmallInt;
  1401. Var
  1402. TD : TSQLTypeDefinition;
  1403. begin
  1404. TD:=TestType('SMALLINT',[],sdtSmallint);
  1405. end;
  1406. procedure TTestTypeParser.TestFloat;
  1407. Var
  1408. TD : TSQLTypeDefinition;
  1409. begin
  1410. TD:=TestType('FLOAT',[],sdtFloat);
  1411. end;
  1412. procedure TTestTypeParser.TestBlobError1;
  1413. begin
  1414. FerrSource:='BLOB (1,)';
  1415. AssertException(ESQLParser,@TestTypeError);
  1416. end;
  1417. procedure TTestTypeParser.TestBlobError2;
  1418. begin
  1419. FerrSource:='BLOB 1,)';
  1420. // EAssertionfailed, due to not EOF
  1421. AssertException(EAssertionFailedError,@TestTypeError);
  1422. end;
  1423. procedure TTestTypeParser.TestBlobError3;
  1424. begin
  1425. FerrSource:='BLOB (80) SUB_TYPE 3';
  1426. AssertException(ESQLParser,@TestTypeError);
  1427. end;
  1428. procedure TTestTypeParser.TestBlobError4;
  1429. begin
  1430. FerrSource:='BLOB CHARACTER UTF8';
  1431. AssertException(ESQLParser,@TestTypeError);
  1432. end;
  1433. procedure TTestTypeParser.TestBlobError5;
  1434. begin
  1435. FerrSource:='BLOB (80) SEGMENT SIZE 80';
  1436. AssertException(ESQLParser,@TestTypeError);
  1437. end;
  1438. procedure TTestTypeParser.TestBlobError6;
  1439. begin
  1440. FerrSource:='BLOB (A)';
  1441. AssertException(ESQLParser,@TestTypeError);
  1442. end;
  1443. procedure TTestTypeParser.TestBlobError7;
  1444. begin
  1445. FerrSource:='BLOB (1';
  1446. AssertException(ESQLParser,@TestTypeError);
  1447. end;
  1448. { --------------------------------------------------------------------
  1449. TTestCheckParser
  1450. --------------------------------------------------------------------}
  1451. procedure TTestCheckParser.TestCheckNotNull;
  1452. Var
  1453. B : TSQLBinaryExpression;
  1454. begin
  1455. B:=TSQLBinaryExpression(TestCheck('VALUE IS NOT NULL',TSQLBinaryExpression));
  1456. AssertEquals('IS NOT operator,',boISNot,B.Operation);
  1457. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1458. AssertLiteralExpr('Right is null',B.Right,TSQLNullLiteral);
  1459. end;
  1460. procedure TTestCheckParser.TestCheckNull;
  1461. Var
  1462. B : TSQLBinaryExpression;
  1463. begin
  1464. B:=TSQLBinaryExpression(TestCheck('VALUE IS NULL',TSQLBinaryExpression));
  1465. AssertEquals('IS operator,',boIS,B.Operation);
  1466. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1467. AssertLiteralExpr('Right is null',B.Right,TSQLNullLiteral);
  1468. end;
  1469. procedure TTestCheckParser.TestCheckBraces;
  1470. Var
  1471. B : TSQLBinaryExpression;
  1472. begin
  1473. B:=TSQLBinaryExpression(TestCheck('(VALUE IS NULL)',TSQLBinaryExpression));
  1474. AssertEquals('IS operator,',boIS,B.Operation);
  1475. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1476. AssertLiteralExpr('Right is null',B.Right,TSQLNullLiteral);
  1477. end;
  1478. procedure TTestCheckParser.TestCheckBracesError;
  1479. begin
  1480. FErrSource:='(VALUE IS NOT NULL ME )';
  1481. AssertException('Error in braces.', ESQLParser,@TestCheckError);
  1482. end;
  1483. procedure TTestCheckParser.TestCheckParamError;
  1484. begin
  1485. FErrSource:='VALUE <> :P';
  1486. AssertException('Parameter.', ESQLParser,@TestCheckError);
  1487. end;
  1488. procedure TTestCheckParser.TestCheckIdentifierError;
  1489. begin
  1490. FErrSource:='(X IS NOT NULL)';
  1491. AssertException('Error in check: identifier.', ESQLParser,@TestCheckError);
  1492. end;
  1493. procedure TTestCheckParser.TestIsEqual;
  1494. Var
  1495. B : TSQLBinaryExpression;
  1496. begin
  1497. B:=TSQLBinaryExpression(TestCheck('VALUE = 3',TSQLBinaryExpression));
  1498. AssertEquals('Equal operator',boEq,B.Operation);
  1499. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1500. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1501. end;
  1502. procedure TTestCheckParser.TestIsNotEqual1;
  1503. Var
  1504. B : TSQLBinaryExpression;
  1505. begin
  1506. B:=TSQLBinaryExpression(TestCheck('VALUE <> 3',TSQLBinaryExpression));
  1507. AssertEquals('Not Equal operator',boNE,B.Operation);
  1508. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1509. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1510. end;
  1511. procedure TTestCheckParser.TestIsNotEqual2;
  1512. Var
  1513. B : TSQLBinaryExpression;
  1514. begin
  1515. B:=TSQLBinaryExpression(TestCheck('VALUE != 3',TSQLBinaryExpression));
  1516. AssertEquals('ENot qual operator',boNE,B.Operation);
  1517. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1518. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1519. end;
  1520. procedure TTestCheckParser.TestGreaterThan;
  1521. Var
  1522. B : TSQLBinaryExpression;
  1523. begin
  1524. B:=TSQLBinaryExpression(TestCheck('VALUE > 3',TSQLBinaryExpression));
  1525. AssertEquals('Greater than operator',boGT,B.Operation);
  1526. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1527. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1528. end;
  1529. procedure TTestCheckParser.TestGreaterThanEqual1;
  1530. Var
  1531. B : TSQLBinaryExpression;
  1532. begin
  1533. B:=TSQLBinaryExpression(TestCheck('VALUE >= 3',TSQLBinaryExpression));
  1534. AssertEquals('Greater or Equal operator',boGE,B.Operation);
  1535. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1536. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1537. end;
  1538. procedure TTestCheckParser.TestGreaterThanEqual2;
  1539. Var
  1540. B : TSQLBinaryExpression;
  1541. begin
  1542. B:=TSQLBinaryExpression(TestCheck('VALUE !< 3',TSQLBinaryExpression));
  1543. AssertEquals('Greater or Equal operator',boGE,B.Operation);
  1544. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1545. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1546. end;
  1547. procedure TTestCheckParser.TestLessThan;
  1548. Var
  1549. B : TSQLBinaryExpression;
  1550. begin
  1551. B:=TSQLBinaryExpression(TestCheck('VALUE < 3',TSQLBinaryExpression));
  1552. AssertEquals('Less than operator',boLT,B.Operation);
  1553. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1554. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1555. end;
  1556. procedure TTestCheckParser.TestLessThanEqual1;
  1557. Var
  1558. B : TSQLBinaryExpression;
  1559. begin
  1560. B:=TSQLBinaryExpression(TestCheck('VALUE <= 3',TSQLBinaryExpression));
  1561. AssertEquals('Less or Equal operator',boLE,B.Operation);
  1562. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1563. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1564. end;
  1565. procedure TTestCheckParser.TestLessThanEqual2;
  1566. Var
  1567. B : TSQLBinaryExpression;
  1568. begin
  1569. B:=TSQLBinaryExpression(TestCheck('VALUE !> 3',TSQLBinaryExpression));
  1570. AssertEquals('Less or Equal operator',boLE,B.Operation);
  1571. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1572. AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
  1573. end;
  1574. procedure TTestCheckParser.TestLike;
  1575. Var
  1576. B : TSQLBinaryExpression;
  1577. begin
  1578. B:=TSQLBinaryExpression(TestCheck('VALUE LIKE ''%3''',TSQLBinaryExpression));
  1579. AssertEquals('Like operator',boLike,B.Operation);
  1580. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1581. AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
  1582. end;
  1583. procedure TTestCheckParser.TestNotLike;
  1584. Var
  1585. B : TSQLBinaryExpression;
  1586. U : TSQLUnaryExpression;
  1587. begin
  1588. U:=TSQLUnaryExpression(TestCheck('VALUE NOT LIKE ''%3''',TSQLUnaryExpression));
  1589. AssertEquals('Like operator',uoNot,U.Operation);
  1590. CheckClass(U.Operand,TSQLBinaryExpression);
  1591. B:=TSQLBinaryExpression(U.Operand);
  1592. AssertEquals('Like operator',boLike,B.Operation);
  1593. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1594. AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
  1595. end;
  1596. procedure TTestCheckParser.TestContaining;
  1597. Var
  1598. B : TSQLBinaryExpression;
  1599. begin
  1600. B:=TSQLBinaryExpression(TestCheck('VALUE CONTAINING ''3''',TSQLBinaryExpression));
  1601. AssertEquals('Like operator',boContaining,B.Operation);
  1602. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1603. AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
  1604. end;
  1605. procedure TTestCheckParser.TestNotContaining;
  1606. Var
  1607. B : TSQLBinaryExpression;
  1608. U : TSQLUnaryExpression;
  1609. begin
  1610. U:=TSQLUnaryExpression(TestCheck('VALUE NOT CONTAINING ''3''',TSQLUnaryExpression));
  1611. AssertEquals('Like operator',uoNot,U.Operation);
  1612. CheckClass(U.Operand,TSQLBinaryExpression);
  1613. B:=TSQLBinaryExpression(U.Operand);
  1614. AssertEquals('Like operator',boContaining,B.Operation);
  1615. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1616. AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
  1617. end;
  1618. procedure TTestCheckParser.TestStarting;
  1619. Var
  1620. B : TSQLBinaryExpression;
  1621. begin
  1622. B:=TSQLBinaryExpression(TestCheck('VALUE STARTING ''3''',TSQLBinaryExpression));
  1623. AssertEquals('Like operator',boStarting,B.Operation);
  1624. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1625. AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
  1626. end;
  1627. procedure TTestCheckParser.TestNotStarting;
  1628. Var
  1629. B : TSQLBinaryExpression;
  1630. U : TSQLUnaryExpression;
  1631. begin
  1632. U:=TSQLUnaryExpression(TestCheck('VALUE NOT STARTING ''3''',TSQLUnaryExpression));
  1633. AssertEquals('Like operator',uoNot,U.Operation);
  1634. CheckClass(U.Operand,TSQLBinaryExpression);
  1635. B:=TSQLBinaryExpression(U.Operand);
  1636. AssertEquals('Like operator',boStarting,B.Operation);
  1637. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1638. AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
  1639. end;
  1640. procedure TTestCheckParser.TestBetween;
  1641. Var
  1642. T : TSQLTernaryExpression;
  1643. begin
  1644. T:=TSQLTernaryExpression(TestCheck('VALUE BETWEEN 1 AND 5',TSQLTernaryExpression));
  1645. AssertEquals('Like operator',tobetween,T.Operation);
  1646. AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
  1647. AssertLiteralExpr('Middle is integer',T.Middle,TSQLIntegerLiteral);
  1648. AssertLiteralExpr('Right is integer',T.Right,TSQLIntegerLiteral);
  1649. end;
  1650. procedure TTestCheckParser.TestNotBetween;
  1651. Var
  1652. U : TSQLUnaryExpression;
  1653. T : TSQLTernaryExpression;
  1654. begin
  1655. U:=TSQLUnaryExpression(TestCheck('VALUE NOT BETWEEN 1 AND 5',TSQLUnaryExpression));
  1656. AssertEquals('Not operator',uoNot,U.Operation);
  1657. CheckClass(U.Operand,TSQLTernaryExpression);
  1658. T:=TSQLTernaryExpression(U.Operand);
  1659. AssertEquals('Like operator',tobetween,T.Operation);
  1660. AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
  1661. AssertLiteralExpr('Middle is integer',T.Middle,TSQLIntegerLiteral);
  1662. AssertLiteralExpr('Right is integer',T.Right,TSQLIntegerLiteral);
  1663. end;
  1664. procedure TTestCheckParser.TestLikeEscape;
  1665. Var
  1666. T : TSQLTernaryExpression;
  1667. begin
  1668. T:=TSQLTernaryExpression(TestCheck('VALUE LIKE ''%2'' ESCAPE ''3''',TSQLTernaryExpression));
  1669. AssertEquals('Like operator',toLikeEscape,T.Operation);
  1670. AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
  1671. AssertLiteralExpr('Middle is string',T.Middle,TSQLStringLiteral);
  1672. AssertLiteralExpr('Right is string',T.Right,TSQLStringLiteral);
  1673. end;
  1674. procedure TTestCheckParser.TestNotLikeEscape;
  1675. Var
  1676. U : TSQLUnaryExpression;
  1677. T : TSQLTernaryExpression;
  1678. begin
  1679. U:=TSQLUnaryExpression(TestCheck('VALUE NOT LIKE ''%2'' ESCAPE ''3''',TSQLUnaryExpression));
  1680. AssertEquals('Not operator',uoNot,U.Operation);
  1681. CheckClass(U.Operand,TSQLTernaryExpression);
  1682. T:=TSQLTernaryExpression(U.Operand);
  1683. AssertEquals('Like operator',toLikeEscape,T.Operation);
  1684. AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
  1685. AssertLiteralExpr('Middle is string',T.Middle,TSQLStringLiteral);
  1686. AssertLiteralExpr('Right is string',T.Right,TSQLStringLiteral);
  1687. end;
  1688. procedure TTestCheckParser.TestAnd;
  1689. Var
  1690. T,B : TSQLBinaryExpression;
  1691. begin
  1692. T:=TSQLBinaryExpression(TestCheck('VALUE > 4 AND Value < 11',TSQLBinaryExpression));
  1693. AssertEquals('And operator',boand,T.Operation);
  1694. CheckClass(T.Left,TSQLBinaryExpression);
  1695. CheckClass(T.Right,TSQLBinaryExpression);
  1696. B:=TSQLBinaryExpression(T.Left);
  1697. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1698. AssertEquals('Less than operator',boGT,B.Operation);
  1699. AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
  1700. B:=TSQLBinaryExpression(T.Right);
  1701. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1702. AssertEquals('Less than operator',boLT,B.Operation);
  1703. AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
  1704. end;
  1705. procedure TTestCheckParser.TestOr;
  1706. Var
  1707. T,B : TSQLBinaryExpression;
  1708. begin
  1709. T:=TSQLBinaryExpression(TestCheck('VALUE < 4 or Value > 11',TSQLBinaryExpression));
  1710. AssertEquals('And operator',boor,T.Operation);
  1711. CheckClass(T.Left,TSQLBinaryExpression);
  1712. CheckClass(T.Right,TSQLBinaryExpression);
  1713. B:=TSQLBinaryExpression(T.Left);
  1714. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1715. AssertEquals('Less than operator',boLT,B.Operation);
  1716. AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
  1717. B:=TSQLBinaryExpression(T.Right);
  1718. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1719. AssertEquals('Less than operator',boGT,B.Operation);
  1720. AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
  1721. end;
  1722. procedure TTestCheckParser.TestNotOr;
  1723. Var
  1724. T,B : TSQLBinaryExpression;
  1725. begin
  1726. T:=TSQLBinaryExpression(TestCheck('VALUE IS NOT NULL or Value > 11',TSQLBinaryExpression));
  1727. AssertEquals('And operator',boor,T.Operation);
  1728. CheckClass(T.Left,TSQLBinaryExpression);
  1729. CheckClass(T.Right,TSQLBinaryExpression);
  1730. B:=TSQLBinaryExpression(T.Left);
  1731. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1732. AssertEquals('Is not null operator',boisNot,B.Operation);
  1733. AssertLiteralExpr('Right is value',B.Right,TSQLNullLiteral);
  1734. B:=TSQLBinaryExpression(T.Right);
  1735. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1736. AssertEquals('Less than operator',boGT,B.Operation);
  1737. AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
  1738. end;
  1739. { TTestDomainParser }
  1740. procedure TTestDomainParser.TestSimpleDomain;
  1741. Var
  1742. P : TSQLCreateOrAlterStatement;
  1743. D : TSQLCreateDomainStatement;
  1744. T : TSQLTypeDefinition;
  1745. begin
  1746. P:=TestCreateStatement('CREATE DOMAIN A INT','A',TSQLCreateDomainStatement);
  1747. CheckClass(P,TSQLCreateDomainStatement);
  1748. D:=TSQLCreateDomainStatement(P);
  1749. AssertNotNull('Have type Definition',D.TypeDefinition);
  1750. T:=D.TypeDefinition;
  1751. AssertTypeDefaults(T);
  1752. AssertEquals('Integer data type',sdtInteger,T.DataType);
  1753. end;
  1754. procedure TTestDomainParser.TestSimpleDomainAs;
  1755. Var
  1756. P : TSQLCreateOrAlterStatement;
  1757. D : TSQLCreateDomainStatement;
  1758. T : TSQLTypeDefinition;
  1759. begin
  1760. P:=TestCreateStatement('CREATE DOMAIN A AS INT','A',TSQLCreateDomainStatement);
  1761. CheckClass(P,TSQLCreateDomainStatement);
  1762. D:=TSQLCreateDomainStatement(P);
  1763. AssertNotNull('Have type Definition',D.TypeDefinition);
  1764. T:=D.TypeDefinition;
  1765. AssertTypeDefaults(T);
  1766. AssertEquals('Integer data type',sdtInteger,T.DataType);
  1767. end;
  1768. procedure TTestDomainParser.TestNotNullDomain;
  1769. Var
  1770. P : TSQLCreateOrAlterStatement;
  1771. D : TSQLCreateDomainStatement;
  1772. T : TSQLTypeDefinition;
  1773. begin
  1774. P:=TestCreateStatement('CREATE DOMAIN A INT NOT NULL','A',TSQLCreateDomainStatement);
  1775. CheckClass(P,TSQLCreateDomainStatement);
  1776. D:=TSQLCreateDomainStatement(P);
  1777. AssertNotNull('Have type Definition',D.TypeDefinition);
  1778. T:=D.TypeDefinition;
  1779. AssertEquals('Integer data type',sdtInteger,T.DataType);
  1780. AssertEquals('Not null',True,T.NotNull);
  1781. end;
  1782. procedure TTestDomainParser.TestDefaultNotNullDomain;
  1783. Var
  1784. P : TSQLCreateOrAlterStatement;
  1785. D : TSQLCreateDomainStatement;
  1786. T : TSQLTypeDefinition;
  1787. begin
  1788. P:=TestCreateStatement('CREATE DOMAIN A INT DEFAULT 2 NOT NULL','A',TSQLCreateDomainStatement);
  1789. CheckClass(P,TSQLCreateDomainStatement);
  1790. D:=TSQLCreateDomainStatement(P);
  1791. AssertNotNull('Have type Definition',D.TypeDefinition);
  1792. T:=D.TypeDefinition;
  1793. AssertNotNull('Have default value',T.DefaultValue);
  1794. CheckClass(T.DefaultValue,TSQLINtegerLiteral);
  1795. AssertEquals('Integer data type',sdtInteger,T.DataType);
  1796. AssertEquals('Not null',True,T.NotNull);
  1797. end;
  1798. procedure TTestDomainParser.TestAlterDomainDropDefault;
  1799. begin
  1800. TestCreateStatement('ALTER DOMAIN A DROP DEFAULT','A',TSQLAlterDomainDropDefaultStatement);
  1801. end;
  1802. procedure TTestDomainParser.TestAlterDomainDropCheck;
  1803. begin
  1804. TestCreateStatement('ALTER DOMAIN A DROP CONSTRAINT','A',TSQLAlterDomainDropCheckStatement);
  1805. end;
  1806. procedure TTestDomainParser.TestAlterDomainAddCheck;
  1807. Var
  1808. P : TSQLCreateOrAlterStatement;
  1809. D : TSQLAlterDomainAddCheckStatement;
  1810. B : TSQLBinaryExpression;
  1811. begin
  1812. P:=TestCreateStatement('ALTER DOMAIN A ADD CHECK (VALUE IS NOT NULL)','A',TSQLAlterDomainAddCheckStatement);
  1813. D:=TSQLAlterDomainAddCheckStatement(P);
  1814. AssertNotNull('Have check',D.Check);
  1815. CheckClass(D.Check,TSQLBinaryExpression);
  1816. B:=TSQLBinaryExpression(D.Check);
  1817. AssertEquals('Is not null operator',boIsNot,B.Operation);
  1818. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1819. AssertEquals('Is not null operator',boisNot,B.Operation);
  1820. AssertLiteralExpr('Right is value',B.Right,TSQLNullLiteral);
  1821. end;
  1822. procedure TTestDomainParser.TestAlterDomainAddConstraintCheck;
  1823. Var
  1824. P : TSQLCreateOrAlterStatement;
  1825. D : TSQLAlterDomainAddCheckStatement;
  1826. B : TSQLBinaryExpression;
  1827. begin
  1828. P:=TestCreateStatement('ALTER DOMAIN A ADD CONSTRAINT CHECK (VALUE IS NOT NULL)','A',TSQLAlterDomainAddCheckStatement);
  1829. D:=TSQLAlterDomainAddCheckStatement(P);
  1830. AssertNotNull('Have check',D.Check);
  1831. CheckClass(D.Check,TSQLBinaryExpression);
  1832. B:=TSQLBinaryExpression(D.Check);
  1833. AssertEquals('Is not null operation',boIsNot,B.Operation);
  1834. AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
  1835. AssertEquals('Is not null operator',boisNot,B.Operation);
  1836. AssertLiteralExpr('Right is value',B.Right,TSQLNullLiteral);
  1837. end;
  1838. procedure TTestDomainParser.TestAlterDomainAddConstraintError;
  1839. begin
  1840. FErrSource:='ALTER DOMAIN A ADD CONSTRAINT (VALUE IS NOT NULL)';
  1841. AssertException(ESQLParser,@TestParseError);
  1842. end;
  1843. procedure TTestDomainParser.TestAlterDomainSetDefault;
  1844. Var
  1845. P : TSQLCreateOrAlterStatement;
  1846. D : TSQLAlterDomainSetDefaultStatement;
  1847. begin
  1848. P:=TestCreateStatement('ALTER DOMAIN A SET DEFAULT NULL','A',TSQLAlterDomainSetDefaultStatement);
  1849. D:=TSQLAlterDomainSetDefaultStatement(P);
  1850. AssertNotNull('Have default',D.DefaultValue);
  1851. CheckClass(D.DefaultValue,TSQLNullLiteral);
  1852. end;
  1853. procedure TTestDomainParser.TestAlterDomainRename;
  1854. Var
  1855. P : TSQLCreateOrAlterStatement;
  1856. D : TSQLAlterDomainRenameStatement;
  1857. begin
  1858. P:=TestCreateStatement('ALTER DOMAIN A B','A',TSQLAlterDomainRenameStatement);
  1859. D:=TSQLAlterDomainRenameStatement(P);
  1860. AssertIdentifierName('New name','B',D.NewName);
  1861. end;
  1862. procedure TTestDomainParser.TestAlterDomainNewType;
  1863. Var
  1864. P : TSQLCreateOrAlterStatement;
  1865. D : TSQLAlterDomainTypeStatement;
  1866. begin
  1867. P:=TestCreateStatement('ALTER DOMAIN A TYPE CHAR(10)','A',TSQLAlterDomainTypeStatement);
  1868. D:=TSQLAlterDomainTypeStatement(P);
  1869. AssertNotNull('Have type definition',D.NewType);
  1870. AssertEquals('Char type',sdtChar,D.NewType.DataType);
  1871. AssertEquals('Char type of len 10',10,D.NewType.Len);
  1872. end;
  1873. procedure TTestDomainParser.TestAlterDomainNewTypeError1;
  1874. begin
  1875. FErrSource:='ALTER DOMAIN A TYPE INT NOT NULL';
  1876. AssertException(ESQLParser,@TestParseError);
  1877. end;
  1878. procedure TTestDomainParser.TestAlterDomainNewTypeError2;
  1879. begin
  1880. FErrSource:='ALTER DOMAIN A TYPE INT DEFAULT 1';
  1881. AssertException(ESQLParser,@TestParseError);
  1882. end;
  1883. procedure TTestDomainParser.TestAlterDomainDropCheckError;
  1884. begin
  1885. FErrSource:='ALTER DOMAIN A DROP CHECK';
  1886. AssertException(ESQLParser,@TestParseError);
  1887. end;
  1888. { TTestExceptionParser }
  1889. procedure TTestExceptionParser.TestException;
  1890. Var
  1891. P : TSQLCreateOrAlterStatement;
  1892. E : TSQLCreateExceptionStatement;
  1893. begin
  1894. P:=TestCreateStatement('CREATE EXCEPTION A ''A message''','A',TSQLCreateExceptionStatement);
  1895. E:=TSQLCreateExceptionStatement(P);
  1896. AssertNotNull('Have message',E.ExceptionMessage);
  1897. AssertEquals('Message','A message',E.ExceptionMessage.Value)
  1898. end;
  1899. procedure TTestExceptionParser.TestAlterException;
  1900. Var
  1901. P : TSQLCreateOrAlterStatement;
  1902. E : TSQLCreateExceptionStatement;
  1903. begin
  1904. P:=TestCreateStatement('ALTER EXCEPTION A ''A massage''','A',TSQLAlterExceptionStatement);
  1905. E:=TSQLCreateExceptionStatement(P);
  1906. AssertNotNull('Have message',E.ExceptionMessage);
  1907. AssertEquals('Message','A massage',E.ExceptionMessage.Value)
  1908. end;
  1909. procedure TTestExceptionParser.TestExceptionError1;
  1910. begin
  1911. FErrSource:='CREATE EXCEPTION NOT';
  1912. ASsertException(ESQLParser,@TestParseError);
  1913. end;
  1914. procedure TTestExceptionParser.TestExceptionError2;
  1915. begin
  1916. FErrSource:='CREATE EXCEPTION A NOT';
  1917. ASsertException(ESQLParser,@TestParseError);
  1918. end;
  1919. { TTestRoleParser }
  1920. procedure TTestRoleParser.TestCreateRole;
  1921. begin
  1922. TestCreateStatement('CREATE ROLE A','A',TSQLCreateROLEStatement);
  1923. end;
  1924. procedure TTestRoleParser.TestAlterRole;
  1925. begin
  1926. FErrSource:='ALTER ROLE A';
  1927. ASsertException(ESQLParser,@TestParseError);
  1928. end;
  1929. { TTestIndexParser }
  1930. procedure TTestIndexParser.TestAlterindexActive;
  1931. Var
  1932. A : TSQLAlterIndexStatement;
  1933. begin
  1934. A:=TSQLAlterIndexStatement(TestCreateStatement('ALTER INDEX A ACTIVE','A',TSQLAlterIndexStatement));
  1935. AssertEquals('Active',False,A.Inactive);
  1936. end;
  1937. procedure TTestIndexParser.TestAlterindexInactive;
  1938. Var
  1939. A : TSQLAlterIndexStatement;
  1940. begin
  1941. A:=TSQLAlterIndexStatement(TestCreateStatement('ALTER INDEX A INACTIVE','A',TSQLAlterIndexStatement));
  1942. AssertEquals('Inactive',True,A.Inactive);
  1943. end;
  1944. procedure TTestIndexParser.TestCreateIndexSimple;
  1945. Var
  1946. C : TSQLCreateIndexStatement;
  1947. begin
  1948. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE INDEX A ON B (C)','A',TSQLCreateIndexStatement));
  1949. If Not (C.Options=[]) then
  1950. Fail('Options empty');
  1951. AssertIdentifiername('Correct table name','B',C.TableName);
  1952. AssertNotNull('Have fieldlist',C.FieldNames);
  1953. AssertEquals('Number of fields',1,C.FieldNames.Count);
  1954. AssertIdentifiername('Field name','C',C.FieldNames[0]);
  1955. end;
  1956. procedure TTestIndexParser.TestIndexIndexDouble;
  1957. Var
  1958. C : TSQLCreateIndexStatement;
  1959. begin
  1960. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE INDEX A ON B (C,D)','A',TSQLCreateIndexStatement));
  1961. If Not (C.Options=[]) then
  1962. Fail('Options empty');
  1963. AssertIdentifiername('Correct table name','B',C.TableName);
  1964. AssertNotNull('Have fieldlist',C.FieldNames);
  1965. AssertEquals('Number of fields',2,C.FieldNames.Count);
  1966. AssertIdentifiername('Field name 1','C',C.FieldNames[0]);
  1967. AssertIdentifiername('Field name 2','D',C.FieldNames[1]);
  1968. end;
  1969. procedure TTestIndexParser.TestIndexError1;
  1970. begin
  1971. FErrSource:='ALTER UNIQUE INDEX A ACTIVE';
  1972. AssertException(ESQLParser,@TestParseError);
  1973. end;
  1974. procedure TTestIndexParser.TestIndexError2;
  1975. begin
  1976. FErrSource:='ALTER ASCENDING INDEX A ACTIVE';
  1977. AssertException(ESQLParser,@TestParseError);
  1978. end;
  1979. procedure TTestIndexParser.TestIndexError3;
  1980. begin
  1981. FErrSource:='ALTER DESCENDING INDEX A ACTIVE';
  1982. AssertException(ESQLParser,@TestParseError);
  1983. end;
  1984. procedure TTestIndexParser.TestIndexError4;
  1985. begin
  1986. FErrSource:='CREATE INDEX A ON B';
  1987. AssertException(ESQLParser,@TestParseError);
  1988. end;
  1989. procedure TTestIndexParser.TestIndexError5;
  1990. begin
  1991. FErrSource:='CREATE INDEX A ON B ()';
  1992. AssertException(ESQLParser,@TestParseError);
  1993. end;
  1994. procedure TTestIndexParser.TestIndexError6;
  1995. begin
  1996. FErrSource:='CREATE INDEX A ON B (A,)';
  1997. AssertException(ESQLParser,@TestParseError);
  1998. end;
  1999. procedure TTestIndexParser.TestCreateIndexUnique;
  2000. Var
  2001. C : TSQLCreateIndexStatement;
  2002. begin
  2003. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE UNIQUE INDEX A ON B (C)','A',TSQLCreateIndexStatement));
  2004. If not ([ioUnique]=C.Options) then
  2005. Fail('Not Unique index');
  2006. AssertIdentifierName('Have table name','B',C.TableName);
  2007. AssertNotNull('Have fieldlist',C.FieldNames);
  2008. AssertEquals('Number of fields',1,C.FieldNames.Count);
  2009. AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
  2010. end;
  2011. procedure TTestIndexParser.TestCreateIndexUniqueAscending;
  2012. Var
  2013. C : TSQLCreateIndexStatement;
  2014. begin
  2015. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE UNIQUE ASCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
  2016. If not ([ioUnique,ioAscending ]=C.Options) then
  2017. Fail('Not Unique ascending index');
  2018. AssertIdentifierName('Have table name','B',C.TableName);
  2019. AssertNotNull('Have fieldlist',C.FieldNames);
  2020. AssertEquals('Number of fields',1,C.FieldNames.Count);
  2021. AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
  2022. end;
  2023. procedure TTestIndexParser.TestCreateIndexUniqueDescending;
  2024. Var
  2025. C : TSQLCreateIndexStatement;
  2026. begin
  2027. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE UNIQUE DESCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
  2028. If not ([ioUnique,ioDescending]=C.Options) then
  2029. Fail('Not Unique descending index');
  2030. AssertIdentifierName('Have table name','B',C.TableName);
  2031. AssertNotNull('Have fieldlist',C.FieldNames);
  2032. AssertEquals('Number of fields',1,C.FieldNames.Count);
  2033. AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
  2034. end;
  2035. procedure TTestIndexParser.TestCreateIndexAscending;
  2036. Var
  2037. C : TSQLCreateIndexStatement;
  2038. begin
  2039. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE ASCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
  2040. If not ([ioAscending]=C.Options) then
  2041. Fail('Not ascending index');
  2042. AssertIdentifierName('Have table name','B',C.TableName);
  2043. AssertNotNull('Have fieldlist',C.FieldNames);
  2044. AssertEquals('Number of fields',1,C.FieldNames.Count);
  2045. AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
  2046. end;
  2047. procedure TTestIndexParser.TestCreateIndexDescending;
  2048. Var
  2049. C : TSQLCreateIndexStatement;
  2050. begin
  2051. C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE DESCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
  2052. If not ([ioDescending] = C.Options) then
  2053. Fail('Not descending index');
  2054. AssertIdentifierName('Table name','B',C.TableName);
  2055. AssertNotNull('Have fieldlist',C.FieldNames);
  2056. AssertEquals('Number of fields',1,C.FieldNames.Count);
  2057. AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
  2058. end;
  2059. { TTestTableParser }
  2060. procedure TTestTableParser.DoTestCreateReferencesField(const ASource: String;
  2061. AOnUpdate, AOnDelete: TForeignKeyAction);
  2062. Var
  2063. C : TSQLCreateTableStatement;
  2064. F : TSQLTableFieldDef;
  2065. D : TSQLForeignKeyFieldConstraint;
  2066. begin
  2067. C:=TSQLCreateTableStatement(TestCreateStatement(ASource,'A',TSQLCreateTableStatement));
  2068. AssertEquals('One field',1,C.FieldDefs.Count);
  2069. AssertEquals('No constraints',0,C.Constraints.Count);
  2070. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2071. AssertIdentifierName('fieldname','B',F.FieldName);
  2072. AssertNotNull('Have field type',F.FieldType);
  2073. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2074. AssertEquals('Field can be NULL',false,F.FieldType.NotNull);
  2075. AssertNull('Have default',F.FieldType.DefaultValue);
  2076. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2077. D:=TSQLForeignKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLForeignKeyFieldConstraint));
  2078. AssertNull('No constraint name',D.ConstraintName);
  2079. AssertIdentifierName('Correct table name','C',D.Definition.TableName);
  2080. AssertEquals('Correct field list count',1,D.Definition.FieldList.Count);
  2081. AssertIdentifierName('Correct field name','D',D.Definition.FieldList[0]);
  2082. AssertEquals('No on update action',AOnUpdate,D.Definition.OnUpdate);
  2083. AssertEquals('No on delete action',AOnDelete,D.Definition.OnDelete);
  2084. end;
  2085. procedure TTestTableParser.TestCreateOneSimpleField;
  2086. Var
  2087. C : TSQLCreateTableStatement;
  2088. F : TSQLTableFieldDef;
  2089. begin
  2090. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT)','A',TSQLCreateTableStatement));
  2091. AssertEquals('One field',1,C.FieldDefs.Count);
  2092. AssertEquals('No constraints',0,C.Constraints.Count);
  2093. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2094. AssertIdentifierName('fieldname','B',F.FieldName);
  2095. AssertNotNull('Have field type',F.FieldType);
  2096. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2097. end;
  2098. procedure TTestTableParser.TestCreateTwoSimpleFields;
  2099. Var
  2100. C : TSQLCreateTableStatement;
  2101. F : TSQLTableFieldDef;
  2102. begin
  2103. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, C CHAR(5))','A',TSQLCreateTableStatement));
  2104. AssertEquals('Two fields',2,C.FieldDefs.Count);
  2105. AssertEquals('No constraints',0,C.Constraints.Count);
  2106. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2107. AssertIdentifierName('fieldname','B',F.FieldName);
  2108. AssertNotNull('Have field type',F.FieldType);
  2109. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2110. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[1],TSQLTableFieldDef));
  2111. AssertIdentifierName('fieldname','C',F.FieldName);
  2112. AssertNotNull('Have field type',F.FieldType);
  2113. AssertEquals('Correct field type',sdtChar,F.FieldType.DataType);
  2114. end;
  2115. procedure TTestTableParser.TestCreateOnePrimaryField;
  2116. Var
  2117. C : TSQLCreateTableStatement;
  2118. F : TSQLTableFieldDef;
  2119. P : TSQLPrimaryKeyFieldConstraint;
  2120. begin
  2121. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT PRIMARY KEY)','A',TSQLCreateTableStatement));
  2122. AssertEquals('One field',1,C.FieldDefs.Count);
  2123. AssertEquals('No constraints',0,C.Constraints.Count);
  2124. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2125. AssertIdentifierName('fieldname','B',F.FieldName);
  2126. AssertNotNull('Have field type',F.FieldType);
  2127. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2128. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2129. P:=TSQLPrimaryKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint));
  2130. AssertNull('No constraint name',P.ConstraintName);
  2131. end;
  2132. procedure TTestTableParser.TestCreateOneNamedPrimaryField;
  2133. Var
  2134. C : TSQLCreateTableStatement;
  2135. F : TSQLTableFieldDef;
  2136. P : TSQLPrimaryKeyFieldConstraint;
  2137. begin
  2138. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT C PRIMARY KEY)','A',TSQLCreateTableStatement));
  2139. AssertEquals('One field',1,C.FieldDefs.Count);
  2140. AssertEquals('No constraints',0,C.Constraints.Count);
  2141. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2142. AssertIdentifierName('fieldname','B',F.FieldName);
  2143. AssertNotNull('Have field type',F.FieldType);
  2144. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2145. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2146. P:=TSQLPrimaryKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint));
  2147. AssertIdentifierName('Constraint name','C',P.ConstraintName);
  2148. end;
  2149. procedure TTestTableParser.TestCreateOneUniqueField;
  2150. Var
  2151. C : TSQLCreateTableStatement;
  2152. F : TSQLTableFieldDef;
  2153. U : TSQLUniqueFieldConstraint;
  2154. begin
  2155. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT UNIQUE)','A',TSQLCreateTableStatement));
  2156. AssertEquals('One field',1,C.FieldDefs.Count);
  2157. AssertEquals('No constraints',0,C.Constraints.Count);
  2158. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2159. AssertIdentifierName('fieldname','B',F.FieldName);
  2160. AssertNotNull('Have field type',F.FieldType);
  2161. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2162. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2163. U:=TSQLUniqueFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLUniqueFieldConstraint));
  2164. AssertNull('No constraint name',U.ConstraintName);
  2165. end;
  2166. procedure TTestTableParser.TestCreateOneNamedUniqueField;
  2167. Var
  2168. C : TSQLCreateTableStatement;
  2169. F : TSQLTableFieldDef;
  2170. U : TSQLUniqueFieldConstraint;
  2171. begin
  2172. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT C UNIQUE)','A',TSQLCreateTableStatement));
  2173. AssertEquals('One field',1,C.FieldDefs.Count);
  2174. AssertEquals('No constraints',0,C.Constraints.Count);
  2175. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2176. AssertIdentifierName('fieldname','B',F.FieldName);
  2177. AssertNotNull('Have field type',F.FieldType);
  2178. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2179. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2180. U:=TSQLUniqueFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLUniqueFieldConstraint));
  2181. AssertIdentifierName('Constraint name','C',U.ConstraintName);
  2182. end;
  2183. procedure TTestTableParser.TestCreateNotNullPrimaryField;
  2184. Var
  2185. C : TSQLCreateTableStatement;
  2186. F : TSQLTableFieldDef;
  2187. begin
  2188. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT NOT NULL PRIMARY KEY)','A',TSQLCreateTableStatement));
  2189. AssertEquals('One field',1,C.FieldDefs.Count);
  2190. AssertEquals('No constraints',0,C.Constraints.Count);
  2191. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2192. AssertIdentifierName('fieldname','B',F.FieldName);
  2193. AssertNotNull('Have field type',F.FieldType);
  2194. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2195. AssertEquals('Field is not NULL',true,F.FieldType.NotNull);
  2196. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2197. CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint);
  2198. end;
  2199. procedure TTestTableParser.TestCreateNotNullDefaultPrimaryField;
  2200. Var
  2201. C : TSQLCreateTableStatement;
  2202. F : TSQLTableFieldDef;
  2203. begin
  2204. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT DEFAULT 0 NOT NULL PRIMARY KEY)','A',TSQLCreateTableStatement));
  2205. AssertEquals('One field',1,C.FieldDefs.Count);
  2206. AssertEquals('No constraints',0,C.Constraints.Count);
  2207. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2208. AssertIdentifierName('fieldname','B',F.FieldName);
  2209. AssertNotNull('Have field type',F.FieldType);
  2210. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2211. AssertEquals('Field is not NULL',true,F.FieldType.NotNull);
  2212. AssertNotNull('Have default',F.FieldType.DefaultValue);
  2213. CheckClass(F.FieldType.DefaultValue,TSQLIntegerLiteral);
  2214. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2215. CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint);
  2216. end;
  2217. procedure TTestTableParser.TestCreateCheckField;
  2218. Var
  2219. C : TSQLCreateTableStatement;
  2220. F : TSQLTableFieldDef;
  2221. B : TSQLBinaryExpression;
  2222. CC : TSQLCheckFieldConstraint;
  2223. begin
  2224. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CHECK (B<>0))','A',TSQLCreateTableStatement));
  2225. AssertEquals('One field',1,C.FieldDefs.Count);
  2226. AssertEquals('No constraints',0,C.Constraints.Count);
  2227. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2228. AssertIdentifierName('fieldname','B',F.FieldName);
  2229. AssertNotNull('Have field type',F.FieldType);
  2230. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2231. AssertNull('Have no default',F.FieldType.DefaultValue);
  2232. AssertNull('Fieldtype has no check',F.FieldType.Check);
  2233. AssertNotNull('Field has constraint check',F.FieldType.Constraint);
  2234. CC:=TSQLCheckFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLCheckFieldConstraint));
  2235. AssertNull('No constraint name',CC.ConstraintName);
  2236. B:=TSQLBinaryExpression(CheckClass(CC.Expression,TSQLBinaryExpression));
  2237. AssertEquals('Unequal check',boNE,B.Operation);
  2238. end;
  2239. procedure TTestTableParser.TestCreateNamedCheckField;
  2240. Var
  2241. C : TSQLCreateTableStatement;
  2242. F : TSQLTableFieldDef;
  2243. B : TSQLBinaryExpression;
  2244. CC : TSQLCheckFieldConstraint;
  2245. begin
  2246. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT C CHECK (B<>0))','A',TSQLCreateTableStatement));
  2247. AssertEquals('One field',1,C.FieldDefs.Count);
  2248. AssertEquals('No constraints',0,C.Constraints.Count);
  2249. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2250. AssertIdentifierName('fieldname','B',F.FieldName);
  2251. AssertNotNull('Have field type',F.FieldType);
  2252. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2253. AssertNull('Have no default',F.FieldType.DefaultValue);
  2254. AssertNull('Fieldtype has no check',F.FieldType.Check);
  2255. AssertNotNull('Field has constraint check',F.FieldType.Constraint);
  2256. CC:=TSQLCheckFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLCheckFieldConstraint));
  2257. AssertidentifierName('Constraint name','C',CC.ConstraintName);
  2258. B:=TSQLBinaryExpression(CheckClass(CC.Expression,TSQLBinaryExpression));
  2259. AssertEquals('Unequal check',boNE,B.Operation);
  2260. end;
  2261. procedure TTestTableParser.TestCreateReferencesField;
  2262. begin
  2263. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D))',fkaNone,fkaNone);
  2264. end;
  2265. procedure TTestTableParser.TestCreateReferencesOnUpdateCascadeField;
  2266. begin
  2267. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE CASCADE)',fkaCascade,fkaNone);
  2268. end;
  2269. procedure TTestTableParser.TestCreateReferencesOnUpdateNoActionField;
  2270. begin
  2271. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE NO ACTION)',fkaNoAction,fkaNone);
  2272. end;
  2273. procedure TTestTableParser.TestCreateReferencesOnUpdateSetDefaultField;
  2274. begin
  2275. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE SET DEFAULT)',fkaSetDefault,fkaNone);
  2276. end;
  2277. procedure TTestTableParser.TestCreateReferencesOnUpdateSetNullField;
  2278. begin
  2279. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE SET NULL)',fkaSetNull,fkaNone);
  2280. end;
  2281. procedure TTestTableParser.TestCreateReferencesOnDeleteCascadeField;
  2282. begin
  2283. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE CASCADE)',fkaNone,fkaCascade);
  2284. end;
  2285. procedure TTestTableParser.TestCreateReferencesOnDeleteNoActionField;
  2286. begin
  2287. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE NO ACTION)',fkaNone,fkaNoAction);
  2288. end;
  2289. procedure TTestTableParser.TestCreateReferencesOnDeleteSetDefaultField;
  2290. begin
  2291. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE SET DEFAULT)',fkaNone,fkaSetDefault);
  2292. end;
  2293. procedure TTestTableParser.TestCreateReferencesOnDeleteSetNullField;
  2294. begin
  2295. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE SET NULL)',fkaNone,fkaSetNull);
  2296. end;
  2297. procedure TTestTableParser.TestCreateReferencesOnUpdateAndDeleteSetNullField;
  2298. begin
  2299. DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE SET NULL ON DELETE SET NULL)',fkaSetNull,fkaSetNull);
  2300. end;
  2301. procedure TTestTableParser.TestCreateNamedReferencesField;
  2302. Var
  2303. C : TSQLCreateTableStatement;
  2304. F : TSQLTableFieldDef;
  2305. D : TSQLForeignKeyFieldConstraint;
  2306. begin
  2307. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT FK REFERENCES C(D))','A',TSQLCreateTableStatement));
  2308. AssertEquals('One field',1,C.FieldDefs.Count);
  2309. AssertEquals('No constraints',0,C.Constraints.Count);
  2310. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2311. AssertIdentifierName('fieldname','B',F.FieldName);
  2312. AssertNotNull('Have field type',F.FieldType);
  2313. AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
  2314. AssertEquals('Field can be NULL',false,F.FieldType.NotNull);
  2315. AssertNull('Have default',F.FieldType.DefaultValue);
  2316. AssertNotNull('Have constraint',F.FieldType.Constraint);
  2317. D:=TSQLForeignKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLForeignKeyFieldConstraint));
  2318. AssertIdentifierName('Correct constraint name','FK',D.ConstraintName);
  2319. AssertIdentifierName('Correct table name','C',D.Definition.TableName);
  2320. AssertEquals('Correct field list count',1,D.Definition.FieldList.Count);
  2321. AssertIdentifierName('Correct field name','D',D.Definition.FieldList[0]);
  2322. end;
  2323. procedure TTestTableParser.TestCreateComputedByField;
  2324. Var
  2325. C : TSQLCreateTableStatement;
  2326. F : TSQLTableFieldDef;
  2327. B : TSQLBinaryExpression;
  2328. begin
  2329. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, C INT, D COMPUTED BY (B+C))','A',TSQLCreateTableStatement));
  2330. AssertEquals('Three fields',3,C.FieldDefs.Count);
  2331. AssertEquals('No constraints',0,C.Constraints.Count);
  2332. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[2],TSQLTableFieldDef));
  2333. AssertIdentifierName('fieldname','D',F.FieldName);
  2334. AssertNull('No field type',F.FieldType);
  2335. AssertNotNull('Have computed by expression',F.ComputedBy);
  2336. B:=TSQLBinaryExpression(CheckClass(F.ComputedBy,TSQLBinaryExpression));
  2337. AssertEquals('Add operation',boAdd,B.Operation);
  2338. CheckClass(B.Left,TSQLIdentifierExpression);
  2339. AssertIdentifierName('Correct identifier','B',TSQLIdentifierExpression(B.Left).Identifier);
  2340. CheckClass(B.Right,TSQLIdentifierExpression);
  2341. AssertIdentifierName('Correct identifier','C',TSQLIdentifierExpression(B.Right).Identifier);
  2342. end;
  2343. procedure TTestTableParser.TestCreatePrimaryKeyConstraint;
  2344. Var
  2345. C : TSQLCreateTableStatement;
  2346. F : TSQLTableFieldDef;
  2347. P: TSQLTablePrimaryKeyConstraintDef;
  2348. begin
  2349. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, PRIMARY KEY (B))','A',TSQLCreateTableStatement));
  2350. AssertEquals('One field',1,C.FieldDefs.Count);
  2351. AssertEquals('One constraints',1,C.Constraints.Count);
  2352. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2353. AssertIdentifierName('fieldname','B',F.FieldName);
  2354. P:=TSQLTablePrimaryKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTablePrimaryKeyConstraintDef));
  2355. AssertNotNull('Fieldlist assigned',P.FieldList);
  2356. AssertNull('Constraint name empty',P.ConstraintName);
  2357. AssertEquals('One field in primary key',1,P.FieldList.Count);
  2358. AssertIdentifierName('fieldname','B',P.FieldList[0]);
  2359. end;
  2360. procedure TTestTableParser.TestCreateNamedPrimaryKeyConstraint;
  2361. Var
  2362. C : TSQLCreateTableStatement;
  2363. F : TSQLTableFieldDef;
  2364. P: TSQLTablePrimaryKeyConstraintDef;
  2365. begin
  2366. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT A_PK PRIMARY KEY (B))','A',TSQLCreateTableStatement));
  2367. AssertEquals('One field',1,C.FieldDefs.Count);
  2368. AssertEquals('One constraints',1,C.Constraints.Count);
  2369. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2370. AssertIdentifierName('fieldname','B',F.FieldName);
  2371. P:=TSQLTablePrimaryKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTablePrimaryKeyConstraintDef));
  2372. AssertNotNull('Fieldlist assigned',P.FieldList);
  2373. AssertIdentifierName('fieldname','A_PK',P.ConstraintName);
  2374. AssertEquals('One field in primary key',1,P.FieldList.Count);
  2375. AssertIdentifierName('fieldname','B',P.FieldList[0]);
  2376. end;
  2377. procedure TTestTableParser.TestCreateForeignKeyConstraint;
  2378. Var
  2379. C : TSQLCreateTableStatement;
  2380. F : TSQLTableFieldDef;
  2381. P: TSQLTableForeignKeyConstraintDef;
  2382. begin
  2383. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, FOREIGN KEY (B) REFERENCES C(D))','A',TSQLCreateTableStatement));
  2384. AssertEquals('One field',1,C.FieldDefs.Count);
  2385. AssertEquals('One constraints',1,C.Constraints.Count);
  2386. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2387. AssertIdentifierName('fieldname','B',F.FieldName);
  2388. P:=TSQLTableForeignKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTableForeignKeyConstraintDef));
  2389. AssertNotNull('Fieldlist assigned',P.FieldList);
  2390. AssertNull('Constraint name',P.ConstraintName);
  2391. AssertEquals('One field in foreign key',1,P.FieldList.Count);
  2392. AssertIdentifierName('fieldname','B',P.FieldList[0]);
  2393. AssertIdentifierName('Target table name','C',P.Definition.TableName);
  2394. AssertEquals('One field in primary key target',1,P.Definition.FieldList.Count);
  2395. AssertIdentifierName('target fieldname','D',P.Definition.FieldList[0]);
  2396. end;
  2397. procedure TTestTableParser.TestCreateNamedForeignKeyConstraint;
  2398. Var
  2399. C : TSQLCreateTableStatement;
  2400. F : TSQLTableFieldDef;
  2401. P: TSQLTableForeignKeyConstraintDef;
  2402. begin
  2403. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT A_FK FOREIGN KEY (B) REFERENCES C(D))','A',TSQLCreateTableStatement));
  2404. AssertEquals('One field',1,C.FieldDefs.Count);
  2405. AssertEquals('One constraints',1,C.Constraints.Count);
  2406. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2407. AssertIdentifierName('fieldname','B',F.FieldName);
  2408. P:=TSQLTableForeignKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTableForeignKeyConstraintDef));
  2409. AssertNotNull('Fieldlist assigned',P.FieldList);
  2410. AssertIdentifierName('fieldname','A_FK',P.ConstraintName);
  2411. AssertEquals('One field in foreign key',1,P.FieldList.Count);
  2412. AssertIdentifierName('fieldname','B',P.FieldList[0]);
  2413. AssertIdentifierName('Target table name','C',P.Definition.TableName);
  2414. AssertEquals('One field in primary key target',1,P.Definition.FieldList.Count);
  2415. AssertIdentifierName('target fieldname','D',P.Definition.FieldList[0]);
  2416. end;
  2417. procedure TTestTableParser.TestCreateUniqueConstraint;
  2418. Var
  2419. C : TSQLCreateTableStatement;
  2420. F : TSQLTableFieldDef;
  2421. P: TSQLTableUniqueConstraintDef;
  2422. begin
  2423. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, UNIQUE (B))','A',TSQLCreateTableStatement));
  2424. AssertEquals('One field',1,C.FieldDefs.Count);
  2425. AssertEquals('One constraints',1,C.Constraints.Count);
  2426. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2427. AssertIdentifierName('fieldname','B',F.FieldName);
  2428. P:=TSQLTableUniqueConstraintDef(CheckClass(C.Constraints[0],TSQLTableUniqueConstraintDef));
  2429. AssertNotNull('Fieldlist assigned',P.FieldList);
  2430. AssertNull('Constraint name empty',P.ConstraintName);
  2431. AssertEquals('One field in primary key',1,P.FieldList.Count);
  2432. AssertIdentifierName('Name is correct','B',P.FieldList[0]);
  2433. end;
  2434. procedure TTestTableParser.TestCreateNamedUniqueConstraint;
  2435. Var
  2436. C : TSQLCreateTableStatement;
  2437. F : TSQLTableFieldDef;
  2438. P: TSQLTableUniqueConstraintDef;
  2439. begin
  2440. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT U_A UNIQUE (B))','A',TSQLCreateTableStatement));
  2441. AssertEquals('One field',1,C.FieldDefs.Count);
  2442. AssertEquals('One constraints',1,C.Constraints.Count);
  2443. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2444. AssertIdentifierName('fieldname','B',F.FieldName);
  2445. P:=TSQLTableUniqueConstraintDef(CheckClass(C.Constraints[0],TSQLTableUniqueConstraintDef));
  2446. AssertNotNull('Fieldlist assigned',P.FieldList);
  2447. AssertIdentifierName('fieldname','U_A',P.ConstraintName);
  2448. AssertEquals('One field in primary key',1,P.FieldList.Count);
  2449. AssertIdentifierName('Name is correct','B',P.FieldList[0]);
  2450. end;
  2451. procedure TTestTableParser.TestCreateCheckConstraint;
  2452. Var
  2453. C : TSQLCreateTableStatement;
  2454. F : TSQLTableFieldDef;
  2455. B : TSQLBinaryExpression;
  2456. P: TSQLTableCheckConstraintDef;
  2457. begin
  2458. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CHECK (B<>0))','A',TSQLCreateTableStatement));
  2459. AssertEquals('One field',1,C.FieldDefs.Count);
  2460. AssertEquals('One constraints',1,C.Constraints.Count);
  2461. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2462. AssertIdentifierName('fieldname','B',F.FieldName);
  2463. P:=TSQLTableCheckConstraintDef(CheckClass(C.Constraints[0],TSQLTableCheckConstraintDef));
  2464. AssertNull('Constraint name empty',P.ConstraintName);
  2465. AssertNotNull('Check expression assigned',P.Check);
  2466. B:=TSQLBinaryExpression(CheckClass(P.Check,TSQLBinaryExpression));
  2467. AssertEquals('Unequal',boNE,B.Operation);
  2468. end;
  2469. procedure TTestTableParser.TestCreateNamedCheckConstraint;
  2470. Var
  2471. C : TSQLCreateTableStatement;
  2472. F : TSQLTableFieldDef;
  2473. B : TSQLBinaryExpression;
  2474. P: TSQLTableCheckConstraintDef;
  2475. begin
  2476. C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT C_A CHECK (B<>0))','A',TSQLCreateTableStatement));
  2477. AssertEquals('One field',1,C.FieldDefs.Count);
  2478. AssertEquals('One constraints',1,C.Constraints.Count);
  2479. F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
  2480. AssertIdentifierName('fieldname','B',F.FieldName);
  2481. P:=TSQLTableCheckConstraintDef(CheckClass(C.Constraints[0],TSQLTableCheckConstraintDef));
  2482. AssertIdentifierName('Constainrname','C_A',P.ConstraintName);
  2483. AssertNotNull('Check expression assigned',P.Check);
  2484. B:=TSQLBinaryExpression(CheckClass(P.Check,TSQLBinaryExpression));
  2485. AssertEquals('Not equal operation',boNE,B.Operation);
  2486. end;
  2487. procedure TTestTableParser.TestAlterDropField;
  2488. Var
  2489. A : TSQLAlterTableStatement;
  2490. D : TSQLDropTableFieldOperation;
  2491. begin
  2492. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP B','A',TSQLAlterTableStatement));
  2493. AssertEquals('One operation',1,A.Operations.Count);
  2494. D:=TSQLDropTableFieldOperation(CheckClass(A.Operations[0],TSQLDropTableFieldOperation));
  2495. AssertidentifierName('Drop field name','B',D.ObjectName);
  2496. end;
  2497. procedure TTestTableParser.TestAlterDropFields;
  2498. Var
  2499. A : TSQLAlterTableStatement;
  2500. D : TSQLDropTableFieldOperation;
  2501. begin
  2502. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP B, DROP C','A',TSQLAlterTableStatement));
  2503. AssertEquals('Two operations',2,A.Operations.Count);
  2504. D:=TSQLDropTableFieldOperation(CheckClass(A.Operations[0],TSQLDropTableFieldOperation));
  2505. AssertidentifierName('Drop field name','B',D.ObjectName);
  2506. D:=TSQLDropTableFieldOperation(CheckClass(A.Operations[1],TSQLDropTableFieldOperation));
  2507. AssertidentifierName('Drop field name','C',D.ObjectName);
  2508. end;
  2509. procedure TTestTableParser.TestAlterDropConstraint;
  2510. Var
  2511. A : TSQLAlterTableStatement;
  2512. D : TSQLDropTableConstraintOperation;
  2513. begin
  2514. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP CONSTRAINT B','A',TSQLAlterTableStatement));
  2515. AssertEquals('One operation',1,A.Operations.Count);
  2516. D:=TSQLDropTableConstraintOperation(CheckClass(A.Operations[0],TSQLDropTableConstraintOperation));
  2517. AssertidentifierName('Drop field name','B',D.ObjectName);
  2518. end;
  2519. procedure TTestTableParser.TestAlterDropConstraints;
  2520. Var
  2521. A : TSQLAlterTableStatement;
  2522. D : TSQLDropTableConstraintOperation;
  2523. begin
  2524. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP CONSTRAINT B, DROP CONSTRAINT C','A',TSQLAlterTableStatement));
  2525. AssertEquals('Two operations',2,A.Operations.Count);
  2526. D:=TSQLDropTableConstraintOperation(CheckClass(A.Operations[0],TSQLDropTableConstraintOperation));
  2527. AssertidentifierName('Drop Constraint name','B',D.ObjectName);
  2528. D:=TSQLDropTableConstraintOperation(CheckClass(A.Operations[1],TSQLDropTableConstraintOperation));
  2529. AssertidentifierName('Drop field name','C',D.ObjectName);
  2530. end;
  2531. procedure TTestTableParser.TestAlterRenameField;
  2532. Var
  2533. A : TSQLAlterTableStatement;
  2534. R : TSQLAlterTableFieldNameOperation;
  2535. begin
  2536. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER B TO C','A',TSQLAlterTableStatement));
  2537. AssertEquals('One operation',1,A.Operations.Count);
  2538. R:=TSQLAlterTableFieldNameOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldNameOperation));
  2539. AssertidentifierName('Old field name','B',R.ObjectName);
  2540. AssertidentifierName('New field name','C',R.NewName);
  2541. end;
  2542. procedure TTestTableParser.TestAlterRenameColumnField;
  2543. Var
  2544. A : TSQLAlterTableStatement;
  2545. R : TSQLAlterTableFieldNameOperation;
  2546. begin
  2547. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER COLUMN B TO C','A',TSQLAlterTableStatement));
  2548. AssertEquals('One operation',1,A.Operations.Count);
  2549. R:=TSQLAlterTableFieldNameOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldNameOperation));
  2550. AssertidentifierName('Old field name','B',R.ObjectName);
  2551. AssertidentifierName('New field name','C',R.NewName);
  2552. end;
  2553. procedure TTestTableParser.TestAlterFieldType;
  2554. Var
  2555. A : TSQLAlterTableStatement;
  2556. R : TSQLAlterTableFieldTypeOperation;
  2557. begin
  2558. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER COLUMN B TYPE INT','A',TSQLAlterTableStatement));
  2559. AssertEquals('One operation',1,A.Operations.Count);
  2560. R:=TSQLAlterTableFieldTypeOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldTypeOperation));
  2561. AssertidentifierName('Old field name','B',R.ObjectName);
  2562. AssertNotNull('Have field type',R.NewType);
  2563. Checkclass(R.NewType,TSQLTypeDefinition);
  2564. AssertEquals('Correct data type',sdtInteger,R.NewType.DataType);
  2565. end;
  2566. procedure TTestTableParser.TestAlterFieldPosition;
  2567. Var
  2568. A : TSQLAlterTableStatement;
  2569. R : TSQLAlterTableFieldPositionOperation;
  2570. begin
  2571. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER COLUMN B POSITION 3','A',TSQLAlterTableStatement));
  2572. AssertEquals('One operation',1,A.Operations.Count);
  2573. R:=TSQLAlterTableFieldPositionOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldPositionOperation));
  2574. AssertidentifierName('Old field name','B',R.ObjectName);
  2575. AssertEquals('Correct position',3,R.NewPosition);
  2576. end;
  2577. procedure TTestTableParser.TestAlterAddField;
  2578. Var
  2579. A : TSQLAlterTableStatement;
  2580. F : TSQLAlterTableAddFieldOperation;
  2581. D : TSQLTableFieldDef;
  2582. begin
  2583. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD B INT','A',TSQLAlterTableStatement));
  2584. AssertEquals('One operation',1,A.Operations.Count);
  2585. F:=TSQLAlterTableAddFieldOperation(CheckClass(A.Operations[0],TSQLAlterTableAddFieldOperation));
  2586. AssertNotNull('Have element',F.Element);
  2587. D:=TSQLTableFieldDef(CheckClass(F.Element,TSQLTableFieldDef));
  2588. AssertIdentifierName('New field name','B',D.FieldName);
  2589. AssertNotNull('Have fielddef',D.FieldType);
  2590. AssertEquals('Correct field type',sdtINteger,D.FieldType.DataType);
  2591. end;
  2592. procedure TTestTableParser.TestAlterAddFields;
  2593. Var
  2594. A : TSQLAlterTableStatement;
  2595. F : TSQLAlterTableAddFieldOperation;
  2596. D : TSQLTableFieldDef;
  2597. begin
  2598. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD B INT, ADD C CHAR(50)','A',TSQLAlterTableStatement));
  2599. AssertEquals('Two operations',2,A.Operations.Count);
  2600. F:=TSQLAlterTableAddFieldOperation(CheckClass(A.Operations[0],TSQLAlterTableAddFieldOperation));
  2601. AssertNotNull('Have element',F.Element);
  2602. D:=TSQLTableFieldDef(CheckClass(F.Element,TSQLTableFieldDef));
  2603. AssertIdentifierName('New field name','B',D.FieldName);
  2604. AssertNotNull('Have fielddef',D.FieldType);
  2605. AssertEquals('Correct field type',sdtINteger,D.FieldType.DataType);
  2606. F:=TSQLAlterTableAddFieldOperation(CheckClass(A.Operations[1],TSQLAlterTableAddFieldOperation));
  2607. AssertNotNull('Have element',F.Element);
  2608. D:=TSQLTableFieldDef(CheckClass(F.Element,TSQLTableFieldDef));
  2609. AssertIdentifierName('New field name','C',D.FieldName);
  2610. AssertNotNull('Have fielddef',D.FieldType);
  2611. AssertEquals('Correct field type',sdtChar,D.FieldType.DataType);
  2612. AssertEquals('Correct field lengthe',50,D.FieldType.Len);
  2613. end;
  2614. procedure TTestTableParser.TestAlterAddPrimarykey;
  2615. Var
  2616. A : TSQLAlterTableStatement;
  2617. F : TSQLAlterTableAddConstraintOperation;
  2618. D : TSQLTablePrimaryKeyConstraintDef;
  2619. begin
  2620. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD PRIMARY KEY (B)','A',TSQLAlterTableStatement));
  2621. AssertEquals('One operation',1,A.Operations.Count);
  2622. F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
  2623. AssertNotNull('Have element',F.Element);
  2624. D:=TSQLTablePrimaryKeyConstraintDef(CheckClass(F.Element,TSQLTablePrimaryKeyConstraintDef));
  2625. AssertNull('No constraint name',D.ConstraintName);
  2626. AssertEquals('Have 1 field',1,D.FieldList.Count);
  2627. AssertIdentifierName('fieldname','B',D.FieldList[0]);
  2628. end;
  2629. procedure TTestTableParser.TestAlterAddNamedPrimarykey;
  2630. Var
  2631. A : TSQLAlterTableStatement;
  2632. F : TSQLAlterTableAddConstraintOperation;
  2633. D : TSQLTablePrimaryKeyConstraintDef;
  2634. begin
  2635. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CONSTRAINT U_K PRIMARY KEY (B)','A',TSQLAlterTableStatement));
  2636. AssertEquals('One operation',1,A.Operations.Count);
  2637. F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
  2638. AssertNotNull('Have element',F.Element);
  2639. D:=TSQLTablePrimaryKeyConstraintDef(CheckClass(F.Element,TSQLTablePrimaryKeyConstraintDef));
  2640. AssertIdentifierName('No constraint name','U_K',D.ConstraintName);
  2641. AssertEquals('Have 1 field',1,D.FieldList.Count);
  2642. AssertIdentifierName('fieldname','B',D.FieldList[0]);
  2643. end;
  2644. procedure TTestTableParser.TestAlterAddCheckConstraint;
  2645. Var
  2646. A : TSQLAlterTableStatement;
  2647. F : TSQLAlterTableAddConstraintOperation;
  2648. D : TSQLTableCheckConstraintDef;
  2649. begin
  2650. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CHECK (B<>0)','A',TSQLAlterTableStatement));
  2651. AssertEquals('One operation',1,A.Operations.Count);
  2652. F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
  2653. AssertNotNull('Have element',F.Element);
  2654. D:=TSQLTableCheckConstraintDef(CheckClass(F.Element,TSQLTableCheckConstraintDef));
  2655. AssertNull('Constaintname',D.ConstraintName);
  2656. AssertNotNull('Check expression assigned',D.Check);
  2657. CheckClass(D.Check,TSQLBinaryExpression);
  2658. end;
  2659. procedure TTestTableParser.TestAlterAddNamedCheckConstraint;
  2660. Var
  2661. A : TSQLAlterTableStatement;
  2662. F : TSQLAlterTableAddConstraintOperation;
  2663. D : TSQLTableCheckConstraintDef;
  2664. begin
  2665. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CONSTRAINT C_A CHECK (B<>0)','A',TSQLAlterTableStatement));
  2666. AssertEquals('One operation',1,A.Operations.Count);
  2667. F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
  2668. AssertNotNull('Have element',F.Element);
  2669. D:=TSQLTableCheckConstraintDef(CheckClass(F.Element,TSQLTableCheckConstraintDef));
  2670. AssertIdentifierName('Constaintname','C_A',D.ConstraintName);
  2671. AssertNotNull('Check expression assigned',D.Check);
  2672. CheckClass(D.Check,TSQLBinaryExpression);
  2673. end;
  2674. procedure TTestTableParser.TestAlterAddForeignkey;
  2675. Var
  2676. A : TSQLAlterTableStatement;
  2677. F : TSQLAlterTableAddConstraintOperation;
  2678. D : TSQLTableForeignKeyConstraintDef;
  2679. begin
  2680. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD FOREIGN KEY (B) REFERENCES C(D)','A',TSQLAlterTableStatement));
  2681. AssertEquals('One operation',1,A.Operations.Count);
  2682. F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
  2683. AssertNotNull('Have element',F.Element);
  2684. D:=TSQLTableForeignKeyConstraintDef(CheckClass(F.Element,TSQLTableForeignKeyConstraintDef));
  2685. AssertNull('No constraint name',D.ConstraintName);
  2686. AssertEquals('Have 1 field',1,D.FieldList.Count);
  2687. AssertIdentifierName('fieldname','B',D.FieldList[0]);
  2688. AssertIdentifierName('Target table name','C',D.Definition.TableName);
  2689. AssertEquals('One field in primary key target',1,D.Definition.FieldList.Count);
  2690. AssertIdentifierName('target fieldname','D',D.Definition.FieldList[0]);
  2691. end;
  2692. procedure TTestTableParser.TestAlterAddNamedForeignkey;
  2693. Var
  2694. A : TSQLAlterTableStatement;
  2695. F : TSQLAlterTableAddConstraintOperation;
  2696. D : TSQLTableForeignKeyConstraintDef;
  2697. begin
  2698. A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CONSTRAINT F_A FOREIGN KEY (B) REFERENCES C(D)','A',TSQLAlterTableStatement));
  2699. AssertEquals('One operation',1,A.Operations.Count);
  2700. F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
  2701. AssertNotNull('Have element',F.Element);
  2702. D:=TSQLTableForeignKeyConstraintDef(CheckClass(F.Element,TSQLTableForeignKeyConstraintDef));
  2703. AssertIdentifierName('constraint name','F_A',D.ConstraintName);
  2704. AssertEquals('Have 1 field',1,D.FieldList.Count);
  2705. AssertIdentifierName('fieldname','B',D.FieldList[0]);
  2706. AssertIdentifierName('Target table name','C',D.Definition.TableName);
  2707. AssertEquals('One field in primary key target',1,D.Definition.FieldList.Count);
  2708. AssertIdentifierName('target fieldname','D',D.Definition.FieldList[0]);
  2709. end;
  2710. { TTestDeleteParser }
  2711. function TTestDeleteParser.TestDelete(const ASource,ATable: String
  2712. ): TSQLDeleteStatement;
  2713. begin
  2714. CreateParser(ASource);
  2715. FToFree:=Parser.Parse;
  2716. Result:=TSQLDeleteStatement(CheckClass(FToFree,TSQLDeleteStatement));
  2717. AssertIdentifierName('Correct table name',ATable,Result.TableName);
  2718. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  2719. end;
  2720. procedure TTestDeleteParser.TestSimpleDelete;
  2721. Var
  2722. D : TSQLDeleteStatement;
  2723. begin
  2724. D:=TestDelete('DELETE FROM A','A');
  2725. AssertNull('No where',D.WhereClause);
  2726. end;
  2727. procedure TTestDeleteParser.TestSimpleDeleteAlias;
  2728. Var
  2729. D : TSQLDeleteStatement;
  2730. begin
  2731. D:=TestDelete('DELETE FROM A B','A');
  2732. AssertIdentifierName('Alias name','B',D.AliasName);
  2733. AssertNull('No where',D.WhereClause);
  2734. end;
  2735. procedure TTestDeleteParser.TestDeleteWhereNull;
  2736. Var
  2737. D : TSQLDeleteStatement;
  2738. B : TSQLBinaryExpression;
  2739. I : TSQLIdentifierExpression;
  2740. L : TSQLLiteralExpression;
  2741. begin
  2742. D:=TestDelete('DELETE FROM A WHERE B IS NULL','A');
  2743. AssertNotNull('No where',D.WhereClause);
  2744. B:=TSQLBinaryExpression(CheckClass(D.WhereClause,TSQLBinaryExpression));
  2745. AssertEquals('Is null operation',boIs,B.Operation);
  2746. I:=TSQLIdentifierExpression(CheckClass(B.Left,TSQLIdentifierExpression));
  2747. AssertIdentifierName('Correct field name','B',I.Identifier);
  2748. L:=TSQLLiteralExpression(CheckClass(B.Right,TSQLLiteralExpression));
  2749. CheckClass(L.Literal,TSQLNullLiteral);
  2750. end;
  2751. { TTestUpdateParser }
  2752. function TTestUpdateParser.TestUpdate(const ASource, ATable: String
  2753. ): TSQLUpdateStatement;
  2754. begin
  2755. CreateParser(ASource);
  2756. FToFree:=Parser.Parse;
  2757. Result:=TSQLUpdateStatement(CheckClass(FToFree,TSQLUpdateStatement));
  2758. AssertIdentifierName('Correct table name',ATable,Result.TableName);
  2759. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  2760. end;
  2761. procedure TTestUpdateParser.TestUpdateOneField;
  2762. Var
  2763. U : TSQLUpdateStatement;
  2764. P : TSQLUpdatePair;
  2765. E : TSQLLiteralExpression;
  2766. I : TSQLIntegerLiteral;
  2767. begin
  2768. U:=TestUpdate('UPDATE A SET B=1','A');
  2769. AssertEquals('One field updated',1,U.Values.Count);
  2770. P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
  2771. AssertIdentifierName('Correct field name','B',P.FieldName);
  2772. E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
  2773. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2774. AssertEquals('Value 1',1,I.Value);
  2775. AssertNull('No where clause',U.WhereClause);
  2776. end;
  2777. procedure TTestUpdateParser.TestUpdateOneFieldFull;
  2778. Var
  2779. U : TSQLUpdateStatement;
  2780. P : TSQLUpdatePair;
  2781. E : TSQLLiteralExpression;
  2782. I : TSQLIntegerLiteral;
  2783. begin
  2784. U:=TestUpdate('UPDATE A SET A.B=1','A');
  2785. AssertEquals('One field updated',1,U.Values.Count);
  2786. P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
  2787. AssertIdentifierName('Correct field name','A.B',P.FieldName);
  2788. E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
  2789. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2790. AssertEquals('Value 1',1,I.Value);
  2791. AssertNull('No where clause',U.WhereClause);
  2792. end;
  2793. procedure TTestUpdateParser.TestUpdateTwoFields;
  2794. Var
  2795. U : TSQLUpdateStatement;
  2796. P : TSQLUpdatePair;
  2797. E : TSQLLiteralExpression;
  2798. I : TSQLIntegerLiteral;
  2799. begin
  2800. U:=TestUpdate('UPDATE A SET B=1, C=2','A');
  2801. AssertEquals('One field updated',2,U.Values.Count);
  2802. P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
  2803. AssertIdentifierName('Correct field name','B',P.FieldName);
  2804. E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
  2805. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2806. AssertEquals('Value 1',1,I.Value);
  2807. P:=TSQLUpdatePair(CheckClass(U.Values[1],TSQLUpdatePair));
  2808. AssertIdentifierName('Correct field name','C',P.FieldName);
  2809. E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
  2810. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2811. AssertEquals('Value 2',2,I.Value);
  2812. AssertNull('No where clause',U.WhereClause);
  2813. end;
  2814. procedure TTestUpdateParser.TestUpdateOneFieldWhereIsNull;
  2815. Var
  2816. U : TSQLUpdateStatement;
  2817. P : TSQLUpdatePair;
  2818. E : TSQLLiteralExpression;
  2819. I : TSQLIntegerLiteral;
  2820. B : TSQLBinaryExpression;
  2821. IE : TSQLIdentifierExpression;
  2822. L : TSQLLiteralExpression;
  2823. begin
  2824. U:=TestUpdate('UPDATE A SET B=1 WHERE B IS NULL','A');
  2825. AssertEquals('One field updated',1,U.Values.Count);
  2826. P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
  2827. AssertIdentifierName('Correct field name','B',P.FieldName);
  2828. E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
  2829. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2830. AssertEquals('Value 1',1,I.Value);
  2831. AssertNotNull('where clause',U.WhereClause);
  2832. B:=TSQLBinaryExpression(CheckClass(U.WhereClause,TSQLBinaryExpression));
  2833. AssertEquals('Is null operation',boIs,B.Operation);
  2834. IE:=TSQLIdentifierExpression(CheckClass(B.Left,TSQLIdentifierExpression));
  2835. AssertIdentifierName('Correct field name','B',IE.Identifier);
  2836. L:=TSQLLiteralExpression(CheckClass(B.Right,TSQLLiteralExpression));
  2837. CheckClass(L.Literal,TSQLNullLiteral);
  2838. end;
  2839. { TTestInsertParser }
  2840. function TTestInsertParser.TestInsert(const ASource, ATable: String
  2841. ): TSQLInsertStatement;
  2842. begin
  2843. CreateParser(ASource);
  2844. FToFree:=Parser.Parse;
  2845. Result:=TSQLInsertStatement(CheckClass(FToFree,TSQLInsertStatement));
  2846. AssertIdentifierName('Correct table name',ATable,Result.TableName);
  2847. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  2848. end;
  2849. procedure TTestInsertParser.TestInsertOneField;
  2850. Var
  2851. I : TSQLInsertStatement;
  2852. E : TSQLLiteralExpression;
  2853. L : TSQLIntegerLiteral;
  2854. begin
  2855. I:=TestInsert('INSERT INTO A (B) VALUES (1)','A');
  2856. AssertNotNull('Have fields',I.Fields);
  2857. AssertEquals('1 field',1,I.Fields.Count);
  2858. AssertIdentifierName('Correct field name','B',I.Fields[0]);
  2859. AssertNotNull('Have values',I.Values);
  2860. AssertEquals('Have 1 value',1,I.Values.Count);
  2861. E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
  2862. L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2863. AssertEquals('Correct value',1,L.Value);
  2864. end;
  2865. procedure TTestInsertParser.TestInsertTwoFields;
  2866. Var
  2867. I : TSQLInsertStatement;
  2868. E : TSQLLiteralExpression;
  2869. L : TSQLIntegerLiteral;
  2870. begin
  2871. I:=TestInsert('INSERT INTO A (B,C) VALUES (1,2)','A');
  2872. AssertNotNull('Have fields',I.Fields);
  2873. AssertEquals('2 fields',2,I.Fields.Count);
  2874. AssertIdentifierName('Correct field 1 name','B',I.Fields[0]);
  2875. AssertIdentifierName('Correct field 2 name','C',I.Fields[1]);
  2876. AssertNotNull('Have values',I.Values);
  2877. AssertEquals('Have 2 values',2,I.Values.Count);
  2878. E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
  2879. L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2880. AssertEquals('Correct value',1,L.Value);
  2881. E:=TSQLLiteralExpression(CheckClass(I.Values[1],TSQLLiteralExpression));
  2882. L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2883. AssertEquals('Correct value',2,L.Value);
  2884. end;
  2885. procedure TTestInsertParser.TestInsertOneValue;
  2886. Var
  2887. I : TSQLInsertStatement;
  2888. E : TSQLLiteralExpression;
  2889. L : TSQLIntegerLiteral;
  2890. begin
  2891. I:=TestInsert('INSERT INTO A VALUES (1)','A');
  2892. AssertNull('Have no fields',I.Fields);
  2893. AssertNotNull('Have values',I.Values);
  2894. AssertEquals('Have 1 value',1,I.Values.Count);
  2895. E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
  2896. L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2897. AssertEquals('Correct value',1,L.Value);
  2898. end;
  2899. procedure TTestInsertParser.TestInsertTwoValues;
  2900. Var
  2901. I : TSQLInsertStatement;
  2902. E : TSQLLiteralExpression;
  2903. L : TSQLIntegerLiteral;
  2904. begin
  2905. I:=TestInsert('INSERT INTO A VALUES (1,2)','A');
  2906. AssertNull('Have no fields',I.Fields);
  2907. AssertNotNull('Have values',I.Values);
  2908. AssertEquals('Have 2 values',2,I.Values.Count);
  2909. E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
  2910. L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2911. AssertEquals('Correct value',1,L.Value);
  2912. E:=TSQLLiteralExpression(CheckClass(I.Values[1],TSQLLiteralExpression));
  2913. L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  2914. AssertEquals('Correct value',2,L.Value);
  2915. end;
  2916. { TTestSelectParser }
  2917. function TTestSelectParser.TestSelect(const ASource : String): TSQLSelectStatement;
  2918. begin
  2919. CreateParser(ASource);
  2920. FToFree:=Parser.Parse;
  2921. Result:=TSQLSelectStatement(CheckClass(FToFree,TSQLSelectStatement));
  2922. FSelect:=Result;
  2923. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  2924. end;
  2925. procedure TTestSelectParser.TestSelectError(const ASource: String);
  2926. begin
  2927. FErrSource:=ASource;
  2928. AssertException(ESQLParser,@TestParseError);
  2929. end;
  2930. procedure TTestSelectParser.TestSelectOneFieldOneTable;
  2931. begin
  2932. TestSelect('SELECT B FROM A');
  2933. AssertNull('No transaction name',Select.TransactionName);
  2934. AssertEquals('One field',1,Select.Fields.Count);
  2935. AssertField(Select.Fields[0],'B');
  2936. AssertEquals('One table',1,Select.Tables.Count);
  2937. AssertTable(Select.Tables[0],'A');
  2938. end;
  2939. procedure TTestSelectParser.TestSelectOneFieldOneTableTransaction;
  2940. begin
  2941. TestSelect('SELECT TRANSACTION C B FROM A');
  2942. AssertIdentifierName('Correct transaction name','C',Select.TransactionName);
  2943. AssertEquals('One field',1,Select.Fields.Count);
  2944. AssertField(Select.Fields[0],'B');
  2945. AssertEquals('One table',1,Select.Tables.Count);
  2946. AssertTable(Select.Tables[0],'A');
  2947. end;
  2948. procedure TTestSelectParser.TestSelectOneArrayFieldOneTable;
  2949. Var
  2950. E : TSQLIdentifierExpression;
  2951. begin
  2952. TestSelect('SELECT B[1] FROM A');
  2953. AssertEquals('One field',1,Select.Fields.Count);
  2954. AssertField(Select.Fields[0],'B');
  2955. E:=TSQLIdentifierExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLIdentifierExpression));
  2956. AssertEquals('Element 1 in array ',1,E.ElementIndex);
  2957. AssertEquals('One table',1,Select.Tables.Count);
  2958. AssertTable(Select.Tables[0],'A');
  2959. end;
  2960. procedure TTestSelectParser.TestSelectTwoFieldsOneTable;
  2961. begin
  2962. TestSelect('SELECT B,C FROM A');
  2963. AssertEquals('Two fields',2,Select.Fields.Count);
  2964. AssertField(Select.Fields[0],'B');
  2965. AssertField(Select.Fields[1],'C');
  2966. AssertEquals('One table',1,Select.Tables.Count);
  2967. AssertTable(Select.Tables[0],'A');
  2968. end;
  2969. procedure TTestSelectParser.TestSelectOneFieldAliasOneTable;
  2970. begin
  2971. TestSelect('SELECT B AS C FROM A');
  2972. AssertEquals('One field',1,Select.Fields.Count);
  2973. AssertField(Select.Fields[0],'B','C');
  2974. AssertEquals('One table',1,Select.Tables.Count);
  2975. AssertTable(Select.Tables[0],'A');
  2976. end;
  2977. procedure TTestSelectParser.TestSelectTwoFieldAliasesOneTable;
  2978. begin
  2979. TestSelect('SELECT B AS D,C AS E FROM A');
  2980. AssertEquals('Two fields',2,Select.Fields.Count);
  2981. AssertField(Select.Fields[0],'B','D');
  2982. AssertField(Select.Fields[1],'C','E');
  2983. AssertEquals('One table',1,Select.Tables.Count);
  2984. AssertTable(Select.Tables[0],'A');
  2985. end;
  2986. procedure TTestSelectParser.TestSelectOneDistinctFieldOneTable;
  2987. begin
  2988. TestSelect('SELECT DISTINCT B FROM A');
  2989. AssertEquals('DISTINCT Query',True,Select.Distinct);
  2990. AssertEquals('One field',1,Select.Fields.Count);
  2991. AssertField(Select.Fields[0],'B');
  2992. AssertEquals('One table',1,Select.Tables.Count);
  2993. AssertTable(Select.Tables[0],'A');
  2994. end;
  2995. procedure TTestSelectParser.TestSelectOneAllFieldOneTable;
  2996. begin
  2997. TestSelect('SELECT ALL B FROM A');
  2998. AssertEquals('ALL Query',True,Select.All);
  2999. AssertEquals('One field',1,Select.Fields.Count);
  3000. AssertField(Select.Fields[0],'B');
  3001. AssertEquals('One table',1,Select.Tables.Count);
  3002. AssertTable(Select.Tables[0],'A');
  3003. end;
  3004. procedure TTestSelectParser.TestSelectAsteriskOneTable;
  3005. begin
  3006. TestSelect('SELECT * FROM A');
  3007. AssertEquals('One field',1,Select.Fields.Count);
  3008. CheckClass(Select.Fields[0],TSQLSelectAsterisk);
  3009. AssertEquals('One table',1,Select.Tables.Count);
  3010. AssertTable(Select.Tables[0],'A');
  3011. end;
  3012. procedure TTestSelectParser.TestSelectDistinctAsteriskOneTable;
  3013. begin
  3014. TestSelect('SELECT DISTINCT * FROM A');
  3015. AssertEquals('DISTINCT Query',True,Select.Distinct);
  3016. AssertEquals('One field',1,Select.Fields.Count);
  3017. CheckClass(Select.Fields[0],TSQLSelectAsterisk);
  3018. AssertEquals('One table',1,Select.Tables.Count);
  3019. AssertTable(Select.Tables[0],'A');
  3020. end;
  3021. procedure TTestSelectParser.TestSelectOneFieldOneTableAlias;
  3022. begin
  3023. TestSelect('SELECT C.B FROM A C');
  3024. AssertEquals('One field',1,Select.Fields.Count);
  3025. AssertField(Select.Fields[0],'C.B');
  3026. AssertEquals('One table',1,Select.Tables.Count);
  3027. AssertTable(Select.Tables[0],'A');
  3028. end;
  3029. procedure TTestSelectParser.TestSelectTwoFieldsTwoTables;
  3030. begin
  3031. TestSelect('SELECT B,C FROM A,D');
  3032. AssertEquals('Two fields',2,Select.Fields.Count);
  3033. AssertField(Select.Fields[0],'B');
  3034. AssertField(Select.Fields[1],'C');
  3035. AssertEquals('Two table',2,Select.Tables.Count);
  3036. AssertTable(Select.Tables[0],'A');
  3037. AssertTable(Select.Tables[1],'D');
  3038. end;
  3039. procedure TTestSelectParser.TestSelectTwoFieldsTwoTablesJoin;
  3040. Var
  3041. J : TSQLJoinTableReference;
  3042. begin
  3043. TestSelect('SELECT B,C FROM A JOIN D ON E=F');
  3044. AssertEquals('Two fields',2,Select.Fields.Count);
  3045. AssertField(Select.Fields[0],'B');
  3046. AssertField(Select.Fields[1],'C');
  3047. AssertEquals('One table',1,Select.Tables.Count);
  3048. J:=AssertJoin(Select.Tables[0],'A','D',jtNone);
  3049. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3050. end;
  3051. procedure TTestSelectParser.TestSelectTwoFieldsTwoInnerTablesJoin;
  3052. Var
  3053. J : TSQLJoinTableReference;
  3054. begin
  3055. TestSelect('SELECT B,C FROM A INNER JOIN D ON E=F');
  3056. AssertEquals('Two fields',2,Select.Fields.Count);
  3057. AssertField(Select.Fields[0],'B');
  3058. AssertField(Select.Fields[1],'C');
  3059. AssertEquals('One table',1,Select.Tables.Count);
  3060. J:=AssertJoin(Select.Tables[0],'A','D',jtInner);
  3061. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3062. end;
  3063. procedure TTestSelectParser.TestSelectTwoFieldsTwoOuterTablesJoin;
  3064. Var
  3065. J : TSQLJoinTableReference;
  3066. begin
  3067. TestSelect('SELECT B,C FROM A OUTER JOIN D ON E=F');
  3068. AssertEquals('Two fields',2,Select.Fields.Count);
  3069. AssertField(Select.Fields[0],'B');
  3070. AssertField(Select.Fields[1],'C');
  3071. AssertEquals('One table',1,Select.Tables.Count);
  3072. J:=AssertJoin(Select.Tables[0],'A','D',jtOuter);
  3073. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3074. end;
  3075. procedure TTestSelectParser.TestSelectTwoFieldsTwoLeftTablesJoin;
  3076. Var
  3077. J : TSQLJoinTableReference;
  3078. begin
  3079. TestSelect('SELECT B,C FROM A LEFT JOIN D ON E=F');
  3080. AssertEquals('Two fields',2,Select.Fields.Count);
  3081. AssertField(Select.Fields[0],'B');
  3082. AssertField(Select.Fields[1],'C');
  3083. AssertEquals('One table',1,Select.Tables.Count);
  3084. J:=AssertJoin(Select.Tables[0],'A','D',jtLeft);
  3085. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3086. end;
  3087. procedure TTestSelectParser.TestSelectTwoFieldsTwoRightTablesJoin;
  3088. Var
  3089. J : TSQLJoinTableReference;
  3090. begin
  3091. TestSelect('SELECT B,C FROM A RIGHT JOIN D ON E=F');
  3092. AssertEquals('Two fields',2,Select.Fields.Count);
  3093. AssertField(Select.Fields[0],'B');
  3094. AssertField(Select.Fields[1],'C');
  3095. AssertEquals('One table',1,Select.Tables.Count);
  3096. J:=AssertJoin(Select.Tables[0],'A','D',jtRight);
  3097. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3098. end;
  3099. procedure TTestSelectParser.TestSelectTwoFieldsThreeTablesJoin;
  3100. Var
  3101. J : TSQLJoinTableReference;
  3102. begin
  3103. TestSelect('SELECT B,C FROM A JOIN D ON E=F JOIN G ON (H=I)');
  3104. AssertEquals('Two fields',2,Select.Fields.Count);
  3105. AssertField(Select.Fields[0],'B');
  3106. AssertField(Select.Fields[1],'C');
  3107. AssertEquals('One table',1,Select.Tables.Count);
  3108. j:=AssertJoin(Select.Tables[0],'','G',jtNone);
  3109. AssertJoinOn(J.JoinClause,'H','I',boEq);
  3110. J:=AssertJoin(J.Left,'A','D',jtNone);
  3111. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3112. end;
  3113. procedure TTestSelectParser.TestSelectTwoFieldsBracketThreeTablesJoin;
  3114. Var
  3115. J : TSQLJoinTableReference;
  3116. begin
  3117. TestSelect('SELECT B,C FROM (A JOIN D ON E=F) JOIN G ON (H=I)');
  3118. AssertEquals('Two fields',2,Select.Fields.Count);
  3119. AssertField(Select.Fields[0],'B');
  3120. AssertField(Select.Fields[1],'C');
  3121. AssertEquals('One table',1,Select.Tables.Count);
  3122. j:=AssertJoin(Select.Tables[0],'','G',jtNone);
  3123. AssertJoinOn(J.JoinClause,'H','I',boEq);
  3124. J:=AssertJoin(J.Left,'A','D',jtNone);
  3125. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3126. end;
  3127. procedure TTestSelectParser.TestSelectTwoFieldsThreeBracketTablesJoin;
  3128. Var
  3129. J : TSQLJoinTableReference;
  3130. begin
  3131. TestSelect('SELECT B,C FROM A JOIN (D JOIN G ON E=F) ON (H=I)');
  3132. AssertEquals('Two fields',2,Select.Fields.Count);
  3133. AssertField(Select.Fields[0],'B');
  3134. AssertField(Select.Fields[1],'C');
  3135. AssertEquals('One table',1,Select.Tables.Count);
  3136. j:=AssertJoin(Select.Tables[0],'A','',jtNone);
  3137. AssertJoinOn(J.JoinClause,'H','I',boEq);
  3138. j:=AssertJoin(J.Right,'D','G',jtNone);
  3139. AssertJoinOn(J.JoinClause,'E','F',boEq);
  3140. end;
  3141. procedure TTestSelectParser.TestAggregateCount;
  3142. begin
  3143. TestSelect('SELECT COUNT(B) FROM A');
  3144. AssertEquals('One field',1,Select.Fields.Count);
  3145. AssertEquals('One table',1,Select.Tables.Count);
  3146. AssertTable(Select.Tables[0],'A');
  3147. AssertAggregate(Select.Fields[0],afCount,'B',aoNone,'');
  3148. end;
  3149. procedure TTestSelectParser.TestAggregateCountAsterisk;
  3150. begin
  3151. TestSelect('SELECT COUNT(*) FROM A');
  3152. AssertEquals('One field',1,Select.Fields.Count);
  3153. AssertEquals('One table',1,Select.Tables.Count);
  3154. AssertTable(Select.Tables[0],'A');
  3155. AssertAggregate(Select.Fields[0],afCount,'',aoAsterisk,'');
  3156. end;
  3157. procedure TTestSelectParser.TestAggregateCountAll;
  3158. begin
  3159. TestSelect('SELECT COUNT(ALL B) FROM A');
  3160. AssertEquals('One field',1,Select.Fields.Count);
  3161. AssertEquals('One table',1,Select.Tables.Count);
  3162. AssertTable(Select.Tables[0],'A');
  3163. AssertAggregate(Select.Fields[0],afCount,'B',aoAll,'');
  3164. end;
  3165. procedure TTestSelectParser.TestAggregateCountDistinct;
  3166. begin
  3167. TestSelect('SELECT COUNT(DISTINCT B) FROM A');
  3168. AssertEquals('One field',1,Select.Fields.Count);
  3169. AssertEquals('One table',1,Select.Tables.Count);
  3170. AssertTable(Select.Tables[0],'A');
  3171. AssertAggregate(Select.Fields[0],afCount,'B',aoDistinct,'');
  3172. end;
  3173. procedure TTestSelectParser.TestAggregateMax;
  3174. begin
  3175. TestSelect('SELECT MAX(B) FROM A');
  3176. AssertEquals('One field',1,Select.Fields.Count);
  3177. AssertEquals('One table',1,Select.Tables.Count);
  3178. AssertTable(Select.Tables[0],'A');
  3179. AssertAggregate(Select.Fields[0],afMax,'B',aoNone,'');
  3180. end;
  3181. procedure TTestSelectParser.TestAggregateMaxAsterisk;
  3182. begin
  3183. TestSelectError('SELECT Max(*) FROM A');
  3184. end;
  3185. procedure TTestSelectParser.TestAggregateMaxAll;
  3186. begin
  3187. TestSelect('SELECT MAX(ALL B) FROM A');
  3188. AssertEquals('One field',1,Select.Fields.Count);
  3189. AssertEquals('One table',1,Select.Tables.Count);
  3190. AssertTable(Select.Tables[0],'A');
  3191. AssertAggregate(Select.Fields[0],afMax,'B',aoAll,'');
  3192. end;
  3193. procedure TTestSelectParser.TestAggregateMaxDistinct;
  3194. begin
  3195. TestSelect('SELECT MAX(DISTINCT B) FROM A');
  3196. AssertEquals('One field',1,Select.Fields.Count);
  3197. AssertEquals('One table',1,Select.Tables.Count);
  3198. AssertTable(Select.Tables[0],'A');
  3199. AssertAggregate(Select.Fields[0],afMax,'B',aoDistinct,'');
  3200. end;
  3201. procedure TTestSelectParser.TestAggregateMin;
  3202. begin
  3203. TestSelect('SELECT Min(B) FROM A');
  3204. AssertEquals('One field',1,Select.Fields.Count);
  3205. AssertEquals('One table',1,Select.Tables.Count);
  3206. AssertTable(Select.Tables[0],'A');
  3207. AssertAggregate(Select.Fields[0],afMin,'B',aoNone,'');
  3208. end;
  3209. procedure TTestSelectParser.TestAggregateMinAsterisk;
  3210. begin
  3211. TestSelectError('SELECT Min(*) FROM A');
  3212. end;
  3213. procedure TTestSelectParser.TestAggregateMinAll;
  3214. begin
  3215. TestSelect('SELECT Min(ALL B) FROM A');
  3216. AssertEquals('One field',1,Select.Fields.Count);
  3217. AssertEquals('One table',1,Select.Tables.Count);
  3218. AssertTable(Select.Tables[0],'A');
  3219. AssertAggregate(Select.Fields[0],afMin,'B',aoAll,'');
  3220. end;
  3221. procedure TTestSelectParser.TestAggregateMinDistinct;
  3222. begin
  3223. TestSelect('SELECT Min(DISTINCT B) FROM A');
  3224. AssertEquals('One field',1,Select.Fields.Count);
  3225. AssertEquals('One table',1,Select.Tables.Count);
  3226. AssertTable(Select.Tables[0],'A');
  3227. AssertAggregate(Select.Fields[0],afMin,'B',aoDistinct,'');
  3228. end;
  3229. procedure TTestSelectParser.TestAggregateSum;
  3230. begin
  3231. TestSelect('SELECT Sum(B) FROM A');
  3232. AssertEquals('One field',1,Select.Fields.Count);
  3233. AssertEquals('One table',1,Select.Tables.Count);
  3234. AssertTable(Select.Tables[0],'A');
  3235. AssertAggregate(Select.Fields[0],afSum,'B',aoNone,'');
  3236. end;
  3237. procedure TTestSelectParser.TestAggregateSumAsterisk;
  3238. begin
  3239. TestSelectError('SELECT Sum(*) FROM A');
  3240. end;
  3241. procedure TTestSelectParser.TestAggregateSumAll;
  3242. begin
  3243. TestSelect('SELECT Sum(ALL B) FROM A');
  3244. AssertEquals('One field',1,Select.Fields.Count);
  3245. AssertEquals('One table',1,Select.Tables.Count);
  3246. AssertTable(Select.Tables[0],'A');
  3247. AssertAggregate(Select.Fields[0],afSum,'B',aoAll,'');
  3248. end;
  3249. procedure TTestSelectParser.TestAggregateSumDistinct;
  3250. begin
  3251. TestSelect('SELECT Sum(DISTINCT B) FROM A');
  3252. AssertEquals('One field',1,Select.Fields.Count);
  3253. AssertEquals('One table',1,Select.Tables.Count);
  3254. AssertTable(Select.Tables[0],'A');
  3255. AssertAggregate(Select.Fields[0],afSum,'B',aoDistinct,'');
  3256. end;
  3257. procedure TTestSelectParser.TestAggregateAvg;
  3258. begin
  3259. TestSelect('SELECT Avg(B) FROM A');
  3260. AssertEquals('One field',1,Select.Fields.Count);
  3261. AssertEquals('One table',1,Select.Tables.Count);
  3262. AssertTable(Select.Tables[0],'A');
  3263. AssertAggregate(Select.Fields[0],afAvg,'B',aoNone,'');
  3264. end;
  3265. procedure TTestSelectParser.TestAggregateAvgAsterisk;
  3266. begin
  3267. TestSelectError('SELECT Avg(*) FROM A');
  3268. end;
  3269. procedure TTestSelectParser.TestAggregateAvgAll;
  3270. begin
  3271. TestSelect('SELECT Avg(ALL B) FROM A');
  3272. AssertEquals('One field',1,Select.Fields.Count);
  3273. AssertEquals('One table',1,Select.Tables.Count);
  3274. AssertTable(Select.Tables[0],'A');
  3275. AssertAggregate(Select.Fields[0],afAvg,'B',aoAll,'');
  3276. end;
  3277. procedure TTestSelectParser.TestAggregateAvgDistinct;
  3278. begin
  3279. TestSelect('SELECT Avg(DISTINCT B) FROM A');
  3280. AssertEquals('One field',1,Select.Fields.Count);
  3281. AssertEquals('One table',1,Select.Tables.Count);
  3282. AssertTable(Select.Tables[0],'A');
  3283. AssertAggregate(Select.Fields[0],afAvg,'B',aoDistinct,'');
  3284. end;
  3285. procedure TTestSelectParser.TestUpperConst;
  3286. Var
  3287. E : TSQLFunctionCallExpression;
  3288. L : TSQLLiteralExpression;
  3289. S : TSQLStringLiteral;
  3290. begin
  3291. TestSelect('SELECT UPPER(''a'') FROM A');
  3292. AssertEquals('One field',1,Select.Fields.Count);
  3293. AssertEquals('One table',1,Select.Tables.Count);
  3294. AssertTable(Select.Tables[0],'A');
  3295. CheckClass(Select.Fields[0],TSQLSelectField);
  3296. E:=TSQLFunctionCallExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLFunctionCallExpression));
  3297. AssertEquals('UPPER function name','UPPER',E.Identifier);
  3298. AssertEquals('One function element',1,E.Arguments.Count);
  3299. L:=TSQLLiteralExpression(CheckClass(E.Arguments[0],TSQLLiteralExpression));
  3300. S:=TSQLStringLiteral(CheckClass(L.Literal,TSQLStringLiteral));
  3301. AssertEquals('Correct constant','a',S.Value);
  3302. end;
  3303. procedure TTestSelectParser.TestUpperError;
  3304. begin
  3305. TestSelectError('SELECT UPPER(''A'',''B'') FROM C');
  3306. end;
  3307. procedure TTestSelectParser.TestGenID;
  3308. Var
  3309. E : TSQLGenIDExpression;
  3310. L : TSQLLiteralExpression;
  3311. S : TSQLIntegerLiteral;
  3312. begin
  3313. TestSelect('SELECT GEN_ID(GEN_B,1) FROM RDB$DATABASE');
  3314. AssertEquals('One field',1,Select.Fields.Count);
  3315. AssertEquals('One table',1,Select.Tables.Count);
  3316. AssertTable(Select.Tables[0],'RDB$DATABASE');
  3317. CheckClass(Select.Fields[0],TSQLSelectField);
  3318. E:=TSQLGenIDExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLGenIDExpression));
  3319. AssertIdentifierName('GenID generator function name','GEN_B',E.Generator);
  3320. L:=TSQLLiteralExpression(CheckClass(E.Value,TSQLLiteralExpression));
  3321. S:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
  3322. AssertEquals('Correct constant',1,S.Value);
  3323. end;
  3324. procedure TTestSelectParser.TestGenIDError1;
  3325. begin
  3326. TestSelectError('SELECT GEN_ID(''GEN_B'',1) FROM RDB$DATABASE');
  3327. end;
  3328. procedure TTestSelectParser.TestGenIDError2;
  3329. begin
  3330. TestSelectError('SELECT GEN_ID(''GEN_B'') FROM RDB$DATABASE');
  3331. end;
  3332. procedure TTestSelectParser.TestCastSimple;
  3333. var
  3334. C : TSQLCastExpression;
  3335. L : TSQLLiteralExpression;
  3336. S : TSQLIntegerLiteral;
  3337. begin
  3338. TestSelect('SELECT CAST(1 AS VARCHAR(5)) FROM A');
  3339. AssertEquals('One field',1,Select.Fields.Count);
  3340. AssertEquals('One table',1,Select.Tables.Count);
  3341. AssertTable(Select.Tables[0],'A');
  3342. CheckClass(Select.Fields[0],TSQLSelectField);
  3343. C:=TSQLCastExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLCastExpression));
  3344. L:=TSQLLiteralExpression(CheckClass(C.Value,TSQLLiteralExpression));
  3345. S:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
  3346. AssertEquals('Correct constant',1,S.Value);
  3347. AssertTypeDefaults(C.NewType,5);
  3348. AssertEquals('Correct type',sdtVarChar,C.NewType.DataType);
  3349. end;
  3350. procedure TTestSelectParser.DoExtractSimple(Expected: TSQLExtractElement);
  3351. var
  3352. E : TSQLExtractExpression;
  3353. I : TSQLIdentifierExpression;
  3354. begin
  3355. TestSelect('SELECT EXTRACT('+ExtractElementNames[Expected]+' FROM B) FROM A');
  3356. AssertEquals('One field',1,Select.Fields.Count);
  3357. AssertEquals('One table',1,Select.Tables.Count);
  3358. AssertTable(Select.Tables[0],'A');
  3359. CheckClass(Select.Fields[0],TSQLSelectField);
  3360. E:=TSQLExtractExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLExtractExpression));
  3361. I:=TSQLIdentifierExpression(CheckClass(E.Value,TSQLIdentifierExpression));
  3362. AssertIdentifierName('Correct field','B',I.Identifier);
  3363. FreeAndNil(FParser);
  3364. FreeAndNil(FSource);
  3365. FreeAndNil(FToFree);
  3366. end;
  3367. procedure TTestSelectParser.TestExtractSimple;
  3368. Var
  3369. E : TSQLExtractElement;
  3370. begin
  3371. For E:=Low(TSQLExtractElement) to High(TSQLExtractElement) do
  3372. DoExtractSimple(E);
  3373. end;
  3374. procedure TTestSelectParser.TestOrderByOneField;
  3375. begin
  3376. TestSelect('SELECT B FROM A ORDER BY C');
  3377. AssertEquals('One field',1,Select.Fields.Count);
  3378. AssertEquals('One table',1,Select.Tables.Count);
  3379. AssertField(Select.Fields[0],'B');
  3380. AssertTable(Select.Tables[0],'A');
  3381. AssertEquals('One order by field',1,Select.Orderby.Count);
  3382. AssertOrderBy(Select.OrderBy[0],'C',0,obAscending);
  3383. end;
  3384. procedure TTestSelectParser.TestOrderByTwoFields;
  3385. begin
  3386. TestSelect('SELECT B FROM A ORDER BY C,D');
  3387. AssertEquals('One field',1,Select.Fields.Count);
  3388. AssertEquals('One table',1,Select.Tables.Count);
  3389. AssertField(Select.Fields[0],'B');
  3390. AssertTable(Select.Tables[0],'A');
  3391. AssertEquals('Two order by fields',2,Select.Orderby.Count);
  3392. AssertOrderBy(Select.OrderBy[0],'C',0,obAscending);
  3393. AssertOrderBy(Select.OrderBy[1],'D',0,obAscending);
  3394. end;
  3395. procedure TTestSelectParser.TestOrderByThreeFields;
  3396. begin
  3397. TestSelect('SELECT B FROM A ORDER BY C,D,E');
  3398. AssertEquals('One field',1,Select.Fields.Count);
  3399. AssertEquals('One table',1,Select.Tables.Count);
  3400. AssertField(Select.Fields[0],'B');
  3401. AssertTable(Select.Tables[0],'A');
  3402. AssertEquals('Three order by fields',3,Select.Orderby.Count);
  3403. AssertOrderBy(Select.OrderBy[0],'C',0,obAscending);
  3404. AssertOrderBy(Select.OrderBy[1],'D',0,obAscending);
  3405. AssertOrderBy(Select.OrderBy[2],'E',0,obAscending);
  3406. end;
  3407. procedure TTestSelectParser.TestOrderByOneDescField;
  3408. begin
  3409. TestSelect('SELECT B FROM A ORDER BY C DESC');
  3410. AssertEquals('One field',1,Select.Fields.Count);
  3411. AssertEquals('One table',1,Select.Tables.Count);
  3412. AssertField(Select.Fields[0],'B');
  3413. AssertTable(Select.Tables[0],'A');
  3414. AssertEquals('One order by field',1,Select.Orderby.Count);
  3415. AssertOrderBy(Select.OrderBy[0],'C',0,obDescending);
  3416. end;
  3417. procedure TTestSelectParser.TestOrderByTwoDescFields;
  3418. begin
  3419. TestSelect('SELECT B FROM A ORDER BY C DESC, D DESCENDING');
  3420. AssertEquals('One field',1,Select.Fields.Count);
  3421. AssertEquals('One table',1,Select.Tables.Count);
  3422. AssertField(Select.Fields[0],'B');
  3423. AssertTable(Select.Tables[0],'A');
  3424. AssertEquals('Two order by fields',2,Select.Orderby.Count);
  3425. AssertOrderBy(Select.OrderBy[0],'C',0,obDescending);
  3426. AssertOrderBy(Select.OrderBy[1],'D',0,obDescending);
  3427. end;
  3428. procedure TTestSelectParser.TestOrderByThreeDescFields;
  3429. begin
  3430. TestSelect('SELECT B FROM A ORDER BY C DESC,D DESCENDING, E DESC');
  3431. AssertEquals('One field',1,Select.Fields.Count);
  3432. AssertEquals('One table',1,Select.Tables.Count);
  3433. AssertField(Select.Fields[0],'B');
  3434. AssertTable(Select.Tables[0],'A');
  3435. AssertEquals('Three order by fields',3,Select.Orderby.Count);
  3436. AssertOrderBy(Select.OrderBy[0],'C',0,obDescending);
  3437. AssertOrderBy(Select.OrderBy[1],'D',0,obDescending);
  3438. AssertOrderBy(Select.OrderBy[2],'E',0,obDescending);
  3439. end;
  3440. procedure TTestSelectParser.TestOrderByOneColumn;
  3441. begin
  3442. TestSelect('SELECT B FROM A ORDER BY 1');
  3443. AssertEquals('One field',1,Select.Fields.Count);
  3444. AssertEquals('One table',1,Select.Tables.Count);
  3445. AssertField(Select.Fields[0],'B');
  3446. AssertTable(Select.Tables[0],'A');
  3447. AssertEquals('One order by field',1,Select.Orderby.Count);
  3448. AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
  3449. end;
  3450. procedure TTestSelectParser.TestOrderByTwoColumns;
  3451. begin
  3452. TestSelect('SELECT B,C FROM A ORDER BY 1,2');
  3453. AssertEquals('Two fields',2,Select.Fields.Count);
  3454. AssertEquals('One table',1,Select.Tables.Count);
  3455. AssertField(Select.Fields[0],'B');
  3456. AssertField(Select.Fields[1],'C');
  3457. AssertTable(Select.Tables[0],'A');
  3458. AssertEquals('Two order by fields',2,Select.Orderby.Count);
  3459. AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
  3460. AssertOrderBy(Select.OrderBy[1],'',2,obAscending);
  3461. end;
  3462. procedure TTestSelectParser.TestOrderByTwoColumnsDesc;
  3463. begin
  3464. TestSelect('SELECT B,C FROM A ORDER BY 1 DESC,2');
  3465. AssertEquals('Two fields',2,Select.Fields.Count);
  3466. AssertEquals('One table',1,Select.Tables.Count);
  3467. AssertField(Select.Fields[0],'B');
  3468. AssertField(Select.Fields[1],'C');
  3469. AssertTable(Select.Tables[0],'A');
  3470. AssertEquals('Two order by fields',2,Select.Orderby.Count);
  3471. AssertOrderBy(Select.OrderBy[0],'',1,obDescending);
  3472. AssertOrderBy(Select.OrderBy[1],'',2,obAscending);
  3473. end;
  3474. procedure TTestSelectParser.TestOrderByCollate;
  3475. Var
  3476. O : TSQLOrderByElement;
  3477. begin
  3478. TestSelect('SELECT B,C FROM A ORDER BY D COLLATE E');
  3479. AssertEquals('Two fields',2,Select.Fields.Count);
  3480. AssertEquals('One table',1,Select.Tables.Count);
  3481. AssertField(Select.Fields[0],'B');
  3482. AssertField(Select.Fields[1],'C');
  3483. AssertTable(Select.Tables[0],'A');
  3484. AssertEquals('One order by fields',1,Select.Orderby.Count);
  3485. O:=AssertOrderBy(Select.OrderBy[0],'D',0,obAscending);
  3486. AssertIdentifierName('Correct collation','E',O.Collation);
  3487. end;
  3488. procedure TTestSelectParser.TestOrderByCollateDesc;
  3489. Var
  3490. O : TSQLOrderByElement;
  3491. begin
  3492. TestSelect('SELECT B,C FROM A ORDER BY D COLLATE E');
  3493. AssertEquals('Two fields',2,Select.Fields.Count);
  3494. AssertEquals('One table',1,Select.Tables.Count);
  3495. AssertField(Select.Fields[0],'B');
  3496. AssertField(Select.Fields[1],'C');
  3497. AssertTable(Select.Tables[0],'A');
  3498. AssertEquals('One order by fields',1,Select.Orderby.Count);
  3499. O:=AssertOrderBy(Select.OrderBy[0],'D',0,obAscending);
  3500. AssertIdentifierName('Correct collation','E',O.Collation);
  3501. end;
  3502. procedure TTestSelectParser.TestOrderByCollateDescTwoFields;
  3503. Var
  3504. O : TSQLOrderByElement;
  3505. begin
  3506. TestSelect('SELECT B,C FROM A ORDER BY D COLLATE E DESC,F COLLATE E');
  3507. AssertEquals('Two fields',2,Select.Fields.Count);
  3508. AssertEquals('One table',1,Select.Tables.Count);
  3509. AssertField(Select.Fields[0],'B');
  3510. AssertField(Select.Fields[1],'C');
  3511. AssertTable(Select.Tables[0],'A');
  3512. AssertEquals('Two order by fields',2,Select.Orderby.Count);
  3513. O:=AssertOrderBy(Select.OrderBy[0],'D',0,obDescending);
  3514. AssertIdentifierName('Correct collation','E',O.Collation);
  3515. O:=AssertOrderBy(Select.OrderBy[1],'F',0,obAscending);
  3516. AssertIdentifierName('Correct collation','E',O.Collation);
  3517. end;
  3518. procedure TTestSelectParser.TestGroupByOne;
  3519. begin
  3520. TestSelect('SELECT B,COUNT(C) AS THECOUNT FROM A GROUP BY B');
  3521. AssertEquals('Two fields',2,Select.Fields.Count);
  3522. AssertEquals('One group by field',1,Select.GroupBy.Count);
  3523. AssertIdentifierName('Correct group by field','B',Select.GroupBy[0]);
  3524. AssertField(Select.Fields[0],'B');
  3525. AssertAggregate(Select.Fields[1],afCount,'C',aoNone,'THECOUNT');
  3526. end;
  3527. procedure TTestSelectParser.TestGroupByTwo;
  3528. begin
  3529. TestSelect('SELECT B,C,SUM(D) AS THESUM FROM A GROUP BY B,C');
  3530. AssertEquals('Three fields',3,Select.Fields.Count);
  3531. AssertEquals('One group two fields',2,Select.GroupBy.Count);
  3532. AssertIdentifierName('Correct first group by field','B',Select.GroupBy[0]);
  3533. AssertIdentifierName('Correct second group by field','C',Select.GroupBy[1]);
  3534. AssertField(Select.Fields[0],'B');
  3535. AssertField(Select.Fields[1],'C');
  3536. AssertAggregate(Select.Fields[2],afSum,'D',aoNone,'THESUM');
  3537. end;
  3538. procedure TTestSelectParser.TestHavingOne;
  3539. Var
  3540. H : TSQLBinaryExpression;
  3541. L : TSQLLiteralExpression;
  3542. S : TSQLIntegerLiteral;
  3543. begin
  3544. TestSelect('SELECT B,COUNT(C) AS THECOUNT FROM A GROUP BY B HAVING COUNT(C)>1');
  3545. AssertEquals('Two fields',2,Select.Fields.Count);
  3546. AssertEquals('One group by field',1,Select.GroupBy.Count);
  3547. AssertIdentifierName('Correct group by field','B',Select.GroupBy[0]);
  3548. AssertField(Select.Fields[0],'B');
  3549. AssertAggregate(Select.Fields[1],afCount,'C',aoNone,'THECOUNT');
  3550. AssertNotNull('Have having',Select.Having);
  3551. H:=TSQLBinaryExpression(CheckClass(Select.Having,TSQLBinaryExpression));
  3552. AssertEquals('Larger than',boGT,H.Operation);
  3553. L:=TSQLLiteralExpression(CheckClass(H.Right,TSQLLiteralExpression));
  3554. S:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
  3555. AssertEquals('One',1,S.Value);
  3556. AssertAggregateExpression(H.Left,afCount,'C',aoNone);
  3557. end;
  3558. procedure TTestSelectParser.TestUnionSimple;
  3559. Var
  3560. S : TSQLSelectStatement;
  3561. begin
  3562. TestSelect('SELECT B FROM A UNION SELECT C FROM D');
  3563. AssertEquals('One field',1,Select.Fields.Count);
  3564. AssertField(Select.Fields[0],'B');
  3565. AssertEquals('One table',1,Select.Tables.Count);
  3566. AssertTable(Select.Tables[0],'A');
  3567. S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
  3568. AssertEquals('One field',1,S.Fields.Count);
  3569. AssertField(S.Fields[0],'C');
  3570. AssertEquals('One table',1,S.Tables.Count);
  3571. AssertTable(S.Tables[0],'D');
  3572. AssertEquals('No UNION ALL : ',False,Select.UnionAll)
  3573. end;
  3574. procedure TTestSelectParser.TestUnionSimpleAll;
  3575. Var
  3576. S : TSQLSelectStatement;
  3577. begin
  3578. TestSelect('SELECT B FROM A UNION ALL SELECT C FROM D');
  3579. AssertEquals('One field',1,Select.Fields.Count);
  3580. AssertField(Select.Fields[0],'B');
  3581. AssertEquals('One table',1,Select.Tables.Count);
  3582. AssertTable(Select.Tables[0],'A');
  3583. S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
  3584. AssertEquals('One field',1,S.Fields.Count);
  3585. AssertField(S.Fields[0],'C');
  3586. AssertEquals('One table',1,S.Tables.Count);
  3587. AssertTable(S.Tables[0],'D');
  3588. AssertEquals('UNION ALL : ',True,Select.UnionAll)
  3589. end;
  3590. procedure TTestSelectParser.TestUnionSimpleOrderBy;
  3591. Var
  3592. S : TSQLSelectStatement;
  3593. begin
  3594. TestSelect('SELECT B FROM A UNION SELECT C FROM D ORDER BY 1');
  3595. AssertEquals('One field',1,Select.Fields.Count);
  3596. AssertField(Select.Fields[0],'B');
  3597. AssertEquals('One table',1,Select.Tables.Count);
  3598. AssertTable(Select.Tables[0],'A');
  3599. AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
  3600. S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
  3601. AssertEquals('One field',1,S.Fields.Count);
  3602. AssertField(S.Fields[0],'C');
  3603. AssertEquals('One table',1,S.Tables.Count);
  3604. AssertTable(S.Tables[0],'D');
  3605. end;
  3606. procedure TTestSelectParser.TestUnionDouble;
  3607. Var
  3608. S : TSQLSelectStatement;
  3609. begin
  3610. TestSelect('SELECT B FROM A UNION SELECT C FROM D UNION SELECT E FROM F ORDER BY 1');
  3611. AssertEquals('One field',1,Select.Fields.Count);
  3612. AssertField(Select.Fields[0],'B');
  3613. AssertEquals('One table',1,Select.Tables.Count);
  3614. AssertTable(Select.Tables[0],'A');
  3615. AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
  3616. S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
  3617. AssertEquals('One field',1,S.Fields.Count);
  3618. AssertField(S.Fields[0],'C');
  3619. AssertEquals('One table',1,S.Tables.Count);
  3620. AssertTable(S.Tables[0],'D');
  3621. S:=TSQLSelectStatement(CheckClass(S.Union,TSQLSelectStatement));
  3622. AssertEquals('One field',1,S.Fields.Count);
  3623. AssertField(S.Fields[0],'E');
  3624. AssertEquals('One table',1,S.Tables.Count);
  3625. AssertTable(S.Tables[0],'F');
  3626. end;
  3627. procedure TTestSelectParser.TestUnionError1;
  3628. begin
  3629. TestSelectError('SELECT B FROM A ORDER BY B UNION SELECT C FROM D');
  3630. end;
  3631. procedure TTestSelectParser.TestUnionError2;
  3632. begin
  3633. TestSelectError('SELECT B FROM A UNION SELECT C,E FROM D');
  3634. end;
  3635. procedure TTestSelectParser.TestPlanOrderNatural;
  3636. Var
  3637. E : TSQLSelectPlanExpr;
  3638. N : TSQLSelectNaturalPLan;
  3639. begin
  3640. TestSelect('SELECT A FROM B PLAN SORT (B NATURAL)');
  3641. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3642. AssertEquals('One plan item',1,E.Items.Count);
  3643. AssertEquals('Correct plan type',pjtSort,E.JoinType);
  3644. N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPLan));
  3645. AssertIdentifierName('Correct table','B',N.TableName);
  3646. end;
  3647. procedure TTestSelectParser.TestPlanOrderOrder;
  3648. Var
  3649. E : TSQLSelectPlanExpr;
  3650. O : TSQLSelectOrderedPLan;
  3651. begin
  3652. TestSelect('SELECT A FROM B PLAN SORT (B ORDER C)');
  3653. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3654. AssertEquals('One plan item',1,E.Items.Count);
  3655. AssertEquals('Correct plan type',pjtSort,E.JoinType);
  3656. O:=TSQLSelectOrderedPLan(CheckClass(E.Items[0],TSQLSelectOrderedPLan));
  3657. AssertIdentifierName('Correct table','B',O.TableName);
  3658. AssertIdentifierName('Correct table','C',O.OrderIndex);
  3659. end;
  3660. procedure TTestSelectParser.TestPlanOrderIndex1;
  3661. Var
  3662. E : TSQLSelectPlanExpr;
  3663. O : TSQLSelectIndexedPLan;
  3664. begin
  3665. TestSelect('SELECT A FROM B PLAN SORT (B INDEX (C))');
  3666. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3667. AssertEquals('One plan item',1,E.Items.Count);
  3668. AssertEquals('Correct plan type',pjtSort,E.JoinType);
  3669. O:=TSQLSelectIndexedPLan(CheckClass(E.Items[0],TSQLSelectIndexedPlan));
  3670. AssertIdentifierName('Correct table','B',O.TableName);
  3671. AssertEquals('Correct index count',1,O.Indexes.Count);
  3672. AssertIdentifierName('Correct table','C',O.Indexes[0]);
  3673. end;
  3674. procedure TTestSelectParser.TestPlanOrderIndex2;
  3675. Var
  3676. E : TSQLSelectPlanExpr;
  3677. O : TSQLSelectIndexedPLan;
  3678. begin
  3679. TestSelect('SELECT A FROM B PLAN SORT (B INDEX (C,D))');
  3680. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3681. AssertEquals('One plan item',1,E.Items.Count);
  3682. AssertEquals('Correct plan type',pjtSort,E.JoinType);
  3683. O:=TSQLSelectIndexedPLan(CheckClass(E.Items[0],TSQLSelectIndexedPlan));
  3684. AssertIdentifierName('Correct table','B',O.TableName);
  3685. AssertEquals('Correct index count',2,O.Indexes.Count);
  3686. AssertIdentifierName('Correct table','C',O.Indexes[0]);
  3687. AssertIdentifierName('Correct table','D',O.Indexes[1]);
  3688. end;
  3689. procedure TTestSelectParser.TestPlanJoinNatural;
  3690. Var
  3691. E : TSQLSelectPlanExpr;
  3692. N : TSQLSelectNaturalPLan;
  3693. O : TSQLSelectOrderedPLan;
  3694. begin
  3695. TestSelect('SELECT A FROM B PLAN JOIN (B NATURAL, C ORDER D)');
  3696. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3697. AssertEquals('One plan item',2,E.Items.Count);
  3698. AssertEquals('Correct plan type',pjtJoin,E.JoinType);
  3699. N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
  3700. AssertIdentifierName('Correct table','B',N.TableName);
  3701. O:=TSQLSelectOrderedPLan(CheckClass(E.Items[1],TSQLSelectOrderedPlan));
  3702. AssertIdentifierName('Correct table','C',O.TableName);
  3703. AssertIdentifierName('Correct index','D',O.OrderIndex);
  3704. end;
  3705. procedure TTestSelectParser.TestPlanDefaultNatural;
  3706. Var
  3707. E : TSQLSelectPlanExpr;
  3708. N : TSQLSelectNaturalPLan;
  3709. O : TSQLSelectOrderedPLan;
  3710. begin
  3711. TestSelect('SELECT A FROM B PLAN (B NATURAL, C ORDER D)');
  3712. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3713. AssertEquals('One plan item',2,E.Items.Count);
  3714. AssertEquals('Correct plan type',pjtJoin,E.JoinType);
  3715. N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
  3716. AssertIdentifierName('Correct table','B',N.TableName);
  3717. O:=TSQLSelectOrderedPLan(CheckClass(E.Items[1],TSQLSelectOrderedPlan));
  3718. AssertIdentifierName('Correct table','C',O.TableName);
  3719. AssertIdentifierName('Correct index','D',O.OrderIndex);
  3720. end;
  3721. procedure TTestSelectParser.TestPlanMergeNatural;
  3722. Var
  3723. E : TSQLSelectPlanExpr;
  3724. N : TSQLSelectNaturalPLan;
  3725. O : TSQLSelectOrderedPLan;
  3726. begin
  3727. TestSelect('SELECT A FROM B PLAN MERGE (B NATURAL, C ORDER D)');
  3728. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3729. AssertEquals('One plan item',2,E.Items.Count);
  3730. AssertEquals('Correct plan type',pjtMerge,E.JoinType);
  3731. N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
  3732. AssertIdentifierName('Correct table','B',N.TableName);
  3733. O:=TSQLSelectOrderedPLan(CheckClass(E.Items[1],TSQLSelectOrderedPlan));
  3734. AssertIdentifierName('Correct table','C',O.TableName);
  3735. AssertIdentifierName('Correct index','D',O.OrderIndex);
  3736. end;
  3737. procedure TTestSelectParser.TestPlanMergeNested;
  3738. Var
  3739. E,EN : TSQLSelectPlanExpr;
  3740. N : TSQLSelectNaturalPLan;
  3741. I : TSQLSelectIndexedPLan;
  3742. begin
  3743. TestSelect('SELECT A FROM B PLAN MERGE (SORT (B NATURAL), SORT (JOIN (D NATURAL, E INDEX (F))))');
  3744. E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
  3745. AssertEquals('Two plan items',2,E.Items.Count);
  3746. AssertEquals('Correct overall plan type',pjtMerge,E.JoinType);
  3747. // SORT (B NATURAL)
  3748. EN:=TSQLSelectPlanExpr(CheckClass(E.Items[0],TSQLSelectPlanExpr));
  3749. AssertEquals('Correct plan type Item 1',pjtSort,EN.JoinType);
  3750. AssertEquals('On plan item in item 1',1,EN.Items.Count);
  3751. N:=TSQLSelectNaturalPLan(CheckClass(EN.Items[0],TSQLSelectNaturalPlan));
  3752. AssertIdentifierName('Correct table','B',N.TableName);
  3753. // SORT (JOIN (D...
  3754. EN:=TSQLSelectPlanExpr(CheckClass(E.Items[1],TSQLSelectPlanExpr));
  3755. AssertEquals('Correct plan type item 2',pjtSort,EN.JoinType);
  3756. AssertEquals('One plan item in item 2',1,EN.Items.Count);
  3757. // JOIN (D NATURAL, E
  3758. E:=TSQLSelectPlanExpr(CheckClass(EN.Items[0],TSQLSelectPlanExpr));
  3759. AssertEquals('Correct plan type',pjtJoin,E.JoinType);
  3760. AssertEquals('Two plan items in item 2',2,E.Items.Count);
  3761. N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
  3762. AssertIdentifierName('Correct table','D',N.TableName);
  3763. // E INDEX (F)
  3764. I:=TSQLSelectIndexedPLan(CheckClass(E.Items[1],TSQLSelectIndexedPlan));
  3765. AssertIdentifierName('Correct table','E',I.TableName);
  3766. AssertEquals('Correct index count for table E',1,I.Indexes.Count);
  3767. AssertIdentifierName('Correct index for table E','F',I.Indexes[0]);
  3768. end;
  3769. procedure TTestSelectParser.TestSubSelect;
  3770. Var
  3771. F : TSQLSelectField;
  3772. E : TSQLSelectExpression;
  3773. S : TSQLSelectStatement;
  3774. begin
  3775. TestSelect('SELECT A,(SELECT C FROM D WHERE E=A) AS THECOUNT FROM B');
  3776. AssertEquals('1 table in select',1,Select.Tables.Count);
  3777. AssertTable(Select.Tables[0],'B','');
  3778. AssertEquals('2 fields in select',2,Select.Fields.Count);
  3779. AssertField(Select.Fields[0],'A','');
  3780. F:=TSQLSelectField(CheckClass(Select.fields[1],TSQLSelectField));
  3781. AssertIdentifierName('Correct alias name for subselect','THECOUNT',F.AliasName);
  3782. E:=TSQLSelectExpression(CheckClass(F.Expression,TSQLSelectExpression));
  3783. S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
  3784. AssertEquals('1 field in subselect',1,S.Fields.Count);
  3785. AssertField(S.Fields[0],'C','');
  3786. AssertEquals('1 table in subselect',1,S.Tables.Count);
  3787. AssertTable(S.Tables[0],'D','');
  3788. end;
  3789. procedure TTestSelectParser.TestWhereExists;
  3790. Var
  3791. F : TSQLSelectField;
  3792. E : TSQLExistsExpression;
  3793. S : TSQLSelectStatement;
  3794. begin
  3795. TestSelect('SELECT A FROM B WHERE EXISTS (SELECT C FROM D WHERE E=A)');
  3796. AssertEquals('1 table in select',1,Select.Tables.Count);
  3797. AssertTable(Select.Tables[0],'B','');
  3798. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3799. AssertField(Select.Fields[0],'A','');
  3800. E:=TSQLExistsExpression(CheckClass(Select.Where,TSQLExistsExpression));
  3801. S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
  3802. AssertEquals('1 field in subselect',1,S.Fields.Count);
  3803. AssertField(S.Fields[0],'C','');
  3804. AssertEquals('1 table in subselect',1,S.Tables.Count);
  3805. AssertTable(S.Tables[0],'D','');
  3806. end;
  3807. procedure TTestSelectParser.TestWhereSingular;
  3808. Var
  3809. E : TSQLSingularExpression;
  3810. S : TSQLSelectStatement;
  3811. begin
  3812. TestSelect('SELECT A FROM B WHERE SINGULAR (SELECT C FROM D WHERE E=A)');
  3813. AssertEquals('1 table in select',1,Select.Tables.Count);
  3814. AssertTable(Select.Tables[0],'B','');
  3815. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3816. AssertField(Select.Fields[0],'A','');
  3817. E:=TSQLSingularExpression(CheckClass(Select.Where,TSQLSingularExpression));
  3818. S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
  3819. AssertEquals('1 field in subselect',1,S.Fields.Count);
  3820. AssertField(S.Fields[0],'C','');
  3821. AssertEquals('1 table in subselect',1,S.Tables.Count);
  3822. AssertTable(S.Tables[0],'D','');
  3823. end;
  3824. procedure TTestSelectParser.TestWhereAll;
  3825. Var
  3826. E : TSQLAllExpression;
  3827. S : TSQLSelectStatement;
  3828. B : TSQLBinaryExpression;
  3829. begin
  3830. TestSelect('SELECT A FROM B WHERE A > ALL (SELECT C FROM D WHERE E=F)');
  3831. AssertEquals('1 table in select',1,Select.Tables.Count);
  3832. AssertTable(Select.Tables[0],'B','');
  3833. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3834. AssertField(Select.Fields[0],'A','');
  3835. B:=TSQLBinaryExpression(CheckClass(Select.Where,TSQLBinaryExpression));
  3836. AssertEquals('Correct operation',boGT,B.Operation);
  3837. E:=TSQLAllExpression(CheckClass(B.right,TSQLAllExpression));
  3838. S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
  3839. AssertEquals('1 field in subselect',1,S.Fields.Count);
  3840. AssertField(S.Fields[0],'C','');
  3841. AssertEquals('1 table in subselect',1,S.Tables.Count);
  3842. AssertTable(S.Tables[0],'D','');
  3843. end;
  3844. procedure TTestSelectParser.TestWhereAny;
  3845. Var
  3846. E : TSQLANyExpression;
  3847. S : TSQLSelectStatement;
  3848. B : TSQLBinaryExpression;
  3849. begin
  3850. TestSelect('SELECT A FROM B WHERE A > ANY (SELECT C FROM D WHERE E=F)');
  3851. AssertEquals('1 table in select',1,Select.Tables.Count);
  3852. AssertTable(Select.Tables[0],'B','');
  3853. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3854. AssertField(Select.Fields[0],'A','');
  3855. B:=TSQLBinaryExpression(CheckClass(Select.Where,TSQLBinaryExpression));
  3856. AssertEquals('Correct operation',boGT,B.Operation);
  3857. E:=TSQLAnyExpression(CheckClass(B.right,TSQLANyExpression));
  3858. S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
  3859. AssertEquals('1 field in subselect',1,S.Fields.Count);
  3860. AssertField(S.Fields[0],'C','');
  3861. AssertEquals('1 table in subselect',1,S.Tables.Count);
  3862. AssertTable(S.Tables[0],'D','');
  3863. end;
  3864. procedure TTestSelectParser.TestWhereSome;
  3865. Var
  3866. E : TSQLSomeExpression;
  3867. S : TSQLSelectStatement;
  3868. B : TSQLBinaryExpression;
  3869. begin
  3870. TestSelect('SELECT A FROM B WHERE A > SOME (SELECT C FROM D WHERE E=F)');
  3871. AssertEquals('1 table in select',1,Select.Tables.Count);
  3872. AssertTable(Select.Tables[0],'B','');
  3873. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3874. AssertField(Select.Fields[0],'A','');
  3875. B:=TSQLBinaryExpression(CheckClass(Select.Where,TSQLBinaryExpression));
  3876. AssertEquals('Correct operation',boGT,B.Operation);
  3877. E:=TSQLSomeExpression(CheckClass(B.right,TSQLSomeExpression));
  3878. S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
  3879. AssertEquals('1 field in subselect',1,S.Fields.Count);
  3880. AssertField(S.Fields[0],'C','');
  3881. AssertEquals('1 table in subselect',1,S.Tables.Count);
  3882. AssertTable(S.Tables[0],'D','');
  3883. end;
  3884. procedure TTestSelectParser.TestParam;
  3885. Var
  3886. F : TSQLSelectField;
  3887. P : TSQLParameterExpression;
  3888. begin
  3889. TestSelect('SELECT :A FROM B');
  3890. AssertEquals('1 table in select',1,Select.Tables.Count);
  3891. AssertTable(Select.Tables[0],'B','');
  3892. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3893. AssertNotNull('Have field',Select.Fields[0]);
  3894. F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
  3895. AssertNotNull('Have field expresssion,',F.Expression);
  3896. P:=TSQLParameterExpression(CheckClass(F.Expression,TSQLParameterExpression));
  3897. AssertIdentifierName('Correct parameter name','A',P.Identifier);
  3898. end;
  3899. procedure TTestSelectParser.TestParamExpr;
  3900. Var
  3901. F : TSQLSelectField;
  3902. P : TSQLParameterExpression;
  3903. B : TSQLBinaryExpression;
  3904. begin
  3905. TestSelect('SELECT :A + 1 FROM B');
  3906. AssertEquals('1 table in select',1,Select.Tables.Count);
  3907. AssertTable(Select.Tables[0],'B','');
  3908. AssertEquals('1 fields in select',1,Select.Fields.Count);
  3909. AssertNotNull('Have field',Select.Fields[0]);
  3910. F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
  3911. AssertNotNull('Have field expresssion,',F.Expression);
  3912. B:=TSQLBinaryExpression(CheckClass(F.Expression,TSQLBinaryExpression));
  3913. P:=TSQLParameterExpression(CheckClass(B.Left,TSQLParameterExpression));
  3914. AssertIdentifierName('Correct parameter name','A',P.Identifier);
  3915. end;
  3916. { TTestRollBackParser }
  3917. function TTestRollBackParser.TestRollback(const ASource: String
  3918. ): TSQLRollbackStatement;
  3919. begin
  3920. CreateParser(ASource);
  3921. FToFree:=Parser.Parse;
  3922. Result:=TSQLRollbackStatement(CheckClass(FToFree,TSQLRollbackStatement));
  3923. FRollback:=Result;
  3924. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  3925. end;
  3926. procedure TTestRollBackParser.TestRollbackError(const ASource: String);
  3927. begin
  3928. FErrSource:=ASource;
  3929. AssertException(ESQLParser,@TestParseError);
  3930. end;
  3931. procedure TTestRollBackParser.TestRollback;
  3932. begin
  3933. TestRollBack('ROLLBACK');
  3934. AssertNull('No transaction name',Rollback.TransactionName);
  3935. AssertEquals('No work',False,Rollback.Work);
  3936. AssertEquals('No release',False,Rollback.Release);
  3937. end;
  3938. procedure TTestRollBackParser.TestRollbackWork;
  3939. begin
  3940. TestRollBack('ROLLBACK WORK');
  3941. AssertNull('No transaction name',Rollback.TransactionName);
  3942. AssertEquals('work',True,Rollback.Work);
  3943. AssertEquals('No release',False,Rollback.Release);
  3944. end;
  3945. procedure TTestRollBackParser.TestRollbackRelease;
  3946. begin
  3947. TestRollBack('ROLLBACK RELEASE');
  3948. AssertNull('No transaction name',Rollback.TransactionName);
  3949. AssertEquals('no work',False,Rollback.Work);
  3950. AssertEquals('release',True,Rollback.Release);
  3951. end;
  3952. procedure TTestRollBackParser.TestRollbackWorkRelease;
  3953. begin
  3954. TestRollBack('ROLLBACK WORK RELEASE');
  3955. AssertNull('No transaction name',Rollback.TransactionName);
  3956. AssertEquals('work',True,Rollback.Work);
  3957. AssertEquals('release',True,Rollback.Release);
  3958. end;
  3959. procedure TTestRollBackParser.TestRollbackTransaction;
  3960. begin
  3961. TestRollBack('ROLLBACK TRANSACTION T');
  3962. AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
  3963. AssertEquals('No work',False,Rollback.Work);
  3964. AssertEquals('No release',False,Rollback.Release);
  3965. end;
  3966. procedure TTestRollBackParser.TestRollbackTransactionWork;
  3967. begin
  3968. TestRollBack('ROLLBACK TRANSACTION T WORK');
  3969. AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
  3970. AssertEquals('work',True,Rollback.Work);
  3971. AssertEquals('No release',False,Rollback.Release);
  3972. end;
  3973. procedure TTestRollBackParser.TestRollbackTransactionRelease;
  3974. begin
  3975. TestRollBack('ROLLBACK TRANSACTION T RELEASE');
  3976. AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
  3977. AssertEquals('no work',False,Rollback.Work);
  3978. AssertEquals('release',True,Rollback.Release);
  3979. end;
  3980. procedure TTestRollBackParser.TestRollbackTransactionWorkRelease;
  3981. begin
  3982. TestRollBack('ROLLBACK TRANSACTION T WORK RELEASE');
  3983. AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
  3984. AssertEquals('work',True,Rollback.Work);
  3985. AssertEquals('release',True,Rollback.Release);
  3986. end;
  3987. { TTestCommitParser }
  3988. function TTestCommitParser.TestCommit(const ASource: String
  3989. ): TSQLCommitStatement;
  3990. begin
  3991. CreateParser(ASource);
  3992. FToFree:=Parser.Parse;
  3993. Result:=TSQLCommitStatement(CheckClass(FToFree,TSQLCommitStatement));
  3994. FCommit:=Result;
  3995. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  3996. end;
  3997. procedure TTestCommitParser.TestCommitError(const ASource: String);
  3998. begin
  3999. FErrSource:=ASource;
  4000. AssertException(ESQLParser,@TestParseError);
  4001. end;
  4002. procedure TTestCommitParser.TestCommit;
  4003. begin
  4004. TestCommit('Commit');
  4005. AssertNull('No transaction name',Commit.TransactionName);
  4006. AssertEquals('No work',False,Commit.Work);
  4007. AssertEquals('No release',False,Commit.Release);
  4008. AssertEquals('No Retain',False,Commit.Retain);
  4009. end;
  4010. procedure TTestCommitParser.TestCommitWork;
  4011. begin
  4012. TestCommit('Commit WORK');
  4013. AssertNull('No transaction name',Commit.TransactionName);
  4014. AssertEquals('work',True,Commit.Work);
  4015. AssertEquals('No release',False,Commit.Release);
  4016. AssertEquals('No Retain',False,Commit.Retain);
  4017. end;
  4018. procedure TTestCommitParser.TestCommitRelease;
  4019. begin
  4020. TestCommit('Commit RELEASE');
  4021. AssertNull('No transaction name',Commit.TransactionName);
  4022. AssertEquals('no work',False,Commit.Work);
  4023. AssertEquals('release',True,Commit.Release);
  4024. AssertEquals('No Retain',False,Commit.Retain);
  4025. end;
  4026. procedure TTestCommitParser.TestCommitWorkRelease;
  4027. begin
  4028. TestCommit('Commit WORK RELEASE');
  4029. AssertNull('No transaction name',Commit.TransactionName);
  4030. AssertEquals('work',True,Commit.Work);
  4031. AssertEquals('release',True,Commit.Release);
  4032. AssertEquals('No Retain',False,Commit.Retain);
  4033. end;
  4034. procedure TTestCommitParser.TestCommitTransaction;
  4035. begin
  4036. TestCommit('Commit TRANSACTION T');
  4037. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4038. AssertEquals('No work',False,Commit.Work);
  4039. AssertEquals('No release',False,Commit.Release);
  4040. AssertEquals('No Retain',False,Commit.Retain);
  4041. end;
  4042. procedure TTestCommitParser.TestCommitTransactionWork;
  4043. begin
  4044. TestCommit('Commit WORK TRANSACTION T ');
  4045. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4046. AssertEquals('work',True,Commit.Work);
  4047. AssertEquals('No release',False,Commit.Release);
  4048. AssertEquals('No Retain',False,Commit.Retain);
  4049. end;
  4050. procedure TTestCommitParser.TestCommitTransactionRelease;
  4051. begin
  4052. TestCommit('Commit TRANSACTION T RELEASE');
  4053. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4054. AssertEquals('no work',False,Commit.Work);
  4055. AssertEquals('release',True,Commit.Release);
  4056. AssertEquals('No Retain',False,Commit.Retain);
  4057. end;
  4058. procedure TTestCommitParser.TestCommitTransactionWorkRelease;
  4059. begin
  4060. TestCommit('Commit WORK TRANSACTION T RELEASE');
  4061. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4062. AssertEquals('work',True,Commit.Work);
  4063. AssertEquals('release',True,Commit.Release);
  4064. AssertEquals('No Retain',False,Commit.Retain);
  4065. end;
  4066. procedure TTestCommitParser.TestCommitRetain;
  4067. begin
  4068. TestCommit('Commit RETAIN');
  4069. AssertNull('No transaction name',Commit.TransactionName);
  4070. AssertEquals('No work',False,Commit.Work);
  4071. AssertEquals('No release',False,Commit.Release);
  4072. AssertEquals('Retain',True,Commit.Retain);
  4073. end;
  4074. procedure TTestCommitParser.TestCommitRetainSnapShot;
  4075. begin
  4076. TestCommit('Commit RETAIN SNAPSHOT');
  4077. AssertNull('No transaction name',Commit.TransactionName);
  4078. AssertEquals('No work',False,Commit.Work);
  4079. AssertEquals('No release',False,Commit.Release);
  4080. AssertEquals('Retain',True,Commit.Retain);
  4081. end;
  4082. procedure TTestCommitParser.TestCommitWorkRetain;
  4083. begin
  4084. TestCommit('Commit WORK RETAIN');
  4085. AssertNull('No transaction name',Commit.TransactionName);
  4086. AssertEquals('work',True,Commit.Work);
  4087. AssertEquals('No release',False,Commit.Release);
  4088. AssertEquals('Retain',True,Commit.Retain);
  4089. end;
  4090. procedure TTestCommitParser.TestCommitReleaseRetain;
  4091. begin
  4092. TestCommit('Commit RELEASE RETAIN');
  4093. AssertNull('No transaction name',Commit.TransactionName);
  4094. AssertEquals('no work',False,Commit.Work);
  4095. AssertEquals('release',True,Commit.Release);
  4096. AssertEquals('Retain',True,Commit.Retain);
  4097. end;
  4098. procedure TTestCommitParser.TestCommitWorkReleaseRetain;
  4099. begin
  4100. TestCommit('Commit WORK RELEASE RETAIN');
  4101. AssertNull('No transaction name',Commit.TransactionName);
  4102. AssertEquals('work',True,Commit.Work);
  4103. AssertEquals('release',True,Commit.Release);
  4104. AssertEquals('Retain',True,Commit.Retain);
  4105. end;
  4106. procedure TTestCommitParser.TestCommitTransactionRetain;
  4107. begin
  4108. TestCommit('Commit TRANSACTION T RETAIN');
  4109. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4110. AssertEquals('No work',False,Commit.Work);
  4111. AssertEquals('No release',False,Commit.Release);
  4112. AssertEquals('Retain',True,Commit.Retain);
  4113. end;
  4114. procedure TTestCommitParser.TestCommitTransactionWorkRetain;
  4115. begin
  4116. TestCommit('Commit WORK TRANSACTION T RETAIN');
  4117. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4118. AssertEquals('work',True,Commit.Work);
  4119. AssertEquals('No release',False,Commit.Release);
  4120. AssertEquals('Retain',True,Commit.Retain);
  4121. end;
  4122. procedure TTestCommitParser.TestCommitTransactionReleaseRetain;
  4123. begin
  4124. TestCommit('Commit TRANSACTION T RELEASE RETAIN');
  4125. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4126. AssertEquals('no work',False,Commit.Work);
  4127. AssertEquals('release',True,Commit.Release);
  4128. AssertEquals('Retain',True,Commit.Retain);
  4129. end;
  4130. procedure TTestCommitParser.TestCommitTransactionWorkReleaseRetain;
  4131. begin
  4132. TestCommit('Commit WORK TRANSACTION T RELEASE RETAIN');
  4133. AssertIdentifierName('Transaction name','T',Commit.TransactionName);
  4134. AssertEquals('work',True,Commit.Work);
  4135. AssertEquals('release',True,Commit.Release);
  4136. AssertEquals('Retain',True,Commit.Retain);
  4137. end;
  4138. { TTestExecuteProcedureParser }
  4139. function TTestExecuteProcedureParser.TestExecute(const ASource: String
  4140. ): TSQLExecuteProcedureStatement;
  4141. begin
  4142. CreateParser(ASource);
  4143. FToFree:=Parser.Parse;
  4144. Result:=TSQLExecuteProcedureStatement(CheckClass(FToFree,TSQLExecuteProcedureStatement));
  4145. FExecute:=Result;
  4146. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  4147. end;
  4148. procedure TTestExecuteProcedureParser.TestExecuteError(const ASource: String);
  4149. begin
  4150. FErrSource:=ASource;
  4151. AssertException(ESQLParser,@TestParseError);
  4152. end;
  4153. procedure TTestExecuteProcedureParser.TestExecuteSimple;
  4154. begin
  4155. TestExecute('EXECUTE PROCEDURE A');
  4156. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4157. AssertNull('No transaction name',Execute.TransactionName);
  4158. AssertEquals('No arguments',0,Execute.Params.Count);
  4159. AssertEquals('No return values',0,Execute.Returning.Count);
  4160. end;
  4161. procedure TTestExecuteProcedureParser.TestExecuteSimpleTransaction;
  4162. begin
  4163. TestExecute('EXECUTE PROCEDURE TRANSACTION B A');
  4164. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4165. AssertIdentifierName('Correct transaction name','B',Execute.TransactionName);
  4166. AssertEquals('No arguments',0,Execute.Params.Count);
  4167. AssertEquals('No return values',0,Execute.Returning.Count);
  4168. end;
  4169. procedure TTestExecuteProcedureParser.TestExecuteSimpleReturningValues;
  4170. begin
  4171. TestExecute('EXECUTE PROCEDURE A RETURNING_VALUES :B');
  4172. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4173. AssertNull('No transaction name',Execute.TransactionName);
  4174. AssertEquals('No arguments',0,Execute.Params.Count);
  4175. AssertEquals('1 return value',1,Execute.Returning.Count);
  4176. AssertIdentifierName('return value','B',Execute.Returning[0]);
  4177. end;
  4178. procedure TTestExecuteProcedureParser.TestExecuteSimpleReturning2Values;
  4179. begin
  4180. TestExecute('EXECUTE PROCEDURE A RETURNING_VALUES :B,:C');
  4181. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4182. AssertNull('No transaction name',Execute.TransactionName);
  4183. AssertEquals('No arguments',0,Execute.Params.Count);
  4184. AssertEquals('2 return values',2,Execute.Returning.Count);
  4185. AssertIdentifierName('return value','B',Execute.Returning[0]);
  4186. AssertIdentifierName('return value','C',Execute.Returning[1]);
  4187. end;
  4188. procedure TTestExecuteProcedureParser.TestExecuteOneArg;
  4189. Var
  4190. I : TSQLIdentifierExpression;
  4191. begin
  4192. TestExecute('EXECUTE PROCEDURE A (B)');
  4193. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4194. AssertNull('No transaction name',Execute.TransactionName);
  4195. AssertEquals('One argument',1,Execute.Params.Count);
  4196. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
  4197. AssertIdentifierName('Correct argument','B',I.Identifier);
  4198. AssertEquals('No return values',0,Execute.Returning.Count);
  4199. end;
  4200. procedure TTestExecuteProcedureParser.TestExecuteOneArgNB;
  4201. Var
  4202. I : TSQLIdentifierExpression;
  4203. begin
  4204. TestExecute('EXECUTE PROCEDURE A B');
  4205. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4206. AssertNull('No transaction name',Execute.TransactionName);
  4207. AssertEquals('One argument',1,Execute.Params.Count);
  4208. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
  4209. AssertIdentifierName('Correct argument','B',I.Identifier);
  4210. AssertEquals('No return values',0,Execute.Returning.Count);
  4211. end;
  4212. procedure TTestExecuteProcedureParser.TestExecuteTwoArgs;
  4213. Var
  4214. I : TSQLIdentifierExpression;
  4215. begin
  4216. TestExecute('EXECUTE PROCEDURE A (B,C)');
  4217. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4218. AssertNull('No transaction name',Execute.TransactionName);
  4219. AssertEquals('Two arguments',2,Execute.Params.Count);
  4220. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
  4221. AssertIdentifierName('Correct argument','B',I.Identifier);
  4222. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
  4223. AssertIdentifierName('Correct argument','C',I.Identifier);
  4224. AssertEquals('No return values',0,Execute.Returning.Count);
  4225. end;
  4226. procedure TTestExecuteProcedureParser.TestExecuteTwoArgsNB;
  4227. Var
  4228. I : TSQLIdentifierExpression;
  4229. begin
  4230. TestExecute('EXECUTE PROCEDURE A B, C');
  4231. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4232. AssertNull('No transaction name',Execute.TransactionName);
  4233. AssertEquals('Two arguments',2,Execute.Params.Count);
  4234. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
  4235. AssertIdentifierName('Correct argument','B',I.Identifier);
  4236. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
  4237. AssertIdentifierName('Correct argument','C',I.Identifier);
  4238. AssertEquals('No return values',0,Execute.Returning.Count);
  4239. end;
  4240. procedure TTestExecuteProcedureParser.TestExecuteOneArgSelect;
  4241. Var
  4242. S : TSQLSelectExpression;
  4243. begin
  4244. TestExecute('EXECUTE PROCEDURE A ((SELECT B FROM C))');
  4245. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4246. AssertNull('No transaction name',Execute.TransactionName);
  4247. AssertEquals('One argument',1,Execute.Params.Count);
  4248. S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
  4249. AssertField(S.Select.Fields[0],'B','');
  4250. AssertTable(S.Select.Tables[0],'C','');
  4251. AssertEquals('No return values',0,Execute.Returning.Count);
  4252. end;
  4253. procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectNB;
  4254. Var
  4255. S : TSQLSelectExpression;
  4256. begin
  4257. TestExecute('EXECUTE PROCEDURE A (SELECT B FROM C)');
  4258. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4259. AssertNull('No transaction name',Execute.TransactionName);
  4260. AssertEquals('One argument',1,Execute.Params.Count);
  4261. S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
  4262. AssertField(S.Select.Fields[0],'B','');
  4263. AssertTable(S.Select.Tables[0],'C','');
  4264. AssertEquals('No return values',0,Execute.Returning.Count);
  4265. end;
  4266. procedure TTestExecuteProcedureParser.TestExecuteTwoArgsSelect;
  4267. Var
  4268. S : TSQLSelectExpression;
  4269. I : TSQLIdentifierExpression;
  4270. begin
  4271. TestExecute('EXECUTE PROCEDURE A ((SELECT B FROM C),D)');
  4272. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4273. AssertNull('No transaction name',Execute.TransactionName);
  4274. AssertEquals('Two arguments',2,Execute.Params.Count);
  4275. S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
  4276. AssertField(S.Select.Fields[0],'B','');
  4277. AssertTable(S.Select.Tables[0],'C','');
  4278. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
  4279. AssertIdentifierName('Correct argument','D',I.Identifier);
  4280. AssertEquals('No return values',0,Execute.Returning.Count);
  4281. end;
  4282. procedure TTestExecuteProcedureParser.TestExecuteTwoArgsSelectNB;
  4283. Var
  4284. S : TSQLSelectExpression;
  4285. I : TSQLIdentifierExpression;
  4286. begin
  4287. TestExecute('EXECUTE PROCEDURE A (SELECT B FROM C),D');
  4288. AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
  4289. AssertNull('No transaction name',Execute.TransactionName);
  4290. AssertEquals('Two arguments',2,Execute.Params.Count);
  4291. S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
  4292. AssertField(S.Select.Fields[0],'B','');
  4293. AssertTable(S.Select.Tables[0],'C','');
  4294. I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
  4295. AssertIdentifierName('Correct argument','D',I.Identifier);
  4296. AssertEquals('No return values',0,Execute.Returning.Count);
  4297. end;
  4298. procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr;
  4299. begin
  4300. TestExecuteError('EXECUTE PROCEDURE A ((SELECT B FROM C), 2')
  4301. end;
  4302. procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr2;
  4303. begin
  4304. TestExecuteError('EXECUTE PROCEDURE A (SELECT B FROM C), 2)')
  4305. end;
  4306. procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr3;
  4307. begin
  4308. TestExecuteError('EXECUTE PROCEDURE A B)')
  4309. end;
  4310. procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr4;
  4311. begin
  4312. TestExecuteError('EXECUTE PROCEDURE A B,C)')
  4313. end;
  4314. { EXECUTE PROCEDURE DELETE_EMPLOYEE2 1, 2;
  4315. EXECUTE PROCEDURE DELETE_EMPLOYEE2 (1, 2);
  4316. EXECUTE PROCEDURE DELETE_EMPLOYEE2 ((SELECT A FROM A), 2);
  4317. EXECUTE PROCEDURE DELETE_EMPLOYEE2 (SELECT A FROM A), 2;
  4318. }
  4319. { TTestConnectParser }
  4320. function TTestConnectParser.TestConnect(const ASource: String
  4321. ): TSQLConnectStatement;
  4322. begin
  4323. CreateParser(ASource);
  4324. FToFree:=Parser.Parse;
  4325. Result:=TSQLConnectStatement(CheckClass(FToFree,TSQLConnectStatement));
  4326. FConnect:=Result;
  4327. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  4328. end;
  4329. procedure TTestConnectParser.TestConnectError(const ASource: String);
  4330. begin
  4331. FErrSource:=ASource;
  4332. AssertException(ESQLParser,@TestParseError);
  4333. end;
  4334. procedure TTestConnectParser.TestConnectSimple;
  4335. begin
  4336. TestConnect('CONNECT ''/my/database/file''');
  4337. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4338. AssertEquals('User name','',Connect.UserName);
  4339. AssertEquals('Password','',Connect.Password);
  4340. AssertEquals('Role','',Connect.Role);
  4341. AssertEquals('Cache',0,Connect.Cache);
  4342. end;
  4343. procedure TTestConnectParser.TestConnectUser;
  4344. begin
  4345. TestConnect('CONNECT ''/my/database/file'' USER ''me''');
  4346. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4347. AssertEquals('User name','me',Connect.UserName);
  4348. AssertEquals('Password','',Connect.Password);
  4349. AssertEquals('Role','',Connect.Role);
  4350. AssertEquals('Cache',0,Connect.Cache);
  4351. end;
  4352. procedure TTestConnectParser.TestConnectPassword;
  4353. begin
  4354. TestConnect('CONNECT ''/my/database/file'' PASSWORD ''secret''');
  4355. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4356. AssertEquals('User name','',Connect.UserName);
  4357. AssertEquals('Password','secret',Connect.Password);
  4358. AssertEquals('Role','',Connect.Role);
  4359. AssertEquals('Cache',0,Connect.Cache);
  4360. end;
  4361. procedure TTestConnectParser.TestConnectUserPassword;
  4362. begin
  4363. TestConnect('CONNECT ''/my/database/file'' USER ''me'' PASSWORD ''secret''');
  4364. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4365. AssertEquals('User name','me',Connect.UserName);
  4366. AssertEquals('Password','secret',Connect.Password);
  4367. AssertEquals('Role','',Connect.Role);
  4368. AssertEquals('Cache',0,Connect.Cache);
  4369. end;
  4370. procedure TTestConnectParser.TestConnectUserPasswordRole;
  4371. begin
  4372. TestConnect('CONNECT ''/my/database/file'' USER ''me'' PASSWORD ''secret'' ROLE ''admin''');
  4373. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4374. AssertEquals('User name','me',Connect.UserName);
  4375. AssertEquals('Password','secret',Connect.Password);
  4376. AssertEquals('Role','admin',Connect.Role);
  4377. AssertEquals('Cache',0,Connect.Cache);
  4378. end;
  4379. procedure TTestConnectParser.TestConnectUserPasswordRoleCache;
  4380. begin
  4381. TestConnect('CONNECT ''/my/database/file'' USER ''me'' PASSWORD ''secret'' ROLE ''admin'' CACHE 2048');
  4382. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4383. AssertEquals('User name','me',Connect.UserName);
  4384. AssertEquals('Password','secret',Connect.Password);
  4385. AssertEquals('Role','admin',Connect.Role);
  4386. AssertEquals('Cache',2048,Connect.Cache);
  4387. end;
  4388. procedure TTestConnectParser.TestConnectSimpleCache;
  4389. begin
  4390. TestConnect('CONNECT ''/my/database/file'' CACHE 2048');
  4391. AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
  4392. AssertEquals('User name','',Connect.UserName);
  4393. AssertEquals('Password','',Connect.Password);
  4394. AssertEquals('Role','',Connect.Role);
  4395. AssertEquals('Cache',2048,Connect.Cache);
  4396. end;
  4397. { TTestCreateDatabaseParser }
  4398. function TTestCreateDatabaseParser.TestCreate(const ASource: String
  4399. ): TSQLCreateDatabaseStatement;
  4400. begin
  4401. CreateParser(ASource);
  4402. FToFree:=Parser.Parse;
  4403. Result:=TSQLCreateDatabaseStatement(CheckClass(FToFree,TSQLCreateDatabaseStatement));
  4404. FCreateDB:=Result;
  4405. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  4406. end;
  4407. procedure TTestCreateDatabaseParser.TestCreateError(const ASource: String);
  4408. begin
  4409. FerrSource:=ASource;
  4410. AssertException(ESQLParser,@TestParseError);
  4411. end;
  4412. procedure TTestCreateDatabaseParser.TestSimple;
  4413. begin
  4414. TestCreate('CREATE DATABASE ''/my/database/file''');
  4415. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4416. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4417. AssertEquals('Username','',CreateDB.UserName);
  4418. AssertEquals('Password','',CreateDB.Password);
  4419. AssertNull('Character set',CreateDB.CharSet);
  4420. AssertEquals('Page size',0,CreateDB.PageSize);
  4421. AssertEquals('Length',0,CreateDB.Length);
  4422. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4423. end;
  4424. procedure TTestCreateDatabaseParser.TestSimpleSchema;
  4425. begin
  4426. TestCreate('CREATE SCHEMA ''/my/database/file''');
  4427. AssertEquals('schema',True,CreateDB.UseSchema);
  4428. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4429. AssertEquals('Username','',CreateDB.UserName);
  4430. AssertEquals('Password','',CreateDB.Password);
  4431. AssertNull('Character set',CreateDB.CharSet);
  4432. AssertEquals('Page size',0,CreateDB.PageSize);
  4433. AssertEquals('Length',0,CreateDB.Length);
  4434. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4435. end;
  4436. procedure TTestCreateDatabaseParser.TestSimpleUSer;
  4437. begin
  4438. TestCreate('CREATE DATABASE ''/my/database/file'' USER ''me''');
  4439. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4440. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4441. AssertEquals('Username','me',CreateDB.UserName);
  4442. AssertEquals('Password','',CreateDB.Password);
  4443. AssertNull('Character set',CreateDB.CharSet);
  4444. AssertEquals('Page size',0,CreateDB.PageSize);
  4445. AssertEquals('Length',0,CreateDB.Length);
  4446. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4447. end;
  4448. procedure TTestCreateDatabaseParser.TestSimpleUSerPassword;
  4449. begin
  4450. TestCreate('CREATE DATABASE ''/my/database/file'' USER ''me'' PASSWORD ''SECRET''');
  4451. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4452. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4453. AssertEquals('Username','me',CreateDB.UserName);
  4454. AssertEquals('Password','SECRET',CreateDB.Password);
  4455. AssertNull('Character set',CreateDB.CharSet);
  4456. AssertEquals('Page size',0,CreateDB.PageSize);
  4457. AssertEquals('Length',0,CreateDB.Length);
  4458. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4459. end;
  4460. procedure TTestCreateDatabaseParser.TestSimplePassword;
  4461. begin
  4462. TestCreate('CREATE DATABASE ''/my/database/file'' PASSWORD ''SECRET''');
  4463. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4464. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4465. AssertEquals('Username','',CreateDB.UserName);
  4466. AssertEquals('Password','SECRET',CreateDB.Password);
  4467. AssertNull('Character set',CreateDB.CharSet);
  4468. AssertEquals('Page size',0,CreateDB.PageSize);
  4469. AssertEquals('Length',0,CreateDB.Length);
  4470. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4471. end;
  4472. procedure TTestCreateDatabaseParser.TestPageSize;
  4473. begin
  4474. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE = 2048');
  4475. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4476. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4477. AssertEquals('Username','',CreateDB.UserName);
  4478. AssertEquals('Password','',CreateDB.Password);
  4479. AssertNull('Character set',CreateDB.CharSet);
  4480. AssertEquals('Page size',2048,CreateDB.PageSize);
  4481. AssertEquals('Length',0,CreateDB.Length);
  4482. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4483. end;
  4484. procedure TTestCreateDatabaseParser.TestPageSize2;
  4485. begin
  4486. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048');
  4487. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4488. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4489. AssertEquals('Username','',CreateDB.UserName);
  4490. AssertEquals('Password','',CreateDB.Password);
  4491. AssertNull('Character set',CreateDB.CharSet);
  4492. AssertEquals('Page size',2048,CreateDB.PageSize);
  4493. AssertEquals('Length',0,CreateDB.Length);
  4494. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4495. end;
  4496. procedure TTestCreateDatabaseParser.TestPageSizeLength;
  4497. begin
  4498. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH = 2000');
  4499. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4500. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4501. AssertEquals('Username','',CreateDB.UserName);
  4502. AssertEquals('Password','',CreateDB.Password);
  4503. AssertNull('Character set',CreateDB.CharSet);
  4504. AssertEquals('Page size',2048,CreateDB.PageSize);
  4505. AssertEquals('Length',2000,CreateDB.Length);
  4506. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4507. end;
  4508. procedure TTestCreateDatabaseParser.TestPageSizeLength2;
  4509. begin
  4510. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000');
  4511. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4512. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4513. AssertEquals('Username','',CreateDB.UserName);
  4514. AssertEquals('Password','',CreateDB.Password);
  4515. AssertNull('Character set',CreateDB.CharSet);
  4516. AssertEquals('Page size',2048,CreateDB.PageSize);
  4517. AssertEquals('Length',2000,CreateDB.Length);
  4518. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4519. end;
  4520. procedure TTestCreateDatabaseParser.TestPageSizeLength3;
  4521. begin
  4522. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 PAGES');
  4523. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4524. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4525. AssertEquals('Username','',CreateDB.UserName);
  4526. AssertEquals('Password','',CreateDB.Password);
  4527. AssertNull('Character set',CreateDB.CharSet);
  4528. AssertEquals('Page size',2048,CreateDB.PageSize);
  4529. AssertEquals('Length',2000,CreateDB.Length);
  4530. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4531. end;
  4532. procedure TTestCreateDatabaseParser.TestPageSizeLength4;
  4533. begin
  4534. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 PAGE');
  4535. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4536. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4537. AssertEquals('Username','',CreateDB.UserName);
  4538. AssertEquals('Password','',CreateDB.Password);
  4539. AssertNull('Character set',CreateDB.CharSet);
  4540. AssertEquals('Page size',2048,CreateDB.PageSize);
  4541. AssertEquals('Length',2000,CreateDB.Length);
  4542. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4543. end;
  4544. procedure TTestCreateDatabaseParser.TestCharset;
  4545. begin
  4546. TestCreate('CREATE DATABASE ''/my/database/file'' DEFAULT CHARACTER SET UTF8');
  4547. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4548. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4549. AssertEquals('Username','',CreateDB.UserName);
  4550. AssertEquals('Password','',CreateDB.Password);
  4551. AssertIDentifierName('Character set','UTF8',CreateDB.CharSet);
  4552. AssertEquals('Page size',0,CreateDB.PageSize);
  4553. AssertEquals('Length',0,CreateDB.Length);
  4554. AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
  4555. end;
  4556. procedure TTestCreateDatabaseParser.TestSecondaryFile1;
  4557. begin
  4558. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2''');
  4559. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4560. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4561. AssertEquals('Username','',CreateDB.UserName);
  4562. AssertEquals('Password','',CreateDB.Password);
  4563. AssertNull('Character set',CreateDB.CharSet);
  4564. AssertEquals('Page size',2048,CreateDB.PageSize);
  4565. AssertEquals('Length',2000,CreateDB.Length);
  4566. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4567. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,0);
  4568. end;
  4569. procedure TTestCreateDatabaseParser.TestSecondaryFile2;
  4570. begin
  4571. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH 1000');
  4572. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4573. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4574. AssertEquals('Username','',CreateDB.UserName);
  4575. AssertEquals('Password','',CreateDB.Password);
  4576. AssertNull('Character set',CreateDB.CharSet);
  4577. AssertEquals('Page size',2048,CreateDB.PageSize);
  4578. AssertEquals('Length',2000,CreateDB.Length);
  4579. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4580. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
  4581. end;
  4582. procedure TTestCreateDatabaseParser.TestSecondaryFile3;
  4583. begin
  4584. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH = 1000');
  4585. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4586. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4587. AssertEquals('Username','',CreateDB.UserName);
  4588. AssertEquals('Password','',CreateDB.Password);
  4589. AssertNull('Character set',CreateDB.CharSet);
  4590. AssertEquals('Page size',2048,CreateDB.PageSize);
  4591. AssertEquals('Length',2000,CreateDB.Length);
  4592. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4593. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
  4594. end;
  4595. procedure TTestCreateDatabaseParser.TestSecondaryFile4;
  4596. begin
  4597. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH = 1000 PAGE');
  4598. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4599. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4600. AssertEquals('Username','',CreateDB.UserName);
  4601. AssertEquals('Password','',CreateDB.Password);
  4602. AssertNull('Character set',CreateDB.CharSet);
  4603. AssertEquals('Page size',2048,CreateDB.PageSize);
  4604. AssertEquals('Length',2000,CreateDB.Length);
  4605. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4606. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
  4607. end;
  4608. procedure TTestCreateDatabaseParser.TestSecondaryFile5;
  4609. begin
  4610. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH = 1000 PAGES');
  4611. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4612. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4613. AssertEquals('Username','',CreateDB.UserName);
  4614. AssertEquals('Password','',CreateDB.Password);
  4615. AssertNull('Character set',CreateDB.CharSet);
  4616. AssertEquals('Page size',2048,CreateDB.PageSize);
  4617. AssertEquals('Length',2000,CreateDB.Length);
  4618. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4619. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
  4620. end;
  4621. procedure TTestCreateDatabaseParser.TestSecondaryFile6;
  4622. begin
  4623. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING 3000 ');
  4624. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4625. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4626. AssertEquals('Username','',CreateDB.UserName);
  4627. AssertEquals('Password','',CreateDB.Password);
  4628. AssertNull('Character set',CreateDB.CharSet);
  4629. AssertEquals('Page size',2048,CreateDB.PageSize);
  4630. AssertEquals('Length',2000,CreateDB.Length);
  4631. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4632. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,3000);
  4633. end;
  4634. procedure TTestCreateDatabaseParser.TestSecondaryFile7;
  4635. begin
  4636. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING AT 3000 ');
  4637. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4638. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4639. AssertEquals('Username','',CreateDB.UserName);
  4640. AssertEquals('Password','',CreateDB.Password);
  4641. AssertNull('Character set',CreateDB.CharSet);
  4642. AssertEquals('Page size',2048,CreateDB.PageSize);
  4643. AssertEquals('Length',2000,CreateDB.Length);
  4644. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4645. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,3000);
  4646. end;
  4647. procedure TTestCreateDatabaseParser.TestSecondaryFile9;
  4648. begin
  4649. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH 201 STARTING AT PAGE 3000 ');
  4650. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4651. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4652. AssertEquals('Username','',CreateDB.UserName);
  4653. AssertEquals('Password','',CreateDB.Password);
  4654. AssertNull('Character set',CreateDB.CharSet);
  4655. AssertEquals('Page size',2048,CreateDB.PageSize);
  4656. AssertEquals('Length',2000,CreateDB.Length);
  4657. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4658. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',201,3000);
  4659. end;
  4660. procedure TTestCreateDatabaseParser.TestSecondaryFile10;
  4661. begin
  4662. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING AT PAGE 3000 LENGTH 201');
  4663. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4664. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4665. AssertEquals('Username','',CreateDB.UserName);
  4666. AssertEquals('Password','',CreateDB.Password);
  4667. AssertNull('Character set',CreateDB.CharSet);
  4668. AssertEquals('Page size',2048,CreateDB.PageSize);
  4669. AssertEquals('Length',2000,CreateDB.Length);
  4670. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4671. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',201,3000);
  4672. end;
  4673. procedure TTestCreateDatabaseParser.TestSecondaryFile8;
  4674. begin
  4675. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING AT PAGE 3000 ');
  4676. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4677. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4678. AssertEquals('Username','',CreateDB.UserName);
  4679. AssertEquals('Password','',CreateDB.Password);
  4680. AssertNull('Character set',CreateDB.CharSet);
  4681. AssertEquals('Page size',2048,CreateDB.PageSize);
  4682. AssertEquals('Length',2000,CreateDB.Length);
  4683. AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
  4684. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,3000);
  4685. end;
  4686. procedure TTestCreateDatabaseParser.TestSecondaryFileS;
  4687. begin
  4688. TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' FILE ''/my/database/file3'' ');
  4689. AssertEquals('Not schema',False,CreateDB.UseSchema);
  4690. AssertEquals('Database file','/my/database/file',CreateDB.FileName);
  4691. AssertEquals('Username','',CreateDB.UserName);
  4692. AssertEquals('Password','',CreateDB.Password);
  4693. AssertNull('Character set',CreateDB.CharSet);
  4694. AssertEquals('Page size',2048,CreateDB.PageSize);
  4695. AssertEquals('Length',2000,CreateDB.Length);
  4696. AssertEquals('Secondary files',2,CreateDB.SecondaryFiles.Count);
  4697. AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,0);
  4698. AssertSecondaryFile(CreateDB.SecondaryFiles[1],'/my/database/file3',0,0);
  4699. end;
  4700. procedure TTestCreateDatabaseParser.TestSecondaryFileError1;
  4701. begin
  4702. TestCreateError('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH 3 LENGTH 2');
  4703. end;
  4704. procedure TTestCreateDatabaseParser.TestSecondaryFileError2;
  4705. begin
  4706. TestCreateError('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING 3 STARTING 2');
  4707. end;
  4708. procedure TTestCreateDatabaseParser.TestSecondaryFileError3;
  4709. begin
  4710. TestCreateError('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING 3 LENGTH 2 STARTING 2');
  4711. end;
  4712. { TTestAlterDatabaseParser }
  4713. function TTestAlterDatabaseParser.TestAlter(const ASource: String
  4714. ): TSQLAlterDatabaseStatement;
  4715. begin
  4716. CreateParser(ASource);
  4717. FToFree:=Parser.Parse;
  4718. Result:=TSQLAlterDatabaseStatement(CheckClass(FToFree,TSQLAlterDatabaseStatement));
  4719. FAlterDB:=Result;
  4720. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  4721. end;
  4722. procedure TTestAlterDatabaseParser.TestAlterError(const ASource: String);
  4723. begin
  4724. FerrSource:=ASource;
  4725. AssertException(ESQLParser,@TestParseError);
  4726. end;
  4727. procedure TTestAlterDatabaseParser.TestSimple;
  4728. begin
  4729. TestAlter('ALTER DATABASE ADD FILE ''/my/file''');
  4730. AssertEquals('Operation count',1,AlterDB.Operations.Count);
  4731. AssertSecondaryFile(AlterDB.Operations[0],'/my/file',0,0);
  4732. end;
  4733. procedure TTestAlterDatabaseParser.TestStarting;
  4734. begin
  4735. TestAlter('ALTER DATABASE ADD FILE ''/my/file'' STARTING AT 100');
  4736. AssertEquals('Operation count',1,AlterDB.Operations.Count);
  4737. AssertSecondaryFile(AlterDB.Operations[0],'/my/file',0,100);
  4738. end;
  4739. procedure TTestAlterDatabaseParser.TestStartingLength;
  4740. begin
  4741. TestAlter('ALTER DATABASE ADD FILE ''/my/file'' STARTING AT 100 LENGTH 200');
  4742. AssertEquals('Operation count',1,AlterDB.Operations.Count);
  4743. AssertSecondaryFile(AlterDB.Operations[0],'/my/file',200,100);
  4744. end;
  4745. procedure TTestAlterDatabaseParser.TestFiles;
  4746. begin
  4747. TestAlter('ALTER DATABASE ADD FILE ''/my/file2'' ADD FILE ''/my/file3'' ');
  4748. AssertEquals('Operation count',2,AlterDB.Operations.Count);
  4749. AssertSecondaryFile(AlterDB.Operations[0],'/my/file2',0,0);
  4750. AssertSecondaryFile(AlterDB.Operations[1],'/my/file3',0,0);
  4751. end;
  4752. procedure TTestAlterDatabaseParser.TestFiles2;
  4753. begin
  4754. TestAlter('ALTER DATABASE ADD FILE ''/my/file2'' FILE ''/my/file3'' ');
  4755. AssertEquals('Operation count',2,AlterDB.Operations.Count);
  4756. AssertSecondaryFile(AlterDB.Operations[0],'/my/file2',0,0);
  4757. AssertSecondaryFile(AlterDB.Operations[1],'/my/file3',0,0);
  4758. end;
  4759. procedure TTestAlterDatabaseParser.TestFilesError;
  4760. begin
  4761. TestAlterError('ALTER DATABASE FILE ''/my/file2'' FILE ''/my/file3'' ');
  4762. end;
  4763. procedure TTestAlterDatabaseParser.TestError;
  4764. begin
  4765. TestAlterError('ALTER DATABASE ');
  4766. end;
  4767. procedure TTestAlterDatabaseParser.TestLength;
  4768. begin
  4769. TestAlter('ALTER DATABASE ADD FILE ''/my/file'' LENGTH 200');
  4770. AssertEquals('Operation count',1,AlterDB.Operations.Count);
  4771. AssertSecondaryFile(AlterDB.Operations[0],'/my/file',200,0);
  4772. end;
  4773. { TTestCreateViewParser }
  4774. function TTestCreateViewParser.TestCreate(const ASource: String
  4775. ): TSQLCreateViewStatement;
  4776. begin
  4777. CreateParser(ASource);
  4778. FToFree:=Parser.Parse;
  4779. Result:=TSQLCreateViewStatement(CheckClass(FToFree,TSQLCreateViewStatement));
  4780. FView:=Result;
  4781. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  4782. end;
  4783. procedure TTestCreateViewParser.TestCreateError(const ASource: String);
  4784. begin
  4785. FerrSource:=ASource;
  4786. AssertException(ESQLParser,@TestParseError);
  4787. end;
  4788. procedure TTestCreateViewParser.TestSimple;
  4789. Var
  4790. S : TSQLSelectStatement;
  4791. begin
  4792. TestCreate('CREATE VIEW A AS SELECT B FROM C');
  4793. AssertIdentifierName('View name','A',View.ObjectName);
  4794. AssertNotNull('field list created',View.Fields);
  4795. AssertEquals('No fields in list',0,View.Fields.Count);
  4796. S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
  4797. AssertEquals('1 Field',1,S.Fields.Count);
  4798. AssertField(S.Fields[0],'B','');
  4799. AssertEquals('1 table',1,S.Tables.Count);
  4800. AssertTable(S.Tables[0],'C','');
  4801. AssertEquals('No with check option',False,View.WithCheckOption);
  4802. end;
  4803. procedure TTestCreateViewParser.TestFieldList;
  4804. Var
  4805. S : TSQLSelectStatement;
  4806. begin
  4807. TestCreate('CREATE VIEW A (D) AS SELECT B FROM C');
  4808. AssertIdentifierName('View name','A',View.ObjectName);
  4809. AssertNotNull('field list created',View.Fields);
  4810. AssertEquals('1 field in list',1,View.Fields.Count);
  4811. AssertIdentifierName('Field name','D',View.Fields[0]);
  4812. S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
  4813. AssertEquals('1 Field',1,S.Fields.Count);
  4814. AssertField(S.Fields[0],'B','');
  4815. AssertEquals('1 table',1,S.Tables.Count);
  4816. AssertTable(S.Tables[0],'C','');
  4817. AssertEquals('No with check option',False,View.WithCheckOption);
  4818. end;
  4819. procedure TTestCreateViewParser.TestFieldList2;
  4820. Var
  4821. S : TSQLSelectStatement;
  4822. begin
  4823. TestCreate('CREATE VIEW A (B,C) AS SELECT D,E FROM F');
  4824. AssertIdentifierName('View name','A',View.ObjectName);
  4825. AssertNotNull('field list created',View.Fields);
  4826. AssertEquals('2 fields in list',2,View.Fields.Count);
  4827. AssertIdentifierName('Field name','B',View.Fields[0]);
  4828. AssertIdentifierName('Field name','C',View.Fields[1]);
  4829. S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
  4830. AssertEquals('2 Fields in select',2,S.Fields.Count);
  4831. AssertField(S.Fields[0],'D','');
  4832. AssertField(S.Fields[1],'E','');
  4833. AssertEquals('1 table',1,S.Tables.Count);
  4834. AssertTable(S.Tables[0],'F','');
  4835. AssertEquals('No with check option',False,View.WithCheckOption);
  4836. end;
  4837. procedure TTestCreateViewParser.TestSimpleWithCheckoption;
  4838. Var
  4839. S : TSQLSelectStatement;
  4840. begin
  4841. TestCreate('CREATE VIEW A AS SELECT B FROM C WITH CHECK OPTION');
  4842. AssertIdentifierName('View name','A',View.ObjectName);
  4843. AssertNotNull('field list created',View.Fields);
  4844. AssertEquals('No fields in list',0,View.Fields.Count);
  4845. S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
  4846. AssertEquals('1 Field',1,S.Fields.Count);
  4847. AssertField(S.Fields[0],'B','');
  4848. AssertEquals('1 table',1,S.Tables.Count);
  4849. AssertTable(S.Tables[0],'C','');
  4850. AssertEquals('With check option',True,View.WithCheckOption);
  4851. end;
  4852. { TTestCreateShadowParser }
  4853. function TTestCreateShadowParser.TestCreate(const ASource: String
  4854. ): TSQLCreateShadowStatement;
  4855. begin
  4856. CreateParser(ASource);
  4857. FToFree:=Parser.Parse;
  4858. Result:=TSQLCreateShadowStatement(CheckClass(FToFree,TSQLCreateShadowStatement));
  4859. FShadow:=Result;
  4860. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  4861. end;
  4862. procedure TTestCreateShadowParser.TestCreateError(const ASource: String);
  4863. begin
  4864. FerrSource:=ASource;
  4865. AssertException(ESQLParser,@TestParseError);
  4866. end;
  4867. procedure TTestCreateShadowParser.TestSimple;
  4868. begin
  4869. TestCreate('CREATE SHADOW 1 ''/my/file''');
  4870. AssertEquals('Not manual',False,Shadow.Manual);
  4871. AssertEquals('Not conditional',False,Shadow.COnditional);
  4872. AssertEquals('Filename','/my/file',Shadow.FileName);
  4873. AssertEquals('No length',0,Shadow.Length);
  4874. AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
  4875. end;
  4876. procedure TTestCreateShadowParser.TestLength;
  4877. begin
  4878. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2');
  4879. AssertEquals('Not manual',False,Shadow.Manual);
  4880. AssertEquals('Not conditional',False,Shadow.COnditional);
  4881. AssertEquals('Filename','/my/file',Shadow.FileName);
  4882. AssertEquals('No length',2,Shadow.Length);
  4883. AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
  4884. end;
  4885. procedure TTestCreateShadowParser.TestLength2;
  4886. begin
  4887. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH = 2');
  4888. AssertEquals('Not manual',False,Shadow.Manual);
  4889. AssertEquals('Not conditional',False,Shadow.COnditional);
  4890. AssertEquals('Filename','/my/file',Shadow.FileName);
  4891. AssertEquals('No length',2,Shadow.Length);
  4892. AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
  4893. end;
  4894. procedure TTestCreateShadowParser.TestLength3;
  4895. begin
  4896. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH = 2 PAGE');
  4897. AssertEquals('Not manual',False,Shadow.Manual);
  4898. AssertEquals('Not conditional',False,Shadow.COnditional);
  4899. AssertEquals('Filename','/my/file',Shadow.FileName);
  4900. AssertEquals('No length',2,Shadow.Length);
  4901. AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
  4902. end;
  4903. procedure TTestCreateShadowParser.TestLength4;
  4904. begin
  4905. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH = 2 PAGES');
  4906. AssertEquals('Not manual',False,Shadow.Manual);
  4907. AssertEquals('Not conditional',False,Shadow.COnditional);
  4908. AssertEquals('Filename','/my/file',Shadow.FileName);
  4909. AssertEquals('No length',2,Shadow.Length);
  4910. AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
  4911. end;
  4912. procedure TTestCreateShadowParser.TestSecondaryFile1;
  4913. begin
  4914. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2''');
  4915. AssertEquals('Not manual',False,Shadow.Manual);
  4916. AssertEquals('Not conditional',False,Shadow.COnditional);
  4917. AssertEquals('Filename','/my/file',Shadow.FileName);
  4918. AssertEquals('No length',2,Shadow.Length);
  4919. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4920. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,0);
  4921. end;
  4922. procedure TTestCreateShadowParser.TestSecondaryFile2;
  4923. begin
  4924. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH 1000');
  4925. AssertEquals('Not manual',False,Shadow.Manual);
  4926. AssertEquals('Not conditional',False,Shadow.COnditional);
  4927. AssertEquals('Filename','/my/file',Shadow.FileName);
  4928. AssertEquals('No length',2,Shadow.Length);
  4929. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4930. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
  4931. end;
  4932. procedure TTestCreateShadowParser.TestSecondaryFile3;
  4933. begin
  4934. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH = 1000');
  4935. AssertEquals('Not manual',False,Shadow.Manual);
  4936. AssertEquals('Not conditional',False,Shadow.COnditional);
  4937. AssertEquals('Filename','/my/file',Shadow.FileName);
  4938. AssertEquals('No length',2,Shadow.Length);
  4939. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4940. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
  4941. end;
  4942. procedure TTestCreateShadowParser.TestSecondaryFile4;
  4943. begin
  4944. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH = 1000 PAGE');
  4945. AssertEquals('Not manual',False,Shadow.Manual);
  4946. AssertEquals('Not conditional',False,Shadow.COnditional);
  4947. AssertEquals('Filename','/my/file',Shadow.FileName);
  4948. AssertEquals('No length',2,Shadow.Length);
  4949. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4950. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
  4951. end;
  4952. procedure TTestCreateShadowParser.TestSecondaryFile5;
  4953. begin
  4954. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH = 1000 PAGES');
  4955. AssertEquals('Not manual',False,Shadow.Manual);
  4956. AssertEquals('Not conditional',False,Shadow.COnditional);
  4957. AssertEquals('Filename','/my/file',Shadow.FileName);
  4958. AssertEquals('No length',2,Shadow.Length);
  4959. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4960. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
  4961. end;
  4962. procedure TTestCreateShadowParser.TestSecondaryFile6;
  4963. begin
  4964. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' STARTING 3000');
  4965. AssertEquals('Not manual',False,Shadow.Manual);
  4966. AssertEquals('Not conditional',False,Shadow.COnditional);
  4967. AssertEquals('Filename','/my/file',Shadow.FileName);
  4968. AssertEquals('No length',2,Shadow.Length);
  4969. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4970. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,3000);
  4971. end;
  4972. procedure TTestCreateShadowParser.TestSecondaryFile7;
  4973. begin
  4974. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' STARTING AT 3000');
  4975. AssertEquals('Not manual',False,Shadow.Manual);
  4976. AssertEquals('Not conditional',False,Shadow.COnditional);
  4977. AssertEquals('Filename','/my/file',Shadow.FileName);
  4978. AssertEquals('No length',2,Shadow.Length);
  4979. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4980. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,3000);
  4981. end;
  4982. procedure TTestCreateShadowParser.TestSecondaryFile8;
  4983. begin
  4984. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' STARTING AT PAGE 3000');
  4985. AssertEquals('Not manual',False,Shadow.Manual);
  4986. AssertEquals('Not conditional',False,Shadow.COnditional);
  4987. AssertEquals('Filename','/my/file',Shadow.FileName);
  4988. AssertEquals('No length',2,Shadow.Length);
  4989. AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
  4990. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,3000);
  4991. end;
  4992. procedure TTestCreateShadowParser.TestSecondaryFileS;
  4993. begin
  4994. TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' FILE ''/my/file3''');
  4995. AssertEquals('Not manual',False,Shadow.Manual);
  4996. AssertEquals('Not conditional',False,Shadow.COnditional);
  4997. AssertEquals('Filename','/my/file',Shadow.FileName);
  4998. AssertEquals('No length',2,Shadow.Length);
  4999. AssertEquals('2 secondary file',2,Shadow.SecondaryFiles.Count);
  5000. AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,0);
  5001. AssertSecondaryFile(Shadow.SecondaryFiles[1],'/my/file3',0,0);
  5002. end;
  5003. { TTestProcedureStatement }
  5004. function TTestProcedureStatement.TestStatement(const ASource: String
  5005. ): TSQLStatement;
  5006. begin
  5007. CreateParser(ASource);
  5008. Parser.GetNextToken;
  5009. FToFree:=Parser.ParseProcedureStatements;
  5010. If not (FToFree is TSQLStatement) then
  5011. Fail('Not a TSQLStatement');
  5012. Result:=TSQLStatement(FToFree);
  5013. FSTatement:=Result;
  5014. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  5015. end;
  5016. procedure TTestProcedureStatement.TestParseStatementError;
  5017. begin
  5018. CreateParser(FErrSource);
  5019. FToFree:=Parser.ParseProcedureStatements;
  5020. end;
  5021. procedure TTestProcedureStatement.TestStatementError(const ASource: String);
  5022. begin
  5023. FerrSource:=ASource;
  5024. AssertException(ESQLParser,@TestParseStatementError);
  5025. end;
  5026. procedure TTestProcedureStatement.TestException;
  5027. Var
  5028. E : TSQLExceptionStatement;
  5029. begin
  5030. E:=TSQLExceptionStatement(CheckClass(TestStatement('EXCEPTION MYE'),TSQLExceptionStatement));
  5031. AssertIdentifierName('Exception name','MYE',E.ExceptionName);
  5032. end;
  5033. procedure TTestProcedureStatement.TestExceptionError;
  5034. begin
  5035. TestStatementError('EXCEPTION ''MYE''');
  5036. end;
  5037. procedure TTestProcedureStatement.TestExit;
  5038. Var
  5039. E : TSQLExitStatement;
  5040. begin
  5041. E:=TSQLExitStatement(CheckClass(TestStatement('EXIT'),TSQLExitStatement));
  5042. end;
  5043. procedure TTestProcedureStatement.TestSuspend;
  5044. Var
  5045. E : TSQLSuspendStatement;
  5046. begin
  5047. E:=TSQLSuspendStatement(CheckClass(TestStatement('Suspend'),TSQLSuspendStatement));
  5048. end;
  5049. procedure TTestProcedureStatement.TestEmptyBlock;
  5050. Var
  5051. B : TSQLStatementBlock;
  5052. begin
  5053. B:=TSQLStatementBlock(CheckClass(TestStatement('BEGIN END'),TSQLStatementBlock));
  5054. AssertEquals('No statements',0,B.Statements.Count)
  5055. end;
  5056. procedure TTestProcedureStatement.TestExitBlock;
  5057. Var
  5058. B : TSQLStatementBlock;
  5059. begin
  5060. B:=TSQLStatementBlock(CheckClass(TestStatement('BEGIN EXIT; END'),TSQLStatementBlock));
  5061. AssertEquals('1 statement',1,B.Statements.Count);
  5062. CheckClass(B.Statements[0],TSQLExitStatement);
  5063. end;
  5064. procedure TTestProcedureStatement.TestExitBlockError;
  5065. begin
  5066. TestStatementError('BEGIN EXIT END')
  5067. end;
  5068. procedure TTestProcedureStatement.TestPostEvent;
  5069. Var
  5070. P : TSQLPostEventStatement;
  5071. begin
  5072. P:=TSQLPostEventStatement(CheckClass(TestStatement('POST_EVENT ''MYEVENT'''),TSQLPostEventStatement));
  5073. AssertEquals('Correct event name','MYEVENT' , P.EventName);
  5074. AssertNull('No event column',P.ColName);
  5075. end;
  5076. procedure TTestProcedureStatement.TestPostEventColName;
  5077. Var
  5078. P : TSQLPostEventStatement;
  5079. begin
  5080. P:=TSQLPostEventStatement(CheckClass(TestStatement('POST_EVENT MyColName'),TSQLPostEventStatement));
  5081. AssertEquals('Correct event name','' , P.EventName);
  5082. AssertIdentifierName('event column','MyColName',P.ColName);
  5083. end;
  5084. procedure TTestProcedureStatement.TestPostError;
  5085. begin
  5086. TestStatementError('POST_EVENT 1');
  5087. end;
  5088. procedure TTestProcedureStatement.TestAssignSimple;
  5089. Var
  5090. A : TSQLAssignStatement;
  5091. E : TSQLLiteralExpression;
  5092. I : TSQLIntegerLiteral;
  5093. begin
  5094. A:=TSQLAssignStatement(CheckClass(TestStatement('A=1'),TSQLAssignStatement));
  5095. AssertIdentifierName('Variable name','A',A.Variable);
  5096. E:=TSQLLiteralExpression(CheckClass(A.Expression,TSQLLiteralExpression));
  5097. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5098. AssertEquals('Correct value',1,I.Value);
  5099. end;
  5100. procedure TTestProcedureStatement.TestAssignSimpleNew;
  5101. Var
  5102. A : TSQLAssignStatement;
  5103. E : TSQLLiteralExpression;
  5104. I : TSQLIntegerLiteral;
  5105. begin
  5106. A:=TSQLAssignStatement(CheckClass(TestStatement('NEW.A=1'),TSQLAssignStatement));
  5107. AssertIdentifierName('Variable name','NEW.A',A.Variable);
  5108. E:=TSQLLiteralExpression(CheckClass(A.Expression,TSQLLiteralExpression));
  5109. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5110. AssertEquals('Correct value',1,I.Value);
  5111. end;
  5112. procedure TTestProcedureStatement.TestAssignSelect;
  5113. Var
  5114. A : TSQLAssignStatement;
  5115. S : TSQLSelectExpression;
  5116. begin
  5117. A:=TSQLAssignStatement(CheckClass(TestStatement('A=(SELECT B FROM C)'),TSQLAssignStatement));
  5118. AssertIdentifierName('Variable name','A',A.Variable);
  5119. S:=TSQLSelectExpression(CheckClass(A.Expression,TSQLSelectExpression));
  5120. AssertEquals('Field count',1,S.Select.Fields.Count);
  5121. AssertEquals('Table count',1,S.Select.Tables.Count);
  5122. AssertField(S.Select.Fields[0],'B','');
  5123. AssertTable(S.Select.Tables[0],'C','');
  5124. end;
  5125. procedure TTestProcedureStatement.TestBlockAssignSimple;
  5126. Var
  5127. A : TSQLAssignStatement;
  5128. E : TSQLLiteralExpression;
  5129. I : TSQLIntegerLiteral;
  5130. B : TSQLStatementBlock;
  5131. begin
  5132. B:=TSQLStatementBlock(CheckClass(TestStatement('BEGIN A=1; EXIT; END'),TSQLStatementBlock));
  5133. AssertEquals('2 statements',2,B.Statements.Count);
  5134. CheckClass(B.Statements[1],TSQLExitStatement);
  5135. A:=TSQLAssignStatement(CheckClass(B.Statements[0],TSQLAssignStatement));
  5136. AssertIdentifierName('Variable name','A',A.Variable);
  5137. E:=TSQLLiteralExpression(CheckClass(A.Expression,TSQLLiteralExpression));
  5138. I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5139. AssertEquals('Correct value',1,I.Value);
  5140. end;
  5141. procedure TTestProcedureStatement.TestIf;
  5142. Var
  5143. I : TSQLIfStatement;
  5144. C : TSQLBinaryExpression;
  5145. E : TSQLLiteralExpression;
  5146. A : TSQLIdentifierExpression;
  5147. LI : TSQLIntegerLiteral;
  5148. begin
  5149. I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN EXIT'),TSQLIfStatement));
  5150. C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
  5151. AssertEquals('Equals',boEq,C.Operation);
  5152. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5153. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5154. AssertEquals('Correct value',1,LI.Value);
  5155. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5156. AssertIdentifierName('Variable name','A',A.Identifier);
  5157. CheckClass(I.TrueBranch,TSQLExitStatement);
  5158. end;
  5159. procedure TTestProcedureStatement.TestIfBlock;
  5160. Var
  5161. I : TSQLIfStatement;
  5162. C : TSQLBinaryExpression;
  5163. E : TSQLLiteralExpression;
  5164. A : TSQLIdentifierExpression;
  5165. LI : TSQLIntegerLiteral;
  5166. B : TSQLStatementBlock;
  5167. begin
  5168. I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN BEGIN EXIT; END'),TSQLIfStatement));
  5169. C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
  5170. AssertEquals('Equals',boEq,C.Operation);
  5171. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5172. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5173. AssertEquals('Correct value',1,LI.Value);
  5174. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5175. AssertIdentifierName('Variable name','A',A.Identifier);
  5176. B:=TSQLStatementBlock(CheckClass(I.TrueBranch,TSQLStatementBlock));
  5177. AssertEquals('1 statement',1,B.Statements.Count);
  5178. CheckClass(B.Statements[0],TSQLExitStatement);
  5179. end;
  5180. procedure TTestProcedureStatement.TestIfElse;
  5181. Var
  5182. I : TSQLIfStatement;
  5183. C : TSQLBinaryExpression;
  5184. E : TSQLLiteralExpression;
  5185. A : TSQLIdentifierExpression;
  5186. LI : TSQLIntegerLiteral;
  5187. begin
  5188. I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN EXIT; ELSE SUSPEND'),TSQLIfStatement));
  5189. C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
  5190. AssertEquals('Equals',boEq,C.Operation);
  5191. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5192. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5193. AssertEquals('Correct value',1,LI.Value);
  5194. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5195. AssertIdentifierName('Variable name','A',A.Identifier);
  5196. CheckClass(I.TrueBranch,TSQLExitStatement);
  5197. CheckClass(I.FalseBranch,TSQLSuspendStatement);
  5198. end;
  5199. procedure TTestProcedureStatement.TestIfBlockElse;
  5200. Var
  5201. I : TSQLIfStatement;
  5202. C : TSQLBinaryExpression;
  5203. E : TSQLLiteralExpression;
  5204. A : TSQLIdentifierExpression;
  5205. LI : TSQLIntegerLiteral;
  5206. B : TSQLStatementBlock;
  5207. begin
  5208. I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN BEGIN EXIT; END ELSE SUSPEND'),TSQLIfStatement));
  5209. C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
  5210. AssertEquals('Equals',boEq,C.Operation);
  5211. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5212. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5213. AssertEquals('Correct value',1,LI.Value);
  5214. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5215. AssertIdentifierName('Variable name','A',A.Identifier);
  5216. B:=TSQLStatementBlock(CheckClass(I.TrueBranch,TSQLStatementBlock));
  5217. AssertEquals('1 statement',1,B.Statements.Count);
  5218. CheckClass(B.Statements[0],TSQLExitStatement);
  5219. CheckClass(I.FalseBranch,TSQLSuspendStatement);
  5220. end;
  5221. procedure TTestProcedureStatement.TestIfElseError;
  5222. begin
  5223. TestStatementError('IF (A=B) THEN EXIT ELSE SUSPEND');
  5224. TestStatementError('IF (A=B) THEN BEGIN EXIT; END; ELSE SUSPEND');
  5225. end;
  5226. procedure TTestProcedureStatement.TestIfBlockElseBlock;
  5227. Var
  5228. I : TSQLIfStatement;
  5229. C : TSQLBinaryExpression;
  5230. E : TSQLLiteralExpression;
  5231. A : TSQLIdentifierExpression;
  5232. LI : TSQLIntegerLiteral;
  5233. B : TSQLStatementBlock;
  5234. begin
  5235. I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN BEGIN EXIT; END ELSE BEGIN SUSPEND; END'),TSQLIfStatement));
  5236. C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
  5237. AssertEquals('Equals',boEq,C.Operation);
  5238. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5239. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5240. AssertEquals('Correct value',1,LI.Value);
  5241. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5242. AssertIdentifierName('Variable name','A',A.Identifier);
  5243. B:=TSQLStatementBlock(CheckClass(I.TrueBranch,TSQLStatementBlock));
  5244. AssertEquals('1 statement',1,B.Statements.Count);
  5245. CheckClass(B.Statements[0],TSQLExitStatement);
  5246. B:=TSQLStatementBlock(CheckClass(I.FalseBranch,TSQLStatementBlock));
  5247. AssertEquals('1 statement',1,B.Statements.Count);
  5248. CheckClass(B.Statements[0],TSQLSuspendStatement);
  5249. end;
  5250. procedure TTestProcedureStatement.TestIfErrorBracketLeft;
  5251. begin
  5252. TestStatementError('IF A=1) THEN EXIT');
  5253. end;
  5254. procedure TTestProcedureStatement.TestIfErrorBracketRight;
  5255. begin
  5256. TestStatementError('IF (A=1 THEN EXIT');
  5257. end;
  5258. procedure TTestProcedureStatement.TestIfErrorNoThen;
  5259. begin
  5260. TestStatementError('IF (A=1) EXIT');
  5261. end;
  5262. procedure TTestProcedureStatement.TestIfErrorSemicolonElse;
  5263. begin
  5264. TestStatementError('IF (A=1) THEN EXIT; ELSE SUSPEND');
  5265. end;
  5266. procedure TTestProcedureStatement.TestWhile;
  5267. Var
  5268. W : TSQLWhileStatement;
  5269. C : TSQLBinaryExpression;
  5270. E : TSQLLiteralExpression;
  5271. A : TSQLIdentifierExpression;
  5272. LI : TSQLIntegerLiteral;
  5273. SA : TSQLAssignStatement;
  5274. begin
  5275. W:=TSQLWhileStatement(CheckClass(TestStatement('WHILE (A>1) DO A=A-1'),TSQLWhileStatement));
  5276. C:=TSQLBinaryExpression(CheckClass(W.Condition,TSQLBinaryExpression));
  5277. AssertEquals('Equals',boGT,C.Operation);
  5278. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5279. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5280. AssertEquals('Correct value',1,LI.Value);
  5281. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5282. AssertIdentifierName('Variable name','A',A.Identifier);
  5283. SA:=TSQLAssignStatement(CheckClass(W.Statement,TSQLAssignStatement));
  5284. AssertIdentifierName('Variable name','A',SA.Variable);
  5285. // Check assignment expression
  5286. C:=TSQLBinaryExpression(CheckClass(SA.Expression,TSQLBinaryExpression));
  5287. AssertEquals('Equals',boAdd,C.Operation);
  5288. // Left operand
  5289. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5290. AssertIdentifierName('Variable name','A',A.Identifier);
  5291. // Right operand
  5292. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5293. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5294. AssertEquals('Correct value',-1,LI.Value);
  5295. end;
  5296. procedure TTestProcedureStatement.TestWhileBlock;
  5297. Var
  5298. W : TSQLWhileStatement;
  5299. C : TSQLBinaryExpression;
  5300. E : TSQLLiteralExpression;
  5301. A : TSQLIdentifierExpression;
  5302. LI : TSQLIntegerLiteral;
  5303. SA : TSQLAssignStatement;
  5304. B : TSQLStatementBlock;
  5305. begin
  5306. W:=TSQLWhileStatement(CheckClass(TestStatement('WHILE (A>1) DO BEGIN A=A-1; END'),TSQLWhileStatement));
  5307. C:=TSQLBinaryExpression(CheckClass(W.Condition,TSQLBinaryExpression));
  5308. AssertEquals('Equals',boGT,C.Operation);
  5309. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5310. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5311. AssertEquals('Correct value',1,LI.Value);
  5312. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5313. AssertIdentifierName('Variable name','A',A.Identifier);
  5314. B:=TSQLStatementBlock(CheckClass(W.Statement,TSQLStatementBlock));
  5315. AssertEquals('One statement',1,B.Statements.Count);
  5316. SA:=TSQLAssignStatement(CheckClass(B.Statements[0],TSQLAssignStatement));
  5317. AssertIdentifierName('Variable name','A',SA.Variable);
  5318. // Check assignment expression
  5319. C:=TSQLBinaryExpression(CheckClass(SA.Expression,TSQLBinaryExpression));
  5320. AssertEquals('Equals',boAdd,C.Operation);
  5321. // Left operand
  5322. A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
  5323. AssertIdentifierName('Variable name','A',A.Identifier);
  5324. // Right operand
  5325. E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
  5326. LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
  5327. AssertEquals('Correct value',-1,LI.Value);
  5328. end;
  5329. procedure TTestProcedureStatement.TestWhileErrorBracketLeft;
  5330. begin
  5331. TestStatementError('WHILE A>1) DO A=A-1');
  5332. end;
  5333. procedure TTestProcedureStatement.TestWhileErrorBracketRight;
  5334. begin
  5335. TestStatementError('WHILE (A>1 DO A=A-1');
  5336. end;
  5337. procedure TTestProcedureStatement.TestWhileErrorNoDo;
  5338. begin
  5339. TestStatementError('WHILE (A>1) A=A-1');
  5340. end;
  5341. procedure TTestProcedureStatement.TestWhenAny;
  5342. Var
  5343. W : TSQLWhenStatement;
  5344. begin
  5345. W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN ANY DO EXIT'),TSQLWhenStatement));
  5346. AssertEquals('No error codes',0,W.Errors.Count);
  5347. AssertEquals('Any error',True,W.AnyError);
  5348. CheckClass(W.Statement,TSQLExitStatement);
  5349. end;
  5350. procedure TTestProcedureStatement.TestWhenSQLCode;
  5351. Var
  5352. W : TSQLWhenStatement;
  5353. E : TSQLWhenSQLError;
  5354. begin
  5355. W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN SQLCODE 1 DO EXIT'),TSQLWhenStatement));
  5356. AssertEquals('Not Any error',False,W.AnyError);
  5357. AssertEquals('1 error code',1,W.Errors.Count);
  5358. CheckClass(W.Statement,TSQLExitStatement);
  5359. E:=TSQLWhenSQLError(CheckClass(W.Errors[0],TSQLWhenSQLError));
  5360. AssertEquals('Correct SQL Code',1,E.ErrorCode);
  5361. end;
  5362. procedure TTestProcedureStatement.TestWhenGDSCode;
  5363. Var
  5364. W : TSQLWhenStatement;
  5365. E : TSQLWhenGDSError;
  5366. begin
  5367. W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN GDSCODE 1 DO EXIT'),TSQLWhenStatement));
  5368. AssertEquals('Not Any error',False,W.AnyError);
  5369. AssertEquals('1 error code',1,W.Errors.Count);
  5370. CheckClass(W.Statement,TSQLExitStatement);
  5371. E:=TSQLWhenGDSError(CheckClass(W.Errors[0],TSQLWhenGDSError));
  5372. AssertEquals('Correct SQL Code',1,E.GDSErrorNumber);
  5373. end;
  5374. procedure TTestProcedureStatement.TestWhenException;
  5375. Var
  5376. W : TSQLWhenStatement;
  5377. E : TSQLWhenException;
  5378. begin
  5379. W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN EXCEPTION MYE DO EXIT'),TSQLWhenStatement));
  5380. AssertEquals('Not Any error',False,W.AnyError);
  5381. AssertEquals('1 error code',1,W.Errors.Count);
  5382. CheckClass(W.Statement,TSQLExitStatement);
  5383. E:=TSQLWhenException(CheckClass(W.Errors[0],TSQLWhenException));
  5384. AssertIdentifierName('Correct SQL Code','MYE',E.ExceptionName);
  5385. end;
  5386. procedure TTestProcedureStatement.TestWhenExceptionGDS;
  5387. Var
  5388. W : TSQLWhenStatement;
  5389. E : TSQLWhenException;
  5390. G : TSQLWhenGDSError;
  5391. begin
  5392. W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN EXCEPTION MYE, GDSCODE 1 DO EXIT'),TSQLWhenStatement));
  5393. AssertEquals('Not Any error',False,W.AnyError);
  5394. AssertEquals('2 error code',2,W.Errors.Count);
  5395. CheckClass(W.Statement,TSQLExitStatement);
  5396. E:=TSQLWhenException(CheckClass(W.Errors[0],TSQLWhenException));
  5397. AssertIdentifierName('Correct SQL Code','MYE',E.ExceptionName);
  5398. G:=TSQLWhenGDSError(CheckClass(W.Errors[1],TSQLWhenGDSError));
  5399. AssertEquals('Correct SQL Code',1,G.GDSErrorNumber);
  5400. end;
  5401. procedure TTestProcedureStatement.TestWhenAnyBlock;
  5402. Var
  5403. W : TSQLWhenStatement;
  5404. B : TSQLStatementBlock;
  5405. begin
  5406. W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN ANY DO BEGIN EXIT; END'),TSQLWhenStatement));
  5407. AssertEquals('No error codes',0,W.Errors.Count);
  5408. AssertEquals('Any error',True,W.AnyError);
  5409. B:=TSQLStatementBlock(CheckClass(W.Statement,TSQLStatementBlock));
  5410. AssertEquals('One statement',1,B.Statements.Count);
  5411. CheckClass(B.Statements[0],TSQLExitStatement);
  5412. end;
  5413. procedure TTestProcedureStatement.TestWhenErrorAny;
  5414. begin
  5415. TestStatementError('WHEN ANY, EXCEPTION MY DO EXIT');
  5416. end;
  5417. procedure TTestProcedureStatement.TestWhenErrorNoDo;
  5418. begin
  5419. TestStatementError('WHEN ANY EXIT');
  5420. end;
  5421. procedure TTestProcedureStatement.TestWhenErrorExceptionInt;
  5422. begin
  5423. TestStatementError('WHEN EXCEPTION 1 DO EXIT');
  5424. end;
  5425. procedure TTestProcedureStatement.TestWhenErrorExceptionString;
  5426. begin
  5427. TestStatementError('WHEN EXCEPTION ''1'' DO EXIT');
  5428. end;
  5429. procedure TTestProcedureStatement.TestWhenErrorSqlCode;
  5430. begin
  5431. TestStatementError('WHEN SQLCODE A DO EXIT');
  5432. end;
  5433. procedure TTestProcedureStatement.TestWhenErrorGDSCode;
  5434. begin
  5435. TestStatementError('WHEN GDSCODE A DO EXIT');
  5436. end;
  5437. procedure TTestProcedureStatement.TestExecuteStatement;
  5438. Var
  5439. E : TSQLExecuteProcedureStatement;
  5440. begin
  5441. E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A'),TSQLExecuteProcedureStatement));
  5442. AssertIDentifierName('Correct procedure','A',E.ProcedureName);
  5443. end;
  5444. procedure TTestProcedureStatement.TestExecuteStatementReturningValues;
  5445. Var
  5446. E : TSQLExecuteProcedureStatement;
  5447. begin
  5448. E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A RETURNING_VALUES B'),TSQLExecuteProcedureStatement));
  5449. AssertIDentifierName('Correct procedure','A',E.ProcedureName);
  5450. AssertEquals('Returning 1 value',1,E.Returning.Count);
  5451. AssertIDentifierName('Correct return value','B',E.Returning[0]);
  5452. end;
  5453. procedure TTestProcedureStatement.TestExecuteStatementReturningValuesColon;
  5454. Var
  5455. E : TSQLExecuteProcedureStatement;
  5456. begin
  5457. E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A RETURNING_VALUES :B'),TSQLExecuteProcedureStatement));
  5458. AssertIDentifierName('Correct procedure','A',E.ProcedureName);
  5459. AssertEquals('Returning 1 value',1,E.Returning.Count);
  5460. AssertIDentifierName('Correct return value','B',E.Returning[0]);
  5461. end;
  5462. procedure TTestProcedureStatement.TestExecuteStatementReturningValuesBrackets;
  5463. Var
  5464. E : TSQLExecuteProcedureStatement;
  5465. begin
  5466. E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A RETURNING_VALUES (:B)'),TSQLExecuteProcedureStatement));
  5467. AssertIDentifierName('Correct procedure','A',E.ProcedureName);
  5468. AssertEquals('Returning 1 value',1,E.Returning.Count);
  5469. AssertIDentifierName('Correct return value','B',E.Returning[0]);
  5470. end;
  5471. procedure TTestProcedureStatement.TestForSimple;
  5472. Var
  5473. F : TSQLForStatement;
  5474. P : TSQLPostEventStatement;
  5475. begin
  5476. F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A FROM B INTO :C DO POST_EVENT C'),TSQLForStatement));
  5477. AssertEquals('Field count',1,F.Select.Fields.Count);
  5478. AssertEquals('Table count',1,F.Select.Tables.Count);
  5479. AssertField(F.Select.Fields[0],'A','');
  5480. AssertTable(F.Select.Tables[0],'B','');
  5481. AssertEquals('Into Fieldlist count',1,F.FieldList.Count);
  5482. AssertIdentifierName('Correct field name','C',F.FieldList[0]);
  5483. P:=TSQLPostEventStatement(CheckClass(F.Statement,TSQLPostEventStatement));
  5484. AssertIdentifierName('Event name','C',P.ColName);
  5485. end;
  5486. procedure TTestProcedureStatement.TestForSimpleNoColon;
  5487. Var
  5488. F : TSQLForStatement;
  5489. P : TSQLPostEventStatement;
  5490. begin
  5491. F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A FROM B INTO C DO POST_EVENT C'),TSQLForStatement));
  5492. AssertEquals('Field count',1,F.Select.Fields.Count);
  5493. AssertEquals('Table count',1,F.Select.Tables.Count);
  5494. AssertField(F.Select.Fields[0],'A','');
  5495. AssertTable(F.Select.Tables[0],'B','');
  5496. AssertEquals('Into Fieldlist count',1,F.FieldList.Count);
  5497. AssertIdentifierName('Correct field name','C',F.FieldList[0]);
  5498. P:=TSQLPostEventStatement(CheckClass(F.Statement,TSQLPostEventStatement));
  5499. AssertIdentifierName('Event name','C',P.ColName);
  5500. end;
  5501. procedure TTestProcedureStatement.TestForSimple2fields;
  5502. Var
  5503. F : TSQLForStatement;
  5504. P : TSQLPostEventStatement;
  5505. begin
  5506. F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A,B FROM C INTO :D,:E DO POST_EVENT D'),TSQLForStatement));
  5507. AssertEquals('Field count',2,F.Select.Fields.Count);
  5508. AssertEquals('Table count',1,F.Select.Tables.Count);
  5509. AssertField(F.Select.Fields[0],'A','');
  5510. AssertField(F.Select.Fields[1],'B','');
  5511. AssertTable(F.Select.Tables[0],'C','');
  5512. AssertEquals('Into Fieldlist count',2,F.FieldList.Count);
  5513. AssertIdentifierName('Correct field name','D',F.FieldList[0]);
  5514. AssertIdentifierName('Correct field name','E',F.FieldList[1]);
  5515. P:=TSQLPostEventStatement(CheckClass(F.Statement,TSQLPostEventStatement));
  5516. AssertIdentifierName('Event name','D',P.ColName);
  5517. end;
  5518. procedure TTestProcedureStatement.TestForBlock;
  5519. Var
  5520. F : TSQLForStatement;
  5521. P : TSQLPostEventStatement;
  5522. B : TSQLStatementBlock;
  5523. begin
  5524. F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A FROM B INTO :C DO BEGIN POST_EVENT C; END'),TSQLForStatement));
  5525. AssertEquals('Field count',1,F.Select.Fields.Count);
  5526. AssertEquals('Table count',1,F.Select.Tables.Count);
  5527. AssertField(F.Select.Fields[0],'A','');
  5528. AssertTable(F.Select.Tables[0],'B','');
  5529. AssertEquals('Into Fieldlist count',1,F.FieldList.Count);
  5530. AssertIdentifierName('Correct field name','C',F.FieldList[0]);
  5531. B:=TSQLStatementBlock(CheckClass(F.Statement,TSQLStatementBlock));
  5532. AssertEquals('One statement',1,B.Statements.Count);
  5533. P:=TSQLPostEventStatement(CheckClass(B.Statements[0],TSQLPostEventStatement));
  5534. AssertIdentifierName('Event name','C',P.ColName);
  5535. end;
  5536. { TTestCreateProcedureParser }
  5537. function TTestCreateProcedureParser.TestCreate(const ASource: String
  5538. ): TSQLCreateProcedureStatement;
  5539. begin
  5540. CreateParser(ASource);
  5541. FToFree:=Parser.Parse;
  5542. Result:=TSQLCreateProcedureStatement(CheckClass(FToFree,TSQLCreateProcedureStatement));
  5543. FSTatement:=Result;
  5544. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  5545. end;
  5546. procedure TTestCreateProcedureParser.TestCreateError(const ASource: String
  5547. );
  5548. begin
  5549. FErrSource:=ASource;
  5550. AssertException(ESQLParser,@TestParseError);
  5551. end;
  5552. procedure TTestCreateProcedureParser.TestEmptyProcedure;
  5553. begin
  5554. TestCreate('CREATE PROCEDURE A AS BEGIN END');
  5555. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5556. AssertEquals('No arguments',0,Statement.InputVariables.Count);
  5557. AssertEquals('No return values',0,Statement.OutputVariables.Count);
  5558. AssertEquals('No local variables',0,Statement.LocalVariables.Count);
  5559. AssertEquals('No statements',0,Statement.Statements.Count);
  5560. end;
  5561. procedure TTestCreateProcedureParser.TestExitProcedure;
  5562. begin
  5563. TestCreate('CREATE PROCEDURE A AS BEGIN EXIT; END');
  5564. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5565. AssertEquals('No arguments',0,Statement.InputVariables.Count);
  5566. AssertEquals('No return values',0,Statement.OutputVariables.Count);
  5567. AssertEquals('No local variables',0,Statement.LocalVariables.Count);
  5568. AssertEquals('One statement',1,Statement.Statements.Count);
  5569. CheckClass(Statement.Statements[0],TSQLExitStatement);
  5570. end;
  5571. procedure TTestCreateProcedureParser.TestProcedureOneArgument;
  5572. Var
  5573. P : TSQLProcedureParamDef;
  5574. begin
  5575. TestCreate('CREATE PROCEDURE A (P INT) AS BEGIN END');
  5576. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5577. AssertEquals('1 arguments',1,Statement.InputVariables.Count);
  5578. P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[0],TSQLProcedureParamDef));
  5579. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5580. AssertNotNull('Have type definition',P.ParamType);
  5581. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5582. AssertEquals('No return values',0,Statement.OutputVariables.Count);
  5583. AssertEquals('No local variables',0,Statement.LocalVariables.Count);
  5584. AssertEquals('No statements',0,Statement.Statements.Count);
  5585. end;
  5586. procedure TTestCreateProcedureParser.TestProcedureTwoArguments;
  5587. Var
  5588. P : TSQLProcedureParamDef;
  5589. begin
  5590. TestCreate('CREATE PROCEDURE A (P INT,Q CHAR(4)) AS BEGIN END');
  5591. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5592. AssertEquals('Two arguments',2,Statement.InputVariables.Count);
  5593. P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[0],TSQLProcedureParamDef));
  5594. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5595. AssertNotNull('Have type definition',P.ParamType);
  5596. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5597. AssertEquals('No return values',0,Statement.OutputVariables.Count);
  5598. P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[1],TSQLProcedureParamDef));
  5599. AssertIdentifierName('Correct parameter name','Q',P.ParamName);
  5600. AssertNotNull('Have type definition',P.ParamType);
  5601. AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
  5602. AssertEquals('Correct length',4,P.ParamType.Len);
  5603. //
  5604. AssertEquals('No local variables',0,Statement.LocalVariables.Count);
  5605. AssertEquals('No statements',0,Statement.Statements.Count);
  5606. end;
  5607. procedure TTestCreateProcedureParser.TestProcedureOneReturnValue;
  5608. Var
  5609. P : TSQLProcedureParamDef;
  5610. begin
  5611. TestCreate('CREATE PROCEDURE A RETURNS (P INT) AS BEGIN END');
  5612. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5613. AssertEquals('1 return value',1,Statement.OutputVariables.Count);
  5614. P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[0],TSQLProcedureParamDef));
  5615. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5616. AssertNotNull('Have type definition',P.ParamType);
  5617. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5618. AssertEquals('No input values',0,Statement.InputVariables.Count);
  5619. AssertEquals('No local variables',0,Statement.LocalVariables.Count);
  5620. AssertEquals('No statements',0,Statement.Statements.Count);
  5621. end;
  5622. procedure TTestCreateProcedureParser.TestProcedureTwoReturnValues;
  5623. Var
  5624. P : TSQLProcedureParamDef;
  5625. begin
  5626. TestCreate('CREATE PROCEDURE A RETURNS (P INT, Q CHAR(5)) AS BEGIN END');
  5627. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5628. AssertEquals('2 return values',2,Statement.OutputVariables.Count);
  5629. P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[0],TSQLProcedureParamDef));
  5630. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5631. AssertNotNull('Have type definition',P.ParamType);
  5632. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5633. P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[1],TSQLProcedureParamDef));
  5634. AssertIdentifierName('Correct parameter name','Q',P.ParamName);
  5635. AssertNotNull('Have type definition',P.ParamType);
  5636. AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
  5637. AssertEquals('Correct length',5,P.ParamType.Len);
  5638. AssertEquals('No input values',0,Statement.InputVariables.Count);
  5639. AssertEquals('No local variables',0,Statement.LocalVariables.Count);
  5640. AssertEquals('No statements',0,Statement.Statements.Count);
  5641. end;
  5642. procedure TTestCreateProcedureParser.TestProcedureOneLocalVariable;
  5643. Var
  5644. P : TSQLProcedureParamDef;
  5645. begin
  5646. TestCreate('CREATE PROCEDURE A AS DECLARE VARIABLE P INT; BEGIN END');
  5647. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5648. AssertEquals('0 return values',0,Statement.OutputVariables.Count);
  5649. AssertEquals('1 local variable',1,Statement.LocalVariables.Count);
  5650. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
  5651. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5652. AssertNotNull('Have type definition',P.ParamType);
  5653. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5654. AssertEquals('No input values',0,Statement.InputVariables.Count);
  5655. AssertEquals('No statements',0,Statement.Statements.Count);
  5656. end;
  5657. procedure TTestCreateProcedureParser.TestProcedureTwoLocalVariable;
  5658. Var
  5659. P : TSQLProcedureParamDef;
  5660. begin
  5661. TestCreate('CREATE PROCEDURE A AS DECLARE VARIABLE P INT; DECLARE VARIABLE Q CHAR(5); BEGIN END');
  5662. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5663. AssertEquals('0 return values',0,Statement.OutputVariables.Count);
  5664. AssertEquals('2 local variable',2,Statement.LocalVariables.Count);
  5665. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
  5666. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5667. AssertNotNull('Have type definition',P.ParamType);
  5668. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5669. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[1],TSQLProcedureParamDef));
  5670. AssertIdentifierName('Correct parameter name','Q',P.ParamName);
  5671. AssertNotNull('Have type definition',P.ParamType);
  5672. AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
  5673. AssertEquals('Correct length',5,P.ParamType.Len);
  5674. AssertEquals('No input values',0,Statement.InputVariables.Count);
  5675. AssertEquals('No statements',0,Statement.Statements.Count);
  5676. end;
  5677. procedure TTestCreateProcedureParser.TestProcedureInputOutputLocal;
  5678. Var
  5679. P : TSQLProcedureParamDef;
  5680. begin
  5681. TestCreate('CREATE PROCEDURE A (P INT) RETURNS (Q CHAR(5)) AS DECLARE VARIABLE R VARCHAR(5); BEGIN END');
  5682. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5683. // Input
  5684. AssertEquals('1 input value',1,Statement.InputVariables.Count);
  5685. P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[0],TSQLProcedureParamDef));
  5686. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5687. AssertNotNull('Have type definition',P.ParamType);
  5688. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5689. // Output
  5690. AssertEquals('1 return values',1,Statement.OutputVariables.Count);
  5691. P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[0],TSQLProcedureParamDef));
  5692. AssertIdentifierName('Correct parameter name','Q',P.ParamName);
  5693. AssertNotNull('Have type definition',P.ParamType);
  5694. AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
  5695. AssertEquals('Correct length',5,P.ParamType.Len);
  5696. // Local
  5697. AssertEquals('1 local variable',1,Statement.LocalVariables.Count);
  5698. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
  5699. AssertIdentifierName('Correct parameter name','R',P.ParamName);
  5700. AssertNotNull('Have type definition',P.ParamType);
  5701. AssertEquals('Correct type',sdtvarChar,P.ParamType.DataType);
  5702. AssertEquals('Correct length',5,P.ParamType.Len);
  5703. AssertEquals('No statements',0,Statement.Statements.Count);
  5704. end;
  5705. { TTestCreateTriggerParser }
  5706. function TTestCreateTriggerParser.TestCreate(const ASource: String
  5707. ): TSQLCreateTriggerStatement;
  5708. begin
  5709. CreateParser(ASource);
  5710. FToFree:=Parser.Parse;
  5711. Result:=TSQLCreateTriggerStatement(CheckClass(FToFree,TSQLCreateTriggerStatement));
  5712. FSTatement:=Result;
  5713. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  5714. end;
  5715. function TTestCreateTriggerParser.TestAlter(const ASource: String
  5716. ): TSQLAlterTriggerStatement;
  5717. begin
  5718. CreateParser(ASource);
  5719. FToFree:=Parser.Parse;
  5720. Result:=TSQLAlterTriggerStatement(CheckClass(FToFree,TSQLAlterTriggerStatement));
  5721. FSTatement:=Result;
  5722. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  5723. end;
  5724. procedure TTestCreateTriggerParser.TestCreateError(const ASource: String);
  5725. begin
  5726. FErrSource:=ASource;
  5727. AssertException(ESQLParser,@TestParseError);
  5728. end;
  5729. procedure TTestCreateTriggerParser.TestEmptyTrigger;
  5730. begin
  5731. TestCreate('CREATE TRIGGER A FOR B BEFORE UPDATE AS BEGIN END');
  5732. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5733. AssertIdentifierName('Correct table','B',Statement.TableName);
  5734. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5735. AssertEquals('No Statements',0,Statement.Statements.Count);
  5736. AssertEquals('No position',0,Statement.Position);
  5737. AssertEquals('No active/inactive',tsNone,Statement.State);
  5738. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5739. AssertEquals('Update operation',[toUpdate],Statement.Operations);
  5740. end;
  5741. procedure TTestCreateTriggerParser.TestExitTrigger;
  5742. begin
  5743. TestCreate('CREATE TRIGGER A FOR B BEFORE UPDATE AS BEGIN EXIT; END');
  5744. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5745. AssertIdentifierName('Correct table','B',Statement.TableName);
  5746. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5747. AssertEquals('1 Statements',1,Statement.Statements.Count);
  5748. AssertEquals('No position',0,Statement.Position);
  5749. AssertEquals('No active/inactive',tsNone,Statement.State);
  5750. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5751. AssertEquals('Update operation',[toUpdate],Statement.Operations);
  5752. CheckClass(Statement.Statements[0],TSQLExitStatement);
  5753. end;
  5754. procedure TTestCreateTriggerParser.TestEmptyTriggerAfterUpdate;
  5755. begin
  5756. TestCreate('CREATE TRIGGER A FOR B AFTER UPDATE AS BEGIN END');
  5757. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5758. AssertIdentifierName('Correct table','B',Statement.TableName);
  5759. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5760. AssertEquals('No Statements',0,Statement.Statements.Count);
  5761. AssertEquals('No position',0,Statement.Position);
  5762. AssertEquals('No active/inactive',tsNone,Statement.State);
  5763. AssertEquals('Before moment',tmAfter,Statement.Moment);
  5764. AssertEquals('Update operation',[toUpdate],Statement.Operations);
  5765. end;
  5766. procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeDelete;
  5767. begin
  5768. TestCreate('CREATE TRIGGER A FOR B BEFORE DELETE AS BEGIN END');
  5769. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5770. AssertIdentifierName('Correct table','B',Statement.TableName);
  5771. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5772. AssertEquals('No Statements',0,Statement.Statements.Count);
  5773. AssertEquals('No position',0,Statement.Position);
  5774. AssertEquals('No active/inactive',tsNone,Statement.State);
  5775. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5776. AssertEquals('Delete operation',[toDelete],Statement.Operations);
  5777. end;
  5778. procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsert;
  5779. begin
  5780. TestCreate('CREATE TRIGGER A FOR B BEFORE INSERT AS BEGIN END');
  5781. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5782. AssertIdentifierName('Correct table','B',Statement.TableName);
  5783. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5784. AssertEquals('No Statements',0,Statement.Statements.Count);
  5785. AssertEquals('No position',0,Statement.Position);
  5786. AssertEquals('No active/inactive',tsNone,Statement.State);
  5787. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5788. AssertEquals('Insert operation',[toInsert],Statement.Operations);
  5789. end;
  5790. procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsertPosition1;
  5791. begin
  5792. TestCreate('CREATE TRIGGER A FOR B BEFORE INSERT POSITION 1 AS BEGIN END');
  5793. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5794. AssertIdentifierName('Correct table','B',Statement.TableName);
  5795. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5796. AssertEquals('No Statements',0,Statement.Statements.Count);
  5797. AssertEquals('position 1',1,Statement.Position);
  5798. AssertEquals('No active/inactive',tsNone,Statement.State);
  5799. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5800. AssertEquals('Insert operation',[toInsert],Statement.Operations);
  5801. end;
  5802. procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsertPosition1inActive;
  5803. begin
  5804. TestCreate('CREATE TRIGGER A FOR B INACTIVE BEFORE INSERT POSITION 1 AS BEGIN END');
  5805. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5806. AssertIdentifierName('Correct table','B',Statement.TableName);
  5807. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5808. AssertEquals('No Statements',0,Statement.Statements.Count);
  5809. AssertEquals('position 1',1,Statement.Position);
  5810. AssertEquals('inactive',tsInactive,Statement.State);
  5811. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5812. AssertEquals('Insert operation',[toInsert],Statement.Operations);
  5813. end;
  5814. procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsertPosition1Active;
  5815. begin
  5816. TestCreate('CREATE TRIGGER A FOR B ACTIVE BEFORE INSERT POSITION 1 AS BEGIN END');
  5817. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5818. AssertIdentifierName('Correct table','B',Statement.TableName);
  5819. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5820. AssertEquals('No Statements',0,Statement.Statements.Count);
  5821. AssertEquals('position 1',1,Statement.Position);
  5822. AssertEquals('Active',tsActive,Statement.State);
  5823. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5824. AssertEquals('Insert operation',[toInsert],Statement.Operations);
  5825. end;
  5826. procedure TTestCreateTriggerParser.TestTriggerOneLocalVariable;
  5827. Var
  5828. P : TSQLProcedureParamDef;
  5829. begin
  5830. TestCreate('CREATE TRIGGER A FOR B ACTIVE BEFORE INSERT POSITION 1 AS DECLARE VARIABLE P INT; BEGIN END');
  5831. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5832. AssertIdentifierName('Correct table','B',Statement.TableName);
  5833. AssertEquals('No Statements',0,Statement.Statements.Count);
  5834. AssertEquals('position 1',1,Statement.Position);
  5835. AssertEquals('Active',tsActive,Statement.State);
  5836. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5837. AssertEquals('Insert operation',[toInsert],Statement.Operations);
  5838. AssertEquals('1 local variable',1,Statement.LocalVariables.Count);
  5839. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
  5840. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5841. AssertNotNull('Have type definition',P.ParamType);
  5842. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5843. end;
  5844. procedure TTestCreateTriggerParser.TestTriggerTwoLocalVariables;
  5845. Var
  5846. P : TSQLProcedureParamDef;
  5847. begin
  5848. TestCreate('CREATE TRIGGER A FOR B ACTIVE BEFORE INSERT POSITION 1 AS DECLARE VARIABLE P INT; DECLARE VARIABLE Q INT; BEGIN END');
  5849. AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
  5850. AssertIdentifierName('Correct table','B',Statement.TableName);
  5851. AssertEquals('No Statements',0,Statement.Statements.Count);
  5852. AssertEquals('position 1',1,Statement.Position);
  5853. AssertEquals('Active',tsActive,Statement.State);
  5854. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5855. AssertEquals('Insert operation',[toInsert],Statement.Operations);
  5856. AssertEquals('2 local variables',2,Statement.LocalVariables.Count);
  5857. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
  5858. AssertIdentifierName('Correct parameter name','P',P.ParamName);
  5859. AssertNotNull('Have type definition',P.ParamType);
  5860. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5861. P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[1],TSQLProcedureParamDef));
  5862. AssertIdentifierName('Correct parameter name','Q',P.ParamName);
  5863. AssertNotNull('Have type definition',P.ParamType);
  5864. AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
  5865. end;
  5866. procedure TTestCreateTriggerParser.TestAlterTrigger;
  5867. begin
  5868. TestAlter('ALTER TRIGGER A BEFORE UPDATE AS BEGIN END');
  5869. AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
  5870. AssertNull('Correct table',Statement.TableName);
  5871. AssertEquals('No variables',0,Statement.LocalVariables.Count);
  5872. AssertEquals('No Statements',0,Statement.Statements.Count);
  5873. AssertEquals('No position',0,Statement.Position);
  5874. AssertEquals('No active/inactive',tsNone,Statement.State);
  5875. AssertEquals('Before moment',tmBefore,Statement.Moment);
  5876. AssertEquals('Update operation',[toUpdate],Statement.Operations);
  5877. end;
  5878. { TTestDeclareExternalFunctionParser }
  5879. function TTestDeclareExternalFunctionParser.TestCreate(const ASource: String
  5880. ): TSQLDeclareExternalFunctionStatement;
  5881. begin
  5882. CreateParser(ASource);
  5883. FToFree:=Parser.Parse;
  5884. Result:=TSQLDeclareExternalFunctionStatement(CheckClass(FToFree,TSQLDeclareExternalFunctionStatement));
  5885. FSTatement:=Result;
  5886. AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
  5887. end;
  5888. procedure TTestDeclareExternalFunctionParser.TestCreateError(
  5889. const ASource: String);
  5890. begin
  5891. FErrSource:=ASource;
  5892. AssertException(ESQLParser,@TestParseError);
  5893. end;
  5894. procedure TTestDeclareExternalFunctionParser.TestEmptyfunction;
  5895. begin
  5896. TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS INT ENTRY_POINT ''A'' MODULE_NAME ''B''');
  5897. AssertIdentifierName('Correct function','A',Statement.ObjectName);
  5898. AssertEquals('Correct entry point','A',Statement.EntryPoint);
  5899. AssertEquals('Correct module name','B',Statement.ModuleName);
  5900. AssertEquals('No arguments',0,Statement.Arguments.Count);
  5901. AssertNotNull('Have return type',Statement.ReturnType);
  5902. AssertEquals('No FreeIt',False,Statement.FreeIt);
  5903. AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
  5904. end;
  5905. procedure TTestDeclareExternalFunctionParser.TestEmptyfunctionByValue;
  5906. begin
  5907. TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS INT BY VALUE ENTRY_POINT ''A'' MODULE_NAME ''B''');
  5908. AssertIdentifierName('Correct function','A',Statement.ObjectName);
  5909. AssertEquals('Correct entry point','A',Statement.EntryPoint);
  5910. AssertEquals('Correct module name','B',Statement.ModuleName);
  5911. AssertEquals('No arguments',0,Statement.Arguments.Count);
  5912. AssertNotNull('Have return type',Statement.ReturnType);
  5913. AssertEquals('No FreeIt',False,Statement.FreeIt);
  5914. AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
  5915. AssertEquals('By Value',True,Statement.ReturnType.ByValue);
  5916. end;
  5917. procedure TTestDeclareExternalFunctionParser.TestCStringfunction;
  5918. begin
  5919. TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS CSTRING (50) ENTRY_POINT ''A'' MODULE_NAME ''B''');
  5920. AssertIdentifierName('Correct function','A',Statement.ObjectName);
  5921. AssertEquals('Correct entry point','A',Statement.EntryPoint);
  5922. AssertEquals('Correct module name','B',Statement.ModuleName);
  5923. AssertEquals('No arguments',0,Statement.Arguments.Count);
  5924. AssertNotNull('Have return type',Statement.ReturnType);
  5925. AssertEquals('No FreeIt',False,Statement.FreeIt);
  5926. AssertEquals('Correct return type',sdtCstring,Statement.ReturnType.DataType);
  5927. AssertEquals('Correct return length',50,Statement.ReturnType.Len);
  5928. end;
  5929. procedure TTestDeclareExternalFunctionParser.TestCStringFreeItfunction;
  5930. begin
  5931. TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS CSTRING (50) FREE_IT ENTRY_POINT ''A'' MODULE_NAME ''B''');
  5932. AssertIdentifierName('Correct function','A',Statement.ObjectName);
  5933. AssertEquals('Correct entry point','A',Statement.EntryPoint);
  5934. AssertEquals('Correct module name','B',Statement.ModuleName);
  5935. AssertEquals('No arguments',0,Statement.Arguments.Count);
  5936. AssertNotNull('Have return type',Statement.ReturnType);
  5937. AssertEquals('FreeIt',True,Statement.FreeIt);
  5938. AssertEquals('Correct return type',sdtCstring,Statement.ReturnType.DataType);
  5939. AssertEquals('Correct return length',50,Statement.ReturnType.Len);
  5940. end;
  5941. procedure TTestDeclareExternalFunctionParser.TestOneArgumentFunction;
  5942. Var
  5943. T : TSQLTypeDefinition;
  5944. begin
  5945. TestCreate('DECLARE EXTERNAL FUNCTION A INT RETURNS INT ENTRY_POINT ''A'' MODULE_NAME ''B''');
  5946. AssertIdentifierName('Correct function','A',Statement.ObjectName);
  5947. AssertEquals('Correct entry point','A',Statement.EntryPoint);
  5948. AssertEquals('Correct module name','B',Statement.ModuleName);
  5949. AssertEquals('1 argument',1,Statement.Arguments.Count);
  5950. T:=TSQLTypeDefinition(CheckClass(Statement.Arguments[0],TSQLTypeDefinition));
  5951. AssertEquals('Correct return type',sdtInteger,T.DataType);
  5952. AssertNotNull('Have return type',Statement.ReturnType);
  5953. AssertEquals('No FreeIt',False,Statement.FreeIt);
  5954. AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
  5955. end;
  5956. procedure TTestDeclareExternalFunctionParser.TestTwoArgumentsFunction;
  5957. Var
  5958. T : TSQLTypeDefinition;
  5959. begin
  5960. TestCreate('DECLARE EXTERNAL FUNCTION A INT, CSTRING(10) RETURNS INT ENTRY_POINT ''A'' MODULE_NAME ''B''');
  5961. AssertIdentifierName('Correct function','A',Statement.ObjectName);
  5962. AssertEquals('Correct entry point','A',Statement.EntryPoint);
  5963. AssertEquals('Correct module name','B',Statement.ModuleName);
  5964. AssertEquals('2 arguments',2,Statement.Arguments.Count);
  5965. T:=TSQLTypeDefinition(CheckClass(Statement.Arguments[0],TSQLTypeDefinition));
  5966. AssertEquals('Correct argument type',sdtInteger,T.DataType);
  5967. T:=TSQLTypeDefinition(CheckClass(Statement.Arguments[1],TSQLTypeDefinition));
  5968. AssertEquals('Correct return type',sdtCstring,T.DataType);
  5969. AssertEquals('Correct argument length',10,T.Len);
  5970. AssertNotNull('Have return type',Statement.ReturnType);
  5971. AssertEquals('No FreeIt',False,Statement.FreeIt);
  5972. AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
  5973. end;
  5974. initialization
  5975. RegisterTests([TTestDropParser,
  5976. TTestGeneratorParser,
  5977. TTestRoleParser,
  5978. TTestTypeParser,
  5979. TTestCheckParser,
  5980. TTestDomainParser,
  5981. TTestExceptionParser,
  5982. TTestIndexParser,
  5983. TTestTableParser,
  5984. TTestDeleteParser,
  5985. TTestUpdateParser,
  5986. TTestInsertParser,
  5987. TTestSelectParser,
  5988. TTestRollbackParser,
  5989. TTestCommitParser,
  5990. TTestExecuteProcedureParser,
  5991. TTestConnectParser,
  5992. TTestCreateDatabaseParser,
  5993. TTestAlterDatabaseParser,
  5994. TTestCreateViewParser,
  5995. TTestCreateShadowParser,
  5996. TTestProcedureStatement,
  5997. TTestCreateProcedureParser,
  5998. TTestCreateTriggerParser,
  5999. TTestDeclareExternalFunctionParser]);
  6000. end.