Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Commit a691000

Browse files
lunnyBetaCat0
authored andcommitted
fix error when get null var (#890)
* fix error when get null var * add support get for null var * fix bug
1 parent b757473 commit a691000

File tree

3 files changed

+258
-2
lines changed

3 files changed

+258
-2
lines changed

session_get.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,114 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, table *core.Table, bea
114114
return true, rows.Scan(&bean)
115115
case *sql.NullInt64, *sql.NullBool, *sql.NullFloat64, *sql.NullString:
116116
return true, rows.Scan(bean)
117+
case *string:
118+
var res sql.NullString
119+
if err := rows.Scan(&res); err != nil {
120+
return true, err
121+
}
122+
if res.Valid {
123+
*(bean.(*string)) = res.String
124+
}
125+
return true, nil
126+
case *int:
127+
var res sql.NullInt64
128+
if err := rows.Scan(&res); err != nil {
129+
return true, err
130+
}
131+
if res.Valid {
132+
*(bean.(*int)) = int(res.Int64)
133+
}
134+
return true, nil
135+
case *int8:
136+
var res sql.NullInt64
137+
if err := rows.Scan(&res); err != nil {
138+
return true, err
139+
}
140+
if res.Valid {
141+
*(bean.(*int8)) = int8(res.Int64)
142+
}
143+
return true, nil
144+
case *int16:
145+
var res sql.NullInt64
146+
if err := rows.Scan(&res); err != nil {
147+
return true, err
148+
}
149+
if res.Valid {
150+
*(bean.(*int16)) = int16(res.Int64)
151+
}
152+
return true, nil
153+
case *int32:
154+
var res sql.NullInt64
155+
if err := rows.Scan(&res); err != nil {
156+
return true, err
157+
}
158+
if res.Valid {
159+
*(bean.(*int32)) = int32(res.Int64)
160+
}
161+
return true, nil
162+
case *int64:
163+
var res sql.NullInt64
164+
if err := rows.Scan(&res); err != nil {
165+
return true, err
166+
}
167+
if res.Valid {
168+
*(bean.(*int64)) = int64(res.Int64)
169+
}
170+
return true, nil
171+
case *uint:
172+
var res sql.NullInt64
173+
if err := rows.Scan(&res); err != nil {
174+
return true, err
175+
}
176+
if res.Valid {
177+
*(bean.(*uint)) = uint(res.Int64)
178+
}
179+
return true, nil
180+
case *uint8:
181+
var res sql.NullInt64
182+
if err := rows.Scan(&res); err != nil {
183+
return true, err
184+
}
185+
if res.Valid {
186+
*(bean.(*uint8)) = uint8(res.Int64)
187+
}
188+
return true, nil
189+
case *uint16:
190+
var res sql.NullInt64
191+
if err := rows.Scan(&res); err != nil {
192+
return true, err
193+
}
194+
if res.Valid {
195+
*(bean.(*uint16)) = uint16(res.Int64)
196+
}
197+
return true, nil
198+
case *uint32:
199+
var res sql.NullInt64
200+
if err := rows.Scan(&res); err != nil {
201+
return true, err
202+
}
203+
if res.Valid {
204+
*(bean.(*uint32)) = uint32(res.Int64)
205+
}
206+
return true, nil
207+
case *uint64:
208+
var res sql.NullInt64
209+
if err := rows.Scan(&res); err != nil {
210+
return true, err
211+
}
212+
if res.Valid {
213+
*(bean.(*uint64)) = uint64(res.Int64)
214+
}
215+
return true, nil
216+
case *bool:
217+
var res sql.NullBool
218+
if err := rows.Scan(&res); err != nil {
219+
return true, err
220+
}
221+
if res.Valid {
222+
*(bean.(*bool)) = res.Bool
223+
}
224+
return true, nil
117225
}
118226

119227
switch beanKind {
@@ -142,6 +250,9 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, table *core.Table, bea
142250
err = rows.ScanSlice(bean)
143251
case reflect.Map:
144252
err = rows.ScanMap(bean)
253+
case reflect.String, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
254+
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
255+
err = rows.Scan(&bean)
145256
default:
146257
err = rows.Scan(bean)
147258
}

session_get_test.go

Lines changed: 146 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
"testing"
1111
"time"
1212

13-
"xorm.io/core"
1413
"github.com/stretchr/testify/assert"
14+
"xorm.io/core"
1515
)
1616

1717
func TestGetVar(t *testing.T) {
@@ -56,6 +56,69 @@ func TestGetVar(t *testing.T) {
5656
assert.Equal(t, true, has)
5757
assert.EqualValues(t, 28, age2)
5858

59+
var age3 int8
60+
has, err = testEngine.Table("get_var").Cols("age").Get(&age3)
61+
assert.NoError(t, err)
62+
assert.Equal(t, true, has)
63+
assert.EqualValues(t, 28, age3)
64+
65+
var age4 int16
66+
has, err = testEngine.Table("get_var").Cols("age").
67+
Where("age > ?", 20).
68+
And("age < ?", 30).
69+
Get(&age4)
70+
assert.NoError(t, err)
71+
assert.Equal(t, true, has)
72+
assert.EqualValues(t, 28, age4)
73+
74+
var age5 int32
75+
has, err = testEngine.Table("get_var").Cols("age").
76+
Where("age > ?", 20).
77+
And("age < ?", 30).
78+
Get(&age5)
79+
assert.NoError(t, err)
80+
assert.Equal(t, true, has)
81+
assert.EqualValues(t, 28, age5)
82+
83+
var age6 int
84+
has, err = testEngine.Table("get_var").Cols("age").Get(&age6)
85+
assert.NoError(t, err)
86+
assert.Equal(t, true, has)
87+
assert.EqualValues(t, 28, age6)
88+
89+
var age7 int64
90+
has, err = testEngine.Table("get_var").Cols("age").
91+
Where("age > ?", 20).
92+
And("age < ?", 30).
93+
Get(&age7)
94+
assert.NoError(t, err)
95+
assert.Equal(t, true, has)
96+
assert.EqualValues(t, 28, age7)
97+
98+
var age8 int8
99+
has, err = testEngine.Table("get_var").Cols("age").Get(&age8)
100+
assert.NoError(t, err)
101+
assert.Equal(t, true, has)
102+
assert.EqualValues(t, 28, age8)
103+
104+
var age9 int16
105+
has, err = testEngine.Table("get_var").Cols("age").
106+
Where("age > ?", 20).
107+
And("age < ?", 30).
108+
Get(&age9)
109+
assert.NoError(t, err)
110+
assert.Equal(t, true, has)
111+
assert.EqualValues(t, 28, age9)
112+
113+
var age10 int32
114+
has, err = testEngine.Table("get_var").Cols("age").
115+
Where("age > ?", 20).
116+
And("age < ?", 30).
117+
Get(&age10)
118+
assert.NoError(t, err)
119+
assert.Equal(t, true, has)
120+
assert.EqualValues(t, 28, age10)
121+
59122
var id sql.NullInt64
60123
has, err = testEngine.Table("get_var").Cols("id").Get(&id)
61124
assert.NoError(t, err)
@@ -433,3 +496,85 @@ func TestGetCustomTableInterface(t *testing.T) {
433496
assert.NoError(t, err)
434497
assert.True(t, has)
435498
}
499+
500+
func TestGetNullVar(t *testing.T) {
501+
type TestGetNullVarStruct struct {
502+
Id int64
503+
Name string
504+
Age int
505+
}
506+
507+
assert.NoError(t, prepareEngine())
508+
assertSync(t, new(TestGetNullVarStruct))
509+
510+
affected, err := testEngine.Exec("insert into " + testEngine.TableName(new(TestGetNullVarStruct), true) + " (name,age) values (null,null)")
511+
assert.NoError(t, err)
512+
a, _ := affected.RowsAffected()
513+
assert.EqualValues(t, 1, a)
514+
515+
var name string
516+
has, err := testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("name").Get(&name)
517+
assert.NoError(t, err)
518+
assert.True(t, has)
519+
assert.EqualValues(t, "", name)
520+
521+
var age int
522+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age)
523+
assert.NoError(t, err)
524+
assert.True(t, has)
525+
assert.EqualValues(t, 0, age)
526+
527+
var age2 int8
528+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age2)
529+
assert.NoError(t, err)
530+
assert.True(t, has)
531+
assert.EqualValues(t, 0, age2)
532+
533+
var age3 int16
534+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age3)
535+
assert.NoError(t, err)
536+
assert.True(t, has)
537+
assert.EqualValues(t, 0, age3)
538+
539+
var age4 int32
540+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age4)
541+
assert.NoError(t, err)
542+
assert.True(t, has)
543+
assert.EqualValues(t, 0, age4)
544+
545+
var age5 int64
546+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age5)
547+
assert.NoError(t, err)
548+
assert.True(t, has)
549+
assert.EqualValues(t, 0, age5)
550+
551+
var age6 uint
552+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age6)
553+
assert.NoError(t, err)
554+
assert.True(t, has)
555+
assert.EqualValues(t, 0, age6)
556+
557+
var age7 uint8
558+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age7)
559+
assert.NoError(t, err)
560+
assert.True(t, has)
561+
assert.EqualValues(t, 0, age7)
562+
563+
var age8 int16
564+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age8)
565+
assert.NoError(t, err)
566+
assert.True(t, has)
567+
assert.EqualValues(t, 0, age8)
568+
569+
var age9 int32
570+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age9)
571+
assert.NoError(t, err)
572+
assert.True(t, has)
573+
assert.EqualValues(t, 0, age9)
574+
575+
var age10 int64
576+
has, err = testEngine.Table(new(TestGetNullVarStruct)).Where("id = ?", 1).Cols("age").Get(&age10)
577+
assert.NoError(t, err)
578+
assert.True(t, has)
579+
assert.EqualValues(t, 0, age10)
580+
}

tag_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import (
1111
"testing"
1212
"time"
1313

14-
"xorm.io/core"
1514
"github.com/stretchr/testify/assert"
15+
"xorm.io/core"
1616
)
1717

1818
type UserCU struct {

0 commit comments

Comments
 (0)