tcparser.pas 295 KB

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