From 9e1c0ee31d90189eaf3b2f268819f46a77c73ab0 Mon Sep 17 00:00:00 2001 From: shanyy Date: Mon, 16 Apr 2018 13:49:18 +0800 Subject: [PATCH 1/3] Fix issue #894 --- session_find.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/session_find.go b/session_find.go index 46bbf26c..2e4e3879 100644 --- a/session_find.go +++ b/session_find.go @@ -390,7 +390,13 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in return err } bean := cacher.GetBean(tableName, sid) - if bean == nil || reflect.ValueOf(bean).Elem().Type() != t { + + // fix issue #894 + ckt := t + if ckt.Kind() == reflect.Ptr { + ckt = t.Elem() + } + if bean == nil || reflect.ValueOf(bean).Elem().Type() != ckt { ides = append(ides, id) ididxes[sid] = idx } else { From e4f17e61d5cf99c45fd9012e49bb8efca87ed8a2 Mon Sep 17 00:00:00 2001 From: shanyy Date: Mon, 16 Apr 2018 15:08:28 +0800 Subject: [PATCH 2/3] Judge both type of struct and pointer in case of out-of-range --- session_find.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/session_find.go b/session_find.go index 2e4e3879..fb614f4d 100644 --- a/session_find.go +++ b/session_find.go @@ -392,11 +392,12 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in bean := cacher.GetBean(tableName, sid) // fix issue #894 - ckt := t - if ckt.Kind() == reflect.Ptr { - ckt = t.Elem() + ckb := reflect.ValueOf(bean).Elem().Type() + ht := ckb == t + if !ht && t.Kind() == reflect.Ptr { + ht = t.Elem() == ckb } - if bean == nil || reflect.ValueOf(bean).Elem().Type() != ckt { + if bean == nil || !ht { ides = append(ides, id) ididxes[sid] = idx } else { From c0b7dd75f3a19124700143696bee458326ab17eb Mon Sep 17 00:00:00 2001 From: shanyy Date: Mon, 16 Apr 2018 15:59:01 +0800 Subject: [PATCH 3/3] Fix failure caused by nil bean --- session_find.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/session_find.go b/session_find.go index fb614f4d..bccf4b6f 100644 --- a/session_find.go +++ b/session_find.go @@ -392,12 +392,19 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in bean := cacher.GetBean(tableName, sid) // fix issue #894 - ckb := reflect.ValueOf(bean).Elem().Type() - ht := ckb == t - if !ht && t.Kind() == reflect.Ptr { - ht = t.Elem() == ckb + isHit := func() (ht bool) { + if bean == nil { + ht = false + return + } + ckb := reflect.ValueOf(bean).Elem().Type() + ht = ckb == t + if !ht && t.Kind() == reflect.Ptr { + ht = t.Elem() == ckb + } + return } - if bean == nil || !ht { + if !isHit() { ides = append(ides, id) ididxes[sid] = idx } else {