From fee77b695a8f4048de0dd6a042d105200c4b5c32 Mon Sep 17 00:00:00 2001 From: mlaflamm Date: Tue, 14 Sep 2021 17:18:56 -0400 Subject: [PATCH] Fix scan nil primitive type slice --- qrm/qrm.go | 4 ++-- qrm/scan_context.go | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/qrm/qrm.go b/qrm/qrm.go index 51bbffa..142f722 100644 --- a/qrm/qrm.go +++ b/qrm/qrm.go @@ -214,9 +214,9 @@ func mapRowToBaseTypeSlice(scanContext *scanContext, slicePtrValue reflect.Value } rowElemPtr := scanContext.rowElemValuePtr(index) - if !rowElemPtr.IsNil() { + if rowElemPtr != nil && !rowElemPtr.IsNil() { updated = true - err = appendElemToSlice(slicePtrValue, rowElemPtr) + err = appendElemToSlice(slicePtrValue, *rowElemPtr) if err != nil { return } diff --git a/qrm/scan_context.go b/qrm/scan_context.go index 6e2b4c8..d11f40b 100644 --- a/qrm/scan_context.go +++ b/qrm/scan_context.go @@ -222,19 +222,23 @@ func (s *scanContext) rowElem(index int) interface{} { return value } -func (s *scanContext) rowElemValuePtr(index int) reflect.Value { +func (s *scanContext) rowElemValuePtr(index int) *reflect.Value { rowElem := s.rowElem(index) rowElemValue := reflect.ValueOf(rowElem) if rowElemValue.Kind() == reflect.Ptr { - return rowElemValue + return &rowElemValue } if rowElemValue.CanAddr() { - return rowElemValue.Addr() + addr := rowElemValue.Addr() + return &addr } - newElem := reflect.New(rowElemValue.Type()) - newElem.Elem().Set(rowElemValue) - return newElem + if rowElemValue.IsValid() { + newElem := reflect.New(rowElemValue.Type()) + newElem.Elem().Set(rowElemValue) + return &newElem + } + return nil }