12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600 |
- {
- This file is part of the Free Component Library
- Copyright (c) 2010-2014 by the Free Pascal development team
- SQL source syntax parser test suite
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit tcparser;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, fpcunit, fpsqltree, fpsqlscanner, fpsqlparser, testregistry;
- type
- { TTestParser }
- TTestParser = Class(TSQLParser)
- public
- Procedure ParseStringDef(Out DT : TSQLDataType; Out Len : Integer; Out ACharset : TSQLStringtype);
- Function ParseType(Flags : TParseTypeFlags) : TSQLTypeDefinition;
- Function ParseConstraint : TSQLExpression;
- Function ParseProcedureStatements : TSQLStatement;
- end;
- { TTestSQLParser }
- TTestSQLParser = class(TTestCase)
- Private
- FParserOptions: TParserOptions;
- FSource : TStringStream;
- FParser : TTestParser;
- FToFree : TSQLElement; //will be freed by test teardown
- FErrSource : string;
- function GetParserOptions: TParserOptions;
- protected
- procedure AssertTypeDefaults(TD: TSQLTypeDefinition; Len: Integer=0);
- procedure TestStringDef(ASource: String; ExpectDT: TSQLDataType; ExpectLen: Integer; ExpectCharset : TSQLStringType='');
- function TestType(ASource : string; AFlags : TParseTypeFlags; AExpectedType : TSQLDataType) : TSQLTypeDefinition;
- function TestCheck(ASource : string; AExpectedConstraint : TSQLElementClass) : TSQLExpression;
- procedure CreateParser(Const ASource : string; aOptions : TParserOptions = []);
- function CheckClass(E : TSQLElement; C : TSQLElementClass) : TSQLElement;
- procedure TestDropStatement(Const ASource : string;C : TSQLElementClass);
- function TestCreateStatement(Const ASource,AName : string;C: TSQLElementClass) : TSQLCreateOrAlterStatement;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLToken); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLBinaryoperation); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLUnaryoperation); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLternaryoperation); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLDataType); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TForeignKeyAction); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLJoinType); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLAggregateFunction); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLAggregateOption); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TSQLOrderDirection); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TPlanJoinType); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TTriggerMoment); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TTriggerState); overload;
- procedure AssertEquals(const AMessage: String; Expected, Actual: TTriggerOperations); overload;
- function AssertLiteralExpr(Const AMessage : String; Element : TSQLExpression; ALiteralClass : TSQLElementClass) : TSQLLiteral;
- procedure AssertIdentifierName(Const AMessage : String; Const AExpected : String; Element : TSQLElement);
- procedure AssertField(AField : TSQLElement; Const AName : String; Const AAlias : String = '');
- procedure AssertAggregate(AField : TSQLElement; AAgregate : TSQLAggregateFunction; Const AFieldName : String; AOption : TSQLAggregateOption; Const AAlias : String = '');
- procedure AssertAggregateExpression(E : TSQLElement; AAgregate : TSQLAggregateFunction; Const AFieldName : String; AOption : TSQLAggregateOption);
- procedure AssertTable(ATable : TSQLElement; Const AName : String; Const AAlias : String = '');
- function AssertJoin(AJoin : TSQLElement; Const AFirst,ASecond : String; Const aJoinType : TSQLJoinType) : TSQLJoinTableReference;
- function AssertJoinOn(AJoin : TSQLExpression; Const AFirst,ASecond : String; Const AOperation : TSQLBinaryOperation) : TSQLBinaryExpression;
- function AssertOrderBy(AOrderBy : TSQLElement; Const AField : String; Const ANumber : Integer; Const AOrdering : TSQLOrderDirection) : TSQLOrderByElement;
- function AssertSecondaryFile(ASecondaryFile : TSQLElement; Const AFile : String; Const ALength,AStart : Integer) : TSQLDatabaseFileInfo;
- procedure TestTypeError;
- procedure TestStringError;
- procedure TestCheckError;
- procedure TestParseError;
- procedure SetUp; override;
- procedure TearDown; override;
- property Parser : TTestParser Read FParser;
- property ParserOptions : TParserOptions Read GetParserOptions Write FParserOptions;
- property ToFree : TSQLElement Read FToFree Write FTofree;
- end;
- { TTestDropParser }
- TTestDropParser = Class(TTestSQLParser)
- published
- procedure TestDropDatabase;
- procedure TestDropDomain;
- procedure TestDropException;
- procedure TestDropGenerator;
- procedure TestDropIndex;
- procedure TestDropProcedure;
- procedure TestDropRole;
- procedure TestDropTable;
- procedure TestDropTrigger;
- procedure TestDropView;
- procedure TestDropShadow;
- procedure TestDropExternalFunction;
- end;
- { TTestGeneratorParser }
- TTestGeneratorParser = Class(TTestSQLParser)
- Published
- procedure TestCreateGenerator;
- procedure TestCreateSequence;
- procedure TestAlterSequence;
- procedure TestSetGenerator;
- end;
- { TTestSetTermParser }
- TTestSetTermParser = Class(TTestSQLParser)
- Published
- procedure TestSetTermNoOption;
- procedure TestSetTermOption;
- end;
- { TTestRoleParser }
- TTestRoleParser = Class(TTestSQLParser)
- Published
- procedure TestCreateRole;
- procedure TestAlterRole;
- end;
- { TTestTypeParser }
- TTestTypeParser = Class(TTestSQLParser)
- private
- Published
- procedure TestStringType1;
- procedure TestStringType2;
- procedure TestStringType3;
- procedure TestStringType4;
- procedure TestStringType5;
- procedure TestStringType6;
- procedure TestStringType7;
- procedure TestStringType8;
- procedure TestStringType9;
- procedure TestStringType10;
- procedure TestStringType11;
- procedure TestStringType12;
- procedure TestStringType13;
- procedure TestStringType14;
- procedure TestStringType15;
- procedure TestStringType16;
- procedure TestStringType17;
- procedure TestStringType18;
- procedure TestStringType19;
- procedure TestStringTypeErrors1;
- procedure TestStringTypeErrors2;
- procedure TestStringTypeErrors3;
- procedure TestTypeInt1;
- procedure TestTypeInt2;
- procedure TestTypeInt3;
- procedure TestTypeInt4;
- procedure TestTypeInt5;
- procedure TestNumerical1;
- procedure TestNumerical2;
- procedure TestNumerical3;
- procedure TestNumericalError1;
- procedure TestNumericalError2;
- procedure TestNumericalError3;
- procedure TestNumericalError4;
- procedure TestNumericalError5;
- procedure TestNumericalError6;
- procedure TestNumericalError7;
- procedure TestBlob1;
- procedure TestBlob2;
- procedure TestBlob3;
- procedure TestBlob4;
- procedure TestBlob5;
- procedure TestBlob6;
- procedure TestBlob7;
- procedure TestBlob8;
- procedure TestBlobError1;
- procedure TestBlobError2;
- procedure TestBlobError3;
- procedure TestBlobError4;
- procedure TestBlobError5;
- procedure TestBlobError6;
- procedure TestBlobError7;
- procedure TestSmallInt;
- procedure TestFloat;
- procedure TestDoublePrecision;
- procedure TestDoublePrecisionDefault;
- end;
- { TTestCheckParser }
- TTestCheckParser = Class (TTestSQLParser)
- private
- published
- procedure TestCheckNull;
- procedure TestCheckNotNull;
- procedure TestCheckBraces;
- procedure TestCheckBracesError;
- procedure TestCheckParamError;
- procedure TestCheckIdentifierError;
- procedure TestIsEqual;
- procedure TestIsNotEqual1;
- procedure TestIsNotEqual2;
- procedure TestGreaterThan;
- procedure TestGreaterThanEqual1;
- procedure TestGreaterThanEqual2;
- procedure TestLessThan;
- procedure TestLessThanEqual1;
- procedure TestLessThanEqual2;
- procedure TestLike;
- procedure TestNotLike;
- procedure TestContaining;
- procedure TestNotContaining;
- procedure TestStarting;
- procedure TestNotStarting;
- procedure TestStartingWith;
- procedure TestNotStartingWith;
- procedure TestBetween;
- procedure TestNotBetween;
- procedure TestLikeEscape;
- procedure TestNotLikeEscape;
- procedure TestAnd;
- procedure TestOr;
- procedure TestNotOr;
- procedure TestCase;
- procedure TestCaseWithSelector;
- procedure TestAdd;
- procedure TestSubtract;
- procedure TestMultiply;
- procedure TestDivide;
- end;
- { TTestDomainParser }
- // Most relevant tests are in type definition testing.
- TTestDomainParser = Class(TTestSQLParser)
- private
- Published
- procedure TestSimpleDomain;
- procedure TestSimpleDomainAs;
- procedure TestNotNullDomain;
- procedure TestDefaultNotNullDomain;
- procedure TestCheckDomain;
- procedure TestDefaultCheckNotNullDomain;
- procedure TestAlterDomainDropDefault;
- procedure TestAlterDomainDropCheck;
- procedure TestAlterDomainDropCheckError;
- procedure TestAlterDomainAddCheck;
- procedure TestAlterDomainAddConstraintCheck;
- procedure TestAlterDomainAddConstraintError;
- procedure TestAlterDomainSetDefault;
- procedure TestAlterDomainRename;
- procedure TestAlterDomainNewType;
- procedure TestAlterDomainNewTypeError1;
- procedure TestAlterDomainNewTypeError2;
- end;
- { TTestExceptionParser }
- TTestExceptionParser = Class(TTestSQLParser)
- Published
- procedure TestException;
- procedure TestAlterException;
- procedure TestExceptionError1;
- procedure TestExceptionError2;
- end;
- { TTestIndexParser }
- TTestIndexParser = Class(TTestSQLParser)
- private
- Published
- procedure TestAlterindexActive;
- procedure TestAlterindexInactive;
- procedure TestCreateIndexSimple;
- procedure TestIndexIndexDouble;
- procedure TestCreateIndexAscending;
- procedure TestCreateIndexDescending;
- procedure TestCreateIndexUnique;
- procedure TestCreateIndexUniqueAscending;
- procedure TestCreateIndexUniqueDescending;
- procedure TestIndexError1;
- procedure TestIndexError2;
- procedure TestIndexError3;
- procedure TestIndexError4;
- procedure TestIndexError5;
- procedure TestIndexError6;
- end;
- { TTestTableParser }
- TTestTableParser = Class(TTestSQLParser)
- private
- procedure DoTestCreateReferencesField(Const ASource : String; AOnUpdate,AOnDelete : TForeignKeyAction);
- Published
- procedure TestCreateOneSimpleField;
- procedure TestCreateTwoSimpleFields;
- procedure TestCreateOnePrimaryField;
- procedure TestCreateOneNamedPrimaryField;
- procedure TestCreateOneUniqueField;
- procedure TestCreateOneNamedUniqueField;
- procedure TestCreateNotNullPrimaryField;
- procedure TestCreateNotNullDefaultPrimaryField;
- procedure TestCreateComputedByField;
- procedure TestCreateCheckField;
- procedure TestCreateNamedCheckField;
- procedure TestCreateReferencesField;
- procedure TestCreateReferencesOnUpdateCascadeField;
- procedure TestCreateReferencesOnUpdateNoActionField;
- procedure TestCreateReferencesOnUpdateSetDefaultField;
- procedure TestCreateReferencesOnUpdateSetNullField;
- procedure TestCreateReferencesOnDeleteCascadeField;
- procedure TestCreateReferencesOnDeleteNoActionField;
- procedure TestCreateReferencesOnDeleteSetDefaultField;
- procedure TestCreateReferencesOnDeleteSetNullField;
- procedure TestCreateReferencesOnUpdateAndDeleteSetNullField;
- procedure TestCreateNamedReferencesField;
- procedure TestCreatePrimaryKeyConstraint;
- procedure TestCreateNamedPrimaryKeyConstraint;
- procedure TestCreateForeignKeyConstraint;
- procedure TestCreateNamedForeignKeyConstraint;
- procedure TestCreateUniqueConstraint;
- procedure TestCreateNamedUniqueConstraint;
- procedure TestCreateCheckConstraint;
- procedure TestCreateNamedCheckConstraint;
- procedure TestAlterDropField;
- procedure TestAlterDropFields;
- procedure TestAlterDropConstraint;
- procedure TestAlterDropConstraints;
- procedure TestAlterRenameField;
- procedure TestAlterRenameColumnField;
- procedure TestAlterFieldType;
- procedure TestAlterFieldPosition;
- procedure TestAlterAddField;
- procedure TestAlterAddFields;
- procedure TestAlterAddPrimarykey;
- procedure TestAlterAddNamedPrimarykey;
- procedure TestAlterAddCheckConstraint;
- procedure TestAlterAddNamedCheckConstraint;
- procedure TestAlterAddForeignkey;
- procedure TestAlterAddNamedForeignkey;
- end;
- { TTestDeleteParser }
- TTestDeleteParser = Class(TTestSQLParser)
- Private
- function TestDelete(Const ASource , ATable: String) : TSQLDeleteStatement;
- Published
- procedure TestSimpleDelete;
- procedure TestSimpleDeleteAlias;
- procedure TestDeleteWhereNull;
- end;
- { TTestUpdateParser }
- TTestUpdateParser = Class(TTestSQLParser)
- Private
- function TestUpdate(Const ASource , ATable: String) : TSQLUpdateStatement;
- Published
- procedure TestUpdateOneField;
- procedure TestUpdateOneFieldFull;
- procedure TestUpdateTwoFields;
- procedure TestUpdateOneFieldWhereIsNull;
- end;
- { TTestInsertParser }
- TTestInsertParser = Class(TTestSQLParser)
- Private
- function TestInsert(Const ASource , ATable: String) : TSQLInsertStatement;
- Published
- procedure TestInsertOneField;
- procedure TestInsertTwoFields;
- procedure TestInsertOneValue;
- procedure TestInsertTwoValues;
- end;
- { TTestSelectParser }
- TTestSelectParser = Class(TTestSQLParser)
- Private
- FSelect : TSQLSelectStatement;
- function TestSelect(Const ASource : String; AOptions : TParserOptions = []; AScannerOptions : TSQLScannerOptions = []) : TSQLSelectStatement;
- procedure TestSelectError(Const ASource : String);
- procedure DoExtractSimple(Expected : TSQLExtractElement);
- property Select : TSQLSelectStatement Read FSelect;
- Published
- procedure TestSelectOneFieldOneTable;
- procedure TestSelectOneFieldOneTableTransaction;
- procedure TestSelectOneArrayFieldOneTable;
- procedure TestSelectTwoFieldsOneTable;
- procedure TestSelectOneFieldAliasOneTable;
- procedure TestSelectTwoFieldAliasesOneTable;
- procedure TestSelectOneTableFieldOneTable;
- procedure TestSelectOneDistinctFieldOneTable;
- procedure TestSelectOneAllFieldOneTable;
- procedure TestSelectAsteriskOneTable;
- procedure TestSelectDistinctAsteriskOneTable;
- procedure TestSelectAsteriskWithPath;
- procedure TestSelectOneFieldOneTableAlias;
- procedure TestSelectOneFieldOneTableAsAlias;
- procedure TestSelectTwoFieldsTwoTables;
- procedure TestSelectTwoFieldsTwoTablesJoin;
- procedure TestSelectTwoFieldsTwoInnerTablesJoin;
- procedure TestSelectTwoFieldsTwoLeftTablesJoin;
- procedure TestSelectTwoFieldsTwoFullOuterTablesJoin;
- procedure TestSelectTwoFieldsTwoFullTablesJoin;
- procedure TestSelectTwoFieldsTwoRightTablesJoin;
- procedure TestSelectTwoFieldsThreeTablesJoin;
- procedure TestSelectTwoFieldsBracketThreeTablesJoin;
- procedure TestSelectTwoFieldsThreeBracketTablesJoin;
- procedure TestSelectTableWithSchema;
- procedure TestSelectFieldWithSchema;
- procedure TestSelectFieldAsStringLiteral;
- procedure TestSelectFirst;
- procedure TestSelectFirstSkip;
- procedure TestSelectTop;
- procedure TestSelectLimit;
- procedure TestSelectLimitAll;
- procedure TestSelectLimitAllOffset;
- procedure TestSelectLimitOffset1;
- procedure TestSelectLimitOffset2;
- procedure TestSelectOffset;
- procedure TestAggregateCount;
- procedure TestAggregateCountAsterisk;
- procedure TestAggregateCountAll;
- procedure TestAggregateCountDistinct;
- procedure TestAggregateMax;
- procedure TestAggregateMaxAll;
- procedure TestAggregateMaxAsterisk;
- procedure TestAggregateMaxDistinct;
- procedure TestAggregateMin;
- procedure TestAggregateMinAll;
- procedure TestAggregateMinAsterisk;
- procedure TestAggregateMinDistinct;
- procedure TestAggregateSum;
- procedure TestAggregateSumAll;
- procedure TestAggregateSumAsterisk;
- procedure TestAggregateSumDistinct;
- procedure TestAggregateAvg;
- procedure TestAggregateAvgAll;
- procedure TestAggregateAvgAsterisk;
- procedure TestAggregateAvgDistinct;
- procedure TestUpperConst;
- procedure TestUpperError;
- procedure TestLeft;
- procedure TestFunctionWithPath;
- procedure TestGenID;
- procedure TestGenIDError1;
- procedure TestGenIDError2;
- procedure TestCastSimple;
- procedure TestExtractSimple;
- procedure TestOrderByOneField;
- procedure TestOrderByTwoFields;
- procedure TestOrderByThreeFields;
- procedure TestOrderByOneDescField;
- procedure TestOrderByTwoDescFields;
- procedure TestOrderByThreeDescFields;
- procedure TestOrderByOneTableField;
- procedure TestOrderByOneColumn;
- procedure TestOrderByTwoColumns;
- procedure TestOrderByTwoColumnsDesc;
- procedure TestOrderByCollate;
- procedure TestOrderByCollateDesc;
- procedure TestOrderByCollateDescTwoFields;
- procedure TestGroupByOne;
- procedure TestGroupByTwo;
- procedure TestHavingOne;
- procedure TestUnionSimple;
- procedure TestUnionSimpleAll;
- procedure TestUnionSimpleOrderBy;
- procedure TestUnionDouble;
- procedure TestUnionError1;
- procedure TestUnionError2;
- procedure TestPlanOrderNatural;
- procedure TestPlanOrderOrder;
- procedure TestPlanOrderIndex1;
- procedure TestPlanOrderIndex2;
- procedure TestPlanJoinNatural;
- procedure TestPlanDefaultNatural;
- procedure TestPlanMergeNatural;
- procedure TestPlanMergeNested;
- procedure TestSubSelect;
- procedure TestWhereExists;
- procedure TestWhereSingular;
- procedure TestWhereAll;
- procedure TestWhereAny;
- procedure TestWhereSome;
- procedure TestParam;
- procedure TestParamExpr;
- procedure TestNoTable;
- procedure TestSourcePosition;
- end;
- { TTestRollBackParser }
- TTestRollBackParser = Class(TTestSQLParser)
- Private
- FRollback : TSQLRollbackStatement;
- function TestRollback(Const ASource : String) : TSQLRollbackStatement;
- procedure TestRollbackError(Const ASource : String);
- property Rollback : TSQLRollbackStatement Read FRollback;
- Published
- procedure TestRollback;
- procedure TestRollbackWork;
- procedure TestRollbackRelease;
- procedure TestRollbackWorkRelease;
- procedure TestRollbackTransaction;
- procedure TestRollbackTransactionWork;
- procedure TestRollbackTransactionRelease;
- procedure TestRollbackTransactionWorkRelease;
- end;
- { TTestCommitParser }
- TTestCommitParser = Class(TTestSQLParser)
- Private
- FCommit : TSQLCommitStatement;
- function TestCommit(Const ASource : String) : TSQLCommitStatement;
- procedure TestCommitError(Const ASource : String);
- property Commit : TSQLCommitStatement Read FCommit;
- Published
- procedure TestCommit;
- procedure TestCommitWork;
- procedure TestCommitRelease;
- procedure TestCommitWorkRelease;
- procedure TestCommitTransaction;
- procedure TestCommitTransactionWork;
- procedure TestCommitTransactionRelease;
- procedure TestCommitTransactionWorkRelease;
- procedure TestCommitRetain;
- procedure TestCommitWorkRetain;
- procedure TestCommitReleaseRetain;
- procedure TestCommitWorkReleaseRetain;
- procedure TestCommitTransactionRetain;
- procedure TestCommitTransactionWorkRetain;
- procedure TestCommitTransactionReleaseRetain;
- procedure TestCommitTransactionWorkReleaseRetain;
- procedure TestCommitRetainSnapShot;
- end;
- { TTestExecuteProcedureParser }
- TTestExecuteProcedureParser = Class(TTestSQLParser)
- Private
- FExecute : TSQLExecuteProcedureStatement;
- function TestExecute(Const ASource : String) : TSQLExecuteProcedureStatement;
- procedure TestExecuteError(Const ASource : String);
- property Execute: TSQLExecuteProcedureStatement Read FExecute;
- Published
- procedure TestExecuteSimple;
- procedure TestExecuteSimpleTransaction;
- procedure TestExecuteSimpleReturningValues;
- procedure TestExecuteSimpleReturning2Values;
- procedure TestExecuteOneArg;
- procedure TestExecuteOneArgNB;
- procedure TestExecuteTwoArgs;
- procedure TestExecuteTwoArgsNB;
- procedure TestExecuteOneArgSelect;
- procedure TestExecuteOneArgSelectNB;
- procedure TestExecuteTwoArgsSelect;
- procedure TestExecuteTwoArgsSelectNB;
- procedure TestExecuteOneArgSelectErr;
- procedure TestExecuteOneArgSelectErr2;
- procedure TestExecuteOneArgSelectErr3;
- procedure TestExecuteOneArgSelectErr4;
- end;
- { TTestConnectParser }
- TTestConnectParser = Class(TTestSQLParser)
- Private
- FConnect : TSQLConnectStatement;
- function TestConnect(Const ASource : String) : TSQLConnectStatement;
- procedure TestConnectError(Const ASource : String);
- property Connect: TSQLConnectStatement Read FConnect;
- Published
- procedure TestConnectSimple;
- procedure TestConnectUser;
- procedure TestConnectPassword;
- procedure TestConnectUserPassword;
- procedure TestConnectUserPasswordRole;
- procedure TestConnectUserPasswordRoleCache;
- procedure TestConnectSimpleCache;
- end;
- { TTestCreateDatabaseParser }
- TTestCreateDatabaseParser = Class(TTestSQLParser)
- Private
- FCreateDB : TSQLCreateDatabaseStatement;
- function TestCreate(Const ASource : String) : TSQLCreateDatabaseStatement;
- procedure TestCreateError(Const ASource : String);
- property CreateDB : TSQLCreateDatabaseStatement Read FCreateDB;
- published
- procedure TestSimple;
- procedure TestSimpleSchema;
- procedure TestSimpleUSer;
- procedure TestSimpleUSerPassword;
- procedure TestSimplePassword;
- procedure TestPageSize;
- procedure TestPageSize2;
- procedure TestPageSizeLength;
- procedure TestPageSizeLength2;
- procedure TestPageSizeLength3;
- procedure TestPageSizeLength4;
- procedure TestCharset;
- procedure TestSecondaryFile1;
- procedure TestSecondaryFile2;
- procedure TestSecondaryFile3;
- procedure TestSecondaryFile4;
- procedure TestSecondaryFile5;
- procedure TestSecondaryFile6;
- procedure TestSecondaryFile7;
- procedure TestSecondaryFile8;
- procedure TestSecondaryFile9;
- procedure TestSecondaryFile10;
- procedure TestSecondaryFileS;
- procedure TestSecondaryFileError1;
- procedure TestSecondaryFileError2;
- procedure TestSecondaryFileError3;
- end;
- { TTestAlterDatabaseParser }
- TTestAlterDatabaseParser = Class(TTestSQLParser)
- Private
- FAlterDB : TSQLAlterDatabaseStatement;
- function TestAlter(Const ASource : String) : TSQLAlterDatabaseStatement;
- procedure TestAlterError(Const ASource : String);
- property AlterDB : TSQLAlterDatabaseStatement Read FAlterDB;
- published
- procedure TestSimple;
- procedure TestLength;
- procedure TestStarting;
- procedure TestStartingLength;
- procedure TestFiles;
- procedure TestFiles2;
- procedure TestError;
- procedure TestFilesError;
- end;
- { TTestCreateViewParser }
- TTestCreateViewParser = Class(TTestSQLParser)
- Private
- FView : TSQLCreateViewStatement;
- function TestCreate(Const ASource : String) : TSQLCreateViewStatement;
- procedure TestCreateError(Const ASource : String);
- property View : TSQLCreateViewStatement Read FView;
- Published
- procedure TestSimple;
- procedure TestFieldList;
- procedure TestFieldList2;
- procedure TestSimpleWithCheckoption;
- end;
- { TTestCreateShadowParser }
- TTestCreateShadowParser = Class(TTestSQLParser)
- Private
- FShadow : TSQLCreateShadowStatement;
- function TestCreate(Const ASource : String) : TSQLCreateShadowStatement;
- procedure TestCreateError(Const ASource : String);
- property Shadow : TSQLCreateShadowStatement Read FShadow;
- published
- procedure TestSimple;
- procedure TestLength;
- procedure TestLength2;
- procedure TestLength3;
- procedure TestLength4;
- procedure TestSecondaryFile1;
- procedure TestSecondaryFile2;
- procedure TestSecondaryFile3;
- procedure TestSecondaryFile4;
- procedure TestSecondaryFile5;
- procedure TestSecondaryFile6;
- procedure TestSecondaryFile7;
- procedure TestSecondaryFile8;
- procedure TestSecondaryFileS;
- end;
- { TTestProcedureStatement }
- TTestProcedureStatement = Class(TTestSQLParser)
- Private
- FStatement : TSQLStatement;
- procedure TestParseStatementError;
- function TestStatement(Const ASource : String) : TSQLStatement;
- procedure TestStatementError(Const ASource : String);
- Public
- property Statement : TSQLStatement Read FStatement;
- Published
- procedure TestException;
- procedure TestExceptionError;
- procedure TestExit;
- procedure TestSuspend;
- procedure TestEmptyBlock;
- procedure TestExitBlock;
- procedure TestExitBlockError;
- procedure TestPostEvent;
- procedure TestPostEventColName;
- procedure TestPostError;
- procedure TestAssignSimple;
- procedure TestAssignSimpleNew;
- procedure TestAssignSelect;
- procedure TestBlockAssignSimple;
- procedure TestIf;
- procedure TestIfBlock;
- procedure TestIfElse;
- procedure TestIfBlockElse;
- procedure TestIfElseError;
- procedure TestIfBlockElseBlock;
- procedure TestIfErrorBracketLeft;
- procedure TestIfErrorBracketRight;
- procedure TestIfErrorNoThen;
- procedure TestIfErrorSemicolonElse;
- procedure TestWhile;
- procedure TestWhileBlock;
- procedure TestWhileErrorBracketLeft;
- procedure TestWhileErrorBracketRight;
- procedure TestWhileErrorNoDo;
- procedure TestWhenAny;
- procedure TestWhenSQLCode;
- procedure TestWhenGDSCode;
- procedure TestWhenException;
- procedure TestWhenExceptionGDS;
- procedure TestWhenAnyBlock;
- procedure TestWhenErrorAny;
- procedure TestWhenErrorNoDo;
- procedure TestWhenErrorExceptionInt;
- procedure TestWhenErrorExceptionString;
- procedure TestWhenErrorSqlCode;
- procedure TestWhenErrorGDSCode;
- procedure TestExecuteStatement;
- procedure TestExecuteStatementReturningValues;
- procedure TestExecuteStatementReturningValuesColon;
- procedure TestExecuteStatementReturningValuesBrackets;
- procedure TestForSimple;
- procedure TestForSimpleNoColon;
- procedure TestForSimple2fields;
- procedure TestForBlock;
- end;
- { TTestCreateProcedureParser }
- TTestCreateProcedureParser = Class(TTestSQLParser)
- Private
- FStatement : TSQLCreateProcedureStatement;
- function TestCreate(Const ASource : String) : TSQLCreateProcedureStatement;
- procedure TestCreateError(Const ASource : String);
- property Statement : TSQLCreateProcedureStatement Read FStatement;
- Published
- procedure TestEmptyProcedure;
- procedure TestExitProcedure;
- procedure TestProcedureOneArgument;
- procedure TestProcedureTwoArguments;
- procedure TestProcedureOneReturnValue;
- procedure TestProcedureTwoReturnValues;
- procedure TestProcedureOneLocalVariable;
- procedure TestProcedureTwoLocalVariable;
- procedure TestProcedureInputOutputLocal;
- end;
- { TTestCreateTriggerParser }
- TTestCreateTriggerParser = Class(TTestSQLParser)
- Private
- FStatement : TSQLAlterCreateTriggerStatement;
- function TestCreate(Const ASource : String) : TSQLCreateTriggerStatement;
- function TestAlter(Const ASource : String) : TSQLAlterTriggerStatement;
- procedure TestCreateError(Const ASource : String);
- property Statement : TSQLAlterCreateTriggerStatement Read FStatement;
- Published
- procedure TestEmptyTrigger;
- procedure TestExitTrigger;
- procedure TestEmptyTriggerAfterUpdate;
- procedure TestEmptyTriggerBeforeDelete;
- procedure TestEmptyTriggerBeforeInsert;
- procedure TestEmptyTriggerBeforeInsertPosition1;
- procedure TestEmptyTriggerBeforeInsertPosition1inActive;
- procedure TestEmptyTriggerBeforeInsertPosition1Active;
- procedure TestTriggerOneLocalVariable;
- procedure TestTriggerTwoLocalVariables;
- procedure TestAlterTrigger;
- end;
- { TTestDeclareExternalFunctionParser }
- TTestDeclareExternalFunctionParser = Class(TTestSQLParser)
- Private
- FStatement : TSQLDeclareExternalFunctionStatement;
- function TestCreate(Const ASource : String) : TSQLDeclareExternalFunctionStatement;
- procedure TestCreateError(Const ASource : String);
- property Statement : TSQLDeclareExternalFunctionStatement Read FStatement;
- Published
- procedure TestEmptyfunction;
- procedure TestEmptyfunctionByValue;
- procedure TestCStringfunction;
- procedure TestCStringFreeItfunction;
- procedure TestOneArgumentFunction;
- procedure TestTwoArgumentsFunction;
- end;
- { TTestGrantParser }
- TTestGrantParser = Class(TTestSQLParser)
- Private
- FStatement : TSQLGrantStatement;
- function TestGrant(Const ASource : String) : TSQLGrantStatement;
- procedure TestGrantError(Const ASource : String);
- property Statement : TSQLGrantStatement Read FStatement;
- Published
- procedure TestSimple;
- procedure Test2Operations;
- procedure TestDeletePrivilege;
- procedure TestUpdatePrivilege;
- procedure TestInsertPrivilege;
- procedure TestReferencePrivilege;
- procedure TestAllPrivileges;
- procedure TestAllPrivileges2;
- procedure TestUpdateColPrivilege;
- procedure TestUpdate2ColsPrivilege;
- procedure TestReferenceColPrivilege;
- procedure TestReference2ColsPrivilege;
- procedure TestUserPrivilege;
- procedure TestUserPrivilegeWithGrant;
- procedure TestGroupPrivilege;
- procedure TestProcedurePrivilege;
- procedure TestViewPrivilege;
- procedure TestTriggerPrivilege;
- procedure TestPublicPrivilege;
- procedure TestExecuteToUser;
- procedure TestExecuteToProcedure;
- procedure TestRoleToUser;
- procedure TestRoleToUserWithAdmin;
- procedure TestRoleToPublic;
- procedure Test2RolesToUser;
- end;
- { TTestRevokeParser }
- TTestRevokeParser = Class(TTestSQLParser)
- Private
- FStatement : TSQLRevokeStatement;
- function TestRevoke(Const ASource : String) : TSQLRevokeStatement;
- procedure TestRevokeError(Const ASource : String);
- property Statement : TSQLRevokeStatement Read FStatement;
- Published
- procedure TestSimple;
- procedure Test2Operations;
- procedure TestDeletePrivilege;
- procedure TestUpdatePrivilege;
- procedure TestInsertPrivilege;
- procedure TestReferencePrivilege;
- procedure TestAllPrivileges;
- procedure TestAllPrivileges2;
- procedure TestUpdateColPrivilege;
- procedure TestUpdate2ColsPrivilege;
- procedure TestReferenceColPrivilege;
- procedure TestReference2ColsPrivilege;
- procedure TestUserPrivilege;
- procedure TestUserPrivilegeWithRevoke;
- procedure TestGroupPrivilege;
- procedure TestProcedurePrivilege;
- procedure TestViewPrivilege;
- procedure TestTriggerPrivilege;
- procedure TestPublicPrivilege;
- procedure TestExecuteToUser;
- procedure TestExecuteToProcedure;
- procedure TestRoleToUser;
- procedure TestRoleToPublic;
- procedure Test2RolesToUser;
- end;
- { TTestGlobalParser }
- TTestGlobalParser = Class(TTestSQLParser)
- published
- procedure TestEmpty;
- end;
- implementation
- uses typinfo;
- { TTestSetTermParser }
- procedure TTestSetTermParser.TestSetTermNoOption;
- begin
- FErrSource:='SET TERM ^ ;';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestSetTermParser.TestSetTermOption;
- begin
- CreateParser('SET TERM ^ ;');
- FToFree:=Parser.Parse([poAllowSetTerm]);
- AssertEquals('Terminator set','^',Parser.Scanner.AlternateTerminator);
- end;
- { TTestGlobalParser }
- procedure TTestGlobalParser.TestEmpty;
- begin
- CreateParser('');
- AssertNull('Empty statement returns nil',Parser.Parse);
- end;
- { --------------------------------------------------------------------
- TTestParser
- --------------------------------------------------------------------}
- procedure TTestParser.ParseStringDef(Out DT: TSQLDataType; Out Len: Integer; Out ACharset : TSQLStringtype);
- begin
- ParseCharTypeDefinition(DT,Len,ACharset);
- end;
- function TTestParser.ParseType(Flags: TParseTypeFlags): TSQLTypeDefinition;
- begin
- Result:=ParseTypeDefinition(Nil,Flags);
- end;
- function TTestParser.ParseConstraint: TSQLExpression;
- begin
- // GetNextToken;
- Result:=ParseCheckConstraint(Nil);
- end;
- function TTestParser.ParseProcedureStatements: TSQLStatement;
- begin
- Result:=Self.ParseProcedureStatement(Nil);
- end;
- { --------------------------------------------------------------------
- TTestSQLParser
- --------------------------------------------------------------------}
- procedure TTestSQLParser.SetUp;
- begin
- // nothing yet
- end;
- procedure TTestSQLParser.TearDown;
- begin
- FreeAndNil(FParser);
- FreeAndNil(FSource);
- FreeAndNil(FToFree);
- end;
- procedure TTestSQLParser.CreateParser(const ASource: string; aOptions: TParserOptions = []);
- begin
- FSource:=TStringStream.Create(ASource);
- FParserOptions:=aOptions;
- FParser:=TTestParser.Create(FSource);
- end;
- Function TTestSQLParser.CheckClass(E: TSQLElement; C: TSQLElementClass) : TSQLElement;
- begin
- AssertEquals(C,E.ClassType);
- Result:=E;
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected, Actual: TSQLToken);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLToken),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLToken),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLBinaryOperation);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLBinaryOperation),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLBinaryOperation),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLUnaryoperation);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLUnaryOperation),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLUnaryOperation),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLternaryoperation);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLTernaryOperation),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLTernaryOperation),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected, Actual: TSQLDataType);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLDataType),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLDataType),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TForeignKeyAction);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TForeignKeyAction),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TForeignKeyAction),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLJoinType);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLJoinType),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLJoinType),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLAggregateFunction);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLAggregateFunction),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLAggregateFunction),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLAggregateOption);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLAggregateOption),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLAggregateOption),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TSQLOrderDirection);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TSQLOrderDirection),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TSQLOrderDirection),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TPlanJoinType);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TPlanJoinType),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TPlanJoinType),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TTriggerMoment);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TTriggerMoment),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TTriggerMoment),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TTriggerState);
- Var
- NE,NA : String;
- begin
- NE:=GetEnumName(TypeInfo(TTriggerState),Ord(Expected));
- NA:=GetEnumName(TypeInfo(TTriggerState),Ord(Actual));
- AssertEquals(AMessage,NE,NA);
- end;
- procedure TTestSQLParser.AssertEquals(const AMessage: String; Expected,
- Actual: TTriggerOperations);
- begin
- If Expected<>Actual then
- Fail(Amessage)
- end;
- Function TTestSQLParser.AssertLiteralExpr(const AMessage: String;
- Element: TSQLExpression; ALiteralClass: TSQLElementClass) : TSQLLiteral;
- begin
- CheckClass(Element,TSQLLiteralExpression);
- Result:=TSQLLiteral(Checkclass(TSQLLiteralExpression(Element).Literal,ALiteralClass));
- end;
- procedure TTestSQLParser.AssertIdentifierName(const AMessage : String;
- const AExpected: String; Element: TSQLElement);
- begin
- AssertNotNull(AMessage+': Have identifier ',Element);
- CheckClass(Element,TSQLidentifierName);
- AssertEquals(AMessage+': Correct identifier name',AExpected,TSQLidentifierName(Element).Name);
- end;
- procedure TTestSQLParser.AssertField(AField: TSQLElement; const AName: String;
- const AAlias: String);
- Var
- F : TSQLSelectField;
- E : TSQLidentifierExpression;
- begin
- AssertNotNull('Have field',AField);
- F:=TSQLSelectField(CheckClass(AField,TSQLSelectField));
- AssertNotNull('Have field expresssion,',F.Expression);
- E:=TSQLidentifierExpression(CheckClass(F.Expression,TSQLidentifierExpression));
- AssertIdentifierName('Correct field name',AName,E.Identifier);
- If (AAlias<>'') then
- AssertIdentifierName('Correct alias',AALias,F.AliasName);
- end;
- procedure TTestSQLParser.AssertAggregate(AField: TSQLElement;
- AAgregate: TSQLAggregateFunction; const AFieldName: String;
- AOption: TSQLAggregateOption; const AAlias: String);
- Var
- F : TSQLSelectField;
- begin
- AssertNotNull('Have field',AField);
- F:=TSQLSelectField(CheckClass(AField,TSQLSelectField));
- AssertNotNull('Have field expresssion,',F.Expression);
- AssertAggregateExpression(F.Expression,AAgregate,AFieldName,AOption);
- If (AAlias<>'') then
- AssertIdentifierName('Correct alias',AALias,F.AliasName);
- end;
- procedure TTestSQLParser.AssertAggregateExpression(E: TSQLElement;
- AAgregate: TSQLAggregateFunction; const AFieldName: String;
- AOption: TSQLAggregateOption);
- Var
- AF : TSQLAggregateFunctionExpression;
- I : TSQLIdentifierExpression;
- begin
- AF:=TSQLAggregateFunctionExpression(CheckClass(E,TSQLAggregateFunctionExpression));
- AssertEquals('Correct function',AAgregate,AF.Aggregate);
- AssertEquals('Correct function',AOption,AF.Option);
- If (AFieldName<>'') then
- begin
- I:=TSQLIdentifierExpression(CheckClass(AF.Expression, TSQLIdentifierExpression));
- AssertIdentifierName('Correct field name',AFieldName,I.Identifier);
- end;
- end;
- procedure TTestSQLParser.AssertTable(ATable: TSQLElement; const AName: String;
- const AAlias: String);
- Var
- T : TSQLSimpleTablereference;
- begin
- AssertNotNull('Have table',ATable);
- T:=TSQLSimpleTablereference(CheckClass(ATable,TSQLSimpleTablereference));
- AssertIdentifierName('Correct table name',AName,T.ObjectName);
- If (AAlias<>'') then
- AssertIdentifierName('Correct alias',AALias,T.AliasName);
- end;
- function TTestSQLParser.AssertJoin(AJoin: TSQLElement; const AFirst,
- ASecond: String; const ajointype: TSQLJoinType):TSQLJoinTableReference;
- Var
- J : TSQLJoinTableReference;
- begin
- AssertNotNull('Have join',AJoin);
- J:=TSQLJoinTableReference(CheckClass(AJoin,TSQLJoinTableReference));
- if (AFirst<>'') then
- AssertTable(J.Left,AFirst,'');
- if (ASecond<>'') then
- AssertTable(J.Right,ASecond,'');
- AssertEquals('Correct join type',AJoinType,J.JoinType);
- Result:=J;
- end;
- function TTestSQLParser.AssertJoinOn(AJoin: TSQLExpression; const AFirst,
- ASecond: String; const AOperation: TSQLBinaryOperation): TSQLBinaryExpression;
- Var
- I : TSQLIdentifierExpression;
- begin
- Result:=TSQLBinaryExpression(CheckClass(AJoin,TSQLBinaryExpression));
- AssertEquals('Correct ON operation',AOperation,Result.Operation);
- I:=TSQLIdentifierExpression(CheckClass(Result.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Left field name',AFirst,I.Identifier);
- I:=TSQLIdentifierExpression(CheckClass(Result.Right,TSQLIdentifierExpression));
- AssertIdentifierName('Right field name',ASecond,I.Identifier);
- end;
- function TTestSQLParser.AssertOrderBy(AOrderBy: TSQLElement;
- const AField: String; const ANumber: Integer; const AOrdering: TSQLOrderDirection
- ): TSQLOrderByElement;
- Var
- I : TSQLIntegerLiteral;
- begin
- Result:=TSQLOrderByElement(CheckClass(AorderBy,TSQLOrderByElement));
- If (AField<>'') then
- AssertIdentifierName('Correct order by field',AField,Result.Field)
- else if (ANumber>0) then
- begin
- I:=TSQLIntegerLiteral(CheckClass(Result.Field,TSQLIntegerLiteral));
- AssertEquals('Correct order by column number',ANumber,I.Value);
- end;
- AssertEquals('Correct ordering',AOrdering,Result.OrderBy);
- end;
- function TTestSQLParser.AssertSecondaryFile(ASecondaryFile: TSQLElement;
- const AFile: String; const ALength, AStart: Integer): TSQLDatabaseFileInfo;
- begin
- Result:=TSQLDatabaseFileInfo(CheckClass(ASecondaryFile,TSQLDatabaseFileInfo));
- AssertEquals('Secondary file name',AFile,Result.FileName);
- AssertEquals('Secondary file length',ALength,Result.Length);
- AssertEquals('Secondary file start',AStart,Result.StartPage);
- end;
- procedure TTestSQLParser.TestTypeError;
- begin
- TestType(FErrSource,[],sdtInteger);
- end;
- procedure TTestSQLParser.TestStringError;
- begin
- TestStringDef(FErrSource,sdtchar,0);
- end;
- procedure TTestSQLParser.TestCheckError;
- begin
- TestCheck(FErrSource,TSQLExpression);
- end;
- procedure TTestSQLParser.TestParseError;
- begin
- CreateParser(FErrSource);
- FToFree:=Parser.Parse;
- end;
- procedure TTestSQLParser.TestStringDef(ASource : String; ExpectDT : TSQLDataType; ExpectLen : Integer; ExpectCharset : TSQLStringType='');
- Var
- Dt : TSQLDataType;
- L : integer;
- cs : TSQLStringType;
- begin
- CreateParser(ASOURCE);
- Parser.GetNextToken;
- Parser.ParseStringDef(dt,l,cs);
- AssertEquals('Datatype is Char',ExpectDT,Dt);
- AssertEquals('Length is 1',ExpectLen,l);
- AssertEquals('End of Stream reached',tsqlEOF,Parser.CurrentToken);
- AssertEquals('Correct character set',ExpectCharset,CS);
- end;
- Function TTestSQLParser.TestType(ASource : string; AFlags : TParseTypeFlags; AExpectedType : TSQLDataType) : TSQLTypeDefinition;
- begin
- CreateParser(ASource);
- FToFree:=Parser.ParseType(AFlags);
- AssertNotNull('ParseType returns result',FToFree);
- CheckClass(FTofree,TSQLTypeDefinition);
- Result:=TSQLTypeDefinition(FToFree);
- AssertEquals('Type definition has correct data type',AExpectedType,Result.Datatype);
- end;
- function TTestSQLParser.TestCheck(ASource: string; AExpectedConstraint: TSQLElementClass
- ): TSQLExpression;
- begin
- CreateParser('('+ASource+')');
- FToFree:=Parser.ParseConstraint();
- AssertNotNull('ParseType returns result',FToFree);
- CheckClass(FTofree,AExpectedConstraint);
- Result:=TSQLExpression(FToFree);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- function TTestSQLParser.GetParserOptions: TParserOptions;
- begin
- if Assigned(FParser) then
- Result:=FParser.Options
- else
- Result:=FParserOptions;
- end;
- procedure TTestSQLParser.AssertTypeDefaults(TD : TSQLTypeDefinition;Len : Integer = 0);
- begin
- AssertNull(TD.DefaultValue);
- AssertNull(TD.Check);
- AssertNull(TD.Collation);
- AssertEquals('Array dim 0',0,Length(TD.ArrayDims));
- AssertEquals('Blob type 0',0,TD.BlobType);
- AssertEquals('Not required',False,TD.NotNull);
- AssertEquals('Length',Len,TD.Len);
- end;
- procedure TTestSQLParser.TestDropStatement(const ASource: string;
- C: TSQLElementClass);
- Var
- D : TSQLDropStatement;
- begin
- If ASOURCE='SHADOW' then
- CreateParser('DROP '+ASource+' 1')
- else
- CreateParser('DROP '+ASource+' A');
- FToFree:=Parser.Parse;
- AssertNotNull('Parse returns result',FTofree);
- If Not FToFree.InheritsFrom(TSQLDropStatement) then
- Fail('Drop statement is not of type TSQLDropStatement');
- CheckClass(FToFree ,C);
- D:=TSQLDropStatement(FToFree);
- If ASOURCE='SHADOW' then
- AssertIdentifierName('object name','1',D.ObjectName)
- else
- AssertIdentifierName('object name','A',D.ObjectName);
- end;
- function TTestSQLParser.TestCreateStatement(const ASource,AName: string;
- C: TSQLElementClass): TSQLCreateOrAlterStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- AssertNotNull('Parse returns result',FTofree);
- If Not FToFree.InheritsFrom(TSQLCreateOrAlterStatement) then
- Fail('create statement is not of type TSQLCreateOrAlterStatement');
- CheckClass(FToFree ,C);
- Result:=TSQLCreateOrAlterStatement(FToFree);
- AssertIdentifierName('Correct identifier',AName,Result.ObjectName);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- { --------------------------------------------------------------------
- TTestDropParser
- --------------------------------------------------------------------}
- procedure TTestDropParser.TestDropDatabase;
- begin
- TestDropStatement('DATABASE',TSQLDropDatabaseStatement);
- end;
- procedure TTestDropParser.TestDropDomain;
- begin
- TestDropStatement('DOMAIN',TSQLDropDomainStatement);
- end;
- procedure TTestDropParser.TestDropException;
- begin
- TestDropStatement('EXCEPTION',TSQLDropExceptionStatement);
- end;
- procedure TTestDropParser.TestDropGenerator;
- begin
- TestDropStatement('GENERATOR',TSQLDropGeneratorStatement);
- end;
- procedure TTestDropParser.TestDropIndex;
- begin
- TestDropStatement('INDEX',TSQLDropIndexStatement);
- end;
- procedure TTestDropParser.TestDropProcedure;
- begin
- TestDropStatement('PROCEDURE',TSQLDropProcedureStatement);
- end;
- procedure TTestDropParser.TestDropRole;
- begin
- TestDropStatement('ROLE',TSQLDropRoleStatement);
- end;
- procedure TTestDropParser.TestDropTable;
- begin
- TestDropStatement('TABLE',TSQLDropTableStatement);
- end;
- procedure TTestDropParser.TestDropTrigger;
- begin
- TestDropStatement('TRIGGER',TSQLDropTriggerStatement);
- end;
- procedure TTestDropParser.TestDropView;
- begin
- TestDropStatement('VIEW',TSQLDropViewStatement);
- end;
- procedure TTestDropParser.TestDropShadow;
- begin
- TestDropStatement('SHADOW',TSQLDropShadowStatement);
- end;
- procedure TTestDropParser.TestDropExternalFunction;
- begin
- TestDropStatement('EXTERNAL FUNCTION',TSQLDropExternalFunctionStatement);
- end;
- { --------------------------------------------------------------------
- TTestGeneratorParser
- --------------------------------------------------------------------}
- procedure TTestGeneratorParser.TestCreateGenerator;
- begin
- TestCreateStatement('CREATE GENERATOR A','A',TSQLCreateGeneratorStatement);
- end;
- procedure TTestGeneratorParser.TestCreateSequence;
- Var
- C : TSQLCreateOrAlterStatement;
- begin
- C:=TestCreateStatement('CREATE SEQUENCE A','A',TSQLCreateGeneratorStatement);
- AssertEquals('Sequence detected',True,TSQLCreateGeneratorStatement(c).IsSequence);
- end;
- procedure TTestGeneratorParser.TestAlterSequence;
- Var
- C : TSQLCreateOrAlterStatement;
- D : TSQLAlterGeneratorStatement absolute C;
- begin
- C:=TestCreateStatement('ALTER SEQUENCE A RESTART WITH 100','A',TSQLAlterGeneratorStatement);
- AssertEquals('Sequence detected',True,D.IsSequence);
- AssertEquals('Sequence restart ',True,D.HasRestart);
- AssertEquals('Sequence restart value',100,D.Restart);
- end;
- procedure TTestGeneratorParser.TestSetGenerator;
- Var
- S : TSQLSetGeneratorStatement;
- begin
- CreateParser('SET GENERATOR A TO 1');
- FToFree:=Parser.Parse;
- S:=TSQLSetGeneratorStatement(CheckClass(FToFree,TSQLSetGeneratorStatement));
- AssertIdentifierName('Correct generator name','A',S.Objectname);
- AssertEquals('New value',1,S.NewValue);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- { --------------------------------------------------------------------
- TTestTypeParser
- --------------------------------------------------------------------}
- procedure TTestTypeParser.TestStringType1;
- begin
- TestStringDef('CHAR(1)',sdtChar,1);
- end;
- procedure TTestTypeParser.TestStringType2;
- begin
- TestStringDef('CHAR',sdtChar,0);
- end;
- procedure TTestTypeParser.TestStringType3;
- begin
- TestStringDef('CHARACTER',sdtChar,0);
- end;
- procedure TTestTypeParser.TestStringType4;
- begin
- TestStringDef('CHARACTER VARYING',sdtVarChar,0);
- end;
- procedure TTestTypeParser.TestStringType5;
- begin
- TestStringDef('VARCHAR',sdtVarChar,0);
- end;
- procedure TTestTypeParser.TestStringType6;
- begin
- TestStringDef('VARCHAR(2)',sdtVarChar,2);
- end;
- procedure TTestTypeParser.TestStringType7;
- begin
- TestStringDef('CHARACTER VARYING (2)',sdtVarChar,2);
- end;
- procedure TTestTypeParser.TestStringType8;
- begin
- TestStringDef('NATIONAL CHARACTER VARYING (2)',sdtNVarChar,2);
- end;
- procedure TTestTypeParser.TestStringType9;
- begin
- TestStringDef('NATIONAL CHARACTER (2)',sdtNChar,2);
- end;
- procedure TTestTypeParser.TestStringType10;
- begin
- TestStringDef('NATIONAL CHARACTER',sdtNChar,0);
- end;
- procedure TTestTypeParser.TestStringType11;
- begin
- TestStringDef('NATIONAL CHARACTER VARYING',sdtNVarChar,0);
- end;
- procedure TTestTypeParser.TestStringType12;
- begin
- TestStringDef('NCHAR',sdtNChar,0);
- end;
- procedure TTestTypeParser.TestStringType13;
- begin
- TestStringDef('NCHAR(2)',sdtNChar,2);
- end;
- procedure TTestTypeParser.TestStringType14;
- begin
- TestStringDef('NCHAR VARYING(2)',sdtNVarChar,2);
- end;
- procedure TTestTypeParser.TestStringType15;
- begin
- TestStringDef('CHAR (15) CHARACTER SET UTF8',sdtChar,15,'UTF8');
- end;
- procedure TTestTypeParser.TestStringType16;
- begin
- TestStringDef('CHAR VARYING (15) CHARACTER SET UTF8',sdtVarChar,15,'UTF8');
- end;
- procedure TTestTypeParser.TestStringType17;
- begin
- TestStringDef('CHAR VARYING CHARACTER SET UTF8',sdtVarChar,0,'UTF8');
- end;
- procedure TTestTypeParser.TestStringType18;
- begin
- TestStringDef('CHARACTER CHARACTER SET UTF8',sdtChar,0,'UTF8');
- end;
- procedure TTestTypeParser.TestStringType19;
- Var
- T : TSQLTypeDefinition;
- begin
- T:=TestType('CHAR(10) COLLATE UTF8',[],sdtChar);
- AssertNotNull('Have collation',T.Collation);
- AssertEquals('Correct collation','UTF8',T.Collation.Name);
- end;
- procedure TTestTypeParser.TestStringTypeErrors1;
- begin
- FErrSource:='VARCHAR VARYING';
- AssertException(ESQLParser,@TestStringError);
- end;
- procedure TTestTypeParser.TestStringTypeErrors2;
- begin
- FErrSource:='CHAR(A)';
- AssertException(ESQLParser,@TestStringError);
- end;
- procedure TTestTypeParser.TestStringTypeErrors3;
- begin
- FErrSource:='CHAR(1]';
- AssertException(ESQLParser,@TestStringError);
- end;
- procedure TTestTypeParser.TestTypeInt1;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('INT',[],sdtInteger);
- AssertTypeDefaults(TD);
- end;
- procedure TTestTypeParser.TestTypeInt2;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('INT DEFAULT NULL',[],sdtInteger);
- AssertNotNull('Have Default value',TD.DefaultValue);
- CheckClass(TD.DefaultValue,TSQLNullLiteral);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestTypeParser.TestTypeInt3;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('INT DEFAULT 1',[],sdtInteger);
- AssertNotNull('Have Default value',TD.DefaultValue);
- CheckClass(TD.DefaultValue,TSQLIntegerLiteral);
- AssertEquals('Correct default value ',1,TSQLIntegerLiteral(TD.DefaultValue).Value);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestTypeParser.TestTypeInt4;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('INT NOT NULL',[],sdtInteger);
- AssertNull('No Default value',TD.DefaultValue);
- AssertEquals('Required field',True,TD.NotNull);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestTypeParser.TestTypeInt5;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('INT [3]',[],sdtInteger);
- AssertEquals('Array of length',1,Length(TD.ArrayDims));
- AssertEquals('Upper bound',3,TD.ArrayDims[0][2]);
- AssertEquals('Lower bound',1,TD.ArrayDims[0][1]);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestTypeParser.TestNumerical1;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('NUMERIC (10)',[],sdtNumeric);
- AssertEquals('Correct length',10,TD.Len);
- end;
- procedure TTestTypeParser.TestNumerical2;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('NUMERIC (10,3)',[],sdtNumeric);
- AssertEquals('Correct length',10,TD.Len);
- AssertEquals('Correct scale',3,TD.Scale);
- end;
- procedure TTestTypeParser.TestNumerical3;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('NUMERIC',[],sdtNumeric);
- AssertEquals('Correct length',0,TD.Len);
- AssertEquals('Correct scale',0,TD.Scale);
- end;
- procedure TTestTypeParser.TestNumericalError1;
- begin
- FErrSource:='NUMERIC ()';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestNumericalError2;
- begin
- FErrSource:='NUMERIC (A)';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestNumericalError3;
- begin
- FErrSource:='NUMERIC (,1)';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestNumericalError4;
- begin
- FErrSource:='NUMERIC (1,)';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestNumericalError5;
- begin
- FErrSource:='NUMERIC (1';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestNumericalError6;
- begin
- FErrSource:='NUMERIC (1,';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestNumericalError7;
- begin
- FErrSource:='NUMERIC (1 NOT';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlob1;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB sub_type 1 SEGMENT SIZE 80 CHARACTER SET UTF8',[],sdtBlob);
- AssertEquals('Blob type 1',1,TD.BlobType);
- AssertEquals('Blob segment size',80,TD.Len);
- AssertEquals('Character set','UTF8',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob2;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB (80,1) CHARACTER SET UTF8',[],sdtBlob);
- AssertEquals('Blob type 1',1,TD.BlobType);
- AssertEquals('Blob segment size',80,TD.Len);
- AssertEquals('Character set','UTF8',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob3;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB SEGMENT SIZE 80',[],sdtBlob);
- AssertEquals('Blob type 0',0,TD.BlobType);
- AssertEquals('Blob segment size',80,TD.Len);
- AssertEquals('Character set','',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob4;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB SUB_TYPE 1',[],sdtBlob);
- AssertEquals('Blob type 1',1,TD.BlobType);
- AssertEquals('Blob segment size',0,TD.Len);
- AssertEquals('Character set','',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob5;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB (80)',[],sdtBlob);
- AssertEquals('Blob type 0',0,TD.BlobType);
- AssertEquals('Blob segment size',80,TD.Len);
- AssertEquals('Character set','',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob6;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB',[],sdtBlob);
- AssertEquals('Blob type 0',0,TD.BlobType);
- AssertEquals('Blob segment size',0,TD.Len);
- AssertEquals('Character set','',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob7;
- var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB SUB_TYPE BINARY',[],sdtBlob);
- AssertEquals('Blob type 0',0,TD.BlobType);
- AssertEquals('Blob segment size',0,TD.Len);
- AssertEquals('Character set','',TD.Charset);
- end;
- procedure TTestTypeParser.TestBlob8;
- var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('BLOB SUB_TYPE TEXT',[],sdtBlob);
- AssertEquals('Blob type 1',1,TD.BlobType);
- AssertEquals('Blob segment size',0,TD.Len);
- AssertEquals('Character set','',TD.Charset);
- end;
- procedure TTestTypeParser.TestSmallInt;
- begin
- TestType('SMALLINT',[],sdtSmallint);
- end;
- procedure TTestTypeParser.TestFloat;
- begin
- TestType('FLOAT',[],sdtFloat);
- end;
- procedure TTestTypeParser.TestDoublePrecision;
- begin
- TestType('DOUBLE PRECISION',[],sdtDoublePrecision);
- end;
- procedure TTestTypeParser.TestDoublePrecisionDefault;
- begin
- TestType('DOUBLE PRECISION DEFAULT 0',[],sdtDoublePrecision);
- end;
- procedure TTestTypeParser.TestBlobError1;
- begin
- FerrSource:='BLOB (1,)';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlobError2;
- begin
- FerrSource:='BLOB 1,)';
- // EAssertionfailed, due to not EOF
- AssertException(EAssertionFailedError,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlobError3;
- begin
- FerrSource:='BLOB (80) SUB_TYPE 3';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlobError4;
- begin
- FerrSource:='BLOB CHARACTER UTF8';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlobError5;
- begin
- FerrSource:='BLOB (80) SEGMENT SIZE 80';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlobError6;
- begin
- FerrSource:='BLOB (A)';
- AssertException(ESQLParser,@TestTypeError);
- end;
- procedure TTestTypeParser.TestBlobError7;
- begin
- FerrSource:='BLOB (1';
- AssertException(ESQLParser,@TestTypeError);
- end;
- { --------------------------------------------------------------------
- TTestCheckParser
- --------------------------------------------------------------------}
- procedure TTestCheckParser.TestCheckNotNull;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE IS NOT NULL',TSQLBinaryExpression));
- AssertEquals('IS NOT operator,',boISNot,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is null',B.Right,TSQLNullLiteral);
- end;
- procedure TTestCheckParser.TestCheckNull;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE IS NULL',TSQLBinaryExpression));
- AssertEquals('IS operator,',boIS,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is null',B.Right,TSQLNullLiteral);
- end;
- procedure TTestCheckParser.TestCheckBraces;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('(VALUE IS NULL)',TSQLBinaryExpression));
- AssertEquals('IS operator,',boIS,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is null',B.Right,TSQLNullLiteral);
- end;
- procedure TTestCheckParser.TestCheckBracesError;
- begin
- FErrSource:='(VALUE IS NOT NULL ME )';
- AssertException('Error in braces.', ESQLParser,@TestCheckError);
- end;
- procedure TTestCheckParser.TestCheckParamError;
- begin
- FErrSource:='VALUE <> :P';
- AssertException('Parameter.', ESQLParser,@TestCheckError);
- end;
- procedure TTestCheckParser.TestCheckIdentifierError;
- begin
- FErrSource:='(X IS NOT NULL)';
- AssertException('Error in check: identifier.', ESQLParser,@TestCheckError);
- end;
- procedure TTestCheckParser.TestIsEqual;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE = 3',TSQLBinaryExpression));
- AssertEquals('Equal operator',boEq,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestIsNotEqual1;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE <> 3',TSQLBinaryExpression));
- AssertEquals('Not Equal operator',boNE,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestIsNotEqual2;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE != 3',TSQLBinaryExpression));
- AssertEquals('ENot qual operator',boNE,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestGreaterThan;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE > 3',TSQLBinaryExpression));
- AssertEquals('Greater than operator',boGT,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestGreaterThanEqual1;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE >= 3',TSQLBinaryExpression));
- AssertEquals('Greater or Equal operator',boGE,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestGreaterThanEqual2;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE !< 3',TSQLBinaryExpression));
- AssertEquals('Greater or Equal operator',boGE,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestLessThan;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE < 3',TSQLBinaryExpression));
- AssertEquals('Less than operator',boLT,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestLessThanEqual1;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE <= 3',TSQLBinaryExpression));
- AssertEquals('Less or Equal operator',boLE,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestLessThanEqual2;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE !> 3',TSQLBinaryExpression));
- AssertEquals('Less or Equal operator',boLE,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestLike;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE LIKE ''%3''',TSQLBinaryExpression));
- AssertEquals('Like operator',boLike,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestNotLike;
- Var
- B : TSQLBinaryExpression;
- U : TSQLUnaryExpression;
- begin
- U:=TSQLUnaryExpression(TestCheck('VALUE NOT LIKE ''%3''',TSQLUnaryExpression));
- AssertEquals('Like operator',uoNot,U.Operation);
- CheckClass(U.Operand,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(U.Operand);
- AssertEquals('Like operator',boLike,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestContaining;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE CONTAINING ''3''',TSQLBinaryExpression));
- AssertEquals('Like operator',boContaining,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestDivide;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE / 1',TSQLBinaryExpression));
- AssertEquals('Correct operator', boDivide, B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
- end;
- procedure TTestCheckParser.TestNotContaining;
- Var
- B : TSQLBinaryExpression;
- U : TSQLUnaryExpression;
- begin
- U:=TSQLUnaryExpression(TestCheck('VALUE NOT CONTAINING ''3''',TSQLUnaryExpression));
- AssertEquals('Like operator',uoNot,U.Operation);
- CheckClass(U.Operand,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(U.Operand);
- AssertEquals('Like operator',boContaining,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestStarting;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE STARTING ''3''',TSQLBinaryExpression));
- AssertEquals('Starting operator',boStarting,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestNotStarting;
- Var
- B : TSQLBinaryExpression;
- U : TSQLUnaryExpression;
- begin
- U:=TSQLUnaryExpression(TestCheck('VALUE NOT STARTING ''3''',TSQLUnaryExpression));
- AssertEquals('Not operator',uoNot,U.Operation);
- CheckClass(U.Operand,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(U.Operand);
- AssertEquals('Starting operator',boStarting,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestStartingWith;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE STARTING WITH ''3''',TSQLBinaryExpression));
- AssertEquals('Starting operator',boStarting,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestSubtract;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE - 1',TSQLBinaryExpression));
- AssertEquals('Correct operator', boSubtract, B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
- end;
- procedure TTestCheckParser.TestNotStartingWith;
- Var
- B : TSQLBinaryExpression;
- U : TSQLUnaryExpression;
- begin
- U:=TSQLUnaryExpression(TestCheck('VALUE NOT STARTING WITH ''3''',TSQLUnaryExpression));
- AssertEquals('Not operator',uoNot,U.Operation);
- CheckClass(U.Operand,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(U.Operand);
- AssertEquals('Starting operator',boStarting,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestBetween;
- Var
- T : TSQLTernaryExpression;
- begin
- T:=TSQLTernaryExpression(TestCheck('VALUE BETWEEN 1 AND 5',TSQLTernaryExpression));
- AssertEquals('Like operator',tobetween,T.Operation);
- AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
- AssertLiteralExpr('Middle is integer',T.Middle,TSQLIntegerLiteral);
- AssertLiteralExpr('Right is integer',T.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestCase;
- Var
- T : TSQLCaseExpression;
- B : TSQLBinaryExpression;
- R : TSQLIdentifierName;
- begin
- T:=TSQLCaseExpression(TestCheck('CASE WHEN A=1 THEN "a" WHEN B=2 THEN "b" ELSE "c" END',TSQLCaseExpression));
- AssertEquals('Branch count = 2',2,T.BranchCount);
- AssertNotNull('Else branch exists',T.ElseBranch);
- B:=(T.Branches[0].Condition as TSQLBinaryExpression);
- R:=(T.Branches[0].Expression as TSQLIdentifierExpression).Identifier;
- AssertEquals('First WHEN Identifier is A', 'A', (B.Left as TSQLIdentifierExpression).Identifier.Name);
- AssertEquals('First WHEN Number is 1', 1, ((B.Right as TSQLLiteralExpression).Literal as TSQLIntegerLiteral).Value);
- AssertEquals('First THEN result is "a"', 'a', R.Name);
- B:=(T.Branches[1].Condition as TSQLBinaryExpression);
- R:=(T.Branches[1].Expression as TSQLIdentifierExpression).Identifier;
- AssertEquals('Second WHEN Identifier is B', 'B', (B.Left as TSQLIdentifierExpression).Identifier.Name);
- AssertEquals('Second WHEN Number is 2', 2, ((B.Right as TSQLLiteralExpression).Literal as TSQLIntegerLiteral).Value);
- AssertEquals('Second THEN result is "b"', 'b', R.Name);
- R:=(T.ElseBranch as TSQLIdentifierExpression).Identifier;
- AssertEquals('ELSE result is "c"', 'c', R.Name);
- end;
- procedure TTestCheckParser.TestCaseWithSelector;
- Var
- T : TSQLCaseExpression;
- L : TSQLLiteralExpression;
- R : TSQLIdentifierName;
- begin
- T:=TSQLCaseExpression(TestCheck('CASE A WHEN 1 THEN "a" WHEN 2 THEN "b" ELSE "c" END',TSQLCaseExpression));
- AssertNotNull('Selector exists',T.Selector);
- AssertEquals('Branch count = 2',2,T.BranchCount);
- AssertNotNull('Else branch exists',T.ElseBranch);
- R:=(T.Selector as TSQLIdentifierExpression).Identifier;
- AssertEquals('Selector identifier is "A"', 'A', R.Name);
- L:=(T.Branches[0].Condition as TSQLLiteralExpression);
- R:=(T.Branches[0].Expression as TSQLIdentifierExpression).Identifier;
- AssertEquals('First WHEN Number is 1', 1, (L.Literal as TSQLIntegerLiteral).Value);
- AssertEquals('First THEN result is "a"', 'a', R.Name);
- L:=(T.Branches[1].Condition as TSQLLiteralExpression);
- R:=(T.Branches[1].Expression as TSQLIdentifierExpression).Identifier;
- AssertEquals('Second WHEN Number is 2', 2, (L.Literal as TSQLIntegerLiteral).Value);
- AssertEquals('Second THEN result is "b"', 'b', R.Name);
- R:=(T.ElseBranch as TSQLIdentifierExpression).Identifier;
- AssertEquals('ELSE result is "c"', 'c', R.Name);
- end;
- procedure TTestCheckParser.TestNotBetween;
- Var
- U : TSQLUnaryExpression;
- T : TSQLTernaryExpression;
- begin
- U:=TSQLUnaryExpression(TestCheck('VALUE NOT BETWEEN 1 AND 5',TSQLUnaryExpression));
- AssertEquals('Not operator',uoNot,U.Operation);
- CheckClass(U.Operand,TSQLTernaryExpression);
- T:=TSQLTernaryExpression(U.Operand);
- AssertEquals('Like operator',tobetween,T.Operation);
- AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
- AssertLiteralExpr('Middle is integer',T.Middle,TSQLIntegerLiteral);
- AssertLiteralExpr('Right is integer',T.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestLikeEscape;
- Var
- T : TSQLTernaryExpression;
- begin
- T:=TSQLTernaryExpression(TestCheck('VALUE LIKE ''%2'' ESCAPE ''3''',TSQLTernaryExpression));
- AssertEquals('Like operator',toLikeEscape,T.Operation);
- AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
- AssertLiteralExpr('Middle is string',T.Middle,TSQLStringLiteral);
- AssertLiteralExpr('Right is string',T.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestMultiply;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE * 1',TSQLBinaryExpression));
- AssertEquals('Correct operator', boMultiply, B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
- end;
- procedure TTestCheckParser.TestNotLikeEscape;
- Var
- U : TSQLUnaryExpression;
- T : TSQLTernaryExpression;
- begin
- U:=TSQLUnaryExpression(TestCheck('VALUE NOT LIKE ''%2'' ESCAPE ''3''',TSQLUnaryExpression));
- AssertEquals('Not operator',uoNot,U.Operation);
- CheckClass(U.Operand,TSQLTernaryExpression);
- T:=TSQLTernaryExpression(U.Operand);
- AssertEquals('Like operator',toLikeEscape,T.Operation);
- AssertLiteralExpr('Left is value',T.Left,TSQLValueLiteral);
- AssertLiteralExpr('Middle is string',T.Middle,TSQLStringLiteral);
- AssertLiteralExpr('Right is string',T.Right,TSQLStringLiteral);
- end;
- procedure TTestCheckParser.TestAdd;
- Var
- B : TSQLBinaryExpression;
- begin
- B:=TSQLBinaryExpression(TestCheck('VALUE + 1',TSQLBinaryExpression));
- AssertEquals('Correct operator', boAdd, B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
- AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
- end;
- procedure TTestCheckParser.TestAnd;
- Var
- T,B : TSQLBinaryExpression;
- begin
- T:=TSQLBinaryExpression(TestCheck('VALUE > 4 AND Value < 11',TSQLBinaryExpression));
- AssertEquals('And operator',boand,T.Operation);
- CheckClass(T.Left,TSQLBinaryExpression);
- CheckClass(T.Right,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(T.Left);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Less than operator',boGT,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
- B:=TSQLBinaryExpression(T.Right);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Less than operator',boLT,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestOr;
- Var
- T,B : TSQLBinaryExpression;
- begin
- T:=TSQLBinaryExpression(TestCheck('VALUE < 4 or Value > 11',TSQLBinaryExpression));
- AssertEquals('And operator',boor,T.Operation);
- CheckClass(T.Left,TSQLBinaryExpression);
- CheckClass(T.Right,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(T.Left);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Less than operator',boLT,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
- B:=TSQLBinaryExpression(T.Right);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Less than operator',boGT,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
- end;
- procedure TTestCheckParser.TestNotOr;
- Var
- T,B : TSQLBinaryExpression;
- begin
- T:=TSQLBinaryExpression(TestCheck('VALUE IS NOT NULL or Value > 11',TSQLBinaryExpression));
- AssertEquals('And operator',boor,T.Operation);
- CheckClass(T.Left,TSQLBinaryExpression);
- CheckClass(T.Right,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(T.Left);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Is not null operator',boisNot,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLNullLiteral);
- B:=TSQLBinaryExpression(T.Right);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Less than operator',boGT,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLIntegerLiteral);
- end;
- { TTestDomainParser }
- procedure TTestDomainParser.TestSimpleDomain;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLCreateDomainStatement;
- T : TSQLTypeDefinition;
- begin
- P:=TestCreateStatement('CREATE DOMAIN A INT','A',TSQLCreateDomainStatement);
- CheckClass(P,TSQLCreateDomainStatement);
- D:=TSQLCreateDomainStatement(P);
- AssertNotNull('Have type Definition',D.TypeDefinition);
- T:=D.TypeDefinition;
- AssertTypeDefaults(T);
- AssertEquals('Integer data type',sdtInteger,T.DataType);
- end;
- procedure TTestDomainParser.TestSimpleDomainAs;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLCreateDomainStatement;
- T : TSQLTypeDefinition;
- begin
- P:=TestCreateStatement('CREATE DOMAIN A AS INT','A',TSQLCreateDomainStatement);
- CheckClass(P,TSQLCreateDomainStatement);
- D:=TSQLCreateDomainStatement(P);
- AssertNotNull('Have type Definition',D.TypeDefinition);
- T:=D.TypeDefinition;
- AssertTypeDefaults(T);
- AssertEquals('Integer data type',sdtInteger,T.DataType);
- end;
- procedure TTestDomainParser.TestNotNullDomain;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLCreateDomainStatement;
- T : TSQLTypeDefinition;
- begin
- P:=TestCreateStatement('CREATE DOMAIN A INT NOT NULL','A',TSQLCreateDomainStatement);
- CheckClass(P,TSQLCreateDomainStatement);
- D:=TSQLCreateDomainStatement(P);
- AssertNotNull('Have type Definition',D.TypeDefinition);
- T:=D.TypeDefinition;
- AssertEquals('Integer data type',sdtInteger,T.DataType);
- AssertEquals('Not null',True,T.NotNull);
- end;
- procedure TTestDomainParser.TestDefaultNotNullDomain;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLCreateDomainStatement;
- T : TSQLTypeDefinition;
- begin
- P:=TestCreateStatement('CREATE DOMAIN A INT DEFAULT 2 NOT NULL','A',TSQLCreateDomainStatement);
- CheckClass(P,TSQLCreateDomainStatement);
- D:=TSQLCreateDomainStatement(P);
- AssertNotNull('Have type Definition',D.TypeDefinition);
- T:=D.TypeDefinition;
- AssertNotNull('Have default value',T.DefaultValue);
- CheckClass(T.DefaultValue,TSQLINtegerLiteral);
- AssertEquals('Integer data type',sdtInteger,T.DataType);
- AssertEquals('Not null',True,T.NotNull);
- end;
- procedure TTestDomainParser.TestCheckDomain;
- var
- P : TSQLCreateOrAlterStatement;
- D : TSQLCreateDomainStatement;
- T : TSQLTypeDefinition;
- begin
- P:=TestCreateStatement('CREATE DOMAIN A AS CHAR(8) CHECK (VALUE STARTING WITH ''V'')','A',TSQLCreateDomainStatement);
- CheckClass(P,TSQLCreateDomainStatement);
- D:=TSQLCreateDomainStatement(P);
- AssertNotNull('Have type Definition',D.TypeDefinition);
- T:=D.TypeDefinition;
- AssertNull('No default value',T.DefaultValue);
- AssertEquals('Character data type',sdtChar,T.DataType);
- AssertEquals('Not null must be allowed',False,T.NotNull);
- end;
- procedure TTestDomainParser.TestDefaultCheckNotNullDomain;
- var
- P : TSQLCreateOrAlterStatement;
- D : TSQLCreateDomainStatement;
- T : TSQLTypeDefinition;
- begin
- P:=TestCreateStatement(
- 'CREATE DOMAIN DEFCHECKNOTN AS VARCHAR(1) DEFAULT ''s'' CHECK (VALUE IN (''s'',''h'',''A'')) NOT NULL',
- 'DEFCHECKNOTN',TSQLCreateDomainStatement);
- CheckClass(P,TSQLCreateDomainStatement);
- D:=TSQLCreateDomainStatement(P);
- AssertNotNull('Have type Definition',D.TypeDefinition);
- T:=D.TypeDefinition;
- AssertNotNull('Have default value',T.DefaultValue);
- AssertEquals('Varchar data type',sdtVarChar,T.DataType);
- AssertEquals('Not null',True,T.NotNull);
- end;
- procedure TTestDomainParser.TestAlterDomainDropDefault;
- begin
- TestCreateStatement('ALTER DOMAIN A DROP DEFAULT','A',TSQLAlterDomainDropDefaultStatement);
- end;
- procedure TTestDomainParser.TestAlterDomainDropCheck;
- begin
- TestCreateStatement('ALTER DOMAIN A DROP CONSTRAINT','A',TSQLAlterDomainDropCheckStatement);
- end;
- procedure TTestDomainParser.TestAlterDomainAddCheck;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLAlterDomainAddCheckStatement;
- B : TSQLBinaryExpression;
- begin
- P:=TestCreateStatement('ALTER DOMAIN A ADD CHECK (VALUE IS NOT NULL)','A',TSQLAlterDomainAddCheckStatement);
- D:=TSQLAlterDomainAddCheckStatement(P);
- AssertNotNull('Have check',D.Check);
- CheckClass(D.Check,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(D.Check);
- AssertEquals('Is not null operator',boIsNot,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Is not null operator',boisNot,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLNullLiteral);
- end;
- procedure TTestDomainParser.TestAlterDomainAddConstraintCheck;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLAlterDomainAddCheckStatement;
- B : TSQLBinaryExpression;
- begin
- P:=TestCreateStatement('ALTER DOMAIN A ADD CONSTRAINT CHECK (VALUE IS NOT NULL)','A',TSQLAlterDomainAddCheckStatement);
- D:=TSQLAlterDomainAddCheckStatement(P);
- AssertNotNull('Have check',D.Check);
- CheckClass(D.Check,TSQLBinaryExpression);
- B:=TSQLBinaryExpression(D.Check);
- AssertEquals('Is not null operation',boIsNot,B.Operation);
- AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
- AssertEquals('Is not null operator',boisNot,B.Operation);
- AssertLiteralExpr('Right is value',B.Right,TSQLNullLiteral);
- end;
- procedure TTestDomainParser.TestAlterDomainAddConstraintError;
- begin
- FErrSource:='ALTER DOMAIN A ADD CONSTRAINT (VALUE IS NOT NULL)';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestDomainParser.TestAlterDomainSetDefault;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLAlterDomainSetDefaultStatement;
- begin
- P:=TestCreateStatement('ALTER DOMAIN A SET DEFAULT NULL','A',TSQLAlterDomainSetDefaultStatement);
- D:=TSQLAlterDomainSetDefaultStatement(P);
- AssertNotNull('Have default',D.DefaultValue);
- CheckClass(D.DefaultValue,TSQLNullLiteral);
- end;
- procedure TTestDomainParser.TestAlterDomainRename;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLAlterDomainRenameStatement;
- begin
- P:=TestCreateStatement('ALTER DOMAIN A B','A',TSQLAlterDomainRenameStatement);
- D:=TSQLAlterDomainRenameStatement(P);
- AssertIdentifierName('New name','B',D.NewName);
- end;
- procedure TTestDomainParser.TestAlterDomainNewType;
- Var
- P : TSQLCreateOrAlterStatement;
- D : TSQLAlterDomainTypeStatement;
- begin
- P:=TestCreateStatement('ALTER DOMAIN A TYPE CHAR(10)','A',TSQLAlterDomainTypeStatement);
- D:=TSQLAlterDomainTypeStatement(P);
- AssertNotNull('Have type definition',D.NewType);
- AssertEquals('Char type',sdtChar,D.NewType.DataType);
- AssertEquals('Char type of len 10',10,D.NewType.Len);
- end;
- procedure TTestDomainParser.TestAlterDomainNewTypeError1;
- begin
- FErrSource:='ALTER DOMAIN A TYPE INT NOT NULL';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestDomainParser.TestAlterDomainNewTypeError2;
- begin
- FErrSource:='ALTER DOMAIN A TYPE INT DEFAULT 1';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestDomainParser.TestAlterDomainDropCheckError;
- begin
- FErrSource:='ALTER DOMAIN A DROP CHECK';
- AssertException(ESQLParser,@TestParseError);
- end;
- { TTestExceptionParser }
- procedure TTestExceptionParser.TestException;
- Var
- P : TSQLCreateOrAlterStatement;
- E : TSQLCreateExceptionStatement;
- begin
- P:=TestCreateStatement('CREATE EXCEPTION A ''A message''','A',TSQLCreateExceptionStatement);
- E:=TSQLCreateExceptionStatement(P);
- AssertNotNull('Have message',E.ExceptionMessage);
- AssertEquals('Message','A message',E.ExceptionMessage.Value)
- end;
- procedure TTestExceptionParser.TestAlterException;
- Var
- P : TSQLCreateOrAlterStatement;
- E : TSQLCreateExceptionStatement;
- begin
- P:=TestCreateStatement('ALTER EXCEPTION A ''A massage''','A',TSQLAlterExceptionStatement);
- E:=TSQLCreateExceptionStatement(P);
- AssertNotNull('Have message',E.ExceptionMessage);
- AssertEquals('Message','A massage',E.ExceptionMessage.Value)
- end;
- procedure TTestExceptionParser.TestExceptionError1;
- begin
- FErrSource:='CREATE EXCEPTION NOT';
- ASsertException(ESQLParser,@TestParseError);
- end;
- procedure TTestExceptionParser.TestExceptionError2;
- begin
- FErrSource:='CREATE EXCEPTION A NOT';
- ASsertException(ESQLParser,@TestParseError);
- end;
- { TTestRoleParser }
- procedure TTestRoleParser.TestCreateRole;
- begin
- TestCreateStatement('CREATE ROLE A','A',TSQLCreateROLEStatement);
- end;
- procedure TTestRoleParser.TestAlterRole;
- begin
- FErrSource:='ALTER ROLE A';
- ASsertException(ESQLParser,@TestParseError);
- end;
- { TTestIndexParser }
- procedure TTestIndexParser.TestAlterindexActive;
- Var
- A : TSQLAlterIndexStatement;
- begin
- A:=TSQLAlterIndexStatement(TestCreateStatement('ALTER INDEX A ACTIVE','A',TSQLAlterIndexStatement));
- AssertEquals('Active',False,A.Inactive);
- end;
- procedure TTestIndexParser.TestAlterindexInactive;
- Var
- A : TSQLAlterIndexStatement;
- begin
- A:=TSQLAlterIndexStatement(TestCreateStatement('ALTER INDEX A INACTIVE','A',TSQLAlterIndexStatement));
- AssertEquals('Inactive',True,A.Inactive);
- end;
- procedure TTestIndexParser.TestCreateIndexSimple;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE INDEX A ON B (C)','A',TSQLCreateIndexStatement));
- If Not (C.Options=[]) then
- Fail('Options empty');
- AssertIdentifiername('Correct table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',1,C.FieldNames.Count);
- AssertIdentifiername('Field name','C',C.FieldNames[0]);
- end;
- procedure TTestIndexParser.TestIndexIndexDouble;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE INDEX A ON B (C,D)','A',TSQLCreateIndexStatement));
- If Not (C.Options=[]) then
- Fail('Options empty');
- AssertIdentifiername('Correct table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',2,C.FieldNames.Count);
- AssertIdentifiername('Field name 1','C',C.FieldNames[0]);
- AssertIdentifiername('Field name 2','D',C.FieldNames[1]);
- end;
- procedure TTestIndexParser.TestIndexError1;
- begin
- FErrSource:='ALTER UNIQUE INDEX A ACTIVE';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestIndexParser.TestIndexError2;
- begin
- FErrSource:='ALTER ASCENDING INDEX A ACTIVE';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestIndexParser.TestIndexError3;
- begin
- FErrSource:='ALTER DESCENDING INDEX A ACTIVE';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestIndexParser.TestIndexError4;
- begin
- FErrSource:='CREATE INDEX A ON B';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestIndexParser.TestIndexError5;
- begin
- FErrSource:='CREATE INDEX A ON B ()';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestIndexParser.TestIndexError6;
- begin
- FErrSource:='CREATE INDEX A ON B (A,)';
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestIndexParser.TestCreateIndexUnique;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE UNIQUE INDEX A ON B (C)','A',TSQLCreateIndexStatement));
- If not ([ioUnique]=C.Options) then
- Fail('Not Unique index');
- AssertIdentifierName('Have table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',1,C.FieldNames.Count);
- AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
- end;
- procedure TTestIndexParser.TestCreateIndexUniqueAscending;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE UNIQUE ASCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
- If not ([ioUnique,ioAscending ]=C.Options) then
- Fail('Not Unique ascending index');
- AssertIdentifierName('Have table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',1,C.FieldNames.Count);
- AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
- end;
- procedure TTestIndexParser.TestCreateIndexUniqueDescending;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE UNIQUE DESCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
- If not ([ioUnique,ioDescending]=C.Options) then
- Fail('Not Unique descending index');
- AssertIdentifierName('Have table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',1,C.FieldNames.Count);
- AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
- end;
- procedure TTestIndexParser.TestCreateIndexAscending;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE ASCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
- If not ([ioAscending]=C.Options) then
- Fail('Not ascending index');
- AssertIdentifierName('Have table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',1,C.FieldNames.Count);
- AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
- end;
- procedure TTestIndexParser.TestCreateIndexDescending;
- Var
- C : TSQLCreateIndexStatement;
- begin
- C:=TSQLCreateIndexStatement(TestCreateStatement('CREATE DESCENDING INDEX A ON B (C)','A',TSQLCreateIndexStatement));
- If not ([ioDescending] = C.Options) then
- Fail('Not descending index');
- AssertIdentifierName('Table name','B',C.TableName);
- AssertNotNull('Have fieldlist',C.FieldNames);
- AssertEquals('Number of fields',1,C.FieldNames.Count);
- AssertIdentifierName('Correct field name','C',C.FieldNames[0]);
- end;
- { TTestTableParser }
- procedure TTestTableParser.DoTestCreateReferencesField(const ASource: String;
- AOnUpdate, AOnDelete: TForeignKeyAction);
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- D : TSQLForeignKeyFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement(ASource,'A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertEquals('Field can be NULL',false,F.FieldType.NotNull);
- AssertNull('Have default',F.FieldType.DefaultValue);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- D:=TSQLForeignKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLForeignKeyFieldConstraint));
- AssertNull('No constraint name',D.ConstraintName);
- AssertIdentifierName('Correct table name','C',D.Definition.TableName);
- AssertEquals('Correct field list count',1,D.Definition.FieldList.Count);
- AssertIdentifierName('Correct field name','D',D.Definition.FieldList[0]);
- AssertEquals('No on update action',AOnUpdate,D.Definition.OnUpdate);
- AssertEquals('No on delete action',AOnDelete,D.Definition.OnDelete);
- end;
- procedure TTestTableParser.TestCreateOneSimpleField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- end;
- procedure TTestTableParser.TestCreateTwoSimpleFields;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, C CHAR(5))','A',TSQLCreateTableStatement));
- AssertEquals('Two fields',2,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[1],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','C',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtChar,F.FieldType.DataType);
- end;
- procedure TTestTableParser.TestCreateOnePrimaryField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P : TSQLPrimaryKeyFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT PRIMARY KEY)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- P:=TSQLPrimaryKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint));
- AssertNull('No constraint name',P.ConstraintName);
- end;
- procedure TTestTableParser.TestCreateOneNamedPrimaryField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P : TSQLPrimaryKeyFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT C PRIMARY KEY)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- P:=TSQLPrimaryKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint));
- AssertIdentifierName('Constraint name','C',P.ConstraintName);
- end;
- procedure TTestTableParser.TestCreateOneUniqueField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- U : TSQLUniqueFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT UNIQUE)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- U:=TSQLUniqueFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLUniqueFieldConstraint));
- AssertNull('No constraint name',U.ConstraintName);
- end;
- procedure TTestTableParser.TestCreateOneNamedUniqueField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- U : TSQLUniqueFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT C UNIQUE)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- U:=TSQLUniqueFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLUniqueFieldConstraint));
- AssertIdentifierName('Constraint name','C',U.ConstraintName);
- end;
- procedure TTestTableParser.TestCreateNotNullPrimaryField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT NOT NULL PRIMARY KEY)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertEquals('Field is not NULL',true,F.FieldType.NotNull);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint);
- end;
- procedure TTestTableParser.TestCreateNotNullDefaultPrimaryField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT DEFAULT 0 NOT NULL PRIMARY KEY)','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertEquals('Field is not NULL',true,F.FieldType.NotNull);
- AssertNotNull('Have default',F.FieldType.DefaultValue);
- CheckClass(F.FieldType.DefaultValue,TSQLIntegerLiteral);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- CheckClass(F.FieldType.Constraint,TSQLPrimaryKeyFieldConstraint);
- end;
- procedure TTestTableParser.TestCreateCheckField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- B : TSQLBinaryExpression;
- CC : TSQLCheckFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CHECK (B<>0))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertNull('Have no default',F.FieldType.DefaultValue);
- AssertNull('Fieldtype has no check',F.FieldType.Check);
- AssertNotNull('Field has constraint check',F.FieldType.Constraint);
- CC:=TSQLCheckFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLCheckFieldConstraint));
- AssertNull('No constraint name',CC.ConstraintName);
- B:=TSQLBinaryExpression(CheckClass(CC.Expression,TSQLBinaryExpression));
- AssertEquals('Unequal check',boNE,B.Operation);
- end;
- procedure TTestTableParser.TestCreateNamedCheckField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- B : TSQLBinaryExpression;
- CC : TSQLCheckFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT C CHECK (B<>0))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertNull('Have no default',F.FieldType.DefaultValue);
- AssertNull('Fieldtype has no check',F.FieldType.Check);
- AssertNotNull('Field has constraint check',F.FieldType.Constraint);
- CC:=TSQLCheckFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLCheckFieldConstraint));
- AssertidentifierName('Constraint name','C',CC.ConstraintName);
- B:=TSQLBinaryExpression(CheckClass(CC.Expression,TSQLBinaryExpression));
- AssertEquals('Unequal check',boNE,B.Operation);
- end;
- procedure TTestTableParser.TestCreateReferencesField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D))',fkaNone,fkaNone);
- end;
- procedure TTestTableParser.TestCreateReferencesOnUpdateCascadeField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE CASCADE)',fkaCascade,fkaNone);
- end;
- procedure TTestTableParser.TestCreateReferencesOnUpdateNoActionField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE NO ACTION)',fkaNoAction,fkaNone);
- end;
- procedure TTestTableParser.TestCreateReferencesOnUpdateSetDefaultField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE SET DEFAULT)',fkaSetDefault,fkaNone);
- end;
- procedure TTestTableParser.TestCreateReferencesOnUpdateSetNullField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE SET NULL)',fkaSetNull,fkaNone);
- end;
- procedure TTestTableParser.TestCreateReferencesOnDeleteCascadeField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE CASCADE)',fkaNone,fkaCascade);
- end;
- procedure TTestTableParser.TestCreateReferencesOnDeleteNoActionField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE NO ACTION)',fkaNone,fkaNoAction);
- end;
- procedure TTestTableParser.TestCreateReferencesOnDeleteSetDefaultField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE SET DEFAULT)',fkaNone,fkaSetDefault);
- end;
- procedure TTestTableParser.TestCreateReferencesOnDeleteSetNullField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON DELETE SET NULL)',fkaNone,fkaSetNull);
- end;
- procedure TTestTableParser.TestCreateReferencesOnUpdateAndDeleteSetNullField;
- begin
- DoTestCreateReferencesField('CREATE TABLE A (B INT REFERENCES C(D) ON UPDATE SET NULL ON DELETE SET NULL)',fkaSetNull,fkaSetNull);
- end;
- procedure TTestTableParser.TestCreateNamedReferencesField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- D : TSQLForeignKeyFieldConstraint;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT CONSTRAINT FK REFERENCES C(D))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- AssertNotNull('Have field type',F.FieldType);
- AssertEquals('Correct field type',sdtInteger,F.FieldType.DataType);
- AssertEquals('Field can be NULL',false,F.FieldType.NotNull);
- AssertNull('Have default',F.FieldType.DefaultValue);
- AssertNotNull('Have constraint',F.FieldType.Constraint);
- D:=TSQLForeignKeyFieldConstraint(CheckClass(F.FieldType.Constraint,TSQLForeignKeyFieldConstraint));
- AssertIdentifierName('Correct constraint name','FK',D.ConstraintName);
- AssertIdentifierName('Correct table name','C',D.Definition.TableName);
- AssertEquals('Correct field list count',1,D.Definition.FieldList.Count);
- AssertIdentifierName('Correct field name','D',D.Definition.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateComputedByField;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- B : TSQLBinaryExpression;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, C INT, D COMPUTED BY (B+C))','A',TSQLCreateTableStatement));
- AssertEquals('Three fields',3,C.FieldDefs.Count);
- AssertEquals('No constraints',0,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[2],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','D',F.FieldName);
- AssertNull('No field type',F.FieldType);
- AssertNotNull('Have computed by expression',F.ComputedBy);
- B:=TSQLBinaryExpression(CheckClass(F.ComputedBy,TSQLBinaryExpression));
- AssertEquals('Add operation',boAdd,B.Operation);
- CheckClass(B.Left,TSQLIdentifierExpression);
- AssertIdentifierName('Correct identifier','B',TSQLIdentifierExpression(B.Left).Identifier);
- CheckClass(B.Right,TSQLIdentifierExpression);
- AssertIdentifierName('Correct identifier','C',TSQLIdentifierExpression(B.Right).Identifier);
- end;
- procedure TTestTableParser.TestCreatePrimaryKeyConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P: TSQLTablePrimaryKeyConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, PRIMARY KEY (B))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTablePrimaryKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTablePrimaryKeyConstraintDef));
- AssertNotNull('Fieldlist assigned',P.FieldList);
- AssertNull('Constraint name empty',P.ConstraintName);
- AssertEquals('One field in primary key',1,P.FieldList.Count);
- AssertIdentifierName('fieldname','B',P.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateNamedPrimaryKeyConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P: TSQLTablePrimaryKeyConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT A_PK PRIMARY KEY (B))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTablePrimaryKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTablePrimaryKeyConstraintDef));
- AssertNotNull('Fieldlist assigned',P.FieldList);
- AssertIdentifierName('fieldname','A_PK',P.ConstraintName);
- AssertEquals('One field in primary key',1,P.FieldList.Count);
- AssertIdentifierName('fieldname','B',P.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateForeignKeyConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P: TSQLTableForeignKeyConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, FOREIGN KEY (B) REFERENCES C(D))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTableForeignKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTableForeignKeyConstraintDef));
- AssertNotNull('Fieldlist assigned',P.FieldList);
- AssertNull('Constraint name',P.ConstraintName);
- AssertEquals('One field in foreign key',1,P.FieldList.Count);
- AssertIdentifierName('fieldname','B',P.FieldList[0]);
- AssertIdentifierName('Target table name','C',P.Definition.TableName);
- AssertEquals('One field in primary key target',1,P.Definition.FieldList.Count);
- AssertIdentifierName('target fieldname','D',P.Definition.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateNamedForeignKeyConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P: TSQLTableForeignKeyConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT A_FK FOREIGN KEY (B) REFERENCES C(D))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTableForeignKeyConstraintDef(CheckClass(C.Constraints[0],TSQLTableForeignKeyConstraintDef));
- AssertNotNull('Fieldlist assigned',P.FieldList);
- AssertIdentifierName('fieldname','A_FK',P.ConstraintName);
- AssertEquals('One field in foreign key',1,P.FieldList.Count);
- AssertIdentifierName('fieldname','B',P.FieldList[0]);
- AssertIdentifierName('Target table name','C',P.Definition.TableName);
- AssertEquals('One field in primary key target',1,P.Definition.FieldList.Count);
- AssertIdentifierName('target fieldname','D',P.Definition.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateUniqueConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P: TSQLTableUniqueConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, UNIQUE (B))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTableUniqueConstraintDef(CheckClass(C.Constraints[0],TSQLTableUniqueConstraintDef));
- AssertNotNull('Fieldlist assigned',P.FieldList);
- AssertNull('Constraint name empty',P.ConstraintName);
- AssertEquals('One field in primary key',1,P.FieldList.Count);
- AssertIdentifierName('Name is correct','B',P.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateNamedUniqueConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- P: TSQLTableUniqueConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT U_A UNIQUE (B))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTableUniqueConstraintDef(CheckClass(C.Constraints[0],TSQLTableUniqueConstraintDef));
- AssertNotNull('Fieldlist assigned',P.FieldList);
- AssertIdentifierName('fieldname','U_A',P.ConstraintName);
- AssertEquals('One field in primary key',1,P.FieldList.Count);
- AssertIdentifierName('Name is correct','B',P.FieldList[0]);
- end;
- procedure TTestTableParser.TestCreateCheckConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- B : TSQLBinaryExpression;
- P: TSQLTableCheckConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CHECK (B<>0))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTableCheckConstraintDef(CheckClass(C.Constraints[0],TSQLTableCheckConstraintDef));
- AssertNull('Constraint name empty',P.ConstraintName);
- AssertNotNull('Check expression assigned',P.Check);
- B:=TSQLBinaryExpression(CheckClass(P.Check,TSQLBinaryExpression));
- AssertEquals('Unequal',boNE,B.Operation);
- end;
- procedure TTestTableParser.TestCreateNamedCheckConstraint;
- Var
- C : TSQLCreateTableStatement;
- F : TSQLTableFieldDef;
- B : TSQLBinaryExpression;
- P: TSQLTableCheckConstraintDef;
- begin
- C:=TSQLCreateTableStatement(TestCreateStatement('CREATE TABLE A (B INT, CONSTRAINT C_A CHECK (B<>0))','A',TSQLCreateTableStatement));
- AssertEquals('One field',1,C.FieldDefs.Count);
- AssertEquals('One constraints',1,C.Constraints.Count);
- F:=TSQLTableFieldDef(CheckClass(C.FieldDefs[0],TSQLTableFieldDef));
- AssertIdentifierName('fieldname','B',F.FieldName);
- P:=TSQLTableCheckConstraintDef(CheckClass(C.Constraints[0],TSQLTableCheckConstraintDef));
- AssertIdentifierName('Constainrname','C_A',P.ConstraintName);
- AssertNotNull('Check expression assigned',P.Check);
- B:=TSQLBinaryExpression(CheckClass(P.Check,TSQLBinaryExpression));
- AssertEquals('Not equal operation',boNE,B.Operation);
- end;
- procedure TTestTableParser.TestAlterDropField;
- Var
- A : TSQLAlterTableStatement;
- D : TSQLDropTableFieldOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP B','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- D:=TSQLDropTableFieldOperation(CheckClass(A.Operations[0],TSQLDropTableFieldOperation));
- AssertidentifierName('Drop field name','B',D.ObjectName);
- end;
- procedure TTestTableParser.TestAlterDropFields;
- Var
- A : TSQLAlterTableStatement;
- D : TSQLDropTableFieldOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP B, DROP C','A',TSQLAlterTableStatement));
- AssertEquals('Two operations',2,A.Operations.Count);
- D:=TSQLDropTableFieldOperation(CheckClass(A.Operations[0],TSQLDropTableFieldOperation));
- AssertidentifierName('Drop field name','B',D.ObjectName);
- D:=TSQLDropTableFieldOperation(CheckClass(A.Operations[1],TSQLDropTableFieldOperation));
- AssertidentifierName('Drop field name','C',D.ObjectName);
- end;
- procedure TTestTableParser.TestAlterDropConstraint;
- Var
- A : TSQLAlterTableStatement;
- D : TSQLDropTableConstraintOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP CONSTRAINT B','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- D:=TSQLDropTableConstraintOperation(CheckClass(A.Operations[0],TSQLDropTableConstraintOperation));
- AssertidentifierName('Drop field name','B',D.ObjectName);
- end;
- procedure TTestTableParser.TestAlterDropConstraints;
- Var
- A : TSQLAlterTableStatement;
- D : TSQLDropTableConstraintOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A DROP CONSTRAINT B, DROP CONSTRAINT C','A',TSQLAlterTableStatement));
- AssertEquals('Two operations',2,A.Operations.Count);
- D:=TSQLDropTableConstraintOperation(CheckClass(A.Operations[0],TSQLDropTableConstraintOperation));
- AssertidentifierName('Drop Constraint name','B',D.ObjectName);
- D:=TSQLDropTableConstraintOperation(CheckClass(A.Operations[1],TSQLDropTableConstraintOperation));
- AssertidentifierName('Drop field name','C',D.ObjectName);
- end;
- procedure TTestTableParser.TestAlterRenameField;
- Var
- A : TSQLAlterTableStatement;
- R : TSQLAlterTableFieldNameOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER B TO C','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- R:=TSQLAlterTableFieldNameOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldNameOperation));
- AssertidentifierName('Old field name','B',R.ObjectName);
- AssertidentifierName('New field name','C',R.NewName);
- end;
- procedure TTestTableParser.TestAlterRenameColumnField;
- Var
- A : TSQLAlterTableStatement;
- R : TSQLAlterTableFieldNameOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER COLUMN B TO C','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- R:=TSQLAlterTableFieldNameOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldNameOperation));
- AssertidentifierName('Old field name','B',R.ObjectName);
- AssertidentifierName('New field name','C',R.NewName);
- end;
- procedure TTestTableParser.TestAlterFieldType;
- Var
- A : TSQLAlterTableStatement;
- R : TSQLAlterTableFieldTypeOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER COLUMN B TYPE INT','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- R:=TSQLAlterTableFieldTypeOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldTypeOperation));
- AssertidentifierName('Old field name','B',R.ObjectName);
- AssertNotNull('Have field type',R.NewType);
- Checkclass(R.NewType,TSQLTypeDefinition);
- AssertEquals('Correct data type',sdtInteger,R.NewType.DataType);
- end;
- procedure TTestTableParser.TestAlterFieldPosition;
- Var
- A : TSQLAlterTableStatement;
- R : TSQLAlterTableFieldPositionOperation;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ALTER COLUMN B POSITION 3','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- R:=TSQLAlterTableFieldPositionOperation(CheckClass(A.Operations[0],TSQLAlterTableFieldPositionOperation));
- AssertidentifierName('Old field name','B',R.ObjectName);
- AssertEquals('Correct position',3,R.NewPosition);
- end;
- procedure TTestTableParser.TestAlterAddField;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddFieldOperation;
- D : TSQLTableFieldDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD B INT','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddFieldOperation(CheckClass(A.Operations[0],TSQLAlterTableAddFieldOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableFieldDef(CheckClass(F.Element,TSQLTableFieldDef));
- AssertIdentifierName('New field name','B',D.FieldName);
- AssertNotNull('Have fielddef',D.FieldType);
- AssertEquals('Correct field type',sdtINteger,D.FieldType.DataType);
- end;
- procedure TTestTableParser.TestAlterAddFields;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddFieldOperation;
- D : TSQLTableFieldDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD B INT, ADD C CHAR(50)','A',TSQLAlterTableStatement));
- AssertEquals('Two operations',2,A.Operations.Count);
- F:=TSQLAlterTableAddFieldOperation(CheckClass(A.Operations[0],TSQLAlterTableAddFieldOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableFieldDef(CheckClass(F.Element,TSQLTableFieldDef));
- AssertIdentifierName('New field name','B',D.FieldName);
- AssertNotNull('Have fielddef',D.FieldType);
- AssertEquals('Correct field type',sdtINteger,D.FieldType.DataType);
- F:=TSQLAlterTableAddFieldOperation(CheckClass(A.Operations[1],TSQLAlterTableAddFieldOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableFieldDef(CheckClass(F.Element,TSQLTableFieldDef));
- AssertIdentifierName('New field name','C',D.FieldName);
- AssertNotNull('Have fielddef',D.FieldType);
- AssertEquals('Correct field type',sdtChar,D.FieldType.DataType);
- AssertEquals('Correct field lengthe',50,D.FieldType.Len);
- end;
- procedure TTestTableParser.TestAlterAddPrimarykey;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddConstraintOperation;
- D : TSQLTablePrimaryKeyConstraintDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD PRIMARY KEY (B)','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTablePrimaryKeyConstraintDef(CheckClass(F.Element,TSQLTablePrimaryKeyConstraintDef));
- AssertNull('No constraint name',D.ConstraintName);
- AssertEquals('Have 1 field',1,D.FieldList.Count);
- AssertIdentifierName('fieldname','B',D.FieldList[0]);
- end;
- procedure TTestTableParser.TestAlterAddNamedPrimarykey;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddConstraintOperation;
- D : TSQLTablePrimaryKeyConstraintDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CONSTRAINT U_K PRIMARY KEY (B)','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTablePrimaryKeyConstraintDef(CheckClass(F.Element,TSQLTablePrimaryKeyConstraintDef));
- AssertIdentifierName('No constraint name','U_K',D.ConstraintName);
- AssertEquals('Have 1 field',1,D.FieldList.Count);
- AssertIdentifierName('fieldname','B',D.FieldList[0]);
- end;
- procedure TTestTableParser.TestAlterAddCheckConstraint;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddConstraintOperation;
- D : TSQLTableCheckConstraintDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CHECK (B<>0)','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableCheckConstraintDef(CheckClass(F.Element,TSQLTableCheckConstraintDef));
- AssertNull('Constaintname',D.ConstraintName);
- AssertNotNull('Check expression assigned',D.Check);
- CheckClass(D.Check,TSQLBinaryExpression);
- end;
- procedure TTestTableParser.TestAlterAddNamedCheckConstraint;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddConstraintOperation;
- D : TSQLTableCheckConstraintDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CONSTRAINT C_A CHECK (B<>0)','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableCheckConstraintDef(CheckClass(F.Element,TSQLTableCheckConstraintDef));
- AssertIdentifierName('Constaintname','C_A',D.ConstraintName);
- AssertNotNull('Check expression assigned',D.Check);
- CheckClass(D.Check,TSQLBinaryExpression);
- end;
- procedure TTestTableParser.TestAlterAddForeignkey;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddConstraintOperation;
- D : TSQLTableForeignKeyConstraintDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD FOREIGN KEY (B) REFERENCES C(D)','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableForeignKeyConstraintDef(CheckClass(F.Element,TSQLTableForeignKeyConstraintDef));
- AssertNull('No constraint name',D.ConstraintName);
- AssertEquals('Have 1 field',1,D.FieldList.Count);
- AssertIdentifierName('fieldname','B',D.FieldList[0]);
- AssertIdentifierName('Target table name','C',D.Definition.TableName);
- AssertEquals('One field in primary key target',1,D.Definition.FieldList.Count);
- AssertIdentifierName('target fieldname','D',D.Definition.FieldList[0]);
- end;
- procedure TTestTableParser.TestAlterAddNamedForeignkey;
- Var
- A : TSQLAlterTableStatement;
- F : TSQLAlterTableAddConstraintOperation;
- D : TSQLTableForeignKeyConstraintDef;
- begin
- A:=TSQLAlterTableStatement(TestCreateStatement('ALTER TABLE A ADD CONSTRAINT F_A FOREIGN KEY (B) REFERENCES C(D)','A',TSQLAlterTableStatement));
- AssertEquals('One operation',1,A.Operations.Count);
- F:=TSQLAlterTableAddConstraintOperation(CheckClass(A.Operations[0],TSQLAlterTableAddConstraintOperation));
- AssertNotNull('Have element',F.Element);
- D:=TSQLTableForeignKeyConstraintDef(CheckClass(F.Element,TSQLTableForeignKeyConstraintDef));
- AssertIdentifierName('constraint name','F_A',D.ConstraintName);
- AssertEquals('Have 1 field',1,D.FieldList.Count);
- AssertIdentifierName('fieldname','B',D.FieldList[0]);
- AssertIdentifierName('Target table name','C',D.Definition.TableName);
- AssertEquals('One field in primary key target',1,D.Definition.FieldList.Count);
- AssertIdentifierName('target fieldname','D',D.Definition.FieldList[0]);
- end;
- { TTestDeleteParser }
- function TTestDeleteParser.TestDelete(const ASource,ATable: String
- ): TSQLDeleteStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLDeleteStatement(CheckClass(FToFree,TSQLDeleteStatement));
- AssertIdentifierName('Correct table name',ATable,Result.TableName);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestDeleteParser.TestSimpleDelete;
- Var
- D : TSQLDeleteStatement;
- begin
- D:=TestDelete('DELETE FROM A','A');
- AssertNull('No where',D.WhereClause);
- end;
- procedure TTestDeleteParser.TestSimpleDeleteAlias;
- Var
- D : TSQLDeleteStatement;
- begin
- D:=TestDelete('DELETE FROM A B','A');
- AssertIdentifierName('Alias name','B',D.AliasName);
- AssertNull('No where',D.WhereClause);
- end;
- procedure TTestDeleteParser.TestDeleteWhereNull;
- Var
- D : TSQLDeleteStatement;
- B : TSQLBinaryExpression;
- I : TSQLIdentifierExpression;
- L : TSQLLiteralExpression;
- begin
- D:=TestDelete('DELETE FROM A WHERE B IS NULL','A');
- AssertNotNull('No where',D.WhereClause);
- B:=TSQLBinaryExpression(CheckClass(D.WhereClause,TSQLBinaryExpression));
- AssertEquals('Is null operation',boIs,B.Operation);
- I:=TSQLIdentifierExpression(CheckClass(B.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Correct field name','B',I.Identifier);
- L:=TSQLLiteralExpression(CheckClass(B.Right,TSQLLiteralExpression));
- CheckClass(L.Literal,TSQLNullLiteral);
- end;
- { TTestUpdateParser }
- function TTestUpdateParser.TestUpdate(const ASource, ATable: String
- ): TSQLUpdateStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLUpdateStatement(CheckClass(FToFree,TSQLUpdateStatement));
- AssertIdentifierName('Correct table name',ATable,Result.TableName);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestUpdateParser.TestUpdateOneField;
- Var
- U : TSQLUpdateStatement;
- P : TSQLUpdatePair;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- begin
- U:=TestUpdate('UPDATE A SET B=1','A');
- AssertEquals('One field updated',1,U.Values.Count);
- P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
- AssertIdentifierName('Correct field name','B',P.FieldName);
- E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Value 1',1,I.Value);
- AssertNull('No where clause',U.WhereClause);
- end;
- procedure TTestUpdateParser.TestUpdateOneFieldFull;
- Var
- U : TSQLUpdateStatement;
- P : TSQLUpdatePair;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- begin
- U:=TestUpdate('UPDATE A SET A.B=1','A');
- AssertEquals('One field updated',1,U.Values.Count);
- P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
- AssertIdentifierName('Correct field name','A.B',P.FieldName);
- E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Value 1',1,I.Value);
- AssertNull('No where clause',U.WhereClause);
- end;
- procedure TTestUpdateParser.TestUpdateTwoFields;
- Var
- U : TSQLUpdateStatement;
- P : TSQLUpdatePair;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- begin
- U:=TestUpdate('UPDATE A SET B=1, C=2','A');
- AssertEquals('One field updated',2,U.Values.Count);
- P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
- AssertIdentifierName('Correct field name','B',P.FieldName);
- E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Value 1',1,I.Value);
- P:=TSQLUpdatePair(CheckClass(U.Values[1],TSQLUpdatePair));
- AssertIdentifierName('Correct field name','C',P.FieldName);
- E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Value 2',2,I.Value);
- AssertNull('No where clause',U.WhereClause);
- end;
- procedure TTestUpdateParser.TestUpdateOneFieldWhereIsNull;
- Var
- U : TSQLUpdateStatement;
- P : TSQLUpdatePair;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- B : TSQLBinaryExpression;
- IE : TSQLIdentifierExpression;
- L : TSQLLiteralExpression;
- begin
- U:=TestUpdate('UPDATE A SET B=1 WHERE B IS NULL','A');
- AssertEquals('One field updated',1,U.Values.Count);
- P:=TSQLUpdatePair(CheckClass(U.Values[0],TSQLUpdatePair));
- AssertIdentifierName('Correct field name','B',P.FieldName);
- E:=TSQLLiteralExpression(CheckClass(P.Value,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Value 1',1,I.Value);
- AssertNotNull('where clause',U.WhereClause);
- B:=TSQLBinaryExpression(CheckClass(U.WhereClause,TSQLBinaryExpression));
- AssertEquals('Is null operation',boIs,B.Operation);
- IE:=TSQLIdentifierExpression(CheckClass(B.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Correct field name','B',IE.Identifier);
- L:=TSQLLiteralExpression(CheckClass(B.Right,TSQLLiteralExpression));
- CheckClass(L.Literal,TSQLNullLiteral);
- end;
- { TTestInsertParser }
- function TTestInsertParser.TestInsert(const ASource, ATable: String
- ): TSQLInsertStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLInsertStatement(CheckClass(FToFree,TSQLInsertStatement));
- AssertIdentifierName('Correct table name',ATable,Result.TableName);
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestInsertParser.TestInsertOneField;
- Var
- I : TSQLInsertStatement;
- E : TSQLLiteralExpression;
- L : TSQLIntegerLiteral;
- begin
- I:=TestInsert('INSERT INTO A (B) VALUES (1)','A');
- AssertNotNull('Have fields',I.Fields);
- AssertEquals('1 field',1,I.Fields.Count);
- AssertIdentifierName('Correct field name','B',I.Fields[0]);
- AssertNotNull('Have values',I.Values);
- AssertEquals('Have 1 value',1,I.Values.Count);
- E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
- L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,L.Value);
- end;
- procedure TTestInsertParser.TestInsertTwoFields;
- Var
- I : TSQLInsertStatement;
- E : TSQLLiteralExpression;
- L : TSQLIntegerLiteral;
- begin
- I:=TestInsert('INSERT INTO A (B,C) VALUES (1,2)','A');
- AssertNotNull('Have fields',I.Fields);
- AssertEquals('2 fields',2,I.Fields.Count);
- AssertIdentifierName('Correct field 1 name','B',I.Fields[0]);
- AssertIdentifierName('Correct field 2 name','C',I.Fields[1]);
- AssertNotNull('Have values',I.Values);
- AssertEquals('Have 2 values',2,I.Values.Count);
- E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
- L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,L.Value);
- E:=TSQLLiteralExpression(CheckClass(I.Values[1],TSQLLiteralExpression));
- L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',2,L.Value);
- end;
- procedure TTestInsertParser.TestInsertOneValue;
- Var
- I : TSQLInsertStatement;
- E : TSQLLiteralExpression;
- L : TSQLIntegerLiteral;
- begin
- I:=TestInsert('INSERT INTO A VALUES (1)','A');
- AssertNull('Have no fields',I.Fields);
- AssertNotNull('Have values',I.Values);
- AssertEquals('Have 1 value',1,I.Values.Count);
- E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
- L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,L.Value);
- end;
- procedure TTestInsertParser.TestInsertTwoValues;
- Var
- I : TSQLInsertStatement;
- E : TSQLLiteralExpression;
- L : TSQLIntegerLiteral;
- begin
- I:=TestInsert('INSERT INTO A VALUES (1,2)','A');
- AssertNull('Have no fields',I.Fields);
- AssertNotNull('Have values',I.Values);
- AssertEquals('Have 2 values',2,I.Values.Count);
- E:=TSQLLiteralExpression(CheckClass(I.Values[0],TSQLLiteralExpression));
- L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,L.Value);
- E:=TSQLLiteralExpression(CheckClass(I.Values[1],TSQLLiteralExpression));
- L:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',2,L.Value);
- end;
- { TTestSelectParser }
- function TTestSelectParser.TestSelect(const ASource: String; AOptions: TParserOptions;
- AScannerOptions: TSQLScannerOptions): TSQLSelectStatement;
- begin
- CreateParser(ASource,AOptions);
- Parser.Scanner.Options:=AScannerOptions;
- FToFree:=Parser.Parse;
- Result:=TSQLSelectStatement(CheckClass(FToFree,TSQLSelectStatement));
- FSelect:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestSelectParser.TestSelectError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestSelectParser.TestSelectFieldAsStringLiteral;
- Var
- F : TSQLSelectField;
- L : TSQLStringLiteral;
- begin
- TestSelect('SELECT ''B'' ''C'''); // 'B' as 'C'
- AssertEquals('One field',1,Select.Fields.Count);
- F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
- AssertNotNull('Have field expresssion,',F.Expression);
- L:=TSQLStringLiteral(AssertLiteralExpr('Field is a literal',F.Expression,TSQLStringLiteral));
- AssertEquals('Field literal is B','B',L.Value);
- AssertEquals('Field alias is C','C',F.AliasName.Name);
- AssertEquals('No table',0,Select.Tables.Count);
- end;
- procedure TTestSelectParser.TestSelectFieldWithSchema;
- Var
- Expr: TSQLIdentifierExpression;
- begin
- TestSelect('SELECT S.A.B,C FROM S.A');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- Expr := ((Select.Fields[0] as TSQLSelectField).Expression as TSQLIdentifierExpression);
- AssertEquals('Field[0] path has 3 identifiers',3,Expr.IdentifierPath.Count);
- AssertEquals('Field[0] schema is S','S',Expr.IdentifierPath[0].Name);
- AssertEquals('Field[0] table is A','A',Expr.IdentifierPath[1].Name);
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A','');
- AssertEquals('Table path has 2 objects',2,(Select.Tables[0] as TSQLSimpleTableReference).ObjectNamePath.Count);
- AssertEquals('Schema name = S','S',(Select.Tables[0] as TSQLSimpleTableReference).ObjectNamePath[0].Name);
- end;
- procedure TTestSelectParser.TestSelectFirst;
- begin
- // FireBird
- TestSelect('SELECT FIRST 100 A FROM B');
- AssertEquals('Limit style',Ord(lsFireBird),Ord(Select.Limit.Style));
- AssertEquals('Limit FIRST 100',100,Select.Limit.First);
- end;
- procedure TTestSelectParser.TestSelectFirstSkip;
- begin
- // FireBird
- TestSelect('SELECT FIRST 100 SKIP 200 A FROM B');
- AssertEquals('Limit style',Ord(lsFireBird),Ord(Select.Limit.Style));
- AssertEquals('Limit FIRST 100',100,Select.Limit.First);
- AssertEquals('Limit SKIP 200',200,Select.Limit.Skip);
- end;
- procedure TTestSelectParser.TestSelectLimit;
- begin
- // MySQL&Postgres
- TestSelect('SELECT A FROM B LIMIT 100');
- AssertEquals('Limit style',Ord(lsPostgres),Ord(Select.Limit.Style));
- AssertEquals('Limit RowCount 100',100,Select.Limit.RowCount);
- end;
- procedure TTestSelectParser.TestSelectLimitAll;
- begin
- // Postgres
- TestSelect('SELECT A FROM B LIMIT ALL');
- AssertEquals('Limit style',Ord(lsPostgres),Ord(Select.Limit.Style));
- AssertEquals('Limit RowCount -1',-1,Select.Limit.RowCount);
- end;
- procedure TTestSelectParser.TestSelectLimitAllOffset;
- begin
- // Postgres
- TestSelect('SELECT A FROM B LIMIT ALL OFFSET 200');
- AssertEquals('Limit style',Ord(lsPostgres),Ord(Select.Limit.Style));
- AssertEquals('Limit Offset 200',200,Select.Limit.Offset);
- end;
- procedure TTestSelectParser.TestSelectLimitOffset1;
- begin
- // MySQL
- TestSelect('SELECT A FROM B LIMIT 200, 100');
- AssertEquals('Limit style',Ord(lsPostgres),Ord(Select.Limit.Style));
- AssertEquals('Limit RowCount 100',100,Select.Limit.RowCount);
- AssertEquals('Limit Offset 200',200,Select.Limit.Offset);
- end;
- procedure TTestSelectParser.TestSelectLimitOffset2;
- begin
- // MySQL&Postgres
- TestSelect('SELECT A FROM B LIMIT 100 OFFSET 200');
- AssertEquals('Limit style',Ord(lsPostgres),Ord(Select.Limit.Style));
- AssertEquals('Limit RowCount 100',100,Select.Limit.RowCount);
- AssertEquals('Limit Offset 200',200,Select.Limit.Offset);
- end;
- procedure TTestSelectParser.TestSelectOffset;
- begin
- // Postgres
- TestSelect('SELECT A FROM B OFFSET 200');
- AssertEquals('Limit style',Ord(lsPostgres),Ord(Select.Limit.Style));
- AssertEquals('Limit Offset 200',200,Select.Limit.Offset);
- end;
- procedure TTestSelectParser.TestSelectOneFieldOneTable;
- begin
- TestSelect('SELECT B FROM A');
- AssertNull('No transaction name',Select.TransactionName);
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneFieldOneTableTransaction;
- begin
- TestSelect('SELECT TRANSACTION C B FROM A');
- AssertIdentifierName('Correct transaction name','C',Select.TransactionName);
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneArrayFieldOneTable;
- Var
- E : TSQLIdentifierExpression;
- begin
- TestSelect('SELECT B[1] FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- E:=TSQLIdentifierExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLIdentifierExpression));
- AssertEquals('Element 1 in array ',1,E.ElementIndex);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsOneTable;
- begin
- TestSelect('SELECT B,_C FROM A');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'_C');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneFieldAliasOneTable;
- begin
- TestSelect('SELECT B AS C FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B','C');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectTwoFieldAliasesOneTable;
- begin
- TestSelect('SELECT B AS D,C AS E FROM A');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B','D');
- AssertField(Select.Fields[1],'C','E');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneTableFieldOneTable;
- Var
- Expr: TSQLIdentifierExpression;
- begin
- TestSelect('SELECT A.B FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- // Field supports linking/refering to a table
- AssertField(Select.Fields[0],'B');
- Expr := ((Select.Fields[0] as TSQLSelectField).Expression as TSQLIdentifierExpression);
- AssertEquals('Field has explicit table',2,Expr.IdentifierPath.Count);
- AssertEquals('Field has explicit table named A','A',Expr.IdentifierPath[0].Name);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectTableWithSchema;
- begin
- TestSelect('SELECT B,C FROM S.A');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A','');
- AssertEquals('Table path has 2 objects',2,(Select.Tables[0] as TSQLSimpleTableReference).ObjectNamePath.Count);
- AssertEquals('Schema name = S','S',(Select.Tables[0] as TSQLSimpleTableReference).ObjectNamePath[0].Name);
- end;
- procedure TTestSelectParser.TestSelectTop;
- begin
- // MSSQL
- TestSelect('SELECT TOP 100 A FROM B');
- AssertEquals('Limit style',Ord(lsMSSQL),Ord(Select.Limit.Style));
- AssertEquals('Limit TOP 100',100,Select.Limit.Top);
- end;
- procedure TTestSelectParser.TestSelectOneDistinctFieldOneTable;
- begin
- TestSelect('SELECT DISTINCT B FROM A');
- AssertEquals('DISTINCT Query',True,Select.Distinct);
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneAllFieldOneTable;
- begin
- TestSelect('SELECT ALL B FROM A');
- AssertEquals('ALL Query',True,Select.All);
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectAsteriskOneTable;
- begin
- TestSelect('SELECT * FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- CheckClass(Select.Fields[0],TSQLSelectAsterisk);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectAsteriskWithPath;
- begin
- TestSelect('SELECT A.* FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- CheckClass(Select.Fields[0],TSQLSelectAsterisk);
- AssertEquals('Path count = 1',1,TSQLSelectAsterisk(Select.Fields[0]).Expression.IdentifierPath.Count);
- AssertEquals('Path table = A','A',TSQLSelectAsterisk(Select.Fields[0]).Expression.IdentifierPath[0].Name);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectDistinctAsteriskOneTable;
- begin
- TestSelect('SELECT DISTINCT * FROM A');
- AssertEquals('DISTINCT Query',True,Select.Distinct);
- AssertEquals('One field',1,Select.Fields.Count);
- CheckClass(Select.Fields[0],TSQLSelectAsterisk);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneFieldOneTableAlias;
- Var
- Expr: TSQLIdentifierExpression;
- begin
- TestSelect('SELECT C.B FROM A C');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- Expr := ((Select.Fields[0] as TSQLSelectField).Expression as TSQLIdentifierExpression);
- AssertEquals('Field has explicit table',2,Expr.IdentifierPath.Count);
- AssertEquals('Field has explicit table named C','C',Expr.IdentifierPath[0].Name);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneFieldOneTableAsAlias;
- Var
- Expr: TSQLIdentifierExpression;
- begin
- TestSelect('SELECT C.B FROM A AS C');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- Expr := ((Select.Fields[0] as TSQLSelectField).Expression as TSQLIdentifierExpression);
- AssertEquals('Field has explicit table',2,Expr.IdentifierPath.Count);
- AssertEquals('Field has explicit table named C','C',Expr.IdentifierPath[0].Name);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoTables;
- begin
- TestSelect('SELECT B,C FROM A,D');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('Two table',2,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertTable(Select.Tables[1],'D');
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A JOIN D ON E=F');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- J:=AssertJoin(Select.Tables[0],'A','D',jtNone);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSourcePosition;
- begin
- TestSelect('SELECT X FROM ABC ORDER BY Y');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertEquals('FROM source line = 1', 1, Select.Tables.SourceLine);
- AssertEquals('FROM source position = 10', 10, Select.Tables.SourcePos);
- AssertEquals('ORDER BY source line = 1', 1, Select.Orderby.SourceLine);
- AssertEquals('ORDER BY source position = 19', 19, Select.Orderby.SourcePos);
- AssertEquals('Table source line = 1', 1, Select.Tables[0].SourceLine);
- AssertEquals('Table source position = 15', 15, Select.Tables[0].SourcePos);
- TestSelect('SELECT X'+sLineBreak+'FROM ABC'+sLineBreak+'ORDER BY Y');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertEquals('FROM source line = 2', 2, Select.Tables.SourceLine);
- AssertEquals('FROM source position = 1', 1, Select.Tables.SourcePos);
- AssertEquals('ORDER BY source line = 3', 3, Select.Orderby.SourceLine);
- AssertEquals('ORDER BY source position = 1', 1, Select.Orderby.SourcePos);
- AssertEquals('Table source line = 2', 2, Select.Tables[0].SourceLine);
- AssertEquals('Table source position = 6', 6, Select.Tables[0].SourcePos);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoInnerTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A INNER JOIN D ON E=F');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- J:=AssertJoin(Select.Tables[0],'A','D',jtInner);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoFullOuterTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A FULL OUTER JOIN D ON E=F');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- J:=AssertJoin(Select.Tables[0],'A','D',jtFullOuter);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoFullTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A FULL JOIN D ON E=F');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- J:=AssertJoin(Select.Tables[0],'A','D',jtFullOuter);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoLeftTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A LEFT JOIN D ON E=F');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- J:=AssertJoin(Select.Tables[0],'A','D',jtLeft);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsTwoRightTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A RIGHT JOIN D ON E=F');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- J:=AssertJoin(Select.Tables[0],'A','D',jtRight);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsThreeTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A JOIN D ON E=F JOIN G ON (H=I)');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- j:=AssertJoin(Select.Tables[0],'','G',jtNone);
- AssertJoinOn(J.JoinClause,'H','I',boEq);
- J:=AssertJoin(J.Left,'A','D',jtNone);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsBracketThreeTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM (A JOIN D ON E=F) JOIN G ON (H=I)');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- j:=AssertJoin(Select.Tables[0],'','G',jtNone);
- AssertJoinOn(J.JoinClause,'H','I',boEq);
- J:=AssertJoin(J.Left,'A','D',jtNone);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestSelectTwoFieldsThreeBracketTablesJoin;
- Var
- J : TSQLJoinTableReference;
- begin
- TestSelect('SELECT B,C FROM A JOIN (D JOIN G ON E=F) ON (H=I)');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertEquals('One table',1,Select.Tables.Count);
- j:=AssertJoin(Select.Tables[0],'A','',jtNone);
- AssertJoinOn(J.JoinClause,'H','I',boEq);
- j:=AssertJoin(J.Right,'D','G',jtNone);
- AssertJoinOn(J.JoinClause,'E','F',boEq);
- end;
- procedure TTestSelectParser.TestAggregateCount;
- begin
- TestSelect('SELECT COUNT(B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afCount,'B',aoNone,'');
- end;
- procedure TTestSelectParser.TestAggregateCountAsterisk;
- begin
- TestSelect('SELECT COUNT(*) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afCount,'',aoAsterisk,'');
- end;
- procedure TTestSelectParser.TestAggregateCountAll;
- begin
- TestSelect('SELECT COUNT(ALL B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afCount,'B',aoAll,'');
- end;
- procedure TTestSelectParser.TestAggregateCountDistinct;
- begin
- TestSelect('SELECT COUNT(DISTINCT B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afCount,'B',aoDistinct,'');
- end;
- procedure TTestSelectParser.TestAggregateMax;
- begin
- TestSelect('SELECT MAX(B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afMax,'B',aoNone,'');
- end;
- procedure TTestSelectParser.TestAggregateMaxAsterisk;
- begin
- TestSelectError('SELECT Max(*) FROM A');
- end;
- procedure TTestSelectParser.TestAggregateMaxAll;
- begin
- TestSelect('SELECT MAX(ALL B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afMax,'B',aoAll,'');
- end;
- procedure TTestSelectParser.TestAggregateMaxDistinct;
- begin
- TestSelect('SELECT MAX(DISTINCT B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afMax,'B',aoDistinct,'');
- end;
- procedure TTestSelectParser.TestAggregateMin;
- begin
- TestSelect('SELECT Min(B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afMin,'B',aoNone,'');
- end;
- procedure TTestSelectParser.TestAggregateMinAsterisk;
- begin
- TestSelectError('SELECT Min(*) FROM A');
- end;
- procedure TTestSelectParser.TestAggregateMinAll;
- begin
- TestSelect('SELECT Min(ALL B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afMin,'B',aoAll,'');
- end;
- procedure TTestSelectParser.TestAggregateMinDistinct;
- begin
- TestSelect('SELECT Min(DISTINCT B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afMin,'B',aoDistinct,'');
- end;
- procedure TTestSelectParser.TestAggregateSum;
- begin
- TestSelect('SELECT Sum(B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afSum,'B',aoNone,'');
- end;
- procedure TTestSelectParser.TestAggregateSumAsterisk;
- begin
- TestSelectError('SELECT Sum(*) FROM A');
- end;
- procedure TTestSelectParser.TestAggregateSumAll;
- begin
- TestSelect('SELECT Sum(ALL B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afSum,'B',aoAll,'');
- end;
- procedure TTestSelectParser.TestAggregateSumDistinct;
- begin
- TestSelect('SELECT Sum(DISTINCT B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afSum,'B',aoDistinct,'');
- end;
- procedure TTestSelectParser.TestAggregateAvg;
- begin
- TestSelect('SELECT Avg(B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afAvg,'B',aoNone,'');
- end;
- procedure TTestSelectParser.TestAggregateAvgAsterisk;
- begin
- TestSelectError('SELECT Avg(*) FROM A');
- end;
- procedure TTestSelectParser.TestAggregateAvgAll;
- begin
- TestSelect('SELECT Avg(ALL B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afAvg,'B',aoAll,'');
- end;
- procedure TTestSelectParser.TestAggregateAvgDistinct;
- begin
- TestSelect('SELECT Avg(DISTINCT B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertAggregate(Select.Fields[0],afAvg,'B',aoDistinct,'');
- end;
- procedure TTestSelectParser.TestUpperConst;
- Var
- E : TSQLFunctionCallExpression;
- L : TSQLLiteralExpression;
- S : TSQLStringLiteral;
- begin
- TestSelect('SELECT UPPER(''a'') FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- CheckClass(Select.Fields[0],TSQLSelectField);
- E:=TSQLFunctionCallExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLFunctionCallExpression));
- AssertEquals('UPPER function name','UPPER',E.Identifier);
- AssertEquals('One function element',1,E.Arguments.Count);
- L:=TSQLLiteralExpression(CheckClass(E.Arguments[0],TSQLLiteralExpression));
- S:=TSQLStringLiteral(CheckClass(L.Literal,TSQLStringLiteral));
- AssertEquals('Correct constant','a',S.Value);
- end;
- procedure TTestSelectParser.TestUpperError;
- begin
- TestSelectError('SELECT UPPER(''A'',''B'') FROM C');
- end;
- procedure TTestSelectParser.TestGenID;
- Var
- E : TSQLGenIDExpression;
- L : TSQLLiteralExpression;
- S : TSQLIntegerLiteral;
- begin
- TestSelect('SELECT GEN_ID(GEN_B,1) FROM RDB$DATABASE');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'RDB$DATABASE');
- CheckClass(Select.Fields[0],TSQLSelectField);
- E:=TSQLGenIDExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLGenIDExpression));
- AssertIdentifierName('GenID generator function name','GEN_B',E.Generator);
- L:=TSQLLiteralExpression(CheckClass(E.Value,TSQLLiteralExpression));
- S:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct constant',1,S.Value);
- end;
- procedure TTestSelectParser.TestGenIDError1;
- begin
- TestSelectError('SELECT GEN_ID(''GEN_B'',1) FROM RDB$DATABASE');
- end;
- procedure TTestSelectParser.TestGenIDError2;
- begin
- TestSelectError('SELECT GEN_ID(''GEN_B'') FROM RDB$DATABASE');
- end;
- procedure TTestSelectParser.TestCastSimple;
- var
- C : TSQLCastExpression;
- L : TSQLLiteralExpression;
- S : TSQLIntegerLiteral;
- begin
- TestSelect('SELECT CAST(1 AS VARCHAR(5)) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- CheckClass(Select.Fields[0],TSQLSelectField);
- C:=TSQLCastExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLCastExpression));
- L:=TSQLLiteralExpression(CheckClass(C.Value,TSQLLiteralExpression));
- S:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct constant',1,S.Value);
- AssertTypeDefaults(C.NewType,5);
- AssertEquals('Correct type',sdtVarChar,C.NewType.DataType);
- end;
- procedure TTestSelectParser.DoExtractSimple(Expected: TSQLExtractElement);
- var
- E : TSQLExtractExpression;
- I : TSQLIdentifierExpression;
- begin
- TestSelect('SELECT EXTRACT('+ExtractElementNames[Expected]+' FROM B) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- CheckClass(Select.Fields[0],TSQLSelectField);
- E:=TSQLExtractExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLExtractExpression));
- I:=TSQLIdentifierExpression(CheckClass(E.Value,TSQLIdentifierExpression));
- AssertIdentifierName('Correct field','B',I.Identifier);
- FreeAndNil(FParser);
- FreeAndNil(FSource);
- FreeAndNil(FToFree);
- end;
- procedure TTestSelectParser.TestExtractSimple;
- Var
- E : TSQLExtractElement;
- begin
- For E:=Low(TSQLExtractElement) to High(TSQLExtractElement) do
- DoExtractSimple(E);
- end;
- procedure TTestSelectParser.TestFunctionWithPath;
- Var
- E : TSQLFunctionCallExpression;
- L : TSQLLiteralExpression;
- S : TSQLStringLiteral;
- I : TSQLIntegerLiteral;
- begin
- TestSelect('SELECT [dbo].[myFunc] (''abc'', 1) FROM A', [], [soSquareBracketsIdentifier]);
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- CheckClass(Select.Fields[0],TSQLSelectField);
- E:=TSQLFunctionCallExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLFunctionCallExpression));
- AssertEquals('Function two identifiers',2,E.IdentifierPath.Count);
- AssertEquals('dbo function first identifier','dbo',E.IdentifierPath[0].Name);
- AssertEquals('myFunc function second identifier','myFunc',E.IdentifierPath[1].Name);
- AssertEquals('Two function elements',2,E.Arguments.Count);
- L:=TSQLLiteralExpression(CheckClass(E.Arguments[0],TSQLLiteralExpression));
- S:=TSQLStringLiteral(CheckClass(L.Literal,TSQLStringLiteral));
- AssertEquals('Correct string constant','abc',S.Value);
- L:=TSQLLiteralExpression(CheckClass(E.Arguments[1],TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct integer constant',1,I.Value);
- end;
- procedure TTestSelectParser.TestOrderByOneField;
- begin
- TestSelect('SELECT B FROM A ORDER BY C');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('One order by field',1,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'C',0,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByTwoFields;
- begin
- TestSelect('SELECT B FROM A ORDER BY C,D');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Two order by fields',2,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'C',0,obAscending);
- AssertOrderBy(Select.OrderBy[1],'D',0,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByThreeFields;
- begin
- TestSelect('SELECT B FROM A ORDER BY C,D,E');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Three order by fields',3,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'C',0,obAscending);
- AssertOrderBy(Select.OrderBy[1],'D',0,obAscending);
- AssertOrderBy(Select.OrderBy[2],'E',0,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByOneDescField;
- begin
- TestSelect('SELECT B FROM A ORDER BY C DESC');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('One order by field',1,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'C',0,obDescending);
- end;
- procedure TTestSelectParser.TestOrderByTwoDescFields;
- begin
- TestSelect('SELECT B FROM A ORDER BY C DESC, D DESCENDING');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Two order by fields',2,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'C',0,obDescending);
- AssertOrderBy(Select.OrderBy[1],'D',0,obDescending);
- end;
- procedure TTestSelectParser.TestOrderByThreeDescFields;
- begin
- TestSelect('SELECT B FROM A ORDER BY C DESC,D DESCENDING, E DESC');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Three order by fields',3,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'C',0,obDescending);
- AssertOrderBy(Select.OrderBy[1],'D',0,obDescending);
- AssertOrderBy(Select.OrderBy[2],'E',0,obDescending);
- end;
- procedure TTestSelectParser.TestOrderByOneTableField;
- begin
- TestSelect('SELECT B FROM A ORDER BY C.D');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('One order by field',1,Select.Orderby.Count);
- // Field does not support linking/refering to a table, so the field name is
- // assigned as C.D (instead of D with a <link to table C>)
- AssertOrderBy(Select.OrderBy[0],'C.D',0,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByOneColumn;
- begin
- TestSelect('SELECT B FROM A ORDER BY 1');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('One order by field',1,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByTwoColumns;
- begin
- TestSelect('SELECT B,C FROM A ORDER BY 1,2');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Two order by fields',2,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
- AssertOrderBy(Select.OrderBy[1],'',2,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByTwoColumnsDesc;
- begin
- TestSelect('SELECT B,C FROM A ORDER BY 1 DESC,2');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Two order by fields',2,Select.Orderby.Count);
- AssertOrderBy(Select.OrderBy[0],'',1,obDescending);
- AssertOrderBy(Select.OrderBy[1],'',2,obAscending);
- end;
- procedure TTestSelectParser.TestOrderByCollate;
- Var
- O : TSQLOrderByElement;
- begin
- TestSelect('SELECT B,C FROM A ORDER BY D COLLATE E');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('One order by fields',1,Select.Orderby.Count);
- O:=AssertOrderBy(Select.OrderBy[0],'D',0,obAscending);
- AssertIdentifierName('Correct collation','E',O.Collation);
- end;
- procedure TTestSelectParser.TestOrderByCollateDesc;
- Var
- O : TSQLOrderByElement;
- begin
- TestSelect('SELECT B,C FROM A ORDER BY D COLLATE E');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('One order by fields',1,Select.Orderby.Count);
- O:=AssertOrderBy(Select.OrderBy[0],'D',0,obAscending);
- AssertIdentifierName('Correct collation','E',O.Collation);
- end;
- procedure TTestSelectParser.TestOrderByCollateDescTwoFields;
- Var
- O : TSQLOrderByElement;
- begin
- TestSelect('SELECT B,C FROM A ORDER BY D COLLATE E DESC,F COLLATE E');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertTable(Select.Tables[0],'A');
- AssertEquals('Two order by fields',2,Select.Orderby.Count);
- O:=AssertOrderBy(Select.OrderBy[0],'D',0,obDescending);
- AssertIdentifierName('Correct collation','E',O.Collation);
- O:=AssertOrderBy(Select.OrderBy[1],'F',0,obAscending);
- AssertIdentifierName('Correct collation','E',O.Collation);
- end;
- procedure TTestSelectParser.TestGroupByOne;
- begin
- TestSelect('SELECT B,COUNT(C) AS THECOUNT FROM A GROUP BY B');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One group by field',1,Select.GroupBy.Count);
- AssertIdentifierName('Correct group by field','B',Select.GroupBy[0]);
- AssertField(Select.Fields[0],'B');
- AssertAggregate(Select.Fields[1],afCount,'C',aoNone,'THECOUNT');
- end;
- procedure TTestSelectParser.TestGroupByTwo;
- begin
- TestSelect('SELECT B,C,SUM(D) AS THESUM FROM A GROUP BY B,C');
- AssertEquals('Three fields',3,Select.Fields.Count);
- AssertEquals('One group two fields',2,Select.GroupBy.Count);
- AssertIdentifierName('Correct first group by field','B',Select.GroupBy[0]);
- AssertIdentifierName('Correct second group by field','C',Select.GroupBy[1]);
- AssertField(Select.Fields[0],'B');
- AssertField(Select.Fields[1],'C');
- AssertAggregate(Select.Fields[2],afSum,'D',aoNone,'THESUM');
- end;
- procedure TTestSelectParser.TestHavingOne;
- Var
- H : TSQLBinaryExpression;
- L : TSQLLiteralExpression;
- S : TSQLIntegerLiteral;
- begin
- TestSelect('SELECT B,COUNT(C) AS THECOUNT FROM A GROUP BY B HAVING COUNT(C)>1');
- AssertEquals('Two fields',2,Select.Fields.Count);
- AssertEquals('One group by field',1,Select.GroupBy.Count);
- AssertIdentifierName('Correct group by field','B',Select.GroupBy[0]);
- AssertField(Select.Fields[0],'B');
- AssertAggregate(Select.Fields[1],afCount,'C',aoNone,'THECOUNT');
- AssertNotNull('Have having',Select.Having);
- H:=TSQLBinaryExpression(CheckClass(Select.Having,TSQLBinaryExpression));
- AssertEquals('Larger than',boGT,H.Operation);
- L:=TSQLLiteralExpression(CheckClass(H.Right,TSQLLiteralExpression));
- S:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
- AssertEquals('One',1,S.Value);
- AssertAggregateExpression(H.Left,afCount,'C',aoNone);
- end;
- procedure TTestSelectParser.TestLeft;
- Var
- E : TSQLFunctionCallExpression;
- L : TSQLLiteralExpression;
- S : TSQLStringLiteral;
- I : TSQLIntegerLiteral;
- begin
- TestSelect('SELECT LEFT(''abc'', 1) FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- CheckClass(Select.Fields[0],TSQLSelectField);
- E:=TSQLFunctionCallExpression(CheckClass(TSQLSelectField(Select.Fields[0]).Expression,TSQLFunctionCallExpression));
- AssertEquals('LEFT function name','LEFT',E.Identifier);
- AssertEquals('Two function elements',2,E.Arguments.Count);
- L:=TSQLLiteralExpression(CheckClass(E.Arguments[0],TSQLLiteralExpression));
- S:=TSQLStringLiteral(CheckClass(L.Literal,TSQLStringLiteral));
- AssertEquals('Correct string constant','abc',S.Value);
- L:=TSQLLiteralExpression(CheckClass(E.Arguments[1],TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(L.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct integer constant',1,I.Value);
- end;
- procedure TTestSelectParser.TestNoTable;
- Var
- F : TSQLSelectField;
- L : TSQLIntegerLiteral;
- begin
- TestSelect('SELECT 1');
- AssertEquals('0 tables in select',0,Select.Tables.Count);
- AssertEquals('1 field in select',1,Select.Fields.Count);
- AssertNotNull('Have field',Select.Fields[0]);
- F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
- AssertNotNull('Have field expresssion,',F.Expression);
- L:=TSQLIntegerLiteral(AssertLiteralExpr('Field is a literal',F.Expression,TSQLIntegerLiteral));
- AssertEquals('SELECT 1',1,L.Value);
- end;
- procedure TTestSelectParser.TestUnionSimple;
- Var
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT B FROM A UNION SELECT C FROM D');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
- AssertEquals('One field',1,S.Fields.Count);
- AssertField(S.Fields[0],'C');
- AssertEquals('One table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D');
- AssertEquals('No UNION ALL : ',False,Select.UnionAll)
- end;
- procedure TTestSelectParser.TestUnionSimpleAll;
- Var
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT B FROM A UNION ALL SELECT C FROM D');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
- AssertEquals('One field',1,S.Fields.Count);
- AssertField(S.Fields[0],'C');
- AssertEquals('One table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D');
- AssertEquals('UNION ALL : ',True,Select.UnionAll)
- end;
- procedure TTestSelectParser.TestUnionSimpleOrderBy;
- Var
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT B FROM A UNION SELECT C FROM D ORDER BY 1');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
- S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
- AssertEquals('One field',1,S.Fields.Count);
- AssertField(S.Fields[0],'C');
- AssertEquals('One table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D');
- end;
- procedure TTestSelectParser.TestUnionDouble;
- Var
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT B FROM A UNION SELECT C FROM D UNION SELECT E FROM F ORDER BY 1');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- AssertOrderBy(Select.OrderBy[0],'',1,obAscending);
- S:=TSQLSelectStatement(CheckClass(Select.Union,TSQLSelectStatement));
- AssertEquals('One field',1,S.Fields.Count);
- AssertField(S.Fields[0],'C');
- AssertEquals('One table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D');
- S:=TSQLSelectStatement(CheckClass(S.Union,TSQLSelectStatement));
- AssertEquals('One field',1,S.Fields.Count);
- AssertField(S.Fields[0],'E');
- AssertEquals('One table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'F');
- end;
- procedure TTestSelectParser.TestUnionError1;
- begin
- TestSelectError('SELECT B FROM A ORDER BY B UNION SELECT C FROM D');
- end;
- procedure TTestSelectParser.TestUnionError2;
- begin
- TestSelectError('SELECT B FROM A UNION SELECT C,E FROM D');
- end;
- procedure TTestSelectParser.TestPlanOrderNatural;
- Var
- E : TSQLSelectPlanExpr;
- N : TSQLSelectNaturalPLan;
- begin
- TestSelect('SELECT A FROM B PLAN SORT (B NATURAL)');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',1,E.Items.Count);
- AssertEquals('Correct plan type',pjtSort,E.JoinType);
- N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPLan));
- AssertIdentifierName('Correct table','B',N.TableName);
- end;
- procedure TTestSelectParser.TestPlanOrderOrder;
- Var
- E : TSQLSelectPlanExpr;
- O : TSQLSelectOrderedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN SORT (B ORDER C)');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',1,E.Items.Count);
- AssertEquals('Correct plan type',pjtSort,E.JoinType);
- O:=TSQLSelectOrderedPLan(CheckClass(E.Items[0],TSQLSelectOrderedPLan));
- AssertIdentifierName('Correct table','B',O.TableName);
- AssertIdentifierName('Correct table','C',O.OrderIndex);
- end;
- procedure TTestSelectParser.TestPlanOrderIndex1;
- Var
- E : TSQLSelectPlanExpr;
- O : TSQLSelectIndexedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN SORT (B INDEX (C))');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',1,E.Items.Count);
- AssertEquals('Correct plan type',pjtSort,E.JoinType);
- O:=TSQLSelectIndexedPLan(CheckClass(E.Items[0],TSQLSelectIndexedPlan));
- AssertIdentifierName('Correct table','B',O.TableName);
- AssertEquals('Correct index count',1,O.Indexes.Count);
- AssertIdentifierName('Correct table','C',O.Indexes[0]);
- end;
- procedure TTestSelectParser.TestPlanOrderIndex2;
- Var
- E : TSQLSelectPlanExpr;
- O : TSQLSelectIndexedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN SORT (B INDEX (C,D))');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',1,E.Items.Count);
- AssertEquals('Correct plan type',pjtSort,E.JoinType);
- O:=TSQLSelectIndexedPLan(CheckClass(E.Items[0],TSQLSelectIndexedPlan));
- AssertIdentifierName('Correct table','B',O.TableName);
- AssertEquals('Correct index count',2,O.Indexes.Count);
- AssertIdentifierName('Correct table','C',O.Indexes[0]);
- AssertIdentifierName('Correct table','D',O.Indexes[1]);
- end;
- procedure TTestSelectParser.TestPlanJoinNatural;
- Var
- E : TSQLSelectPlanExpr;
- N : TSQLSelectNaturalPLan;
- O : TSQLSelectOrderedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN JOIN (B NATURAL, C ORDER D)');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',2,E.Items.Count);
- AssertEquals('Correct plan type',pjtJoin,E.JoinType);
- N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
- AssertIdentifierName('Correct table','B',N.TableName);
- O:=TSQLSelectOrderedPLan(CheckClass(E.Items[1],TSQLSelectOrderedPlan));
- AssertIdentifierName('Correct table','C',O.TableName);
- AssertIdentifierName('Correct index','D',O.OrderIndex);
- end;
- procedure TTestSelectParser.TestPlanDefaultNatural;
- Var
- E : TSQLSelectPlanExpr;
- N : TSQLSelectNaturalPLan;
- O : TSQLSelectOrderedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN (B NATURAL, C ORDER D)');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',2,E.Items.Count);
- AssertEquals('Correct plan type',pjtJoin,E.JoinType);
- N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
- AssertIdentifierName('Correct table','B',N.TableName);
- O:=TSQLSelectOrderedPLan(CheckClass(E.Items[1],TSQLSelectOrderedPlan));
- AssertIdentifierName('Correct table','C',O.TableName);
- AssertIdentifierName('Correct index','D',O.OrderIndex);
- end;
- procedure TTestSelectParser.TestPlanMergeNatural;
- Var
- E : TSQLSelectPlanExpr;
- N : TSQLSelectNaturalPLan;
- O : TSQLSelectOrderedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN MERGE (B NATURAL, C ORDER D)');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('One plan item',2,E.Items.Count);
- AssertEquals('Correct plan type',pjtMerge,E.JoinType);
- N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
- AssertIdentifierName('Correct table','B',N.TableName);
- O:=TSQLSelectOrderedPLan(CheckClass(E.Items[1],TSQLSelectOrderedPlan));
- AssertIdentifierName('Correct table','C',O.TableName);
- AssertIdentifierName('Correct index','D',O.OrderIndex);
- end;
- procedure TTestSelectParser.TestPlanMergeNested;
- Var
- E,EN : TSQLSelectPlanExpr;
- N : TSQLSelectNaturalPLan;
- I : TSQLSelectIndexedPLan;
- begin
- TestSelect('SELECT A FROM B PLAN MERGE (SORT (B NATURAL), SORT (JOIN (D NATURAL, E INDEX (F))))');
- E:=TSQLSelectPlanExpr(CheckClass(Select.Plan,TSQLSelectPlanExpr));
- AssertEquals('Two plan items',2,E.Items.Count);
- AssertEquals('Correct overall plan type',pjtMerge,E.JoinType);
- // SORT (B NATURAL)
- EN:=TSQLSelectPlanExpr(CheckClass(E.Items[0],TSQLSelectPlanExpr));
- AssertEquals('Correct plan type Item 1',pjtSort,EN.JoinType);
- AssertEquals('On plan item in item 1',1,EN.Items.Count);
- N:=TSQLSelectNaturalPLan(CheckClass(EN.Items[0],TSQLSelectNaturalPlan));
- AssertIdentifierName('Correct table','B',N.TableName);
- // SORT (JOIN (D...
- EN:=TSQLSelectPlanExpr(CheckClass(E.Items[1],TSQLSelectPlanExpr));
- AssertEquals('Correct plan type item 2',pjtSort,EN.JoinType);
- AssertEquals('One plan item in item 2',1,EN.Items.Count);
- // JOIN (D NATURAL, E
- E:=TSQLSelectPlanExpr(CheckClass(EN.Items[0],TSQLSelectPlanExpr));
- AssertEquals('Correct plan type',pjtJoin,E.JoinType);
- AssertEquals('Two plan items in item 2',2,E.Items.Count);
- N:=TSQLSelectNaturalPLan(CheckClass(E.Items[0],TSQLSelectNaturalPlan));
- AssertIdentifierName('Correct table','D',N.TableName);
- // E INDEX (F)
- I:=TSQLSelectIndexedPLan(CheckClass(E.Items[1],TSQLSelectIndexedPlan));
- AssertIdentifierName('Correct table','E',I.TableName);
- AssertEquals('Correct index count for table E',1,I.Indexes.Count);
- AssertIdentifierName('Correct index for table E','F',I.Indexes[0]);
- end;
- procedure TTestSelectParser.TestSubSelect;
- Var
- F : TSQLSelectField;
- E : TSQLSelectExpression;
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT A,(SELECT C FROM D WHERE E=A) AS THECOUNT FROM B');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('2 fields in select',2,Select.Fields.Count);
- AssertField(Select.Fields[0],'A','');
- F:=TSQLSelectField(CheckClass(Select.fields[1],TSQLSelectField));
- AssertIdentifierName('Correct alias name for subselect','THECOUNT',F.AliasName);
- E:=TSQLSelectExpression(CheckClass(F.Expression,TSQLSelectExpression));
- S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
- AssertEquals('1 field in subselect',1,S.Fields.Count);
- AssertField(S.Fields[0],'C','');
- AssertEquals('1 table in subselect',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D','');
- end;
- procedure TTestSelectParser.TestWhereExists;
- Var
- E : TSQLExistsExpression;
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT A FROM B WHERE EXISTS (SELECT C FROM D WHERE E=A)');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'A','');
- E:=TSQLExistsExpression(CheckClass(Select.Where,TSQLExistsExpression));
- S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
- AssertEquals('1 field in subselect',1,S.Fields.Count);
- AssertField(S.Fields[0],'C','');
- AssertEquals('1 table in subselect',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D','');
- end;
- procedure TTestSelectParser.TestWhereSingular;
- Var
- E : TSQLSingularExpression;
- S : TSQLSelectStatement;
- begin
- TestSelect('SELECT A FROM B WHERE SINGULAR (SELECT C FROM D WHERE E=A)');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'A','');
- E:=TSQLSingularExpression(CheckClass(Select.Where,TSQLSingularExpression));
- S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
- AssertEquals('1 field in subselect',1,S.Fields.Count);
- AssertField(S.Fields[0],'C','');
- AssertEquals('1 table in subselect',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D','');
- end;
- procedure TTestSelectParser.TestWhereAll;
- Var
- E : TSQLAllExpression;
- S : TSQLSelectStatement;
- B : TSQLBinaryExpression;
- begin
- TestSelect('SELECT A FROM B WHERE A > ALL (SELECT C FROM D WHERE E=F)');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'A','');
- B:=TSQLBinaryExpression(CheckClass(Select.Where,TSQLBinaryExpression));
- AssertEquals('Correct operation',boGT,B.Operation);
- E:=TSQLAllExpression(CheckClass(B.right,TSQLAllExpression));
- S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
- AssertEquals('1 field in subselect',1,S.Fields.Count);
- AssertField(S.Fields[0],'C','');
- AssertEquals('1 table in subselect',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D','');
- end;
- procedure TTestSelectParser.TestWhereAny;
- Var
- E : TSQLANyExpression;
- S : TSQLSelectStatement;
- B : TSQLBinaryExpression;
- begin
- TestSelect('SELECT A FROM B WHERE A > ANY (SELECT C FROM D WHERE E=F)');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'A','');
- B:=TSQLBinaryExpression(CheckClass(Select.Where,TSQLBinaryExpression));
- AssertEquals('Correct operation',boGT,B.Operation);
- E:=TSQLAnyExpression(CheckClass(B.right,TSQLANyExpression));
- S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
- AssertEquals('1 field in subselect',1,S.Fields.Count);
- AssertField(S.Fields[0],'C','');
- AssertEquals('1 table in subselect',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D','');
- end;
- procedure TTestSelectParser.TestWhereSome;
- Var
- E : TSQLSomeExpression;
- S : TSQLSelectStatement;
- B : TSQLBinaryExpression;
- begin
- TestSelect('SELECT A FROM B WHERE A > SOME (SELECT C FROM D WHERE E=F)');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'A','');
- B:=TSQLBinaryExpression(CheckClass(Select.Where,TSQLBinaryExpression));
- AssertEquals('Correct operation',boGT,B.Operation);
- E:=TSQLSomeExpression(CheckClass(B.right,TSQLSomeExpression));
- S:=TSQLSelectStatement(CheckClass(E.Select,TSQLSelectStatement));
- AssertEquals('1 field in subselect',1,S.Fields.Count);
- AssertField(S.Fields[0],'C','');
- AssertEquals('1 table in subselect',1,S.Tables.Count);
- AssertTable(S.Tables[0],'D','');
- end;
- procedure TTestSelectParser.TestParam;
- Var
- F : TSQLSelectField;
- P : TSQLParameterExpression;
- begin
- TestSelect('SELECT :A FROM B');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertNotNull('Have field',Select.Fields[0]);
- F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
- AssertNotNull('Have field expresssion,',F.Expression);
- P:=TSQLParameterExpression(CheckClass(F.Expression,TSQLParameterExpression));
- AssertIdentifierName('Correct parameter name','A',P.Identifier);
- end;
- procedure TTestSelectParser.TestParamExpr;
- Var
- F : TSQLSelectField;
- P : TSQLParameterExpression;
- B : TSQLBinaryExpression;
- begin
- TestSelect('SELECT :A + 1 FROM B');
- AssertEquals('1 table in select',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'B','');
- AssertEquals('1 fields in select',1,Select.Fields.Count);
- AssertNotNull('Have field',Select.Fields[0]);
- F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
- AssertNotNull('Have field expresssion,',F.Expression);
- B:=TSQLBinaryExpression(CheckClass(F.Expression,TSQLBinaryExpression));
- P:=TSQLParameterExpression(CheckClass(B.Left,TSQLParameterExpression));
- AssertIdentifierName('Correct parameter name','A',P.Identifier);
- end;
- { TTestRollBackParser }
- function TTestRollBackParser.TestRollback(const ASource: String
- ): TSQLRollbackStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLRollbackStatement(CheckClass(FToFree,TSQLRollbackStatement));
- FRollback:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestRollBackParser.TestRollbackError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestRollBackParser.TestRollback;
- begin
- TestRollBack('ROLLBACK');
- AssertNull('No transaction name',Rollback.TransactionName);
- AssertEquals('No work',False,Rollback.Work);
- AssertEquals('No release',False,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackWork;
- begin
- TestRollBack('ROLLBACK WORK');
- AssertNull('No transaction name',Rollback.TransactionName);
- AssertEquals('work',True,Rollback.Work);
- AssertEquals('No release',False,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackRelease;
- begin
- TestRollBack('ROLLBACK RELEASE');
- AssertNull('No transaction name',Rollback.TransactionName);
- AssertEquals('no work',False,Rollback.Work);
- AssertEquals('release',True,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackWorkRelease;
- begin
- TestRollBack('ROLLBACK WORK RELEASE');
- AssertNull('No transaction name',Rollback.TransactionName);
- AssertEquals('work',True,Rollback.Work);
- AssertEquals('release',True,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackTransaction;
- begin
- TestRollBack('ROLLBACK TRANSACTION T');
- AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
- AssertEquals('No work',False,Rollback.Work);
- AssertEquals('No release',False,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackTransactionWork;
- begin
- TestRollBack('ROLLBACK TRANSACTION T WORK');
- AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
- AssertEquals('work',True,Rollback.Work);
- AssertEquals('No release',False,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackTransactionRelease;
- begin
- TestRollBack('ROLLBACK TRANSACTION T RELEASE');
- AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
- AssertEquals('no work',False,Rollback.Work);
- AssertEquals('release',True,Rollback.Release);
- end;
- procedure TTestRollBackParser.TestRollbackTransactionWorkRelease;
- begin
- TestRollBack('ROLLBACK TRANSACTION T WORK RELEASE');
- AssertIdentifierName('Transaction name','T',Rollback.TransactionName);
- AssertEquals('work',True,Rollback.Work);
- AssertEquals('release',True,Rollback.Release);
- end;
- { TTestCommitParser }
- function TTestCommitParser.TestCommit(const ASource: String
- ): TSQLCommitStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLCommitStatement(CheckClass(FToFree,TSQLCommitStatement));
- FCommit:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestCommitParser.TestCommitError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestCommitParser.TestCommit;
- begin
- TestCommit('Commit');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('No work',False,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitWork;
- begin
- TestCommit('Commit WORK');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitRelease;
- begin
- TestCommit('Commit RELEASE');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('no work',False,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitWorkRelease;
- begin
- TestCommit('Commit WORK RELEASE');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransaction;
- begin
- TestCommit('Commit TRANSACTION T');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('No work',False,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionWork;
- begin
- TestCommit('Commit WORK TRANSACTION T ');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionRelease;
- begin
- TestCommit('Commit TRANSACTION T RELEASE');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('no work',False,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionWorkRelease;
- begin
- TestCommit('Commit WORK TRANSACTION T RELEASE');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('No Retain',False,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitRetain;
- begin
- TestCommit('Commit RETAIN');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('No work',False,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitRetainSnapShot;
- begin
- TestCommit('Commit RETAIN SNAPSHOT');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('No work',False,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitWorkRetain;
- begin
- TestCommit('Commit WORK RETAIN');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitReleaseRetain;
- begin
- TestCommit('Commit RELEASE RETAIN');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('no work',False,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitWorkReleaseRetain;
- begin
- TestCommit('Commit WORK RELEASE RETAIN');
- AssertNull('No transaction name',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionRetain;
- begin
- TestCommit('Commit TRANSACTION T RETAIN');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('No work',False,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionWorkRetain;
- begin
- TestCommit('Commit WORK TRANSACTION T RETAIN');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('No release',False,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionReleaseRetain;
- begin
- TestCommit('Commit TRANSACTION T RELEASE RETAIN');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('no work',False,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- procedure TTestCommitParser.TestCommitTransactionWorkReleaseRetain;
- begin
- TestCommit('Commit WORK TRANSACTION T RELEASE RETAIN');
- AssertIdentifierName('Transaction name','T',Commit.TransactionName);
- AssertEquals('work',True,Commit.Work);
- AssertEquals('release',True,Commit.Release);
- AssertEquals('Retain',True,Commit.Retain);
- end;
- { TTestExecuteProcedureParser }
- function TTestExecuteProcedureParser.TestExecute(const ASource: String
- ): TSQLExecuteProcedureStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLExecuteProcedureStatement(CheckClass(FToFree,TSQLExecuteProcedureStatement));
- FExecute:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteSimple;
- begin
- TestExecute('EXECUTE PROCEDURE A');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('No arguments',0,Execute.Params.Count);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteSimpleTransaction;
- begin
- TestExecute('EXECUTE PROCEDURE TRANSACTION B A');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertIdentifierName('Correct transaction name','B',Execute.TransactionName);
- AssertEquals('No arguments',0,Execute.Params.Count);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteSimpleReturningValues;
- begin
- TestExecute('EXECUTE PROCEDURE A RETURNING_VALUES :B');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('No arguments',0,Execute.Params.Count);
- AssertEquals('1 return value',1,Execute.Returning.Count);
- AssertIdentifierName('return value','B',Execute.Returning[0]);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteSimpleReturning2Values;
- begin
- TestExecute('EXECUTE PROCEDURE A RETURNING_VALUES :B,:C');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('No arguments',0,Execute.Params.Count);
- AssertEquals('2 return values',2,Execute.Returning.Count);
- AssertIdentifierName('return value','B',Execute.Returning[0]);
- AssertIdentifierName('return value','C',Execute.Returning[1]);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArg;
- Var
- I : TSQLIdentifierExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A (B)');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('One argument',1,Execute.Params.Count);
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','B',I.Identifier);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgNB;
- Var
- I : TSQLIdentifierExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A B');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('One argument',1,Execute.Params.Count);
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','B',I.Identifier);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteTwoArgs;
- Var
- I : TSQLIdentifierExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A (B,C)');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('Two arguments',2,Execute.Params.Count);
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','B',I.Identifier);
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','C',I.Identifier);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteTwoArgsNB;
- Var
- I : TSQLIdentifierExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A B, C');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('Two arguments',2,Execute.Params.Count);
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[0],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','B',I.Identifier);
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','C',I.Identifier);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgSelect;
- Var
- S : TSQLSelectExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A ((SELECT B FROM C))');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('One argument',1,Execute.Params.Count);
- S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
- AssertField(S.Select.Fields[0],'B','');
- AssertTable(S.Select.Tables[0],'C','');
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectNB;
- Var
- S : TSQLSelectExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A (SELECT B FROM C)');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('One argument',1,Execute.Params.Count);
- S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
- AssertField(S.Select.Fields[0],'B','');
- AssertTable(S.Select.Tables[0],'C','');
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteTwoArgsSelect;
- Var
- S : TSQLSelectExpression;
- I : TSQLIdentifierExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A ((SELECT B FROM C),D)');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('Two arguments',2,Execute.Params.Count);
- S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
- AssertField(S.Select.Fields[0],'B','');
- AssertTable(S.Select.Tables[0],'C','');
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','D',I.Identifier);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteTwoArgsSelectNB;
- Var
- S : TSQLSelectExpression;
- I : TSQLIdentifierExpression;
- begin
- TestExecute('EXECUTE PROCEDURE A (SELECT B FROM C),D');
- AssertIdentifierName('Correct procedure name','A',Execute.ProcedureName);
- AssertNull('No transaction name',Execute.TransactionName);
- AssertEquals('Two arguments',2,Execute.Params.Count);
- S:=TSQLSelectExpression(CheckClass(Execute.Params[0],TSQLSelectExpression));
- AssertField(S.Select.Fields[0],'B','');
- AssertTable(S.Select.Tables[0],'C','');
- I:=TSQLIdentifierExpression(CheckClass(Execute.Params[1],TSQLIdentifierExpression));
- AssertIdentifierName('Correct argument','D',I.Identifier);
- AssertEquals('No return values',0,Execute.Returning.Count);
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr;
- begin
- TestExecuteError('EXECUTE PROCEDURE A ((SELECT B FROM C), 2')
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr2;
- begin
- TestExecuteError('EXECUTE PROCEDURE A (SELECT B FROM C), 2)')
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr3;
- begin
- TestExecuteError('EXECUTE PROCEDURE A B)')
- end;
- procedure TTestExecuteProcedureParser.TestExecuteOneArgSelectErr4;
- begin
- TestExecuteError('EXECUTE PROCEDURE A B,C)')
- end;
- { EXECUTE PROCEDURE DELETE_EMPLOYEE2 1, 2;
- EXECUTE PROCEDURE DELETE_EMPLOYEE2 (1, 2);
- EXECUTE PROCEDURE DELETE_EMPLOYEE2 ((SELECT A FROM A), 2);
- EXECUTE PROCEDURE DELETE_EMPLOYEE2 (SELECT A FROM A), 2;
- }
- { TTestConnectParser }
- function TTestConnectParser.TestConnect(const ASource: String
- ): TSQLConnectStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLConnectStatement(CheckClass(FToFree,TSQLConnectStatement));
- FConnect:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestConnectParser.TestConnectError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestConnectParser.TestConnectSimple;
- begin
- TestConnect('CONNECT ''/my/database/file''');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','',Connect.UserName);
- AssertEquals('Password','',Connect.Password);
- AssertEquals('Role','',Connect.Role);
- AssertEquals('Cache',0,Connect.Cache);
- end;
- procedure TTestConnectParser.TestConnectUser;
- begin
- TestConnect('CONNECT ''/my/database/file'' USER ''me''');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','me',Connect.UserName);
- AssertEquals('Password','',Connect.Password);
- AssertEquals('Role','',Connect.Role);
- AssertEquals('Cache',0,Connect.Cache);
- end;
- procedure TTestConnectParser.TestConnectPassword;
- begin
- TestConnect('CONNECT ''/my/database/file'' PASSWORD ''secret''');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','',Connect.UserName);
- AssertEquals('Password','secret',Connect.Password);
- AssertEquals('Role','',Connect.Role);
- AssertEquals('Cache',0,Connect.Cache);
- end;
- procedure TTestConnectParser.TestConnectUserPassword;
- begin
- TestConnect('CONNECT ''/my/database/file'' USER ''me'' PASSWORD ''secret''');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','me',Connect.UserName);
- AssertEquals('Password','secret',Connect.Password);
- AssertEquals('Role','',Connect.Role);
- AssertEquals('Cache',0,Connect.Cache);
- end;
- procedure TTestConnectParser.TestConnectUserPasswordRole;
- begin
- TestConnect('CONNECT ''/my/database/file'' USER ''me'' PASSWORD ''secret'' ROLE ''admin''');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','me',Connect.UserName);
- AssertEquals('Password','secret',Connect.Password);
- AssertEquals('Role','admin',Connect.Role);
- AssertEquals('Cache',0,Connect.Cache);
- end;
- procedure TTestConnectParser.TestConnectUserPasswordRoleCache;
- begin
- TestConnect('CONNECT ''/my/database/file'' USER ''me'' PASSWORD ''secret'' ROLE ''admin'' CACHE 2048');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','me',Connect.UserName);
- AssertEquals('Password','secret',Connect.Password);
- AssertEquals('Role','admin',Connect.Role);
- AssertEquals('Cache',2048,Connect.Cache);
- end;
- procedure TTestConnectParser.TestConnectSimpleCache;
- begin
- TestConnect('CONNECT ''/my/database/file'' CACHE 2048');
- AssertEquals('Database name','/my/database/file',Connect.DatabaseName);
- AssertEquals('User name','',Connect.UserName);
- AssertEquals('Password','',Connect.Password);
- AssertEquals('Role','',Connect.Role);
- AssertEquals('Cache',2048,Connect.Cache);
- end;
- { TTestCreateDatabaseParser }
- function TTestCreateDatabaseParser.TestCreate(const ASource: String
- ): TSQLCreateDatabaseStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLCreateDatabaseStatement(CheckClass(FToFree,TSQLCreateDatabaseStatement));
- FCreateDB:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestCreateDatabaseParser.TestCreateError(const ASource: String);
- begin
- FerrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestCreateDatabaseParser.TestSimple;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file''');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',0,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestSimpleSchema;
- begin
- TestCreate('CREATE SCHEMA ''/my/database/file''');
- AssertEquals('schema',True,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',0,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestSimpleUSer;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' USER ''me''');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','me',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',0,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestSimpleUSerPassword;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' USER ''me'' PASSWORD ''SECRET''');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','me',CreateDB.UserName);
- AssertEquals('Password','SECRET',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',0,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestSimplePassword;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PASSWORD ''SECRET''');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','SECRET',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',0,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestPageSize;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE = 2048');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestPageSize2;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestPageSizeLength;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH = 2000');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestPageSizeLength2;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestPageSizeLength3;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 PAGES');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestPageSizeLength4;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 PAGE');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestCharset;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' DEFAULT CHARACTER SET UTF8');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertIDentifierName('Character set','UTF8',CreateDB.CharSet);
- AssertEquals('Page size',0,CreateDB.PageSize);
- AssertEquals('Length',0,CreateDB.Length);
- AssertEquals('Secondary files',0,CreateDB.SecondaryFiles.Count);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile1;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2''');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,0);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile2;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH 1000');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile3;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH = 1000');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile4;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH = 1000 PAGE');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile5;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH = 1000 PAGES');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',1000,0);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile6;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING 3000 ');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,3000);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile7;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING AT 3000 ');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,3000);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile9;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH 201 STARTING AT PAGE 3000 ');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',201,3000);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile10;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING AT PAGE 3000 LENGTH 201');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',201,3000);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFile8;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING AT PAGE 3000 ');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',1,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,3000);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFileS;
- begin
- TestCreate('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' FILE ''/my/database/file3'' ');
- AssertEquals('Not schema',False,CreateDB.UseSchema);
- AssertEquals('Database file','/my/database/file',CreateDB.FileName);
- AssertEquals('Username','',CreateDB.UserName);
- AssertEquals('Password','',CreateDB.Password);
- AssertNull('Character set',CreateDB.CharSet);
- AssertEquals('Page size',2048,CreateDB.PageSize);
- AssertEquals('Length',2000,CreateDB.Length);
- AssertEquals('Secondary files',2,CreateDB.SecondaryFiles.Count);
- AssertSecondaryFile(CreateDB.SecondaryFiles[0],'/my/database/file2',0,0);
- AssertSecondaryFile(CreateDB.SecondaryFiles[1],'/my/database/file3',0,0);
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFileError1;
- begin
- TestCreateError('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' LENGTH 3 LENGTH 2');
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFileError2;
- begin
- TestCreateError('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING 3 STARTING 2');
- end;
- procedure TTestCreateDatabaseParser.TestSecondaryFileError3;
- begin
- TestCreateError('CREATE DATABASE ''/my/database/file'' PAGE_SIZE 2048 LENGTH 2000 FILE ''/my/database/file2'' STARTING 3 LENGTH 2 STARTING 2');
- end;
- { TTestAlterDatabaseParser }
- function TTestAlterDatabaseParser.TestAlter(const ASource: String
- ): TSQLAlterDatabaseStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLAlterDatabaseStatement(CheckClass(FToFree,TSQLAlterDatabaseStatement));
- FAlterDB:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestAlterDatabaseParser.TestAlterError(const ASource: String);
- begin
- FerrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestAlterDatabaseParser.TestSimple;
- begin
- TestAlter('ALTER DATABASE ADD FILE ''/my/file''');
- AssertEquals('Operation count',1,AlterDB.Operations.Count);
- AssertSecondaryFile(AlterDB.Operations[0],'/my/file',0,0);
- end;
- procedure TTestAlterDatabaseParser.TestStarting;
- begin
- TestAlter('ALTER DATABASE ADD FILE ''/my/file'' STARTING AT 100');
- AssertEquals('Operation count',1,AlterDB.Operations.Count);
- AssertSecondaryFile(AlterDB.Operations[0],'/my/file',0,100);
- end;
- procedure TTestAlterDatabaseParser.TestStartingLength;
- begin
- TestAlter('ALTER DATABASE ADD FILE ''/my/file'' STARTING AT 100 LENGTH 200');
- AssertEquals('Operation count',1,AlterDB.Operations.Count);
- AssertSecondaryFile(AlterDB.Operations[0],'/my/file',200,100);
- end;
- procedure TTestAlterDatabaseParser.TestFiles;
- begin
- TestAlter('ALTER DATABASE ADD FILE ''/my/file2'' ADD FILE ''/my/file3'' ');
- AssertEquals('Operation count',2,AlterDB.Operations.Count);
- AssertSecondaryFile(AlterDB.Operations[0],'/my/file2',0,0);
- AssertSecondaryFile(AlterDB.Operations[1],'/my/file3',0,0);
- end;
- procedure TTestAlterDatabaseParser.TestFiles2;
- begin
- TestAlter('ALTER DATABASE ADD FILE ''/my/file2'' FILE ''/my/file3'' ');
- AssertEquals('Operation count',2,AlterDB.Operations.Count);
- AssertSecondaryFile(AlterDB.Operations[0],'/my/file2',0,0);
- AssertSecondaryFile(AlterDB.Operations[1],'/my/file3',0,0);
- end;
- procedure TTestAlterDatabaseParser.TestFilesError;
- begin
- TestAlterError('ALTER DATABASE FILE ''/my/file2'' FILE ''/my/file3'' ');
- end;
- procedure TTestAlterDatabaseParser.TestError;
- begin
- TestAlterError('ALTER DATABASE ');
- end;
- procedure TTestAlterDatabaseParser.TestLength;
- begin
- TestAlter('ALTER DATABASE ADD FILE ''/my/file'' LENGTH 200');
- AssertEquals('Operation count',1,AlterDB.Operations.Count);
- AssertSecondaryFile(AlterDB.Operations[0],'/my/file',200,0);
- end;
- { TTestCreateViewParser }
- function TTestCreateViewParser.TestCreate(const ASource: String
- ): TSQLCreateViewStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLCreateViewStatement(CheckClass(FToFree,TSQLCreateViewStatement));
- FView:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestCreateViewParser.TestCreateError(const ASource: String);
- begin
- FerrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestCreateViewParser.TestSimple;
- Var
- S : TSQLSelectStatement;
- begin
- TestCreate('CREATE VIEW A AS SELECT B FROM C');
- AssertIdentifierName('View name','A',View.ObjectName);
- AssertNotNull('field list created',View.Fields);
- AssertEquals('No fields in list',0,View.Fields.Count);
- S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
- AssertEquals('1 Field',1,S.Fields.Count);
- AssertField(S.Fields[0],'B','');
- AssertEquals('1 table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'C','');
- AssertEquals('No with check option',False,View.WithCheckOption);
- end;
- procedure TTestCreateViewParser.TestFieldList;
- Var
- S : TSQLSelectStatement;
- begin
- TestCreate('CREATE VIEW A (D) AS SELECT B FROM C');
- AssertIdentifierName('View name','A',View.ObjectName);
- AssertNotNull('field list created',View.Fields);
- AssertEquals('1 field in list',1,View.Fields.Count);
- AssertIdentifierName('Field name','D',View.Fields[0]);
- S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
- AssertEquals('1 Field',1,S.Fields.Count);
- AssertField(S.Fields[0],'B','');
- AssertEquals('1 table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'C','');
- AssertEquals('No with check option',False,View.WithCheckOption);
- end;
- procedure TTestCreateViewParser.TestFieldList2;
- Var
- S : TSQLSelectStatement;
- begin
- TestCreate('CREATE VIEW A (B,C) AS SELECT D,E FROM F');
- AssertIdentifierName('View name','A',View.ObjectName);
- AssertNotNull('field list created',View.Fields);
- AssertEquals('2 fields in list',2,View.Fields.Count);
- AssertIdentifierName('Field name','B',View.Fields[0]);
- AssertIdentifierName('Field name','C',View.Fields[1]);
- S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
- AssertEquals('2 Fields in select',2,S.Fields.Count);
- AssertField(S.Fields[0],'D','');
- AssertField(S.Fields[1],'E','');
- AssertEquals('1 table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'F','');
- AssertEquals('No with check option',False,View.WithCheckOption);
- end;
- procedure TTestCreateViewParser.TestSimpleWithCheckoption;
- Var
- S : TSQLSelectStatement;
- begin
- TestCreate('CREATE VIEW A AS SELECT B FROM C WITH CHECK OPTION');
- AssertIdentifierName('View name','A',View.ObjectName);
- AssertNotNull('field list created',View.Fields);
- AssertEquals('No fields in list',0,View.Fields.Count);
- S:=TSQLSelectStatement(CheckClass(View.select,TSQLSelectStatement));
- AssertEquals('1 Field',1,S.Fields.Count);
- AssertField(S.Fields[0],'B','');
- AssertEquals('1 table',1,S.Tables.Count);
- AssertTable(S.Tables[0],'C','');
- AssertEquals('With check option',True,View.WithCheckOption);
- end;
- { TTestCreateShadowParser }
- function TTestCreateShadowParser.TestCreate(const ASource: String
- ): TSQLCreateShadowStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLCreateShadowStatement(CheckClass(FToFree,TSQLCreateShadowStatement));
- FShadow:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestCreateShadowParser.TestCreateError(const ASource: String);
- begin
- FerrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestCreateShadowParser.TestSimple;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file''');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',0,Shadow.Length);
- AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
- end;
- procedure TTestCreateShadowParser.TestLength;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
- end;
- procedure TTestCreateShadowParser.TestLength2;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH = 2');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
- end;
- procedure TTestCreateShadowParser.TestLength3;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH = 2 PAGE');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
- end;
- procedure TTestCreateShadowParser.TestLength4;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH = 2 PAGES');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('No secondary files',0,Shadow.SecondaryFiles.Count);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile1;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2''');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,0);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile2;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH 1000');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile3;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH = 1000');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile4;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH = 1000 PAGE');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile5;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' LENGTH = 1000 PAGES');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',1000,0);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile6;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' STARTING 3000');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,3000);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile7;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' STARTING AT 3000');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,3000);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFile8;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' STARTING AT PAGE 3000');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('1 secondary file',1,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,3000);
- end;
- procedure TTestCreateShadowParser.TestSecondaryFileS;
- begin
- TestCreate('CREATE SHADOW 1 ''/my/file'' LENGTH 2 FILE ''/my/file2'' FILE ''/my/file3''');
- AssertEquals('Not manual',False,Shadow.Manual);
- AssertEquals('Not conditional',False,Shadow.COnditional);
- AssertEquals('Filename','/my/file',Shadow.FileName);
- AssertEquals('No length',2,Shadow.Length);
- AssertEquals('2 secondary file',2,Shadow.SecondaryFiles.Count);
- AssertSecondaryFile(Shadow.SecondaryFiles[0],'/my/file2',0,0);
- AssertSecondaryFile(Shadow.SecondaryFiles[1],'/my/file3',0,0);
- end;
- { TTestProcedureStatement }
- function TTestProcedureStatement.TestStatement(const ASource: String
- ): TSQLStatement;
- begin
- CreateParser(ASource);
- Parser.GetNextToken;
- FToFree:=Parser.ParseProcedureStatements;
- If not (FToFree is TSQLStatement) then
- Fail('Not a TSQLStatement');
- Result:=TSQLStatement(FToFree);
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestProcedureStatement.TestParseStatementError;
- begin
- CreateParser(FErrSource);
- FToFree:=Parser.ParseProcedureStatements;
- end;
- procedure TTestProcedureStatement.TestStatementError(const ASource: String);
- begin
- FerrSource:=ASource;
- AssertException(ESQLParser,@TestParseStatementError);
- end;
- procedure TTestProcedureStatement.TestException;
- Var
- E : TSQLExceptionStatement;
- begin
- E:=TSQLExceptionStatement(CheckClass(TestStatement('EXCEPTION MYE'),TSQLExceptionStatement));
- AssertIdentifierName('Exception name','MYE',E.ExceptionName);
- end;
- procedure TTestProcedureStatement.TestExceptionError;
- begin
- TestStatementError('EXCEPTION ''MYE''');
- end;
- procedure TTestProcedureStatement.TestExit;
- begin
- CheckClass(TestStatement('EXIT'),TSQLExitStatement);
- end;
- procedure TTestProcedureStatement.TestSuspend;
- begin
- CheckClass(TestStatement('Suspend'),TSQLSuspendStatement);
- end;
- procedure TTestProcedureStatement.TestEmptyBlock;
- Var
- B : TSQLStatementBlock;
- begin
- B:=TSQLStatementBlock(CheckClass(TestStatement('BEGIN END'),TSQLStatementBlock));
- AssertEquals('No statements',0,B.Statements.Count)
- end;
- procedure TTestProcedureStatement.TestExitBlock;
- Var
- B : TSQLStatementBlock;
- begin
- B:=TSQLStatementBlock(CheckClass(TestStatement('BEGIN EXIT; END'),TSQLStatementBlock));
- AssertEquals('1 statement',1,B.Statements.Count);
- CheckClass(B.Statements[0],TSQLExitStatement);
- end;
- procedure TTestProcedureStatement.TestExitBlockError;
- begin
- TestStatementError('BEGIN EXIT END')
- end;
- procedure TTestProcedureStatement.TestPostEvent;
- Var
- P : TSQLPostEventStatement;
- begin
- P:=TSQLPostEventStatement(CheckClass(TestStatement('POST_EVENT ''MYEVENT'''),TSQLPostEventStatement));
- AssertEquals('Correct event name','MYEVENT' , P.EventName);
- AssertNull('No event column',P.ColName);
- end;
- procedure TTestProcedureStatement.TestPostEventColName;
- Var
- P : TSQLPostEventStatement;
- begin
- P:=TSQLPostEventStatement(CheckClass(TestStatement('POST_EVENT MyColName'),TSQLPostEventStatement));
- AssertEquals('Correct event name','' , P.EventName);
- AssertIdentifierName('event column','MyColName',P.ColName);
- end;
- procedure TTestProcedureStatement.TestPostError;
- begin
- TestStatementError('POST_EVENT 1');
- end;
- procedure TTestProcedureStatement.TestAssignSimple;
- Var
- A : TSQLAssignStatement;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- begin
- A:=TSQLAssignStatement(CheckClass(TestStatement('A=1'),TSQLAssignStatement));
- AssertIdentifierName('Variable name','A',A.Variable);
- E:=TSQLLiteralExpression(CheckClass(A.Expression,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,I.Value);
- end;
- procedure TTestProcedureStatement.TestAssignSimpleNew;
- Var
- A : TSQLAssignStatement;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- begin
- A:=TSQLAssignStatement(CheckClass(TestStatement('NEW.A=1'),TSQLAssignStatement));
- AssertIdentifierName('Variable name','NEW.A',A.Variable);
- E:=TSQLLiteralExpression(CheckClass(A.Expression,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,I.Value);
- end;
- procedure TTestProcedureStatement.TestAssignSelect;
- Var
- A : TSQLAssignStatement;
- S : TSQLSelectExpression;
- begin
- A:=TSQLAssignStatement(CheckClass(TestStatement('A=(SELECT B FROM C)'),TSQLAssignStatement));
- AssertIdentifierName('Variable name','A',A.Variable);
- S:=TSQLSelectExpression(CheckClass(A.Expression,TSQLSelectExpression));
- AssertEquals('Field count',1,S.Select.Fields.Count);
- AssertEquals('Table count',1,S.Select.Tables.Count);
- AssertField(S.Select.Fields[0],'B','');
- AssertTable(S.Select.Tables[0],'C','');
- end;
- procedure TTestProcedureStatement.TestBlockAssignSimple;
- Var
- A : TSQLAssignStatement;
- E : TSQLLiteralExpression;
- I : TSQLIntegerLiteral;
- B : TSQLStatementBlock;
- begin
- B:=TSQLStatementBlock(CheckClass(TestStatement('BEGIN A=1; EXIT; END'),TSQLStatementBlock));
- AssertEquals('2 statements',2,B.Statements.Count);
- CheckClass(B.Statements[1],TSQLExitStatement);
- A:=TSQLAssignStatement(CheckClass(B.Statements[0],TSQLAssignStatement));
- AssertIdentifierName('Variable name','A',A.Variable);
- E:=TSQLLiteralExpression(CheckClass(A.Expression,TSQLLiteralExpression));
- I:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,I.Value);
- end;
- procedure TTestProcedureStatement.TestIf;
- Var
- I : TSQLIfStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- begin
- I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN EXIT'),TSQLIfStatement));
- C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boEq,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- CheckClass(I.TrueBranch,TSQLExitStatement);
- end;
- procedure TTestProcedureStatement.TestIfBlock;
- Var
- I : TSQLIfStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- B : TSQLStatementBlock;
- begin
- I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN BEGIN EXIT; END'),TSQLIfStatement));
- C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boEq,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- B:=TSQLStatementBlock(CheckClass(I.TrueBranch,TSQLStatementBlock));
- AssertEquals('1 statement',1,B.Statements.Count);
- CheckClass(B.Statements[0],TSQLExitStatement);
- end;
- procedure TTestProcedureStatement.TestIfElse;
- Var
- I : TSQLIfStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- begin
- I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN EXIT; ELSE SUSPEND'),TSQLIfStatement));
- C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boEq,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- CheckClass(I.TrueBranch,TSQLExitStatement);
- CheckClass(I.FalseBranch,TSQLSuspendStatement);
- end;
- procedure TTestProcedureStatement.TestIfBlockElse;
- Var
- I : TSQLIfStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- B : TSQLStatementBlock;
- begin
- I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN BEGIN EXIT; END ELSE SUSPEND'),TSQLIfStatement));
- C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boEq,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- B:=TSQLStatementBlock(CheckClass(I.TrueBranch,TSQLStatementBlock));
- AssertEquals('1 statement',1,B.Statements.Count);
- CheckClass(B.Statements[0],TSQLExitStatement);
- CheckClass(I.FalseBranch,TSQLSuspendStatement);
- end;
- procedure TTestProcedureStatement.TestIfElseError;
- begin
- TestStatementError('IF (A=B) THEN EXIT ELSE SUSPEND');
- TestStatementError('IF (A=B) THEN BEGIN EXIT; END; ELSE SUSPEND');
- end;
- procedure TTestProcedureStatement.TestIfBlockElseBlock;
- Var
- I : TSQLIfStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- B : TSQLStatementBlock;
- begin
- I:=TSQLIfStatement(CheckClass(TestStatement('IF (A=1) THEN BEGIN EXIT; END ELSE BEGIN SUSPEND; END'),TSQLIfStatement));
- C:=TSQLBinaryExpression(CheckClass(I.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boEq,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- B:=TSQLStatementBlock(CheckClass(I.TrueBranch,TSQLStatementBlock));
- AssertEquals('1 statement',1,B.Statements.Count);
- CheckClass(B.Statements[0],TSQLExitStatement);
- B:=TSQLStatementBlock(CheckClass(I.FalseBranch,TSQLStatementBlock));
- AssertEquals('1 statement',1,B.Statements.Count);
- CheckClass(B.Statements[0],TSQLSuspendStatement);
- end;
- procedure TTestProcedureStatement.TestIfErrorBracketLeft;
- begin
- TestStatementError('IF A=1) THEN EXIT');
- end;
- procedure TTestProcedureStatement.TestIfErrorBracketRight;
- begin
- TestStatementError('IF (A=1 THEN EXIT');
- end;
- procedure TTestProcedureStatement.TestIfErrorNoThen;
- begin
- TestStatementError('IF (A=1) EXIT');
- end;
- procedure TTestProcedureStatement.TestIfErrorSemicolonElse;
- begin
- TestStatementError('IF (A=1) THEN EXIT; ELSE SUSPEND');
- end;
- procedure TTestProcedureStatement.TestWhile;
- Var
- W : TSQLWhileStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- SA : TSQLAssignStatement;
- begin
- W:=TSQLWhileStatement(CheckClass(TestStatement('WHILE (A>1) DO A=A-1'),TSQLWhileStatement));
- C:=TSQLBinaryExpression(CheckClass(W.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boGT,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- SA:=TSQLAssignStatement(CheckClass(W.Statement,TSQLAssignStatement));
- AssertIdentifierName('Variable name','A',SA.Variable);
- // Check assignment expression
- C:=TSQLBinaryExpression(CheckClass(SA.Expression,TSQLBinaryExpression));
- AssertEquals('Equals',boAdd,C.Operation);
- // Left operand
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- // Right operand
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',-1,LI.Value);
- end;
- procedure TTestProcedureStatement.TestWhileBlock;
- Var
- W : TSQLWhileStatement;
- C : TSQLBinaryExpression;
- E : TSQLLiteralExpression;
- A : TSQLIdentifierExpression;
- LI : TSQLIntegerLiteral;
- SA : TSQLAssignStatement;
- B : TSQLStatementBlock;
- begin
- W:=TSQLWhileStatement(CheckClass(TestStatement('WHILE (A>1) DO BEGIN A=A-1; END'),TSQLWhileStatement));
- C:=TSQLBinaryExpression(CheckClass(W.Condition,TSQLBinaryExpression));
- AssertEquals('Equals',boGT,C.Operation);
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',1,LI.Value);
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- B:=TSQLStatementBlock(CheckClass(W.Statement,TSQLStatementBlock));
- AssertEquals('One statement',1,B.Statements.Count);
- SA:=TSQLAssignStatement(CheckClass(B.Statements[0],TSQLAssignStatement));
- AssertIdentifierName('Variable name','A',SA.Variable);
- // Check assignment expression
- C:=TSQLBinaryExpression(CheckClass(SA.Expression,TSQLBinaryExpression));
- AssertEquals('Equals',boAdd,C.Operation);
- // Left operand
- A:=TSQLIdentifierExpression(CheckClass(C.Left,TSQLIdentifierExpression));
- AssertIdentifierName('Variable name','A',A.Identifier);
- // Right operand
- E:=TSQLLiteralExpression(CheckClass(C.Right,TSQLLiteralExpression));
- LI:=TSQLIntegerLiteral(CheckClass(E.Literal,TSQLIntegerLiteral));
- AssertEquals('Correct value',-1,LI.Value);
- end;
- procedure TTestProcedureStatement.TestWhileErrorBracketLeft;
- begin
- TestStatementError('WHILE A>1) DO A=A-1');
- end;
- procedure TTestProcedureStatement.TestWhileErrorBracketRight;
- begin
- TestStatementError('WHILE (A>1 DO A=A-1');
- end;
- procedure TTestProcedureStatement.TestWhileErrorNoDo;
- begin
- TestStatementError('WHILE (A>1) A=A-1');
- end;
- procedure TTestProcedureStatement.TestWhenAny;
- Var
- W : TSQLWhenStatement;
- begin
- W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN ANY DO EXIT'),TSQLWhenStatement));
- AssertEquals('No error codes',0,W.Errors.Count);
- AssertEquals('Any error',True,W.AnyError);
- CheckClass(W.Statement,TSQLExitStatement);
- end;
- procedure TTestProcedureStatement.TestWhenSQLCode;
- Var
- W : TSQLWhenStatement;
- E : TSQLWhenSQLError;
- begin
- W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN SQLCODE 1 DO EXIT'),TSQLWhenStatement));
- AssertEquals('Not Any error',False,W.AnyError);
- AssertEquals('1 error code',1,W.Errors.Count);
- CheckClass(W.Statement,TSQLExitStatement);
- E:=TSQLWhenSQLError(CheckClass(W.Errors[0],TSQLWhenSQLError));
- AssertEquals('Correct SQL Code',1,E.ErrorCode);
- end;
- procedure TTestProcedureStatement.TestWhenGDSCode;
- Var
- W : TSQLWhenStatement;
- E : TSQLWhenGDSError;
- begin
- W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN GDSCODE 1 DO EXIT'),TSQLWhenStatement));
- AssertEquals('Not Any error',False,W.AnyError);
- AssertEquals('1 error code',1,W.Errors.Count);
- CheckClass(W.Statement,TSQLExitStatement);
- E:=TSQLWhenGDSError(CheckClass(W.Errors[0],TSQLWhenGDSError));
- AssertEquals('Correct SQL Code',1,E.GDSErrorNumber);
- end;
- procedure TTestProcedureStatement.TestWhenException;
- Var
- W : TSQLWhenStatement;
- E : TSQLWhenException;
- begin
- W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN EXCEPTION MYE DO EXIT'),TSQLWhenStatement));
- AssertEquals('Not Any error',False,W.AnyError);
- AssertEquals('1 error code',1,W.Errors.Count);
- CheckClass(W.Statement,TSQLExitStatement);
- E:=TSQLWhenException(CheckClass(W.Errors[0],TSQLWhenException));
- AssertIdentifierName('Correct SQL Code','MYE',E.ExceptionName);
- end;
- procedure TTestProcedureStatement.TestWhenExceptionGDS;
- Var
- W : TSQLWhenStatement;
- E : TSQLWhenException;
- G : TSQLWhenGDSError;
- begin
- W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN EXCEPTION MYE, GDSCODE 1 DO EXIT'),TSQLWhenStatement));
- AssertEquals('Not Any error',False,W.AnyError);
- AssertEquals('2 error code',2,W.Errors.Count);
- CheckClass(W.Statement,TSQLExitStatement);
- E:=TSQLWhenException(CheckClass(W.Errors[0],TSQLWhenException));
- AssertIdentifierName('Correct SQL Code','MYE',E.ExceptionName);
- G:=TSQLWhenGDSError(CheckClass(W.Errors[1],TSQLWhenGDSError));
- AssertEquals('Correct SQL Code',1,G.GDSErrorNumber);
- end;
- procedure TTestProcedureStatement.TestWhenAnyBlock;
- Var
- W : TSQLWhenStatement;
- B : TSQLStatementBlock;
- begin
- W:=TSQLWhenStatement(CheckClass(TestStatement('WHEN ANY DO BEGIN EXIT; END'),TSQLWhenStatement));
- AssertEquals('No error codes',0,W.Errors.Count);
- AssertEquals('Any error',True,W.AnyError);
- B:=TSQLStatementBlock(CheckClass(W.Statement,TSQLStatementBlock));
- AssertEquals('One statement',1,B.Statements.Count);
- CheckClass(B.Statements[0],TSQLExitStatement);
- end;
- procedure TTestProcedureStatement.TestWhenErrorAny;
- begin
- TestStatementError('WHEN ANY, EXCEPTION MY DO EXIT');
- end;
- procedure TTestProcedureStatement.TestWhenErrorNoDo;
- begin
- TestStatementError('WHEN ANY EXIT');
- end;
- procedure TTestProcedureStatement.TestWhenErrorExceptionInt;
- begin
- TestStatementError('WHEN EXCEPTION 1 DO EXIT');
- end;
- procedure TTestProcedureStatement.TestWhenErrorExceptionString;
- begin
- TestStatementError('WHEN EXCEPTION ''1'' DO EXIT');
- end;
- procedure TTestProcedureStatement.TestWhenErrorSqlCode;
- begin
- TestStatementError('WHEN SQLCODE A DO EXIT');
- end;
- procedure TTestProcedureStatement.TestWhenErrorGDSCode;
- begin
- TestStatementError('WHEN GDSCODE A DO EXIT');
- end;
- procedure TTestProcedureStatement.TestExecuteStatement;
- Var
- E : TSQLExecuteProcedureStatement;
- begin
- E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A'),TSQLExecuteProcedureStatement));
- AssertIDentifierName('Correct procedure','A',E.ProcedureName);
- end;
- procedure TTestProcedureStatement.TestExecuteStatementReturningValues;
- Var
- E : TSQLExecuteProcedureStatement;
- begin
- E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A RETURNING_VALUES B'),TSQLExecuteProcedureStatement));
- AssertIDentifierName('Correct procedure','A',E.ProcedureName);
- AssertEquals('Returning 1 value',1,E.Returning.Count);
- AssertIDentifierName('Correct return value','B',E.Returning[0]);
- end;
- procedure TTestProcedureStatement.TestExecuteStatementReturningValuesColon;
- Var
- E : TSQLExecuteProcedureStatement;
- begin
- E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A RETURNING_VALUES :B'),TSQLExecuteProcedureStatement));
- AssertIDentifierName('Correct procedure','A',E.ProcedureName);
- AssertEquals('Returning 1 value',1,E.Returning.Count);
- AssertIDentifierName('Correct return value','B',E.Returning[0]);
- end;
- procedure TTestProcedureStatement.TestExecuteStatementReturningValuesBrackets;
- Var
- E : TSQLExecuteProcedureStatement;
- begin
- E:=TSQLExecuteProcedureStatement(CheckClass(TestStatement('EXECUTE PROCEDURE A RETURNING_VALUES (:B)'),TSQLExecuteProcedureStatement));
- AssertIDentifierName('Correct procedure','A',E.ProcedureName);
- AssertEquals('Returning 1 value',1,E.Returning.Count);
- AssertIDentifierName('Correct return value','B',E.Returning[0]);
- end;
- procedure TTestProcedureStatement.TestForSimple;
- Var
- F : TSQLForStatement;
- P : TSQLPostEventStatement;
- begin
- F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A FROM B INTO :C DO POST_EVENT C'),TSQLForStatement));
- AssertEquals('Field count',1,F.Select.Fields.Count);
- AssertEquals('Table count',1,F.Select.Tables.Count);
- AssertField(F.Select.Fields[0],'A','');
- AssertTable(F.Select.Tables[0],'B','');
- AssertEquals('Into Fieldlist count',1,F.FieldList.Count);
- AssertIdentifierName('Correct field name','C',F.FieldList[0]);
- P:=TSQLPostEventStatement(CheckClass(F.Statement,TSQLPostEventStatement));
- AssertIdentifierName('Event name','C',P.ColName);
- end;
- procedure TTestProcedureStatement.TestForSimpleNoColon;
- Var
- F : TSQLForStatement;
- P : TSQLPostEventStatement;
- begin
- F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A FROM B INTO C DO POST_EVENT C'),TSQLForStatement));
- AssertEquals('Field count',1,F.Select.Fields.Count);
- AssertEquals('Table count',1,F.Select.Tables.Count);
- AssertField(F.Select.Fields[0],'A','');
- AssertTable(F.Select.Tables[0],'B','');
- AssertEquals('Into Fieldlist count',1,F.FieldList.Count);
- AssertIdentifierName('Correct field name','C',F.FieldList[0]);
- P:=TSQLPostEventStatement(CheckClass(F.Statement,TSQLPostEventStatement));
- AssertIdentifierName('Event name','C',P.ColName);
- end;
- procedure TTestProcedureStatement.TestForSimple2fields;
- Var
- F : TSQLForStatement;
- P : TSQLPostEventStatement;
- begin
- F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A,B FROM C INTO :D,:E DO POST_EVENT D'),TSQLForStatement));
- AssertEquals('Field count',2,F.Select.Fields.Count);
- AssertEquals('Table count',1,F.Select.Tables.Count);
- AssertField(F.Select.Fields[0],'A','');
- AssertField(F.Select.Fields[1],'B','');
- AssertTable(F.Select.Tables[0],'C','');
- AssertEquals('Into Fieldlist count',2,F.FieldList.Count);
- AssertIdentifierName('Correct field name','D',F.FieldList[0]);
- AssertIdentifierName('Correct field name','E',F.FieldList[1]);
- P:=TSQLPostEventStatement(CheckClass(F.Statement,TSQLPostEventStatement));
- AssertIdentifierName('Event name','D',P.ColName);
- end;
- procedure TTestProcedureStatement.TestForBlock;
- Var
- F : TSQLForStatement;
- P : TSQLPostEventStatement;
- B : TSQLStatementBlock;
- begin
- F:=TSQLForStatement(CheckClass(TestStatement('FOR SELECT A FROM B INTO :C DO BEGIN POST_EVENT C; END'),TSQLForStatement));
- AssertEquals('Field count',1,F.Select.Fields.Count);
- AssertEquals('Table count',1,F.Select.Tables.Count);
- AssertField(F.Select.Fields[0],'A','');
- AssertTable(F.Select.Tables[0],'B','');
- AssertEquals('Into Fieldlist count',1,F.FieldList.Count);
- AssertIdentifierName('Correct field name','C',F.FieldList[0]);
- B:=TSQLStatementBlock(CheckClass(F.Statement,TSQLStatementBlock));
- AssertEquals('One statement',1,B.Statements.Count);
- P:=TSQLPostEventStatement(CheckClass(B.Statements[0],TSQLPostEventStatement));
- AssertIdentifierName('Event name','C',P.ColName);
- end;
- { TTestCreateProcedureParser }
- function TTestCreateProcedureParser.TestCreate(const ASource: String
- ): TSQLCreateProcedureStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLCreateProcedureStatement(CheckClass(FToFree,TSQLCreateProcedureStatement));
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestCreateProcedureParser.TestCreateError(const ASource: String
- );
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestCreateProcedureParser.TestEmptyProcedure;
- begin
- TestCreate('CREATE PROCEDURE A AS BEGIN END');
- AssertIdentifierName('Correct procedure name','A',Statement.ObjectName);
- AssertEquals('No arguments',0,Statement.InputVariables.Count);
- AssertEquals('No return values',0,Statement.OutputVariables.Count);
- AssertEquals('No local variables',0,Statement.LocalVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestExitProcedure;
- begin
- TestCreate('CREATE PROCEDURE A AS BEGIN EXIT; END');
- AssertIdentifierName('Correct procedure name','A',Statement.ObjectName);
- AssertEquals('No arguments',0,Statement.InputVariables.Count);
- AssertEquals('No return values',0,Statement.OutputVariables.Count);
- AssertEquals('No local variables',0,Statement.LocalVariables.Count);
- AssertEquals('One statement',1,Statement.Statements.Count);
- CheckClass(Statement.Statements[0],TSQLExitStatement);
- end;
- procedure TTestCreateProcedureParser.TestProcedureOneArgument;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A (P INT) AS BEGIN END');
- AssertIdentifierName('Correct procedure name','A',Statement.ObjectName);
- AssertEquals('1 arguments',1,Statement.InputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- AssertEquals('No return values',0,Statement.OutputVariables.Count);
- AssertEquals('No local variables',0,Statement.LocalVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestProcedureTwoArguments;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A (P INT,Q CHAR(4)) AS BEGIN END');
- AssertIdentifierName('Correct procedure name','A',Statement.ObjectName);
- AssertEquals('Two arguments',2,Statement.InputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- AssertEquals('No return values',0,Statement.OutputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[1],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','Q',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
- AssertEquals('Correct length',4,P.ParamType.Len);
- //
- AssertEquals('No local variables',0,Statement.LocalVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestProcedureOneReturnValue;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A RETURNS (P INT) AS BEGIN END');
- AssertIdentifierName('Correct procedure name','A',Statement.ObjectName);
- AssertEquals('1 return value',1,Statement.OutputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- AssertEquals('No input values',0,Statement.InputVariables.Count);
- AssertEquals('No local variables',0,Statement.LocalVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestProcedureTwoReturnValues;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A RETURNS (P INT, Q CHAR(5)) AS BEGIN END');
- AssertIdentifierName('Correct procedure name','A',Statement.ObjectName);
- AssertEquals('2 return values',2,Statement.OutputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[1],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','Q',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
- AssertEquals('Correct length',5,P.ParamType.Len);
- AssertEquals('No input values',0,Statement.InputVariables.Count);
- AssertEquals('No local variables',0,Statement.LocalVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestProcedureOneLocalVariable;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A AS DECLARE VARIABLE P INT; BEGIN END');
- AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
- AssertEquals('0 return values',0,Statement.OutputVariables.Count);
- AssertEquals('1 local variable',1,Statement.LocalVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- AssertEquals('No input values',0,Statement.InputVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestProcedureTwoLocalVariable;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A AS DECLARE VARIABLE P INT; DECLARE VARIABLE Q CHAR(5); BEGIN END');
- AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
- AssertEquals('0 return values',0,Statement.OutputVariables.Count);
- AssertEquals('2 local variable',2,Statement.LocalVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[1],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','Q',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
- AssertEquals('Correct length',5,P.ParamType.Len);
- AssertEquals('No input values',0,Statement.InputVariables.Count);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- procedure TTestCreateProcedureParser.TestProcedureInputOutputLocal;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE PROCEDURE A (P INT) RETURNS (Q CHAR(5)) AS DECLARE VARIABLE R VARCHAR(5); BEGIN END');
- AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
- // Input
- AssertEquals('1 input value',1,Statement.InputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.InputVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- // Output
- AssertEquals('1 return values',1,Statement.OutputVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.OutputVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','Q',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtChar,P.ParamType.DataType);
- AssertEquals('Correct length',5,P.ParamType.Len);
- // Local
- AssertEquals('1 local variable',1,Statement.LocalVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','R',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtvarChar,P.ParamType.DataType);
- AssertEquals('Correct length',5,P.ParamType.Len);
- AssertEquals('No statements',0,Statement.Statements.Count);
- end;
- { TTestCreateTriggerParser }
- function TTestCreateTriggerParser.TestCreate(const ASource: String
- ): TSQLCreateTriggerStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLCreateTriggerStatement(CheckClass(FToFree,TSQLCreateTriggerStatement));
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- function TTestCreateTriggerParser.TestAlter(const ASource: String
- ): TSQLAlterTriggerStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLAlterTriggerStatement(CheckClass(FToFree,TSQLAlterTriggerStatement));
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestCreateTriggerParser.TestCreateError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTrigger;
- begin
- TestCreate('CREATE TRIGGER A FOR B BEFORE UPDATE AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('No position',0,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Update operation',[toUpdate],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestExitTrigger;
- begin
- TestCreate('CREATE TRIGGER A FOR B BEFORE UPDATE AS BEGIN EXIT; END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('1 Statements',1,Statement.Statements.Count);
- AssertEquals('No position',0,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Update operation',[toUpdate],Statement.Operations);
- CheckClass(Statement.Statements[0],TSQLExitStatement);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTriggerAfterUpdate;
- begin
- TestCreate('CREATE TRIGGER A FOR B AFTER UPDATE AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('No position',0,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmAfter,Statement.Moment);
- AssertEquals('Update operation',[toUpdate],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeDelete;
- begin
- TestCreate('CREATE TRIGGER A FOR B BEFORE DELETE AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('No position',0,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Delete operation',[toDelete],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsert;
- begin
- TestCreate('CREATE TRIGGER A FOR B BEFORE INSERT AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('No position',0,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Insert operation',[toInsert],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsertPosition1;
- begin
- TestCreate('CREATE TRIGGER A FOR B BEFORE INSERT POSITION 1 AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('position 1',1,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Insert operation',[toInsert],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsertPosition1inActive;
- begin
- TestCreate('CREATE TRIGGER A FOR B INACTIVE BEFORE INSERT POSITION 1 AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('position 1',1,Statement.Position);
- AssertEquals('inactive',tsInactive,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Insert operation',[toInsert],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestEmptyTriggerBeforeInsertPosition1Active;
- begin
- TestCreate('CREATE TRIGGER A FOR B ACTIVE BEFORE INSERT POSITION 1 AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('position 1',1,Statement.Position);
- AssertEquals('Active',tsActive,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Insert operation',[toInsert],Statement.Operations);
- end;
- procedure TTestCreateTriggerParser.TestTriggerOneLocalVariable;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE TRIGGER A FOR B ACTIVE BEFORE INSERT POSITION 1 AS DECLARE VARIABLE P INT; BEGIN END');
- AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('position 1',1,Statement.Position);
- AssertEquals('Active',tsActive,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Insert operation',[toInsert],Statement.Operations);
- AssertEquals('1 local variable',1,Statement.LocalVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- end;
- procedure TTestCreateTriggerParser.TestTriggerTwoLocalVariables;
- Var
- P : TSQLProcedureParamDef;
- begin
- TestCreate('CREATE TRIGGER A FOR B ACTIVE BEFORE INSERT POSITION 1 AS DECLARE VARIABLE P INT; DECLARE VARIABLE Q INT; BEGIN END');
- AssertIdentifierName('Correcte procedure naam','A',Statement.ObjectName);
- AssertIdentifierName('Correct table','B',Statement.TableName);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('position 1',1,Statement.Position);
- AssertEquals('Active',tsActive,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Insert operation',[toInsert],Statement.Operations);
- AssertEquals('2 local variables',2,Statement.LocalVariables.Count);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[0],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','P',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- P:=TSQLProcedureParamDef(CheckClass(Statement.LocalVariables[1],TSQLProcedureParamDef));
- AssertIdentifierName('Correct parameter name','Q',P.ParamName);
- AssertNotNull('Have type definition',P.ParamType);
- AssertEquals('Correct type',sdtInteger,P.ParamType.DataType);
- end;
- procedure TTestCreateTriggerParser.TestAlterTrigger;
- begin
- TestAlter('ALTER TRIGGER A BEFORE UPDATE AS BEGIN END');
- AssertIdentifierName('Correct trigger name','A',Statement.ObjectName);
- AssertNull('Correct table',Statement.TableName);
- AssertEquals('No variables',0,Statement.LocalVariables.Count);
- AssertEquals('No Statements',0,Statement.Statements.Count);
- AssertEquals('No position',0,Statement.Position);
- AssertEquals('No active/inactive',tsNone,Statement.State);
- AssertEquals('Before moment',tmBefore,Statement.Moment);
- AssertEquals('Update operation',[toUpdate],Statement.Operations);
- end;
- { TTestDeclareExternalFunctionParser }
- function TTestDeclareExternalFunctionParser.TestCreate(const ASource: String
- ): TSQLDeclareExternalFunctionStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- Result:=TSQLDeclareExternalFunctionStatement(CheckClass(FToFree,TSQLDeclareExternalFunctionStatement));
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestDeclareExternalFunctionParser.TestCreateError(
- const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestDeclareExternalFunctionParser.TestEmptyfunction;
- begin
- TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS INT ENTRY_POINT ''A'' MODULE_NAME ''B''');
- AssertIdentifierName('Correct function','A',Statement.ObjectName);
- AssertEquals('Correct entry point','A',Statement.EntryPoint);
- AssertEquals('Correct module name','B',Statement.ModuleName);
- AssertEquals('No arguments',0,Statement.Arguments.Count);
- AssertNotNull('Have return type',Statement.ReturnType);
- AssertEquals('No FreeIt',False,Statement.FreeIt);
- AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
- end;
- procedure TTestDeclareExternalFunctionParser.TestEmptyfunctionByValue;
- begin
- TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS INT BY VALUE ENTRY_POINT ''A'' MODULE_NAME ''B''');
- AssertIdentifierName('Correct function','A',Statement.ObjectName);
- AssertEquals('Correct entry point','A',Statement.EntryPoint);
- AssertEquals('Correct module name','B',Statement.ModuleName);
- AssertEquals('No arguments',0,Statement.Arguments.Count);
- AssertNotNull('Have return type',Statement.ReturnType);
- AssertEquals('No FreeIt',False,Statement.FreeIt);
- AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
- AssertEquals('By Value',True,Statement.ReturnType.ByValue);
- end;
- procedure TTestDeclareExternalFunctionParser.TestCStringfunction;
- begin
- TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS CSTRING (50) ENTRY_POINT ''A'' MODULE_NAME ''B''');
- AssertIdentifierName('Correct function','A',Statement.ObjectName);
- AssertEquals('Correct entry point','A',Statement.EntryPoint);
- AssertEquals('Correct module name','B',Statement.ModuleName);
- AssertEquals('No arguments',0,Statement.Arguments.Count);
- AssertNotNull('Have return type',Statement.ReturnType);
- AssertEquals('No FreeIt',False,Statement.FreeIt);
- AssertEquals('Correct return type',sdtCstring,Statement.ReturnType.DataType);
- AssertEquals('Correct return length',50,Statement.ReturnType.Len);
- end;
- procedure TTestDeclareExternalFunctionParser.TestCStringFreeItfunction;
- begin
- TestCreate('DECLARE EXTERNAL FUNCTION A RETURNS CSTRING (50) FREE_IT ENTRY_POINT ''A'' MODULE_NAME ''B''');
- AssertIdentifierName('Correct function','A',Statement.ObjectName);
- AssertEquals('Correct entry point','A',Statement.EntryPoint);
- AssertEquals('Correct module name','B',Statement.ModuleName);
- AssertEquals('No arguments',0,Statement.Arguments.Count);
- AssertNotNull('Have return type',Statement.ReturnType);
- AssertEquals('FreeIt',True,Statement.FreeIt);
- AssertEquals('Correct return type',sdtCstring,Statement.ReturnType.DataType);
- AssertEquals('Correct return length',50,Statement.ReturnType.Len);
- end;
- procedure TTestDeclareExternalFunctionParser.TestOneArgumentFunction;
- Var
- T : TSQLTypeDefinition;
- begin
- TestCreate('DECLARE EXTERNAL FUNCTION A INT RETURNS INT ENTRY_POINT ''A'' MODULE_NAME ''B''');
- AssertIdentifierName('Correct function','A',Statement.ObjectName);
- AssertEquals('Correct entry point','A',Statement.EntryPoint);
- AssertEquals('Correct module name','B',Statement.ModuleName);
- AssertEquals('1 argument',1,Statement.Arguments.Count);
- T:=TSQLTypeDefinition(CheckClass(Statement.Arguments[0],TSQLTypeDefinition));
- AssertEquals('Correct return type',sdtInteger,T.DataType);
- AssertNotNull('Have return type',Statement.ReturnType);
- AssertEquals('No FreeIt',False,Statement.FreeIt);
- AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
- end;
- procedure TTestDeclareExternalFunctionParser.TestTwoArgumentsFunction;
- Var
- T : TSQLTypeDefinition;
- begin
- TestCreate('DECLARE EXTERNAL FUNCTION A INT, CSTRING(10) RETURNS INT ENTRY_POINT ''A'' MODULE_NAME ''B''');
- AssertIdentifierName('Correct function','A',Statement.ObjectName);
- AssertEquals('Correct entry point','A',Statement.EntryPoint);
- AssertEquals('Correct module name','B',Statement.ModuleName);
- AssertEquals('2 arguments',2,Statement.Arguments.Count);
- T:=TSQLTypeDefinition(CheckClass(Statement.Arguments[0],TSQLTypeDefinition));
- AssertEquals('Correct argument type',sdtInteger,T.DataType);
- T:=TSQLTypeDefinition(CheckClass(Statement.Arguments[1],TSQLTypeDefinition));
- AssertEquals('Correct return type',sdtCstring,T.DataType);
- AssertEquals('Correct argument length',10,T.Len);
- AssertNotNull('Have return type',Statement.ReturnType);
- AssertEquals('No FreeIt',False,Statement.FreeIt);
- AssertEquals('Correct return type',sdtInteger,Statement.ReturnType.DataType);
- end;
- { TTestGrantParser }
- function TTestGrantParser.TestGrant(const ASource: String): TSQLGrantStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- If not (FToFree is TSQLGrantStatement) then
- Fail(Format('Wrong parse result class. Expected TSQLGrantStatement, got %s',[FTofree.ClassName]));
- Result:=TSQLGrantStatement(Ftofree);
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestGrantParser.TestGrantError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestGrantParser.TestSimple;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.Test2Operations;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT SELECT,INSERT ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('Two permissions',2,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- CheckClass(T.Privileges[1],TSQLINSERTPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestDeletePrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT DELETE ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLDeletePrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestUpdatePrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT UPDATE ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLUPDATEPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestInsertPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT INSERT ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLInsertPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestReferencePrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT REFERENCES ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLReferencePrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestAllPrivileges;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT ALL ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLAllPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestAllPrivileges2;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT ALL PRIVILEGES ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLAllPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestUpdateColPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- U : TSQLUPDATEPrivilege;
- begin
- TestGrant('GRANT UPDATE (C) ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLUPDATEPrivilege(CheckClass(T.Privileges[0],TSQLUPDATEPrivilege));
- AssertEquals('1 column',1,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestUpdate2ColsPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- U : TSQLUPDATEPrivilege;
- begin
- TestGrant('GRANT UPDATE (C,D) ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLUPDATEPrivilege(CheckClass(T.Privileges[0],TSQLUPDATEPrivilege));
- AssertEquals('2 column',2,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertIdentifierName('Column D','D',U.Columns[1]);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestReferenceColPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- U : TSQLReferencePrivilege;
- begin
- TestGrant('GRANT REFERENCES (C) ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLReferencePrivilege(CheckClass(T.Privileges[0],TSQLReferencePrivilege));
- AssertEquals('1 column',1,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestReference2ColsPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- U : TSQLReferencePrivilege;
- begin
- TestGrant('GRANT REFERENCES (C,D) ON A TO B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLReferencePrivilege(CheckClass(T.Privileges[0],TSQLReferencePrivilege));
- AssertEquals('2 column',2,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertIdentifierName('Column D','D',U.Columns[1]);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestUserPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO USER B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestUserPrivilegeWithGrant;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLUSerGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO USER B WITH GRANT OPTION');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('With grant option',True,T.GrantOption);
- end;
- procedure TTestGrantParser.TestGroupPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLGroupGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO GROUP B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLGroupGrantee(CheckClass(T.Grantees[0],TSQLGroupGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestProcedurePrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLProcedureGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO PROCEDURE B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLProcedureGrantee(CheckClass(T.Grantees[0],TSQLProcedureGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestViewPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLViewGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO VIEW B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLViewGrantee(CheckClass(T.Grantees[0],TSQLViewGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestTriggerPrivilege;
- Var
- t : TSQLTableGrantStatement;
- G : TSQLTriggerGrantee;
- begin
- TestGrant('GRANT SELECT ON A TO TRIGGER B');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- G:=TSQLTriggerGrantee(CheckClass(T.Grantees[0],TSQLTriggerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestPublicPrivilege;
- Var
- t : TSQLTableGrantStatement;
- begin
- TestGrant('GRANT SELECT ON A TO PUBLIC');
- T:=TSQLTableGrantStatement(CheckClass(Statement,TSQLTableGrantStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One grantee', 1,T.Grantees.Count);
- (CheckClass(T.Grantees[0],TSQLPublicGrantee));
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No grant option',False,T.GrantOption);
- end;
- procedure TTestGrantParser.TestExecuteToUser;
- Var
- P : TSQLProcedureGrantStatement;
- U : TSQLUserGrantee;
- begin
- TestGrant('GRANT EXECUTE ON PROCEDURE A TO B');
- P:=TSQLProcedureGrantStatement(CheckClass(Statement,TSQLProcedureGrantStatement));
- AssertIdentifierName('Procedure name','A',P.ProcedureName);
- AssertEquals('One grantee', 1,P.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(P.Grantees[0],TSQLUserGrantee));
- AssertEquals('User name','B',U.Name);
- AssertEquals('No grant option',False,P.GrantOption);
- end;
- procedure TTestGrantParser.TestExecuteToProcedure;
- Var
- P : TSQLProcedureGrantStatement;
- U : TSQLProcedureGrantee;
- begin
- TestGrant('GRANT EXECUTE ON PROCEDURE A TO PROCEDURE B');
- P:=TSQLProcedureGrantStatement(CheckClass(Statement,TSQLProcedureGrantStatement));
- AssertIdentifierName('Procedure name','A',P.ProcedureName);
- AssertEquals('One grantee', 1,P.Grantees.Count);
- U:=TSQLProcedureGrantee(CheckClass(P.Grantees[0],TSQLProcedureGrantee));
- AssertEquals('Procedure grantee name','B',U.Name);
- AssertEquals('No grant option',False,P.GrantOption);
- end;
- procedure TTestGrantParser.TestRoleToUser;
- Var
- R : TSQLRoleGrantStatement;
- U : TSQLUserGrantee;
- begin
- TestGrant('GRANT A TO B');
- R:=TSQLRoleGrantStatement(CheckClass(Statement,TSQLRoleGrantStatement));
- AssertEquals('One role', 1,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertEquals('One grantee', 1,R.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(R.Grantees[0],TSQLUserGrantee));
- AssertEquals('Procedure grantee name','B',U.Name);
- AssertEquals('No admin option',False,R.AdminOption);
- end;
- procedure TTestGrantParser.TestRoleToUserWithAdmin;
- Var
- R : TSQLRoleGrantStatement;
- U : TSQLUserGrantee;
- begin
- TestGrant('GRANT A TO B WITH ADMIN OPTION');
- R:=TSQLRoleGrantStatement(CheckClass(Statement,TSQLRoleGrantStatement));
- AssertEquals('One role', 1,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertEquals('One grantee', 1,R.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(R.Grantees[0],TSQLUserGrantee));
- AssertEquals('Procedure grantee name','B',U.Name);
- AssertEquals('Admin option',True,R.AdminOption);
- end;
- procedure TTestGrantParser.TestRoleToPublic;
- Var
- R : TSQLRoleGrantStatement;
- begin
- TestGrant('GRANT A TO PUBLIC');
- R:=TSQLRoleGrantStatement(CheckClass(Statement,TSQLRoleGrantStatement));
- AssertEquals('One role', 1,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertEquals('One grantee', 1,R.Grantees.Count);
- CheckClass(R.Grantees[0],TSQLPublicGrantee);
- AssertEquals('No admin option',False,R.AdminOption);
- end;
- procedure TTestGrantParser.Test2RolesToUser;
- Var
- R : TSQLRoleGrantStatement;
- U : TSQLUserGrantee;
- begin
- TestGrant('GRANT A,C TO B');
- R:=TSQLRoleGrantStatement(CheckClass(Statement,TSQLRoleGrantStatement));
- AssertEquals('2 roles', 2,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertIdentifierName('Role name','C',R.Roles[1]);
- AssertEquals('One grantee', 1,R.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(R.Grantees[0],TSQLUserGrantee));
- AssertEquals('Procedure grantee name','B',U.Name);
- AssertEquals('No admin option',False,R.AdminOption);
- end;
- { TTestRevokeParser }
- function TTestRevokeParser.TestRevoke(const ASource: String): TSQLRevokeStatement;
- begin
- CreateParser(ASource);
- FToFree:=Parser.Parse;
- If not (FToFree is TSQLRevokeStatement) then
- Fail(Format('Wrong parse result class. Expected TSQLRevokeStatement, got %s',[FTofree.ClassName]));
- Result:=TSQLRevokeStatement(Ftofree);
- FSTatement:=Result;
- AssertEquals('End of stream reached',tsqlEOF,Parser.CurrentToken);
- end;
- procedure TTestRevokeParser.TestRevokeError(const ASource: String);
- begin
- FErrSource:=ASource;
- AssertException(ESQLParser,@TestParseError);
- end;
- procedure TTestRevokeParser.TestSimple;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke SELECT ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.Test2Operations;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke SELECT,INSERT ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('Two permissions',2,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- CheckClass(T.Privileges[1],TSQLINSERTPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestDeletePrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke DELETE ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLDeletePrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestUpdatePrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke UPDATE ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLUPDATEPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestInsertPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke INSERT ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLInsertPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestReferencePrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke REFERENCES ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLReferencePrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestAllPrivileges;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke ALL ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLAllPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestAllPrivileges2;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke ALL PRIVILEGES ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLAllPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestUpdateColPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- U : TSQLUPDATEPrivilege;
- begin
- TestRevoke('Revoke UPDATE (C) ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLUPDATEPrivilege(CheckClass(T.Privileges[0],TSQLUPDATEPrivilege));
- AssertEquals('1 column',1,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestUpdate2ColsPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- U : TSQLUPDATEPrivilege;
- begin
- TestRevoke('Revoke UPDATE (C,D) ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLUPDATEPrivilege(CheckClass(T.Privileges[0],TSQLUPDATEPrivilege));
- AssertEquals('2 column',2,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertIdentifierName('Column D','D',U.Columns[1]);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestReferenceColPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- U : TSQLReferencePrivilege;
- begin
- TestRevoke('Revoke REFERENCES (C) ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLReferencePrivilege(CheckClass(T.Privileges[0],TSQLReferencePrivilege));
- AssertEquals('1 column',1,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestReference2ColsPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- U : TSQLReferencePrivilege;
- begin
- TestRevoke('Revoke REFERENCES (C,D) ON A FROM B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- U:=TSQLReferencePrivilege(CheckClass(T.Privileges[0],TSQLReferencePrivilege));
- AssertEquals('2 column',2,U.Columns.Count);
- AssertIdentifierName('Column C','C',U.Columns[0]);
- AssertIdentifierName('Column D','D',U.Columns[1]);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestUserPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke SELECT ON A FROM USER B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestUserPrivilegeWithRevoke;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLUSerGrantee;
- begin
- TestRevoke('Revoke GRANT OPTION FOR SELECT ON A FROM USER B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLUSerGrantee(CheckClass(T.Grantees[0],TSQLUSerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('With Revoke option',True,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestGroupPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLGroupGrantee;
- begin
- TestRevoke('Revoke SELECT ON A FROM GROUP B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLGroupGrantee(CheckClass(T.Grantees[0],TSQLGroupGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestProcedurePrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLProcedureGrantee;
- begin
- TestRevoke('Revoke SELECT ON A FROM PROCEDURE B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLProcedureGrantee(CheckClass(T.Grantees[0],TSQLProcedureGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestViewPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLViewGrantee;
- begin
- TestRevoke('Revoke SELECT ON A FROM VIEW B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLViewGrantee(CheckClass(T.Grantees[0],TSQLViewGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestTriggerPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- G : TSQLTriggerGrantee;
- begin
- TestRevoke('Revoke SELECT ON A FROM TRIGGER B');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- G:=TSQLTriggerGrantee(CheckClass(T.Grantees[0],TSQLTriggerGrantee));
- AssertEquals('Grantee B','B',G.Name);
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestPublicPrivilege;
- Var
- t : TSQLTableRevokeStatement;
- begin
- TestRevoke('Revoke SELECT ON A FROM PUBLIC');
- T:=TSQLTableRevokeStatement(CheckClass(Statement,TSQLTableRevokeStatement));
- AssertIdentifierName('Table name','A',T.TableName);
- AssertEquals('One Grantee', 1,T.Grantees.Count);
- (CheckClass(T.Grantees[0],TSQLPublicGrantee));
- AssertEquals('One permission',1,T.Privileges.Count);
- CheckClass(T.Privileges[0],TSQLSelectPrivilege);
- AssertEquals('No Revoke option',False,T.GrantOption);
- end;
- procedure TTestRevokeParser.TestExecuteToUser;
- Var
- P : TSQLProcedureRevokeStatement;
- U : TSQLUserGrantee;
- begin
- TestRevoke('Revoke EXECUTE ON PROCEDURE A FROM B');
- P:=TSQLProcedureRevokeStatement(CheckClass(Statement,TSQLProcedureRevokeStatement));
- AssertIdentifierName('Procedure name','A',P.ProcedureName);
- AssertEquals('One Grantee', 1,P.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(P.Grantees[0],TSQLUserGrantee));
- AssertEquals('User name','B',U.Name);
- AssertEquals('No Revoke option',False,P.GrantOption);
- end;
- procedure TTestRevokeParser.TestExecuteToProcedure;
- Var
- P : TSQLProcedureRevokeStatement;
- U : TSQLProcedureGrantee;
- begin
- TestRevoke('Revoke EXECUTE ON PROCEDURE A FROM PROCEDURE B');
- P:=TSQLProcedureRevokeStatement(CheckClass(Statement,TSQLProcedureRevokeStatement));
- AssertIdentifierName('Procedure name','A',P.ProcedureName);
- AssertEquals('One Grantee', 1,P.Grantees.Count);
- U:=TSQLProcedureGrantee(CheckClass(P.Grantees[0],TSQLProcedureGrantee));
- AssertEquals('Procedure Grantee name','B',U.Name);
- AssertEquals('No Revoke option',False,P.GrantOption);
- end;
- procedure TTestRevokeParser.TestRoleToUser;
- Var
- R : TSQLRoleRevokeStatement;
- U : TSQLUserGrantee;
- begin
- TestRevoke('Revoke A FROM B');
- R:=TSQLRoleRevokeStatement(CheckClass(Statement,TSQLRoleRevokeStatement));
- AssertEquals('One role', 1,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertEquals('One Grantee', 1,R.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(R.Grantees[0],TSQLUserGrantee));
- AssertEquals('Procedure Grantee name','B',U.Name);
- AssertEquals('No admin option',False,R.AdminOption);
- end;
- procedure TTestRevokeParser.TestRoleToPublic;
- Var
- R : TSQLRoleRevokeStatement;
- begin
- TestRevoke('Revoke A FROM PUBLIC');
- R:=TSQLRoleRevokeStatement(CheckClass(Statement,TSQLRoleRevokeStatement));
- AssertEquals('One role', 1,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertEquals('One Grantee', 1,R.Grantees.Count);
- CheckClass(R.Grantees[0],TSQLPublicGrantee);
- AssertEquals('No admin option',False,R.AdminOption);
- end;
- procedure TTestRevokeParser.Test2RolesToUser;
- Var
- R : TSQLRoleRevokeStatement;
- U : TSQLUserGrantee;
- begin
- TestRevoke('Revoke A,C FROM B');
- R:=TSQLRoleRevokeStatement(CheckClass(Statement,TSQLRoleRevokeStatement));
- AssertEquals('2 roles', 2,R.Roles.Count);
- AssertIdentifierName('Role name','A',R.Roles[0]);
- AssertIdentifierName('Role name','C',R.Roles[1]);
- AssertEquals('One Grantee', 1,R.Grantees.Count);
- U:=TSQLUserGrantee(CheckClass(R.Grantees[0],TSQLUserGrantee));
- AssertEquals('Procedure Grantee name','B',U.Name);
- AssertEquals('No admin option',False,R.AdminOption);
- end;
- initialization
- RegisterTests([TTestDropParser,
- TTestGeneratorParser,
- TTestRoleParser,
- TTestTypeParser,
- TTestCheckParser,
- TTestDomainParser,
- TTestExceptionParser,
- TTestIndexParser,
- TTestTableParser,
- TTestDeleteParser,
- TTestUpdateParser,
- TTestInsertParser,
- TTestSelectParser,
- TTestRollbackParser,
- TTestCommitParser,
- TTestExecuteProcedureParser,
- TTestConnectParser,
- TTestCreateDatabaseParser,
- TTestAlterDatabaseParser,
- TTestCreateViewParser,
- TTestCreateShadowParser,
- TTestProcedureStatement,
- TTestCreateProcedureParser,
- TTestCreateTriggerParser,
- TTestDeclareExternalFunctionParser,
- TTestGrantParser,
- TTestRevokeParser,
- TTestGlobalParser,
- TTestSetTermParser]);
- end.
|