2017-08-27 14:09:31 +00:00
|
|
|
// Copyright 2017 The Xorm Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
2023-07-26 10:44:41 +00:00
|
|
|
package tests
|
2017-08-27 14:09:31 +00:00
|
|
|
|
|
|
|
import (
|
2023-06-12 09:18:13 +00:00
|
|
|
"bytes"
|
2017-08-27 14:09:31 +00:00
|
|
|
"strconv"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2019-06-17 05:38:13 +00:00
|
|
|
"xorm.io/builder"
|
2023-06-12 09:18:13 +00:00
|
|
|
|
2023-10-27 14:27:46 +00:00
|
|
|
"xorm.io/xorm/v2/schemas"
|
2018-01-18 16:09:37 +00:00
|
|
|
|
2017-08-27 14:09:31 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestQueryString(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2017-08-27 14:09:31 +00:00
|
|
|
|
2017-09-09 03:03:34 +00:00
|
|
|
type GetVar2 struct {
|
2017-08-27 14:09:31 +00:00
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Msg string `xorm:"varchar(255)"`
|
|
|
|
Age int
|
|
|
|
Money float32
|
|
|
|
Created time.Time `xorm:"created"`
|
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(GetVar2)))
|
2017-08-27 14:09:31 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
data := GetVar2{
|
2017-08-27 14:09:31 +00:00
|
|
|
Msg: "hi",
|
|
|
|
Age: 28,
|
|
|
|
Money: 1.5,
|
|
|
|
}
|
|
|
|
_, err := testEngine.InsertOne(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
records, err := testEngine.QueryString("select * from " + testEngine.Quote(testEngine.TableName("get_var2", true)))
|
2017-08-27 14:09:31 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, 1, len(records))
|
|
|
|
assert.Equal(t, 5, len(records[0]))
|
|
|
|
assert.Equal(t, "1", records[0]["id"])
|
|
|
|
assert.Equal(t, "hi", records[0]["msg"])
|
|
|
|
assert.Equal(t, "28", records[0]["age"])
|
|
|
|
assert.Equal(t, "1.5", records[0]["money"])
|
|
|
|
}
|
|
|
|
|
2017-09-09 09:10:15 +00:00
|
|
|
func TestQueryString2(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2017-09-09 09:10:15 +00:00
|
|
|
|
|
|
|
type GetVar3 struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
2021-07-02 03:25:20 +00:00
|
|
|
Msg bool
|
2017-09-09 09:10:15 +00:00
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(GetVar3)))
|
2017-09-09 09:10:15 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
data := GetVar3{
|
2017-09-09 09:10:15 +00:00
|
|
|
Msg: false,
|
|
|
|
}
|
|
|
|
_, err := testEngine.Insert(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
records, err := testEngine.QueryString("select * from " + testEngine.Quote(testEngine.TableName("get_var3", true)))
|
2017-09-09 09:10:15 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, 1, len(records))
|
|
|
|
assert.Equal(t, 2, len(records[0]))
|
|
|
|
assert.Equal(t, "1", records[0]["id"])
|
|
|
|
assert.True(t, "0" == records[0]["msg"] || "false" == records[0]["msg"])
|
|
|
|
}
|
|
|
|
|
2021-07-04 13:23:17 +00:00
|
|
|
func toBool(i interface{}) bool {
|
|
|
|
switch t := i.(type) {
|
|
|
|
case int32:
|
|
|
|
return t > 0
|
|
|
|
case bool:
|
|
|
|
return t
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2017-08-27 14:09:31 +00:00
|
|
|
func TestQueryInterface(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2017-08-27 14:09:31 +00:00
|
|
|
|
|
|
|
type GetVarInterface struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Msg string `xorm:"varchar(255)"`
|
|
|
|
Age int
|
|
|
|
Money float32
|
|
|
|
Created time.Time `xorm:"created"`
|
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(GetVarInterface)))
|
2017-08-27 14:09:31 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
data := GetVarInterface{
|
2017-08-27 14:09:31 +00:00
|
|
|
Msg: "hi",
|
|
|
|
Age: 28,
|
|
|
|
Money: 1.5,
|
|
|
|
}
|
|
|
|
_, err := testEngine.InsertOne(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
records, err := testEngine.QueryInterface("select * from " + testEngine.Quote(testEngine.TableName("get_var_interface", true)))
|
2017-08-27 14:09:31 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, 1, len(records))
|
|
|
|
assert.Equal(t, 5, len(records[0]))
|
2021-07-04 13:23:17 +00:00
|
|
|
assert.EqualValues(t, int64(1), records[0]["id"])
|
|
|
|
assert.Equal(t, "hi", records[0]["msg"])
|
|
|
|
assert.EqualValues(t, 28, records[0]["age"])
|
|
|
|
assert.EqualValues(t, 1.5, records[0]["money"])
|
2017-08-27 14:09:31 +00:00
|
|
|
}
|
2017-11-15 03:34:59 +00:00
|
|
|
|
|
|
|
func TestQueryNoParams(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2017-11-15 03:34:59 +00:00
|
|
|
|
|
|
|
type QueryNoParams struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Msg string `xorm:"varchar(255)"`
|
|
|
|
Age int
|
|
|
|
Money float32
|
|
|
|
Created time.Time `xorm:"created"`
|
|
|
|
}
|
|
|
|
|
|
|
|
testEngine.ShowSQL(true)
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(QueryNoParams)))
|
2017-11-15 03:34:59 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
q := QueryNoParams{
|
2017-11-15 03:34:59 +00:00
|
|
|
Msg: "message",
|
|
|
|
Age: 20,
|
|
|
|
Money: 3000,
|
|
|
|
}
|
|
|
|
cnt, err := testEngine.Insert(&q)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, cnt)
|
|
|
|
|
|
|
|
assertResult := func(t *testing.T, results []map[string][]byte) {
|
|
|
|
assert.EqualValues(t, 1, len(results))
|
|
|
|
id, err := strconv.ParseInt(string(results[0]["id"]), 10, 64)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, id)
|
|
|
|
assert.Equal(t, "message", string(results[0]["msg"]))
|
|
|
|
|
|
|
|
age, err := strconv.Atoi(string(results[0]["age"]))
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 20, age)
|
|
|
|
|
|
|
|
money, err := strconv.ParseFloat(string(results[0]["money"]), 32)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 3000, money)
|
|
|
|
}
|
|
|
|
|
|
|
|
results, err := testEngine.Table("query_no_params").Limit(10).Query()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assertResult(t, results)
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
results, err = testEngine.SQL("select * from " + testEngine.Quote(testEngine.TableName("query_no_params", true))).Query()
|
2017-11-15 03:34:59 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assertResult(t, results)
|
|
|
|
}
|
2018-01-18 16:09:37 +00:00
|
|
|
|
2018-05-08 09:44:15 +00:00
|
|
|
func TestQueryStringNoParam(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2018-05-08 09:44:15 +00:00
|
|
|
|
|
|
|
type GetVar4 struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
2021-07-02 03:25:20 +00:00
|
|
|
Msg bool
|
2018-05-08 09:44:15 +00:00
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(GetVar4)))
|
2018-05-08 09:44:15 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
data := GetVar4{
|
2018-05-08 09:44:15 +00:00
|
|
|
Msg: false,
|
|
|
|
}
|
|
|
|
_, err := testEngine.Insert(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
records, err := testEngine.Table("get_var4").Limit(1).QueryString()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(records))
|
|
|
|
assert.EqualValues(t, "1", records[0]["id"])
|
2020-03-07 08:51:30 +00:00
|
|
|
if testEngine.Dialect().URI().DBType == schemas.POSTGRES || testEngine.Dialect().URI().DBType == schemas.MSSQL {
|
2018-05-08 09:44:15 +00:00
|
|
|
assert.EqualValues(t, "false", records[0]["msg"])
|
|
|
|
} else {
|
|
|
|
assert.EqualValues(t, "0", records[0]["msg"])
|
|
|
|
}
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
records, err = testEngine.Table("get_var4").Where(builder.Eq{"`id`": 1}).QueryString()
|
2018-05-08 09:44:15 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(records))
|
|
|
|
assert.EqualValues(t, "1", records[0]["id"])
|
2020-03-07 08:51:30 +00:00
|
|
|
if testEngine.Dialect().URI().DBType == schemas.POSTGRES || testEngine.Dialect().URI().DBType == schemas.MSSQL {
|
2018-05-08 09:44:15 +00:00
|
|
|
assert.EqualValues(t, "false", records[0]["msg"])
|
|
|
|
} else {
|
|
|
|
assert.EqualValues(t, "0", records[0]["msg"])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-15 05:03:43 +00:00
|
|
|
func TestQuerySliceStringNoParam(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2018-10-15 05:03:43 +00:00
|
|
|
|
|
|
|
type GetVar6 struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
2021-07-02 03:25:20 +00:00
|
|
|
Msg bool
|
2018-10-15 05:03:43 +00:00
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(GetVar6)))
|
2018-10-15 05:03:43 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
data := GetVar6{
|
2018-10-15 05:03:43 +00:00
|
|
|
Msg: false,
|
|
|
|
}
|
|
|
|
_, err := testEngine.Insert(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
records, err := testEngine.Table("get_var6").Limit(1).QuerySliceString()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(records))
|
|
|
|
assert.EqualValues(t, "1", records[0][0])
|
2020-03-07 08:51:30 +00:00
|
|
|
if testEngine.Dialect().URI().DBType == schemas.POSTGRES || testEngine.Dialect().URI().DBType == schemas.MSSQL {
|
2018-10-15 05:03:43 +00:00
|
|
|
assert.EqualValues(t, "false", records[0][1])
|
|
|
|
} else {
|
|
|
|
assert.EqualValues(t, "0", records[0][1])
|
|
|
|
}
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
records, err = testEngine.Table("get_var6").Where(builder.Eq{"`id`": 1}).QuerySliceString()
|
2018-10-15 05:03:43 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(records))
|
|
|
|
assert.EqualValues(t, "1", records[0][0])
|
2020-03-07 08:51:30 +00:00
|
|
|
if testEngine.Dialect().URI().DBType == schemas.POSTGRES || testEngine.Dialect().URI().DBType == schemas.MSSQL {
|
2018-10-15 05:03:43 +00:00
|
|
|
assert.EqualValues(t, "false", records[0][1])
|
|
|
|
} else {
|
|
|
|
assert.EqualValues(t, "0", records[0][1])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-08 09:44:15 +00:00
|
|
|
func TestQueryInterfaceNoParam(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2018-05-08 09:44:15 +00:00
|
|
|
|
|
|
|
type GetVar5 struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
2021-07-02 03:25:20 +00:00
|
|
|
Msg bool
|
2018-05-08 09:44:15 +00:00
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(GetVar5)))
|
2018-05-08 09:44:15 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
data := GetVar5{
|
2018-05-08 09:44:15 +00:00
|
|
|
Msg: false,
|
|
|
|
}
|
|
|
|
_, err := testEngine.Insert(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
records, err := testEngine.Table("get_var5").Limit(1).QueryInterface()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(records))
|
2021-07-04 13:23:17 +00:00
|
|
|
assert.EqualValues(t, 1, records[0]["id"])
|
|
|
|
assert.False(t, toBool(records[0]["msg"]))
|
2018-05-08 09:44:15 +00:00
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
records, err = testEngine.Table("get_var5").Where(builder.Eq{"`id`": 1}).QueryInterface()
|
2018-05-08 09:44:15 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(records))
|
2021-07-04 13:23:17 +00:00
|
|
|
assert.EqualValues(t, 1, records[0]["id"])
|
|
|
|
assert.False(t, toBool(records[0]["msg"]))
|
2018-05-08 09:44:15 +00:00
|
|
|
}
|
|
|
|
|
2018-01-18 16:09:37 +00:00
|
|
|
func TestQueryWithBuilder(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2018-01-18 16:09:37 +00:00
|
|
|
|
|
|
|
type QueryWithBuilder struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Msg string `xorm:"varchar(255)"`
|
|
|
|
Age int
|
|
|
|
Money float32
|
|
|
|
Created time.Time `xorm:"created"`
|
|
|
|
}
|
|
|
|
|
|
|
|
testEngine.ShowSQL(true)
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(QueryWithBuilder)))
|
2018-01-18 16:09:37 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
q := QueryWithBuilder{
|
2018-01-18 16:09:37 +00:00
|
|
|
Msg: "message",
|
|
|
|
Age: 20,
|
|
|
|
Money: 3000,
|
|
|
|
}
|
|
|
|
cnt, err := testEngine.Insert(&q)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, cnt)
|
|
|
|
|
|
|
|
assertResult := func(t *testing.T, results []map[string][]byte) {
|
|
|
|
assert.EqualValues(t, 1, len(results))
|
|
|
|
id, err := strconv.ParseInt(string(results[0]["id"]), 10, 64)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, id)
|
|
|
|
assert.Equal(t, "message", string(results[0]["msg"]))
|
|
|
|
|
|
|
|
age, err := strconv.Atoi(string(results[0]["age"]))
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 20, age)
|
|
|
|
|
|
|
|
money, err := strconv.ParseFloat(string(results[0]["money"]), 32)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 3000, money)
|
|
|
|
}
|
|
|
|
|
2021-08-24 05:46:08 +00:00
|
|
|
results, err := testEngine.Query(builder.Select("*").From(testEngine.Quote(testEngine.TableName("query_with_builder", true))))
|
2018-01-18 16:09:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assertResult(t, results)
|
2018-04-08 00:53:15 +00:00
|
|
|
}
|
2019-01-20 03:53:53 +00:00
|
|
|
|
|
|
|
func TestJoinWithSubQuery(t *testing.T) {
|
2020-03-27 07:13:04 +00:00
|
|
|
assert.NoError(t, PrepareEngine())
|
2019-01-20 03:53:53 +00:00
|
|
|
|
|
|
|
type JoinWithSubQuery1 struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Msg string `xorm:"varchar(255)"`
|
|
|
|
DepartId int64
|
|
|
|
Money float32
|
|
|
|
}
|
|
|
|
|
|
|
|
type JoinWithSubQueryDepart struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
|
|
|
testEngine.ShowSQL(true)
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(JoinWithSubQuery1), new(JoinWithSubQueryDepart)))
|
2019-01-20 03:53:53 +00:00
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
depart := JoinWithSubQueryDepart{
|
2019-01-20 03:53:53 +00:00
|
|
|
Name: "depart1",
|
|
|
|
}
|
|
|
|
cnt, err := testEngine.Insert(&depart)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, cnt)
|
|
|
|
|
2023-07-25 08:37:12 +00:00
|
|
|
q := JoinWithSubQuery1{
|
2019-01-20 03:53:53 +00:00
|
|
|
Msg: "message",
|
|
|
|
DepartId: depart.Id,
|
|
|
|
Money: 3000,
|
|
|
|
}
|
|
|
|
|
|
|
|
cnt, err = testEngine.Insert(&q)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, cnt)
|
|
|
|
|
2020-02-21 02:43:58 +00:00
|
|
|
tbName := testEngine.Quote(testEngine.TableName("join_with_sub_query_depart", true))
|
2019-01-20 03:53:53 +00:00
|
|
|
var querys []JoinWithSubQuery1
|
2021-08-24 05:46:08 +00:00
|
|
|
err = testEngine.Join("INNER", builder.Select("`id`").From(tbName),
|
|
|
|
"`join_with_sub_query_depart`.`id` = `join_with_sub_query1`.`depart_id`").Find(&querys)
|
2019-01-20 03:53:53 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(querys))
|
|
|
|
assert.EqualValues(t, q, querys[0])
|
2020-02-21 02:43:58 +00:00
|
|
|
|
|
|
|
querys = make([]JoinWithSubQuery1, 0, 1)
|
2021-08-24 05:46:08 +00:00
|
|
|
err = testEngine.Join("INNER", "(SELECT `id` FROM "+tbName+") `a`", "`a`.`id` = `join_with_sub_query1`.`depart_id`").
|
2020-02-21 02:43:58 +00:00
|
|
|
Find(&querys)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, len(querys))
|
|
|
|
assert.EqualValues(t, q, querys[0])
|
2019-01-20 03:53:53 +00:00
|
|
|
}
|
2021-07-21 13:13:15 +00:00
|
|
|
|
|
|
|
func TestQueryStringWithLimit(t *testing.T) {
|
|
|
|
assert.NoError(t, PrepareEngine())
|
|
|
|
|
|
|
|
type QueryWithLimit struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Msg string `xorm:"varchar(255)"`
|
|
|
|
DepartId int64
|
|
|
|
Money float32
|
|
|
|
}
|
|
|
|
|
2021-08-24 09:13:17 +00:00
|
|
|
assert.NoError(t, testEngine.Sync(new(QueryWithLimit)))
|
2021-07-21 13:13:15 +00:00
|
|
|
|
|
|
|
data, err := testEngine.Table("query_with_limit").Limit(20, 20).QueryString()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 0, len(data))
|
|
|
|
}
|
2023-06-12 09:18:13 +00:00
|
|
|
|
|
|
|
func TestQueryBLOBInMySQL(t *testing.T) {
|
|
|
|
assert.NoError(t, PrepareEngine())
|
|
|
|
|
|
|
|
var err error
|
|
|
|
type Avatar struct {
|
|
|
|
Id int64 `xorm:"autoincr pk"`
|
|
|
|
Avatar []byte `xorm:"BLOB"`
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, testEngine.Sync(new(Avatar)))
|
|
|
|
testEngine.Delete(Avatar{})
|
|
|
|
|
|
|
|
repeatBytes := func(n int, b byte) []byte {
|
|
|
|
return bytes.Repeat([]byte{b}, n)
|
|
|
|
}
|
|
|
|
|
|
|
|
const N = 10
|
2023-07-25 08:37:12 +00:00
|
|
|
data := []Avatar{}
|
2023-06-12 09:18:13 +00:00
|
|
|
for i := 0; i < N; i++ {
|
|
|
|
// allocate a []byte that is as twice big as the last one
|
|
|
|
// so that the underlying buffer will need to reallocate when querying
|
|
|
|
bs := repeatBytes(1<<(i+2), 'A'+byte(i))
|
|
|
|
data = append(data, Avatar{
|
|
|
|
Avatar: bs,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
_, err = testEngine.Insert(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
defer func() {
|
|
|
|
testEngine.Delete(Avatar{})
|
|
|
|
}()
|
|
|
|
|
|
|
|
{
|
|
|
|
records, err := testEngine.QueryInterface("select avatar from " + testEngine.Quote(testEngine.TableName("avatar", true)))
|
|
|
|
assert.NoError(t, err)
|
|
|
|
for i, record := range records {
|
|
|
|
bs := record["avatar"].([]byte)
|
|
|
|
assert.EqualValues(t, repeatBytes(1<<(i+2), 'A'+byte(i))[:3], bs[:3])
|
|
|
|
t.Logf("%d => %p => %02x %02x %02x", i, bs, bs[0], bs[1], bs[2])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
arr := make([][]interface{}, 0)
|
|
|
|
err = testEngine.Table(testEngine.Quote(testEngine.TableName("avatar", true))).Cols("avatar").Find(&arr)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
for i, record := range arr {
|
|
|
|
bs := record[0].([]byte)
|
|
|
|
assert.EqualValues(t, repeatBytes(1<<(i+2), 'A'+byte(i))[:3], bs[:3])
|
|
|
|
t.Logf("%d => %p => %02x %02x %02x", i, bs, bs[0], bs[1], bs[2])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
arr := make([]map[string]interface{}, 0)
|
|
|
|
err = testEngine.Table(testEngine.Quote(testEngine.TableName("avatar", true))).Cols("avatar").Find(&arr)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
for i, record := range arr {
|
|
|
|
bs := record["avatar"].([]byte)
|
|
|
|
assert.EqualValues(t, repeatBytes(1<<(i+2), 'A'+byte(i))[:3], bs[:3])
|
|
|
|
t.Logf("%d => %p => %02x %02x %02x", i, bs, bs[0], bs[1], bs[2])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-07-25 08:37:12 +00:00
|
|
|
|
|
|
|
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)
|
2023-10-27 14:27:46 +00:00
|
|
|
}
|