libgo: update to go1.9
[official-gcc.git] / libgo / go / database / sql / sql.go
blobc609fe4cc43198fbc2845f7a050b6fda974c3b3a
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.
5 // Package sql provides a generic interface around SQL (or SQL-like)
6 // databases.
7 //
8 // The sql package must be used in conjunction with a database driver.
9 // See https://golang.org/s/sqldrivers for a list of drivers.
11 // Drivers that do not support context cancelation will not return until
12 // after the query is completed.
14 // For usage examples, see the wiki page at
15 // https://golang.org/s/sqlwiki.
16 package sql
18 import (
19 "context"
20 "database/sql/driver"
21 "errors"
22 "fmt"
23 "io"
24 "reflect"
25 "runtime"
26 "sort"
27 "sync"
28 "sync/atomic"
29 "time"
32 var (
33 driversMu sync.RWMutex
34 drivers = make(map[string]driver.Driver)
37 // nowFunc returns the current time; it's overridden in tests.
38 var nowFunc = time.Now
40 // Register makes a database driver available by the provided name.
41 // If Register is called twice with the same name or if driver is nil,
42 // it panics.
43 func Register(name string, driver driver.Driver) {
44 driversMu.Lock()
45 defer driversMu.Unlock()
46 if driver == nil {
47 panic("sql: Register driver is nil")
49 if _, dup := drivers[name]; dup {
50 panic("sql: Register called twice for driver " + name)
52 drivers[name] = driver
55 func unregisterAllDrivers() {
56 driversMu.Lock()
57 defer driversMu.Unlock()
58 // For tests.
59 drivers = make(map[string]driver.Driver)
62 // Drivers returns a sorted list of the names of the registered drivers.
63 func Drivers() []string {
64 driversMu.RLock()
65 defer driversMu.RUnlock()
66 var list []string
67 for name := range drivers {
68 list = append(list, name)
70 sort.Strings(list)
71 return list
74 // A NamedArg is a named argument. NamedArg values may be used as
75 // arguments to Query or Exec and bind to the corresponding named
76 // parameter in the SQL statement.
78 // For a more concise way to create NamedArg values, see
79 // the Named function.
80 type NamedArg struct {
81 _Named_Fields_Required struct{}
83 // Name is the name of the parameter placeholder.
85 // If empty, the ordinal position in the argument list will be
86 // used.
88 // Name must omit any symbol prefix.
89 Name string
91 // Value is the value of the parameter.
92 // It may be assigned the same value types as the query
93 // arguments.
94 Value interface{}
97 // Named provides a more concise way to create NamedArg values.
99 // Example usage:
101 // db.ExecContext(ctx, `
102 // delete from Invoice
103 // where
104 // TimeCreated < @end
105 // and TimeCreated >= @start;`,
106 // sql.Named("start", startTime),
107 // sql.Named("end", endTime),
108 // )
109 func Named(name string, value interface{}) NamedArg {
110 // This method exists because the go1compat promise
111 // doesn't guarantee that structs don't grow more fields,
112 // so unkeyed struct literals are a vet error. Thus, we don't
113 // want to allow sql.NamedArg{name, value}.
114 return NamedArg{Name: name, Value: value}
117 // IsolationLevel is the transaction isolation level used in TxOptions.
118 type IsolationLevel int
120 // Various isolation levels that drivers may support in BeginTx.
121 // If a driver does not support a given isolation level an error may be returned.
123 // See https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels.
124 const (
125 LevelDefault IsolationLevel = iota
126 LevelReadUncommitted
127 LevelReadCommitted
128 LevelWriteCommitted
129 LevelRepeatableRead
130 LevelSnapshot
131 LevelSerializable
132 LevelLinearizable
135 // TxOptions holds the transaction options to be used in DB.BeginTx.
136 type TxOptions struct {
137 // Isolation is the transaction isolation level.
138 // If zero, the driver or database's default level is used.
139 Isolation IsolationLevel
140 ReadOnly bool
143 // RawBytes is a byte slice that holds a reference to memory owned by
144 // the database itself. After a Scan into a RawBytes, the slice is only
145 // valid until the next call to Next, Scan, or Close.
146 type RawBytes []byte
148 // NullString represents a string that may be null.
149 // NullString implements the Scanner interface so
150 // it can be used as a scan destination:
152 // var s NullString
153 // err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
154 // ...
155 // if s.Valid {
156 // // use s.String
157 // } else {
158 // // NULL value
159 // }
161 type NullString struct {
162 String string
163 Valid bool // Valid is true if String is not NULL
166 // Scan implements the Scanner interface.
167 func (ns *NullString) Scan(value interface{}) error {
168 if value == nil {
169 ns.String, ns.Valid = "", false
170 return nil
172 ns.Valid = true
173 return convertAssign(&ns.String, value)
176 // Value implements the driver Valuer interface.
177 func (ns NullString) Value() (driver.Value, error) {
178 if !ns.Valid {
179 return nil, nil
181 return ns.String, nil
184 // NullInt64 represents an int64 that may be null.
185 // NullInt64 implements the Scanner interface so
186 // it can be used as a scan destination, similar to NullString.
187 type NullInt64 struct {
188 Int64 int64
189 Valid bool // Valid is true if Int64 is not NULL
192 // Scan implements the Scanner interface.
193 func (n *NullInt64) Scan(value interface{}) error {
194 if value == nil {
195 n.Int64, n.Valid = 0, false
196 return nil
198 n.Valid = true
199 return convertAssign(&n.Int64, value)
202 // Value implements the driver Valuer interface.
203 func (n NullInt64) Value() (driver.Value, error) {
204 if !n.Valid {
205 return nil, nil
207 return n.Int64, nil
210 // NullFloat64 represents a float64 that may be null.
211 // NullFloat64 implements the Scanner interface so
212 // it can be used as a scan destination, similar to NullString.
213 type NullFloat64 struct {
214 Float64 float64
215 Valid bool // Valid is true if Float64 is not NULL
218 // Scan implements the Scanner interface.
219 func (n *NullFloat64) Scan(value interface{}) error {
220 if value == nil {
221 n.Float64, n.Valid = 0, false
222 return nil
224 n.Valid = true
225 return convertAssign(&n.Float64, value)
228 // Value implements the driver Valuer interface.
229 func (n NullFloat64) Value() (driver.Value, error) {
230 if !n.Valid {
231 return nil, nil
233 return n.Float64, nil
236 // NullBool represents a bool that may be null.
237 // NullBool implements the Scanner interface so
238 // it can be used as a scan destination, similar to NullString.
239 type NullBool struct {
240 Bool bool
241 Valid bool // Valid is true if Bool is not NULL
244 // Scan implements the Scanner interface.
245 func (n *NullBool) Scan(value interface{}) error {
246 if value == nil {
247 n.Bool, n.Valid = false, false
248 return nil
250 n.Valid = true
251 return convertAssign(&n.Bool, value)
254 // Value implements the driver Valuer interface.
255 func (n NullBool) Value() (driver.Value, error) {
256 if !n.Valid {
257 return nil, nil
259 return n.Bool, nil
262 // Scanner is an interface used by Scan.
263 type Scanner interface {
264 // Scan assigns a value from a database driver.
266 // The src value will be of one of the following types:
268 // int64
269 // float64
270 // bool
271 // []byte
272 // string
273 // time.Time
274 // nil - for NULL values
276 // An error should be returned if the value cannot be stored
277 // without loss of information.
278 Scan(src interface{}) error
281 // Out may be used to retrieve OUTPUT value parameters from stored procedures.
283 // Not all drivers and databases support OUTPUT value parameters.
285 // Example usage:
287 // var outArg string
288 // _, err := db.ExecContext(ctx, "ProcName", sql.Named("Arg1", Out{Dest: &outArg}))
289 type Out struct {
290 _Named_Fields_Required struct{}
292 // Dest is a pointer to the value that will be set to the result of the
293 // stored procedure's OUTPUT parameter.
294 Dest interface{}
296 // In is whether the parameter is an INOUT parameter. If so, the input value to the stored
297 // procedure is the dereferenced value of Dest's pointer, which is then replaced with
298 // the output value.
299 In bool
302 // ErrNoRows is returned by Scan when QueryRow doesn't return a
303 // row. In such a case, QueryRow returns a placeholder *Row value that
304 // defers this error until a Scan.
305 var ErrNoRows = errors.New("sql: no rows in result set")
307 // DB is a database handle representing a pool of zero or more
308 // underlying connections. It's safe for concurrent use by multiple
309 // goroutines.
311 // The sql package creates and frees connections automatically; it
312 // also maintains a free pool of idle connections. If the database has
313 // a concept of per-connection state, such state can only be reliably
314 // observed within a transaction. Once DB.Begin is called, the
315 // returned Tx is bound to a single connection. Once Commit or
316 // Rollback is called on the transaction, that transaction's
317 // connection is returned to DB's idle connection pool. The pool size
318 // can be controlled with SetMaxIdleConns.
319 type DB struct {
320 driver driver.Driver
321 dsn string
322 // numClosed is an atomic counter which represents a total number of
323 // closed connections. Stmt.openStmt checks it before cleaning closed
324 // connections in Stmt.css.
325 numClosed uint64
327 mu sync.Mutex // protects following fields
328 freeConn []*driverConn
329 connRequests map[uint64]chan connRequest
330 nextRequest uint64 // Next key to use in connRequests.
331 numOpen int // number of opened and pending open connections
332 // Used to signal the need for new connections
333 // a goroutine running connectionOpener() reads on this chan and
334 // maybeOpenNewConnections sends on the chan (one send per needed connection)
335 // It is closed during db.Close(). The close tells the connectionOpener
336 // goroutine to exit.
337 openerCh chan struct{}
338 closed bool
339 dep map[finalCloser]depSet
340 lastPut map[*driverConn]string // stacktrace of last conn's put; debug only
341 maxIdle int // zero means defaultMaxIdleConns; negative means 0
342 maxOpen int // <= 0 means unlimited
343 maxLifetime time.Duration // maximum amount of time a connection may be reused
344 cleanerCh chan struct{}
347 // connReuseStrategy determines how (*DB).conn returns database connections.
348 type connReuseStrategy uint8
350 const (
351 // alwaysNewConn forces a new connection to the database.
352 alwaysNewConn connReuseStrategy = iota
353 // cachedOrNewConn returns a cached connection, if available, else waits
354 // for one to become available (if MaxOpenConns has been reached) or
355 // creates a new database connection.
356 cachedOrNewConn
359 // driverConn wraps a driver.Conn with a mutex, to
360 // be held during all calls into the Conn. (including any calls onto
361 // interfaces returned via that Conn, such as calls on Tx, Stmt,
362 // Result, Rows)
363 type driverConn struct {
364 db *DB
365 createdAt time.Time
367 sync.Mutex // guards following
368 ci driver.Conn
369 closed bool
370 finalClosed bool // ci.Close has been called
371 openStmt map[*driverStmt]bool
373 // guarded by db.mu
374 inUse bool
375 onPut []func() // code (with db.mu held) run when conn is next returned
376 dbmuClosed bool // same as closed, but guarded by db.mu, for removeClosedStmtLocked
379 func (dc *driverConn) releaseConn(err error) {
380 dc.db.putConn(dc, err)
383 func (dc *driverConn) removeOpenStmt(ds *driverStmt) {
384 dc.Lock()
385 defer dc.Unlock()
386 delete(dc.openStmt, ds)
389 func (dc *driverConn) expired(timeout time.Duration) bool {
390 if timeout <= 0 {
391 return false
393 return dc.createdAt.Add(timeout).Before(nowFunc())
396 // prepareLocked prepares the query on dc. When cg == nil the dc must keep track of
397 // the prepared statements in a pool.
398 func (dc *driverConn) prepareLocked(ctx context.Context, cg stmtConnGrabber, query string) (*driverStmt, error) {
399 si, err := ctxDriverPrepare(ctx, dc.ci, query)
400 if err != nil {
401 return nil, err
403 ds := &driverStmt{Locker: dc, si: si}
405 // No need to manage open statements if there is a single connection grabber.
406 if cg != nil {
407 return ds, nil
410 // Track each driverConn's open statements, so we can close them
411 // before closing the conn.
413 // Wrap all driver.Stmt is *driverStmt to ensure they are only closed once.
414 if dc.openStmt == nil {
415 dc.openStmt = make(map[*driverStmt]bool)
417 dc.openStmt[ds] = true
418 return ds, nil
421 // the dc.db's Mutex is held.
422 func (dc *driverConn) closeDBLocked() func() error {
423 dc.Lock()
424 defer dc.Unlock()
425 if dc.closed {
426 return func() error { return errors.New("sql: duplicate driverConn close") }
428 dc.closed = true
429 return dc.db.removeDepLocked(dc, dc)
432 func (dc *driverConn) Close() error {
433 dc.Lock()
434 if dc.closed {
435 dc.Unlock()
436 return errors.New("sql: duplicate driverConn close")
438 dc.closed = true
439 dc.Unlock() // not defer; removeDep finalClose calls may need to lock
441 // And now updates that require holding dc.mu.Lock.
442 dc.db.mu.Lock()
443 dc.dbmuClosed = true
444 fn := dc.db.removeDepLocked(dc, dc)
445 dc.db.mu.Unlock()
446 return fn()
449 func (dc *driverConn) finalClose() error {
450 var err error
452 // Each *driverStmt has a lock to the dc. Copy the list out of the dc
453 // before calling close on each stmt.
454 var openStmt []*driverStmt
455 withLock(dc, func() {
456 openStmt = make([]*driverStmt, 0, len(dc.openStmt))
457 for ds := range dc.openStmt {
458 openStmt = append(openStmt, ds)
460 dc.openStmt = nil
462 for _, ds := range openStmt {
463 ds.Close()
465 withLock(dc, func() {
466 dc.finalClosed = true
467 err = dc.ci.Close()
468 dc.ci = nil
471 dc.db.mu.Lock()
472 dc.db.numOpen--
473 dc.db.maybeOpenNewConnections()
474 dc.db.mu.Unlock()
476 atomic.AddUint64(&dc.db.numClosed, 1)
477 return err
480 // driverStmt associates a driver.Stmt with the
481 // *driverConn from which it came, so the driverConn's lock can be
482 // held during calls.
483 type driverStmt struct {
484 sync.Locker // the *driverConn
485 si driver.Stmt
486 closed bool
487 closeErr error // return value of previous Close call
490 // Close ensures dirver.Stmt is only closed once any always returns the same
491 // result.
492 func (ds *driverStmt) Close() error {
493 ds.Lock()
494 defer ds.Unlock()
495 if ds.closed {
496 return ds.closeErr
498 ds.closed = true
499 ds.closeErr = ds.si.Close()
500 return ds.closeErr
503 // depSet is a finalCloser's outstanding dependencies
504 type depSet map[interface{}]bool // set of true bools
506 // The finalCloser interface is used by (*DB).addDep and related
507 // dependency reference counting.
508 type finalCloser interface {
509 // finalClose is called when the reference count of an object
510 // goes to zero. (*DB).mu is not held while calling it.
511 finalClose() error
514 // addDep notes that x now depends on dep, and x's finalClose won't be
515 // called until all of x's dependencies are removed with removeDep.
516 func (db *DB) addDep(x finalCloser, dep interface{}) {
517 //println(fmt.Sprintf("addDep(%T %p, %T %p)", x, x, dep, dep))
518 db.mu.Lock()
519 defer db.mu.Unlock()
520 db.addDepLocked(x, dep)
523 func (db *DB) addDepLocked(x finalCloser, dep interface{}) {
524 if db.dep == nil {
525 db.dep = make(map[finalCloser]depSet)
527 xdep := db.dep[x]
528 if xdep == nil {
529 xdep = make(depSet)
530 db.dep[x] = xdep
532 xdep[dep] = true
535 // removeDep notes that x no longer depends on dep.
536 // If x still has dependencies, nil is returned.
537 // If x no longer has any dependencies, its finalClose method will be
538 // called and its error value will be returned.
539 func (db *DB) removeDep(x finalCloser, dep interface{}) error {
540 db.mu.Lock()
541 fn := db.removeDepLocked(x, dep)
542 db.mu.Unlock()
543 return fn()
546 func (db *DB) removeDepLocked(x finalCloser, dep interface{}) func() error {
547 //println(fmt.Sprintf("removeDep(%T %p, %T %p)", x, x, dep, dep))
549 xdep, ok := db.dep[x]
550 if !ok {
551 panic(fmt.Sprintf("unpaired removeDep: no deps for %T", x))
554 l0 := len(xdep)
555 delete(xdep, dep)
557 switch len(xdep) {
558 case l0:
559 // Nothing removed. Shouldn't happen.
560 panic(fmt.Sprintf("unpaired removeDep: no %T dep on %T", dep, x))
561 case 0:
562 // No more dependencies.
563 delete(db.dep, x)
564 return x.finalClose
565 default:
566 // Dependencies remain.
567 return func() error { return nil }
571 // This is the size of the connectionOpener request chan (DB.openerCh).
572 // This value should be larger than the maximum typical value
573 // used for db.maxOpen. If maxOpen is significantly larger than
574 // connectionRequestQueueSize then it is possible for ALL calls into the *DB
575 // to block until the connectionOpener can satisfy the backlog of requests.
576 var connectionRequestQueueSize = 1000000
578 // Open opens a database specified by its database driver name and a
579 // driver-specific data source name, usually consisting of at least a
580 // database name and connection information.
582 // Most users will open a database via a driver-specific connection
583 // helper function that returns a *DB. No database drivers are included
584 // in the Go standard library. See https://golang.org/s/sqldrivers for
585 // a list of third-party drivers.
587 // Open may just validate its arguments without creating a connection
588 // to the database. To verify that the data source name is valid, call
589 // Ping.
591 // The returned DB is safe for concurrent use by multiple goroutines
592 // and maintains its own pool of idle connections. Thus, the Open
593 // function should be called just once. It is rarely necessary to
594 // close a DB.
595 func Open(driverName, dataSourceName string) (*DB, error) {
596 driversMu.RLock()
597 driveri, ok := drivers[driverName]
598 driversMu.RUnlock()
599 if !ok {
600 return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
602 db := &DB{
603 driver: driveri,
604 dsn: dataSourceName,
605 openerCh: make(chan struct{}, connectionRequestQueueSize),
606 lastPut: make(map[*driverConn]string),
607 connRequests: make(map[uint64]chan connRequest),
609 go db.connectionOpener()
610 return db, nil
613 func (db *DB) pingDC(ctx context.Context, dc *driverConn, release func(error)) error {
614 var err error
615 if pinger, ok := dc.ci.(driver.Pinger); ok {
616 withLock(dc, func() {
617 err = pinger.Ping(ctx)
620 release(err)
621 return err
624 // PingContext verifies a connection to the database is still alive,
625 // establishing a connection if necessary.
626 func (db *DB) PingContext(ctx context.Context) error {
627 var dc *driverConn
628 var err error
630 for i := 0; i < maxBadConnRetries; i++ {
631 dc, err = db.conn(ctx, cachedOrNewConn)
632 if err != driver.ErrBadConn {
633 break
636 if err == driver.ErrBadConn {
637 dc, err = db.conn(ctx, alwaysNewConn)
639 if err != nil {
640 return err
643 return db.pingDC(ctx, dc, dc.releaseConn)
646 // Ping verifies a connection to the database is still alive,
647 // establishing a connection if necessary.
648 func (db *DB) Ping() error {
649 return db.PingContext(context.Background())
652 // Close closes the database, releasing any open resources.
654 // It is rare to Close a DB, as the DB handle is meant to be
655 // long-lived and shared between many goroutines.
656 func (db *DB) Close() error {
657 db.mu.Lock()
658 if db.closed { // Make DB.Close idempotent
659 db.mu.Unlock()
660 return nil
662 close(db.openerCh)
663 if db.cleanerCh != nil {
664 close(db.cleanerCh)
666 var err error
667 fns := make([]func() error, 0, len(db.freeConn))
668 for _, dc := range db.freeConn {
669 fns = append(fns, dc.closeDBLocked())
671 db.freeConn = nil
672 db.closed = true
673 for _, req := range db.connRequests {
674 close(req)
676 db.mu.Unlock()
677 for _, fn := range fns {
678 err1 := fn()
679 if err1 != nil {
680 err = err1
683 return err
686 const defaultMaxIdleConns = 2
688 func (db *DB) maxIdleConnsLocked() int {
689 n := db.maxIdle
690 switch {
691 case n == 0:
692 // TODO(bradfitz): ask driver, if supported, for its default preference
693 return defaultMaxIdleConns
694 case n < 0:
695 return 0
696 default:
697 return n
701 // SetMaxIdleConns sets the maximum number of connections in the idle
702 // connection pool.
704 // If MaxOpenConns is greater than 0 but less than the new MaxIdleConns
705 // then the new MaxIdleConns will be reduced to match the MaxOpenConns limit
707 // If n <= 0, no idle connections are retained.
708 func (db *DB) SetMaxIdleConns(n int) {
709 db.mu.Lock()
710 if n > 0 {
711 db.maxIdle = n
712 } else {
713 // No idle connections.
714 db.maxIdle = -1
716 // Make sure maxIdle doesn't exceed maxOpen
717 if db.maxOpen > 0 && db.maxIdleConnsLocked() > db.maxOpen {
718 db.maxIdle = db.maxOpen
720 var closing []*driverConn
721 idleCount := len(db.freeConn)
722 maxIdle := db.maxIdleConnsLocked()
723 if idleCount > maxIdle {
724 closing = db.freeConn[maxIdle:]
725 db.freeConn = db.freeConn[:maxIdle]
727 db.mu.Unlock()
728 for _, c := range closing {
729 c.Close()
733 // SetMaxOpenConns sets the maximum number of open connections to the database.
735 // If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than
736 // MaxIdleConns, then MaxIdleConns will be reduced to match the new
737 // MaxOpenConns limit
739 // If n <= 0, then there is no limit on the number of open connections.
740 // The default is 0 (unlimited).
741 func (db *DB) SetMaxOpenConns(n int) {
742 db.mu.Lock()
743 db.maxOpen = n
744 if n < 0 {
745 db.maxOpen = 0
747 syncMaxIdle := db.maxOpen > 0 && db.maxIdleConnsLocked() > db.maxOpen
748 db.mu.Unlock()
749 if syncMaxIdle {
750 db.SetMaxIdleConns(n)
754 // SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
756 // Expired connections may be closed lazily before reuse.
758 // If d <= 0, connections are reused forever.
759 func (db *DB) SetConnMaxLifetime(d time.Duration) {
760 if d < 0 {
761 d = 0
763 db.mu.Lock()
764 // wake cleaner up when lifetime is shortened.
765 if d > 0 && d < db.maxLifetime && db.cleanerCh != nil {
766 select {
767 case db.cleanerCh <- struct{}{}:
768 default:
771 db.maxLifetime = d
772 db.startCleanerLocked()
773 db.mu.Unlock()
776 // startCleanerLocked starts connectionCleaner if needed.
777 func (db *DB) startCleanerLocked() {
778 if db.maxLifetime > 0 && db.numOpen > 0 && db.cleanerCh == nil {
779 db.cleanerCh = make(chan struct{}, 1)
780 go db.connectionCleaner(db.maxLifetime)
784 func (db *DB) connectionCleaner(d time.Duration) {
785 const minInterval = time.Second
787 if d < minInterval {
788 d = minInterval
790 t := time.NewTimer(d)
792 for {
793 select {
794 case <-t.C:
795 case <-db.cleanerCh: // maxLifetime was changed or db was closed.
798 db.mu.Lock()
799 d = db.maxLifetime
800 if db.closed || db.numOpen == 0 || d <= 0 {
801 db.cleanerCh = nil
802 db.mu.Unlock()
803 return
806 expiredSince := nowFunc().Add(-d)
807 var closing []*driverConn
808 for i := 0; i < len(db.freeConn); i++ {
809 c := db.freeConn[i]
810 if c.createdAt.Before(expiredSince) {
811 closing = append(closing, c)
812 last := len(db.freeConn) - 1
813 db.freeConn[i] = db.freeConn[last]
814 db.freeConn[last] = nil
815 db.freeConn = db.freeConn[:last]
819 db.mu.Unlock()
821 for _, c := range closing {
822 c.Close()
825 if d < minInterval {
826 d = minInterval
828 t.Reset(d)
832 // DBStats contains database statistics.
833 type DBStats struct {
834 // OpenConnections is the number of open connections to the database.
835 OpenConnections int
838 // Stats returns database statistics.
839 func (db *DB) Stats() DBStats {
840 db.mu.Lock()
841 stats := DBStats{
842 OpenConnections: db.numOpen,
844 db.mu.Unlock()
845 return stats
848 // Assumes db.mu is locked.
849 // If there are connRequests and the connection limit hasn't been reached,
850 // then tell the connectionOpener to open new connections.
851 func (db *DB) maybeOpenNewConnections() {
852 numRequests := len(db.connRequests)
853 if db.maxOpen > 0 {
854 numCanOpen := db.maxOpen - db.numOpen
855 if numRequests > numCanOpen {
856 numRequests = numCanOpen
859 for numRequests > 0 {
860 db.numOpen++ // optimistically
861 numRequests--
862 if db.closed {
863 return
865 db.openerCh <- struct{}{}
869 // Runs in a separate goroutine, opens new connections when requested.
870 func (db *DB) connectionOpener() {
871 for range db.openerCh {
872 db.openNewConnection()
876 // Open one new connection
877 func (db *DB) openNewConnection() {
878 // maybeOpenNewConnctions has already executed db.numOpen++ before it sent
879 // on db.openerCh. This function must execute db.numOpen-- if the
880 // connection fails or is closed before returning.
881 ci, err := db.driver.Open(db.dsn)
882 db.mu.Lock()
883 defer db.mu.Unlock()
884 if db.closed {
885 if err == nil {
886 ci.Close()
888 db.numOpen--
889 return
891 if err != nil {
892 db.numOpen--
893 db.putConnDBLocked(nil, err)
894 db.maybeOpenNewConnections()
895 return
897 dc := &driverConn{
898 db: db,
899 createdAt: nowFunc(),
900 ci: ci,
902 if db.putConnDBLocked(dc, err) {
903 db.addDepLocked(dc, dc)
904 } else {
905 db.numOpen--
906 ci.Close()
910 // connRequest represents one request for a new connection
911 // When there are no idle connections available, DB.conn will create
912 // a new connRequest and put it on the db.connRequests list.
913 type connRequest struct {
914 conn *driverConn
915 err error
918 var errDBClosed = errors.New("sql: database is closed")
920 // nextRequestKeyLocked returns the next connection request key.
921 // It is assumed that nextRequest will not overflow.
922 func (db *DB) nextRequestKeyLocked() uint64 {
923 next := db.nextRequest
924 db.nextRequest++
925 return next
928 // conn returns a newly-opened or cached *driverConn.
929 func (db *DB) conn(ctx context.Context, strategy connReuseStrategy) (*driverConn, error) {
930 db.mu.Lock()
931 if db.closed {
932 db.mu.Unlock()
933 return nil, errDBClosed
935 // Check if the context is expired.
936 select {
937 default:
938 case <-ctx.Done():
939 db.mu.Unlock()
940 return nil, ctx.Err()
942 lifetime := db.maxLifetime
944 // Prefer a free connection, if possible.
945 numFree := len(db.freeConn)
946 if strategy == cachedOrNewConn && numFree > 0 {
947 conn := db.freeConn[0]
948 copy(db.freeConn, db.freeConn[1:])
949 db.freeConn = db.freeConn[:numFree-1]
950 conn.inUse = true
951 db.mu.Unlock()
952 if conn.expired(lifetime) {
953 conn.Close()
954 return nil, driver.ErrBadConn
956 return conn, nil
959 // Out of free connections or we were asked not to use one. If we're not
960 // allowed to open any more connections, make a request and wait.
961 if db.maxOpen > 0 && db.numOpen >= db.maxOpen {
962 // Make the connRequest channel. It's buffered so that the
963 // connectionOpener doesn't block while waiting for the req to be read.
964 req := make(chan connRequest, 1)
965 reqKey := db.nextRequestKeyLocked()
966 db.connRequests[reqKey] = req
967 db.mu.Unlock()
969 // Timeout the connection request with the context.
970 select {
971 case <-ctx.Done():
972 // Remove the connection request and ensure no value has been sent
973 // on it after removing.
974 db.mu.Lock()
975 delete(db.connRequests, reqKey)
976 db.mu.Unlock()
977 select {
978 default:
979 case ret, ok := <-req:
980 if ok {
981 db.putConn(ret.conn, ret.err)
984 return nil, ctx.Err()
985 case ret, ok := <-req:
986 if !ok {
987 return nil, errDBClosed
989 if ret.err == nil && ret.conn.expired(lifetime) {
990 ret.conn.Close()
991 return nil, driver.ErrBadConn
993 return ret.conn, ret.err
997 db.numOpen++ // optimistically
998 db.mu.Unlock()
999 ci, err := db.driver.Open(db.dsn)
1000 if err != nil {
1001 db.mu.Lock()
1002 db.numOpen-- // correct for earlier optimism
1003 db.maybeOpenNewConnections()
1004 db.mu.Unlock()
1005 return nil, err
1007 db.mu.Lock()
1008 dc := &driverConn{
1009 db: db,
1010 createdAt: nowFunc(),
1011 ci: ci,
1012 inUse: true,
1014 db.addDepLocked(dc, dc)
1015 db.mu.Unlock()
1016 return dc, nil
1019 // putConnHook is a hook for testing.
1020 var putConnHook func(*DB, *driverConn)
1022 // noteUnusedDriverStatement notes that ds is no longer used and should
1023 // be closed whenever possible (when c is next not in use), unless c is
1024 // already closed.
1025 func (db *DB) noteUnusedDriverStatement(c *driverConn, ds *driverStmt) {
1026 db.mu.Lock()
1027 defer db.mu.Unlock()
1028 if c.inUse {
1029 c.onPut = append(c.onPut, func() {
1030 ds.Close()
1032 } else {
1033 c.Lock()
1034 fc := c.finalClosed
1035 c.Unlock()
1036 if !fc {
1037 ds.Close()
1042 // debugGetPut determines whether getConn & putConn calls' stack traces
1043 // are returned for more verbose crashes.
1044 const debugGetPut = false
1046 // putConn adds a connection to the db's free pool.
1047 // err is optionally the last error that occurred on this connection.
1048 func (db *DB) putConn(dc *driverConn, err error) {
1049 db.mu.Lock()
1050 if !dc.inUse {
1051 if debugGetPut {
1052 fmt.Printf("putConn(%v) DUPLICATE was: %s\n\nPREVIOUS was: %s", dc, stack(), db.lastPut[dc])
1054 panic("sql: connection returned that was never out")
1056 if debugGetPut {
1057 db.lastPut[dc] = stack()
1059 dc.inUse = false
1061 for _, fn := range dc.onPut {
1062 fn()
1064 dc.onPut = nil
1066 if err == driver.ErrBadConn {
1067 // Don't reuse bad connections.
1068 // Since the conn is considered bad and is being discarded, treat it
1069 // as closed. Don't decrement the open count here, finalClose will
1070 // take care of that.
1071 db.maybeOpenNewConnections()
1072 db.mu.Unlock()
1073 dc.Close()
1074 return
1076 if putConnHook != nil {
1077 putConnHook(db, dc)
1079 added := db.putConnDBLocked(dc, nil)
1080 db.mu.Unlock()
1082 if !added {
1083 dc.Close()
1087 // Satisfy a connRequest or put the driverConn in the idle pool and return true
1088 // or return false.
1089 // putConnDBLocked will satisfy a connRequest if there is one, or it will
1090 // return the *driverConn to the freeConn list if err == nil and the idle
1091 // connection limit will not be exceeded.
1092 // If err != nil, the value of dc is ignored.
1093 // If err == nil, then dc must not equal nil.
1094 // If a connRequest was fulfilled or the *driverConn was placed in the
1095 // freeConn list, then true is returned, otherwise false is returned.
1096 func (db *DB) putConnDBLocked(dc *driverConn, err error) bool {
1097 if db.closed {
1098 return false
1100 if db.maxOpen > 0 && db.numOpen > db.maxOpen {
1101 return false
1103 if c := len(db.connRequests); c > 0 {
1104 var req chan connRequest
1105 var reqKey uint64
1106 for reqKey, req = range db.connRequests {
1107 break
1109 delete(db.connRequests, reqKey) // Remove from pending requests.
1110 if err == nil {
1111 dc.inUse = true
1113 req <- connRequest{
1114 conn: dc,
1115 err: err,
1117 return true
1118 } else if err == nil && !db.closed && db.maxIdleConnsLocked() > len(db.freeConn) {
1119 db.freeConn = append(db.freeConn, dc)
1120 db.startCleanerLocked()
1121 return true
1123 return false
1126 // maxBadConnRetries is the number of maximum retries if the driver returns
1127 // driver.ErrBadConn to signal a broken connection before forcing a new
1128 // connection to be opened.
1129 const maxBadConnRetries = 2
1131 // PrepareContext creates a prepared statement for later queries or executions.
1132 // Multiple queries or executions may be run concurrently from the
1133 // returned statement.
1134 // The caller must call the statement's Close method
1135 // when the statement is no longer needed.
1137 // The provided context is used for the preparation of the statement, not for the
1138 // execution of the statement.
1139 func (db *DB) PrepareContext(ctx context.Context, query string) (*Stmt, error) {
1140 var stmt *Stmt
1141 var err error
1142 for i := 0; i < maxBadConnRetries; i++ {
1143 stmt, err = db.prepare(ctx, query, cachedOrNewConn)
1144 if err != driver.ErrBadConn {
1145 break
1148 if err == driver.ErrBadConn {
1149 return db.prepare(ctx, query, alwaysNewConn)
1151 return stmt, err
1154 // Prepare creates a prepared statement for later queries or executions.
1155 // Multiple queries or executions may be run concurrently from the
1156 // returned statement.
1157 // The caller must call the statement's Close method
1158 // when the statement is no longer needed.
1159 func (db *DB) Prepare(query string) (*Stmt, error) {
1160 return db.PrepareContext(context.Background(), query)
1163 func (db *DB) prepare(ctx context.Context, query string, strategy connReuseStrategy) (*Stmt, error) {
1164 // TODO: check if db.driver supports an optional
1165 // driver.Preparer interface and call that instead, if so,
1166 // otherwise we make a prepared statement that's bound
1167 // to a connection, and to execute this prepared statement
1168 // we either need to use this connection (if it's free), else
1169 // get a new connection + re-prepare + execute on that one.
1170 dc, err := db.conn(ctx, strategy)
1171 if err != nil {
1172 return nil, err
1174 return db.prepareDC(ctx, dc, dc.releaseConn, nil, query)
1177 // prepareDC prepares a query on the driverConn and calls release before
1178 // returning. When cg == nil it implies that a connection pool is used, and
1179 // when cg != nil only a single driver connection is used.
1180 func (db *DB) prepareDC(ctx context.Context, dc *driverConn, release func(error), cg stmtConnGrabber, query string) (*Stmt, error) {
1181 var ds *driverStmt
1182 var err error
1183 defer func() {
1184 release(err)
1186 withLock(dc, func() {
1187 ds, err = dc.prepareLocked(ctx, cg, query)
1189 if err != nil {
1190 return nil, err
1192 stmt := &Stmt{
1193 db: db,
1194 query: query,
1195 cg: cg,
1196 cgds: ds,
1199 // When cg == nil this statement will need to keep track of various
1200 // connections they are prepared on and record the stmt dependency on
1201 // the DB.
1202 if cg == nil {
1203 stmt.css = []connStmt{{dc, ds}}
1204 stmt.lastNumClosed = atomic.LoadUint64(&db.numClosed)
1205 db.addDep(stmt, stmt)
1207 return stmt, nil
1210 // ExecContext executes a query without returning any rows.
1211 // The args are for any placeholder parameters in the query.
1212 func (db *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (Result, error) {
1213 var res Result
1214 var err error
1215 for i := 0; i < maxBadConnRetries; i++ {
1216 res, err = db.exec(ctx, query, args, cachedOrNewConn)
1217 if err != driver.ErrBadConn {
1218 break
1221 if err == driver.ErrBadConn {
1222 return db.exec(ctx, query, args, alwaysNewConn)
1224 return res, err
1227 // Exec executes a query without returning any rows.
1228 // The args are for any placeholder parameters in the query.
1229 func (db *DB) Exec(query string, args ...interface{}) (Result, error) {
1230 return db.ExecContext(context.Background(), query, args...)
1233 func (db *DB) exec(ctx context.Context, query string, args []interface{}, strategy connReuseStrategy) (Result, error) {
1234 dc, err := db.conn(ctx, strategy)
1235 if err != nil {
1236 return nil, err
1238 return db.execDC(ctx, dc, dc.releaseConn, query, args)
1241 func (db *DB) execDC(ctx context.Context, dc *driverConn, release func(error), query string, args []interface{}) (res Result, err error) {
1242 defer func() {
1243 release(err)
1245 if execer, ok := dc.ci.(driver.Execer); ok {
1246 var dargs []driver.NamedValue
1247 dargs, err = driverArgs(dc.ci, nil, args)
1248 if err != nil {
1249 return nil, err
1251 var resi driver.Result
1252 withLock(dc, func() {
1253 resi, err = ctxDriverExec(ctx, execer, query, dargs)
1255 if err != driver.ErrSkip {
1256 if err != nil {
1257 return nil, err
1259 return driverResult{dc, resi}, nil
1263 var si driver.Stmt
1264 withLock(dc, func() {
1265 si, err = ctxDriverPrepare(ctx, dc.ci, query)
1267 if err != nil {
1268 return nil, err
1270 ds := &driverStmt{Locker: dc, si: si}
1271 defer ds.Close()
1272 return resultFromStatement(ctx, dc.ci, ds, args...)
1275 // QueryContext executes a query that returns rows, typically a SELECT.
1276 // The args are for any placeholder parameters in the query.
1277 func (db *DB) QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) {
1278 var rows *Rows
1279 var err error
1280 for i := 0; i < maxBadConnRetries; i++ {
1281 rows, err = db.query(ctx, query, args, cachedOrNewConn)
1282 if err != driver.ErrBadConn {
1283 break
1286 if err == driver.ErrBadConn {
1287 return db.query(ctx, query, args, alwaysNewConn)
1289 return rows, err
1292 // Query executes a query that returns rows, typically a SELECT.
1293 // The args are for any placeholder parameters in the query.
1294 func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
1295 return db.QueryContext(context.Background(), query, args...)
1298 func (db *DB) query(ctx context.Context, query string, args []interface{}, strategy connReuseStrategy) (*Rows, error) {
1299 dc, err := db.conn(ctx, strategy)
1300 if err != nil {
1301 return nil, err
1304 return db.queryDC(ctx, nil, dc, dc.releaseConn, query, args)
1307 // queryDC executes a query on the given connection.
1308 // The connection gets released by the releaseConn function.
1309 // The ctx context is from a query method and the txctx context is from an
1310 // optional transaction context.
1311 func (db *DB) queryDC(ctx, txctx context.Context, dc *driverConn, releaseConn func(error), query string, args []interface{}) (*Rows, error) {
1312 if queryer, ok := dc.ci.(driver.Queryer); ok {
1313 dargs, err := driverArgs(dc.ci, nil, args)
1314 if err != nil {
1315 releaseConn(err)
1316 return nil, err
1318 var rowsi driver.Rows
1319 withLock(dc, func() {
1320 rowsi, err = ctxDriverQuery(ctx, queryer, query, dargs)
1322 if err != driver.ErrSkip {
1323 if err != nil {
1324 releaseConn(err)
1325 return nil, err
1327 // Note: ownership of dc passes to the *Rows, to be freed
1328 // with releaseConn.
1329 rows := &Rows{
1330 dc: dc,
1331 releaseConn: releaseConn,
1332 rowsi: rowsi,
1334 rows.initContextClose(ctx, txctx)
1335 return rows, nil
1339 var si driver.Stmt
1340 var err error
1341 withLock(dc, func() {
1342 si, err = ctxDriverPrepare(ctx, dc.ci, query)
1344 if err != nil {
1345 releaseConn(err)
1346 return nil, err
1349 ds := &driverStmt{Locker: dc, si: si}
1350 rowsi, err := rowsiFromStatement(ctx, dc.ci, ds, args...)
1351 if err != nil {
1352 ds.Close()
1353 releaseConn(err)
1354 return nil, err
1357 // Note: ownership of ci passes to the *Rows, to be freed
1358 // with releaseConn.
1359 rows := &Rows{
1360 dc: dc,
1361 releaseConn: releaseConn,
1362 rowsi: rowsi,
1363 closeStmt: ds,
1365 rows.initContextClose(ctx, txctx)
1366 return rows, nil
1369 // QueryRowContext executes a query that is expected to return at most one row.
1370 // QueryRowContext always returns a non-nil value. Errors are deferred until
1371 // Row's Scan method is called.
1372 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
1373 // Otherwise, the *Row's Scan scans the first selected row and discards
1374 // the rest.
1375 func (db *DB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *Row {
1376 rows, err := db.QueryContext(ctx, query, args...)
1377 return &Row{rows: rows, err: err}
1380 // QueryRow executes a query that is expected to return at most one row.
1381 // QueryRow always returns a non-nil value. Errors are deferred until
1382 // Row's Scan method is called.
1383 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
1384 // Otherwise, the *Row's Scan scans the first selected row and discards
1385 // the rest.
1386 func (db *DB) QueryRow(query string, args ...interface{}) *Row {
1387 return db.QueryRowContext(context.Background(), query, args...)
1390 // BeginTx starts a transaction.
1392 // The provided context is used until the transaction is committed or rolled back.
1393 // If the context is canceled, the sql package will roll back
1394 // the transaction. Tx.Commit will return an error if the context provided to
1395 // BeginTx is canceled.
1397 // The provided TxOptions is optional and may be nil if defaults should be used.
1398 // If a non-default isolation level is used that the driver doesn't support,
1399 // an error will be returned.
1400 func (db *DB) BeginTx(ctx context.Context, opts *TxOptions) (*Tx, error) {
1401 var tx *Tx
1402 var err error
1403 for i := 0; i < maxBadConnRetries; i++ {
1404 tx, err = db.begin(ctx, opts, cachedOrNewConn)
1405 if err != driver.ErrBadConn {
1406 break
1409 if err == driver.ErrBadConn {
1410 return db.begin(ctx, opts, alwaysNewConn)
1412 return tx, err
1415 // Begin starts a transaction. The default isolation level is dependent on
1416 // the driver.
1417 func (db *DB) Begin() (*Tx, error) {
1418 return db.BeginTx(context.Background(), nil)
1421 func (db *DB) begin(ctx context.Context, opts *TxOptions, strategy connReuseStrategy) (tx *Tx, err error) {
1422 dc, err := db.conn(ctx, strategy)
1423 if err != nil {
1424 return nil, err
1426 return db.beginDC(ctx, dc, dc.releaseConn, opts)
1429 // beginDC starts a transaction. The provided dc must be valid and ready to use.
1430 func (db *DB) beginDC(ctx context.Context, dc *driverConn, release func(error), opts *TxOptions) (tx *Tx, err error) {
1431 var txi driver.Tx
1432 withLock(dc, func() {
1433 txi, err = ctxDriverBegin(ctx, opts, dc.ci)
1435 if err != nil {
1436 release(err)
1437 return nil, err
1440 // Schedule the transaction to rollback when the context is cancelled.
1441 // The cancel function in Tx will be called after done is set to true.
1442 ctx, cancel := context.WithCancel(ctx)
1443 tx = &Tx{
1444 db: db,
1445 dc: dc,
1446 releaseConn: release,
1447 txi: txi,
1448 cancel: cancel,
1449 ctx: ctx,
1451 go tx.awaitDone()
1452 return tx, nil
1455 // Driver returns the database's underlying driver.
1456 func (db *DB) Driver() driver.Driver {
1457 return db.driver
1460 // ErrConnDone is returned by any operation that is performed on a connection
1461 // that has already been committed or rolled back.
1462 var ErrConnDone = errors.New("database/sql: connection is already closed")
1464 // Conn returns a single connection by either opening a new connection
1465 // or returning an existing connection from the connection pool. Conn will
1466 // block until either a connection is returned or ctx is canceled.
1467 // Queries run on the same Conn will be run in the same database session.
1469 // Every Conn must be returned to the database pool after use by
1470 // calling Conn.Close.
1471 func (db *DB) Conn(ctx context.Context) (*Conn, error) {
1472 var dc *driverConn
1473 var err error
1474 for i := 0; i < maxBadConnRetries; i++ {
1475 dc, err = db.conn(ctx, cachedOrNewConn)
1476 if err != driver.ErrBadConn {
1477 break
1480 if err == driver.ErrBadConn {
1481 dc, err = db.conn(ctx, cachedOrNewConn)
1483 if err != nil {
1484 return nil, err
1487 conn := &Conn{
1488 db: db,
1489 dc: dc,
1491 return conn, nil
1494 type releaseConn func(error)
1496 // Conn represents a single database session rather a pool of database
1497 // sessions. Prefer running queries from DB unless there is a specific
1498 // need for a continuous single database session.
1500 // A Conn must call Close to return the connection to the database pool
1501 // and may do so concurrently with a running query.
1503 // After a call to Close, all operations on the
1504 // connection fail with ErrConnDone.
1505 type Conn struct {
1506 db *DB
1508 // closemu prevents the connection from closing while there
1509 // is an active query. It is held for read during queries
1510 // and exclusively during close.
1511 closemu sync.RWMutex
1513 // dc is owned until close, at which point
1514 // it's returned to the connection pool.
1515 dc *driverConn
1517 // done transitions from 0 to 1 exactly once, on close.
1518 // Once done, all operations fail with ErrConnDone.
1519 // Use atomic operations on value when checking value.
1520 done int32
1523 func (c *Conn) grabConn(context.Context) (*driverConn, releaseConn, error) {
1524 if atomic.LoadInt32(&c.done) != 0 {
1525 return nil, nil, ErrConnDone
1527 c.closemu.RLock()
1528 return c.dc, c.closemuRUnlockCondReleaseConn, nil
1531 // PingContext verifies the connection to the database is still alive.
1532 func (c *Conn) PingContext(ctx context.Context) error {
1533 dc, release, err := c.grabConn(ctx)
1534 if err != nil {
1535 return err
1537 return c.db.pingDC(ctx, dc, release)
1540 // ExecContext executes a query without returning any rows.
1541 // The args are for any placeholder parameters in the query.
1542 func (c *Conn) ExecContext(ctx context.Context, query string, args ...interface{}) (Result, error) {
1543 dc, release, err := c.grabConn(ctx)
1544 if err != nil {
1545 return nil, err
1547 return c.db.execDC(ctx, dc, release, query, args)
1550 // QueryContext executes a query that returns rows, typically a SELECT.
1551 // The args are for any placeholder parameters in the query.
1552 func (c *Conn) QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) {
1553 dc, release, err := c.grabConn(ctx)
1554 if err != nil {
1555 return nil, err
1557 return c.db.queryDC(ctx, nil, dc, release, query, args)
1560 // QueryRowContext executes a query that is expected to return at most one row.
1561 // QueryRowContext always returns a non-nil value. Errors are deferred until
1562 // Row's Scan method is called.
1563 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
1564 // Otherwise, the *Row's Scan scans the first selected row and discards
1565 // the rest.
1566 func (c *Conn) QueryRowContext(ctx context.Context, query string, args ...interface{}) *Row {
1567 rows, err := c.QueryContext(ctx, query, args...)
1568 return &Row{rows: rows, err: err}
1571 // PrepareContext creates a prepared statement for later queries or executions.
1572 // Multiple queries or executions may be run concurrently from the
1573 // returned statement.
1574 // The caller must call the statement's Close method
1575 // when the statement is no longer needed.
1577 // The provided context is used for the preparation of the statement, not for the
1578 // execution of the statement.
1579 func (c *Conn) PrepareContext(ctx context.Context, query string) (*Stmt, error) {
1580 dc, release, err := c.grabConn(ctx)
1581 if err != nil {
1582 return nil, err
1584 return c.db.prepareDC(ctx, dc, release, c, query)
1587 // BeginTx starts a transaction.
1589 // The provided context is used until the transaction is committed or rolled back.
1590 // If the context is canceled, the sql package will roll back
1591 // the transaction. Tx.Commit will return an error if the context provided to
1592 // BeginTx is canceled.
1594 // The provided TxOptions is optional and may be nil if defaults should be used.
1595 // If a non-default isolation level is used that the driver doesn't support,
1596 // an error will be returned.
1597 func (c *Conn) BeginTx(ctx context.Context, opts *TxOptions) (*Tx, error) {
1598 dc, release, err := c.grabConn(ctx)
1599 if err != nil {
1600 return nil, err
1602 return c.db.beginDC(ctx, dc, release, opts)
1605 // closemuRUnlockCondReleaseConn read unlocks closemu
1606 // as the sql operation is done with the dc.
1607 func (c *Conn) closemuRUnlockCondReleaseConn(err error) {
1608 c.closemu.RUnlock()
1609 if err == driver.ErrBadConn {
1610 c.close(err)
1614 func (c *Conn) txCtx() context.Context {
1615 return nil
1618 func (c *Conn) close(err error) error {
1619 if !atomic.CompareAndSwapInt32(&c.done, 0, 1) {
1620 return ErrConnDone
1623 // Lock around releasing the driver connection
1624 // to ensure all queries have been stopped before doing so.
1625 c.closemu.Lock()
1626 defer c.closemu.Unlock()
1628 c.dc.releaseConn(err)
1629 c.dc = nil
1630 c.db = nil
1631 return err
1634 // Close returns the connection to the connection pool.
1635 // All operations after a Close will return with ErrConnDone.
1636 // Close is safe to call concurrently with other operations and will
1637 // block until all other operations finish. It may be useful to first
1638 // cancel any used context and then call close directly after.
1639 func (c *Conn) Close() error {
1640 return c.close(nil)
1643 // Tx is an in-progress database transaction.
1645 // A transaction must end with a call to Commit or Rollback.
1647 // After a call to Commit or Rollback, all operations on the
1648 // transaction fail with ErrTxDone.
1650 // The statements prepared for a transaction by calling
1651 // the transaction's Prepare or Stmt methods are closed
1652 // by the call to Commit or Rollback.
1653 type Tx struct {
1654 db *DB
1656 // closemu prevents the transaction from closing while there
1657 // is an active query. It is held for read during queries
1658 // and exclusively during close.
1659 closemu sync.RWMutex
1661 // dc is owned exclusively until Commit or Rollback, at which point
1662 // it's returned with putConn.
1663 dc *driverConn
1664 txi driver.Tx
1666 // releaseConn is called once the Tx is closed to release
1667 // any held driverConn back to the pool.
1668 releaseConn func(error)
1670 // done transitions from 0 to 1 exactly once, on Commit
1671 // or Rollback. once done, all operations fail with
1672 // ErrTxDone.
1673 // Use atomic operations on value when checking value.
1674 done int32
1676 // All Stmts prepared for this transaction. These will be closed after the
1677 // transaction has been committed or rolled back.
1678 stmts struct {
1679 sync.Mutex
1680 v []*Stmt
1683 // cancel is called after done transitions from 0 to 1.
1684 cancel func()
1686 // ctx lives for the life of the transaction.
1687 ctx context.Context
1690 // awaitDone blocks until the context in Tx is canceled and rolls back
1691 // the transaction if it's not already done.
1692 func (tx *Tx) awaitDone() {
1693 // Wait for either the transaction to be committed or rolled
1694 // back, or for the associated context to be closed.
1695 <-tx.ctx.Done()
1697 // Discard and close the connection used to ensure the
1698 // transaction is closed and the resources are released. This
1699 // rollback does nothing if the transaction has already been
1700 // committed or rolled back.
1701 tx.rollback(true)
1704 func (tx *Tx) isDone() bool {
1705 return atomic.LoadInt32(&tx.done) != 0
1708 // ErrTxDone is returned by any operation that is performed on a transaction
1709 // that has already been committed or rolled back.
1710 var ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back")
1712 // close returns the connection to the pool and
1713 // must only be called by Tx.rollback or Tx.Commit.
1714 func (tx *Tx) close(err error) {
1715 tx.cancel()
1717 tx.closemu.Lock()
1718 defer tx.closemu.Unlock()
1720 tx.releaseConn(err)
1721 tx.dc = nil
1722 tx.txi = nil
1725 // hookTxGrabConn specifies an optional hook to be called on
1726 // a successful call to (*Tx).grabConn. For tests.
1727 var hookTxGrabConn func()
1729 func (tx *Tx) grabConn(ctx context.Context) (*driverConn, releaseConn, error) {
1730 select {
1731 default:
1732 case <-ctx.Done():
1733 return nil, nil, ctx.Err()
1736 // closeme.RLock must come before the check for isDone to prevent the Tx from
1737 // closing while a query is executing.
1738 tx.closemu.RLock()
1739 if tx.isDone() {
1740 tx.closemu.RUnlock()
1741 return nil, nil, ErrTxDone
1743 if hookTxGrabConn != nil { // test hook
1744 hookTxGrabConn()
1746 return tx.dc, tx.closemuRUnlockRelease, nil
1749 func (tx *Tx) txCtx() context.Context {
1750 return tx.ctx
1753 // closemuRUnlockRelease is used as a func(error) method value in
1754 // ExecContext and QueryContext. Unlocking in the releaseConn keeps
1755 // the driver conn from being returned to the connection pool until
1756 // the Rows has been closed.
1757 func (tx *Tx) closemuRUnlockRelease(error) {
1758 tx.closemu.RUnlock()
1761 // Closes all Stmts prepared for this transaction.
1762 func (tx *Tx) closePrepared() {
1763 tx.stmts.Lock()
1764 defer tx.stmts.Unlock()
1765 for _, stmt := range tx.stmts.v {
1766 stmt.Close()
1770 // Commit commits the transaction.
1771 func (tx *Tx) Commit() error {
1772 if !atomic.CompareAndSwapInt32(&tx.done, 0, 1) {
1773 return ErrTxDone
1775 select {
1776 default:
1777 case <-tx.ctx.Done():
1778 return tx.ctx.Err()
1780 var err error
1781 withLock(tx.dc, func() {
1782 err = tx.txi.Commit()
1784 if err != driver.ErrBadConn {
1785 tx.closePrepared()
1787 tx.close(err)
1788 return err
1791 // rollback aborts the transaction and optionally forces the pool to discard
1792 // the connection.
1793 func (tx *Tx) rollback(discardConn bool) error {
1794 if !atomic.CompareAndSwapInt32(&tx.done, 0, 1) {
1795 return ErrTxDone
1797 var err error
1798 withLock(tx.dc, func() {
1799 err = tx.txi.Rollback()
1801 if err != driver.ErrBadConn {
1802 tx.closePrepared()
1804 if discardConn {
1805 err = driver.ErrBadConn
1807 tx.close(err)
1808 return err
1811 // Rollback aborts the transaction.
1812 func (tx *Tx) Rollback() error {
1813 return tx.rollback(false)
1816 // PrepareContext creates a prepared statement for use within a transaction.
1818 // The returned statement operates within the transaction and will be closed
1819 // when the transaction has been committed or rolled back.
1821 // To use an existing prepared statement on this transaction, see Tx.Stmt.
1823 // The provided context will be used for the preparation of the context, not
1824 // for the execution of the returned statement. The returned statement
1825 // will run in the transaction context.
1826 func (tx *Tx) PrepareContext(ctx context.Context, query string) (*Stmt, error) {
1827 dc, release, err := tx.grabConn(ctx)
1828 if err != nil {
1829 return nil, err
1832 stmt, err := tx.db.prepareDC(ctx, dc, release, tx, query)
1833 if err != nil {
1834 return nil, err
1836 tx.stmts.Lock()
1837 tx.stmts.v = append(tx.stmts.v, stmt)
1838 tx.stmts.Unlock()
1839 return stmt, nil
1842 // Prepare creates a prepared statement for use within a transaction.
1844 // The returned statement operates within the transaction and can no longer
1845 // be used once the transaction has been committed or rolled back.
1847 // To use an existing prepared statement on this transaction, see Tx.Stmt.
1848 func (tx *Tx) Prepare(query string) (*Stmt, error) {
1849 return tx.PrepareContext(context.Background(), query)
1852 // StmtContext returns a transaction-specific prepared statement from
1853 // an existing statement.
1855 // Example:
1856 // updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?")
1857 // ...
1858 // tx, err := db.Begin()
1859 // ...
1860 // res, err := tx.StmtContext(ctx, updateMoney).Exec(123.45, 98293203)
1862 // The returned statement operates within the transaction and will be closed
1863 // when the transaction has been committed or rolled back.
1864 func (tx *Tx) StmtContext(ctx context.Context, stmt *Stmt) *Stmt {
1865 dc, release, err := tx.grabConn(ctx)
1866 if err != nil {
1867 return &Stmt{stickyErr: err}
1869 defer release(nil)
1871 if tx.db != stmt.db {
1872 return &Stmt{stickyErr: errors.New("sql: Tx.Stmt: statement from different database used")}
1874 var si driver.Stmt
1875 var parentStmt *Stmt
1876 stmt.mu.Lock()
1877 if stmt.closed || stmt.cg != nil {
1878 // If the statement has been closed or already belongs to a
1879 // transaction, we can't reuse it in this connection.
1880 // Since tx.StmtContext should never need to be called with a
1881 // Stmt already belonging to tx, we ignore this edge case and
1882 // re-prepare the statement in this case. No need to add
1883 // code-complexity for this.
1884 stmt.mu.Unlock()
1885 withLock(dc, func() {
1886 si, err = ctxDriverPrepare(ctx, dc.ci, stmt.query)
1888 if err != nil {
1889 return &Stmt{stickyErr: err}
1891 } else {
1892 stmt.removeClosedStmtLocked()
1893 // See if the statement has already been prepared on this connection,
1894 // and reuse it if possible.
1895 for _, v := range stmt.css {
1896 if v.dc == dc {
1897 si = v.ds.si
1898 break
1902 stmt.mu.Unlock()
1904 if si == nil {
1905 cs, err := stmt.prepareOnConnLocked(ctx, dc)
1906 if err != nil {
1907 return &Stmt{stickyErr: err}
1909 si = cs.si
1911 parentStmt = stmt
1914 txs := &Stmt{
1915 db: tx.db,
1916 cg: tx,
1917 cgds: &driverStmt{
1918 Locker: dc,
1919 si: si,
1921 parentStmt: parentStmt,
1922 query: stmt.query,
1924 if parentStmt != nil {
1925 tx.db.addDep(parentStmt, txs)
1927 tx.stmts.Lock()
1928 tx.stmts.v = append(tx.stmts.v, txs)
1929 tx.stmts.Unlock()
1930 return txs
1933 // Stmt returns a transaction-specific prepared statement from
1934 // an existing statement.
1936 // Example:
1937 // updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?")
1938 // ...
1939 // tx, err := db.Begin()
1940 // ...
1941 // res, err := tx.Stmt(updateMoney).Exec(123.45, 98293203)
1943 // The returned statement operates within the transaction and will be closed
1944 // when the transaction has been committed or rolled back.
1945 func (tx *Tx) Stmt(stmt *Stmt) *Stmt {
1946 return tx.StmtContext(context.Background(), stmt)
1949 // ExecContext executes a query that doesn't return rows.
1950 // For example: an INSERT and UPDATE.
1951 func (tx *Tx) ExecContext(ctx context.Context, query string, args ...interface{}) (Result, error) {
1952 dc, release, err := tx.grabConn(ctx)
1953 if err != nil {
1954 return nil, err
1956 return tx.db.execDC(ctx, dc, release, query, args)
1959 // Exec executes a query that doesn't return rows.
1960 // For example: an INSERT and UPDATE.
1961 func (tx *Tx) Exec(query string, args ...interface{}) (Result, error) {
1962 return tx.ExecContext(context.Background(), query, args...)
1965 // QueryContext executes a query that returns rows, typically a SELECT.
1966 func (tx *Tx) QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) {
1967 dc, release, err := tx.grabConn(ctx)
1968 if err != nil {
1969 return nil, err
1972 return tx.db.queryDC(ctx, tx.ctx, dc, release, query, args)
1975 // Query executes a query that returns rows, typically a SELECT.
1976 func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) {
1977 return tx.QueryContext(context.Background(), query, args...)
1980 // QueryRowContext executes a query that is expected to return at most one row.
1981 // QueryRowContext always returns a non-nil value. Errors are deferred until
1982 // Row's Scan method is called.
1983 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
1984 // Otherwise, the *Row's Scan scans the first selected row and discards
1985 // the rest.
1986 func (tx *Tx) QueryRowContext(ctx context.Context, query string, args ...interface{}) *Row {
1987 rows, err := tx.QueryContext(ctx, query, args...)
1988 return &Row{rows: rows, err: err}
1991 // QueryRow executes a query that is expected to return at most one row.
1992 // QueryRow always returns a non-nil value. Errors are deferred until
1993 // Row's Scan method is called.
1994 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
1995 // Otherwise, the *Row's Scan scans the first selected row and discards
1996 // the rest.
1997 func (tx *Tx) QueryRow(query string, args ...interface{}) *Row {
1998 return tx.QueryRowContext(context.Background(), query, args...)
2001 // connStmt is a prepared statement on a particular connection.
2002 type connStmt struct {
2003 dc *driverConn
2004 ds *driverStmt
2007 // stmtConnGrabber represents a Tx or Conn that will return the underlying
2008 // driverConn and release function.
2009 type stmtConnGrabber interface {
2010 // grabConn returns the driverConn and the associated release function
2011 // that must be called when the operation completes.
2012 grabConn(context.Context) (*driverConn, releaseConn, error)
2014 // txCtx returns the transaction context if available.
2015 // The returned context should be selected on along with
2016 // any query context when awaiting a cancel.
2017 txCtx() context.Context
2020 var (
2021 _ stmtConnGrabber = &Tx{}
2022 _ stmtConnGrabber = &Conn{}
2025 // Stmt is a prepared statement.
2026 // A Stmt is safe for concurrent use by multiple goroutines.
2027 type Stmt struct {
2028 // Immutable:
2029 db *DB // where we came from
2030 query string // that created the Stmt
2031 stickyErr error // if non-nil, this error is returned for all operations
2033 closemu sync.RWMutex // held exclusively during close, for read otherwise.
2035 // If Stmt is prepared on a Tx or Conn then cg is present and will
2036 // only ever grab a connection from cg.
2037 // If cg is nil then the Stmt must grab an arbitrary connection
2038 // from db and determine if it must prepare the stmt again by
2039 // inspecting css.
2040 cg stmtConnGrabber
2041 cgds *driverStmt
2043 // parentStmt is set when a transaction-specific statement
2044 // is requested from an identical statement prepared on the same
2045 // conn. parentStmt is used to track the dependency of this statement
2046 // on its originating ("parent") statement so that parentStmt may
2047 // be closed by the user without them having to know whether or not
2048 // any transactions are still using it.
2049 parentStmt *Stmt
2051 mu sync.Mutex // protects the rest of the fields
2052 closed bool
2054 // css is a list of underlying driver statement interfaces
2055 // that are valid on particular connections. This is only
2056 // used if cg == nil and one is found that has idle
2057 // connections. If cg != nil, cgds is always used.
2058 css []connStmt
2060 // lastNumClosed is copied from db.numClosed when Stmt is created
2061 // without tx and closed connections in css are removed.
2062 lastNumClosed uint64
2065 // ExecContext executes a prepared statement with the given arguments and
2066 // returns a Result summarizing the effect of the statement.
2067 func (s *Stmt) ExecContext(ctx context.Context, args ...interface{}) (Result, error) {
2068 s.closemu.RLock()
2069 defer s.closemu.RUnlock()
2071 var res Result
2072 strategy := cachedOrNewConn
2073 for i := 0; i < maxBadConnRetries+1; i++ {
2074 if i == maxBadConnRetries {
2075 strategy = alwaysNewConn
2077 dc, releaseConn, ds, err := s.connStmt(ctx, strategy)
2078 if err != nil {
2079 if err == driver.ErrBadConn {
2080 continue
2082 return nil, err
2085 res, err = resultFromStatement(ctx, dc.ci, ds, args...)
2086 releaseConn(err)
2087 if err != driver.ErrBadConn {
2088 return res, err
2091 return nil, driver.ErrBadConn
2094 // Exec executes a prepared statement with the given arguments and
2095 // returns a Result summarizing the effect of the statement.
2096 func (s *Stmt) Exec(args ...interface{}) (Result, error) {
2097 return s.ExecContext(context.Background(), args...)
2100 func resultFromStatement(ctx context.Context, ci driver.Conn, ds *driverStmt, args ...interface{}) (Result, error) {
2101 dargs, err := driverArgs(ci, ds, args)
2102 if err != nil {
2103 return nil, err
2106 ds.Lock()
2107 defer ds.Unlock()
2109 resi, err := ctxDriverStmtExec(ctx, ds.si, dargs)
2110 if err != nil {
2111 return nil, err
2113 return driverResult{ds.Locker, resi}, nil
2116 // removeClosedStmtLocked removes closed conns in s.css.
2118 // To avoid lock contention on DB.mu, we do it only when
2119 // s.db.numClosed - s.lastNum is large enough.
2120 func (s *Stmt) removeClosedStmtLocked() {
2121 t := len(s.css)/2 + 1
2122 if t > 10 {
2123 t = 10
2125 dbClosed := atomic.LoadUint64(&s.db.numClosed)
2126 if dbClosed-s.lastNumClosed < uint64(t) {
2127 return
2130 s.db.mu.Lock()
2131 for i := 0; i < len(s.css); i++ {
2132 if s.css[i].dc.dbmuClosed {
2133 s.css[i] = s.css[len(s.css)-1]
2134 s.css = s.css[:len(s.css)-1]
2138 s.db.mu.Unlock()
2139 s.lastNumClosed = dbClosed
2142 // connStmt returns a free driver connection on which to execute the
2143 // statement, a function to call to release the connection, and a
2144 // statement bound to that connection.
2145 func (s *Stmt) connStmt(ctx context.Context, strategy connReuseStrategy) (dc *driverConn, releaseConn func(error), ds *driverStmt, err error) {
2146 if err = s.stickyErr; err != nil {
2147 return
2149 s.mu.Lock()
2150 if s.closed {
2151 s.mu.Unlock()
2152 err = errors.New("sql: statement is closed")
2153 return
2156 // In a transaction or connection, we always use the connection that the
2157 // the stmt was created on.
2158 if s.cg != nil {
2159 s.mu.Unlock()
2160 dc, releaseConn, err = s.cg.grabConn(ctx) // blocks, waiting for the connection.
2161 if err != nil {
2162 return
2164 return dc, releaseConn, s.cgds, nil
2167 s.removeClosedStmtLocked()
2168 s.mu.Unlock()
2170 dc, err = s.db.conn(ctx, strategy)
2171 if err != nil {
2172 return nil, nil, nil, err
2175 s.mu.Lock()
2176 for _, v := range s.css {
2177 if v.dc == dc {
2178 s.mu.Unlock()
2179 return dc, dc.releaseConn, v.ds, nil
2182 s.mu.Unlock()
2184 // No luck; we need to prepare the statement on this connection
2185 withLock(dc, func() {
2186 ds, err = s.prepareOnConnLocked(ctx, dc)
2188 if err != nil {
2189 dc.releaseConn(err)
2190 return nil, nil, nil, err
2193 return dc, dc.releaseConn, ds, nil
2196 // prepareOnConnLocked prepares the query in Stmt s on dc and adds it to the list of
2197 // open connStmt on the statement. It assumes the caller is holding the lock on dc.
2198 func (s *Stmt) prepareOnConnLocked(ctx context.Context, dc *driverConn) (*driverStmt, error) {
2199 si, err := dc.prepareLocked(ctx, s.cg, s.query)
2200 if err != nil {
2201 return nil, err
2203 cs := connStmt{dc, si}
2204 s.mu.Lock()
2205 s.css = append(s.css, cs)
2206 s.mu.Unlock()
2207 return cs.ds, nil
2210 // QueryContext executes a prepared query statement with the given arguments
2211 // and returns the query results as a *Rows.
2212 func (s *Stmt) QueryContext(ctx context.Context, args ...interface{}) (*Rows, error) {
2213 s.closemu.RLock()
2214 defer s.closemu.RUnlock()
2216 var rowsi driver.Rows
2217 strategy := cachedOrNewConn
2218 for i := 0; i < maxBadConnRetries+1; i++ {
2219 if i == maxBadConnRetries {
2220 strategy = alwaysNewConn
2222 dc, releaseConn, ds, err := s.connStmt(ctx, strategy)
2223 if err != nil {
2224 if err == driver.ErrBadConn {
2225 continue
2227 return nil, err
2230 rowsi, err = rowsiFromStatement(ctx, dc.ci, ds, args...)
2231 if err == nil {
2232 // Note: ownership of ci passes to the *Rows, to be freed
2233 // with releaseConn.
2234 rows := &Rows{
2235 dc: dc,
2236 rowsi: rowsi,
2237 // releaseConn set below
2239 // addDep must be added before initContextClose or it could attempt
2240 // to removeDep before it has been added.
2241 s.db.addDep(s, rows)
2243 // releaseConn must be set before initContextClose or it could
2244 // release the connection before it is set.
2245 rows.releaseConn = func(err error) {
2246 releaseConn(err)
2247 s.db.removeDep(s, rows)
2249 var txctx context.Context
2250 if s.cg != nil {
2251 txctx = s.cg.txCtx()
2253 rows.initContextClose(ctx, txctx)
2254 return rows, nil
2257 releaseConn(err)
2258 if err != driver.ErrBadConn {
2259 return nil, err
2262 return nil, driver.ErrBadConn
2265 // Query executes a prepared query statement with the given arguments
2266 // and returns the query results as a *Rows.
2267 func (s *Stmt) Query(args ...interface{}) (*Rows, error) {
2268 return s.QueryContext(context.Background(), args...)
2271 func rowsiFromStatement(ctx context.Context, ci driver.Conn, ds *driverStmt, args ...interface{}) (driver.Rows, error) {
2272 var want int
2273 withLock(ds, func() {
2274 want = ds.si.NumInput()
2277 // -1 means the driver doesn't know how to count the number of
2278 // placeholders, so we won't sanity check input here and instead let the
2279 // driver deal with errors.
2280 if want != -1 && len(args) != want {
2281 return nil, fmt.Errorf("sql: statement expects %d inputs; got %d", want, len(args))
2284 dargs, err := driverArgs(ci, ds, args)
2285 if err != nil {
2286 return nil, err
2289 ds.Lock()
2290 defer ds.Unlock()
2292 rowsi, err := ctxDriverStmtQuery(ctx, ds.si, dargs)
2293 if err != nil {
2294 return nil, err
2296 return rowsi, nil
2299 // QueryRowContext executes a prepared query statement with the given arguments.
2300 // If an error occurs during the execution of the statement, that error will
2301 // be returned by a call to Scan on the returned *Row, which is always non-nil.
2302 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
2303 // Otherwise, the *Row's Scan scans the first selected row and discards
2304 // the rest.
2306 // Example usage:
2308 // var name string
2309 // err := nameByUseridStmt.QueryRowContext(ctx, id).Scan(&name)
2310 func (s *Stmt) QueryRowContext(ctx context.Context, args ...interface{}) *Row {
2311 rows, err := s.QueryContext(ctx, args...)
2312 if err != nil {
2313 return &Row{err: err}
2315 return &Row{rows: rows}
2318 // QueryRow executes a prepared query statement with the given arguments.
2319 // If an error occurs during the execution of the statement, that error will
2320 // be returned by a call to Scan on the returned *Row, which is always non-nil.
2321 // If the query selects no rows, the *Row's Scan will return ErrNoRows.
2322 // Otherwise, the *Row's Scan scans the first selected row and discards
2323 // the rest.
2325 // Example usage:
2327 // var name string
2328 // err := nameByUseridStmt.QueryRow(id).Scan(&name)
2329 func (s *Stmt) QueryRow(args ...interface{}) *Row {
2330 return s.QueryRowContext(context.Background(), args...)
2333 // Close closes the statement.
2334 func (s *Stmt) Close() error {
2335 s.closemu.Lock()
2336 defer s.closemu.Unlock()
2338 if s.stickyErr != nil {
2339 return s.stickyErr
2341 s.mu.Lock()
2342 if s.closed {
2343 s.mu.Unlock()
2344 return nil
2346 s.closed = true
2347 txds := s.cgds
2348 s.cgds = nil
2350 s.mu.Unlock()
2352 if s.cg == nil {
2353 return s.db.removeDep(s, s)
2356 if s.parentStmt != nil {
2357 // If parentStmt is set, we must not close s.txds since it's stored
2358 // in the css array of the parentStmt.
2359 return s.db.removeDep(s.parentStmt, s)
2361 return txds.Close()
2364 func (s *Stmt) finalClose() error {
2365 s.mu.Lock()
2366 defer s.mu.Unlock()
2367 if s.css != nil {
2368 for _, v := range s.css {
2369 s.db.noteUnusedDriverStatement(v.dc, v.ds)
2370 v.dc.removeOpenStmt(v.ds)
2372 s.css = nil
2374 return nil
2377 // Rows is the result of a query. Its cursor starts before the first row
2378 // of the result set. Use Next to advance through the rows:
2380 // rows, err := db.Query("SELECT ...")
2381 // ...
2382 // defer rows.Close()
2383 // for rows.Next() {
2384 // var id int
2385 // var name string
2386 // err = rows.Scan(&id, &name)
2387 // ...
2388 // }
2389 // err = rows.Err() // get any error encountered during iteration
2390 // ...
2391 type Rows struct {
2392 dc *driverConn // owned; must call releaseConn when closed to release
2393 releaseConn func(error)
2394 rowsi driver.Rows
2395 cancel func() // called when Rows is closed, may be nil.
2396 closeStmt *driverStmt // if non-nil, statement to Close on close
2398 // closemu prevents Rows from closing while there
2399 // is an active streaming result. It is held for read during non-close operations
2400 // and exclusively during close.
2402 // closemu guards lasterr and closed.
2403 closemu sync.RWMutex
2404 closed bool
2405 lasterr error // non-nil only if closed is true
2407 // lastcols is only used in Scan, Next, and NextResultSet which are expected
2408 // not to be called concurrently.
2409 lastcols []driver.Value
2412 func (rs *Rows) initContextClose(ctx, txctx context.Context) {
2413 ctx, rs.cancel = context.WithCancel(ctx)
2414 go rs.awaitDone(ctx, txctx)
2417 // awaitDone blocks until either ctx or txctx is canceled. The ctx is provided
2418 // from the query context and is canceled when the query Rows is closed.
2419 // If the query was issued in a transaction, the transaction's context
2420 // is also provided in txctx to ensure Rows is closed if the Tx is closed.
2421 func (rs *Rows) awaitDone(ctx, txctx context.Context) {
2422 var txctxDone <-chan struct{}
2423 if txctx != nil {
2424 txctxDone = txctx.Done()
2426 select {
2427 case <-ctx.Done():
2428 case <-txctxDone:
2430 rs.close(ctx.Err())
2433 // Next prepares the next result row for reading with the Scan method. It
2434 // returns true on success, or false if there is no next result row or an error
2435 // happened while preparing it. Err should be consulted to distinguish between
2436 // the two cases.
2438 // Every call to Scan, even the first one, must be preceded by a call to Next.
2439 func (rs *Rows) Next() bool {
2440 var doClose, ok bool
2441 withLock(rs.closemu.RLocker(), func() {
2442 doClose, ok = rs.nextLocked()
2444 if doClose {
2445 rs.Close()
2447 return ok
2450 func (rs *Rows) nextLocked() (doClose, ok bool) {
2451 if rs.closed {
2452 return false, false
2454 if rs.lastcols == nil {
2455 rs.lastcols = make([]driver.Value, len(rs.rowsi.Columns()))
2457 rs.lasterr = rs.rowsi.Next(rs.lastcols)
2458 if rs.lasterr != nil {
2459 // Close the connection if there is a driver error.
2460 if rs.lasterr != io.EOF {
2461 return true, false
2463 nextResultSet, ok := rs.rowsi.(driver.RowsNextResultSet)
2464 if !ok {
2465 return true, false
2467 // The driver is at the end of the current result set.
2468 // Test to see if there is another result set after the current one.
2469 // Only close Rows if there is no further result sets to read.
2470 if !nextResultSet.HasNextResultSet() {
2471 doClose = true
2473 return doClose, false
2475 return false, true
2478 // NextResultSet prepares the next result set for reading. It returns true if
2479 // there is further result sets, or false if there is no further result set
2480 // or if there is an error advancing to it. The Err method should be consulted
2481 // to distinguish between the two cases.
2483 // After calling NextResultSet, the Next method should always be called before
2484 // scanning. If there are further result sets they may not have rows in the result
2485 // set.
2486 func (rs *Rows) NextResultSet() bool {
2487 var doClose bool
2488 defer func() {
2489 if doClose {
2490 rs.Close()
2493 rs.closemu.RLock()
2494 defer rs.closemu.RUnlock()
2496 if rs.closed {
2497 return false
2500 rs.lastcols = nil
2501 nextResultSet, ok := rs.rowsi.(driver.RowsNextResultSet)
2502 if !ok {
2503 doClose = true
2504 return false
2506 rs.lasterr = nextResultSet.NextResultSet()
2507 if rs.lasterr != nil {
2508 doClose = true
2509 return false
2511 return true
2514 // Err returns the error, if any, that was encountered during iteration.
2515 // Err may be called after an explicit or implicit Close.
2516 func (rs *Rows) Err() error {
2517 rs.closemu.RLock()
2518 defer rs.closemu.RUnlock()
2519 if rs.lasterr == io.EOF {
2520 return nil
2522 return rs.lasterr
2525 // Columns returns the column names.
2526 // Columns returns an error if the rows are closed, or if the rows
2527 // are from QueryRow and there was a deferred error.
2528 func (rs *Rows) Columns() ([]string, error) {
2529 rs.closemu.RLock()
2530 defer rs.closemu.RUnlock()
2531 if rs.closed {
2532 return nil, errors.New("sql: Rows are closed")
2534 if rs.rowsi == nil {
2535 return nil, errors.New("sql: no Rows available")
2537 return rs.rowsi.Columns(), nil
2540 // ColumnTypes returns column information such as column type, length,
2541 // and nullable. Some information may not be available from some drivers.
2542 func (rs *Rows) ColumnTypes() ([]*ColumnType, error) {
2543 rs.closemu.RLock()
2544 defer rs.closemu.RUnlock()
2545 if rs.closed {
2546 return nil, errors.New("sql: Rows are closed")
2548 if rs.rowsi == nil {
2549 return nil, errors.New("sql: no Rows available")
2551 return rowsColumnInfoSetup(rs.rowsi), nil
2554 // ColumnType contains the name and type of a column.
2555 type ColumnType struct {
2556 name string
2558 hasNullable bool
2559 hasLength bool
2560 hasPrecisionScale bool
2562 nullable bool
2563 length int64
2564 databaseType string
2565 precision int64
2566 scale int64
2567 scanType reflect.Type
2570 // Name returns the name or alias of the column.
2571 func (ci *ColumnType) Name() string {
2572 return ci.name
2575 // Length returns the column type length for variable length column types such
2576 // as text and binary field types. If the type length is unbounded the value will
2577 // be math.MaxInt64 (any database limits will still apply).
2578 // If the column type is not variable length, such as an int, or if not supported
2579 // by the driver ok is false.
2580 func (ci *ColumnType) Length() (length int64, ok bool) {
2581 return ci.length, ci.hasLength
2584 // DecimalSize returns the scale and precision of a decimal type.
2585 // If not applicable or if not supported ok is false.
2586 func (ci *ColumnType) DecimalSize() (precision, scale int64, ok bool) {
2587 return ci.precision, ci.scale, ci.hasPrecisionScale
2590 // ScanType returns a Go type suitable for scanning into using Rows.Scan.
2591 // If a driver does not support this property ScanType will return
2592 // the type of an empty interface.
2593 func (ci *ColumnType) ScanType() reflect.Type {
2594 return ci.scanType
2597 // Nullable returns whether the column may be null.
2598 // If a driver does not support this property ok will be false.
2599 func (ci *ColumnType) Nullable() (nullable, ok bool) {
2600 return ci.nullable, ci.hasNullable
2603 // DatabaseTypeName returns the database system name of the column type. If an empty
2604 // string is returned the driver type name is not supported.
2605 // Consult your driver documentation for a list of driver data types. Length specifiers
2606 // are not included.
2607 // Common type include "VARCHAR", "TEXT", "NVARCHAR", "DECIMAL", "BOOL", "INT", "BIGINT".
2608 func (ci *ColumnType) DatabaseTypeName() string {
2609 return ci.databaseType
2612 func rowsColumnInfoSetup(rowsi driver.Rows) []*ColumnType {
2613 names := rowsi.Columns()
2615 list := make([]*ColumnType, len(names))
2616 for i := range list {
2617 ci := &ColumnType{
2618 name: names[i],
2620 list[i] = ci
2622 if prop, ok := rowsi.(driver.RowsColumnTypeScanType); ok {
2623 ci.scanType = prop.ColumnTypeScanType(i)
2624 } else {
2625 ci.scanType = reflect.TypeOf(new(interface{})).Elem()
2627 if prop, ok := rowsi.(driver.RowsColumnTypeDatabaseTypeName); ok {
2628 ci.databaseType = prop.ColumnTypeDatabaseTypeName(i)
2630 if prop, ok := rowsi.(driver.RowsColumnTypeLength); ok {
2631 ci.length, ci.hasLength = prop.ColumnTypeLength(i)
2633 if prop, ok := rowsi.(driver.RowsColumnTypeNullable); ok {
2634 ci.nullable, ci.hasNullable = prop.ColumnTypeNullable(i)
2636 if prop, ok := rowsi.(driver.RowsColumnTypePrecisionScale); ok {
2637 ci.precision, ci.scale, ci.hasPrecisionScale = prop.ColumnTypePrecisionScale(i)
2640 return list
2643 // Scan copies the columns in the current row into the values pointed
2644 // at by dest. The number of values in dest must be the same as the
2645 // number of columns in Rows.
2647 // Scan converts columns read from the database into the following
2648 // common Go types and special types provided by the sql package:
2650 // *string
2651 // *[]byte
2652 // *int, *int8, *int16, *int32, *int64
2653 // *uint, *uint8, *uint16, *uint32, *uint64
2654 // *bool
2655 // *float32, *float64
2656 // *interface{}
2657 // *RawBytes
2658 // any type implementing Scanner (see Scanner docs)
2660 // In the most simple case, if the type of the value from the source
2661 // column is an integer, bool or string type T and dest is of type *T,
2662 // Scan simply assigns the value through the pointer.
2664 // Scan also converts between string and numeric types, as long as no
2665 // information would be lost. While Scan stringifies all numbers
2666 // scanned from numeric database columns into *string, scans into
2667 // numeric types are checked for overflow. For example, a float64 with
2668 // value 300 or a string with value "300" can scan into a uint16, but
2669 // not into a uint8, though float64(255) or "255" can scan into a
2670 // uint8. One exception is that scans of some float64 numbers to
2671 // strings may lose information when stringifying. In general, scan
2672 // floating point columns into *float64.
2674 // If a dest argument has type *[]byte, Scan saves in that argument a
2675 // copy of the corresponding data. The copy is owned by the caller and
2676 // can be modified and held indefinitely. The copy can be avoided by
2677 // using an argument of type *RawBytes instead; see the documentation
2678 // for RawBytes for restrictions on its use.
2680 // If an argument has type *interface{}, Scan copies the value
2681 // provided by the underlying driver without conversion. When scanning
2682 // from a source value of type []byte to *interface{}, a copy of the
2683 // slice is made and the caller owns the result.
2685 // Source values of type time.Time may be scanned into values of type
2686 // *time.Time, *interface{}, *string, or *[]byte. When converting to
2687 // the latter two, time.Format3339Nano is used.
2689 // Source values of type bool may be scanned into types *bool,
2690 // *interface{}, *string, *[]byte, or *RawBytes.
2692 // For scanning into *bool, the source may be true, false, 1, 0, or
2693 // string inputs parseable by strconv.ParseBool.
2694 func (rs *Rows) Scan(dest ...interface{}) error {
2695 rs.closemu.RLock()
2696 if rs.closed {
2697 rs.closemu.RUnlock()
2698 return errors.New("sql: Rows are closed")
2700 rs.closemu.RUnlock()
2702 if rs.lastcols == nil {
2703 return errors.New("sql: Scan called without calling Next")
2705 if len(dest) != len(rs.lastcols) {
2706 return fmt.Errorf("sql: expected %d destination arguments in Scan, not %d", len(rs.lastcols), len(dest))
2708 for i, sv := range rs.lastcols {
2709 err := convertAssign(dest[i], sv)
2710 if err != nil {
2711 return fmt.Errorf("sql: Scan error on column index %d: %v", i, err)
2714 return nil
2717 // rowsCloseHook returns a function so tests may install the
2718 // hook through a test only mutex.
2719 var rowsCloseHook = func() func(*Rows, *error) { return nil }
2721 // Close closes the Rows, preventing further enumeration. If Next is called
2722 // and returns false and there are no further result sets,
2723 // the Rows are closed automatically and it will suffice to check the
2724 // result of Err. Close is idempotent and does not affect the result of Err.
2725 func (rs *Rows) Close() error {
2726 return rs.close(nil)
2729 func (rs *Rows) close(err error) error {
2730 rs.closemu.Lock()
2731 defer rs.closemu.Unlock()
2733 if rs.closed {
2734 return nil
2736 rs.closed = true
2738 if rs.lasterr == nil {
2739 rs.lasterr = err
2742 withLock(rs.dc, func() {
2743 err = rs.rowsi.Close()
2745 if fn := rowsCloseHook(); fn != nil {
2746 fn(rs, &err)
2748 if rs.cancel != nil {
2749 rs.cancel()
2752 if rs.closeStmt != nil {
2753 rs.closeStmt.Close()
2755 rs.releaseConn(err)
2756 return err
2759 // Row is the result of calling QueryRow to select a single row.
2760 type Row struct {
2761 // One of these two will be non-nil:
2762 err error // deferred error for easy chaining
2763 rows *Rows
2766 // Scan copies the columns from the matched row into the values
2767 // pointed at by dest. See the documentation on Rows.Scan for details.
2768 // If more than one row matches the query,
2769 // Scan uses the first row and discards the rest. If no row matches
2770 // the query, Scan returns ErrNoRows.
2771 func (r *Row) Scan(dest ...interface{}) error {
2772 if r.err != nil {
2773 return r.err
2776 // TODO(bradfitz): for now we need to defensively clone all
2777 // []byte that the driver returned (not permitting
2778 // *RawBytes in Rows.Scan), since we're about to close
2779 // the Rows in our defer, when we return from this function.
2780 // the contract with the driver.Next(...) interface is that it
2781 // can return slices into read-only temporary memory that's
2782 // only valid until the next Scan/Close. But the TODO is that
2783 // for a lot of drivers, this copy will be unnecessary. We
2784 // should provide an optional interface for drivers to
2785 // implement to say, "don't worry, the []bytes that I return
2786 // from Next will not be modified again." (for instance, if
2787 // they were obtained from the network anyway) But for now we
2788 // don't care.
2789 defer r.rows.Close()
2790 for _, dp := range dest {
2791 if _, ok := dp.(*RawBytes); ok {
2792 return errors.New("sql: RawBytes isn't allowed on Row.Scan")
2796 if !r.rows.Next() {
2797 if err := r.rows.Err(); err != nil {
2798 return err
2800 return ErrNoRows
2802 err := r.rows.Scan(dest...)
2803 if err != nil {
2804 return err
2806 // Make sure the query can be processed to completion with no errors.
2807 if err := r.rows.Close(); err != nil {
2808 return err
2811 return nil
2814 // A Result summarizes an executed SQL command.
2815 type Result interface {
2816 // LastInsertId returns the integer generated by the database
2817 // in response to a command. Typically this will be from an
2818 // "auto increment" column when inserting a new row. Not all
2819 // databases support this feature, and the syntax of such
2820 // statements varies.
2821 LastInsertId() (int64, error)
2823 // RowsAffected returns the number of rows affected by an
2824 // update, insert, or delete. Not every database or database
2825 // driver may support this.
2826 RowsAffected() (int64, error)
2829 type driverResult struct {
2830 sync.Locker // the *driverConn
2831 resi driver.Result
2834 func (dr driverResult) LastInsertId() (int64, error) {
2835 dr.Lock()
2836 defer dr.Unlock()
2837 return dr.resi.LastInsertId()
2840 func (dr driverResult) RowsAffected() (int64, error) {
2841 dr.Lock()
2842 defer dr.Unlock()
2843 return dr.resi.RowsAffected()
2846 func stack() string {
2847 var buf [2 << 10]byte
2848 return string(buf[:runtime.Stack(buf[:], false)])
2851 // withLock runs while holding lk.
2852 func withLock(lk sync.Locker, fn func()) {
2853 lk.Lock()
2854 defer lk.Unlock() // in case fn panics
2855 fn()