fix memory leak caused by returning noRows{}, updates #43

This commit is contained in:
Jan Mercl
2021-01-25 12:21:35 +01:00
parent ac62cee27c
commit 168943b08a

View File

@@ -34,7 +34,6 @@ var (
_ driver.Queryer = (*conn)(nil) _ driver.Queryer = (*conn)(nil)
_ driver.Result = (*result)(nil) _ driver.Result = (*result)(nil)
_ driver.Rows = (*rows)(nil) _ driver.Rows = (*rows)(nil)
_ driver.Rows = noRows{}
_ driver.RowsColumnTypeDatabaseTypeName = (*rows)(nil) _ driver.RowsColumnTypeDatabaseTypeName = (*rows)(nil)
_ driver.RowsColumnTypeLength = (*rows)(nil) _ driver.RowsColumnTypeLength = (*rows)(nil)
_ driver.RowsColumnTypeNullable = (*rows)(nil) _ driver.RowsColumnTypeNullable = (*rows)(nil)
@@ -619,6 +618,10 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
switch rc & 0xff { switch rc & 0xff {
case sqlite3.SQLITE_ROW: case sqlite3.SQLITE_ROW:
if r != nil {
r.Close()
}
if r, err = newRows(s.c, pstmt, allocs, false); err != nil { if r, err = newRows(s.c, pstmt, allocs, false); err != nil {
return err return err
} }
@@ -628,15 +631,19 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
case sqlite3.SQLITE_DONE: case sqlite3.SQLITE_DONE:
if r == nil { if r == nil {
pstmt = 0 pstmt = 0
r = noRows{} r, err = newRows(s.c, pstmt, allocs, true)
return nil return err
} }
// nop // nop
default: default:
return s.c.errstr(int32(rc)) return s.c.errstr(int32(rc))
} }
if *(*byte)(unsafe.Pointer(psql)) == 0 { if *(*byte)(unsafe.Pointer(psql)) == 0 {
if r != nil {
r.Close()
}
if r, err = newRows(s.c, pstmt, allocs, true); err != nil { if r, err = newRows(s.c, pstmt, allocs, true); err != nil {
return err return err
} }
@@ -656,12 +663,6 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
return r, err return r, err
} }
type noRows struct{}
func (noRows) Columns() []string { return nil }
func (noRows) Close() error { return nil }
func (noRows) Next([]driver.Value) error { return io.EOF }
type tx struct { type tx struct {
c *conn c *conn
} }