1 Star 0 Fork 0

GBase8s/go-gci

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
gci_sql_string_test.go 101.11 KB
一键复制 编辑 原始数据 按行查看 历史
617206652 提交于 2024-07-02 15:30 . go-gci add test
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410
package gbase8s
import (
"context"
"database/sql"
"strings"
"testing"
)
// TestSelectDualNullString checks nulls
func TestSelectDualNullString(t *testing.T) {
if TestDisableDatabase {
t.SkipNow()
}
t.Parallel()
// VARCHAR2(1)
queryResults := testQueryResults{
query: "select cast (null as VARCHAR2(1)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// VARCHAR2(4000)
queryResults = testQueryResults{
query: "select cast (null as VARCHAR2(4000)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// NVARCHAR2(1)
queryResults = testQueryResults{
query: "select cast (null as NVARCHAR2(1)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// NVARCHAR2(2000)
queryResults = testQueryResults{
query: "select cast (null as NVARCHAR2(2000)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// CHAR(1)
queryResults = testQueryResults{
query: "select cast (null as CHAR(1)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// CHAR(2000)
queryResults = testQueryResults{
query: "select cast (null as CHAR(2000)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// NCHAR(1)
queryResults = testQueryResults{
query: "select cast (null as NCHAR(1)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// NCHAR(1000)
queryResults = testQueryResults{
query: "select cast (null as NCHAR(1000)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// CLOB
queryResults = testQueryResults{
query: "select to_clob(null) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// NCLOB
queryResults = testQueryResults{
query: "select to_nclob(null) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// RAW(1)
queryResults = testQueryResults{
query: "select cast (null as RAW(1)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// RAW(2000)
queryResults = testQueryResults{
query: "select cast (null as RAW(2000)) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
// BLOB
queryResults = testQueryResults{
query: "select to_blob(null) from dual",
queryResults: []testQueryResult{{results: [][]interface{}{{nil}}}},
}
testRunQueryResults(t, queryResults)
}
// TestSelectDualString checks select dual for string types
func TestSelectDualString(t *testing.T) {
if TestDisableDatabase {
t.SkipNow()
}
t.Parallel()
queryResults := testQueryResults{}
// test strings no change
queryResultStrings1 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"a"}},
},
{
args: []interface{}{"\x00"},
results: [][]interface{}{{"\x00"}},
},
}
queryResultStrings2000 := []testQueryResult{
{
args: []interface{}{"abc "},
results: [][]interface{}{{"abc "}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc"}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc "}},
},
{
args: []interface{}{"123"},
results: [][]interface{}{{"123"}},
},
{
args: []interface{}{"123.456"},
results: [][]interface{}{{"123.456"}},
},
{
args: []interface{}{"abcdefghijklmnopqrstuvwxyz"},
results: [][]interface{}{{"abcdefghijklmnopqrstuvwxyz"}},
},
{
args: []interface{}{" a b c d e f g h i j k l m n o p q r s t u v w x y z "},
results: [][]interface{}{{" a b c d e f g h i j k l m n o p q r s t u v w x y z "}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"ab\ncd\nef"}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"ab\tcd\tef"}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"ab\x00cd\x00ef"}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 100)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 1000)}},
},
{
args: []interface{}{strings.Repeat("ab", 1000)},
results: [][]interface{}{{strings.Repeat("ab", 1000)}},
},
{
args: []interface{}{"こんにちは 世界 Καλημέρα κόσμε こんにちは안녕하세요góðan dagGrüßgotthyvää päivääyá'át'ééhΓεια σαςВiтаюგამარჯობაनमस्ते你好"},
results: [][]interface{}{{"こんにちは 世界 Καλημέρα κόσμε こんにちは안녕하세요góðan dagGrüßgotthyvää päivääyá'át'ééhΓεια σαςВiтаюგამარჯობაनमस्ते你好"}},
},
{
args: []interface{}{"здравейсвят кодировка"},
results: [][]interface{}{{"здравейсвят кодировка"}},
},
{
args: []interface{}{"一二三 提取的列值被截断"},
results: [][]interface{}{{"一二三 提取的列值被截断"}},
},
}
queryResultStrings4000 := []testQueryResult{
{
args: []interface{}{strings.Repeat("abcd", 1000)},
results: [][]interface{}{{strings.Repeat("abcd", 1000)}},
},
{
args: []interface{}{strings.Repeat("提取", 500)},
results: [][]interface{}{{strings.Repeat("提取", 500)}},
},
{
args: []interface{}{testString1},
results: [][]interface{}{{testString1}},
},
}
queryResultStringsRpad8000 := []testQueryResult{
{
results: [][]interface{}{{strings.Repeat("a", 4000) + strings.Repeat("b", 4000)}},
},
}
queryResultStringsFix1000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"a" + strings.Repeat(" ", 999)}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"abc " + strings.Repeat(" ", 993)}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc" + strings.Repeat(" ", 993)}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc " + strings.Repeat(" ", 989)}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"ab\ncd\nef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"ab\tcd\tef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"ab\x00cd\x00ef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{strings.Repeat("a", 10) + strings.Repeat(" ", 990)}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 100) + strings.Repeat(" ", 900)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 1000)}},
},
}
queryResultStringsFix2000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"a" + strings.Repeat(" ", 1999)}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"abc " + strings.Repeat(" ", 1993)}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc" + strings.Repeat(" ", 1993)}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc " + strings.Repeat(" ", 1989)}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"ab\ncd\nef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"ab\tcd\tef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"ab\x00cd\x00ef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{strings.Repeat("a", 10) + strings.Repeat(" ", 1990)}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 100) + strings.Repeat(" ", 1900)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 1000) + strings.Repeat(" ", 1000)}},
},
{
args: []interface{}{strings.Repeat("ab", 1000)},
results: [][]interface{}{{strings.Repeat("ab", 1000)}},
},
}
// VARCHAR2(1)
queryResults.query = "select cast (:1 as VARCHAR2(1)) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
// VARCHAR2(4000)
queryResults.query = "select cast (:1 as VARCHAR2(4000)) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings4000
testRunQueryResults(t, queryResults)
// NVARCHAR2(1)
queryResults.query = "select cast (:1 as NVARCHAR2(1)) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
// NVARCHAR2(2000)
queryResults.query = "select cast (:1 as NVARCHAR2(2000)) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings2000
testRunQueryResults(t, queryResults)
// CHAR(1)
queryResults.query = "select cast (:1 as CHAR(1)) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
// CHAR(2000)
queryResults.query = "select cast (:1 as CHAR(2000)) from dual"
queryResults.queryResults = queryResultStringsFix2000
testRunQueryResults(t, queryResults)
// NCHAR(1)
queryResults.query = "select cast (:1 as NCHAR(1)) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
// NCHAR(1000)
queryResults.query = "select cast (:1 as NCHAR(1000)) from dual"
queryResults.queryResults = queryResultStringsFix1000
testRunQueryResults(t, queryResults)
// CLOB
queryResults.query = "select to_clob(:1) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings4000
testRunQueryResults(t, queryResults)
queryResults.query = "select to_clob(rpad('a', 4000, 'a')) || to_clob(rpad('b', 4000, 'b')) from dual"
queryResults.queryResults = queryResultStringsRpad8000
testRunQueryResults(t, queryResults)
// NCLOB
queryResults.query = "select to_nclob(:1) from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings4000
testRunQueryResults(t, queryResults)
queryResults.query = "select to_nclob(rpad('a', 4000, 'a')) || to_nclob(rpad('b', 4000, 'b')) from dual"
queryResults.queryResults = queryResultStringsRpad8000
testRunQueryResults(t, queryResults)
queryResultRaw1 := []testQueryResult{
{
args: []interface{}{[]byte(nil)},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{[]byte{}},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{[]byte{10}},
results: [][]interface{}{{[]byte{10}}},
},
{
args: []interface{}{[]byte{0}},
results: [][]interface{}{{[]byte{0}}},
},
}
queryResultRaw2000 := []testQueryResult{
{
args: []interface{}{[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
results: [][]interface{}{{[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}},
},
{
args: []interface{}{[]byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}},
results: [][]interface{}{{[]byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}}},
},
{
args: []interface{}{[]byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}},
results: [][]interface{}{{[]byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}}},
},
{
args: []interface{}{testByteSlice2000},
results: [][]interface{}{{testByteSlice2000}},
},
}
// RAW(1)
queryResults.query = "select cast (:1 as RAW(1)) from dual"
queryResults.queryResults = queryResultRaw1
testRunQueryResults(t, queryResults)
// RAW(2000)
queryResults.query = "select cast (:1 as RAW(2000)) from dual"
queryResults.queryResults = queryResultRaw1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultRaw2000
testRunQueryResults(t, queryResults)
// BLOB
queryResults.query = "select to_blob(:1) from dual"
queryResults.queryResults = queryResultRaw1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultRaw2000
testRunQueryResults(t, queryResults)
// test strings add to end
queryResultStringsAddEnd1 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{"xyz"}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"axyz"}},
},
{
args: []interface{}{"\x00"},
results: [][]interface{}{{"\x00xyz"}},
},
}
queryResultStringsAddEnd2000 := []testQueryResult{
{
args: []interface{}{"abc "},
results: [][]interface{}{{"abc xyz"}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abcxyz"}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc xyz"}},
},
{
args: []interface{}{"123"},
results: [][]interface{}{{"123xyz"}},
},
{
args: []interface{}{"123.456"},
results: [][]interface{}{{"123.456xyz"}},
},
{
args: []interface{}{"abcdefghijklmnopqrstuvwxyz"},
results: [][]interface{}{{"abcdefghijklmnopqrstuvwxyzxyz"}},
},
{
args: []interface{}{" a b c d e f g h i j k l m n o p q r s t u v w x y z "},
results: [][]interface{}{{" a b c d e f g h i j k l m n o p q r s t u v w x y z xyz"}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"ab\ncd\nefxyz"}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"ab\tcd\tefxyz"}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"ab\x00cd\x00efxyz"}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 100) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 1000) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("ab", 998)},
results: [][]interface{}{{strings.Repeat("ab", 998) + "xyz"}},
},
}
queryResultStringsAddEnd4000 := []testQueryResult{
{
args: []interface{}{strings.Repeat("abcd", 999)},
results: [][]interface{}{{strings.Repeat("abcd", 999) + "xyz"}},
},
{
args: []interface{}{testString1},
results: [][]interface{}{{testString1 + "xyz"}},
},
}
queryResultStringsAddEndFix1000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{"xyz"}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"a" + strings.Repeat(" ", 999) + "xyz"}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"abc " + strings.Repeat(" ", 993) + "xyz"}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc" + strings.Repeat(" ", 993) + "xyz"}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc " + strings.Repeat(" ", 989) + "xyz"}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"ab\ncd\nef" + strings.Repeat(" ", 992) + "xyz"}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"ab\tcd\tef" + strings.Repeat(" ", 992) + "xyz"}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"ab\x00cd\x00ef" + strings.Repeat(" ", 992) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{strings.Repeat("a", 10) + strings.Repeat(" ", 990) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 100) + strings.Repeat(" ", 900) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 1000) + "xyz"}},
},
}
queryResultStringsAddEndFix2000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{"xyz"}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"a" + strings.Repeat(" ", 1999) + "xyz"}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"abc " + strings.Repeat(" ", 1993) + "xyz"}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc" + strings.Repeat(" ", 1993) + "xyz"}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc " + strings.Repeat(" ", 1989) + "xyz"}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"ab\ncd\nef" + strings.Repeat(" ", 1992) + "xyz"}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"ab\tcd\tef" + strings.Repeat(" ", 1992) + "xyz"}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"ab\x00cd\x00ef" + strings.Repeat(" ", 1992) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{strings.Repeat("a", 10) + strings.Repeat(" ", 1990) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 100) + strings.Repeat(" ", 1900) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 1000) + strings.Repeat(" ", 1000) + "xyz"}},
},
{
args: []interface{}{strings.Repeat("ab", 1000)},
results: [][]interface{}{{strings.Repeat("ab", 1000) + "xyz"}},
},
}
// VARCHAR2(1)
queryResults.query = "select cast (:1 as VARCHAR2(1)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
// VARCHAR2(4000)
queryResults.query = "select cast (:1 as VARCHAR2(4000)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd4000
testRunQueryResults(t, queryResults)
// NVARCHAR2(1)
queryResults.query = "select cast (:1 as NVARCHAR2(1)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
// NVARCHAR2(2000)
queryResults.query = "select cast (:1 as NVARCHAR2(2000)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd2000
testRunQueryResults(t, queryResults)
// CHAR(1)
queryResults.query = "select cast (:1 as CHAR(1)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
// CHAR(2000)
queryResults.query = "select cast (:1 as CHAR(2000)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEndFix2000
testRunQueryResults(t, queryResults)
// NCHAR(1)
queryResults.query = "select cast (:1 as NCHAR(1)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
// NCHAR(1000)
queryResults.query = "select cast (:1 as NCHAR(1000)) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEndFix1000
testRunQueryResults(t, queryResults)
// CLOB
queryResults.query = "select to_clob(:1) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd4000
testRunQueryResults(t, queryResults)
// NCLOB
queryResults.query = "select to_nclob(:1) || 'xyz' from dual"
queryResults.queryResults = queryResultStringsAddEnd1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddEnd4000
testRunQueryResults(t, queryResults)
// test strings add to front
queryResultStringsAddFront1 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{"xyz"}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"xyza"}},
},
{
args: []interface{}{"\x00"},
results: [][]interface{}{{"xyz\x00"}},
},
}
queryResultStringsAddFront2000 := []testQueryResult{
{
args: []interface{}{"abc "},
results: [][]interface{}{{"xyzabc "}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{"xyz abc"}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{"xyz abc "}},
},
{
args: []interface{}{"123"},
results: [][]interface{}{{"xyz123"}},
},
{
args: []interface{}{"123.456"},
results: [][]interface{}{{"xyz123.456"}},
},
{
args: []interface{}{"abcdefghijklmnopqrstuvwxyz"},
results: [][]interface{}{{"xyzabcdefghijklmnopqrstuvwxyz"}},
},
{
args: []interface{}{" a b c d e f g h i j k l m n o p q r s t u v w x y z "},
results: [][]interface{}{{"xyz a b c d e f g h i j k l m n o p q r s t u v w x y z "}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"xyzab\ncd\nef"}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"xyzab\tcd\tef"}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"xyzab\x00cd\x00ef"}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 100)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 1000)}},
},
{
args: []interface{}{strings.Repeat("ab", 998)},
results: [][]interface{}{{"xyz" + strings.Repeat("ab", 998)}},
},
}
queryResultStringsAddFront4000 := []testQueryResult{
{
args: []interface{}{strings.Repeat("abcd", 999)},
results: [][]interface{}{{"xyz" + strings.Repeat("abcd", 999)}},
},
{
args: []interface{}{testString1},
results: [][]interface{}{{"xyz" + testString1}},
},
}
queryResultStringsAddFrontFix1000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{"xyz"}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"xyza" + strings.Repeat(" ", 999)}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"xyzabc " + strings.Repeat(" ", 993)}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{"xyz abc" + strings.Repeat(" ", 993)}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{"xyz abc " + strings.Repeat(" ", 989)}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"xyzab\ncd\nef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"xyzab\tcd\tef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"xyzab\x00cd\x00ef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 10) + strings.Repeat(" ", 990)}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 100) + strings.Repeat(" ", 900)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 1000)}},
},
}
queryResultStringsAddFrontFix2000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{"xyz"}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{"xyza" + strings.Repeat(" ", 1999)}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"xyzabc " + strings.Repeat(" ", 1993)}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{"xyz abc" + strings.Repeat(" ", 1993)}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{"xyz abc " + strings.Repeat(" ", 1989)}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"xyzab\ncd\nef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"xyzab\tcd\tef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"xyzab\x00cd\x00ef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 10) + strings.Repeat(" ", 1990)}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 100) + strings.Repeat(" ", 1900)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{"xyz" + strings.Repeat("a", 1000) + strings.Repeat(" ", 1000)}},
},
{
args: []interface{}{strings.Repeat("ab", 1000)},
results: [][]interface{}{{"xyz" + strings.Repeat("ab", 1000)}},
},
}
// VARCHAR2(1)
queryResults.query = "select 'xyz' || cast (:1 as VARCHAR2(1)) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
// VARCHAR2(4000)
queryResults.query = "select 'xyz' || cast (:1 as VARCHAR2(4000)) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront4000
testRunQueryResults(t, queryResults)
// NVARCHAR2(1)
queryResults.query = "select 'xyz' || cast (:1 as NVARCHAR2(1)) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
// NVARCHAR2(2000)
queryResults.query = "select 'xyz' || cast (:1 as NVARCHAR2(2000)) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront2000
testRunQueryResults(t, queryResults)
// CHAR(1)
queryResults.query = "select 'xyz' || cast (:1 as CHAR(1)) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
// CHAR(2000)
queryResults.query = "select 'xyz' || cast (:1 as CHAR(2000)) from dual"
queryResults.queryResults = queryResultStringsAddFrontFix2000
testRunQueryResults(t, queryResults)
// NCHAR(1)
queryResults.query = "select 'xyz' || cast (:1 as NCHAR(1)) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
// NCHAR(1000)
queryResults.query = "select 'xyz' || cast (:1 as NCHAR(1000)) from dual"
queryResults.queryResults = queryResultStringsAddFrontFix1000
testRunQueryResults(t, queryResults)
// CLOB
queryResults.query = "select 'xyz' || to_clob(:1) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront4000
testRunQueryResults(t, queryResults)
// NCLOB
queryResults.query = "select 'xyz' || to_nclob(:1) from dual"
queryResults.queryResults = queryResultStringsAddFront1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsAddFront4000
testRunQueryResults(t, queryResults)
// test strings remove from front
queryResultStringsRemoveFront1 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"\x00"},
results: [][]interface{}{{nil}},
},
}
queryResultStringsRemoveFront1Clob := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
// the indicator does not return as null, probably because they are empty clobs intead of null
{
args: []interface{}{"a"},
results: [][]interface{}{{""}},
},
{
args: []interface{}{"\x00"},
results: [][]interface{}{{""}},
},
}
queryResultStringsRemoveFront2000 := []testQueryResult{
{
args: []interface{}{"abc"},
results: [][]interface{}{{"c"}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"c "}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc"}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc "}},
},
{
args: []interface{}{"123"},
results: [][]interface{}{{"3"}},
},
{
args: []interface{}{"123.456"},
results: [][]interface{}{{"3.456"}},
},
{
args: []interface{}{"abcdefghijklmnopqrstuvwxyz"},
results: [][]interface{}{{"cdefghijklmnopqrstuvwxyz"}},
},
{
args: []interface{}{" a b c d e f g h i j k l m n o p q r s t u v w x y z "},
results: [][]interface{}{{" b c d e f g h i j k l m n o p q r s t u v w x y z "}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"\ncd\nef"}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"\tcd\tef"}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"\x00cd\x00ef"}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 98)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 998)}},
},
{
args: []interface{}{strings.Repeat("ab", 1000)},
results: [][]interface{}{{strings.Repeat("ab", 999)}},
},
}
queryResultStringsRemoveFront4000 := []testQueryResult{
{
args: []interface{}{strings.Repeat("ab", 2000)},
results: [][]interface{}{{strings.Repeat("ab", 1999)}},
},
{
args: []interface{}{testString1},
results: [][]interface{}{{testString1[2:]}},
},
}
queryResultStringsRemoveFrontFix1000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{strings.Repeat(" ", 998)}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"c " + strings.Repeat(" ", 993)}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc" + strings.Repeat(" ", 993)}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc " + strings.Repeat(" ", 989)}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"\ncd\nef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"\tcd\tef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"\x00cd\x00ef" + strings.Repeat(" ", 992)}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{strings.Repeat("a", 8) + strings.Repeat(" ", 990)}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 98) + strings.Repeat(" ", 900)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 998)}},
},
}
queryResultStringsRemoveFrontFix2000 := []testQueryResult{
{
args: []interface{}{""},
results: [][]interface{}{{nil}},
},
{
args: []interface{}{"a"},
results: [][]interface{}{{strings.Repeat(" ", 1998)}},
},
{
args: []interface{}{"abc "},
results: [][]interface{}{{"c " + strings.Repeat(" ", 1993)}},
},
{
args: []interface{}{" abc"},
results: [][]interface{}{{" abc" + strings.Repeat(" ", 1993)}},
},
{
args: []interface{}{" abc "},
results: [][]interface{}{{" abc " + strings.Repeat(" ", 1989)}},
},
{
args: []interface{}{"ab\ncd\nef"},
results: [][]interface{}{{"\ncd\nef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{"ab\tcd\tef"},
results: [][]interface{}{{"\tcd\tef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{"ab\x00cd\x00ef"},
results: [][]interface{}{{"\x00cd\x00ef" + strings.Repeat(" ", 1992)}},
},
{
args: []interface{}{strings.Repeat("a", 10)},
results: [][]interface{}{{strings.Repeat("a", 8) + strings.Repeat(" ", 1990)}},
},
{
args: []interface{}{strings.Repeat("a", 100)},
results: [][]interface{}{{strings.Repeat("a", 98) + strings.Repeat(" ", 1900)}},
},
{
args: []interface{}{strings.Repeat("a", 1000)},
results: [][]interface{}{{strings.Repeat("a", 998) + strings.Repeat(" ", 1000)}},
},
{
args: []interface{}{strings.Repeat("ab", 1000)},
results: [][]interface{}{{strings.Repeat("ab", 999)}},
},
}
// VARCHAR2(4000)
queryResults.query = "select substr(cast (:1 as VARCHAR2(4000)), 3) from dual"
queryResults.queryResults = queryResultStringsRemoveFront1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront4000
testRunQueryResults(t, queryResults)
// NVARCHAR2(2000)
queryResults.query = "select substr(cast (:1 as NVARCHAR2(2000)), 3) from dual"
queryResults.queryResults = queryResultStringsRemoveFront1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront2000
testRunQueryResults(t, queryResults)
// CHAR(2000)
queryResults.query = "select substr(cast (:1 as CHAR(2000)), 3) from dual"
queryResults.queryResults = queryResultStringsRemoveFrontFix2000
testRunQueryResults(t, queryResults)
// NCHAR(1000)
queryResults.query = "select substr(cast (:1 as NCHAR(1000)), 3) from dual"
queryResults.queryResults = queryResultStringsRemoveFrontFix1000
testRunQueryResults(t, queryResults)
// CLOB
queryResults.query = "select substr(to_clob(:1), 3) from dual"
queryResults.queryResults = queryResultStringsRemoveFront1Clob
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront4000
testRunQueryResults(t, queryResults)
// NCLOB
queryResults.query = "select substr(to_nclob(:1), 3) from dual"
queryResults.queryResults = queryResultStringsRemoveFront1Clob
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStringsRemoveFront4000
testRunQueryResults(t, queryResults)
// more test strings no change
// ROWID
ctx, cancel := context.WithTimeout(context.Background(), TestContextTimeout)
stmt, err := TestDB.PrepareContext(ctx, "select ROWID from dual")
cancel()
if err != nil {
t.Fatal("prepare error:", err)
}
var result [][]interface{}
result, err = testGetRows(t, stmt, nil)
if err != nil {
t.Fatal("get rows error:", err)
}
if result == nil {
t.Fatal("result is nil")
}
if len(result) < 1 {
t.Fatal("len result less than 1")
}
if len(result[0]) < 1 {
t.Fatal("len result[0] less than 1")
}
data, ok := result[0][0].(string)
if !ok {
t.Fatal("result not string")
}
if len(data) != 18 {
t.Fatal("result len not equal to 18:", len(data))
}
queryResultRune := []testQueryResult{
{
args: []interface{}{'a'},
results: [][]interface{}{{float64(97)}},
},
{
args: []interface{}{'z'},
results: [][]interface{}{{float64(122)}},
},
}
queryResultByte := []testQueryResult{
{
args: []interface{}{byte('a')},
results: [][]interface{}{{float64(97)}},
},
{
args: []interface{}{byte('z')},
results: [][]interface{}{{float64(122)}},
},
}
// Go string
queryResults.query = "select :1 from dual"
queryResults.queryResults = queryResultStrings1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings2000
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultStrings4000
testRunQueryResults(t, queryResults)
// Go []byte
queryResults.queryResults = queryResultRaw1
testRunQueryResults(t, queryResults)
queryResults.queryResults = queryResultRaw2000
testRunQueryResults(t, queryResults)
// Go rune
queryResults.queryResults = queryResultRune
testRunQueryResults(t, queryResults)
// Go byte
queryResults.queryResults = queryResultByte
testRunQueryResults(t, queryResults)
}
// TestDestructiveString checks insert, select, update, and delete of string types
func TestDestructiveString(t *testing.T) {
if TestDisableDatabase || TestDisableDestructive {
t.SkipNow()
}
// VARCHAR2
tableName := "VARCHAR2_" + TestTimeString
err := testExec(t, "create table "+tableName+" ( A VARCHAR2(1), B VARCHAR2(2000), C VARCHAR2(4000) )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 2000), strings.Repeat("b", 4000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults := testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 2000), strings.Repeat("b", 4000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 2000), strings.Repeat("b", 4000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "truncate table "+tableName, nil)
if err != nil {
t.Error("truncate error:", err)
}
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", "こんにちは 世界 Καλημέρα κόσμε こんにちは안녕하세요góðan dagGrüßgotthyvää päivääyá'át'ééhΓεια σαςВiтаюგამარჯობაनमस्ते你好", "здравейсвят кодировка"},
{"b", "一二三 提取的列值被截断", "b"},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", "こんにちは 世界 Καλημέρα κόσμε こんにちは안녕하세요góðan dagGrüßgotthyvää päivääyá'át'ééhΓεια σαςВiтаюგამარჯობაनमस्ते你好", "здравейсвят кодировка"},
{"b", "一二三 提取的列值被截断", "b"},
},
},
},
}
testRunQueryResults(t, queryResults)
// VARCHAR2 char
tableName = "VARCHAR2_CHAR_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A VARCHAR2(1 CHAR), B VARCHAR2(100 CHAR), C VARCHAR2(1000 CHAR) )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("二三提取的列值被截断", 10), strings.Repeat("二三提取的列值被截断", 100)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("二三提取的列值被截断", 10), strings.Repeat("二三提取的列值被截断", 100)},
},
},
},
}
testRunQueryResults(t, queryResults)
// NVARCHAR2
tableName = "NVARCHAR2_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A NVARCHAR2(1), B NVARCHAR2(1000), C NVARCHAR2(2000) )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 1000), strings.Repeat("a", 2000)},
{"b", strings.Repeat("b", 1000), strings.Repeat("b", 2000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 1000), strings.Repeat("a", 2000)},
{"b", strings.Repeat("b", 1000), strings.Repeat("b", 2000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 1000), strings.Repeat("b", 2000)},
},
},
},
}
testRunQueryResults(t, queryResults)
// CHAR
tableName = "CHAR_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A CHAR(1), B CHAR(1000), C CHAR(2000) )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 1000), strings.Repeat("a", 2000)},
{"b", strings.Repeat("b", 1000), strings.Repeat("b", 2000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 1000), strings.Repeat("a", 2000)},
{"b", strings.Repeat("b", 1000), strings.Repeat("b", 2000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 1000), strings.Repeat("b", 2000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"b"})
if err != nil {
t.Error("delete error:", err)
}
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 100), strings.Repeat("a", 200)},
{"b", strings.Repeat("b", 100), strings.Repeat("b", 200)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 100) + strings.Repeat(" ", 900), strings.Repeat("a", 200) + strings.Repeat(" ", 1800)},
{"b", strings.Repeat("b", 100) + strings.Repeat(" ", 900), strings.Repeat("b", 200) + strings.Repeat(" ", 1800)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 100) + strings.Repeat(" ", 900), strings.Repeat("b", 200) + strings.Repeat(" ", 1800)},
},
},
},
}
testRunQueryResults(t, queryResults)
// NCHAR
tableName = "NCHAR_" + TestTimeString
err = testExec(t, "create table NCHAR_"+TestTimeString+
" ( A NCHAR(1), B NCHAR(500), C NCHAR(1000) )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 500), strings.Repeat("a", 1000)},
{"b", strings.Repeat("b", 500), strings.Repeat("b", 1000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 500), strings.Repeat("a", 1000)},
{"b", strings.Repeat("b", 500), strings.Repeat("b", 1000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 500), strings.Repeat("b", 1000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"b"})
if err != nil {
t.Error("delete error:", err)
}
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 100), strings.Repeat("a", 200)},
{"b", strings.Repeat("b", 100), strings.Repeat("b", 200)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 100) + strings.Repeat(" ", 400), strings.Repeat("a", 200) + strings.Repeat(" ", 800)},
{"b", strings.Repeat("b", 100) + strings.Repeat(" ", 400), strings.Repeat("b", 200) + strings.Repeat(" ", 800)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 100) + strings.Repeat(" ", 400), strings.Repeat("b", 200) + strings.Repeat(" ", 800)},
},
},
},
}
testRunQueryResults(t, queryResults)
// LONG
tableName = "LONG_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A VARCHAR2(1), B VARCHAR2(2000), C LONG )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 2000), strings.Repeat("b", 4000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 2000), strings.Repeat("b", 4000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 2000), strings.Repeat("b", 4000)},
},
},
},
}
testRunQueryResults(t, queryResults)
// RAW
tableName = "RAW_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A RAW(1), B RAW(1000), C RAW(2000) )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{[]byte{}, []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}},
{[]byte{10}, []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}, testByteSlice2000},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{[]byte{10}, []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}, testByteSlice2000},
{nil, []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{[]byte{10}})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{nil, []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}},
},
},
},
}
testRunQueryResults(t, queryResults)
// ROWID
ctx, cancel := context.WithTimeout(context.Background(), TestContextTimeout)
stmt, err := TestDB.PrepareContext(ctx, "select ROWID from "+tableName)
cancel()
if err != nil {
t.Fatal("prepare error:", err)
}
var result [][]interface{}
result, err = testGetRows(t, stmt, nil)
if err != nil {
t.Fatal("get rows error:", err)
}
if result == nil {
t.Fatal("result is nil")
}
if len(result) < 1 {
t.Fatal("len result less than 1")
}
if len(result[0]) < 1 {
t.Fatal("len result[0] less than 1")
}
data, ok := result[0][0].(string)
if !ok {
t.Fatal("result not string")
}
if len(data) != 18 {
t.Fatal("result len not equal to 18:", len(data))
}
// CLOB
tableName = "CLOB_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A VARCHAR2(100), B CLOB, C CLOB )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 6000), strings.Repeat("b", 8000)},
{"c", strings.Repeat("c", 12000), strings.Repeat("c", 16000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 6000), strings.Repeat("b", 8000)},
{"c", strings.Repeat("c", 12000), strings.Repeat("c", 16000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 6000), strings.Repeat("b", 8000)},
{"c", strings.Repeat("c", 12000), strings.Repeat("c", 16000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "truncate table "+tableName, nil)
if err != nil {
t.Error("truncate error:", err)
}
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", lobBufferSize+1), strings.Repeat("abcdefgh", 16000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", lobBufferSize+1), strings.Repeat("abcdefgh", 16000)},
},
},
},
}
testRunQueryResults(t, queryResults)
// NCLOB
tableName = "NCLOB_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A VARCHAR2(100), B NCLOB, C NCLOB )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+"( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 6000), strings.Repeat("b", 8000)},
{"c", strings.Repeat("c", 12000), strings.Repeat("c", 16000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", 2000), strings.Repeat("a", 4000)},
{"b", strings.Repeat("b", 6000), strings.Repeat("b", 8000)},
{"c", strings.Repeat("c", 12000), strings.Repeat("c", 16000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", strings.Repeat("b", 6000), strings.Repeat("b", 8000)},
{"c", strings.Repeat("c", 12000), strings.Repeat("c", 16000)},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "truncate table "+tableName, nil)
if err != nil {
t.Error("truncate error:", err)
}
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", strings.Repeat("a", lobBufferSize+1), strings.Repeat("abcdefgh", 16000)},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", strings.Repeat("a", lobBufferSize+1), strings.Repeat("abcdefgh", 16000)},
},
},
},
}
testRunQueryResults(t, queryResults)
// BLOB
tableName = "BLOB_" + TestTimeString
err = testExec(t, "create table "+tableName+" ( A VARCHAR2(100), B BLOB, C BLOB )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", []byte{}, []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
{"b", []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", nil, []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
{"b", []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "delete from "+tableName+" where A = :1", []interface{}{"a"})
if err != nil {
t.Error("delete error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"b", []byte{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}},
},
},
},
}
testRunQueryResults(t, queryResults)
err = testExec(t, "truncate table "+tableName, nil)
if err != nil {
t.Error("truncate error:", err)
}
err = testExecRows(t, "insert into "+tableName+" ( A, B, C ) values (:1, :2, :3)",
[][]interface{}{
{"a", testByteSlice32767, testByteSlice65535},
})
if err != nil {
t.Error("insert error:", err)
}
queryResults = testQueryResults{
query: "select A, B, C from " + tableName + " order by A",
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"a", testByteSlice32767, testByteSlice65535},
},
},
},
}
testRunQueryResults(t, queryResults)
}
func TestFunctionCallString(t *testing.T) {
if TestDisableDatabase {
t.SkipNow()
}
t.Parallel()
var execResults testExecResults
// test strings no change
execResultStrings2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: "", In: true}},
results: map[string]interface{}{"string1": ""},
},
{
args: map[string]sql.Out{"string1": {Dest: "a", In: true}},
results: map[string]interface{}{"string1": "a"},
},
{
args: map[string]sql.Out{"string1": {Dest: "\x00", In: true}},
results: map[string]interface{}{"string1": "\x00"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abc ", In: true}},
results: map[string]interface{}{"string1": "abc "},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc", In: true}},
results: map[string]interface{}{"string1": " abc"},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc ", In: true}},
results: map[string]interface{}{"string1": " abc "},
},
{
args: map[string]sql.Out{"string1": {Dest: "123", In: true}},
results: map[string]interface{}{"string1": "123"},
},
{
args: map[string]sql.Out{"string1": {Dest: "123.456", In: true}},
results: map[string]interface{}{"string1": "123.456"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abcdefghijklmnopqrstuvwxyz", In: true}},
results: map[string]interface{}{"string1": "abcdefghijklmnopqrstuvwxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: " a b c d e f g h i j k l m n o p q r s t u v w x y z ", In: true}},
results: map[string]interface{}{"string1": " a b c d e f g h i j k l m n o p q r s t u v w x y z "},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\ncd\nef", In: true}},
results: map[string]interface{}{"string1": "ab\ncd\nef"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\tcd\tef", In: true}},
results: map[string]interface{}{"string1": "ab\tcd\tef"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\x00cd\x00ef", In: true}},
results: map[string]interface{}{"string1": "ab\x00cd\x00ef"},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 100), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("a", 100)},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("a", 1000)},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("ab", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("ab", 1000)},
},
{
args: map[string]sql.Out{"string1": {Dest: "こんにちは 世界 Καλημέρα κόσμε こんにちは안녕하세요góðan dagGrüßgotthyvää päivääyá'át'ééhΓεια σαςВiтаюგამარჯობაनमस्ते你好", In: true}},
results: map[string]interface{}{"string1": "こんにちは 世界 Καλημέρα κόσμε こんにちは안녕하세요góðan dagGrüßgotthyvää päivääyá'át'ééhΓεια σαςВiтаюგამარჯობაनमस्ते你好"},
},
{
args: map[string]sql.Out{"string1": {Dest: "здравейсвят кодировка", In: true}},
results: map[string]interface{}{"string1": "здравейсвят кодировка"},
},
{
args: map[string]sql.Out{"string1": {Dest: "一二三 提取的列值被截断", In: true}},
results: map[string]interface{}{"string1": "一二三 提取的列值被截断"},
},
}
execResultStrings4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("abcd", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("abcd", 1000)},
},
}
execResultStrings16383 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("b", 16383), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("b", 16383)},
},
}
execResultStrings32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("c", 32767), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("c", 32767)},
},
}
execResultStrings65535 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("d", 65535), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("d", 65535)},
},
}
execResultStrings72000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("abcdefgh", 9000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("abcdefgh", 9000)},
},
}
// VARCHAR2
execResults.query = `
declare
function GET_STRING(p_string VARCHAR2) return VARCHAR2 as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStrings2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings32767
testRunExecResults(t, execResults)
// NVARCHAR2
execResults.query = `
declare
function GET_STRING(p_string NVARCHAR2) return NVARCHAR2 as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStrings2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings16383
testRunExecResults(t, execResults)
// CHAR
execResults.query = `
declare
function GET_STRING(p_string CHAR) return CHAR as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStrings2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings32767
testRunExecResults(t, execResults)
// NCHAR
execResults.query = `
declare
function GET_STRING(p_string NCHAR) return NCHAR as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStrings2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings32767
testRunExecResults(t, execResults)
// CLOB
execResults.query = `
declare
function GET_STRING(p_string CLOB) return CLOB as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStrings2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings32767
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings65535
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings72000
testRunExecResults(t, execResults)
// NCLOB
execResults.query = `
declare
function GET_STRING(p_string NCLOB) return NCLOB as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStrings2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStrings16383
testRunExecResults(t, execResults)
execResultRaw2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: []byte(nil), In: true}},
results: map[string]interface{}{"string1": []byte(nil)},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{}, In: true}},
results: map[string]interface{}{"string1": []byte(nil)},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{10}, In: true}},
results: map[string]interface{}{"string1": []byte{10}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0}, In: true}},
results: map[string]interface{}{"string1": []byte{0}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, In: true}},
results: map[string]interface{}{"string1": []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}, In: true}},
results: map[string]interface{}{"string1": []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}},
},
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice2000, In: true}},
results: map[string]interface{}{"string1": testByteSlice2000},
},
}
execResultRaw4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice4000, In: true}},
results: map[string]interface{}{"string1": testByteSlice4000},
},
}
execResultRaw32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice32767, In: true}},
results: map[string]interface{}{"string1": testByteSlice32767},
},
}
execResultRaw65535 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice65535, In: true}},
results: map[string]interface{}{"string1": testByteSlice65535},
},
}
execResultRaw70000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice70000, In: true}},
results: map[string]interface{}{"string1": testByteSlice70000},
},
}
// RAW
execResults.query = `
declare
function GET_STRING(p_string RAW) return RAW as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRaw2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRaw4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRaw32767
testRunExecResults(t, execResults)
// BLOB
execResults.query = `
declare
function GET_STRING(p_string BLOB) return BLOB as
begin
return p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRaw2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRaw4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRaw32767
testRunExecResults(t, execResults)
execResults.execResults = execResultRaw65535
testRunExecResults(t, execResults)
execResults.execResults = execResultRaw70000
testRunExecResults(t, execResults)
// test strings add to end
execResultStringsAddEnd2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: "", In: true}},
results: map[string]interface{}{"string1": "xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "a", In: true}},
results: map[string]interface{}{"string1": "axyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "\x00", In: true}},
results: map[string]interface{}{"string1": "\x00xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abc ", In: true}},
results: map[string]interface{}{"string1": "abc xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc", In: true}},
results: map[string]interface{}{"string1": " abcxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc ", In: true}},
results: map[string]interface{}{"string1": " abc xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "123", In: true}},
results: map[string]interface{}{"string1": "123xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "123.456", In: true}},
results: map[string]interface{}{"string1": "123.456xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abcdefghijklmnopqrstuvwxyz", In: true}},
results: map[string]interface{}{"string1": "abcdefghijklmnopqrstuvwxyzxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: " a b c d e f g h i j k l m n o p q r s t u v w x y z ", In: true}},
results: map[string]interface{}{"string1": " a b c d e f g h i j k l m n o p q r s t u v w x y z xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\ncd\nef", In: true}},
results: map[string]interface{}{"string1": "ab\ncd\nefxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\tcd\tef", In: true}},
results: map[string]interface{}{"string1": "ab\tcd\tefxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\x00cd\x00ef", In: true}},
results: map[string]interface{}{"string1": "ab\x00cd\x00efxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 100), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("a", 100) + "xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("a", 1000) + "xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("ab", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("ab", 1000) + "xyz"},
},
}
execResultStringsAddEnd4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("abcd", 999), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("abcd", 999) + "xyz"},
},
}
execResultStringsAddEnd16383 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("b", 16380), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("b", 16380) + "xyz"},
},
}
execResultStringsAddEnd32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("c", 32764), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("c", 32764) + "xyz"},
},
}
// VARCHAR2
execResults.query = `
declare
function GET_STRING(p_string VARCHAR2) return VARCHAR2 as
begin
return p_string || 'xyz';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd32767
testRunExecResults(t, execResults)
// NVARCHAR2
execResults.query = `
declare
function GET_STRING(p_string NVARCHAR2) return NVARCHAR2 as
begin
return p_string || 'xyz';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd16383
testRunExecResults(t, execResults)
// CHAR
execResults.query = `
declare
function GET_STRING(p_string CHAR) return CHAR as
begin
return p_string || 'xyz';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd32767
testRunExecResults(t, execResults)
// NCHAR
execResults.query = `
declare
function GET_STRING(p_string NCHAR) return NCHAR as
begin
return p_string || 'xyz';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd32767
testRunExecResults(t, execResults)
// CLOB
execResults.query = `
declare
function GET_STRING(p_string CLOB) return CLOB as
begin
return p_string || 'xyz';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd32767
testRunExecResults(t, execResults)
// NCLOB
execResults.query = `
declare
function GET_STRING(p_string NCLOB) return NCLOB as
begin
return p_string || 'xyz';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddEnd16383
testRunExecResults(t, execResults)
execResultRawAddEnd2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: []byte(nil), In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{}, In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{10}, In: true}},
results: map[string]interface{}{"string1": []byte{10, 120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0}, In: true}},
results: map[string]interface{}{"string1": []byte{0, 120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, In: true}},
results: map[string]interface{}{"string1": []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}, In: true}},
results: map[string]interface{}{"string1": []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice2000[:1997], In: true}},
results: map[string]interface{}{"string1": append(testByteSlice2000[:1997], []byte{120, 121, 122}...)},
},
}
execResultRawAddEnd4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice4000[:3997], In: true}},
results: map[string]interface{}{"string1": append(testByteSlice4000[:3997], []byte{120, 121, 122}...)},
},
}
execResultRawAddEnd32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice32767[:32764], In: true}},
results: map[string]interface{}{"string1": append(testByteSlice32767[:32764], []byte{120, 121, 122}...)},
},
}
// RAW
execResults.query = `
declare
function GET_STRING(p_string RAW) return RAW as
begin
return UTL_RAW.CONCAT(p_string, UTL_RAW.CAST_TO_RAW('xyz'));
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRawAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddEnd32767
testRunExecResults(t, execResults)
// BLOB
execResults.query = `
declare
function GET_STRING(p_string BLOB) return BLOB as
l_blob BLOB;
begin
if p_string is null then
l_blob := UTL_RAW.CAST_TO_RAW('xyz');
return l_blob;
end if;
l_blob := p_string;
DBMS_LOB.APPEND(l_blob, UTL_RAW.CAST_TO_RAW('xyz'));
return l_blob;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRawAddEnd2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddEnd4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddEnd32767
testRunExecResults(t, execResults)
// test strings add to front
execResultStringsAddFront2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: "", In: true}},
results: map[string]interface{}{"string1": "xyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: "a", In: true}},
results: map[string]interface{}{"string1": "xyza"},
},
{
args: map[string]sql.Out{"string1": {Dest: "\x00", In: true}},
results: map[string]interface{}{"string1": "xyz\x00"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abc ", In: true}},
results: map[string]interface{}{"string1": "xyzabc "},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc", In: true}},
results: map[string]interface{}{"string1": "xyz abc"},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc ", In: true}},
results: map[string]interface{}{"string1": "xyz abc "},
},
{
args: map[string]sql.Out{"string1": {Dest: "123", In: true}},
results: map[string]interface{}{"string1": "xyz123"},
},
{
args: map[string]sql.Out{"string1": {Dest: "123.456", In: true}},
results: map[string]interface{}{"string1": "xyz123.456"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abcdefghijklmnopqrstuvwxyz", In: true}},
results: map[string]interface{}{"string1": "xyzabcdefghijklmnopqrstuvwxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: " a b c d e f g h i j k l m n o p q r s t u v w x y z ", In: true}},
results: map[string]interface{}{"string1": "xyz a b c d e f g h i j k l m n o p q r s t u v w x y z "},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\ncd\nef", In: true}},
results: map[string]interface{}{"string1": "xyzab\ncd\nef"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\tcd\tef", In: true}},
results: map[string]interface{}{"string1": "xyzab\tcd\tef"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\x00cd\x00ef", In: true}},
results: map[string]interface{}{"string1": "xyzab\x00cd\x00ef"},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 100), In: true}},
results: map[string]interface{}{"string1": "xyz" + strings.Repeat("a", 100)},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 1000), In: true}},
results: map[string]interface{}{"string1": "xyz" + strings.Repeat("a", 1000)},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("ab", 998), In: true}},
results: map[string]interface{}{"string1": "xyz" + strings.Repeat("ab", 998)},
},
}
execResultStringsAddFront4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("abcd", 999), In: true}},
results: map[string]interface{}{"string1": "xyz" + strings.Repeat("abcd", 999)},
},
}
execResultStringsAddFront16383 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("b", 16380), In: true}},
results: map[string]interface{}{"string1": "xyz" + strings.Repeat("b", 16380)},
},
}
execResultStringsAddFront32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("c", 32764), In: true}},
results: map[string]interface{}{"string1": "xyz" + strings.Repeat("c", 32764)},
},
}
// VARCHAR2
execResults.query = `
declare
function GET_STRING(p_string VARCHAR2) return VARCHAR2 as
begin
return 'xyz' || p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront32767
testRunExecResults(t, execResults)
// NVARCHAR2
execResults.query = `
declare
function GET_STRING(p_string NVARCHAR2) return NVARCHAR2 as
begin
return 'xyz' || p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront16383
testRunExecResults(t, execResults)
// CHAR
execResults.query = `
declare
function GET_STRING(p_string CHAR) return CHAR as
begin
return 'xyz' || p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront32767
testRunExecResults(t, execResults)
// NCHAR
execResults.query = `
declare
function GET_STRING(p_string NCHAR) return NCHAR as
begin
return 'xyz' || p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront32767
testRunExecResults(t, execResults)
// CLOB
execResults.query = `
declare
function GET_STRING(p_string CLOB) return CLOB as
begin
return 'xyz' || p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront32767
testRunExecResults(t, execResults)
// NCLOB
execResults.query = `
declare
function GET_STRING(p_string NCLOB) return NCLOB as
begin
return 'xyz' || p_string;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsAddFront16383
testRunExecResults(t, execResults)
execResultRawAddFront2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: []byte(nil), In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{}, In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{10}, In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122, 10}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0}, In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122, 0}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}, In: true}},
results: map[string]interface{}{"string1": []byte{120, 121, 122, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}},
},
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice2000[:1997], In: true}},
results: map[string]interface{}{"string1": append([]byte{120, 121, 122}, testByteSlice2000[:1997]...)},
},
}
execResultRawAddFront4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice4000[:3997], In: true}},
results: map[string]interface{}{"string1": append([]byte{120, 121, 122}, testByteSlice4000[:3997]...)},
},
}
execResultRawAddFront32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice32767[:32764], In: true}},
results: map[string]interface{}{"string1": append([]byte{120, 121, 122}, testByteSlice32767[:32764]...)},
},
}
// RAW
execResults.query = `
declare
function GET_STRING(p_string RAW) return RAW as
begin
return UTL_RAW.CONCAT(UTL_RAW.CAST_TO_RAW('xyz'), p_string);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRawAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddFront32767
testRunExecResults(t, execResults)
// BLOB
execResults.query = `
declare
function GET_STRING(p_string BLOB) return BLOB as
l_blob BLOB;
begin
if p_string is null then
l_blob := UTL_RAW.CAST_TO_RAW('xyz');
return l_blob;
end if;
l_blob := UTL_RAW.CAST_TO_RAW('xyz');
DBMS_LOB.APPEND(l_blob, p_string);
return l_blob;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRawAddFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawAddFront32767
testRunExecResults(t, execResults)
// test strings remove from front
execResultStringsRemoveFront2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: "", In: true}},
results: map[string]interface{}{"string1": ""},
},
{
args: map[string]sql.Out{"string1": {Dest: "a", In: true}},
results: map[string]interface{}{"string1": ""},
},
{
args: map[string]sql.Out{"string1": {Dest: "\x00", In: true}},
results: map[string]interface{}{"string1": ""},
},
{
args: map[string]sql.Out{"string1": {Dest: "abc", In: true}},
results: map[string]interface{}{"string1": "c"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abc ", In: true}},
results: map[string]interface{}{"string1": "c "},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc", In: true}},
results: map[string]interface{}{"string1": " abc"},
},
{
args: map[string]sql.Out{"string1": {Dest: " abc ", In: true}},
results: map[string]interface{}{"string1": " abc "},
},
{
args: map[string]sql.Out{"string1": {Dest: "123", In: true}},
results: map[string]interface{}{"string1": "3"},
},
{
args: map[string]sql.Out{"string1": {Dest: "123.456", In: true}},
results: map[string]interface{}{"string1": "3.456"},
},
{
args: map[string]sql.Out{"string1": {Dest: "abcdefghijklmnopqrstuvwxyz", In: true}},
results: map[string]interface{}{"string1": "cdefghijklmnopqrstuvwxyz"},
},
{
args: map[string]sql.Out{"string1": {Dest: " a b c d e f g h i j k l m n o p q r s t u v w x y z ", In: true}},
results: map[string]interface{}{"string1": " b c d e f g h i j k l m n o p q r s t u v w x y z "},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\ncd\nef", In: true}},
results: map[string]interface{}{"string1": "\ncd\nef"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\tcd\tef", In: true}},
results: map[string]interface{}{"string1": "\tcd\tef"},
},
{
args: map[string]sql.Out{"string1": {Dest: "ab\x00cd\x00ef", In: true}},
results: map[string]interface{}{"string1": "\x00cd\x00ef"},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 100), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("a", 98)},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("a", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("a", 998)},
},
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("ab", 1000), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("ab", 999)},
},
}
execResultStringsRemoveFront4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("abcd", 1000), In: true}},
results: map[string]interface{}{"string1": "cd" + strings.Repeat("abcd", 999)},
},
}
execResultStringsRemoveFront16383 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("b", 16383), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("b", 16381)},
},
}
execResultStringsRemoveFront32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: strings.Repeat("c", 32767), In: true}},
results: map[string]interface{}{"string1": strings.Repeat("c", 32765)},
},
}
// VARCHAR2
execResults.query = `
declare
function GET_STRING(p_string VARCHAR2) return VARCHAR2 as
begin
return substr(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront32767
testRunExecResults(t, execResults)
// NVARCHAR2
execResults.query = `
declare
function GET_STRING(p_string NVARCHAR2) return NVARCHAR2 as
begin
return substr(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront16383
testRunExecResults(t, execResults)
// CHAR
execResults.query = `
declare
function GET_STRING(p_string CHAR) return CHAR as
begin
return substr(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront32767
testRunExecResults(t, execResults)
// NCHAR
execResults.query = `
declare
function GET_STRING(p_string NCHAR) return NCHAR as
begin
return substr(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront32767
testRunExecResults(t, execResults)
// CLOB
execResults.query = `
declare
function GET_STRING(p_string CLOB) return CLOB as
begin
return substr(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront16383
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront32767
testRunExecResults(t, execResults)
// NCLOB
execResults.query = `
declare
function GET_STRING(p_string NCLOB) return NCLOB as
begin
return substr(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultStringsRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultStringsRemoveFront16383
testRunExecResults(t, execResults)
execResultRawRemoveFront2000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: []byte(nil), In: true}},
results: map[string]interface{}{"string1": []byte(nil)},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{}, In: true}},
results: map[string]interface{}{"string1": []byte(nil)},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{10}, In: true}},
results: map[string]interface{}{"string1": []byte(nil)},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0}, In: true}},
results: map[string]interface{}{"string1": []byte(nil)},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, In: true}},
results: map[string]interface{}{"string1": []byte{2, 3, 4, 5, 6, 7, 8, 9}},
},
{
args: map[string]sql.Out{"string1": {Dest: []byte{245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}, In: true}},
results: map[string]interface{}{"string1": []byte{247, 248, 249, 250, 251, 252, 253, 254, 255}},
},
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice2000, In: true}},
results: map[string]interface{}{"string1": testByteSlice2000[2:]},
},
}
execResultRawRemoveFront4000 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice4000, In: true}},
results: map[string]interface{}{"string1": testByteSlice4000[2:]},
},
}
execResultRawRemoveFront32767 := []testExecResult{
{
args: map[string]sql.Out{"string1": {Dest: testByteSlice32767, In: true}},
results: map[string]interface{}{"string1": testByteSlice32767[2:]},
},
}
// RAW
execResults.query = `
declare
function GET_STRING(p_string RAW) return RAW as
begin
if p_string is null or UTL_RAW.LENGTH(p_string) < 3 then
return null;
end if;
return UTL_RAW.SUBSTR(p_string, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRawRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawRemoveFront32767
testRunExecResults(t, execResults)
// BLOB
execResults.query = `
declare
function GET_STRING(p_string BLOB) return BLOB as
begin
return DBMS_LOB.SUBSTR(p_string, 32767, 3);
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
execResults.execResults = execResultRawRemoveFront2000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawRemoveFront4000
testRunExecResults(t, execResults)
execResults.execResults = execResultRawRemoveFront32767
testRunExecResults(t, execResults)
}
// TestNullString tests NullString
func TestNullString(t *testing.T) {
if TestDisableDatabase {
t.SkipNow()
}
t.Parallel()
query := `
declare
function GET_STRING(p_string1 VARCHAR2) return VARCHAR2 as
begin
if p_string1 is not null then
return p_string1;
end if;
return 'null';
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
ctx, cancel := context.WithTimeout(context.Background(), TestContextTimeout)
stmt, err := TestDB.PrepareContext(ctx, query)
cancel()
if err != nil {
t.Fatal("prepare error:", err)
}
var nullString1 sql.NullString
nullString1.String = "a"
nullString1.Valid = false
ctx, cancel = context.WithTimeout(context.Background(), TestContextTimeout)
_, err = stmt.ExecContext(ctx, sql.Named("string1", sql.Out{Dest: &nullString1, In: true}))
cancel()
if err != nil {
t.Fatal("exec error:", err)
}
if !nullString1.Valid {
t.Fatal("nullString1 not Valid")
}
if nullString1.String != "null" {
t.Fatal("nullString1 not equal to null")
}
nullString1.String = "b"
ctx, cancel = context.WithTimeout(context.Background(), TestContextTimeout)
_, err = stmt.ExecContext(ctx, sql.Named("string1", sql.Out{Dest: &nullString1, In: true}))
cancel()
if err != nil {
t.Fatal("exec error:", err)
}
if !nullString1.Valid {
t.Fatal("nullString1 not Valid")
}
if nullString1.String != "b" {
t.Fatal("nullString1 not equal to b")
}
query = `
declare
function GET_STRING(p_string1 VARCHAR2) return VARCHAR2 as
begin
return null;
end GET_STRING;
begin
:string1 := GET_STRING(:string1);
end;`
ctx, cancel = context.WithTimeout(context.Background(), TestContextTimeout)
stmt, err = TestDB.PrepareContext(ctx, query)
cancel()
if err != nil {
t.Fatal("prepare error:", err)
}
nullString1.String = "c"
nullString1.Valid = true
ctx, cancel = context.WithTimeout(context.Background(), TestContextTimeout)
_, err = stmt.ExecContext(ctx, sql.Named("string1", sql.Out{Dest: &nullString1, In: true}))
cancel()
if err != nil {
t.Fatal("exec error:", err)
}
if nullString1.Valid {
t.Fatal("nullString1 is Valid")
}
if nullString1.String != "" {
t.Fatal("nullString1 not empty")
}
}
func TestDestructiveStringColumnTypes(t *testing.T) {
if TestDisableDatabase || TestDisableDestructive {
t.SkipNow()
}
tableName := "STRING_TYPES_" + TestTimeString
err := testExec(t, "create table "+tableName+" ( A VARCHAR2(4000), B RAW(2000), C CLOB, D BLOB )", nil)
if err != nil {
t.Fatal("create table error:", err)
}
defer testDropTable(t, tableName)
err = testExecRows(t, "insert into "+tableName+" ( A, B, C, D ) values (:1, :2, :3, :4)",
[][]interface{}{
{"abcdefghijklmnopqrstuvwxyz", []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
"abcdefghijklmnopqrstuvwxyz", []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
})
if err != nil {
t.Fatal("insert error:", err)
}
queryResults := testQueryResults{
query: "select A, B, C, D from " + tableName,
queryResults: []testQueryResult{
{
results: [][]interface{}{
{"abcdefghijklmnopqrstuvwxyz", []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
"abcdefghijklmnopqrstuvwxyz", []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}},
},
},
},
}
testRunQueryResults(t, queryResults)
ctx, cancel := context.WithTimeout(context.Background(), TestContextTimeout)
stmt, err := TestDB.PrepareContext(ctx, "select A, B, C, D from "+tableName)
cancel()
if err != nil {
t.Fatal("prepare error:", err)
}
defer func() {
err = stmt.Close()
if err != nil {
t.Error("stmt close error:", err)
}
}()
ctx, cancel = context.WithTimeout(context.Background(), TestContextTimeout)
var rows *sql.Rows
rows, err = stmt.QueryContext(ctx)
if err != nil {
cancel()
t.Fatal("query error", err)
}
defer func() {
cancel()
err = rows.Close()
if err != nil {
t.Error("rows close error", err)
}
}()
var columnTypes []*sql.ColumnType
columnTypes, err = rows.ColumnTypes()
if len(columnTypes) != 4 {
t.Fatal("len columnTypes not equal to 4")
}
// A
columnNum := 0
if columnTypes[columnNum].DatabaseTypeName() != "SQLT_AFC" {
t.Error("DatabaseTypeName does not match -", columnTypes[columnNum].DatabaseTypeName())
}
length, ok := columnTypes[columnNum].Length()
if length != 4000 {
t.Error("Length does not match -", length)
}
if ok != true {
t.Error("Length ok does not match -", ok)
}
if columnTypes[columnNum].Name() != "A" {
t.Error("Name does not match -", columnTypes[columnNum].Name())
}
if columnTypes[columnNum].ScanType() != typeString {
t.Error("ScanType does not match -", columnTypes[columnNum].ScanType())
}
// B
columnNum = 1
if columnTypes[columnNum].DatabaseTypeName() != "SQLT_BIN" {
t.Error("DatabaseTypeName does not match -", columnTypes[columnNum].DatabaseTypeName())
}
length, ok = columnTypes[columnNum].Length()
if length != 2000 {
t.Error("Length does not match -", length)
}
if ok != true {
t.Error("Length ok does not match -", ok)
}
if columnTypes[columnNum].Name() != "B" {
t.Error("Name does not match -", columnTypes[columnNum].Name())
}
if columnTypes[columnNum].ScanType() != typeSliceByte {
t.Error("ScanType does not match -", columnTypes[columnNum].ScanType())
}
// C
columnNum = 2
if columnTypes[columnNum].DatabaseTypeName() != "SQLT_CLOB" {
t.Error("DatabaseTypeName does not match -", columnTypes[columnNum].DatabaseTypeName())
}
length, ok = columnTypes[columnNum].Length()
if length != 8 {
t.Error("Length does not match -", length)
}
if ok != true {
t.Error("Length ok does not match -", ok)
}
if columnTypes[columnNum].Name() != "C" {
t.Error("Name does not match -", columnTypes[columnNum].Name())
}
if columnTypes[columnNum].ScanType() != typeString {
t.Error("ScanType does not match -", columnTypes[columnNum].ScanType())
}
// D
columnNum = 3
if columnTypes[columnNum].DatabaseTypeName() != "SQLT_BLOB" {
t.Error("DatabaseTypeName does not match -", columnTypes[columnNum].DatabaseTypeName())
}
length, ok = columnTypes[columnNum].Length()
if length != 8 {
t.Error("Length does not match -", length)
}
if ok != true {
t.Error("Length ok does not match -", ok)
}
if columnTypes[columnNum].Name() != "D" {
t.Error("Name does not match -", columnTypes[columnNum].Name())
}
if columnTypes[columnNum].ScanType() != typeSliceByte {
t.Error("ScanType does not match -", columnTypes[columnNum].ScanType())
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/GBase8s/go-gci.git
git@gitee.com:GBase8s/go-gci.git
GBase8s
go-gci
go-gci
master

搜索帮助