vitessio/vitess · error

err rows closed

Error message

err rows closed

What it means

fakevtsql.ErrRowsClosed is returned by rows.Next (and other row operations) on a fake Rows that has already been Closed. It guards against iterating a result set after it was consumed or closed. Seen only in tests using the fake vtsql driver.

Source

Thrown at go/vt/vtadmin/vtsql/fakevtsql/rows.go:32

limitations under the License.
*/

package fakevtsql

import (
	"database/sql/driver"
	"errors"
	"fmt"
	"io"
)

var (
	// ErrBadRow is returned from Next() when a row has an incorrect number of
	// fields.
	ErrBadRow = errors.New("bad sql row")
	// ErrRowsClosed is returned when attempting to operate on an already-closed
	// Rows.
	ErrRowsClosed = errors.New("err rows closed")
)

type rows struct {
	cols []string
	vals [][]any
	pos  int

	closed bool
}

var _ driver.Rows = (*rows)(nil)

func (r *rows) Close() error {
	r.closed = true
	return nil
}

func (r *rows) Columns() []string {

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Scan all rows before calling rows.Close()
  2. Do not reuse a closed Rows; re-execute the query to get a new result set
  3. Check ordering of deferred Close vs later row reads

Example fix

// before
rows.Close()
rows.Next()
// after
for rows.Next() { /* scan */ }
rows.Close()
Defensive patterns

Strategy: try-catch

Validate before calling

if rows.Closed() {
    return fmt.Errorf("rows already closed")
}

Type guard

func isRowsClosed(err error) bool { return errors.Is(err, fakevtsql.ErrRowsClosed) }

Try / catch

if err := rows.Next(); errors.Is(err, fakevtsql.ErrRowsClosed) {
    // stop iteration; do not reuse the rows object
}

Prevention

When it happens

Trigger: Calling Next after Close on the fake rows; iterating a rows object twice; code under test draining rows then reading again.

Common situations: Test code that re-reads a result set; service code that scans rows after defer rows.Close() has run due to ordering issues.

Related errors


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/e088ae226d4908da. Report an issue: GitHub.