1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176 |
- {
- 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, testutils, 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
- FSource : TStringStream;
- FParser : TTestParser;
- FToFree : TSQLElement; //will be freed by test teardown
- FErrSource : string;
- 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);
- 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 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 TestSetGenerator;
- 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;
- 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) : 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 TestSelectOneFieldOneTableAlias;
- procedure TestSelectOneFieldOneTableAsAlias;
- procedure TestSelectTwoFieldsTwoTables;
- procedure TestSelectTwoFieldsTwoTablesJoin;
- procedure TestSelectTwoFieldsTwoInnerTablesJoin;
- procedure TestSelectTwoFieldsTwoLeftTablesJoin;
- procedure TestSelectTwoFieldsTwoFullOuterTablesJoin;
- procedure TestSelectTwoFieldsTwoFullTablesJoin;
- procedure TestSelectTwoFieldsTwoRightTablesJoin;
- procedure TestSelectTwoFieldsThreeTablesJoin;
- procedure TestSelectTwoFieldsBracketThreeTablesJoin;
- procedure TestSelectTwoFieldsThreeBracketTablesJoin;
- 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 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;
- 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);
- 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;
- { 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);
- begin
- FSource:=TStringStream.Create(ASource);
- 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);
- Var
- NE,NA : String;
- 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;
- procedure TTestSQLParser.AssertTypeDefaults(TD : TSQLTypeDefinition;Len : Integer = 0);
- begin
- AssertNull(TD.DefaultValue);
- AssertNull(TD.Check);
- AssertNull(TD.Collation);
- AssertEquals('Array dim 0',0,TD.ArrayDim);
- 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.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 3',3,TD.ArrayDim);
- 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;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('SMALLINT',[],sdtSmallint);
- end;
- procedure TTestTypeParser.TestFloat;
- Var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('FLOAT',[],sdtFloat);
- end;
- procedure TTestTypeParser.TestDoublePrecision;
- var
- TD : TSQLTypeDefinition;
- begin
- TD:=TestType('DOUBLE PRECISION',[],sdtDoublePrecision);
- end;
- procedure TTestTypeParser.TestDoublePrecisionDefault;
- var
- TD : TSQLTypeDefinition;
- begin
- TD:=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.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.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.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.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.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): TSQLSelectStatement;
- begin
- CreateParser(ASource);
- 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.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;
- begin
- TestSelect('SELECT A.B FROM A');
- AssertEquals('One field',1,Select.Fields.Count);
- // Field does not support linking/refering to a table, so the field name is
- // assigned as A.B (instead of B with a <link to table A>)
- AssertField(Select.Fields[0],'A.B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- 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.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;
- begin
- TestSelect('SELECT C.B FROM A C');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'C.B');
- AssertEquals('One table',1,Select.Tables.Count);
- AssertTable(Select.Tables[0],'A');
- end;
- procedure TTestSelectParser.TestSelectOneFieldOneTableAsAlias;
- begin
- TestSelect('SELECT C.B FROM A AS C');
- AssertEquals('One field',1,Select.Fields.Count);
- AssertField(Select.Fields[0],'C.B');
- 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.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.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.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
- F : TSQLSelectField;
- 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;
- Var
- E : TSQLExitStatement;
- begin
- E:=TSQLExitStatement(CheckClass(TestStatement('EXIT'),TSQLExitStatement));
- end;
- procedure TTestProcedureStatement.TestSuspend;
- Var
- E : TSQLSuspendStatement;
- begin
- E:=TSQLSuspendStatement(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;
- P : TSQLPublicGrantee;
- 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;
- P : TSQLPublicGrantee;
- 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]);
- end.
|