Fix a serious bug when using rows and reuse the session

This commit is contained in:
Lunny Xiao 2023-07-25 16:11:31 +08:00
parent a13564976c
commit 408cc87bef
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
2 changed files with 64 additions and 11 deletions

View File

@ -30,7 +30,7 @@ func TestQueryString(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(GetVar2))) assert.NoError(t, testEngine.Sync(new(GetVar2)))
var data = GetVar2{ data := GetVar2{
Msg: "hi", Msg: "hi",
Age: 28, Age: 28,
Money: 1.5, Money: 1.5,
@ -58,7 +58,7 @@ func TestQueryString2(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(GetVar3))) assert.NoError(t, testEngine.Sync(new(GetVar3)))
var data = GetVar3{ data := GetVar3{
Msg: false, Msg: false,
} }
_, err := testEngine.Insert(data) _, err := testEngine.Insert(data)
@ -95,7 +95,7 @@ func TestQueryInterface(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(GetVarInterface))) assert.NoError(t, testEngine.Sync(new(GetVarInterface)))
var data = GetVarInterface{ data := GetVarInterface{
Msg: "hi", Msg: "hi",
Age: 28, Age: 28,
Money: 1.5, Money: 1.5,
@ -128,7 +128,7 @@ func TestQueryNoParams(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(QueryNoParams))) assert.NoError(t, testEngine.Sync(new(QueryNoParams)))
var q = QueryNoParams{ q := QueryNoParams{
Msg: "message", Msg: "message",
Age: 20, Age: 20,
Money: 3000, Money: 3000,
@ -172,7 +172,7 @@ func TestQueryStringNoParam(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(GetVar4))) assert.NoError(t, testEngine.Sync(new(GetVar4)))
var data = GetVar4{ data := GetVar4{
Msg: false, Msg: false,
} }
_, err := testEngine.Insert(data) _, err := testEngine.Insert(data)
@ -209,7 +209,7 @@ func TestQuerySliceStringNoParam(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(GetVar6))) assert.NoError(t, testEngine.Sync(new(GetVar6)))
var data = GetVar6{ data := GetVar6{
Msg: false, Msg: false,
} }
_, err := testEngine.Insert(data) _, err := testEngine.Insert(data)
@ -246,7 +246,7 @@ func TestQueryInterfaceNoParam(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(GetVar5))) assert.NoError(t, testEngine.Sync(new(GetVar5)))
var data = GetVar5{ data := GetVar5{
Msg: false, Msg: false,
} }
_, err := testEngine.Insert(data) _, err := testEngine.Insert(data)
@ -280,7 +280,7 @@ func TestQueryWithBuilder(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(QueryWithBuilder))) assert.NoError(t, testEngine.Sync(new(QueryWithBuilder)))
var q = QueryWithBuilder{ q := QueryWithBuilder{
Msg: "message", Msg: "message",
Age: 20, Age: 20,
Money: 3000, Money: 3000,
@ -329,14 +329,14 @@ func TestJoinWithSubQuery(t *testing.T) {
assert.NoError(t, testEngine.Sync(new(JoinWithSubQuery1), new(JoinWithSubQueryDepart))) assert.NoError(t, testEngine.Sync(new(JoinWithSubQuery1), new(JoinWithSubQueryDepart)))
var depart = JoinWithSubQueryDepart{ depart := JoinWithSubQueryDepart{
Name: "depart1", Name: "depart1",
} }
cnt, err := testEngine.Insert(&depart) cnt, err := testEngine.Insert(&depart)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
var q = JoinWithSubQuery1{ q := JoinWithSubQuery1{
Msg: "message", Msg: "message",
DepartId: depart.Id, DepartId: depart.Id,
Money: 3000, Money: 3000,
@ -401,7 +401,7 @@ func TestQueryBLOBInMySQL(t *testing.T) {
} }
const N = 10 const N = 10
var data = []Avatar{} data := []Avatar{}
for i := 0; i < N; i++ { for i := 0; i < N; i++ {
// allocate a []byte that is as twice big as the last one // allocate a []byte that is as twice big as the last one
// so that the underlying buffer will need to reallocate when querying // so that the underlying buffer will need to reallocate when querying
@ -448,3 +448,54 @@ func TestQueryBLOBInMySQL(t *testing.T) {
} }
} }
} }
func TestRowsReset(t *testing.T) {
assert.NoError(t, PrepareEngine())
type RowsReset1 struct {
Id int64
Name string
}
type RowsReset2 struct {
Id int64
Name string
}
assert.NoError(t, testEngine.Sync(new(RowsReset1), new(RowsReset2)))
data := []RowsReset1{
{0, "1"},
{0, "2"},
{0, "3"},
}
_, err := testEngine.Insert(data)
assert.NoError(t, err)
data2 := []RowsReset2{
{0, "4"},
{0, "5"},
{0, "6"},
}
_, err = testEngine.Insert(data2)
assert.NoError(t, err)
sess := testEngine.NewSession()
defer sess.Close()
rows, err := sess.Rows(new(RowsReset1))
assert.NoError(t, err)
for rows.Next() {
var data1 RowsReset1
assert.NoError(t, rows.Scan(&data1))
}
rows.Close()
var rrs []RowsReset2
assert.NoError(t, sess.Find(&rrs))
assert.Len(t, rrs, 3)
assert.EqualValues(t, "4", rrs[0].Name)
assert.EqualValues(t, "5", rrs[1].Name)
assert.EqualValues(t, "6", rrs[2].Name)
}

View File

@ -144,6 +144,8 @@ func (rows *Rows) Close() error {
defer rows.session.Close() defer rows.session.Close()
} }
defer rows.session.resetStatement()
if rows.rows != nil { if rows.rows != nil {
return rows.rows.Close() return rows.rows.Close()
} }