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
- Scan all rows before calling rows.Close()
- Do not reuse a closed Rows; re-execute the query to get a new result set
- 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
- Drain rows fully before Close
- Never iterate a Rows twice
- Check defer/Close ordering in code under test
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
- use of closed connection
- unrecognized query
- bad sql row
- not allowed: deny-all security-policy enforced
- not allowed: read-only security-policy enforced
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/e088ae226d4908da.
Report an issue: GitHub.