sql_test.go 103 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567
  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package sql
  5. import (
  6. "context"
  7. "database/sql/driver"
  8. "errors"
  9. "fmt"
  10. "math/rand"
  11. "reflect"
  12. "runtime"
  13. "strings"
  14. "sync"
  15. "sync/atomic"
  16. "testing"
  17. "time"
  18. )
  19. func init() {
  20. type dbConn struct {
  21. db *DB
  22. c *driverConn
  23. }
  24. freedFrom := make(map[dbConn]string)
  25. var mu sync.Mutex
  26. getFreedFrom := func(c dbConn) string {
  27. mu.Lock()
  28. defer mu.Unlock()
  29. return freedFrom[c]
  30. }
  31. setFreedFrom := func(c dbConn, s string) {
  32. mu.Lock()
  33. defer mu.Unlock()
  34. freedFrom[c] = s
  35. }
  36. putConnHook = func(db *DB, c *driverConn) {
  37. idx := -1
  38. for i, v := range db.freeConn {
  39. if v == c {
  40. idx = i
  41. break
  42. }
  43. }
  44. if idx >= 0 {
  45. // print before panic, as panic may get lost due to conflicting panic
  46. // (all goroutines asleep) elsewhere, since we might not unlock
  47. // the mutex in freeConn here.
  48. println("double free of conn. conflicts are:\nA) " + getFreedFrom(dbConn{db, c}) + "\n\nand\nB) " + stack())
  49. panic("double free of conn.")
  50. }
  51. setFreedFrom(dbConn{db, c}, stack())
  52. }
  53. }
  54. // pollDuration is an arbitrary interval to wait between checks when polling for
  55. // a condition to occur.
  56. const pollDuration = 5 * time.Millisecond
  57. const fakeDBName = "foo"
  58. var chrisBirthday = time.Unix(123456789, 0)
  59. func newTestDB(t testing.TB, name string) *DB {
  60. return newTestDBConnector(t, &fakeConnector{name: fakeDBName}, name)
  61. }
  62. func newTestDBConnector(t testing.TB, fc *fakeConnector, name string) *DB {
  63. fc.name = fakeDBName
  64. db := OpenDB(fc)
  65. if _, err := db.Exec("WIPE"); err != nil {
  66. t.Fatalf("exec wipe: %v", err)
  67. }
  68. if name == "people" {
  69. exec(t, db, "CREATE|people|name=string,age=int32,photo=blob,dead=bool,bdate=datetime")
  70. exec(t, db, "INSERT|people|name=Alice,age=?,photo=APHOTO", 1)
  71. exec(t, db, "INSERT|people|name=Bob,age=?,photo=BPHOTO", 2)
  72. exec(t, db, "INSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?", 3, chrisBirthday)
  73. }
  74. if name == "magicquery" {
  75. // Magic table name and column, known by fakedb_test.go.
  76. exec(t, db, "CREATE|magicquery|op=string,millis=int32")
  77. exec(t, db, "INSERT|magicquery|op=sleep,millis=10")
  78. }
  79. if name == "tx_status" {
  80. // Magic table name and column, known by fakedb_test.go.
  81. exec(t, db, "CREATE|tx_status|tx_status=string")
  82. exec(t, db, "INSERT|tx_status|tx_status=invalid")
  83. }
  84. return db
  85. }
  86. func TestOpenDB(t *testing.T) {
  87. db := OpenDB(dsnConnector{dsn: fakeDBName, driver: fdriver})
  88. if db.Driver() != fdriver {
  89. t.Fatalf("OpenDB should return the driver of the Connector")
  90. }
  91. }
  92. func TestDriverPanic(t *testing.T) {
  93. // Test that if driver panics, database/sql does not deadlock.
  94. db, err := Open("test", fakeDBName)
  95. if err != nil {
  96. t.Fatalf("Open: %v", err)
  97. }
  98. expectPanic := func(name string, f func()) {
  99. defer func() {
  100. err := recover()
  101. if err == nil {
  102. t.Fatalf("%s did not panic", name)
  103. }
  104. }()
  105. f()
  106. }
  107. expectPanic("Exec Exec", func() { db.Exec("PANIC|Exec|WIPE") })
  108. exec(t, db, "WIPE") // check not deadlocked
  109. expectPanic("Exec NumInput", func() { db.Exec("PANIC|NumInput|WIPE") })
  110. exec(t, db, "WIPE") // check not deadlocked
  111. expectPanic("Exec Close", func() { db.Exec("PANIC|Close|WIPE") })
  112. exec(t, db, "WIPE") // check not deadlocked
  113. exec(t, db, "PANIC|Query|WIPE") // should run successfully: Exec does not call Query
  114. exec(t, db, "WIPE") // check not deadlocked
  115. exec(t, db, "CREATE|people|name=string,age=int32,photo=blob,dead=bool,bdate=datetime")
  116. expectPanic("Query Query", func() { db.Query("PANIC|Query|SELECT|people|age,name|") })
  117. expectPanic("Query NumInput", func() { db.Query("PANIC|NumInput|SELECT|people|age,name|") })
  118. expectPanic("Query Close", func() {
  119. rows, err := db.Query("PANIC|Close|SELECT|people|age,name|")
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. rows.Close()
  124. })
  125. db.Query("PANIC|Exec|SELECT|people|age,name|") // should run successfully: Query does not call Exec
  126. exec(t, db, "WIPE") // check not deadlocked
  127. }
  128. func exec(t testing.TB, db *DB, query string, args ...any) {
  129. t.Helper()
  130. _, err := db.Exec(query, args...)
  131. if err != nil {
  132. t.Fatalf("Exec of %q: %v", query, err)
  133. }
  134. }
  135. func closeDB(t testing.TB, db *DB) {
  136. if e := recover(); e != nil {
  137. fmt.Printf("Panic: %v\n", e)
  138. panic(e)
  139. }
  140. defer setHookpostCloseConn(nil)
  141. setHookpostCloseConn(func(_ *fakeConn, err error) {
  142. if err != nil {
  143. t.Errorf("Error closing fakeConn: %v", err)
  144. }
  145. })
  146. db.mu.Lock()
  147. for i, dc := range db.freeConn {
  148. if n := len(dc.openStmt); n > 0 {
  149. // Just a sanity check. This is legal in
  150. // general, but if we make the tests clean up
  151. // their statements first, then we can safely
  152. // verify this is always zero here, and any
  153. // other value is a leak.
  154. t.Errorf("while closing db, freeConn %d/%d had %d open stmts; want 0", i, len(db.freeConn), n)
  155. }
  156. }
  157. db.mu.Unlock()
  158. err := db.Close()
  159. if err != nil {
  160. t.Fatalf("error closing DB: %v", err)
  161. }
  162. var numOpen int
  163. if !waitCondition(t, func() bool {
  164. numOpen = db.numOpenConns()
  165. return numOpen == 0
  166. }) {
  167. t.Fatalf("%d connections still open after closing DB", numOpen)
  168. }
  169. }
  170. // numPrepares assumes that db has exactly 1 idle conn and returns
  171. // its count of calls to Prepare
  172. func numPrepares(t *testing.T, db *DB) int {
  173. if n := len(db.freeConn); n != 1 {
  174. t.Fatalf("free conns = %d; want 1", n)
  175. }
  176. return db.freeConn[0].ci.(*fakeConn).numPrepare
  177. }
  178. func (db *DB) numDeps() int {
  179. db.mu.Lock()
  180. defer db.mu.Unlock()
  181. return len(db.dep)
  182. }
  183. // Dependencies are closed via a goroutine, so this polls waiting for
  184. // numDeps to fall to want, waiting up to nearly the test's deadline.
  185. func (db *DB) numDepsPoll(t *testing.T, want int) int {
  186. var n int
  187. waitCondition(t, func() bool {
  188. n = db.numDeps()
  189. return n <= want
  190. })
  191. return n
  192. }
  193. func (db *DB) numFreeConns() int {
  194. db.mu.Lock()
  195. defer db.mu.Unlock()
  196. return len(db.freeConn)
  197. }
  198. func (db *DB) numOpenConns() int {
  199. db.mu.Lock()
  200. defer db.mu.Unlock()
  201. return db.numOpen
  202. }
  203. // clearAllConns closes all connections in db.
  204. func (db *DB) clearAllConns(t *testing.T) {
  205. db.SetMaxIdleConns(0)
  206. if g, w := db.numFreeConns(), 0; g != w {
  207. t.Errorf("free conns = %d; want %d", g, w)
  208. }
  209. if n := db.numDepsPoll(t, 0); n > 0 {
  210. t.Errorf("number of dependencies = %d; expected 0", n)
  211. db.dumpDeps(t)
  212. }
  213. }
  214. func (db *DB) dumpDeps(t *testing.T) {
  215. for fc := range db.dep {
  216. db.dumpDep(t, 0, fc, map[finalCloser]bool{})
  217. }
  218. }
  219. func (db *DB) dumpDep(t *testing.T, depth int, dep finalCloser, seen map[finalCloser]bool) {
  220. seen[dep] = true
  221. indent := strings.Repeat(" ", depth)
  222. ds := db.dep[dep]
  223. for k := range ds {
  224. t.Logf("%s%T (%p) waiting for -> %T (%p)", indent, dep, dep, k, k)
  225. if fc, ok := k.(finalCloser); ok {
  226. if !seen[fc] {
  227. db.dumpDep(t, depth+1, fc, seen)
  228. }
  229. }
  230. }
  231. }
  232. func TestQuery(t *testing.T) {
  233. db := newTestDB(t, "people")
  234. defer closeDB(t, db)
  235. prepares0 := numPrepares(t, db)
  236. rows, err := db.Query("SELECT|people|age,name|")
  237. if err != nil {
  238. t.Fatalf("Query: %v", err)
  239. }
  240. type row struct {
  241. age int
  242. name string
  243. }
  244. got := []row{}
  245. for rows.Next() {
  246. var r row
  247. err = rows.Scan(&r.age, &r.name)
  248. if err != nil {
  249. t.Fatalf("Scan: %v", err)
  250. }
  251. got = append(got, r)
  252. }
  253. err = rows.Err()
  254. if err != nil {
  255. t.Fatalf("Err: %v", err)
  256. }
  257. want := []row{
  258. {age: 1, name: "Alice"},
  259. {age: 2, name: "Bob"},
  260. {age: 3, name: "Chris"},
  261. }
  262. if !reflect.DeepEqual(got, want) {
  263. t.Errorf("mismatch.\n got: %#v\nwant: %#v", got, want)
  264. }
  265. // And verify that the final rows.Next() call, which hit EOF,
  266. // also closed the rows connection.
  267. if n := db.numFreeConns(); n != 1 {
  268. t.Fatalf("free conns after query hitting EOF = %d; want 1", n)
  269. }
  270. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  271. t.Errorf("executed %d Prepare statements; want 1", prepares)
  272. }
  273. }
  274. // TestQueryContext tests canceling the context while scanning the rows.
  275. func TestQueryContext(t *testing.T) {
  276. db := newTestDB(t, "people")
  277. defer closeDB(t, db)
  278. prepares0 := numPrepares(t, db)
  279. ctx, cancel := context.WithCancel(context.Background())
  280. defer cancel()
  281. rows, err := db.QueryContext(ctx, "SELECT|people|age,name|")
  282. if err != nil {
  283. t.Fatalf("Query: %v", err)
  284. }
  285. type row struct {
  286. age int
  287. name string
  288. }
  289. got := []row{}
  290. index := 0
  291. for rows.Next() {
  292. if index == 2 {
  293. cancel()
  294. waitForRowsClose(t, rows)
  295. }
  296. var r row
  297. err = rows.Scan(&r.age, &r.name)
  298. if err != nil {
  299. if index == 2 {
  300. break
  301. }
  302. t.Fatalf("Scan: %v", err)
  303. }
  304. if index == 2 && err != context.Canceled {
  305. t.Fatalf("Scan: %v; want context.Canceled", err)
  306. }
  307. got = append(got, r)
  308. index++
  309. }
  310. select {
  311. case <-ctx.Done():
  312. if err := ctx.Err(); err != context.Canceled {
  313. t.Fatalf("context err = %v; want context.Canceled", err)
  314. }
  315. default:
  316. t.Fatalf("context err = nil; want context.Canceled")
  317. }
  318. want := []row{
  319. {age: 1, name: "Alice"},
  320. {age: 2, name: "Bob"},
  321. }
  322. if !reflect.DeepEqual(got, want) {
  323. t.Errorf("mismatch.\n got: %#v\nwant: %#v", got, want)
  324. }
  325. // And verify that the final rows.Next() call, which hit EOF,
  326. // also closed the rows connection.
  327. waitForRowsClose(t, rows)
  328. waitForFree(t, db, 1)
  329. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  330. t.Errorf("executed %d Prepare statements; want 1", prepares)
  331. }
  332. }
  333. func waitCondition(t testing.TB, fn func() bool) bool {
  334. timeout := 5 * time.Second
  335. type deadliner interface {
  336. Deadline() (time.Time, bool)
  337. }
  338. if td, ok := t.(deadliner); ok {
  339. if deadline, ok := td.Deadline(); ok {
  340. timeout = time.Until(deadline)
  341. timeout = timeout * 19 / 20 // Give 5% headroom for cleanup and error-reporting.
  342. }
  343. }
  344. deadline := time.Now().Add(timeout)
  345. for {
  346. if fn() {
  347. return true
  348. }
  349. if time.Until(deadline) < pollDuration {
  350. return false
  351. }
  352. time.Sleep(pollDuration)
  353. }
  354. }
  355. // waitForFree checks db.numFreeConns until either it equals want or
  356. // the maxWait time elapses.
  357. func waitForFree(t *testing.T, db *DB, want int) {
  358. var numFree int
  359. if !waitCondition(t, func() bool {
  360. numFree = db.numFreeConns()
  361. return numFree == want
  362. }) {
  363. t.Fatalf("free conns after hitting EOF = %d; want %d", numFree, want)
  364. }
  365. }
  366. func waitForRowsClose(t *testing.T, rows *Rows) {
  367. if !waitCondition(t, func() bool {
  368. rows.closemu.RLock()
  369. defer rows.closemu.RUnlock()
  370. return rows.closed
  371. }) {
  372. t.Fatal("failed to close rows")
  373. }
  374. }
  375. // TestQueryContextWait ensures that rows and all internal statements are closed when
  376. // a query context is closed during execution.
  377. func TestQueryContextWait(t *testing.T) {
  378. db := newTestDB(t, "people")
  379. defer closeDB(t, db)
  380. prepares0 := numPrepares(t, db)
  381. ctx, cancel := context.WithCancel(context.Background())
  382. defer cancel()
  383. // This will trigger the *fakeConn.Prepare method which will take time
  384. // performing the query. The ctxDriverPrepare func will check the context
  385. // after this and close the rows and return an error.
  386. c, err := db.Conn(ctx)
  387. if err != nil {
  388. t.Fatal(err)
  389. }
  390. c.dc.ci.(*fakeConn).waiter = func(c context.Context) {
  391. cancel()
  392. <-ctx.Done()
  393. }
  394. _, err = c.QueryContext(ctx, "SELECT|people|age,name|")
  395. c.Close()
  396. if err != context.Canceled {
  397. t.Fatalf("expected QueryContext to error with context deadline exceeded but returned %v", err)
  398. }
  399. // Verify closed rows connection after error condition.
  400. waitForFree(t, db, 1)
  401. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  402. t.Fatalf("executed %d Prepare statements; want 1", prepares)
  403. }
  404. }
  405. // TestTxContextWait tests the transaction behavior when the tx context is canceled
  406. // during execution of the query.
  407. func TestTxContextWait(t *testing.T) {
  408. db := newTestDB(t, "people")
  409. defer closeDB(t, db)
  410. ctx, cancel := context.WithCancel(context.Background())
  411. tx, err := db.BeginTx(ctx, nil)
  412. if err != nil {
  413. t.Fatal(err)
  414. }
  415. tx.keepConnOnRollback = false
  416. tx.dc.ci.(*fakeConn).waiter = func(c context.Context) {
  417. cancel()
  418. <-ctx.Done()
  419. }
  420. // This will trigger the *fakeConn.Prepare method which will take time
  421. // performing the query. The ctxDriverPrepare func will check the context
  422. // after this and close the rows and return an error.
  423. _, err = tx.QueryContext(ctx, "SELECT|people|age,name|")
  424. if err != context.Canceled {
  425. t.Fatalf("expected QueryContext to error with context canceled but returned %v", err)
  426. }
  427. waitForFree(t, db, 0)
  428. }
  429. // TestTxContextWaitNoDiscard is the same as TestTxContextWait, but should not discard
  430. // the final connection.
  431. func TestTxContextWaitNoDiscard(t *testing.T) {
  432. db := newTestDB(t, "people")
  433. defer closeDB(t, db)
  434. ctx, cancel := context.WithTimeout(context.Background(), 15*time.Millisecond)
  435. defer cancel()
  436. tx, err := db.BeginTx(ctx, nil)
  437. if err != nil {
  438. // Guard against the context being canceled before BeginTx completes.
  439. if err == context.DeadlineExceeded {
  440. t.Skip("tx context canceled prior to first use")
  441. }
  442. t.Fatal(err)
  443. }
  444. // This will trigger the *fakeConn.Prepare method which will take time
  445. // performing the query. The ctxDriverPrepare func will check the context
  446. // after this and close the rows and return an error.
  447. _, err = tx.QueryContext(ctx, "WAIT|1s|SELECT|people|age,name|")
  448. if err != context.DeadlineExceeded {
  449. t.Fatalf("expected QueryContext to error with context deadline exceeded but returned %v", err)
  450. }
  451. waitForFree(t, db, 1)
  452. }
  453. // TestUnsupportedOptions checks that the database fails when a driver that
  454. // doesn't implement ConnBeginTx is used with non-default options and an
  455. // un-cancellable context.
  456. func TestUnsupportedOptions(t *testing.T) {
  457. db := newTestDB(t, "people")
  458. defer closeDB(t, db)
  459. _, err := db.BeginTx(context.Background(), &TxOptions{
  460. Isolation: LevelSerializable, ReadOnly: true,
  461. })
  462. if err == nil {
  463. t.Fatal("expected error when using unsupported options, got nil")
  464. }
  465. }
  466. func TestMultiResultSetQuery(t *testing.T) {
  467. db := newTestDB(t, "people")
  468. defer closeDB(t, db)
  469. prepares0 := numPrepares(t, db)
  470. rows, err := db.Query("SELECT|people|age,name|;SELECT|people|name|")
  471. if err != nil {
  472. t.Fatalf("Query: %v", err)
  473. }
  474. type row1 struct {
  475. age int
  476. name string
  477. }
  478. type row2 struct {
  479. name string
  480. }
  481. got1 := []row1{}
  482. for rows.Next() {
  483. var r row1
  484. err = rows.Scan(&r.age, &r.name)
  485. if err != nil {
  486. t.Fatalf("Scan: %v", err)
  487. }
  488. got1 = append(got1, r)
  489. }
  490. err = rows.Err()
  491. if err != nil {
  492. t.Fatalf("Err: %v", err)
  493. }
  494. want1 := []row1{
  495. {age: 1, name: "Alice"},
  496. {age: 2, name: "Bob"},
  497. {age: 3, name: "Chris"},
  498. }
  499. if !reflect.DeepEqual(got1, want1) {
  500. t.Errorf("mismatch.\n got1: %#v\nwant: %#v", got1, want1)
  501. }
  502. if !rows.NextResultSet() {
  503. t.Errorf("expected another result set")
  504. }
  505. got2 := []row2{}
  506. for rows.Next() {
  507. var r row2
  508. err = rows.Scan(&r.name)
  509. if err != nil {
  510. t.Fatalf("Scan: %v", err)
  511. }
  512. got2 = append(got2, r)
  513. }
  514. err = rows.Err()
  515. if err != nil {
  516. t.Fatalf("Err: %v", err)
  517. }
  518. want2 := []row2{
  519. {name: "Alice"},
  520. {name: "Bob"},
  521. {name: "Chris"},
  522. }
  523. if !reflect.DeepEqual(got2, want2) {
  524. t.Errorf("mismatch.\n got: %#v\nwant: %#v", got2, want2)
  525. }
  526. if rows.NextResultSet() {
  527. t.Errorf("expected no more result sets")
  528. }
  529. // And verify that the final rows.Next() call, which hit EOF,
  530. // also closed the rows connection.
  531. waitForFree(t, db, 1)
  532. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  533. t.Errorf("executed %d Prepare statements; want 1", prepares)
  534. }
  535. }
  536. func TestQueryNamedArg(t *testing.T) {
  537. db := newTestDB(t, "people")
  538. defer closeDB(t, db)
  539. prepares0 := numPrepares(t, db)
  540. rows, err := db.Query(
  541. // Ensure the name and age parameters only match on placeholder name, not position.
  542. "SELECT|people|age,name|name=?name,age=?age",
  543. Named("age", 2),
  544. Named("name", "Bob"),
  545. )
  546. if err != nil {
  547. t.Fatalf("Query: %v", err)
  548. }
  549. type row struct {
  550. age int
  551. name string
  552. }
  553. got := []row{}
  554. for rows.Next() {
  555. var r row
  556. err = rows.Scan(&r.age, &r.name)
  557. if err != nil {
  558. t.Fatalf("Scan: %v", err)
  559. }
  560. got = append(got, r)
  561. }
  562. err = rows.Err()
  563. if err != nil {
  564. t.Fatalf("Err: %v", err)
  565. }
  566. want := []row{
  567. {age: 2, name: "Bob"},
  568. }
  569. if !reflect.DeepEqual(got, want) {
  570. t.Errorf("mismatch.\n got: %#v\nwant: %#v", got, want)
  571. }
  572. // And verify that the final rows.Next() call, which hit EOF,
  573. // also closed the rows connection.
  574. if n := db.numFreeConns(); n != 1 {
  575. t.Fatalf("free conns after query hitting EOF = %d; want 1", n)
  576. }
  577. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  578. t.Errorf("executed %d Prepare statements; want 1", prepares)
  579. }
  580. }
  581. func TestPoolExhaustOnCancel(t *testing.T) {
  582. if testing.Short() {
  583. t.Skip("long test")
  584. }
  585. max := 3
  586. var saturate, saturateDone sync.WaitGroup
  587. saturate.Add(max)
  588. saturateDone.Add(max)
  589. donePing := make(chan bool)
  590. state := 0
  591. // waiter will be called for all queries, including
  592. // initial setup queries. The state is only assigned when
  593. // no queries are made.
  594. //
  595. // Only allow the first batch of queries to finish once the
  596. // second batch of Ping queries have finished.
  597. waiter := func(ctx context.Context) {
  598. switch state {
  599. case 0:
  600. // Nothing. Initial database setup.
  601. case 1:
  602. saturate.Done()
  603. select {
  604. case <-ctx.Done():
  605. case <-donePing:
  606. }
  607. case 2:
  608. }
  609. }
  610. db := newTestDBConnector(t, &fakeConnector{waiter: waiter}, "people")
  611. defer closeDB(t, db)
  612. db.SetMaxOpenConns(max)
  613. // First saturate the connection pool.
  614. // Then start new requests for a connection that is canceled after it is requested.
  615. state = 1
  616. for i := 0; i < max; i++ {
  617. go func() {
  618. rows, err := db.Query("SELECT|people|name,photo|")
  619. if err != nil {
  620. t.Errorf("Query: %v", err)
  621. return
  622. }
  623. rows.Close()
  624. saturateDone.Done()
  625. }()
  626. }
  627. saturate.Wait()
  628. if t.Failed() {
  629. t.FailNow()
  630. }
  631. state = 2
  632. // Now cancel the request while it is waiting.
  633. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  634. defer cancel()
  635. for i := 0; i < max; i++ {
  636. ctxReq, cancelReq := context.WithCancel(ctx)
  637. go func() {
  638. time.Sleep(100 * time.Millisecond)
  639. cancelReq()
  640. }()
  641. err := db.PingContext(ctxReq)
  642. if err != context.Canceled {
  643. t.Fatalf("PingContext (Exhaust): %v", err)
  644. }
  645. }
  646. close(donePing)
  647. saturateDone.Wait()
  648. // Now try to open a normal connection.
  649. err := db.PingContext(ctx)
  650. if err != nil {
  651. t.Fatalf("PingContext (Normal): %v", err)
  652. }
  653. }
  654. func TestRowsColumns(t *testing.T) {
  655. db := newTestDB(t, "people")
  656. defer closeDB(t, db)
  657. rows, err := db.Query("SELECT|people|age,name|")
  658. if err != nil {
  659. t.Fatalf("Query: %v", err)
  660. }
  661. cols, err := rows.Columns()
  662. if err != nil {
  663. t.Fatalf("Columns: %v", err)
  664. }
  665. want := []string{"age", "name"}
  666. if !reflect.DeepEqual(cols, want) {
  667. t.Errorf("got %#v; want %#v", cols, want)
  668. }
  669. if err := rows.Close(); err != nil {
  670. t.Errorf("error closing rows: %s", err)
  671. }
  672. }
  673. func TestRowsColumnTypes(t *testing.T) {
  674. db := newTestDB(t, "people")
  675. defer closeDB(t, db)
  676. rows, err := db.Query("SELECT|people|age,name|")
  677. if err != nil {
  678. t.Fatalf("Query: %v", err)
  679. }
  680. tt, err := rows.ColumnTypes()
  681. if err != nil {
  682. t.Fatalf("ColumnTypes: %v", err)
  683. }
  684. types := make([]reflect.Type, len(tt))
  685. for i, tp := range tt {
  686. st := tp.ScanType()
  687. if st == nil {
  688. t.Errorf("scantype is null for column %q", tp.Name())
  689. continue
  690. }
  691. types[i] = st
  692. }
  693. values := make([]any, len(tt))
  694. for i := range values {
  695. values[i] = reflect.New(types[i]).Interface()
  696. }
  697. ct := 0
  698. for rows.Next() {
  699. err = rows.Scan(values...)
  700. if err != nil {
  701. t.Fatalf("failed to scan values in %v", err)
  702. }
  703. if ct == 1 {
  704. if age := *values[0].(*int32); age != 2 {
  705. t.Errorf("Expected 2, got %v", age)
  706. }
  707. if name := *values[1].(*string); name != "Bob" {
  708. t.Errorf("Expected Bob, got %v", name)
  709. }
  710. }
  711. ct++
  712. }
  713. if ct != 3 {
  714. t.Errorf("expected 3 rows, got %d", ct)
  715. }
  716. if err := rows.Close(); err != nil {
  717. t.Errorf("error closing rows: %s", err)
  718. }
  719. }
  720. func TestQueryRow(t *testing.T) {
  721. db := newTestDB(t, "people")
  722. defer closeDB(t, db)
  723. var name string
  724. var age int
  725. var birthday time.Time
  726. err := db.QueryRow("SELECT|people|age,name|age=?", 3).Scan(&age)
  727. if err == nil || !strings.Contains(err.Error(), "expected 2 destination arguments") {
  728. t.Errorf("expected error from wrong number of arguments; actually got: %v", err)
  729. }
  730. err = db.QueryRow("SELECT|people|bdate|age=?", 3).Scan(&birthday)
  731. if err != nil || !birthday.Equal(chrisBirthday) {
  732. t.Errorf("chris birthday = %v, err = %v; want %v", birthday, err, chrisBirthday)
  733. }
  734. err = db.QueryRow("SELECT|people|age,name|age=?", 2).Scan(&age, &name)
  735. if err != nil {
  736. t.Fatalf("age QueryRow+Scan: %v", err)
  737. }
  738. if name != "Bob" {
  739. t.Errorf("expected name Bob, got %q", name)
  740. }
  741. if age != 2 {
  742. t.Errorf("expected age 2, got %d", age)
  743. }
  744. err = db.QueryRow("SELECT|people|age,name|name=?", "Alice").Scan(&age, &name)
  745. if err != nil {
  746. t.Fatalf("name QueryRow+Scan: %v", err)
  747. }
  748. if name != "Alice" {
  749. t.Errorf("expected name Alice, got %q", name)
  750. }
  751. if age != 1 {
  752. t.Errorf("expected age 1, got %d", age)
  753. }
  754. var photo []byte
  755. err = db.QueryRow("SELECT|people|photo|name=?", "Alice").Scan(&photo)
  756. if err != nil {
  757. t.Fatalf("photo QueryRow+Scan: %v", err)
  758. }
  759. want := []byte("APHOTO")
  760. if !reflect.DeepEqual(photo, want) {
  761. t.Errorf("photo = %q; want %q", photo, want)
  762. }
  763. }
  764. func TestRowErr(t *testing.T) {
  765. db := newTestDB(t, "people")
  766. err := db.QueryRowContext(context.Background(), "SELECT|people|bdate|age=?", 3).Err()
  767. if err != nil {
  768. t.Errorf("Unexpected err = %v; want %v", err, nil)
  769. }
  770. ctx, cancel := context.WithCancel(context.Background())
  771. cancel()
  772. err = db.QueryRowContext(ctx, "SELECT|people|bdate|age=?", 3).Err()
  773. exp := "context canceled"
  774. if err == nil || !strings.Contains(err.Error(), exp) {
  775. t.Errorf("Expected err = %v; got %v", exp, err)
  776. }
  777. }
  778. func TestTxRollbackCommitErr(t *testing.T) {
  779. db := newTestDB(t, "people")
  780. defer closeDB(t, db)
  781. tx, err := db.Begin()
  782. if err != nil {
  783. t.Fatal(err)
  784. }
  785. err = tx.Rollback()
  786. if err != nil {
  787. t.Errorf("expected nil error from Rollback; got %v", err)
  788. }
  789. err = tx.Commit()
  790. if err != ErrTxDone {
  791. t.Errorf("expected %q from Commit; got %q", ErrTxDone, err)
  792. }
  793. tx, err = db.Begin()
  794. if err != nil {
  795. t.Fatal(err)
  796. }
  797. err = tx.Commit()
  798. if err != nil {
  799. t.Errorf("expected nil error from Commit; got %v", err)
  800. }
  801. err = tx.Rollback()
  802. if err != ErrTxDone {
  803. t.Errorf("expected %q from Rollback; got %q", ErrTxDone, err)
  804. }
  805. }
  806. func TestStatementErrorAfterClose(t *testing.T) {
  807. db := newTestDB(t, "people")
  808. defer closeDB(t, db)
  809. stmt, err := db.Prepare("SELECT|people|age|name=?")
  810. if err != nil {
  811. t.Fatalf("Prepare: %v", err)
  812. }
  813. err = stmt.Close()
  814. if err != nil {
  815. t.Fatalf("Close: %v", err)
  816. }
  817. var name string
  818. err = stmt.QueryRow("foo").Scan(&name)
  819. if err == nil {
  820. t.Errorf("expected error from QueryRow.Scan after Stmt.Close")
  821. }
  822. }
  823. func TestStatementQueryRow(t *testing.T) {
  824. db := newTestDB(t, "people")
  825. defer closeDB(t, db)
  826. stmt, err := db.Prepare("SELECT|people|age|name=?")
  827. if err != nil {
  828. t.Fatalf("Prepare: %v", err)
  829. }
  830. defer stmt.Close()
  831. var age int
  832. for n, tt := range []struct {
  833. name string
  834. want int
  835. }{
  836. {"Alice", 1},
  837. {"Bob", 2},
  838. {"Chris", 3},
  839. } {
  840. if err := stmt.QueryRow(tt.name).Scan(&age); err != nil {
  841. t.Errorf("%d: on %q, QueryRow/Scan: %v", n, tt.name, err)
  842. } else if age != tt.want {
  843. t.Errorf("%d: age=%d, want %d", n, age, tt.want)
  844. }
  845. }
  846. }
  847. type stubDriverStmt struct {
  848. err error
  849. }
  850. func (s stubDriverStmt) Close() error {
  851. return s.err
  852. }
  853. func (s stubDriverStmt) NumInput() int {
  854. return -1
  855. }
  856. func (s stubDriverStmt) Exec(args []driver.Value) (driver.Result, error) {
  857. return nil, nil
  858. }
  859. func (s stubDriverStmt) Query(args []driver.Value) (driver.Rows, error) {
  860. return nil, nil
  861. }
  862. // golang.org/issue/12798
  863. func TestStatementClose(t *testing.T) {
  864. want := errors.New("STMT ERROR")
  865. tests := []struct {
  866. stmt *Stmt
  867. msg string
  868. }{
  869. {&Stmt{stickyErr: want}, "stickyErr not propagated"},
  870. {&Stmt{cg: &Tx{}, cgds: &driverStmt{Locker: &sync.Mutex{}, si: stubDriverStmt{want}}}, "driverStmt.Close() error not propagated"},
  871. }
  872. for _, test := range tests {
  873. if err := test.stmt.Close(); err != want {
  874. t.Errorf("%s. Got stmt.Close() = %v, want = %v", test.msg, err, want)
  875. }
  876. }
  877. }
  878. // golang.org/issue/3734
  879. func TestStatementQueryRowConcurrent(t *testing.T) {
  880. db := newTestDB(t, "people")
  881. defer closeDB(t, db)
  882. stmt, err := db.Prepare("SELECT|people|age|name=?")
  883. if err != nil {
  884. t.Fatalf("Prepare: %v", err)
  885. }
  886. defer stmt.Close()
  887. const n = 10
  888. ch := make(chan error, n)
  889. for i := 0; i < n; i++ {
  890. go func() {
  891. var age int
  892. err := stmt.QueryRow("Alice").Scan(&age)
  893. if err == nil && age != 1 {
  894. err = fmt.Errorf("unexpected age %d", age)
  895. }
  896. ch <- err
  897. }()
  898. }
  899. for i := 0; i < n; i++ {
  900. if err := <-ch; err != nil {
  901. t.Error(err)
  902. }
  903. }
  904. }
  905. // just a test of fakedb itself
  906. func TestBogusPreboundParameters(t *testing.T) {
  907. db := newTestDB(t, "foo")
  908. defer closeDB(t, db)
  909. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  910. _, err := db.Prepare("INSERT|t1|name=?,age=bogusconversion")
  911. if err == nil {
  912. t.Fatalf("expected error")
  913. }
  914. if err.Error() != `fakedb: invalid conversion to int32 from "bogusconversion"` {
  915. t.Errorf("unexpected error: %v", err)
  916. }
  917. }
  918. func TestExec(t *testing.T) {
  919. db := newTestDB(t, "foo")
  920. defer closeDB(t, db)
  921. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  922. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  923. if err != nil {
  924. t.Errorf("Stmt, err = %v, %v", stmt, err)
  925. }
  926. defer stmt.Close()
  927. type execTest struct {
  928. args []any
  929. wantErr string
  930. }
  931. execTests := []execTest{
  932. // Okay:
  933. {[]any{"Brad", 31}, ""},
  934. {[]any{"Brad", int64(31)}, ""},
  935. {[]any{"Bob", "32"}, ""},
  936. {[]any{7, 9}, ""},
  937. // Invalid conversions:
  938. {[]any{"Brad", int64(0xFFFFFFFF)}, "sql: converting argument $2 type: sql/driver: value 4294967295 overflows int32"},
  939. {[]any{"Brad", "strconv fail"}, `sql: converting argument $2 type: sql/driver: value "strconv fail" can't be converted to int32`},
  940. // Wrong number of args:
  941. {[]any{}, "sql: expected 2 arguments, got 0"},
  942. {[]any{1, 2, 3}, "sql: expected 2 arguments, got 3"},
  943. }
  944. for n, et := range execTests {
  945. _, err := stmt.Exec(et.args...)
  946. errStr := ""
  947. if err != nil {
  948. errStr = err.Error()
  949. }
  950. if errStr != et.wantErr {
  951. t.Errorf("stmt.Execute #%d: for %v, got error %q, want error %q",
  952. n, et.args, errStr, et.wantErr)
  953. }
  954. }
  955. }
  956. func TestTxPrepare(t *testing.T) {
  957. db := newTestDB(t, "")
  958. defer closeDB(t, db)
  959. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  960. tx, err := db.Begin()
  961. if err != nil {
  962. t.Fatalf("Begin = %v", err)
  963. }
  964. stmt, err := tx.Prepare("INSERT|t1|name=?,age=?")
  965. if err != nil {
  966. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  967. }
  968. defer stmt.Close()
  969. _, err = stmt.Exec("Bobby", 7)
  970. if err != nil {
  971. t.Fatalf("Exec = %v", err)
  972. }
  973. err = tx.Commit()
  974. if err != nil {
  975. t.Fatalf("Commit = %v", err)
  976. }
  977. // Commit() should have closed the statement
  978. if !stmt.closed {
  979. t.Fatal("Stmt not closed after Commit")
  980. }
  981. }
  982. func TestTxStmt(t *testing.T) {
  983. db := newTestDB(t, "")
  984. defer closeDB(t, db)
  985. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  986. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  987. if err != nil {
  988. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  989. }
  990. defer stmt.Close()
  991. tx, err := db.Begin()
  992. if err != nil {
  993. t.Fatalf("Begin = %v", err)
  994. }
  995. txs := tx.Stmt(stmt)
  996. defer txs.Close()
  997. _, err = txs.Exec("Bobby", 7)
  998. if err != nil {
  999. t.Fatalf("Exec = %v", err)
  1000. }
  1001. err = tx.Commit()
  1002. if err != nil {
  1003. t.Fatalf("Commit = %v", err)
  1004. }
  1005. // Commit() should have closed the statement
  1006. if !txs.closed {
  1007. t.Fatal("Stmt not closed after Commit")
  1008. }
  1009. }
  1010. func TestTxStmtPreparedOnce(t *testing.T) {
  1011. db := newTestDB(t, "")
  1012. defer closeDB(t, db)
  1013. exec(t, db, "CREATE|t1|name=string,age=int32")
  1014. prepares0 := numPrepares(t, db)
  1015. // db.Prepare increments numPrepares.
  1016. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  1017. if err != nil {
  1018. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  1019. }
  1020. defer stmt.Close()
  1021. tx, err := db.Begin()
  1022. if err != nil {
  1023. t.Fatalf("Begin = %v", err)
  1024. }
  1025. txs1 := tx.Stmt(stmt)
  1026. txs2 := tx.Stmt(stmt)
  1027. _, err = txs1.Exec("Go", 7)
  1028. if err != nil {
  1029. t.Fatalf("Exec = %v", err)
  1030. }
  1031. txs1.Close()
  1032. _, err = txs2.Exec("Gopher", 8)
  1033. if err != nil {
  1034. t.Fatalf("Exec = %v", err)
  1035. }
  1036. txs2.Close()
  1037. err = tx.Commit()
  1038. if err != nil {
  1039. t.Fatalf("Commit = %v", err)
  1040. }
  1041. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  1042. t.Errorf("executed %d Prepare statements; want 1", prepares)
  1043. }
  1044. }
  1045. func TestTxStmtClosedRePrepares(t *testing.T) {
  1046. db := newTestDB(t, "")
  1047. defer closeDB(t, db)
  1048. exec(t, db, "CREATE|t1|name=string,age=int32")
  1049. prepares0 := numPrepares(t, db)
  1050. // db.Prepare increments numPrepares.
  1051. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  1052. if err != nil {
  1053. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  1054. }
  1055. tx, err := db.Begin()
  1056. if err != nil {
  1057. t.Fatalf("Begin = %v", err)
  1058. }
  1059. err = stmt.Close()
  1060. if err != nil {
  1061. t.Fatalf("stmt.Close() = %v", err)
  1062. }
  1063. // tx.Stmt increments numPrepares because stmt is closed.
  1064. txs := tx.Stmt(stmt)
  1065. if txs.stickyErr != nil {
  1066. t.Fatal(txs.stickyErr)
  1067. }
  1068. if txs.parentStmt != nil {
  1069. t.Fatal("expected nil parentStmt")
  1070. }
  1071. _, err = txs.Exec(`Eric`, 82)
  1072. if err != nil {
  1073. t.Fatalf("txs.Exec = %v", err)
  1074. }
  1075. err = txs.Close()
  1076. if err != nil {
  1077. t.Fatalf("txs.Close = %v", err)
  1078. }
  1079. tx.Rollback()
  1080. if prepares := numPrepares(t, db) - prepares0; prepares != 2 {
  1081. t.Errorf("executed %d Prepare statements; want 2", prepares)
  1082. }
  1083. }
  1084. func TestParentStmtOutlivesTxStmt(t *testing.T) {
  1085. db := newTestDB(t, "")
  1086. defer closeDB(t, db)
  1087. exec(t, db, "CREATE|t1|name=string,age=int32")
  1088. // Make sure everything happens on the same connection.
  1089. db.SetMaxOpenConns(1)
  1090. prepares0 := numPrepares(t, db)
  1091. // db.Prepare increments numPrepares.
  1092. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  1093. if err != nil {
  1094. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  1095. }
  1096. defer stmt.Close()
  1097. tx, err := db.Begin()
  1098. if err != nil {
  1099. t.Fatalf("Begin = %v", err)
  1100. }
  1101. txs := tx.Stmt(stmt)
  1102. if len(stmt.css) != 1 {
  1103. t.Fatalf("len(stmt.css) = %v; want 1", len(stmt.css))
  1104. }
  1105. err = txs.Close()
  1106. if err != nil {
  1107. t.Fatalf("txs.Close() = %v", err)
  1108. }
  1109. err = tx.Rollback()
  1110. if err != nil {
  1111. t.Fatalf("tx.Rollback() = %v", err)
  1112. }
  1113. // txs must not be valid.
  1114. _, err = txs.Exec("Suzan", 30)
  1115. if err == nil {
  1116. t.Fatalf("txs.Exec(), expected err")
  1117. }
  1118. // Stmt must still be valid.
  1119. _, err = stmt.Exec("Janina", 25)
  1120. if err != nil {
  1121. t.Fatalf("stmt.Exec() = %v", err)
  1122. }
  1123. if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
  1124. t.Errorf("executed %d Prepare statements; want 1", prepares)
  1125. }
  1126. }
  1127. // Test that tx.Stmt called with a statement already
  1128. // associated with tx as argument re-prepares the same
  1129. // statement again.
  1130. func TestTxStmtFromTxStmtRePrepares(t *testing.T) {
  1131. db := newTestDB(t, "")
  1132. defer closeDB(t, db)
  1133. exec(t, db, "CREATE|t1|name=string,age=int32")
  1134. prepares0 := numPrepares(t, db)
  1135. // db.Prepare increments numPrepares.
  1136. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  1137. if err != nil {
  1138. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  1139. }
  1140. defer stmt.Close()
  1141. tx, err := db.Begin()
  1142. if err != nil {
  1143. t.Fatalf("Begin = %v", err)
  1144. }
  1145. txs1 := tx.Stmt(stmt)
  1146. // tx.Stmt(txs1) increments numPrepares because txs1 already
  1147. // belongs to a transaction (albeit the same transaction).
  1148. txs2 := tx.Stmt(txs1)
  1149. if txs2.stickyErr != nil {
  1150. t.Fatal(txs2.stickyErr)
  1151. }
  1152. if txs2.parentStmt != nil {
  1153. t.Fatal("expected nil parentStmt")
  1154. }
  1155. _, err = txs2.Exec(`Eric`, 82)
  1156. if err != nil {
  1157. t.Fatal(err)
  1158. }
  1159. err = txs1.Close()
  1160. if err != nil {
  1161. t.Fatalf("txs1.Close = %v", err)
  1162. }
  1163. err = txs2.Close()
  1164. if err != nil {
  1165. t.Fatalf("txs1.Close = %v", err)
  1166. }
  1167. err = tx.Rollback()
  1168. if err != nil {
  1169. t.Fatalf("tx.Rollback = %v", err)
  1170. }
  1171. if prepares := numPrepares(t, db) - prepares0; prepares != 2 {
  1172. t.Errorf("executed %d Prepare statements; want 2", prepares)
  1173. }
  1174. }
  1175. // Issue: https://golang.org/issue/2784
  1176. // This test didn't fail before because we got lucky with the fakedb driver.
  1177. // It was failing, and now not, in github.com/bradfitz/go-sql-test
  1178. func TestTxQuery(t *testing.T) {
  1179. db := newTestDB(t, "")
  1180. defer closeDB(t, db)
  1181. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  1182. exec(t, db, "INSERT|t1|name=Alice")
  1183. tx, err := db.Begin()
  1184. if err != nil {
  1185. t.Fatal(err)
  1186. }
  1187. defer tx.Rollback()
  1188. r, err := tx.Query("SELECT|t1|name|")
  1189. if err != nil {
  1190. t.Fatal(err)
  1191. }
  1192. defer r.Close()
  1193. if !r.Next() {
  1194. if r.Err() != nil {
  1195. t.Fatal(r.Err())
  1196. }
  1197. t.Fatal("expected one row")
  1198. }
  1199. var x string
  1200. err = r.Scan(&x)
  1201. if err != nil {
  1202. t.Fatal(err)
  1203. }
  1204. }
  1205. func TestTxQueryInvalid(t *testing.T) {
  1206. db := newTestDB(t, "")
  1207. defer closeDB(t, db)
  1208. tx, err := db.Begin()
  1209. if err != nil {
  1210. t.Fatal(err)
  1211. }
  1212. defer tx.Rollback()
  1213. _, err = tx.Query("SELECT|t1|name|")
  1214. if err == nil {
  1215. t.Fatal("Error expected")
  1216. }
  1217. }
  1218. // Tests fix for issue 4433, that retries in Begin happen when
  1219. // conn.Begin() returns ErrBadConn
  1220. func TestTxErrBadConn(t *testing.T) {
  1221. db, err := Open("test", fakeDBName+";badConn")
  1222. if err != nil {
  1223. t.Fatalf("Open: %v", err)
  1224. }
  1225. if _, err := db.Exec("WIPE"); err != nil {
  1226. t.Fatalf("exec wipe: %v", err)
  1227. }
  1228. defer closeDB(t, db)
  1229. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  1230. stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
  1231. if err != nil {
  1232. t.Fatalf("Stmt, err = %v, %v", stmt, err)
  1233. }
  1234. defer stmt.Close()
  1235. tx, err := db.Begin()
  1236. if err != nil {
  1237. t.Fatalf("Begin = %v", err)
  1238. }
  1239. txs := tx.Stmt(stmt)
  1240. defer txs.Close()
  1241. _, err = txs.Exec("Bobby", 7)
  1242. if err != nil {
  1243. t.Fatalf("Exec = %v", err)
  1244. }
  1245. err = tx.Commit()
  1246. if err != nil {
  1247. t.Fatalf("Commit = %v", err)
  1248. }
  1249. }
  1250. func TestConnQuery(t *testing.T) {
  1251. db := newTestDB(t, "people")
  1252. defer closeDB(t, db)
  1253. ctx, cancel := context.WithCancel(context.Background())
  1254. defer cancel()
  1255. conn, err := db.Conn(ctx)
  1256. if err != nil {
  1257. t.Fatal(err)
  1258. }
  1259. conn.dc.ci.(*fakeConn).skipDirtySession = true
  1260. defer conn.Close()
  1261. var name string
  1262. err = conn.QueryRowContext(ctx, "SELECT|people|name|age=?", 3).Scan(&name)
  1263. if err != nil {
  1264. t.Fatal(err)
  1265. }
  1266. if name != "Chris" {
  1267. t.Fatalf("unexpected result, got %q want Chris", name)
  1268. }
  1269. err = conn.PingContext(ctx)
  1270. if err != nil {
  1271. t.Fatal(err)
  1272. }
  1273. }
  1274. func TestConnRaw(t *testing.T) {
  1275. db := newTestDB(t, "people")
  1276. defer closeDB(t, db)
  1277. ctx, cancel := context.WithCancel(context.Background())
  1278. defer cancel()
  1279. conn, err := db.Conn(ctx)
  1280. if err != nil {
  1281. t.Fatal(err)
  1282. }
  1283. conn.dc.ci.(*fakeConn).skipDirtySession = true
  1284. defer conn.Close()
  1285. sawFunc := false
  1286. err = conn.Raw(func(dc any) error {
  1287. sawFunc = true
  1288. if _, ok := dc.(*fakeConn); !ok {
  1289. return fmt.Errorf("got %T want *fakeConn", dc)
  1290. }
  1291. return nil
  1292. })
  1293. if err != nil {
  1294. t.Fatal(err)
  1295. }
  1296. if !sawFunc {
  1297. t.Fatal("Raw func not called")
  1298. }
  1299. func() {
  1300. defer func() {
  1301. x := recover()
  1302. if x == nil {
  1303. t.Fatal("expected panic")
  1304. }
  1305. conn.closemu.Lock()
  1306. closed := conn.dc == nil
  1307. conn.closemu.Unlock()
  1308. if !closed {
  1309. t.Fatal("expected connection to be closed after panic")
  1310. }
  1311. }()
  1312. err = conn.Raw(func(dc any) error {
  1313. panic("Conn.Raw panic should return an error")
  1314. })
  1315. t.Fatal("expected panic from Raw func")
  1316. }()
  1317. }
  1318. func TestCursorFake(t *testing.T) {
  1319. db := newTestDB(t, "people")
  1320. defer closeDB(t, db)
  1321. ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
  1322. defer cancel()
  1323. exec(t, db, "CREATE|peoplecursor|list=table")
  1324. exec(t, db, "INSERT|peoplecursor|list=people!name!age")
  1325. rows, err := db.QueryContext(ctx, `SELECT|peoplecursor|list|`)
  1326. if err != nil {
  1327. t.Fatal(err)
  1328. }
  1329. defer rows.Close()
  1330. if !rows.Next() {
  1331. t.Fatal("no rows")
  1332. }
  1333. var cursor = &Rows{}
  1334. err = rows.Scan(cursor)
  1335. if err != nil {
  1336. t.Fatal(err)
  1337. }
  1338. defer cursor.Close()
  1339. const expectedRows = 3
  1340. var currentRow int64
  1341. var n int64
  1342. var s string
  1343. for cursor.Next() {
  1344. currentRow++
  1345. err = cursor.Scan(&s, &n)
  1346. if err != nil {
  1347. t.Fatal(err)
  1348. }
  1349. if n != currentRow {
  1350. t.Errorf("expected number(Age)=%d, got %d", currentRow, n)
  1351. }
  1352. }
  1353. if currentRow != expectedRows {
  1354. t.Errorf("expected %d rows, got %d rows", expectedRows, currentRow)
  1355. }
  1356. }
  1357. func TestInvalidNilValues(t *testing.T) {
  1358. var date1 time.Time
  1359. var date2 int
  1360. tests := []struct {
  1361. name string
  1362. input any
  1363. expectedError string
  1364. }{
  1365. {
  1366. name: "time.Time",
  1367. input: &date1,
  1368. expectedError: `sql: Scan error on column index 0, name "bdate": unsupported Scan, storing driver.Value type <nil> into type *time.Time`,
  1369. },
  1370. {
  1371. name: "int",
  1372. input: &date2,
  1373. expectedError: `sql: Scan error on column index 0, name "bdate": converting NULL to int is unsupported`,
  1374. },
  1375. }
  1376. for _, tt := range tests {
  1377. t.Run(tt.name, func(t *testing.T) {
  1378. db := newTestDB(t, "people")
  1379. defer closeDB(t, db)
  1380. ctx, cancel := context.WithCancel(context.Background())
  1381. defer cancel()
  1382. conn, err := db.Conn(ctx)
  1383. if err != nil {
  1384. t.Fatal(err)
  1385. }
  1386. conn.dc.ci.(*fakeConn).skipDirtySession = true
  1387. defer conn.Close()
  1388. err = conn.QueryRowContext(ctx, "SELECT|people|bdate|age=?", 1).Scan(tt.input)
  1389. if err == nil {
  1390. t.Fatal("expected error when querying nil column, but succeeded")
  1391. }
  1392. if err.Error() != tt.expectedError {
  1393. t.Fatalf("Expected error: %s\nReceived: %s", tt.expectedError, err.Error())
  1394. }
  1395. err = conn.PingContext(ctx)
  1396. if err != nil {
  1397. t.Fatal(err)
  1398. }
  1399. })
  1400. }
  1401. }
  1402. func TestConnTx(t *testing.T) {
  1403. db := newTestDB(t, "people")
  1404. defer closeDB(t, db)
  1405. ctx, cancel := context.WithCancel(context.Background())
  1406. defer cancel()
  1407. conn, err := db.Conn(ctx)
  1408. if err != nil {
  1409. t.Fatal(err)
  1410. }
  1411. conn.dc.ci.(*fakeConn).skipDirtySession = true
  1412. defer conn.Close()
  1413. tx, err := conn.BeginTx(ctx, nil)
  1414. if err != nil {
  1415. t.Fatal(err)
  1416. }
  1417. insertName, insertAge := "Nancy", 33
  1418. _, err = tx.ExecContext(ctx, "INSERT|people|name=?,age=?,photo=APHOTO", insertName, insertAge)
  1419. if err != nil {
  1420. t.Fatal(err)
  1421. }
  1422. err = tx.Commit()
  1423. if err != nil {
  1424. t.Fatal(err)
  1425. }
  1426. var selectName string
  1427. err = conn.QueryRowContext(ctx, "SELECT|people|name|age=?", insertAge).Scan(&selectName)
  1428. if err != nil {
  1429. t.Fatal(err)
  1430. }
  1431. if selectName != insertName {
  1432. t.Fatalf("got %q want %q", selectName, insertName)
  1433. }
  1434. }
  1435. // TestConnIsValid verifies that a database connection that should be discarded,
  1436. // is actually discarded and does not re-enter the connection pool.
  1437. // If the IsValid method from *fakeConn is removed, this test will fail.
  1438. func TestConnIsValid(t *testing.T) {
  1439. db := newTestDB(t, "people")
  1440. defer closeDB(t, db)
  1441. db.SetMaxOpenConns(1)
  1442. ctx := context.Background()
  1443. c, err := db.Conn(ctx)
  1444. if err != nil {
  1445. t.Fatal(err)
  1446. }
  1447. err = c.Raw(func(raw any) error {
  1448. dc := raw.(*fakeConn)
  1449. dc.stickyBad = true
  1450. return nil
  1451. })
  1452. if err != nil {
  1453. t.Fatal(err)
  1454. }
  1455. c.Close()
  1456. if len(db.freeConn) > 0 && db.freeConn[0].ci.(*fakeConn).stickyBad {
  1457. t.Fatal("bad connection returned to pool; expected bad connection to be discarded")
  1458. }
  1459. }
  1460. // Tests fix for issue 2542, that we release a lock when querying on
  1461. // a closed connection.
  1462. func TestIssue2542Deadlock(t *testing.T) {
  1463. db := newTestDB(t, "people")
  1464. closeDB(t, db)
  1465. for i := 0; i < 2; i++ {
  1466. _, err := db.Query("SELECT|people|age,name|")
  1467. if err == nil {
  1468. t.Fatalf("expected error")
  1469. }
  1470. }
  1471. }
  1472. // From golang.org/issue/3865
  1473. func TestCloseStmtBeforeRows(t *testing.T) {
  1474. db := newTestDB(t, "people")
  1475. defer closeDB(t, db)
  1476. s, err := db.Prepare("SELECT|people|name|")
  1477. if err != nil {
  1478. t.Fatal(err)
  1479. }
  1480. r, err := s.Query()
  1481. if err != nil {
  1482. s.Close()
  1483. t.Fatal(err)
  1484. }
  1485. err = s.Close()
  1486. if err != nil {
  1487. t.Fatal(err)
  1488. }
  1489. r.Close()
  1490. }
  1491. // Tests fix for issue 2788, that we bind nil to a []byte if the
  1492. // value in the column is sql null
  1493. func TestNullByteSlice(t *testing.T) {
  1494. db := newTestDB(t, "")
  1495. defer closeDB(t, db)
  1496. exec(t, db, "CREATE|t|id=int32,name=nullstring")
  1497. exec(t, db, "INSERT|t|id=10,name=?", nil)
  1498. var name []byte
  1499. err := db.QueryRow("SELECT|t|name|id=?", 10).Scan(&name)
  1500. if err != nil {
  1501. t.Fatal(err)
  1502. }
  1503. if name != nil {
  1504. t.Fatalf("name []byte should be nil for null column value, got: %#v", name)
  1505. }
  1506. exec(t, db, "INSERT|t|id=11,name=?", "bob")
  1507. err = db.QueryRow("SELECT|t|name|id=?", 11).Scan(&name)
  1508. if err != nil {
  1509. t.Fatal(err)
  1510. }
  1511. if string(name) != "bob" {
  1512. t.Fatalf("name []byte should be bob, got: %q", string(name))
  1513. }
  1514. }
  1515. func TestPointerParamsAndScans(t *testing.T) {
  1516. db := newTestDB(t, "")
  1517. defer closeDB(t, db)
  1518. exec(t, db, "CREATE|t|id=int32,name=nullstring")
  1519. bob := "bob"
  1520. var name *string
  1521. name = &bob
  1522. exec(t, db, "INSERT|t|id=10,name=?", name)
  1523. name = nil
  1524. exec(t, db, "INSERT|t|id=20,name=?", name)
  1525. err := db.QueryRow("SELECT|t|name|id=?", 10).Scan(&name)
  1526. if err != nil {
  1527. t.Fatalf("querying id 10: %v", err)
  1528. }
  1529. if name == nil {
  1530. t.Errorf("id 10's name = nil; want bob")
  1531. } else if *name != "bob" {
  1532. t.Errorf("id 10's name = %q; want bob", *name)
  1533. }
  1534. err = db.QueryRow("SELECT|t|name|id=?", 20).Scan(&name)
  1535. if err != nil {
  1536. t.Fatalf("querying id 20: %v", err)
  1537. }
  1538. if name != nil {
  1539. t.Errorf("id 20 = %q; want nil", *name)
  1540. }
  1541. }
  1542. func TestQueryRowClosingStmt(t *testing.T) {
  1543. db := newTestDB(t, "people")
  1544. defer closeDB(t, db)
  1545. var name string
  1546. var age int
  1547. err := db.QueryRow("SELECT|people|age,name|age=?", 3).Scan(&age, &name)
  1548. if err != nil {
  1549. t.Fatal(err)
  1550. }
  1551. if len(db.freeConn) != 1 {
  1552. t.Fatalf("expected 1 free conn")
  1553. }
  1554. fakeConn := db.freeConn[0].ci.(*fakeConn)
  1555. if made, closed := fakeConn.stmtsMade, fakeConn.stmtsClosed; made != closed {
  1556. t.Errorf("statement close mismatch: made %d, closed %d", made, closed)
  1557. }
  1558. }
  1559. var atomicRowsCloseHook atomic.Value // of func(*Rows, *error)
  1560. func init() {
  1561. rowsCloseHook = func() func(*Rows, *error) {
  1562. fn, _ := atomicRowsCloseHook.Load().(func(*Rows, *error))
  1563. return fn
  1564. }
  1565. }
  1566. func setRowsCloseHook(fn func(*Rows, *error)) {
  1567. if fn == nil {
  1568. // Can't change an atomic.Value back to nil, so set it to this
  1569. // no-op func instead.
  1570. fn = func(*Rows, *error) {}
  1571. }
  1572. atomicRowsCloseHook.Store(fn)
  1573. }
  1574. // Test issue 6651
  1575. func TestIssue6651(t *testing.T) {
  1576. db := newTestDB(t, "people")
  1577. defer closeDB(t, db)
  1578. var v string
  1579. want := "error in rows.Next"
  1580. rowsCursorNextHook = func(dest []driver.Value) error {
  1581. return fmt.Errorf(want)
  1582. }
  1583. defer func() { rowsCursorNextHook = nil }()
  1584. err := db.QueryRow("SELECT|people|name|").Scan(&v)
  1585. if err == nil || err.Error() != want {
  1586. t.Errorf("error = %q; want %q", err, want)
  1587. }
  1588. rowsCursorNextHook = nil
  1589. want = "error in rows.Close"
  1590. setRowsCloseHook(func(rows *Rows, err *error) {
  1591. *err = fmt.Errorf(want)
  1592. })
  1593. defer setRowsCloseHook(nil)
  1594. err = db.QueryRow("SELECT|people|name|").Scan(&v)
  1595. if err == nil || err.Error() != want {
  1596. t.Errorf("error = %q; want %q", err, want)
  1597. }
  1598. }
  1599. type nullTestRow struct {
  1600. nullParam any
  1601. notNullParam any
  1602. scanNullVal any
  1603. }
  1604. type nullTestSpec struct {
  1605. nullType string
  1606. notNullType string
  1607. rows [6]nullTestRow
  1608. }
  1609. func TestNullStringParam(t *testing.T) {
  1610. spec := nullTestSpec{"nullstring", "string", [6]nullTestRow{
  1611. {NullString{"aqua", true}, "", NullString{"aqua", true}},
  1612. {NullString{"brown", false}, "", NullString{"", false}},
  1613. {"chartreuse", "", NullString{"chartreuse", true}},
  1614. {NullString{"darkred", true}, "", NullString{"darkred", true}},
  1615. {NullString{"eel", false}, "", NullString{"", false}},
  1616. {"foo", NullString{"black", false}, nil},
  1617. }}
  1618. nullTestRun(t, spec)
  1619. }
  1620. func TestNullInt64Param(t *testing.T) {
  1621. spec := nullTestSpec{"nullint64", "int64", [6]nullTestRow{
  1622. {NullInt64{31, true}, 1, NullInt64{31, true}},
  1623. {NullInt64{-22, false}, 1, NullInt64{0, false}},
  1624. {22, 1, NullInt64{22, true}},
  1625. {NullInt64{33, true}, 1, NullInt64{33, true}},
  1626. {NullInt64{222, false}, 1, NullInt64{0, false}},
  1627. {0, NullInt64{31, false}, nil},
  1628. }}
  1629. nullTestRun(t, spec)
  1630. }
  1631. func TestNullInt32Param(t *testing.T) {
  1632. spec := nullTestSpec{"nullint32", "int32", [6]nullTestRow{
  1633. {NullInt32{31, true}, 1, NullInt32{31, true}},
  1634. {NullInt32{-22, false}, 1, NullInt32{0, false}},
  1635. {22, 1, NullInt32{22, true}},
  1636. {NullInt32{33, true}, 1, NullInt32{33, true}},
  1637. {NullInt32{222, false}, 1, NullInt32{0, false}},
  1638. {0, NullInt32{31, false}, nil},
  1639. }}
  1640. nullTestRun(t, spec)
  1641. }
  1642. func TestNullInt16Param(t *testing.T) {
  1643. spec := nullTestSpec{"nullint16", "int16", [6]nullTestRow{
  1644. {NullInt16{31, true}, 1, NullInt16{31, true}},
  1645. {NullInt16{-22, false}, 1, NullInt16{0, false}},
  1646. {22, 1, NullInt16{22, true}},
  1647. {NullInt16{33, true}, 1, NullInt16{33, true}},
  1648. {NullInt16{222, false}, 1, NullInt16{0, false}},
  1649. {0, NullInt16{31, false}, nil},
  1650. }}
  1651. nullTestRun(t, spec)
  1652. }
  1653. func TestNullByteParam(t *testing.T) {
  1654. spec := nullTestSpec{"nullbyte", "byte", [6]nullTestRow{
  1655. {NullByte{31, true}, 1, NullByte{31, true}},
  1656. {NullByte{0, false}, 1, NullByte{0, false}},
  1657. {22, 1, NullByte{22, true}},
  1658. {NullByte{33, true}, 1, NullByte{33, true}},
  1659. {NullByte{222, false}, 1, NullByte{0, false}},
  1660. {0, NullByte{31, false}, nil},
  1661. }}
  1662. nullTestRun(t, spec)
  1663. }
  1664. func TestNullFloat64Param(t *testing.T) {
  1665. spec := nullTestSpec{"nullfloat64", "float64", [6]nullTestRow{
  1666. {NullFloat64{31.2, true}, 1, NullFloat64{31.2, true}},
  1667. {NullFloat64{13.1, false}, 1, NullFloat64{0, false}},
  1668. {-22.9, 1, NullFloat64{-22.9, true}},
  1669. {NullFloat64{33.81, true}, 1, NullFloat64{33.81, true}},
  1670. {NullFloat64{222, false}, 1, NullFloat64{0, false}},
  1671. {10, NullFloat64{31.2, false}, nil},
  1672. }}
  1673. nullTestRun(t, spec)
  1674. }
  1675. func TestNullBoolParam(t *testing.T) {
  1676. spec := nullTestSpec{"nullbool", "bool", [6]nullTestRow{
  1677. {NullBool{false, true}, true, NullBool{false, true}},
  1678. {NullBool{true, false}, false, NullBool{false, false}},
  1679. {true, true, NullBool{true, true}},
  1680. {NullBool{true, true}, false, NullBool{true, true}},
  1681. {NullBool{true, false}, true, NullBool{false, false}},
  1682. {true, NullBool{true, false}, nil},
  1683. }}
  1684. nullTestRun(t, spec)
  1685. }
  1686. func TestNullTimeParam(t *testing.T) {
  1687. t0 := time.Time{}
  1688. t1 := time.Date(2000, 1, 1, 8, 9, 10, 11, time.UTC)
  1689. t2 := time.Date(2010, 1, 1, 8, 9, 10, 11, time.UTC)
  1690. spec := nullTestSpec{"nulldatetime", "datetime", [6]nullTestRow{
  1691. {NullTime{t1, true}, t2, NullTime{t1, true}},
  1692. {NullTime{t1, false}, t2, NullTime{t0, false}},
  1693. {t1, t2, NullTime{t1, true}},
  1694. {NullTime{t1, true}, t2, NullTime{t1, true}},
  1695. {NullTime{t1, false}, t2, NullTime{t0, false}},
  1696. {t2, NullTime{t1, false}, nil},
  1697. }}
  1698. nullTestRun(t, spec)
  1699. }
  1700. func nullTestRun(t *testing.T, spec nullTestSpec) {
  1701. db := newTestDB(t, "")
  1702. defer closeDB(t, db)
  1703. exec(t, db, fmt.Sprintf("CREATE|t|id=int32,name=string,nullf=%s,notnullf=%s", spec.nullType, spec.notNullType))
  1704. // Inserts with db.Exec:
  1705. exec(t, db, "INSERT|t|id=?,name=?,nullf=?,notnullf=?", 1, "alice", spec.rows[0].nullParam, spec.rows[0].notNullParam)
  1706. exec(t, db, "INSERT|t|id=?,name=?,nullf=?,notnullf=?", 2, "bob", spec.rows[1].nullParam, spec.rows[1].notNullParam)
  1707. // Inserts with a prepared statement:
  1708. stmt, err := db.Prepare("INSERT|t|id=?,name=?,nullf=?,notnullf=?")
  1709. if err != nil {
  1710. t.Fatalf("prepare: %v", err)
  1711. }
  1712. defer stmt.Close()
  1713. if _, err := stmt.Exec(3, "chris", spec.rows[2].nullParam, spec.rows[2].notNullParam); err != nil {
  1714. t.Errorf("exec insert chris: %v", err)
  1715. }
  1716. if _, err := stmt.Exec(4, "dave", spec.rows[3].nullParam, spec.rows[3].notNullParam); err != nil {
  1717. t.Errorf("exec insert dave: %v", err)
  1718. }
  1719. if _, err := stmt.Exec(5, "eleanor", spec.rows[4].nullParam, spec.rows[4].notNullParam); err != nil {
  1720. t.Errorf("exec insert eleanor: %v", err)
  1721. }
  1722. // Can't put null val into non-null col
  1723. if _, err := stmt.Exec(6, "bob", spec.rows[5].nullParam, spec.rows[5].notNullParam); err == nil {
  1724. t.Errorf("expected error inserting nil val with prepared statement Exec")
  1725. }
  1726. _, err = db.Exec("INSERT|t|id=?,name=?,nullf=?", 999, nil, nil)
  1727. if err == nil {
  1728. // TODO: this test fails, but it's just because
  1729. // fakeConn implements the optional Execer interface,
  1730. // so arguably this is the correct behavior. But
  1731. // maybe I should flesh out the fakeConn.Exec
  1732. // implementation so this properly fails.
  1733. // t.Errorf("expected error inserting nil name with Exec")
  1734. }
  1735. paramtype := reflect.TypeOf(spec.rows[0].nullParam)
  1736. bindVal := reflect.New(paramtype).Interface()
  1737. for i := 0; i < 5; i++ {
  1738. id := i + 1
  1739. if err := db.QueryRow("SELECT|t|nullf|id=?", id).Scan(bindVal); err != nil {
  1740. t.Errorf("id=%d Scan: %v", id, err)
  1741. }
  1742. bindValDeref := reflect.ValueOf(bindVal).Elem().Interface()
  1743. if !reflect.DeepEqual(bindValDeref, spec.rows[i].scanNullVal) {
  1744. t.Errorf("id=%d got %#v, want %#v", id, bindValDeref, spec.rows[i].scanNullVal)
  1745. }
  1746. }
  1747. }
  1748. // golang.org/issue/4859
  1749. func TestQueryRowNilScanDest(t *testing.T) {
  1750. db := newTestDB(t, "people")
  1751. defer closeDB(t, db)
  1752. var name *string // nil pointer
  1753. err := db.QueryRow("SELECT|people|name|").Scan(name)
  1754. want := `sql: Scan error on column index 0, name "name": destination pointer is nil`
  1755. if err == nil || err.Error() != want {
  1756. t.Errorf("error = %q; want %q", err.Error(), want)
  1757. }
  1758. }
  1759. func TestIssue4902(t *testing.T) {
  1760. db := newTestDB(t, "people")
  1761. defer closeDB(t, db)
  1762. driver := db.Driver().(*fakeDriver)
  1763. opens0 := driver.openCount
  1764. var stmt *Stmt
  1765. var err error
  1766. for i := 0; i < 10; i++ {
  1767. stmt, err = db.Prepare("SELECT|people|name|")
  1768. if err != nil {
  1769. t.Fatal(err)
  1770. }
  1771. err = stmt.Close()
  1772. if err != nil {
  1773. t.Fatal(err)
  1774. }
  1775. }
  1776. opens := driver.openCount - opens0
  1777. if opens > 1 {
  1778. t.Errorf("opens = %d; want <= 1", opens)
  1779. t.Logf("db = %#v", db)
  1780. t.Logf("driver = %#v", driver)
  1781. t.Logf("stmt = %#v", stmt)
  1782. }
  1783. }
  1784. // Issue 3857
  1785. // This used to deadlock.
  1786. func TestSimultaneousQueries(t *testing.T) {
  1787. db := newTestDB(t, "people")
  1788. defer closeDB(t, db)
  1789. tx, err := db.Begin()
  1790. if err != nil {
  1791. t.Fatal(err)
  1792. }
  1793. defer tx.Rollback()
  1794. r1, err := tx.Query("SELECT|people|name|")
  1795. if err != nil {
  1796. t.Fatal(err)
  1797. }
  1798. defer r1.Close()
  1799. r2, err := tx.Query("SELECT|people|name|")
  1800. if err != nil {
  1801. t.Fatal(err)
  1802. }
  1803. defer r2.Close()
  1804. }
  1805. func TestMaxIdleConns(t *testing.T) {
  1806. db := newTestDB(t, "people")
  1807. defer closeDB(t, db)
  1808. tx, err := db.Begin()
  1809. if err != nil {
  1810. t.Fatal(err)
  1811. }
  1812. tx.Commit()
  1813. if got := len(db.freeConn); got != 1 {
  1814. t.Errorf("freeConns = %d; want 1", got)
  1815. }
  1816. db.SetMaxIdleConns(0)
  1817. if got := len(db.freeConn); got != 0 {
  1818. t.Errorf("freeConns after set to zero = %d; want 0", got)
  1819. }
  1820. tx, err = db.Begin()
  1821. if err != nil {
  1822. t.Fatal(err)
  1823. }
  1824. tx.Commit()
  1825. if got := len(db.freeConn); got != 0 {
  1826. t.Errorf("freeConns = %d; want 0", got)
  1827. }
  1828. }
  1829. func TestMaxOpenConns(t *testing.T) {
  1830. if testing.Short() {
  1831. t.Skip("skipping in short mode")
  1832. }
  1833. defer setHookpostCloseConn(nil)
  1834. setHookpostCloseConn(func(_ *fakeConn, err error) {
  1835. if err != nil {
  1836. t.Errorf("Error closing fakeConn: %v", err)
  1837. }
  1838. })
  1839. db := newTestDB(t, "magicquery")
  1840. defer closeDB(t, db)
  1841. driver := db.Driver().(*fakeDriver)
  1842. // Force the number of open connections to 0 so we can get an accurate
  1843. // count for the test
  1844. db.clearAllConns(t)
  1845. driver.mu.Lock()
  1846. opens0 := driver.openCount
  1847. closes0 := driver.closeCount
  1848. driver.mu.Unlock()
  1849. db.SetMaxIdleConns(10)
  1850. db.SetMaxOpenConns(10)
  1851. stmt, err := db.Prepare("SELECT|magicquery|op|op=?,millis=?")
  1852. if err != nil {
  1853. t.Fatal(err)
  1854. }
  1855. // Start 50 parallel slow queries.
  1856. const (
  1857. nquery = 50
  1858. sleepMillis = 25
  1859. nbatch = 2
  1860. )
  1861. var wg sync.WaitGroup
  1862. for batch := 0; batch < nbatch; batch++ {
  1863. for i := 0; i < nquery; i++ {
  1864. wg.Add(1)
  1865. go func() {
  1866. defer wg.Done()
  1867. var op string
  1868. if err := stmt.QueryRow("sleep", sleepMillis).Scan(&op); err != nil && err != ErrNoRows {
  1869. t.Error(err)
  1870. }
  1871. }()
  1872. }
  1873. // Wait for the batch of queries above to finish before starting the next round.
  1874. wg.Wait()
  1875. }
  1876. if g, w := db.numFreeConns(), 10; g != w {
  1877. t.Errorf("free conns = %d; want %d", g, w)
  1878. }
  1879. if n := db.numDepsPoll(t, 20); n > 20 {
  1880. t.Errorf("number of dependencies = %d; expected <= 20", n)
  1881. db.dumpDeps(t)
  1882. }
  1883. driver.mu.Lock()
  1884. opens := driver.openCount - opens0
  1885. closes := driver.closeCount - closes0
  1886. driver.mu.Unlock()
  1887. if opens > 10 {
  1888. t.Logf("open calls = %d", opens)
  1889. t.Logf("close calls = %d", closes)
  1890. t.Errorf("db connections opened = %d; want <= 10", opens)
  1891. db.dumpDeps(t)
  1892. }
  1893. if err := stmt.Close(); err != nil {
  1894. t.Fatal(err)
  1895. }
  1896. if g, w := db.numFreeConns(), 10; g != w {
  1897. t.Errorf("free conns = %d; want %d", g, w)
  1898. }
  1899. if n := db.numDepsPoll(t, 10); n > 10 {
  1900. t.Errorf("number of dependencies = %d; expected <= 10", n)
  1901. db.dumpDeps(t)
  1902. }
  1903. db.SetMaxOpenConns(5)
  1904. if g, w := db.numFreeConns(), 5; g != w {
  1905. t.Errorf("free conns = %d; want %d", g, w)
  1906. }
  1907. if n := db.numDepsPoll(t, 5); n > 5 {
  1908. t.Errorf("number of dependencies = %d; expected 0", n)
  1909. db.dumpDeps(t)
  1910. }
  1911. db.SetMaxOpenConns(0)
  1912. if g, w := db.numFreeConns(), 5; g != w {
  1913. t.Errorf("free conns = %d; want %d", g, w)
  1914. }
  1915. if n := db.numDepsPoll(t, 5); n > 5 {
  1916. t.Errorf("number of dependencies = %d; expected 0", n)
  1917. db.dumpDeps(t)
  1918. }
  1919. db.clearAllConns(t)
  1920. }
  1921. // Issue 9453: tests that SetMaxOpenConns can be lowered at runtime
  1922. // and affects the subsequent release of connections.
  1923. func TestMaxOpenConnsOnBusy(t *testing.T) {
  1924. defer setHookpostCloseConn(nil)
  1925. setHookpostCloseConn(func(_ *fakeConn, err error) {
  1926. if err != nil {
  1927. t.Errorf("Error closing fakeConn: %v", err)
  1928. }
  1929. })
  1930. db := newTestDB(t, "magicquery")
  1931. defer closeDB(t, db)
  1932. db.SetMaxOpenConns(3)
  1933. ctx := context.Background()
  1934. conn0, err := db.conn(ctx, cachedOrNewConn)
  1935. if err != nil {
  1936. t.Fatalf("db open conn fail: %v", err)
  1937. }
  1938. conn1, err := db.conn(ctx, cachedOrNewConn)
  1939. if err != nil {
  1940. t.Fatalf("db open conn fail: %v", err)
  1941. }
  1942. conn2, err := db.conn(ctx, cachedOrNewConn)
  1943. if err != nil {
  1944. t.Fatalf("db open conn fail: %v", err)
  1945. }
  1946. if g, w := db.numOpen, 3; g != w {
  1947. t.Errorf("free conns = %d; want %d", g, w)
  1948. }
  1949. db.SetMaxOpenConns(2)
  1950. if g, w := db.numOpen, 3; g != w {
  1951. t.Errorf("free conns = %d; want %d", g, w)
  1952. }
  1953. conn0.releaseConn(nil)
  1954. conn1.releaseConn(nil)
  1955. if g, w := db.numOpen, 2; g != w {
  1956. t.Errorf("free conns = %d; want %d", g, w)
  1957. }
  1958. conn2.releaseConn(nil)
  1959. if g, w := db.numOpen, 2; g != w {
  1960. t.Errorf("free conns = %d; want %d", g, w)
  1961. }
  1962. }
  1963. // Issue 10886: tests that all connection attempts return when more than
  1964. // DB.maxOpen connections are in flight and the first DB.maxOpen fail.
  1965. func TestPendingConnsAfterErr(t *testing.T) {
  1966. const (
  1967. maxOpen = 2
  1968. tryOpen = maxOpen*2 + 2
  1969. )
  1970. // No queries will be run.
  1971. db, err := Open("test", fakeDBName)
  1972. if err != nil {
  1973. t.Fatalf("Open: %v", err)
  1974. }
  1975. defer closeDB(t, db)
  1976. defer func() {
  1977. for k, v := range db.lastPut {
  1978. t.Logf("%p: %v", k, v)
  1979. }
  1980. }()
  1981. db.SetMaxOpenConns(maxOpen)
  1982. db.SetMaxIdleConns(0)
  1983. errOffline := errors.New("db offline")
  1984. defer func() { setHookOpenErr(nil) }()
  1985. errs := make(chan error, tryOpen)
  1986. var opening sync.WaitGroup
  1987. opening.Add(tryOpen)
  1988. setHookOpenErr(func() error {
  1989. // Wait for all connections to enqueue.
  1990. opening.Wait()
  1991. return errOffline
  1992. })
  1993. for i := 0; i < tryOpen; i++ {
  1994. go func() {
  1995. opening.Done() // signal one connection is in flight
  1996. _, err := db.Exec("will never run")
  1997. errs <- err
  1998. }()
  1999. }
  2000. opening.Wait() // wait for all workers to begin running
  2001. const timeout = 5 * time.Second
  2002. to := time.NewTimer(timeout)
  2003. defer to.Stop()
  2004. // check that all connections fail without deadlock
  2005. for i := 0; i < tryOpen; i++ {
  2006. select {
  2007. case err := <-errs:
  2008. if got, want := err, errOffline; got != want {
  2009. t.Errorf("unexpected err: got %v, want %v", got, want)
  2010. }
  2011. case <-to.C:
  2012. t.Fatalf("orphaned connection request(s), still waiting after %v", timeout)
  2013. }
  2014. }
  2015. // Wait a reasonable time for the database to close all connections.
  2016. tick := time.NewTicker(3 * time.Millisecond)
  2017. defer tick.Stop()
  2018. for {
  2019. select {
  2020. case <-tick.C:
  2021. db.mu.Lock()
  2022. if db.numOpen == 0 {
  2023. db.mu.Unlock()
  2024. return
  2025. }
  2026. db.mu.Unlock()
  2027. case <-to.C:
  2028. // Closing the database will check for numOpen and fail the test.
  2029. return
  2030. }
  2031. }
  2032. }
  2033. func TestSingleOpenConn(t *testing.T) {
  2034. db := newTestDB(t, "people")
  2035. defer closeDB(t, db)
  2036. db.SetMaxOpenConns(1)
  2037. rows, err := db.Query("SELECT|people|name|")
  2038. if err != nil {
  2039. t.Fatal(err)
  2040. }
  2041. if err = rows.Close(); err != nil {
  2042. t.Fatal(err)
  2043. }
  2044. // shouldn't deadlock
  2045. rows, err = db.Query("SELECT|people|name|")
  2046. if err != nil {
  2047. t.Fatal(err)
  2048. }
  2049. if err = rows.Close(); err != nil {
  2050. t.Fatal(err)
  2051. }
  2052. }
  2053. func TestStats(t *testing.T) {
  2054. db := newTestDB(t, "people")
  2055. stats := db.Stats()
  2056. if got := stats.OpenConnections; got != 1 {
  2057. t.Errorf("stats.OpenConnections = %d; want 1", got)
  2058. }
  2059. tx, err := db.Begin()
  2060. if err != nil {
  2061. t.Fatal(err)
  2062. }
  2063. tx.Commit()
  2064. closeDB(t, db)
  2065. stats = db.Stats()
  2066. if got := stats.OpenConnections; got != 0 {
  2067. t.Errorf("stats.OpenConnections = %d; want 0", got)
  2068. }
  2069. }
  2070. func TestConnMaxLifetime(t *testing.T) {
  2071. t0 := time.Unix(1000000, 0)
  2072. offset := time.Duration(0)
  2073. nowFunc = func() time.Time { return t0.Add(offset) }
  2074. defer func() { nowFunc = time.Now }()
  2075. db := newTestDB(t, "magicquery")
  2076. defer closeDB(t, db)
  2077. driver := db.Driver().(*fakeDriver)
  2078. // Force the number of open connections to 0 so we can get an accurate
  2079. // count for the test
  2080. db.clearAllConns(t)
  2081. driver.mu.Lock()
  2082. opens0 := driver.openCount
  2083. closes0 := driver.closeCount
  2084. driver.mu.Unlock()
  2085. db.SetMaxIdleConns(10)
  2086. db.SetMaxOpenConns(10)
  2087. tx, err := db.Begin()
  2088. if err != nil {
  2089. t.Fatal(err)
  2090. }
  2091. offset = time.Second
  2092. tx2, err := db.Begin()
  2093. if err != nil {
  2094. t.Fatal(err)
  2095. }
  2096. tx.Commit()
  2097. tx2.Commit()
  2098. driver.mu.Lock()
  2099. opens := driver.openCount - opens0
  2100. closes := driver.closeCount - closes0
  2101. driver.mu.Unlock()
  2102. if opens != 2 {
  2103. t.Errorf("opens = %d; want 2", opens)
  2104. }
  2105. if closes != 0 {
  2106. t.Errorf("closes = %d; want 0", closes)
  2107. }
  2108. if g, w := db.numFreeConns(), 2; g != w {
  2109. t.Errorf("free conns = %d; want %d", g, w)
  2110. }
  2111. // Expire first conn
  2112. offset = 11 * time.Second
  2113. db.SetConnMaxLifetime(10 * time.Second)
  2114. if err != nil {
  2115. t.Fatal(err)
  2116. }
  2117. tx, err = db.Begin()
  2118. if err != nil {
  2119. t.Fatal(err)
  2120. }
  2121. tx2, err = db.Begin()
  2122. if err != nil {
  2123. t.Fatal(err)
  2124. }
  2125. tx.Commit()
  2126. tx2.Commit()
  2127. // Give connectionCleaner chance to run.
  2128. waitCondition(t, func() bool {
  2129. driver.mu.Lock()
  2130. opens = driver.openCount - opens0
  2131. closes = driver.closeCount - closes0
  2132. driver.mu.Unlock()
  2133. return closes == 1
  2134. })
  2135. if opens != 3 {
  2136. t.Errorf("opens = %d; want 3", opens)
  2137. }
  2138. if closes != 1 {
  2139. t.Errorf("closes = %d; want 1", closes)
  2140. }
  2141. if s := db.Stats(); s.MaxLifetimeClosed != 1 {
  2142. t.Errorf("MaxLifetimeClosed = %d; want 1 %#v", s.MaxLifetimeClosed, s)
  2143. }
  2144. }
  2145. // golang.org/issue/5323
  2146. func TestStmtCloseDeps(t *testing.T) {
  2147. if testing.Short() {
  2148. t.Skip("skipping in short mode")
  2149. }
  2150. defer setHookpostCloseConn(nil)
  2151. setHookpostCloseConn(func(_ *fakeConn, err error) {
  2152. if err != nil {
  2153. t.Errorf("Error closing fakeConn: %v", err)
  2154. }
  2155. })
  2156. db := newTestDB(t, "magicquery")
  2157. defer closeDB(t, db)
  2158. driver := db.Driver().(*fakeDriver)
  2159. driver.mu.Lock()
  2160. opens0 := driver.openCount
  2161. closes0 := driver.closeCount
  2162. driver.mu.Unlock()
  2163. openDelta0 := opens0 - closes0
  2164. stmt, err := db.Prepare("SELECT|magicquery|op|op=?,millis=?")
  2165. if err != nil {
  2166. t.Fatal(err)
  2167. }
  2168. // Start 50 parallel slow queries.
  2169. const (
  2170. nquery = 50
  2171. sleepMillis = 25
  2172. nbatch = 2
  2173. )
  2174. var wg sync.WaitGroup
  2175. for batch := 0; batch < nbatch; batch++ {
  2176. for i := 0; i < nquery; i++ {
  2177. wg.Add(1)
  2178. go func() {
  2179. defer wg.Done()
  2180. var op string
  2181. if err := stmt.QueryRow("sleep", sleepMillis).Scan(&op); err != nil && err != ErrNoRows {
  2182. t.Error(err)
  2183. }
  2184. }()
  2185. }
  2186. // Wait for the batch of queries above to finish before starting the next round.
  2187. wg.Wait()
  2188. }
  2189. if g, w := db.numFreeConns(), 2; g != w {
  2190. t.Errorf("free conns = %d; want %d", g, w)
  2191. }
  2192. if n := db.numDepsPoll(t, 4); n > 4 {
  2193. t.Errorf("number of dependencies = %d; expected <= 4", n)
  2194. db.dumpDeps(t)
  2195. }
  2196. driver.mu.Lock()
  2197. opens := driver.openCount - opens0
  2198. closes := driver.closeCount - closes0
  2199. openDelta := (driver.openCount - driver.closeCount) - openDelta0
  2200. driver.mu.Unlock()
  2201. if openDelta > 2 {
  2202. t.Logf("open calls = %d", opens)
  2203. t.Logf("close calls = %d", closes)
  2204. t.Logf("open delta = %d", openDelta)
  2205. t.Errorf("db connections opened = %d; want <= 2", openDelta)
  2206. db.dumpDeps(t)
  2207. }
  2208. if !waitCondition(t, func() bool {
  2209. return len(stmt.css) <= nquery
  2210. }) {
  2211. t.Errorf("len(stmt.css) = %d; want <= %d", len(stmt.css), nquery)
  2212. }
  2213. if err := stmt.Close(); err != nil {
  2214. t.Fatal(err)
  2215. }
  2216. if g, w := db.numFreeConns(), 2; g != w {
  2217. t.Errorf("free conns = %d; want %d", g, w)
  2218. }
  2219. if n := db.numDepsPoll(t, 2); n > 2 {
  2220. t.Errorf("number of dependencies = %d; expected <= 2", n)
  2221. db.dumpDeps(t)
  2222. }
  2223. db.clearAllConns(t)
  2224. }
  2225. // golang.org/issue/5046
  2226. func TestCloseConnBeforeStmts(t *testing.T) {
  2227. db := newTestDB(t, "people")
  2228. defer closeDB(t, db)
  2229. defer setHookpostCloseConn(nil)
  2230. setHookpostCloseConn(func(_ *fakeConn, err error) {
  2231. if err != nil {
  2232. t.Errorf("Error closing fakeConn: %v; from %s", err, stack())
  2233. db.dumpDeps(t)
  2234. t.Errorf("DB = %#v", db)
  2235. }
  2236. })
  2237. stmt, err := db.Prepare("SELECT|people|name|")
  2238. if err != nil {
  2239. t.Fatal(err)
  2240. }
  2241. if len(db.freeConn) != 1 {
  2242. t.Fatalf("expected 1 freeConn; got %d", len(db.freeConn))
  2243. }
  2244. dc := db.freeConn[0]
  2245. if dc.closed {
  2246. t.Errorf("conn shouldn't be closed")
  2247. }
  2248. if n := len(dc.openStmt); n != 1 {
  2249. t.Errorf("driverConn num openStmt = %d; want 1", n)
  2250. }
  2251. err = db.Close()
  2252. if err != nil {
  2253. t.Errorf("db Close = %v", err)
  2254. }
  2255. if !dc.closed {
  2256. t.Errorf("after db.Close, driverConn should be closed")
  2257. }
  2258. if n := len(dc.openStmt); n != 0 {
  2259. t.Errorf("driverConn num openStmt = %d; want 0", n)
  2260. }
  2261. err = stmt.Close()
  2262. if err != nil {
  2263. t.Errorf("Stmt close = %v", err)
  2264. }
  2265. if !dc.closed {
  2266. t.Errorf("conn should be closed")
  2267. }
  2268. if dc.ci != nil {
  2269. t.Errorf("after Stmt Close, driverConn's Conn interface should be nil")
  2270. }
  2271. }
  2272. // golang.org/issue/5283: don't release the Rows' connection in Close
  2273. // before calling Stmt.Close.
  2274. func TestRowsCloseOrder(t *testing.T) {
  2275. db := newTestDB(t, "people")
  2276. defer closeDB(t, db)
  2277. db.SetMaxIdleConns(0)
  2278. setStrictFakeConnClose(t)
  2279. defer setStrictFakeConnClose(nil)
  2280. rows, err := db.Query("SELECT|people|age,name|")
  2281. if err != nil {
  2282. t.Fatal(err)
  2283. }
  2284. err = rows.Close()
  2285. if err != nil {
  2286. t.Fatal(err)
  2287. }
  2288. }
  2289. func TestRowsImplicitClose(t *testing.T) {
  2290. db := newTestDB(t, "people")
  2291. defer closeDB(t, db)
  2292. rows, err := db.Query("SELECT|people|age,name|")
  2293. if err != nil {
  2294. t.Fatal(err)
  2295. }
  2296. want, fail := 2, errors.New("fail")
  2297. r := rows.rowsi.(*rowsCursor)
  2298. r.errPos, r.err = want, fail
  2299. got := 0
  2300. for rows.Next() {
  2301. got++
  2302. }
  2303. if got != want {
  2304. t.Errorf("got %d rows, want %d", got, want)
  2305. }
  2306. if err := rows.Err(); err != fail {
  2307. t.Errorf("got error %v, want %v", err, fail)
  2308. }
  2309. if !r.closed {
  2310. t.Errorf("r.closed is false, want true")
  2311. }
  2312. }
  2313. func TestStmtCloseOrder(t *testing.T) {
  2314. db := newTestDB(t, "people")
  2315. defer closeDB(t, db)
  2316. db.SetMaxIdleConns(0)
  2317. setStrictFakeConnClose(t)
  2318. defer setStrictFakeConnClose(nil)
  2319. _, err := db.Query("SELECT|non_existent|name|")
  2320. if err == nil {
  2321. t.Fatal("Querying non-existent table should fail")
  2322. }
  2323. }
  2324. // Test cases where there's more than maxBadConnRetries bad connections in the
  2325. // pool (issue 8834)
  2326. func TestManyErrBadConn(t *testing.T) {
  2327. manyErrBadConnSetup := func(first ...func(db *DB)) *DB {
  2328. db := newTestDB(t, "people")
  2329. for _, f := range first {
  2330. f(db)
  2331. }
  2332. nconn := maxBadConnRetries + 1
  2333. db.SetMaxIdleConns(nconn)
  2334. db.SetMaxOpenConns(nconn)
  2335. // open enough connections
  2336. func() {
  2337. for i := 0; i < nconn; i++ {
  2338. rows, err := db.Query("SELECT|people|age,name|")
  2339. if err != nil {
  2340. t.Fatal(err)
  2341. }
  2342. defer rows.Close()
  2343. }
  2344. }()
  2345. db.mu.Lock()
  2346. defer db.mu.Unlock()
  2347. if db.numOpen != nconn {
  2348. t.Fatalf("unexpected numOpen %d (was expecting %d)", db.numOpen, nconn)
  2349. } else if len(db.freeConn) != nconn {
  2350. t.Fatalf("unexpected len(db.freeConn) %d (was expecting %d)", len(db.freeConn), nconn)
  2351. }
  2352. for _, conn := range db.freeConn {
  2353. conn.Lock()
  2354. conn.ci.(*fakeConn).stickyBad = true
  2355. conn.Unlock()
  2356. }
  2357. return db
  2358. }
  2359. // Query
  2360. db := manyErrBadConnSetup()
  2361. defer closeDB(t, db)
  2362. rows, err := db.Query("SELECT|people|age,name|")
  2363. if err != nil {
  2364. t.Fatal(err)
  2365. }
  2366. if err = rows.Close(); err != nil {
  2367. t.Fatal(err)
  2368. }
  2369. // Exec
  2370. db = manyErrBadConnSetup()
  2371. defer closeDB(t, db)
  2372. _, err = db.Exec("INSERT|people|name=Julia,age=19")
  2373. if err != nil {
  2374. t.Fatal(err)
  2375. }
  2376. // Begin
  2377. db = manyErrBadConnSetup()
  2378. defer closeDB(t, db)
  2379. tx, err := db.Begin()
  2380. if err != nil {
  2381. t.Fatal(err)
  2382. }
  2383. if err = tx.Rollback(); err != nil {
  2384. t.Fatal(err)
  2385. }
  2386. // Prepare
  2387. db = manyErrBadConnSetup()
  2388. defer closeDB(t, db)
  2389. stmt, err := db.Prepare("SELECT|people|age,name|")
  2390. if err != nil {
  2391. t.Fatal(err)
  2392. }
  2393. if err = stmt.Close(); err != nil {
  2394. t.Fatal(err)
  2395. }
  2396. // Stmt.Exec
  2397. db = manyErrBadConnSetup(func(db *DB) {
  2398. stmt, err = db.Prepare("INSERT|people|name=Julia,age=19")
  2399. if err != nil {
  2400. t.Fatal(err)
  2401. }
  2402. })
  2403. defer closeDB(t, db)
  2404. _, err = stmt.Exec()
  2405. if err != nil {
  2406. t.Fatal(err)
  2407. }
  2408. if err = stmt.Close(); err != nil {
  2409. t.Fatal(err)
  2410. }
  2411. // Stmt.Query
  2412. db = manyErrBadConnSetup(func(db *DB) {
  2413. stmt, err = db.Prepare("SELECT|people|age,name|")
  2414. if err != nil {
  2415. t.Fatal(err)
  2416. }
  2417. })
  2418. defer closeDB(t, db)
  2419. rows, err = stmt.Query()
  2420. if err != nil {
  2421. t.Fatal(err)
  2422. }
  2423. if err = rows.Close(); err != nil {
  2424. t.Fatal(err)
  2425. }
  2426. if err = stmt.Close(); err != nil {
  2427. t.Fatal(err)
  2428. }
  2429. // Conn
  2430. db = manyErrBadConnSetup()
  2431. defer closeDB(t, db)
  2432. ctx, cancel := context.WithCancel(context.Background())
  2433. defer cancel()
  2434. conn, err := db.Conn(ctx)
  2435. if err != nil {
  2436. t.Fatal(err)
  2437. }
  2438. conn.dc.ci.(*fakeConn).skipDirtySession = true
  2439. err = conn.Close()
  2440. if err != nil {
  2441. t.Fatal(err)
  2442. }
  2443. // Ping
  2444. db = manyErrBadConnSetup()
  2445. defer closeDB(t, db)
  2446. err = db.PingContext(ctx)
  2447. if err != nil {
  2448. t.Fatal(err)
  2449. }
  2450. }
  2451. // Issue 34775: Ensure that a Tx cannot commit after a rollback.
  2452. func TestTxCannotCommitAfterRollback(t *testing.T) {
  2453. db := newTestDB(t, "tx_status")
  2454. defer closeDB(t, db)
  2455. // First check query reporting is correct.
  2456. var txStatus string
  2457. err := db.QueryRow("SELECT|tx_status|tx_status|").Scan(&txStatus)
  2458. if err != nil {
  2459. t.Fatal(err)
  2460. }
  2461. if g, w := txStatus, "autocommit"; g != w {
  2462. t.Fatalf("tx_status=%q, wanted %q", g, w)
  2463. }
  2464. ctx, cancel := context.WithCancel(context.Background())
  2465. defer cancel()
  2466. tx, err := db.BeginTx(ctx, nil)
  2467. if err != nil {
  2468. t.Fatal(err)
  2469. }
  2470. // Ignore dirty session for this test.
  2471. // A failing test should trigger the dirty session flag as well,
  2472. // but that isn't exactly what this should test for.
  2473. tx.txi.(*fakeTx).c.skipDirtySession = true
  2474. defer tx.Rollback()
  2475. err = tx.QueryRow("SELECT|tx_status|tx_status|").Scan(&txStatus)
  2476. if err != nil {
  2477. t.Fatal(err)
  2478. }
  2479. if g, w := txStatus, "transaction"; g != w {
  2480. t.Fatalf("tx_status=%q, wanted %q", g, w)
  2481. }
  2482. // 1. Begin a transaction.
  2483. // 2. (A) Start a query, (B) begin Tx rollback through a ctx cancel.
  2484. // 3. Check if 2.A has committed in Tx (pass) or outside of Tx (fail).
  2485. sendQuery := make(chan struct{})
  2486. // The Tx status is returned through the row results, ensure
  2487. // that the rows results are not canceled.
  2488. bypassRowsAwaitDone = true
  2489. hookTxGrabConn = func() {
  2490. cancel()
  2491. <-sendQuery
  2492. }
  2493. rollbackHook = func() {
  2494. close(sendQuery)
  2495. }
  2496. defer func() {
  2497. hookTxGrabConn = nil
  2498. rollbackHook = nil
  2499. bypassRowsAwaitDone = false
  2500. }()
  2501. err = tx.QueryRow("SELECT|tx_status|tx_status|").Scan(&txStatus)
  2502. if err != nil {
  2503. // A failure here would be expected if skipDirtySession was not set to true above.
  2504. t.Fatal(err)
  2505. }
  2506. if g, w := txStatus, "transaction"; g != w {
  2507. t.Fatalf("tx_status=%q, wanted %q", g, w)
  2508. }
  2509. }
  2510. // Issue 40985 transaction statement deadlock while context cancel.
  2511. func TestTxStmtDeadlock(t *testing.T) {
  2512. db := newTestDB(t, "people")
  2513. defer closeDB(t, db)
  2514. ctx, cancel := context.WithCancel(context.Background())
  2515. defer cancel()
  2516. tx, err := db.BeginTx(ctx, nil)
  2517. if err != nil {
  2518. t.Fatal(err)
  2519. }
  2520. stmt, err := tx.Prepare("SELECT|people|name,age|age=?")
  2521. if err != nil {
  2522. t.Fatal(err)
  2523. }
  2524. cancel()
  2525. // Run number of stmt queries to reproduce deadlock from context cancel
  2526. for i := 0; i < 1e3; i++ {
  2527. // Encounter any close related errors (e.g. ErrTxDone, stmt is closed)
  2528. // is expected due to context cancel.
  2529. _, err = stmt.Query(1)
  2530. if err != nil {
  2531. break
  2532. }
  2533. }
  2534. _ = tx.Rollback()
  2535. }
  2536. // Issue32530 encounters an issue where a connection may
  2537. // expire right after it comes out of a used connection pool
  2538. // even when a new connection is requested.
  2539. func TestConnExpiresFreshOutOfPool(t *testing.T) {
  2540. execCases := []struct {
  2541. expired bool
  2542. badReset bool
  2543. }{
  2544. {false, false},
  2545. {true, false},
  2546. {false, true},
  2547. }
  2548. t0 := time.Unix(1000000, 0)
  2549. offset := time.Duration(0)
  2550. offsetMu := sync.RWMutex{}
  2551. nowFunc = func() time.Time {
  2552. offsetMu.RLock()
  2553. defer offsetMu.RUnlock()
  2554. return t0.Add(offset)
  2555. }
  2556. defer func() { nowFunc = time.Now }()
  2557. ctx, cancel := context.WithCancel(context.Background())
  2558. defer cancel()
  2559. db := newTestDB(t, "magicquery")
  2560. defer closeDB(t, db)
  2561. db.SetMaxOpenConns(1)
  2562. for _, ec := range execCases {
  2563. ec := ec
  2564. name := fmt.Sprintf("expired=%t,badReset=%t", ec.expired, ec.badReset)
  2565. t.Run(name, func(t *testing.T) {
  2566. db.clearAllConns(t)
  2567. db.SetMaxIdleConns(1)
  2568. db.SetConnMaxLifetime(10 * time.Second)
  2569. conn, err := db.conn(ctx, alwaysNewConn)
  2570. if err != nil {
  2571. t.Fatal(err)
  2572. }
  2573. afterPutConn := make(chan struct{})
  2574. waitingForConn := make(chan struct{})
  2575. go func() {
  2576. defer close(afterPutConn)
  2577. conn, err := db.conn(ctx, alwaysNewConn)
  2578. if err == nil {
  2579. db.putConn(conn, err, false)
  2580. } else {
  2581. t.Errorf("db.conn: %v", err)
  2582. }
  2583. }()
  2584. go func() {
  2585. defer close(waitingForConn)
  2586. for {
  2587. if t.Failed() {
  2588. return
  2589. }
  2590. db.mu.Lock()
  2591. ct := len(db.connRequests)
  2592. db.mu.Unlock()
  2593. if ct > 0 {
  2594. return
  2595. }
  2596. time.Sleep(pollDuration)
  2597. }
  2598. }()
  2599. <-waitingForConn
  2600. if t.Failed() {
  2601. return
  2602. }
  2603. offsetMu.Lock()
  2604. if ec.expired {
  2605. offset = 11 * time.Second
  2606. } else {
  2607. offset = time.Duration(0)
  2608. }
  2609. offsetMu.Unlock()
  2610. conn.ci.(*fakeConn).stickyBad = ec.badReset
  2611. db.putConn(conn, err, true)
  2612. <-afterPutConn
  2613. })
  2614. }
  2615. }
  2616. // TestIssue20575 ensures the Rows from query does not block
  2617. // closing a transaction. Ensure Rows is closed while closing a trasaction.
  2618. func TestIssue20575(t *testing.T) {
  2619. db := newTestDB(t, "people")
  2620. defer closeDB(t, db)
  2621. tx, err := db.Begin()
  2622. if err != nil {
  2623. t.Fatal(err)
  2624. }
  2625. ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
  2626. defer cancel()
  2627. _, err = tx.QueryContext(ctx, "SELECT|people|age,name|")
  2628. if err != nil {
  2629. t.Fatal(err)
  2630. }
  2631. // Do not close Rows from QueryContext.
  2632. err = tx.Rollback()
  2633. if err != nil {
  2634. t.Fatal(err)
  2635. }
  2636. select {
  2637. default:
  2638. case <-ctx.Done():
  2639. t.Fatal("timeout: failed to rollback query without closing rows:", ctx.Err())
  2640. }
  2641. }
  2642. // TestIssue20622 tests closing the transaction before rows is closed, requires
  2643. // the race detector to fail.
  2644. func TestIssue20622(t *testing.T) {
  2645. db := newTestDB(t, "people")
  2646. defer closeDB(t, db)
  2647. ctx, cancel := context.WithCancel(context.Background())
  2648. defer cancel()
  2649. tx, err := db.BeginTx(ctx, nil)
  2650. if err != nil {
  2651. t.Fatal(err)
  2652. }
  2653. rows, err := tx.Query("SELECT|people|age,name|")
  2654. if err != nil {
  2655. t.Fatal(err)
  2656. }
  2657. count := 0
  2658. for rows.Next() {
  2659. count++
  2660. var age int
  2661. var name string
  2662. if err := rows.Scan(&age, &name); err != nil {
  2663. t.Fatal("scan failed", err)
  2664. }
  2665. if count == 1 {
  2666. cancel()
  2667. }
  2668. time.Sleep(100 * time.Millisecond)
  2669. }
  2670. rows.Close()
  2671. tx.Commit()
  2672. }
  2673. // golang.org/issue/5718
  2674. func TestErrBadConnReconnect(t *testing.T) {
  2675. db := newTestDB(t, "foo")
  2676. defer closeDB(t, db)
  2677. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  2678. simulateBadConn := func(name string, hook *func() bool, op func() error) {
  2679. broken, retried := false, false
  2680. numOpen := db.numOpen
  2681. // simulate a broken connection on the first try
  2682. *hook = func() bool {
  2683. if !broken {
  2684. broken = true
  2685. return true
  2686. }
  2687. retried = true
  2688. return false
  2689. }
  2690. if err := op(); err != nil {
  2691. t.Errorf(name+": %v", err)
  2692. return
  2693. }
  2694. if !broken || !retried {
  2695. t.Error(name + ": Failed to simulate broken connection")
  2696. }
  2697. *hook = nil
  2698. if numOpen != db.numOpen {
  2699. t.Errorf(name+": leaked %d connection(s)!", db.numOpen-numOpen)
  2700. numOpen = db.numOpen
  2701. }
  2702. }
  2703. // db.Exec
  2704. dbExec := func() error {
  2705. _, err := db.Exec("INSERT|t1|name=?,age=?,dead=?", "Gordon", 3, true)
  2706. return err
  2707. }
  2708. simulateBadConn("db.Exec prepare", &hookPrepareBadConn, dbExec)
  2709. simulateBadConn("db.Exec exec", &hookExecBadConn, dbExec)
  2710. // db.Query
  2711. dbQuery := func() error {
  2712. rows, err := db.Query("SELECT|t1|age,name|")
  2713. if err == nil {
  2714. err = rows.Close()
  2715. }
  2716. return err
  2717. }
  2718. simulateBadConn("db.Query prepare", &hookPrepareBadConn, dbQuery)
  2719. simulateBadConn("db.Query query", &hookQueryBadConn, dbQuery)
  2720. // db.Prepare
  2721. simulateBadConn("db.Prepare", &hookPrepareBadConn, func() error {
  2722. stmt, err := db.Prepare("INSERT|t1|name=?,age=?,dead=?")
  2723. if err != nil {
  2724. return err
  2725. }
  2726. stmt.Close()
  2727. return nil
  2728. })
  2729. // Provide a way to force a re-prepare of a statement on next execution
  2730. forcePrepare := func(stmt *Stmt) {
  2731. stmt.css = nil
  2732. }
  2733. // stmt.Exec
  2734. stmt1, err := db.Prepare("INSERT|t1|name=?,age=?,dead=?")
  2735. if err != nil {
  2736. t.Fatalf("prepare: %v", err)
  2737. }
  2738. defer stmt1.Close()
  2739. // make sure we must prepare the stmt first
  2740. forcePrepare(stmt1)
  2741. stmtExec := func() error {
  2742. _, err := stmt1.Exec("Gopher", 3, false)
  2743. return err
  2744. }
  2745. simulateBadConn("stmt.Exec prepare", &hookPrepareBadConn, stmtExec)
  2746. simulateBadConn("stmt.Exec exec", &hookExecBadConn, stmtExec)
  2747. // stmt.Query
  2748. stmt2, err := db.Prepare("SELECT|t1|age,name|")
  2749. if err != nil {
  2750. t.Fatalf("prepare: %v", err)
  2751. }
  2752. defer stmt2.Close()
  2753. // make sure we must prepare the stmt first
  2754. forcePrepare(stmt2)
  2755. stmtQuery := func() error {
  2756. rows, err := stmt2.Query()
  2757. if err == nil {
  2758. err = rows.Close()
  2759. }
  2760. return err
  2761. }
  2762. simulateBadConn("stmt.Query prepare", &hookPrepareBadConn, stmtQuery)
  2763. simulateBadConn("stmt.Query exec", &hookQueryBadConn, stmtQuery)
  2764. }
  2765. // golang.org/issue/11264
  2766. func TestTxEndBadConn(t *testing.T) {
  2767. db := newTestDB(t, "foo")
  2768. defer closeDB(t, db)
  2769. db.SetMaxIdleConns(0)
  2770. exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
  2771. db.SetMaxIdleConns(1)
  2772. simulateBadConn := func(name string, hook *func() bool, op func() error) {
  2773. broken := false
  2774. numOpen := db.numOpen
  2775. *hook = func() bool {
  2776. if !broken {
  2777. broken = true
  2778. }
  2779. return broken
  2780. }
  2781. if err := op(); !errors.Is(err, driver.ErrBadConn) {
  2782. t.Errorf(name+": %v", err)
  2783. return
  2784. }
  2785. if !broken {
  2786. t.Error(name + ": Failed to simulate broken connection")
  2787. }
  2788. *hook = nil
  2789. if numOpen != db.numOpen {
  2790. t.Errorf(name+": leaked %d connection(s)!", db.numOpen-numOpen)
  2791. }
  2792. }
  2793. // db.Exec
  2794. dbExec := func(endTx func(tx *Tx) error) func() error {
  2795. return func() error {
  2796. tx, err := db.Begin()
  2797. if err != nil {
  2798. return err
  2799. }
  2800. _, err = tx.Exec("INSERT|t1|name=?,age=?,dead=?", "Gordon", 3, true)
  2801. if err != nil {
  2802. return err
  2803. }
  2804. return endTx(tx)
  2805. }
  2806. }
  2807. simulateBadConn("db.Tx.Exec commit", &hookCommitBadConn, dbExec((*Tx).Commit))
  2808. simulateBadConn("db.Tx.Exec rollback", &hookRollbackBadConn, dbExec((*Tx).Rollback))
  2809. // db.Query
  2810. dbQuery := func(endTx func(tx *Tx) error) func() error {
  2811. return func() error {
  2812. tx, err := db.Begin()
  2813. if err != nil {
  2814. return err
  2815. }
  2816. rows, err := tx.Query("SELECT|t1|age,name|")
  2817. if err == nil {
  2818. err = rows.Close()
  2819. } else {
  2820. return err
  2821. }
  2822. return endTx(tx)
  2823. }
  2824. }
  2825. simulateBadConn("db.Tx.Query commit", &hookCommitBadConn, dbQuery((*Tx).Commit))
  2826. simulateBadConn("db.Tx.Query rollback", &hookRollbackBadConn, dbQuery((*Tx).Rollback))
  2827. }
  2828. type concurrentTest interface {
  2829. init(t testing.TB, db *DB)
  2830. finish(t testing.TB)
  2831. test(t testing.TB) error
  2832. }
  2833. type concurrentDBQueryTest struct {
  2834. db *DB
  2835. }
  2836. func (c *concurrentDBQueryTest) init(t testing.TB, db *DB) {
  2837. c.db = db
  2838. }
  2839. func (c *concurrentDBQueryTest) finish(t testing.TB) {
  2840. c.db = nil
  2841. }
  2842. func (c *concurrentDBQueryTest) test(t testing.TB) error {
  2843. rows, err := c.db.Query("SELECT|people|name|")
  2844. if err != nil {
  2845. t.Error(err)
  2846. return err
  2847. }
  2848. var name string
  2849. for rows.Next() {
  2850. rows.Scan(&name)
  2851. }
  2852. rows.Close()
  2853. return nil
  2854. }
  2855. type concurrentDBExecTest struct {
  2856. db *DB
  2857. }
  2858. func (c *concurrentDBExecTest) init(t testing.TB, db *DB) {
  2859. c.db = db
  2860. }
  2861. func (c *concurrentDBExecTest) finish(t testing.TB) {
  2862. c.db = nil
  2863. }
  2864. func (c *concurrentDBExecTest) test(t testing.TB) error {
  2865. _, err := c.db.Exec("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?", 3, chrisBirthday)
  2866. if err != nil {
  2867. t.Error(err)
  2868. return err
  2869. }
  2870. return nil
  2871. }
  2872. type concurrentStmtQueryTest struct {
  2873. db *DB
  2874. stmt *Stmt
  2875. }
  2876. func (c *concurrentStmtQueryTest) init(t testing.TB, db *DB) {
  2877. c.db = db
  2878. var err error
  2879. c.stmt, err = db.Prepare("SELECT|people|name|")
  2880. if err != nil {
  2881. t.Fatal(err)
  2882. }
  2883. }
  2884. func (c *concurrentStmtQueryTest) finish(t testing.TB) {
  2885. if c.stmt != nil {
  2886. c.stmt.Close()
  2887. c.stmt = nil
  2888. }
  2889. c.db = nil
  2890. }
  2891. func (c *concurrentStmtQueryTest) test(t testing.TB) error {
  2892. rows, err := c.stmt.Query()
  2893. if err != nil {
  2894. t.Errorf("error on query: %v", err)
  2895. return err
  2896. }
  2897. var name string
  2898. for rows.Next() {
  2899. rows.Scan(&name)
  2900. }
  2901. rows.Close()
  2902. return nil
  2903. }
  2904. type concurrentStmtExecTest struct {
  2905. db *DB
  2906. stmt *Stmt
  2907. }
  2908. func (c *concurrentStmtExecTest) init(t testing.TB, db *DB) {
  2909. c.db = db
  2910. var err error
  2911. c.stmt, err = db.Prepare("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?")
  2912. if err != nil {
  2913. t.Fatal(err)
  2914. }
  2915. }
  2916. func (c *concurrentStmtExecTest) finish(t testing.TB) {
  2917. if c.stmt != nil {
  2918. c.stmt.Close()
  2919. c.stmt = nil
  2920. }
  2921. c.db = nil
  2922. }
  2923. func (c *concurrentStmtExecTest) test(t testing.TB) error {
  2924. _, err := c.stmt.Exec(3, chrisBirthday)
  2925. if err != nil {
  2926. t.Errorf("error on exec: %v", err)
  2927. return err
  2928. }
  2929. return nil
  2930. }
  2931. type concurrentTxQueryTest struct {
  2932. db *DB
  2933. tx *Tx
  2934. }
  2935. func (c *concurrentTxQueryTest) init(t testing.TB, db *DB) {
  2936. c.db = db
  2937. var err error
  2938. c.tx, err = c.db.Begin()
  2939. if err != nil {
  2940. t.Fatal(err)
  2941. }
  2942. }
  2943. func (c *concurrentTxQueryTest) finish(t testing.TB) {
  2944. if c.tx != nil {
  2945. c.tx.Rollback()
  2946. c.tx = nil
  2947. }
  2948. c.db = nil
  2949. }
  2950. func (c *concurrentTxQueryTest) test(t testing.TB) error {
  2951. rows, err := c.db.Query("SELECT|people|name|")
  2952. if err != nil {
  2953. t.Error(err)
  2954. return err
  2955. }
  2956. var name string
  2957. for rows.Next() {
  2958. rows.Scan(&name)
  2959. }
  2960. rows.Close()
  2961. return nil
  2962. }
  2963. type concurrentTxExecTest struct {
  2964. db *DB
  2965. tx *Tx
  2966. }
  2967. func (c *concurrentTxExecTest) init(t testing.TB, db *DB) {
  2968. c.db = db
  2969. var err error
  2970. c.tx, err = c.db.Begin()
  2971. if err != nil {
  2972. t.Fatal(err)
  2973. }
  2974. }
  2975. func (c *concurrentTxExecTest) finish(t testing.TB) {
  2976. if c.tx != nil {
  2977. c.tx.Rollback()
  2978. c.tx = nil
  2979. }
  2980. c.db = nil
  2981. }
  2982. func (c *concurrentTxExecTest) test(t testing.TB) error {
  2983. _, err := c.tx.Exec("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?", 3, chrisBirthday)
  2984. if err != nil {
  2985. t.Error(err)
  2986. return err
  2987. }
  2988. return nil
  2989. }
  2990. type concurrentTxStmtQueryTest struct {
  2991. db *DB
  2992. tx *Tx
  2993. stmt *Stmt
  2994. }
  2995. func (c *concurrentTxStmtQueryTest) init(t testing.TB, db *DB) {
  2996. c.db = db
  2997. var err error
  2998. c.tx, err = c.db.Begin()
  2999. if err != nil {
  3000. t.Fatal(err)
  3001. }
  3002. c.stmt, err = c.tx.Prepare("SELECT|people|name|")
  3003. if err != nil {
  3004. t.Fatal(err)
  3005. }
  3006. }
  3007. func (c *concurrentTxStmtQueryTest) finish(t testing.TB) {
  3008. if c.stmt != nil {
  3009. c.stmt.Close()
  3010. c.stmt = nil
  3011. }
  3012. if c.tx != nil {
  3013. c.tx.Rollback()
  3014. c.tx = nil
  3015. }
  3016. c.db = nil
  3017. }
  3018. func (c *concurrentTxStmtQueryTest) test(t testing.TB) error {
  3019. rows, err := c.stmt.Query()
  3020. if err != nil {
  3021. t.Errorf("error on query: %v", err)
  3022. return err
  3023. }
  3024. var name string
  3025. for rows.Next() {
  3026. rows.Scan(&name)
  3027. }
  3028. rows.Close()
  3029. return nil
  3030. }
  3031. type concurrentTxStmtExecTest struct {
  3032. db *DB
  3033. tx *Tx
  3034. stmt *Stmt
  3035. }
  3036. func (c *concurrentTxStmtExecTest) init(t testing.TB, db *DB) {
  3037. c.db = db
  3038. var err error
  3039. c.tx, err = c.db.Begin()
  3040. if err != nil {
  3041. t.Fatal(err)
  3042. }
  3043. c.stmt, err = c.tx.Prepare("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?")
  3044. if err != nil {
  3045. t.Fatal(err)
  3046. }
  3047. }
  3048. func (c *concurrentTxStmtExecTest) finish(t testing.TB) {
  3049. if c.stmt != nil {
  3050. c.stmt.Close()
  3051. c.stmt = nil
  3052. }
  3053. if c.tx != nil {
  3054. c.tx.Rollback()
  3055. c.tx = nil
  3056. }
  3057. c.db = nil
  3058. }
  3059. func (c *concurrentTxStmtExecTest) test(t testing.TB) error {
  3060. _, err := c.stmt.Exec(3, chrisBirthday)
  3061. if err != nil {
  3062. t.Errorf("error on exec: %v", err)
  3063. return err
  3064. }
  3065. return nil
  3066. }
  3067. type concurrentRandomTest struct {
  3068. tests []concurrentTest
  3069. }
  3070. func (c *concurrentRandomTest) init(t testing.TB, db *DB) {
  3071. c.tests = []concurrentTest{
  3072. new(concurrentDBQueryTest),
  3073. new(concurrentDBExecTest),
  3074. new(concurrentStmtQueryTest),
  3075. new(concurrentStmtExecTest),
  3076. new(concurrentTxQueryTest),
  3077. new(concurrentTxExecTest),
  3078. new(concurrentTxStmtQueryTest),
  3079. new(concurrentTxStmtExecTest),
  3080. }
  3081. for _, ct := range c.tests {
  3082. ct.init(t, db)
  3083. }
  3084. }
  3085. func (c *concurrentRandomTest) finish(t testing.TB) {
  3086. for _, ct := range c.tests {
  3087. ct.finish(t)
  3088. }
  3089. }
  3090. func (c *concurrentRandomTest) test(t testing.TB) error {
  3091. ct := c.tests[rand.Intn(len(c.tests))]
  3092. return ct.test(t)
  3093. }
  3094. func doConcurrentTest(t testing.TB, ct concurrentTest) {
  3095. maxProcs, numReqs := 1, 500
  3096. if testing.Short() {
  3097. maxProcs, numReqs = 4, 50
  3098. }
  3099. defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
  3100. db := newTestDB(t, "people")
  3101. defer closeDB(t, db)
  3102. ct.init(t, db)
  3103. defer ct.finish(t)
  3104. var wg sync.WaitGroup
  3105. wg.Add(numReqs)
  3106. reqs := make(chan bool)
  3107. defer close(reqs)
  3108. for i := 0; i < maxProcs*2; i++ {
  3109. go func() {
  3110. for range reqs {
  3111. err := ct.test(t)
  3112. if err != nil {
  3113. wg.Done()
  3114. continue
  3115. }
  3116. wg.Done()
  3117. }
  3118. }()
  3119. }
  3120. for i := 0; i < numReqs; i++ {
  3121. reqs <- true
  3122. }
  3123. wg.Wait()
  3124. }
  3125. func TestIssue6081(t *testing.T) {
  3126. db := newTestDB(t, "people")
  3127. defer closeDB(t, db)
  3128. drv := db.Driver().(*fakeDriver)
  3129. drv.mu.Lock()
  3130. opens0 := drv.openCount
  3131. closes0 := drv.closeCount
  3132. drv.mu.Unlock()
  3133. stmt, err := db.Prepare("SELECT|people|name|")
  3134. if err != nil {
  3135. t.Fatal(err)
  3136. }
  3137. setRowsCloseHook(func(rows *Rows, err *error) {
  3138. *err = driver.ErrBadConn
  3139. })
  3140. defer setRowsCloseHook(nil)
  3141. for i := 0; i < 10; i++ {
  3142. rows, err := stmt.Query()
  3143. if err != nil {
  3144. t.Fatal(err)
  3145. }
  3146. rows.Close()
  3147. }
  3148. if n := len(stmt.css); n > 1 {
  3149. t.Errorf("len(css slice) = %d; want <= 1", n)
  3150. }
  3151. stmt.Close()
  3152. if n := len(stmt.css); n != 0 {
  3153. t.Errorf("len(css slice) after Close = %d; want 0", n)
  3154. }
  3155. drv.mu.Lock()
  3156. opens := drv.openCount - opens0
  3157. closes := drv.closeCount - closes0
  3158. drv.mu.Unlock()
  3159. if opens < 9 {
  3160. t.Errorf("opens = %d; want >= 9", opens)
  3161. }
  3162. if closes < 9 {
  3163. t.Errorf("closes = %d; want >= 9", closes)
  3164. }
  3165. }
  3166. // TestIssue18429 attempts to stress rolling back the transaction from a
  3167. // context cancel while simultaneously calling Tx.Rollback. Rolling back from a
  3168. // context happens concurrently so tx.rollback and tx.Commit must guard against
  3169. // double entry.
  3170. //
  3171. // In the test, a context is canceled while the query is in process so
  3172. // the internal rollback will run concurrently with the explicitly called
  3173. // Tx.Rollback.
  3174. //
  3175. // The addition of calling rows.Next also tests
  3176. // Issue 21117.
  3177. func TestIssue18429(t *testing.T) {
  3178. db := newTestDB(t, "people")
  3179. defer closeDB(t, db)
  3180. ctx := context.Background()
  3181. sem := make(chan bool, 20)
  3182. var wg sync.WaitGroup
  3183. const milliWait = 30
  3184. for i := 0; i < 100; i++ {
  3185. sem <- true
  3186. wg.Add(1)
  3187. go func() {
  3188. defer func() {
  3189. <-sem
  3190. wg.Done()
  3191. }()
  3192. qwait := (time.Duration(rand.Intn(milliWait)) * time.Millisecond).String()
  3193. ctx, cancel := context.WithTimeout(ctx, time.Duration(rand.Intn(milliWait))*time.Millisecond)
  3194. defer cancel()
  3195. tx, err := db.BeginTx(ctx, nil)
  3196. if err != nil {
  3197. return
  3198. }
  3199. // This is expected to give a cancel error most, but not all the time.
  3200. // Test failure will happen with a panic or other race condition being
  3201. // reported.
  3202. rows, _ := tx.QueryContext(ctx, "WAIT|"+qwait+"|SELECT|people|name|")
  3203. if rows != nil {
  3204. var name string
  3205. // Call Next to test Issue 21117 and check for races.
  3206. for rows.Next() {
  3207. // Scan the buffer so it is read and checked for races.
  3208. rows.Scan(&name)
  3209. }
  3210. rows.Close()
  3211. }
  3212. // This call will race with the context cancel rollback to complete
  3213. // if the rollback itself isn't guarded.
  3214. tx.Rollback()
  3215. }()
  3216. }
  3217. wg.Wait()
  3218. }
  3219. // TestIssue20160 attempts to test a short context life on a stmt Query.
  3220. func TestIssue20160(t *testing.T) {
  3221. db := newTestDB(t, "people")
  3222. defer closeDB(t, db)
  3223. ctx := context.Background()
  3224. sem := make(chan bool, 20)
  3225. var wg sync.WaitGroup
  3226. const milliWait = 30
  3227. stmt, err := db.PrepareContext(ctx, "SELECT|people|name|")
  3228. if err != nil {
  3229. t.Fatal(err)
  3230. }
  3231. defer stmt.Close()
  3232. for i := 0; i < 100; i++ {
  3233. sem <- true
  3234. wg.Add(1)
  3235. go func() {
  3236. defer func() {
  3237. <-sem
  3238. wg.Done()
  3239. }()
  3240. ctx, cancel := context.WithTimeout(ctx, time.Duration(rand.Intn(milliWait))*time.Millisecond)
  3241. defer cancel()
  3242. // This is expected to give a cancel error most, but not all the time.
  3243. // Test failure will happen with a panic or other race condition being
  3244. // reported.
  3245. rows, _ := stmt.QueryContext(ctx)
  3246. if rows != nil {
  3247. rows.Close()
  3248. }
  3249. }()
  3250. }
  3251. wg.Wait()
  3252. }
  3253. // TestIssue18719 closes the context right before use. The sql.driverConn
  3254. // will nil out the ci on close in a lock, but if another process uses it right after
  3255. // it will panic with on the nil ref.
  3256. //
  3257. // See https://golang.org/cl/35550 .
  3258. func TestIssue18719(t *testing.T) {
  3259. db := newTestDB(t, "people")
  3260. defer closeDB(t, db)
  3261. ctx, cancel := context.WithCancel(context.Background())
  3262. defer cancel()
  3263. tx, err := db.BeginTx(ctx, nil)
  3264. if err != nil {
  3265. t.Fatal(err)
  3266. }
  3267. hookTxGrabConn = func() {
  3268. cancel()
  3269. // Wait for the context to cancel and tx to rollback.
  3270. for tx.isDone() == false {
  3271. time.Sleep(pollDuration)
  3272. }
  3273. }
  3274. defer func() { hookTxGrabConn = nil }()
  3275. // This call will grab the connection and cancel the context
  3276. // after it has done so. Code after must deal with the canceled state.
  3277. _, err = tx.QueryContext(ctx, "SELECT|people|name|")
  3278. if err != nil {
  3279. t.Fatalf("expected error %v but got %v", nil, err)
  3280. }
  3281. // Rows may be ignored because it will be closed when the context is canceled.
  3282. // Do not explicitly rollback. The rollback will happen from the
  3283. // canceled context.
  3284. cancel()
  3285. }
  3286. func TestIssue20647(t *testing.T) {
  3287. db := newTestDB(t, "people")
  3288. defer closeDB(t, db)
  3289. ctx, cancel := context.WithCancel(context.Background())
  3290. defer cancel()
  3291. conn, err := db.Conn(ctx)
  3292. if err != nil {
  3293. t.Fatal(err)
  3294. }
  3295. conn.dc.ci.(*fakeConn).skipDirtySession = true
  3296. defer conn.Close()
  3297. stmt, err := conn.PrepareContext(ctx, "SELECT|people|name|")
  3298. if err != nil {
  3299. t.Fatal(err)
  3300. }
  3301. defer stmt.Close()
  3302. rows1, err := stmt.QueryContext(ctx)
  3303. if err != nil {
  3304. t.Fatal("rows1", err)
  3305. }
  3306. defer rows1.Close()
  3307. rows2, err := stmt.QueryContext(ctx)
  3308. if err != nil {
  3309. t.Fatal("rows2", err)
  3310. }
  3311. defer rows2.Close()
  3312. if rows1.dc != rows2.dc {
  3313. t.Fatal("stmt prepared on Conn does not use same connection")
  3314. }
  3315. }
  3316. func TestConcurrency(t *testing.T) {
  3317. list := []struct {
  3318. name string
  3319. ct concurrentTest
  3320. }{
  3321. {"Query", new(concurrentDBQueryTest)},
  3322. {"Exec", new(concurrentDBExecTest)},
  3323. {"StmtQuery", new(concurrentStmtQueryTest)},
  3324. {"StmtExec", new(concurrentStmtExecTest)},
  3325. {"TxQuery", new(concurrentTxQueryTest)},
  3326. {"TxExec", new(concurrentTxExecTest)},
  3327. {"TxStmtQuery", new(concurrentTxStmtQueryTest)},
  3328. {"TxStmtExec", new(concurrentTxStmtExecTest)},
  3329. {"Random", new(concurrentRandomTest)},
  3330. }
  3331. for _, item := range list {
  3332. t.Run(item.name, func(t *testing.T) {
  3333. doConcurrentTest(t, item.ct)
  3334. })
  3335. }
  3336. }
  3337. func TestConnectionLeak(t *testing.T) {
  3338. db := newTestDB(t, "people")
  3339. defer closeDB(t, db)
  3340. // Start by opening defaultMaxIdleConns
  3341. rows := make([]*Rows, defaultMaxIdleConns)
  3342. // We need to SetMaxOpenConns > MaxIdleConns, so the DB can open
  3343. // a new connection and we can fill the idle queue with the released
  3344. // connections.
  3345. db.SetMaxOpenConns(len(rows) + 1)
  3346. for ii := range rows {
  3347. r, err := db.Query("SELECT|people|name|")
  3348. if err != nil {
  3349. t.Fatal(err)
  3350. }
  3351. r.Next()
  3352. if err := r.Err(); err != nil {
  3353. t.Fatal(err)
  3354. }
  3355. rows[ii] = r
  3356. }
  3357. // Now we have defaultMaxIdleConns busy connections. Open
  3358. // a new one, but wait until the busy connections are released
  3359. // before returning control to DB.
  3360. drv := db.Driver().(*fakeDriver)
  3361. drv.waitCh = make(chan struct{}, 1)
  3362. drv.waitingCh = make(chan struct{}, 1)
  3363. var wg sync.WaitGroup
  3364. wg.Add(1)
  3365. go func() {
  3366. r, err := db.Query("SELECT|people|name|")
  3367. if err != nil {
  3368. t.Error(err)
  3369. return
  3370. }
  3371. r.Close()
  3372. wg.Done()
  3373. }()
  3374. // Wait until the goroutine we've just created has started waiting.
  3375. <-drv.waitingCh
  3376. // Now close the busy connections. This provides a connection for
  3377. // the blocked goroutine and then fills up the idle queue.
  3378. for _, v := range rows {
  3379. v.Close()
  3380. }
  3381. // At this point we give the new connection to DB. This connection is
  3382. // now useless, since the idle queue is full and there are no pending
  3383. // requests. DB should deal with this situation without leaking the
  3384. // connection.
  3385. drv.waitCh <- struct{}{}
  3386. wg.Wait()
  3387. }
  3388. func TestStatsMaxIdleClosedZero(t *testing.T) {
  3389. db := newTestDB(t, "people")
  3390. defer closeDB(t, db)
  3391. db.SetMaxOpenConns(1)
  3392. db.SetMaxIdleConns(1)
  3393. db.SetConnMaxLifetime(0)
  3394. preMaxIdleClosed := db.Stats().MaxIdleClosed
  3395. for i := 0; i < 10; i++ {
  3396. rows, err := db.Query("SELECT|people|name|")
  3397. if err != nil {
  3398. t.Fatal(err)
  3399. }
  3400. rows.Close()
  3401. }
  3402. st := db.Stats()
  3403. maxIdleClosed := st.MaxIdleClosed - preMaxIdleClosed
  3404. t.Logf("MaxIdleClosed: %d", maxIdleClosed)
  3405. if maxIdleClosed != 0 {
  3406. t.Fatal("expected 0 max idle closed conns, got: ", maxIdleClosed)
  3407. }
  3408. }
  3409. func TestStatsMaxIdleClosedTen(t *testing.T) {
  3410. db := newTestDB(t, "people")
  3411. defer closeDB(t, db)
  3412. db.SetMaxOpenConns(1)
  3413. db.SetMaxIdleConns(0)
  3414. db.SetConnMaxLifetime(0)
  3415. preMaxIdleClosed := db.Stats().MaxIdleClosed
  3416. for i := 0; i < 10; i++ {
  3417. rows, err := db.Query("SELECT|people|name|")
  3418. if err != nil {
  3419. t.Fatal(err)
  3420. }
  3421. rows.Close()
  3422. }
  3423. st := db.Stats()
  3424. maxIdleClosed := st.MaxIdleClosed - preMaxIdleClosed
  3425. t.Logf("MaxIdleClosed: %d", maxIdleClosed)
  3426. if maxIdleClosed != 10 {
  3427. t.Fatal("expected 0 max idle closed conns, got: ", maxIdleClosed)
  3428. }
  3429. }
  3430. // testUseConns uses count concurrent connections with 1 nanosecond apart.
  3431. // Returns the returnedAt time of the final connection.
  3432. func testUseConns(t *testing.T, count int, tm time.Time, db *DB) time.Time {
  3433. conns := make([]*Conn, count)
  3434. ctx := context.Background()
  3435. for i := range conns {
  3436. tm = tm.Add(time.Nanosecond)
  3437. nowFunc = func() time.Time {
  3438. return tm
  3439. }
  3440. c, err := db.Conn(ctx)
  3441. if err != nil {
  3442. t.Error(err)
  3443. }
  3444. conns[i] = c
  3445. }
  3446. for i := len(conns) - 1; i >= 0; i-- {
  3447. tm = tm.Add(time.Nanosecond)
  3448. nowFunc = func() time.Time {
  3449. return tm
  3450. }
  3451. if err := conns[i].Close(); err != nil {
  3452. t.Error(err)
  3453. }
  3454. }
  3455. return tm
  3456. }
  3457. func TestMaxIdleTime(t *testing.T) {
  3458. usedConns := 5
  3459. reusedConns := 2
  3460. list := []struct {
  3461. wantMaxIdleTime time.Duration
  3462. wantMaxLifetime time.Duration
  3463. wantNextCheck time.Duration
  3464. wantIdleClosed int64
  3465. wantMaxIdleClosed int64
  3466. timeOffset time.Duration
  3467. secondTimeOffset time.Duration
  3468. }{
  3469. {
  3470. time.Millisecond,
  3471. 0,
  3472. time.Millisecond - time.Nanosecond,
  3473. int64(usedConns - reusedConns),
  3474. int64(usedConns - reusedConns),
  3475. 10 * time.Millisecond,
  3476. 0,
  3477. },
  3478. {
  3479. // Want to close some connections via max idle time and one by max lifetime.
  3480. time.Millisecond,
  3481. // nowFunc() - MaxLifetime should be 1 * time.Nanosecond in connectionCleanerRunLocked.
  3482. // This guarantees that first opened connection is to be closed.
  3483. // Thus it is timeOffset + secondTimeOffset + 3 (+2 for Close while reusing conns and +1 for Conn).
  3484. 10*time.Millisecond + 100*time.Nanosecond + 3*time.Nanosecond,
  3485. time.Nanosecond,
  3486. // Closed all not reused connections and extra one by max lifetime.
  3487. int64(usedConns - reusedConns + 1),
  3488. int64(usedConns - reusedConns),
  3489. 10 * time.Millisecond,
  3490. // Add second offset because otherwise connections are expired via max lifetime in Close.
  3491. 100 * time.Nanosecond,
  3492. },
  3493. {
  3494. time.Hour,
  3495. 0,
  3496. time.Second,
  3497. 0,
  3498. 0,
  3499. 10 * time.Millisecond,
  3500. 0},
  3501. }
  3502. baseTime := time.Unix(0, 0)
  3503. defer func() {
  3504. nowFunc = time.Now
  3505. }()
  3506. for _, item := range list {
  3507. nowFunc = func() time.Time {
  3508. return baseTime
  3509. }
  3510. t.Run(fmt.Sprintf("%v", item.wantMaxIdleTime), func(t *testing.T) {
  3511. db := newTestDB(t, "people")
  3512. defer closeDB(t, db)
  3513. db.SetMaxOpenConns(usedConns)
  3514. db.SetMaxIdleConns(usedConns)
  3515. db.SetConnMaxIdleTime(item.wantMaxIdleTime)
  3516. db.SetConnMaxLifetime(item.wantMaxLifetime)
  3517. preMaxIdleClosed := db.Stats().MaxIdleTimeClosed
  3518. // Busy usedConns.
  3519. testUseConns(t, usedConns, baseTime, db)
  3520. tm := baseTime.Add(item.timeOffset)
  3521. // Reuse connections which should never be considered idle
  3522. // and exercises the sorting for issue 39471.
  3523. tm = testUseConns(t, reusedConns, tm, db)
  3524. tm = tm.Add(item.secondTimeOffset)
  3525. nowFunc = func() time.Time {
  3526. return tm
  3527. }
  3528. db.mu.Lock()
  3529. nc, closing := db.connectionCleanerRunLocked(time.Second)
  3530. if nc != item.wantNextCheck {
  3531. t.Errorf("got %v; want %v next check duration", nc, item.wantNextCheck)
  3532. }
  3533. // Validate freeConn order.
  3534. var last time.Time
  3535. for _, c := range db.freeConn {
  3536. if last.After(c.returnedAt) {
  3537. t.Error("freeConn is not ordered by returnedAt")
  3538. break
  3539. }
  3540. last = c.returnedAt
  3541. }
  3542. db.mu.Unlock()
  3543. for _, c := range closing {
  3544. c.Close()
  3545. }
  3546. if g, w := int64(len(closing)), item.wantIdleClosed; g != w {
  3547. t.Errorf("got: %d; want %d closed conns", g, w)
  3548. }
  3549. st := db.Stats()
  3550. maxIdleClosed := st.MaxIdleTimeClosed - preMaxIdleClosed
  3551. if g, w := maxIdleClosed, item.wantMaxIdleClosed; g != w {
  3552. t.Errorf("got: %d; want %d max idle closed conns", g, w)
  3553. }
  3554. })
  3555. }
  3556. }
  3557. type nvcDriver struct {
  3558. fakeDriver
  3559. skipNamedValueCheck bool
  3560. }
  3561. func (d *nvcDriver) Open(dsn string) (driver.Conn, error) {
  3562. c, err := d.fakeDriver.Open(dsn)
  3563. fc := c.(*fakeConn)
  3564. fc.db.allowAny = true
  3565. return &nvcConn{fc, d.skipNamedValueCheck}, err
  3566. }
  3567. type nvcConn struct {
  3568. *fakeConn
  3569. skipNamedValueCheck bool
  3570. }
  3571. type decimalInt struct {
  3572. value int
  3573. }
  3574. type doNotInclude struct{}
  3575. var _ driver.NamedValueChecker = &nvcConn{}
  3576. func (c *nvcConn) CheckNamedValue(nv *driver.NamedValue) error {
  3577. if c.skipNamedValueCheck {
  3578. return driver.ErrSkip
  3579. }
  3580. switch v := nv.Value.(type) {
  3581. default:
  3582. return driver.ErrSkip
  3583. case Out:
  3584. switch ov := v.Dest.(type) {
  3585. default:
  3586. return errors.New("unknown NameValueCheck OUTPUT type")
  3587. case *string:
  3588. *ov = "from-server"
  3589. nv.Value = "OUT:*string"
  3590. }
  3591. return nil
  3592. case decimalInt, []int64:
  3593. return nil
  3594. case doNotInclude:
  3595. return driver.ErrRemoveArgument
  3596. }
  3597. }
  3598. func TestNamedValueChecker(t *testing.T) {
  3599. Register("NamedValueCheck", &nvcDriver{})
  3600. db, err := Open("NamedValueCheck", "")
  3601. if err != nil {
  3602. t.Fatal(err)
  3603. }
  3604. defer db.Close()
  3605. ctx, cancel := context.WithCancel(context.Background())
  3606. defer cancel()
  3607. _, err = db.ExecContext(ctx, "WIPE")
  3608. if err != nil {
  3609. t.Fatal("exec wipe", err)
  3610. }
  3611. _, err = db.ExecContext(ctx, "CREATE|keys|dec1=any,str1=string,out1=string,array1=any")
  3612. if err != nil {
  3613. t.Fatal("exec create", err)
  3614. }
  3615. o1 := ""
  3616. _, err = db.ExecContext(ctx, "INSERT|keys|dec1=?A,str1=?,out1=?O1,array1=?", Named("A", decimalInt{123}), "hello", Named("O1", Out{Dest: &o1}), []int64{42, 128, 707}, doNotInclude{})
  3617. if err != nil {
  3618. t.Fatal("exec insert", err)
  3619. }
  3620. var (
  3621. str1 string
  3622. dec1 decimalInt
  3623. arr1 []int64
  3624. )
  3625. err = db.QueryRowContext(ctx, "SELECT|keys|dec1,str1,array1|").Scan(&dec1, &str1, &arr1)
  3626. if err != nil {
  3627. t.Fatal("select", err)
  3628. }
  3629. list := []struct{ got, want any }{
  3630. {o1, "from-server"},
  3631. {dec1, decimalInt{123}},
  3632. {str1, "hello"},
  3633. {arr1, []int64{42, 128, 707}},
  3634. }
  3635. for index, item := range list {
  3636. if !reflect.DeepEqual(item.got, item.want) {
  3637. t.Errorf("got %#v wanted %#v for index %d", item.got, item.want, index)
  3638. }
  3639. }
  3640. }
  3641. func TestNamedValueCheckerSkip(t *testing.T) {
  3642. Register("NamedValueCheckSkip", &nvcDriver{skipNamedValueCheck: true})
  3643. db, err := Open("NamedValueCheckSkip", "")
  3644. if err != nil {
  3645. t.Fatal(err)
  3646. }
  3647. defer db.Close()
  3648. ctx, cancel := context.WithCancel(context.Background())
  3649. defer cancel()
  3650. _, err = db.ExecContext(ctx, "WIPE")
  3651. if err != nil {
  3652. t.Fatal("exec wipe", err)
  3653. }
  3654. _, err = db.ExecContext(ctx, "CREATE|keys|dec1=any")
  3655. if err != nil {
  3656. t.Fatal("exec create", err)
  3657. }
  3658. _, err = db.ExecContext(ctx, "INSERT|keys|dec1=?A", Named("A", decimalInt{123}))
  3659. if err == nil {
  3660. t.Fatalf("expected error with bad argument, got %v", err)
  3661. }
  3662. }
  3663. func TestOpenConnector(t *testing.T) {
  3664. Register("testctx", &fakeDriverCtx{})
  3665. db, err := Open("testctx", "people")
  3666. if err != nil {
  3667. t.Fatal(err)
  3668. }
  3669. defer db.Close()
  3670. c, ok := db.connector.(*fakeConnector)
  3671. if !ok {
  3672. t.Fatal("not using *fakeConnector")
  3673. }
  3674. if err := db.Close(); err != nil {
  3675. t.Fatal(err)
  3676. }
  3677. if !c.closed {
  3678. t.Fatal("connector is not closed")
  3679. }
  3680. }
  3681. type ctxOnlyDriver struct {
  3682. fakeDriver
  3683. }
  3684. func (d *ctxOnlyDriver) Open(dsn string) (driver.Conn, error) {
  3685. conn, err := d.fakeDriver.Open(dsn)
  3686. if err != nil {
  3687. return nil, err
  3688. }
  3689. return &ctxOnlyConn{fc: conn.(*fakeConn)}, nil
  3690. }
  3691. var (
  3692. _ driver.Conn = &ctxOnlyConn{}
  3693. _ driver.QueryerContext = &ctxOnlyConn{}
  3694. _ driver.ExecerContext = &ctxOnlyConn{}
  3695. )
  3696. type ctxOnlyConn struct {
  3697. fc *fakeConn
  3698. queryCtxCalled bool
  3699. execCtxCalled bool
  3700. }
  3701. func (c *ctxOnlyConn) Begin() (driver.Tx, error) {
  3702. return c.fc.Begin()
  3703. }
  3704. func (c *ctxOnlyConn) Close() error {
  3705. return c.fc.Close()
  3706. }
  3707. // Prepare is still part of the Conn interface, so while it isn't used
  3708. // must be defined for compatibility.
  3709. func (c *ctxOnlyConn) Prepare(q string) (driver.Stmt, error) {
  3710. panic("not used")
  3711. }
  3712. func (c *ctxOnlyConn) PrepareContext(ctx context.Context, q string) (driver.Stmt, error) {
  3713. return c.fc.PrepareContext(ctx, q)
  3714. }
  3715. func (c *ctxOnlyConn) QueryContext(ctx context.Context, q string, args []driver.NamedValue) (driver.Rows, error) {
  3716. c.queryCtxCalled = true
  3717. return c.fc.QueryContext(ctx, q, args)
  3718. }
  3719. func (c *ctxOnlyConn) ExecContext(ctx context.Context, q string, args []driver.NamedValue) (driver.Result, error) {
  3720. c.execCtxCalled = true
  3721. return c.fc.ExecContext(ctx, q, args)
  3722. }
  3723. // TestQueryExecContextOnly ensures drivers only need to implement QueryContext
  3724. // and ExecContext methods.
  3725. func TestQueryExecContextOnly(t *testing.T) {
  3726. // Ensure connection does not implement non-context interfaces.
  3727. var connType driver.Conn = &ctxOnlyConn{}
  3728. if _, ok := connType.(driver.Execer); ok {
  3729. t.Fatalf("%T must not implement driver.Execer", connType)
  3730. }
  3731. if _, ok := connType.(driver.Queryer); ok {
  3732. t.Fatalf("%T must not implement driver.Queryer", connType)
  3733. }
  3734. Register("ContextOnly", &ctxOnlyDriver{})
  3735. db, err := Open("ContextOnly", "")
  3736. if err != nil {
  3737. t.Fatal(err)
  3738. }
  3739. defer db.Close()
  3740. ctx, cancel := context.WithCancel(context.Background())
  3741. defer cancel()
  3742. conn, err := db.Conn(ctx)
  3743. if err != nil {
  3744. t.Fatal("db.Conn", err)
  3745. }
  3746. defer conn.Close()
  3747. coc := conn.dc.ci.(*ctxOnlyConn)
  3748. coc.fc.skipDirtySession = true
  3749. _, err = conn.ExecContext(ctx, "WIPE")
  3750. if err != nil {
  3751. t.Fatal("exec wipe", err)
  3752. }
  3753. _, err = conn.ExecContext(ctx, "CREATE|keys|v1=string")
  3754. if err != nil {
  3755. t.Fatal("exec create", err)
  3756. }
  3757. expectedValue := "value1"
  3758. _, err = conn.ExecContext(ctx, "INSERT|keys|v1=?", expectedValue)
  3759. if err != nil {
  3760. t.Fatal("exec insert", err)
  3761. }
  3762. rows, err := conn.QueryContext(ctx, "SELECT|keys|v1|")
  3763. if err != nil {
  3764. t.Fatal("query select", err)
  3765. }
  3766. v1 := ""
  3767. for rows.Next() {
  3768. err = rows.Scan(&v1)
  3769. if err != nil {
  3770. t.Fatal("rows scan", err)
  3771. }
  3772. }
  3773. rows.Close()
  3774. if v1 != expectedValue {
  3775. t.Fatalf("expected %q, got %q", expectedValue, v1)
  3776. }
  3777. if !coc.execCtxCalled {
  3778. t.Error("ExecContext not called")
  3779. }
  3780. if !coc.queryCtxCalled {
  3781. t.Error("QueryContext not called")
  3782. }
  3783. }
  3784. type alwaysErrScanner struct{}
  3785. var errTestScanWrap = errors.New("errTestScanWrap")
  3786. func (alwaysErrScanner) Scan(any) error {
  3787. return errTestScanWrap
  3788. }
  3789. // Issue 38099: Ensure that Rows.Scan properly wraps underlying errors.
  3790. func TestRowsScanProperlyWrapsErrors(t *testing.T) {
  3791. db := newTestDB(t, "people")
  3792. defer closeDB(t, db)
  3793. rows, err := db.Query("SELECT|people|age|")
  3794. if err != nil {
  3795. t.Fatalf("Query: %v", err)
  3796. }
  3797. var res alwaysErrScanner
  3798. for rows.Next() {
  3799. err = rows.Scan(&res)
  3800. if err == nil {
  3801. t.Fatal("expecting back an error")
  3802. }
  3803. if !errors.Is(err, errTestScanWrap) {
  3804. t.Fatalf("errors.Is mismatch\n%v\nWant: %v", err, errTestScanWrap)
  3805. }
  3806. // Ensure that error substring matching still correctly works.
  3807. if !strings.Contains(err.Error(), errTestScanWrap.Error()) {
  3808. t.Fatalf("Error %v does not contain %v", err, errTestScanWrap)
  3809. }
  3810. }
  3811. }
  3812. // badConn implements a bad driver.Conn, for TestBadDriver.
  3813. // The Exec method panics.
  3814. type badConn struct{}
  3815. func (bc badConn) Prepare(query string) (driver.Stmt, error) {
  3816. return nil, errors.New("badConn Prepare")
  3817. }
  3818. func (bc badConn) Close() error {
  3819. return nil
  3820. }
  3821. func (bc badConn) Begin() (driver.Tx, error) {
  3822. return nil, errors.New("badConn Begin")
  3823. }
  3824. func (bc badConn) Exec(query string, args []driver.Value) (driver.Result, error) {
  3825. panic("badConn.Exec")
  3826. }
  3827. // badDriver is a driver.Driver that uses badConn.
  3828. type badDriver struct{}
  3829. func (bd badDriver) Open(name string) (driver.Conn, error) {
  3830. return badConn{}, nil
  3831. }
  3832. // Issue 15901.
  3833. func TestBadDriver(t *testing.T) {
  3834. Register("bad", badDriver{})
  3835. db, err := Open("bad", "ignored")
  3836. if err != nil {
  3837. t.Fatal(err)
  3838. }
  3839. defer func() {
  3840. if r := recover(); r == nil {
  3841. t.Error("expected panic")
  3842. } else {
  3843. if want := "badConn.Exec"; r.(string) != want {
  3844. t.Errorf("panic was %v, expected %v", r, want)
  3845. }
  3846. }
  3847. }()
  3848. defer db.Close()
  3849. db.Exec("ignored")
  3850. }
  3851. type pingDriver struct {
  3852. fails bool
  3853. }
  3854. type pingConn struct {
  3855. badConn
  3856. driver *pingDriver
  3857. }
  3858. var pingError = errors.New("Ping failed")
  3859. func (pc pingConn) Ping(ctx context.Context) error {
  3860. if pc.driver.fails {
  3861. return pingError
  3862. }
  3863. return nil
  3864. }
  3865. var _ driver.Pinger = pingConn{}
  3866. func (pd *pingDriver) Open(name string) (driver.Conn, error) {
  3867. return pingConn{driver: pd}, nil
  3868. }
  3869. func TestPing(t *testing.T) {
  3870. driver := &pingDriver{}
  3871. Register("ping", driver)
  3872. db, err := Open("ping", "ignored")
  3873. if err != nil {
  3874. t.Fatal(err)
  3875. }
  3876. if err := db.Ping(); err != nil {
  3877. t.Errorf("err was %#v, expected nil", err)
  3878. return
  3879. }
  3880. driver.fails = true
  3881. if err := db.Ping(); err != pingError {
  3882. t.Errorf("err was %#v, expected pingError", err)
  3883. }
  3884. }
  3885. // Issue 18101.
  3886. func TestTypedString(t *testing.T) {
  3887. db := newTestDB(t, "people")
  3888. defer closeDB(t, db)
  3889. type Str string
  3890. var scanned Str
  3891. err := db.QueryRow("SELECT|people|name|name=?", "Alice").Scan(&scanned)
  3892. if err != nil {
  3893. t.Fatal(err)
  3894. }
  3895. expected := Str("Alice")
  3896. if scanned != expected {
  3897. t.Errorf("expected %+v, got %+v", expected, scanned)
  3898. }
  3899. }
  3900. func BenchmarkConcurrentDBExec(b *testing.B) {
  3901. b.ReportAllocs()
  3902. ct := new(concurrentDBExecTest)
  3903. for i := 0; i < b.N; i++ {
  3904. doConcurrentTest(b, ct)
  3905. }
  3906. }
  3907. func BenchmarkConcurrentStmtQuery(b *testing.B) {
  3908. b.ReportAllocs()
  3909. ct := new(concurrentStmtQueryTest)
  3910. for i := 0; i < b.N; i++ {
  3911. doConcurrentTest(b, ct)
  3912. }
  3913. }
  3914. func BenchmarkConcurrentStmtExec(b *testing.B) {
  3915. b.ReportAllocs()
  3916. ct := new(concurrentStmtExecTest)
  3917. for i := 0; i < b.N; i++ {
  3918. doConcurrentTest(b, ct)
  3919. }
  3920. }
  3921. func BenchmarkConcurrentTxQuery(b *testing.B) {
  3922. b.ReportAllocs()
  3923. ct := new(concurrentTxQueryTest)
  3924. for i := 0; i < b.N; i++ {
  3925. doConcurrentTest(b, ct)
  3926. }
  3927. }
  3928. func BenchmarkConcurrentTxExec(b *testing.B) {
  3929. b.ReportAllocs()
  3930. ct := new(concurrentTxExecTest)
  3931. for i := 0; i < b.N; i++ {
  3932. doConcurrentTest(b, ct)
  3933. }
  3934. }
  3935. func BenchmarkConcurrentTxStmtQuery(b *testing.B) {
  3936. b.ReportAllocs()
  3937. ct := new(concurrentTxStmtQueryTest)
  3938. for i := 0; i < b.N; i++ {
  3939. doConcurrentTest(b, ct)
  3940. }
  3941. }
  3942. func BenchmarkConcurrentTxStmtExec(b *testing.B) {
  3943. b.ReportAllocs()
  3944. ct := new(concurrentTxStmtExecTest)
  3945. for i := 0; i < b.N; i++ {
  3946. doConcurrentTest(b, ct)
  3947. }
  3948. }
  3949. func BenchmarkConcurrentRandom(b *testing.B) {
  3950. b.ReportAllocs()
  3951. ct := new(concurrentRandomTest)
  3952. for i := 0; i < b.N; i++ {
  3953. doConcurrentTest(b, ct)
  3954. }
  3955. }
  3956. func BenchmarkManyConcurrentQueries(b *testing.B) {
  3957. b.ReportAllocs()
  3958. // To see lock contention in Go 1.4, 16~ cores and 128~ goroutines are required.
  3959. const parallelism = 16
  3960. db := newTestDB(b, "magicquery")
  3961. defer closeDB(b, db)
  3962. db.SetMaxIdleConns(runtime.GOMAXPROCS(0) * parallelism)
  3963. stmt, err := db.Prepare("SELECT|magicquery|op|op=?,millis=?")
  3964. if err != nil {
  3965. b.Fatal(err)
  3966. }
  3967. defer stmt.Close()
  3968. b.SetParallelism(parallelism)
  3969. b.RunParallel(func(pb *testing.PB) {
  3970. for pb.Next() {
  3971. rows, err := stmt.Query("sleep", 1)
  3972. if err != nil {
  3973. b.Error(err)
  3974. return
  3975. }
  3976. rows.Close()
  3977. }
  3978. })
  3979. }