sql.go 44.8 KB
Newer Older
1 2 3 4 5 6
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package sql provides a generic interface around SQL (or SQL-like)
// databases.
7 8 9
//
// The sql package must be used in conjunction with a database driver.
// See http://golang.org/s/sqldrivers for a list of drivers.
10 11 12
//
// For more usage examples, see the wiki page at
// http://golang.org/s/sqlwiki.
13 14 15
package sql

import (
16
	"database/sql/driver"
17
	"errors"
18
	"fmt"
19
	"io"
20
	"runtime"
21
	"sort"
22 23 24 25 26 27 28 29 30 31
	"sync"
)

var drivers = make(map[string]driver.Driver)

// Register makes a database driver available by the provided name.
// If Register is called twice with the same name or if driver is nil,
// it panics.
func Register(name string, driver driver.Driver) {
	if driver == nil {
32
		panic("sql: Register driver is nil")
33 34
	}
	if _, dup := drivers[name]; dup {
35
		panic("sql: Register called twice for driver " + name)
36 37 38 39
	}
	drivers[name] = driver
}

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
func unregisterAllDrivers() {
	// For tests.
	drivers = make(map[string]driver.Driver)
}

// Drivers returns a sorted list of the names of the registered drivers.
func Drivers() []string {
	var list []string
	for name := range drivers {
		list = append(list, name)
	}
	sort.Strings(list)
	return list
}

55 56 57 58 59 60
// RawBytes is a byte slice that holds a reference to memory owned by
// the database itself. After a Scan into a RawBytes, the slice is only
// valid until the next call to Next, Scan, or Close.
type RawBytes []byte

// NullString represents a string that may be null.
61
// NullString implements the Scanner interface so
62 63
// it can be used as a scan destination:
//
64
//  var s NullString
65 66 67 68 69 70 71 72
//  err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
//  ...
//  if s.Valid {
//     // use s.String
//  } else {
//     // NULL value
//  }
//
73
type NullString struct {
74 75 76 77
	String string
	Valid  bool // Valid is true if String is not NULL
}

78 79
// Scan implements the Scanner interface.
func (ns *NullString) Scan(value interface{}) error {
80
	if value == nil {
81
		ns.String, ns.Valid = "", false
82 83
		return nil
	}
84 85 86 87
	ns.Valid = true
	return convertAssign(&ns.String, value)
}

88 89
// Value implements the driver Valuer interface.
func (ns NullString) Value() (driver.Value, error) {
90 91 92 93
	if !ns.Valid {
		return nil, nil
	}
	return ns.String, nil
94 95
}

96
// NullInt64 represents an int64 that may be null.
97
// NullInt64 implements the Scanner interface so
98 99 100 101 102 103
// it can be used as a scan destination, similar to NullString.
type NullInt64 struct {
	Int64 int64
	Valid bool // Valid is true if Int64 is not NULL
}

104 105
// Scan implements the Scanner interface.
func (n *NullInt64) Scan(value interface{}) error {
106 107 108 109 110 111 112 113
	if value == nil {
		n.Int64, n.Valid = 0, false
		return nil
	}
	n.Valid = true
	return convertAssign(&n.Int64, value)
}

114 115
// Value implements the driver Valuer interface.
func (n NullInt64) Value() (driver.Value, error) {
116 117 118 119 120 121 122
	if !n.Valid {
		return nil, nil
	}
	return n.Int64, nil
}

// NullFloat64 represents a float64 that may be null.
123
// NullFloat64 implements the Scanner interface so
124 125 126 127 128 129
// it can be used as a scan destination, similar to NullString.
type NullFloat64 struct {
	Float64 float64
	Valid   bool // Valid is true if Float64 is not NULL
}

130 131
// Scan implements the Scanner interface.
func (n *NullFloat64) Scan(value interface{}) error {
132 133 134 135 136 137 138 139
	if value == nil {
		n.Float64, n.Valid = 0, false
		return nil
	}
	n.Valid = true
	return convertAssign(&n.Float64, value)
}

140 141
// Value implements the driver Valuer interface.
func (n NullFloat64) Value() (driver.Value, error) {
142 143 144 145 146 147 148
	if !n.Valid {
		return nil, nil
	}
	return n.Float64, nil
}

// NullBool represents a bool that may be null.
149
// NullBool implements the Scanner interface so
150 151 152 153 154 155
// it can be used as a scan destination, similar to NullString.
type NullBool struct {
	Bool  bool
	Valid bool // Valid is true if Bool is not NULL
}

156 157
// Scan implements the Scanner interface.
func (n *NullBool) Scan(value interface{}) error {
158 159 160 161 162 163 164 165
	if value == nil {
		n.Bool, n.Valid = false, false
		return nil
	}
	n.Valid = true
	return convertAssign(&n.Bool, value)
}

166 167
// Value implements the driver Valuer interface.
func (n NullBool) Value() (driver.Value, error) {
168 169 170 171 172 173
	if !n.Valid {
		return nil, nil
	}
	return n.Bool, nil
}

174 175 176
// Scanner is an interface used by Scan.
type Scanner interface {
	// Scan assigns a value from a database driver.
177
	//
178
	// The src value will be of one of the following restricted
179 180 181 182 183 184
	// set of types:
	//
	//    int64
	//    float64
	//    bool
	//    []byte
185 186
	//    string
	//    time.Time
187 188 189 190
	//    nil - for NULL values
	//
	// An error should be returned if the value can not be stored
	// without loss of information.
191
	Scan(src interface{}) error
192 193 194 195 196
}

// ErrNoRows is returned by Scan when QueryRow doesn't return a
// row. In such a case, QueryRow returns a placeholder *Row value that
// defers this error until a Scan.
197
var ErrNoRows = errors.New("sql: no rows in result set")
198

199 200
// DB is a database handle representing a pool of zero or more
// underlying connections. It's safe for concurrent use by multiple
201
// goroutines.
202
//
203 204 205 206 207 208 209 210
// The sql package creates and frees connections automatically; it
// also maintains a free pool of idle connections. If the database has
// a concept of per-connection state, such state can only be reliably
// observed within a transaction. Once DB.Begin is called, the
// returned Tx is bound to a single connection. Once Commit or
// Rollback is called on the transaction, that transaction's
// connection is returned to DB's idle connection pool. The pool size
// can be controlled with SetMaxIdleConns.
211 212 213 214
type DB struct {
	driver driver.Driver
	dsn    string

215
	mu           sync.Mutex // protects following fields
216 217
	freeConn     []*driverConn
	connRequests []chan connRequest
218 219
	numOpen      int
	pendingOpens int
220
	// Used to signal the need for new connections
221 222 223 224 225
	// a goroutine running connectionOpener() reads on this chan and
	// maybeOpenNewConnections sends on the chan (one send per needed connection)
	// It is closed during db.Close(). The close tells the connectionOpener
	// goroutine to exit.
	openerCh chan struct{}
226
	closed   bool
227 228 229
	dep      map[finalCloser]depSet
	lastPut  map[*driverConn]string // stacktrace of last conn's put; debug only
	maxIdle  int                    // zero means defaultMaxIdleConns; negative means 0
230
	maxOpen  int                    // <= 0 means unlimited
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
}

// driverConn wraps a driver.Conn with a mutex, to
// be held during all calls into the Conn. (including any calls onto
// interfaces returned via that Conn, such as calls on Tx, Stmt,
// Result, Rows)
type driverConn struct {
	db *DB

	sync.Mutex  // guards following
	ci          driver.Conn
	closed      bool
	finalClosed bool // ci.Close has been called
	openStmt    map[driver.Stmt]bool

	// guarded by db.mu
	inUse      bool
	onPut      []func() // code (with db.mu held) run when conn is next returned
	dbmuClosed bool     // same as closed, but guarded by db.mu, for connIfFree
250 251 252 253
}

func (dc *driverConn) releaseConn(err error) {
	dc.db.putConn(dc, err)
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
}

func (dc *driverConn) removeOpenStmt(si driver.Stmt) {
	dc.Lock()
	defer dc.Unlock()
	delete(dc.openStmt, si)
}

func (dc *driverConn) prepareLocked(query string) (driver.Stmt, error) {
	si, err := dc.ci.Prepare(query)
	if err == nil {
		// Track each driverConn's open statements, so we can close them
		// before closing the conn.
		//
		// TODO(bradfitz): let drivers opt out of caring about
		// stmt closes if the conn is about to close anyway? For now
		// do the safe thing, in case stmts need to be closed.
		//
272
		// TODO(bradfitz): after Go 1.2, closing driver.Stmts
273 274 275 276 277 278 279 280 281 282 283 284 285 286
		// should be moved to driverStmt, using unique
		// *driverStmts everywhere (including from
		// *Stmt.connStmt, instead of returning a
		// driver.Stmt), using driverStmt as a pointer
		// everywhere, and making it a finalCloser.
		if dc.openStmt == nil {
			dc.openStmt = make(map[driver.Stmt]bool)
		}
		dc.openStmt[si] = true
	}
	return si, err
}

// the dc.db's Mutex is held.
287
func (dc *driverConn) closeDBLocked() func() error {
288
	dc.Lock()
289
	defer dc.Unlock()
290
	if dc.closed {
291
		return func() error { return errors.New("sql: duplicate driverConn close") }
292 293
	}
	dc.closed = true
294
	return dc.db.removeDepLocked(dc, dc)
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
}

func (dc *driverConn) Close() error {
	dc.Lock()
	if dc.closed {
		dc.Unlock()
		return errors.New("sql: duplicate driverConn close")
	}
	dc.closed = true
	dc.Unlock() // not defer; removeDep finalClose calls may need to lock

	// And now updates that require holding dc.mu.Lock.
	dc.db.mu.Lock()
	dc.dbmuClosed = true
	fn := dc.db.removeDepLocked(dc, dc)
	dc.db.mu.Unlock()
	return fn()
}

func (dc *driverConn) finalClose() error {
	dc.Lock()

	for si := range dc.openStmt {
		si.Close()
	}
	dc.openStmt = nil

	err := dc.ci.Close()
	dc.ci = nil
	dc.finalClosed = true
	dc.Unlock()
326 327 328 329 330 331

	dc.db.mu.Lock()
	dc.db.numOpen--
	dc.db.maybeOpenNewConnections()
	dc.db.mu.Unlock()

332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
	return err
}

// driverStmt associates a driver.Stmt with the
// *driverConn from which it came, so the driverConn's lock can be
// held during calls.
type driverStmt struct {
	sync.Locker // the *driverConn
	si          driver.Stmt
}

func (ds *driverStmt) Close() error {
	ds.Lock()
	defer ds.Unlock()
	return ds.si.Close()
}

// depSet is a finalCloser's outstanding dependencies
type depSet map[interface{}]bool // set of true bools

// The finalCloser interface is used by (*DB).addDep and related
// dependency reference counting.
type finalCloser interface {
	// finalClose is called when the reference count of an object
	// goes to zero. (*DB).mu is not held while calling it.
	finalClose() error
}

// addDep notes that x now depends on dep, and x's finalClose won't be
// called until all of x's dependencies are removed with removeDep.
func (db *DB) addDep(x finalCloser, dep interface{}) {
	//println(fmt.Sprintf("addDep(%T %p, %T %p)", x, x, dep, dep))
	db.mu.Lock()
	defer db.mu.Unlock()
	db.addDepLocked(x, dep)
}

func (db *DB) addDepLocked(x finalCloser, dep interface{}) {
	if db.dep == nil {
		db.dep = make(map[finalCloser]depSet)
	}
	xdep := db.dep[x]
	if xdep == nil {
		xdep = make(depSet)
		db.dep[x] = xdep
	}
	xdep[dep] = true
}

// removeDep notes that x no longer depends on dep.
// If x still has dependencies, nil is returned.
// If x no longer has any dependencies, its finalClose method will be
// called and its error value will be returned.
func (db *DB) removeDep(x finalCloser, dep interface{}) error {
	db.mu.Lock()
	fn := db.removeDepLocked(x, dep)
	db.mu.Unlock()
	return fn()
}

func (db *DB) removeDepLocked(x finalCloser, dep interface{}) func() error {
	//println(fmt.Sprintf("removeDep(%T %p, %T %p)", x, x, dep, dep))

395 396 397
	xdep, ok := db.dep[x]
	if !ok {
		panic(fmt.Sprintf("unpaired removeDep: no deps for %T", x))
398 399
	}

400 401 402 403 404 405 406 407 408 409 410 411 412
	l0 := len(xdep)
	delete(xdep, dep)

	switch len(xdep) {
	case l0:
		// Nothing removed. Shouldn't happen.
		panic(fmt.Sprintf("unpaired removeDep: no %T dep on %T", dep, x))
	case 0:
		// No more dependencies.
		delete(db.dep, x)
		return x.finalClose
	default:
		// Dependencies remain.
413 414
		return func() error { return nil }
	}
415 416
}

417 418 419 420
// This is the size of the connectionOpener request chan (dn.openerCh).
// This value should be larger than the maximum typical value
// used for db.maxOpen. If maxOpen is significantly larger than
// connectionRequestQueueSize then it is possible for ALL calls into the *DB
421
// to block until the connectionOpener can satisfy the backlog of requests.
422 423
var connectionRequestQueueSize = 1000000

424 425 426 427 428
// Open opens a database specified by its database driver name and a
// driver-specific data source name, usually consisting of at least a
// database name and connection information.
//
// Most users will open a database via a driver-specific connection
429 430 431 432 433 434 435
// helper function that returns a *DB. No database drivers are included
// in the Go standard library. See http://golang.org/s/sqldrivers for
// a list of third-party drivers.
//
// Open may just validate its arguments without creating a connection
// to the database. To verify that the data source name is valid, call
// Ping.
436 437 438 439 440
//
// The returned DB is safe for concurrent use by multiple goroutines
// and maintains its own pool of idle connections. Thus, the Open
// function should be called just once. It is rarely necessary to
// close a DB.
441
func Open(driverName, dataSourceName string) (*DB, error) {
442
	driveri, ok := drivers[driverName]
443
	if !ok {
444
		return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
445
	}
446
	db := &DB{
447 448 449 450 451 452
		driver:   driveri,
		dsn:      dataSourceName,
		openerCh: make(chan struct{}, connectionRequestQueueSize),
		lastPut:  make(map[*driverConn]string),
	}
	go db.connectionOpener()
453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
	return db, nil
}

// Ping verifies a connection to the database is still alive,
// establishing a connection if necessary.
func (db *DB) Ping() error {
	// TODO(bradfitz): give drivers an optional hook to implement
	// this in a more efficient or more reliable way, if they
	// have one.
	dc, err := db.conn()
	if err != nil {
		return err
	}
	db.putConn(dc, nil)
	return nil
468 469
}

470
// Close closes the database, releasing any open resources.
471 472 473
//
// It is rare to Close a DB, as the DB handle is meant to be
// long-lived and shared between many goroutines.
474 475
func (db *DB) Close() error {
	db.mu.Lock()
476 477 478 479 480
	if db.closed { // Make DB.Close idempotent
		db.mu.Unlock()
		return nil
	}
	close(db.openerCh)
481
	var err error
482 483
	fns := make([]func() error, 0, len(db.freeConn))
	for _, dc := range db.freeConn {
484 485
		fns = append(fns, dc.closeDBLocked())
	}
486
	db.freeConn = nil
487
	db.closed = true
488
	for _, req := range db.connRequests {
489 490 491 492 493
		close(req)
	}
	db.mu.Unlock()
	for _, fn := range fns {
		err1 := fn()
494 495 496 497 498 499 500
		if err1 != nil {
			err = err1
		}
	}
	return err
}

501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
const defaultMaxIdleConns = 2

func (db *DB) maxIdleConnsLocked() int {
	n := db.maxIdle
	switch {
	case n == 0:
		// TODO(bradfitz): ask driver, if supported, for its default preference
		return defaultMaxIdleConns
	case n < 0:
		return 0
	default:
		return n
	}
}

// SetMaxIdleConns sets the maximum number of connections in the idle
// connection pool.
//
519 520 521
// If MaxOpenConns is greater than 0 but less than the new MaxIdleConns
// then the new MaxIdleConns will be reduced to match the MaxOpenConns limit
//
522 523 524 525 526 527 528 529 530
// If n <= 0, no idle connections are retained.
func (db *DB) SetMaxIdleConns(n int) {
	db.mu.Lock()
	if n > 0 {
		db.maxIdle = n
	} else {
		// No idle connections.
		db.maxIdle = -1
	}
531 532 533 534 535
	// Make sure maxIdle doesn't exceed maxOpen
	if db.maxOpen > 0 && db.maxIdleConnsLocked() > db.maxOpen {
		db.maxIdle = db.maxOpen
	}
	var closing []*driverConn
536 537 538 539 540
	idleCount := len(db.freeConn)
	maxIdle := db.maxIdleConnsLocked()
	if idleCount > maxIdle {
		closing = db.freeConn[maxIdle:]
		db.freeConn = db.freeConn[:maxIdle]
541 542 543 544
	}
	db.mu.Unlock()
	for _, c := range closing {
		c.Close()
545
	}
546 547
}

548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
// SetMaxOpenConns sets the maximum number of open connections to the database.
//
// If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than
// MaxIdleConns, then MaxIdleConns will be reduced to match the new
// MaxOpenConns limit
//
// If n <= 0, then there is no limit on the number of open connections.
// The default is 0 (unlimited).
func (db *DB) SetMaxOpenConns(n int) {
	db.mu.Lock()
	db.maxOpen = n
	if n < 0 {
		db.maxOpen = 0
	}
	syncMaxIdle := db.maxOpen > 0 && db.maxIdleConnsLocked() > db.maxOpen
	db.mu.Unlock()
	if syncMaxIdle {
		db.SetMaxIdleConns(n)
	}
}

// Assumes db.mu is locked.
// If there are connRequests and the connection limit hasn't been reached,
// then tell the connectionOpener to open new connections.
func (db *DB) maybeOpenNewConnections() {
573
	numRequests := len(db.connRequests) - db.pendingOpens
574 575 576 577 578 579 580 581 582 583 584 585 586
	if db.maxOpen > 0 {
		numCanOpen := db.maxOpen - (db.numOpen + db.pendingOpens)
		if numRequests > numCanOpen {
			numRequests = numCanOpen
		}
	}
	for numRequests > 0 {
		db.pendingOpens++
		numRequests--
		db.openerCh <- struct{}{}
	}
}

587
// Runs in a separate goroutine, opens new connections when requested.
588
func (db *DB) connectionOpener() {
589
	for range db.openerCh {
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
		db.openNewConnection()
	}
}

// Open one new connection
func (db *DB) openNewConnection() {
	ci, err := db.driver.Open(db.dsn)
	db.mu.Lock()
	defer db.mu.Unlock()
	if db.closed {
		if err == nil {
			ci.Close()
		}
		return
	}
	db.pendingOpens--
	if err != nil {
		db.putConnDBLocked(nil, err)
		return
	}
	dc := &driverConn{
		db: db,
		ci: ci,
	}
	if db.putConnDBLocked(dc, err) {
		db.addDepLocked(dc, dc)
		db.numOpen++
	} else {
		ci.Close()
	}
}

// connRequest represents one request for a new connection
// When there are no idle connections available, DB.conn will create
// a new connRequest and put it on the db.connRequests list.
625 626 627 628
type connRequest struct {
	conn *driverConn
	err  error
}
629 630 631

var errDBClosed = errors.New("sql: database is closed")

632 633
// conn returns a newly-opened or cached *driverConn
func (db *DB) conn() (*driverConn, error) {
634
	db.mu.Lock()
635
	if db.closed {
636
		db.mu.Unlock()
637 638 639 640
		return nil, errDBClosed
	}

	// If db.maxOpen > 0 and the number of open connections is over the limit
641
	// and there are no free connection, make a request and wait.
642
	if db.maxOpen > 0 && db.numOpen >= db.maxOpen && len(db.freeConn) == 0 {
643 644
		// Make the connRequest channel. It's buffered so that the
		// connectionOpener doesn't block while waiting for the req to be read.
645 646
		req := make(chan connRequest, 1)
		db.connRequests = append(db.connRequests, req)
647 648
		db.maybeOpenNewConnections()
		db.mu.Unlock()
649 650
		ret := <-req
		return ret.conn, ret.err
651
	}
652

653 654 655 656
	if c := len(db.freeConn); c > 0 {
		conn := db.freeConn[0]
		copy(db.freeConn, db.freeConn[1:])
		db.freeConn = db.freeConn[:c-1]
657
		conn.inUse = true
658 659 660
		db.mu.Unlock()
		return conn, nil
	}
661

662
	db.numOpen++ // optimistically
663
	db.mu.Unlock()
664 665
	ci, err := db.driver.Open(db.dsn)
	if err != nil {
666 667 668
		db.mu.Lock()
		db.numOpen-- // correct for earlier optimism
		db.mu.Unlock()
669 670
		return nil, err
	}
671
	db.mu.Lock()
672 673 674 675 676 677 678 679
	dc := &driverConn{
		db: db,
		ci: ci,
	}
	db.addDepLocked(dc, dc)
	dc.inUse = true
	db.mu.Unlock()
	return dc, nil
680 681
}

682 683 684 685 686 687 688 689 690 691 692 693 694
var (
	errConnClosed = errors.New("database/sql: internal sentinel error: conn is closed")
	errConnBusy   = errors.New("database/sql: internal sentinel error: conn is busy")
)

// connIfFree returns (wanted, nil) if wanted is still a valid conn and
// isn't in use.
//
// The error is errConnClosed if the connection if the requested connection
// is invalid because it's been closed.
//
// The error is errConnBusy if the connection is in use.
func (db *DB) connIfFree(wanted *driverConn) (*driverConn, error) {
695 696
	db.mu.Lock()
	defer db.mu.Unlock()
697 698 699
	if wanted.dbmuClosed {
		return nil, errConnClosed
	}
700 701 702
	if wanted.inUse {
		return nil, errConnBusy
	}
703 704 705 706 707 708 709 710 711
	idx := -1
	for ii, v := range db.freeConn {
		if v == wanted {
			idx = ii
			break
		}
	}
	if idx >= 0 {
		db.freeConn = append(db.freeConn[:idx], db.freeConn[idx+1:]...)
712 713 714 715 716 717 718 719 720
		wanted.inUse = true
		return wanted, nil
	}
	// TODO(bradfitz): shouldn't get here. After Go 1.1, change this to:
	// panic("connIfFree call requested a non-closed, non-busy, non-free conn")
	// Which passes all the tests, but I'm too paranoid to include this
	// late in Go 1.1.
	// Instead, treat it like a busy connection:
	return nil, errConnBusy
721 722
}

723
// putConnHook is a hook for testing.
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747
var putConnHook func(*DB, *driverConn)

// noteUnusedDriverStatement notes that si is no longer used and should
// be closed whenever possible (when c is next not in use), unless c is
// already closed.
func (db *DB) noteUnusedDriverStatement(c *driverConn, si driver.Stmt) {
	db.mu.Lock()
	defer db.mu.Unlock()
	if c.inUse {
		c.onPut = append(c.onPut, func() {
			si.Close()
		})
	} else {
		c.Lock()
		defer c.Unlock()
		if !c.finalClosed {
			si.Close()
		}
	}
}

// debugGetPut determines whether getConn & putConn calls' stack traces
// are returned for more verbose crashes.
const debugGetPut = false
748 749

// putConn adds a connection to the db's free pool.
750
// err is optionally the last error that occurred on this connection.
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
func (db *DB) putConn(dc *driverConn, err error) {
	db.mu.Lock()
	if !dc.inUse {
		if debugGetPut {
			fmt.Printf("putConn(%v) DUPLICATE was: %s\n\nPREVIOUS was: %s", dc, stack(), db.lastPut[dc])
		}
		panic("sql: connection returned that was never out")
	}
	if debugGetPut {
		db.lastPut[dc] = stack()
	}
	dc.inUse = false

	for _, fn := range dc.onPut {
		fn()
	}
	dc.onPut = nil

769 770
	if err == driver.ErrBadConn {
		// Don't reuse bad connections.
771 772 773 774
		// Since the conn is considered bad and is being discarded, treat it
		// as closed. Don't decrement the open count here, finalClose will
		// take care of that.
		db.maybeOpenNewConnections()
775
		db.mu.Unlock()
776
		dc.Close()
777 778 779
		return
	}
	if putConnHook != nil {
780
		putConnHook(db, dc)
781
	}
782
	added := db.putConnDBLocked(dc, nil)
783
	db.mu.Unlock()
784

785 786 787 788 789 790 791 792
	if !added {
		dc.Close()
	}
}

// Satisfy a connRequest or put the driverConn in the idle pool and return true
// or return false.
// putConnDBLocked will satisfy a connRequest if there is one, or it will
793 794
// return the *driverConn to the freeConn list if err == nil and the idle
// connection limit will not be exceeded.
795 796
// If err != nil, the value of dc is ignored.
// If err == nil, then dc must not equal nil.
797
// If a connRequest was fulfilled or the *driverConn was placed in the
798 799
// freeConn list, then true is returned, otherwise false is returned.
func (db *DB) putConnDBLocked(dc *driverConn, err error) bool {
800 801 802 803 804 805 806 807
	if c := len(db.connRequests); c > 0 {
		req := db.connRequests[0]
		// This copy is O(n) but in practice faster than a linked list.
		// TODO: consider compacting it down less often and
		// moving the base instead?
		copy(db.connRequests, db.connRequests[1:])
		db.connRequests = db.connRequests[:c-1]
		if err == nil {
808
			dc.inUse = true
809 810 811 812
		}
		req <- connRequest{
			conn: dc,
			err:  err,
813 814
		}
		return true
815 816
	} else if err == nil && !db.closed && db.maxIdleConnsLocked() > len(db.freeConn) {
		db.freeConn = append(db.freeConn, dc)
817 818 819
		return true
	}
	return false
820 821
}

822 823 824 825
// maxBadConnRetries is the number of maximum retries if the driver returns
// driver.ErrBadConn to signal a broken connection.
const maxBadConnRetries = 10

826 827 828
// Prepare creates a prepared statement for later queries or executions.
// Multiple queries or executions may be run concurrently from the
// returned statement.
829
func (db *DB) Prepare(query string) (*Stmt, error) {
830 831
	var stmt *Stmt
	var err error
832
	for i := 0; i < maxBadConnRetries; i++ {
833 834 835 836 837 838 839 840
		stmt, err = db.prepare(query)
		if err != driver.ErrBadConn {
			break
		}
	}
	return stmt, err
}

841
func (db *DB) prepare(query string) (*Stmt, error) {
842 843 844 845 846 847
	// TODO: check if db.driver supports an optional
	// driver.Preparer interface and call that instead, if so,
	// otherwise we make a prepared statement that's bound
	// to a connection, and to execute this prepared statement
	// we either need to use this connection (if it's free), else
	// get a new connection + re-prepare + execute on that one.
848
	dc, err := db.conn()
849 850 851
	if err != nil {
		return nil, err
	}
852 853 854
	dc.Lock()
	si, err := dc.prepareLocked(query)
	dc.Unlock()
855
	if err != nil {
856
		db.putConn(dc, err)
857 858
		return nil, err
	}
859
	stmt := &Stmt{
860 861
		db:    db,
		query: query,
862
		css:   []connStmt{{dc, si}},
863
	}
864 865
	db.addDep(stmt, stmt)
	db.putConn(dc, nil)
866 867 868 869
	return stmt, nil
}

// Exec executes a query without returning any rows.
870
// The args are for any placeholder parameters in the query.
871
func (db *DB) Exec(query string, args ...interface{}) (Result, error) {
872
	var res Result
873
	var err error
874
	for i := 0; i < maxBadConnRetries; i++ {
875
		res, err = db.exec(query, args)
876 877 878
		if err != driver.ErrBadConn {
			break
		}
879
	}
880 881
	return res, err
}
882

883
func (db *DB) exec(query string, args []interface{}) (res Result, err error) {
884
	dc, err := db.conn()
885 886 887
	if err != nil {
		return nil, err
	}
888
	defer func() {
889
		db.putConn(dc, err)
890
	}()
891

892
	if execer, ok := dc.ci.(driver.Execer); ok {
893 894 895 896
		dargs, err := driverArgs(nil, args)
		if err != nil {
			return nil, err
		}
897
		dc.Lock()
898
		resi, err := execer.Exec(query, dargs)
899
		dc.Unlock()
900 901 902 903
		if err != driver.ErrSkip {
			if err != nil {
				return nil, err
			}
904
			return driverResult{dc, resi}, nil
905 906 907
		}
	}

908 909 910
	dc.Lock()
	si, err := dc.ci.Prepare(query)
	dc.Unlock()
911 912 913
	if err != nil {
		return nil, err
	}
914 915
	defer withLock(dc, func() { si.Close() })
	return resultFromStatement(driverStmt{dc, si}, args...)
916 917 918
}

// Query executes a query that returns rows, typically a SELECT.
919
// The args are for any placeholder parameters in the query.
920
func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
921 922
	var rows *Rows
	var err error
923
	for i := 0; i < maxBadConnRetries; i++ {
924 925 926 927 928 929 930 931 932 933 934 935 936 937
		rows, err = db.query(query, args)
		if err != driver.ErrBadConn {
			break
		}
	}
	return rows, err
}

func (db *DB) query(query string, args []interface{}) (*Rows, error) {
	ci, err := db.conn()
	if err != nil {
		return nil, err
	}

938
	return db.queryConn(ci, ci.releaseConn, query, args)
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
}

// queryConn executes a query on the given connection.
// The connection gets released by the releaseConn function.
func (db *DB) queryConn(dc *driverConn, releaseConn func(error), query string, args []interface{}) (*Rows, error) {
	if queryer, ok := dc.ci.(driver.Queryer); ok {
		dargs, err := driverArgs(nil, args)
		if err != nil {
			releaseConn(err)
			return nil, err
		}
		dc.Lock()
		rowsi, err := queryer.Query(query, dargs)
		dc.Unlock()
		if err != driver.ErrSkip {
			if err != nil {
				releaseConn(err)
				return nil, err
			}
			// Note: ownership of dc passes to the *Rows, to be freed
			// with releaseConn.
			rows := &Rows{
				dc:          dc,
				releaseConn: releaseConn,
				rowsi:       rowsi,
			}
			return rows, nil
		}
	}

	dc.Lock()
	si, err := dc.ci.Prepare(query)
	dc.Unlock()
972
	if err != nil {
973
		releaseConn(err)
974 975
		return nil, err
	}
976 977 978

	ds := driverStmt{dc, si}
	rowsi, err := rowsiFromStatement(ds, args...)
979
	if err != nil {
980 981 982
		dc.Lock()
		si.Close()
		dc.Unlock()
983
		releaseConn(err)
984 985
		return nil, err
	}
986 987 988 989 990 991 992 993 994

	// Note: ownership of ci passes to the *Rows, to be freed
	// with releaseConn.
	rows := &Rows{
		dc:          dc,
		releaseConn: releaseConn,
		rowsi:       rowsi,
		closeStmt:   si,
	}
995
	return rows, nil
996 997 998 999 1000 1001 1002
}

// QueryRow executes a query that is expected to return at most one row.
// QueryRow always return a non-nil value. Errors are deferred until
// Row's Scan method is called.
func (db *DB) QueryRow(query string, args ...interface{}) *Row {
	rows, err := db.Query(query, args...)
1003
	return &Row{rows: rows, err: err}
1004 1005
}

1006
// Begin starts a transaction. The isolation level is dependent on
1007
// the driver.
1008
func (db *DB) Begin() (*Tx, error) {
1009 1010
	var tx *Tx
	var err error
1011
	for i := 0; i < maxBadConnRetries; i++ {
1012 1013 1014 1015 1016 1017 1018 1019 1020
		tx, err = db.begin()
		if err != driver.ErrBadConn {
			break
		}
	}
	return tx, err
}

func (db *DB) begin() (tx *Tx, err error) {
1021
	dc, err := db.conn()
1022 1023 1024
	if err != nil {
		return nil, err
	}
1025 1026 1027
	dc.Lock()
	txi, err := dc.ci.Begin()
	dc.Unlock()
1028
	if err != nil {
1029
		db.putConn(dc, err)
1030
		return nil, err
1031 1032 1033
	}
	return &Tx{
		db:  db,
1034
		dc:  dc,
1035 1036
		txi: txi,
	}, nil
1037 1038
}

1039
// Driver returns the database's underlying driver.
1040 1041 1042 1043 1044
func (db *DB) Driver() driver.Driver {
	return db.driver
}

// Tx is an in-progress database transaction.
1045 1046 1047 1048
//
// A transaction must end with a call to Commit or Rollback.
//
// After a call to Commit or Rollback, all operations on the
1049
// transaction fail with ErrTxDone.
1050
type Tx struct {
1051 1052
	db *DB

1053
	// dc is owned exclusively until Commit or Rollback, at which point
1054
	// it's returned with putConn.
1055
	dc  *driverConn
1056 1057 1058 1059
	txi driver.Tx

	// done transitions from false to true exactly once, on Commit
	// or Rollback. once done, all operations fail with
1060
	// ErrTxDone.
1061
	done bool
1062 1063 1064 1065 1066 1067 1068

	// All Stmts prepared for this transaction.  These will be closed after the
	// transaction has been committed or rolled back.
	stmts struct {
		sync.Mutex
		v []*Stmt
	}
1069 1070
}

1071
var ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back")
1072 1073 1074 1075 1076 1077

func (tx *Tx) close() {
	if tx.done {
		panic("double close") // internal error
	}
	tx.done = true
1078 1079
	tx.db.putConn(tx.dc, nil)
	tx.dc = nil
1080 1081 1082
	tx.txi = nil
}

1083
func (tx *Tx) grabConn() (*driverConn, error) {
1084
	if tx.done {
1085
		return nil, ErrTxDone
1086
	}
1087
	return tx.dc, nil
1088 1089
}

1090 1091 1092 1093 1094 1095 1096 1097 1098
// Closes all Stmts prepared for this transaction.
func (tx *Tx) closePrepared() {
	tx.stmts.Lock()
	for _, stmt := range tx.stmts.v {
		stmt.Close()
	}
	tx.stmts.Unlock()
}

1099
// Commit commits the transaction.
1100
func (tx *Tx) Commit() error {
1101
	if tx.done {
1102
		return ErrTxDone
1103 1104
	}
	defer tx.close()
1105
	tx.dc.Lock()
1106 1107 1108 1109 1110 1111
	err := tx.txi.Commit()
	tx.dc.Unlock()
	if err != driver.ErrBadConn {
		tx.closePrepared()
	}
	return err
1112 1113 1114
}

// Rollback aborts the transaction.
1115
func (tx *Tx) Rollback() error {
1116
	if tx.done {
1117
		return ErrTxDone
1118 1119
	}
	defer tx.close()
1120
	tx.dc.Lock()
1121 1122 1123 1124 1125 1126
	err := tx.txi.Rollback()
	tx.dc.Unlock()
	if err != driver.ErrBadConn {
		tx.closePrepared()
	}
	return err
1127 1128
}

1129
// Prepare creates a prepared statement for use within a transaction.
1130
//
1131 1132 1133 1134
// The returned statement operates within the transaction and can no longer
// be used once the transaction has been committed or rolled back.
//
// To use an existing prepared statement on this transaction, see Tx.Stmt.
1135
func (tx *Tx) Prepare(query string) (*Stmt, error) {
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
	// TODO(bradfitz): We could be more efficient here and either
	// provide a method to take an existing Stmt (created on
	// perhaps a different Conn), and re-create it on this Conn if
	// necessary. Or, better: keep a map in DB of query string to
	// Stmts, and have Stmt.Execute do the right thing and
	// re-prepare if the Conn in use doesn't have that prepared
	// statement.  But we'll want to avoid caching the statement
	// in the case where we only call conn.Prepare implicitly
	// (such as in db.Exec or tx.Exec), but the caller package
	// can't be holding a reference to the returned statement.
	// Perhaps just looking at the reference count (by noting
	// Stmt.Close) would be enough. We might also want a finalizer
	// on Stmt to drop the reference count.
1149
	dc, err := tx.grabConn()
1150 1151 1152 1153
	if err != nil {
		return nil, err
	}

1154 1155 1156
	dc.Lock()
	si, err := dc.ci.Prepare(query)
	dc.Unlock()
1157 1158 1159 1160 1161
	if err != nil {
		return nil, err
	}

	stmt := &Stmt{
1162 1163 1164 1165 1166 1167
		db: tx.db,
		tx: tx,
		txsi: &driverStmt{
			Locker: dc,
			si:     si,
		},
1168 1169
		query: query,
	}
1170 1171 1172
	tx.stmts.Lock()
	tx.stmts.v = append(tx.stmts.v, stmt)
	tx.stmts.Unlock()
1173
	return stmt, nil
1174 1175
}

1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193
// Stmt returns a transaction-specific prepared statement from
// an existing statement.
//
// Example:
//  updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?")
//  ...
//  tx, err := db.Begin()
//  ...
//  res, err := tx.Stmt(updateMoney).Exec(123.45, 98293203)
func (tx *Tx) Stmt(stmt *Stmt) *Stmt {
	// TODO(bradfitz): optimize this. Currently this re-prepares
	// each time.  This is fine for now to illustrate the API but
	// we should really cache already-prepared statements
	// per-Conn. See also the big comment in Tx.Prepare.

	if tx.db != stmt.db {
		return &Stmt{stickyErr: errors.New("sql: Tx.Stmt: statement from different database used")}
	}
1194
	dc, err := tx.grabConn()
1195 1196 1197
	if err != nil {
		return &Stmt{stickyErr: err}
	}
1198 1199 1200
	dc.Lock()
	si, err := dc.ci.Prepare(stmt.query)
	dc.Unlock()
1201
	txs := &Stmt{
1202 1203 1204 1205 1206 1207
		db: tx.db,
		tx: tx,
		txsi: &driverStmt{
			Locker: dc,
			si:     si,
		},
1208 1209 1210
		query:     stmt.query,
		stickyErr: err,
	}
1211 1212 1213 1214
	tx.stmts.Lock()
	tx.stmts.v = append(tx.stmts.v, txs)
	tx.stmts.Unlock()
	return txs
1215 1216
}

1217 1218
// Exec executes a query that doesn't return rows.
// For example: an INSERT and UPDATE.
1219
func (tx *Tx) Exec(query string, args ...interface{}) (Result, error) {
1220
	dc, err := tx.grabConn()
1221 1222 1223 1224
	if err != nil {
		return nil, err
	}

1225
	if execer, ok := dc.ci.(driver.Execer); ok {
1226 1227 1228 1229
		dargs, err := driverArgs(nil, args)
		if err != nil {
			return nil, err
		}
1230
		dc.Lock()
1231
		resi, err := execer.Exec(query, dargs)
1232
		dc.Unlock()
1233
		if err == nil {
1234
			return driverResult{dc, resi}, nil
1235 1236
		}
		if err != driver.ErrSkip {
1237 1238 1239 1240
			return nil, err
		}
	}

1241 1242 1243
	dc.Lock()
	si, err := dc.ci.Prepare(query)
	dc.Unlock()
1244 1245 1246
	if err != nil {
		return nil, err
	}
1247
	defer withLock(dc, func() { si.Close() })
1248

1249
	return resultFromStatement(driverStmt{dc, si}, args...)
1250 1251 1252
}

// Query executes a query that returns rows, typically a SELECT.
1253
func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) {
1254
	dc, err := tx.grabConn()
1255 1256 1257
	if err != nil {
		return nil, err
	}
1258 1259
	releaseConn := func(error) {}
	return tx.db.queryConn(dc, releaseConn, query, args)
1260 1261 1262 1263 1264 1265
}

// QueryRow executes a query that is expected to return at most one row.
// QueryRow always return a non-nil value. Errors are deferred until
// Row's Scan method is called.
func (tx *Tx) QueryRow(query string, args ...interface{}) *Row {
1266 1267
	rows, err := tx.Query(query, args...)
	return &Row{rows: rows, err: err}
1268 1269 1270 1271
}

// connStmt is a prepared statement on a particular connection.
type connStmt struct {
1272
	dc *driverConn
1273 1274 1275 1276 1277 1278
	si driver.Stmt
}

// Stmt is a prepared statement. Stmt is safe for concurrent use by multiple goroutines.
type Stmt struct {
	// Immutable:
1279 1280 1281
	db        *DB    // where we came from
	query     string // that created the Stmt
	stickyErr error  // if non-nil, this error is returned for all operations
1282

1283 1284
	closemu sync.RWMutex // held exclusively during close, for read otherwise.

1285 1286
	// If in a transaction, else both nil:
	tx   *Tx
1287
	txsi *driverStmt
1288 1289

	mu     sync.Mutex // protects the rest of the fields
1290 1291
	closed bool

1292 1293 1294 1295 1296
	// css is a list of underlying driver statement interfaces
	// that are valid on particular connections.  This is only
	// used if tx == nil and one is found that has idle
	// connections.  If tx != nil, txsi is always used.
	css []connStmt
1297 1298 1299 1300
}

// Exec executes a prepared statement with the given arguments and
// returns a Result summarizing the effect of the statement.
1301
func (s *Stmt) Exec(args ...interface{}) (Result, error) {
1302 1303
	s.closemu.RLock()
	defer s.closemu.RUnlock()
1304

1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321
	var res Result
	for i := 0; i < maxBadConnRetries; i++ {
		dc, releaseConn, si, err := s.connStmt()
		if err != nil {
			if err == driver.ErrBadConn {
				continue
			}
			return nil, err
		}

		res, err = resultFromStatement(driverStmt{dc, si}, args...)
		releaseConn(err)
		if err != driver.ErrBadConn {
			return res, err
		}
	}
	return nil, driver.ErrBadConn
1322 1323
}

1324 1325 1326 1327 1328
func resultFromStatement(ds driverStmt, args ...interface{}) (Result, error) {
	ds.Lock()
	want := ds.si.NumInput()
	ds.Unlock()

1329 1330 1331
	// -1 means the driver doesn't know how to count the number of
	// placeholders, so we won't sanity check input here and instead let the
	// driver deal with errors.
1332
	if want != -1 && len(args) != want {
1333
		return nil, fmt.Errorf("sql: expected %d arguments, got %d", want, len(args))
1334 1335
	}

1336
	dargs, err := driverArgs(&ds, args)
1337 1338
	if err != nil {
		return nil, err
1339 1340
	}

1341 1342 1343
	ds.Lock()
	resi, err := ds.si.Exec(dargs)
	ds.Unlock()
1344 1345 1346
	if err != nil {
		return nil, err
	}
1347
	return driverResult{ds.Locker, resi}, nil
1348 1349
}

1350 1351 1352
// connStmt returns a free driver connection on which to execute the
// statement, a function to call to release the connection, and a
// statement bound to that connection.
1353
func (s *Stmt) connStmt() (ci *driverConn, releaseConn func(error), si driver.Stmt, err error) {
1354 1355
	if err = s.stickyErr; err != nil {
		return
1356
	}
1357 1358
	s.mu.Lock()
	if s.closed {
1359
		s.mu.Unlock()
1360
		err = errors.New("sql: statement is closed")
1361
		return
1362
	}
1363 1364 1365 1366 1367 1368 1369 1370 1371

	// In a transaction, we always use the connection that the
	// transaction was created on.
	if s.tx != nil {
		s.mu.Unlock()
		ci, err = s.tx.grabConn() // blocks, waiting for the connection.
		if err != nil {
			return
		}
1372 1373
		releaseConn = func(error) {}
		return ci, releaseConn, s.txsi.si, nil
1374 1375
	}

1376 1377 1378 1379
	for i := 0; i < len(s.css); i++ {
		v := s.css[i]
		_, err := s.db.connIfFree(v.dc)
		if err == nil {
1380 1381
			s.mu.Unlock()
			return v.dc, v.dc.releaseConn, v.si, nil
1382
		}
1383 1384 1385 1386 1387 1388 1389
		if err == errConnClosed {
			// Lazily remove dead conn from our freelist.
			s.css[i] = s.css[len(s.css)-1]
			s.css = s.css[:len(s.css)-1]
			i--
		}

1390 1391 1392
	}
	s.mu.Unlock()

1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
	// If all connections are busy, either wait for one to become available (if
	// we've already hit the maximum number of open connections) or create a
	// new one.
	//
	// TODO(bradfitz): or always wait for one? make configurable later?
	dc, err := s.db.conn()
	if err != nil {
		return nil, nil, nil, err
	}

	// Do another pass over the list to see whether this statement has
	// already been prepared on the connection assigned to us.
	s.mu.Lock()
	for _, v := range s.css {
		if v.dc == dc {
			s.mu.Unlock()
			return dc, dc.releaseConn, v.si, nil
1410
		}
1411
	}
1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425
	s.mu.Unlock()

	// No luck; we need to prepare the statement on this connection
	dc.Lock()
	si, err = dc.prepareLocked(s.query)
	dc.Unlock()
	if err != nil {
		s.db.putConn(dc, err)
		return nil, nil, nil, err
	}
	s.mu.Lock()
	cs := connStmt{dc, si}
	s.css = append(s.css, cs)
	s.mu.Unlock()
1426

1427
	return dc, dc.releaseConn, si, nil
1428 1429 1430 1431
}

// Query executes a prepared query statement with the given arguments
// and returns the query results as a *Rows.
1432
func (s *Stmt) Query(args ...interface{}) (*Rows, error) {
1433 1434 1435
	s.closemu.RLock()
	defer s.closemu.RUnlock()

1436 1437 1438 1439 1440 1441 1442 1443 1444
	var rowsi driver.Rows
	for i := 0; i < maxBadConnRetries; i++ {
		dc, releaseConn, si, err := s.connStmt()
		if err != nil {
			if err == driver.ErrBadConn {
				continue
			}
			return nil, err
		}
1445

1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461
		rowsi, err = rowsiFromStatement(driverStmt{dc, si}, args...)
		if err == nil {
			// Note: ownership of ci passes to the *Rows, to be freed
			// with releaseConn.
			rows := &Rows{
				dc:    dc,
				rowsi: rowsi,
				// releaseConn set below
			}
			s.db.addDep(s, rows)
			rows.releaseConn = func(err error) {
				releaseConn(err)
				s.db.removeDep(s, rows)
			}
			return rows, nil
		}
1462

1463
		releaseConn(err)
1464 1465 1466
		if err != driver.ErrBadConn {
			return nil, err
		}
1467
	}
1468
	return nil, driver.ErrBadConn
1469 1470 1471 1472 1473 1474 1475
}

func rowsiFromStatement(ds driverStmt, args ...interface{}) (driver.Rows, error) {
	ds.Lock()
	want := ds.si.NumInput()
	ds.Unlock()

1476 1477 1478
	// -1 means the driver doesn't know how to count the number of
	// placeholders, so we won't sanity check input here and instead let the
	// driver deal with errors.
1479 1480
	if want != -1 && len(args) != want {
		return nil, fmt.Errorf("sql: statement expects %d inputs; got %d", want, len(args))
1481
	}
1482

1483
	dargs, err := driverArgs(&ds, args)
1484 1485 1486
	if err != nil {
		return nil, err
	}
1487

1488 1489 1490
	ds.Lock()
	rowsi, err := ds.si.Query(dargs)
	ds.Unlock()
1491 1492 1493
	if err != nil {
		return nil, err
	}
1494
	return rowsi, nil
1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506
}

// QueryRow executes a prepared query statement with the given arguments.
// If an error occurs during the execution of the statement, that error will
// be returned by a call to Scan on the returned *Row, which is always non-nil.
// If the query selects no rows, the *Row's Scan will return ErrNoRows.
// Otherwise, the *Row's Scan scans the first selected row and discards
// the rest.
//
// Example usage:
//
//  var name string
1507
//  err := nameByUseridStmt.QueryRow(id).Scan(&name)
1508 1509 1510 1511 1512 1513 1514 1515 1516
func (s *Stmt) QueryRow(args ...interface{}) *Row {
	rows, err := s.Query(args...)
	if err != nil {
		return &Row{err: err}
	}
	return &Row{rows: rows}
}

// Close closes the statement.
1517
func (s *Stmt) Close() error {
1518 1519 1520
	s.closemu.Lock()
	defer s.closemu.Unlock()

1521 1522 1523
	if s.stickyErr != nil {
		return s.stickyErr
	}
1524 1525
	s.mu.Lock()
	if s.closed {
1526
		s.mu.Unlock()
1527 1528 1529
		return nil
	}
	s.closed = true
1530 1531 1532

	if s.tx != nil {
		s.txsi.Close()
1533
		s.mu.Unlock()
1534 1535
		return nil
	}
1536
	s.mu.Unlock()
1537 1538 1539 1540 1541

	return s.db.removeDep(s, s)
}

func (s *Stmt) finalClose() error {
1542 1543 1544 1545 1546 1547 1548 1549
	s.mu.Lock()
	defer s.mu.Unlock()
	if s.css != nil {
		for _, v := range s.css {
			s.db.noteUnusedDriverStatement(v.dc, v.si)
			v.dc.removeOpenStmt(v.si)
		}
		s.css = nil
1550 1551 1552 1553 1554 1555 1556 1557 1558
	}
	return nil
}

// Rows is the result of a query. Its cursor starts before the first row
// of the result set. Use Next to advance through the rows:
//
//     rows, err := db.Query("SELECT ...")
//     ...
1559
//     defer rows.Close()
1560 1561 1562 1563 1564 1565
//     for rows.Next() {
//         var id int
//         var name string
//         err = rows.Scan(&id, &name)
//         ...
//     }
1566
//     err = rows.Err() // get any error encountered during iteration
1567 1568
//     ...
type Rows struct {
1569
	dc          *driverConn // owned; must call releaseConn when closed to release
1570
	releaseConn func(error)
1571
	rowsi       driver.Rows
1572

1573
	closed    bool
1574
	lastcols  []driver.Value
1575
	lasterr   error       // non-nil only if closed is true
1576
	closeStmt driver.Stmt // if non-nil, statement to Close on close
1577 1578
}

1579 1580 1581 1582 1583 1584
// Next prepares the next result row for reading with the Scan method.  It
// returns true on success, or false if there is no next result row or an error
// happened while preparing it.  Err should be consulted to distinguish between
// the two cases.
//
// Every call to Scan, even the first one, must be preceded by a call to Next.
1585 1586 1587 1588 1589
func (rs *Rows) Next() bool {
	if rs.closed {
		return false
	}
	if rs.lastcols == nil {
1590
		rs.lastcols = make([]driver.Value, len(rs.rowsi.Columns()))
1591 1592
	}
	rs.lasterr = rs.rowsi.Next(rs.lastcols)
1593
	if rs.lasterr != nil {
1594
		rs.Close()
1595
		return false
1596
	}
1597
	return true
1598 1599
}

1600
// Err returns the error, if any, that was encountered during iteration.
1601
// Err may be called after an explicit or implicit Close.
1602
func (rs *Rows) Err() error {
1603
	if rs.lasterr == io.EOF {
1604 1605 1606 1607 1608
		return nil
	}
	return rs.lasterr
}

1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621
// Columns returns the column names.
// Columns returns an error if the rows are closed, or if the rows
// are from QueryRow and there was a deferred error.
func (rs *Rows) Columns() ([]string, error) {
	if rs.closed {
		return nil, errors.New("sql: Rows are closed")
	}
	if rs.rowsi == nil {
		return nil, errors.New("sql: no Rows available")
	}
	return rs.rowsi.Columns(), nil
}

1622
// Scan copies the columns in the current row into the values pointed
1623 1624 1625 1626 1627 1628 1629
// at by dest.
//
// If an argument has type *[]byte, Scan saves in that argument a copy
// of the corresponding data. The copy is owned by the caller and can
// be modified and held indefinitely. The copy can be avoided by using
// an argument of type *RawBytes instead; see the documentation for
// RawBytes for restrictions on its use.
1630 1631 1632 1633
//
// If an argument has type *interface{}, Scan copies the value
// provided by the underlying driver without conversion. If the value
// is of type []byte, a copy is made and the caller owns the result.
1634
func (rs *Rows) Scan(dest ...interface{}) error {
1635
	if rs.closed {
1636
		return errors.New("sql: Rows are closed")
1637 1638
	}
	if rs.lastcols == nil {
1639
		return errors.New("sql: Scan called without calling Next")
1640 1641
	}
	if len(dest) != len(rs.lastcols) {
1642
		return fmt.Errorf("sql: expected %d destination arguments in Scan, not %d", len(rs.lastcols), len(dest))
1643 1644 1645 1646
	}
	for i, sv := range rs.lastcols {
		err := convertAssign(dest[i], sv)
		if err != nil {
1647
			return fmt.Errorf("sql: Scan error on column index %d: %v", i, err)
1648 1649 1650 1651 1652
		}
	}
	return nil
}

1653 1654 1655 1656 1657
var rowsCloseHook func(*Rows, *error)

// Close closes the Rows, preventing further enumeration. If Next returns
// false, the Rows are closed automatically and it will suffice to check the
// result of Err. Close is idempotent and does not affect the result of Err.
1658
func (rs *Rows) Close() error {
1659 1660 1661 1662 1663
	if rs.closed {
		return nil
	}
	rs.closed = true
	err := rs.rowsi.Close()
1664 1665 1666
	if fn := rowsCloseHook; fn != nil {
		fn(rs, &err)
	}
1667 1668 1669
	if rs.closeStmt != nil {
		rs.closeStmt.Close()
	}
1670
	rs.releaseConn(err)
1671 1672 1673 1674 1675 1676
	return err
}

// Row is the result of calling QueryRow to select a single row.
type Row struct {
	// One of these two will be non-nil:
1677
	err  error // deferred error for easy chaining
1678 1679 1680 1681 1682 1683 1684
	rows *Rows
}

// Scan copies the columns from the matched row into the values
// pointed at by dest.  If more than one row matches the query,
// Scan uses the first row and discards the rest.  If no row matches
// the query, Scan returns ErrNoRows.
1685
func (r *Row) Scan(dest ...interface{}) error {
1686 1687 1688
	if r.err != nil {
		return r.err
	}
1689 1690

	// TODO(bradfitz): for now we need to defensively clone all
1691
	// []byte that the driver returned (not permitting
1692
	// *RawBytes in Rows.Scan), since we're about to close
1693 1694 1695 1696 1697 1698 1699 1700 1701 1702
	// the Rows in our defer, when we return from this function.
	// the contract with the driver.Next(...) interface is that it
	// can return slices into read-only temporary memory that's
	// only valid until the next Scan/Close.  But the TODO is that
	// for a lot of drivers, this copy will be unnecessary.  We
	// should provide an optional interface for drivers to
	// implement to say, "don't worry, the []bytes that I return
	// from Next will not be modified again." (for instance, if
	// they were obtained from the network anyway) But for now we
	// don't care.
1703
	defer r.rows.Close()
1704
	for _, dp := range dest {
1705 1706 1707
		if _, ok := dp.(*RawBytes); ok {
			return errors.New("sql: RawBytes isn't allowed on Row.Scan")
		}
1708
	}
1709 1710

	if !r.rows.Next() {
1711 1712 1713
		if err := r.rows.Err(); err != nil {
			return err
		}
1714 1715 1716 1717 1718 1719
		return ErrNoRows
	}
	err := r.rows.Scan(dest...)
	if err != nil {
		return err
	}
1720 1721 1722 1723
	// Make sure the query can be processed to completion with no errors.
	if err := r.rows.Close(); err != nil {
		return err
	}
1724

1725
	return nil
1726 1727 1728 1729
}

// A Result summarizes an executed SQL command.
type Result interface {
1730 1731 1732 1733 1734
	// LastInsertId returns the integer generated by the database
	// in response to a command. Typically this will be from an
	// "auto increment" column when inserting a new row. Not all
	// databases support this feature, and the syntax of such
	// statements varies.
1735
	LastInsertId() (int64, error)
1736 1737 1738 1739

	// RowsAffected returns the number of rows affected by an
	// update, insert, or delete. Not every database or database
	// driver may support this.
1740
	RowsAffected() (int64, error)
1741 1742
}

1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
type driverResult struct {
	sync.Locker // the *driverConn
	resi        driver.Result
}

func (dr driverResult) LastInsertId() (int64, error) {
	dr.Lock()
	defer dr.Unlock()
	return dr.resi.LastInsertId()
}

func (dr driverResult) RowsAffected() (int64, error) {
	dr.Lock()
	defer dr.Unlock()
	return dr.resi.RowsAffected()
}

func stack() string {
	var buf [2 << 10]byte
	return string(buf[:runtime.Stack(buf[:], false)])
}

// withLock runs while holding lk.
func withLock(lk sync.Locker, fn func()) {
	lk.Lock()
	fn()
	lk.Unlock()
1770
}