mirror of https://github.com/jackc/pgx.git
Fix JSON scan not completely overwriting destination
See https://github.com/jackc/pgtype/pull/185 for original report in pgx v4 / pgtype.v5-dev
parent
bb6c997102
commit
f8d088cfb6
pgtype
|
@ -134,6 +134,9 @@ func (scanPlanJSONToJSONUnmarshal) Scan(src []byte, dst any) error {
|
|||
return fmt.Errorf("cannot scan NULL into %T", dst)
|
||||
}
|
||||
|
||||
elem := reflect.ValueOf(dst).Elem()
|
||||
elem.Set(reflect.Zero(elem.Type()))
|
||||
|
||||
return json.Unmarshal(src, dst)
|
||||
}
|
||||
|
||||
|
|
|
@ -93,3 +93,16 @@ func TestJSONCodecUnmarshalSQLNull(t *testing.T) {
|
|||
require.EqualError(t, err, "can't scan into dest[0]: cannot scan NULL into *int")
|
||||
})
|
||||
}
|
||||
|
||||
func TestJSONCodecClearExistingValueBeforeUnmarshal(t *testing.T) {
|
||||
defaultConnTestRunner.RunTest(context.Background(), t, func(ctx context.Context, t testing.TB, conn *pgx.Conn) {
|
||||
m := map[string]any{}
|
||||
err := conn.QueryRow(ctx, `select '{"foo": "bar"}'::json`).Scan(&m)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, map[string]any{"foo": "bar"}, m)
|
||||
|
||||
err = conn.QueryRow(ctx, `select '{"baz": "quz"}'::json`).Scan(&m)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, map[string]any{"baz": "quz"}, m)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue