diff --git a/driver/driver.go b/driver/driver.go index 742f308..66b209e 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -466,8 +466,9 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive old := s.Stmt.Conn().SetInterrupt(ctx) defer s.Stmt.Conn().SetInterrupt(old) - err = s.Stmt.Exec() - s.Stmt.ClearBindings() + err = errors.Join( + s.Stmt.Exec(), + s.Stmt.ClearBindings()) if err != nil { return nil, err } @@ -604,8 +605,9 @@ var ( ) func (r *rows) Close() error { - r.Stmt.ClearBindings() - return r.Stmt.Reset() + return errors.Join( + r.Stmt.Reset(), + r.Stmt.ClearBindings()) } func (r *rows) Columns() []string { diff --git a/ext/closure/closure.go b/ext/closure/closure.go index 6455b72..1eaae9c 100644 --- a/ext/closure/closure.go +++ b/ext/closure/closure.go @@ -215,7 +215,9 @@ func (c *cursor) Filter(idxNum int, idxStr string, arg ...sqlite3.Value) error { if curr.depth >= maxDepth { continue } - stmt.BindInt64(1, curr.id) + if err := stmt.BindInt64(1, curr.id); err != nil { + return err + } for stmt.Step() { if stmt.ColumnType(0) == sqlite3.INTEGER { next := stmt.ColumnInt64(0) @@ -225,7 +227,9 @@ func (c *cursor) Filter(idxNum int, idxStr string, arg ...sqlite3.Value) error { } } } - stmt.Reset() + if err := stmt.Reset(); err != nil { + return err + } } return nil } diff --git a/ext/csv/csv.go b/ext/csv/csv.go index 20d4a84..7169d53 100644 --- a/ext/csv/csv.go +++ b/ext/csv/csv.go @@ -214,7 +214,10 @@ func (c *cursor) Filter(idxNum int, idxStr string, arg ...sqlite3.Value) error { return err } if c.table.header { - c.Next() // skip header + err = c.Next() // skip header + if err != nil { + return err + } } c.rowID = 0 return c.Next() diff --git a/ext/pivot/pivot.go b/ext/pivot/pivot.go index 015c2d2..eafb615 100644 --- a/ext/pivot/pivot.go +++ b/ext/pivot/pivot.go @@ -99,10 +99,11 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (res *table, err e } func (t *table) Close() error { + var errs []error for _, c := range t.cols { - c.Close() + errs = append(errs, c.Close()) } - return nil + return errors.Join(errs...) } func (t *table) BestIndex(idx *sqlite3.IndexInfo) error { diff --git a/ext/statement/stmt.go b/ext/statement/stmt.go index 9016cd5..aca9aa3 100644 --- a/ext/statement/stmt.go +++ b/ext/statement/stmt.go @@ -8,6 +8,7 @@ package statement import ( "encoding/json" + "errors" "strconv" "strings" "unsafe" @@ -150,8 +151,9 @@ type cursor struct { func (c *cursor) Close() error { if c.stmt == c.table.stmt { c.table.inuse = false - c.stmt.ClearBindings() - return c.stmt.Reset() + return errors.Join( + c.stmt.Reset(), + c.stmt.ClearBindings()) } return c.stmt.Close() } @@ -159,8 +161,10 @@ func (c *cursor) Close() error { func (c *cursor) Filter(idxNum int, idxStr string, arg ...sqlite3.Value) error { c.arg = arg c.rowID = 0 - c.stmt.ClearBindings() - if err := c.stmt.Reset(); err != nil { + err := errors.Join( + c.stmt.Reset(), + c.stmt.ClearBindings()) + if err != nil { return err } diff --git a/func.go b/func.go index 621c095..c416e69 100644 --- a/func.go +++ b/func.go @@ -172,7 +172,10 @@ func finalCallback(ctx context.Context, mod api.Module, pCtx, pAgg, pApp uint32) db := ctx.Value(connKey{}).(*Conn) fn, handle := callbackAggregate(db, pAgg, pApp) fn.Value(Context{db, pCtx}) - util.DelHandle(ctx, handle) + if err := util.DelHandle(ctx, handle); err != nil { + Context{db, pCtx}.ResultError(err) + return // notest + } } func valueCallback(ctx context.Context, mod api.Module, pCtx, pAgg uint32) { diff --git a/stmt.go b/stmt.go index f1648f0..47ef0d2 100644 --- a/stmt.go +++ b/stmt.go @@ -316,15 +316,14 @@ func (s *Stmt) BindTime(param int, value time.Time, format TimeFormat) error { } switch v := format.Encode(value).(type) { case string: - s.BindText(param, v) + return s.BindText(param, v) case int64: - s.BindInt64(param, v) + return s.BindInt64(param, v) case float64: - s.BindFloat(param, v) + return s.BindFloat(param, v) default: panic(util.AssertErr()) } - return nil } func (s *Stmt) bindRFC3339Nano(param int, value time.Time) error {