From 168943b08a258a65216da7d7f8a3de7cc5e3cb38 Mon Sep 17 00:00:00 2001 From: Jan Mercl <0xjnml@gmail.com> Date: Mon, 25 Jan 2021 12:21:35 +0100 Subject: [PATCH] fix memory leak caused by returning noRows{}, updates #43 --- sqlite.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sqlite.go b/sqlite.go index df5340d..06d2111 100644 --- a/sqlite.go +++ b/sqlite.go @@ -34,7 +34,6 @@ var ( _ driver.Queryer = (*conn)(nil) _ driver.Result = (*result)(nil) _ driver.Rows = (*rows)(nil) - _ driver.Rows = noRows{} _ driver.RowsColumnTypeDatabaseTypeName = (*rows)(nil) _ driver.RowsColumnTypeLength = (*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 { case sqlite3.SQLITE_ROW: + if r != nil { + r.Close() + } + if r, err = newRows(s.c, pstmt, allocs, false); err != nil { return err } @@ -628,15 +631,19 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro case sqlite3.SQLITE_DONE: if r == nil { pstmt = 0 - r = noRows{} - return nil + r, err = newRows(s.c, pstmt, allocs, true) + return err } + // nop default: return s.c.errstr(int32(rc)) } if *(*byte)(unsafe.Pointer(psql)) == 0 { + if r != nil { + r.Close() + } if r, err = newRows(s.c, pstmt, allocs, true); err != nil { return err } @@ -656,12 +663,6 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro 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 { c *conn }