Skip to content

Commit

Permalink
fix: properly discover json.Marshaler on ptr field
Browse files Browse the repository at this point in the history
  • Loading branch information
vmihailenco committed Jan 18, 2022
1 parent 33d0474 commit 3b321b0
Show file tree
Hide file tree
Showing 11 changed files with 47 additions and 0 deletions.
29 changes: 29 additions & 0 deletions internal/dbtest/db_test.go
Expand Up @@ -240,6 +240,7 @@ func TestDB(t *testing.T) {
{testTxScanAndCount},
{testEmbedModelValue},
{testEmbedModelPointer},
{testJSONMarshaler},
}

testEachDB(t, func(t *testing.T, dbName string, db *bun.DB) {
Expand Down Expand Up @@ -1155,3 +1156,31 @@ func testEmbedTypeField(t *testing.T, db *bun.DB) {
require.NoError(t, err)
require.Equal(t, *m1, m2)
}

type JSONField struct {
Foo string `json:"foo"`
}

func (f *JSONField) MarshalJSON() ([]byte, error) {
return []byte(`{"foo": "bar"}`), nil
}

func testJSONMarshaler(t *testing.T, db *bun.DB) {
type Model struct {
Field *JSONField
}

ctx := context.Background()

err := db.ResetModel(ctx, (*Model)(nil))
require.NoError(t, err)

m1 := &Model{Field: new(JSONField)}
_, err = db.NewInsert().Model(m1).Exec(ctx)
require.NoError(t, err)

var m2 Model
err = db.NewSelect().Model(&m2).Scan(ctx)
require.NoError(t, err)
require.Equal(t, "bar", m2.Field.Foo)
}
6 changes: 6 additions & 0 deletions internal/dbtest/query_test.go
Expand Up @@ -656,6 +656,12 @@ func TestQuery(t *testing.T) {
}
return db.NewInsert().Model(&Model{ID: ID("embed")})
},
func(db *bun.DB) schema.QueryAppender {
type Model struct {
Raw *json.RawMessage `bun:",nullzero"`
}
return db.NewInsert().Model(new(Model))
},
}

timeRE := regexp.MustCompile(`'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+(\+\d{2}:\d{2})?'`)
Expand Down
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-mariadb-106
@@ -0,0 +1 @@
INSERT INTO `models` (`raw`) VALUES (DEFAULT) RETURNING `raw`
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-mysql5-106
@@ -0,0 +1 @@
INSERT INTO `models` (`raw`) VALUES (DEFAULT)
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-mysql8-106
@@ -0,0 +1 @@
INSERT INTO `models` (`raw`) VALUES (DEFAULT)
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-pg-106
@@ -0,0 +1 @@
INSERT INTO "models" ("raw") VALUES (DEFAULT) RETURNING "raw"
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-pgx-106
@@ -0,0 +1 @@
INSERT INTO "models" ("raw") VALUES (DEFAULT) RETURNING "raw"
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-sqlite-106
@@ -0,0 +1 @@
INSERT INTO "models" ("raw") VALUES (NULL) RETURNING "raw"
3 changes: 3 additions & 0 deletions schema/append_value.go
Expand Up @@ -128,6 +128,9 @@ func appender(dialect Dialect, typ reflect.Type) AppenderFunc {
case reflect.Interface:
return ifaceAppenderFunc
case reflect.Ptr:
if typ.Implements(jsonMarshalerType) {
return AppendJSONValue
}
if fn := Appender(dialect, typ.Elem()); fn != nil {
return PtrAppender(fn)
}
Expand Down
1 change: 1 addition & 0 deletions schema/reflect.go
Expand Up @@ -17,6 +17,7 @@ var (

driverValuerType = reflect.TypeOf((*driver.Valuer)(nil)).Elem()
queryAppenderType = reflect.TypeOf((*QueryAppender)(nil)).Elem()
jsonMarshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
)

func indirectType(t reflect.Type) reflect.Type {
Expand Down
2 changes: 2 additions & 0 deletions schema/scan.go
Expand Up @@ -94,6 +94,8 @@ func scanner(typ reflect.Type) ScannerFunc {
}

switch typ {
case bytesType:
return scanBytes
case timeType:
return scanTime
case ipType:
Expand Down

0 comments on commit 3b321b0

Please sign in to comment.