From f2c8aa0ddf2c775982498181f13a0538ee875b5b Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 2 Oct 2024 12:59:49 +0100 Subject: [PATCH] Scanning improvements. --- stmt.go | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/stmt.go b/stmt.go index 378bd5f..2e1f648 100644 --- a/stmt.go +++ b/stmt.go @@ -631,7 +631,7 @@ func (s *Stmt) Columns(dest []any) error { defer s.c.arena.mark()() count := uint64(len(dest)) typePtr := s.c.arena.new(count) - dataPtr := s.c.arena.new(8 * count) + dataPtr := s.c.arena.new(count * 8) r := s.c.call("sqlite3_columns_go", uint64(s.handle), count, uint64(typePtr), uint64(dataPtr)) @@ -649,23 +649,22 @@ func (s *Stmt) Columns(dest []any) error { for i := range dest { switch types[i] { case byte(INTEGER): - dest[i] = int64(util.ReadUint64(s.c.mod, dataPtr+8*uint32(i))) - continue + dest[i] = int64(util.ReadUint64(s.c.mod, dataPtr)) case byte(FLOAT): - dest[i] = util.ReadFloat64(s.c.mod, dataPtr+8*uint32(i)) - continue + dest[i] = util.ReadFloat64(s.c.mod, dataPtr) case byte(NULL): dest[i] = nil - continue - } - ptr := util.ReadUint32(s.c.mod, dataPtr+8*uint32(i)+0) - len := util.ReadUint32(s.c.mod, dataPtr+8*uint32(i)+4) - buf := util.View(s.c.mod, ptr, uint64(len)) - if types[i] == byte(TEXT) { - dest[i] = string(buf) - } else { - dest[i] = buf + default: + ptr := util.ReadUint32(s.c.mod, dataPtr+0) + len := util.ReadUint32(s.c.mod, dataPtr+4) + buf := util.View(s.c.mod, ptr, uint64(len)) + if types[i] == byte(TEXT) { + dest[i] = string(buf) + } else { + dest[i] = buf + } } + dataPtr += 8 } return nil }