From 285dff4c956236b69f08ebf1c42d2076c57d7838 Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 9 Jul 2024 17:51:18 +0800 Subject: [PATCH 1/3] fix 3668 --- contrib/drivers/pgsql/pgsql_convert.go | 8 +++-- .../drivers/pgsql/pgsql_z_unit_issue_test.go | 29 +++++++++++++++++++ .../pgsql/testdata/issues/issue3668.sql | 4 +++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 contrib/drivers/pgsql/testdata/issues/issue3668.sql diff --git a/contrib/drivers/pgsql/pgsql_convert.go b/contrib/drivers/pgsql/pgsql_convert.go index dc71a8cc40a..64b20da564c 100644 --- a/contrib/drivers/pgsql/pgsql_convert.go +++ b/contrib/drivers/pgsql/pgsql_convert.go @@ -19,9 +19,11 @@ import ( // ConvertValueForField converts value to database acceptable value. func (d *Driver) ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - var ( - fieldValueKind = reflect.TypeOf(fieldValue).Kind() - ) + if fieldValue == nil { + return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) + } + + var fieldValueKind = reflect.TypeOf(fieldValue).Kind() if fieldValueKind == reflect.Slice { fieldValue = gstr.ReplaceByMap(gconv.String(fieldValue), diff --git a/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go b/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go index 492826c210c..c171f168185 100644 --- a/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go +++ b/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go @@ -103,3 +103,32 @@ func Test_Issue3632(t *testing.T) { t.AssertNil(err) }) } + +func Test_Issue3668(t *testing.T) { + type Issue3668 struct { + Text interface{} + Number interface{} + } + var ( + sqlText = gtest.DataContent("issues", "issue3668.sql") + table = fmt.Sprintf(`%s_%d`, TablePrefix+"issue3668", gtime.TimestampNano()) + ) + if _, err := db.Exec(ctx, fmt.Sprintf(sqlText, table)); err != nil { + gtest.Fatal(err) + } + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + var ( + dao = db.Model(table) + data = Issue3668{ + Text: "我们都是自然的婴儿,卧在宇宙的摇篮里", + Number: nil, + } + ) + _, err := dao.Ctx(ctx). + Data(data). + Insert() + t.AssertNil(err) + }) +} diff --git a/contrib/drivers/pgsql/testdata/issues/issue3668.sql b/contrib/drivers/pgsql/testdata/issues/issue3668.sql new file mode 100644 index 00000000000..968231ab6d2 --- /dev/null +++ b/contrib/drivers/pgsql/testdata/issues/issue3668.sql @@ -0,0 +1,4 @@ +CREATE TABLE "public"."%s" ( + "text" varchar(255) COLLATE "pg_catalog"."default", + "number" int4 +); From 60860b6d1c043d4596d10410763c9f377e39780f Mon Sep 17 00:00:00 2001 From: oldme Date: Tue, 9 Jul 2024 17:57:32 +0800 Subject: [PATCH 2/3] fix 3668 --- contrib/drivers/pgsql/pgsql_z_unit_issue_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go b/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go index c171f168185..bc5f830db94 100644 --- a/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go +++ b/contrib/drivers/pgsql/pgsql_z_unit_issue_test.go @@ -104,6 +104,7 @@ func Test_Issue3632(t *testing.T) { }) } +// https://github.com/gogf/gf/issues/3668 func Test_Issue3668(t *testing.T) { type Issue3668 struct { Text interface{} From c9ecf5897b00e48da649c6d52f25d67e2380289d Mon Sep 17 00:00:00 2001 From: oldme Date: Thu, 18 Jul 2024 10:14:35 +0800 Subject: [PATCH 3/3] up --- contrib/drivers/pgsql/pgsql_convert.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/drivers/pgsql/pgsql_convert.go b/contrib/drivers/pgsql/pgsql_convert.go index 64b20da564c..9f7ff013aee 100644 --- a/contrib/drivers/pgsql/pgsql_convert.go +++ b/contrib/drivers/pgsql/pgsql_convert.go @@ -12,6 +12,7 @@ import ( "strings" "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/text/gregex" "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" @@ -19,7 +20,7 @@ import ( // ConvertValueForField converts value to database acceptable value. func (d *Driver) ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - if fieldValue == nil { + if g.IsNil(fieldValue) { return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) }