Fix JSON scan not completely overwriting destination

See https://github.com/jackc/pgtype/pull/185 for original report in
pgx v4 / pgtype.
v5-dev
Jack Christensen 2022-09-02 18:37:02 -05:00
parent bb6c997102
commit f8d088cfb6
2 changed files with 16 additions and 0 deletions

View File

@ -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)
}

View File

@ -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)
})
}