Postgres: Fix JSON data type mapping with PGX driver (#110566)

This commit is contained in:
Diego Giagio
2025-09-05 08:39:56 +02:00
committed by GitHub
parent 5872672042
commit 554cd6f198
2 changed files with 24 additions and 5 deletions
@@ -1,6 +1,7 @@
package postgres
import (
"encoding/json"
"fmt"
"math/rand"
"strings"
@@ -242,7 +243,10 @@ func TestIntegrationPostgresPGX(t *testing.T) {
c14_timetz time with time zone,
time date,
c15_interval interval,
c16_smallint smallint
c16_smallint smallint,
c17_json json,
c18_jsonb jsonb
);
`
_, err := p.Exec(t.Context(), sql)
@@ -253,9 +257,8 @@ func TestIntegrationPostgresPGX(t *testing.T) {
1,2,3,
4.5,6.7,1.1,1.2,
'char10','varchar10','text',
now(),now(),now(),now(),now(),now(),'15m'::interval,
null
now(),now(),now(),now(),now(),now(),'15m'::interval,null,
'{"key1": "value1"}'::json, '{"key2": "value2"}'::jsonb
);
`
_, err = p.Exec(t.Context(), sql)
@@ -280,7 +283,7 @@ func TestIntegrationPostgresPGX(t *testing.T) {
frames := queryResult.Frames
require.Len(t, frames, 1)
require.Len(t, frames[0].Fields, 18)
require.Len(t, frames[0].Fields, 20)
require.Equal(t, int16(1), *frames[0].Fields[0].At(0).(*int16))
require.Equal(t, int32(2), *frames[0].Fields[1].At(0).(*int32))
@@ -309,6 +312,13 @@ func TestIntegrationPostgresPGX(t *testing.T) {
require.True(t, ok)
require.Equal(t, "00:15:00", *frames[0].Fields[16].At(0).(*string))
require.Nil(t, frames[0].Fields[17].At(0))
_, ok = frames[0].Fields[18].At(0).(*json.RawMessage)
require.True(t, ok)
require.Equal(t, json.RawMessage(`{"key1": "value1"}`), *frames[0].Fields[18].At(0).(*json.RawMessage))
_, ok = frames[0].Fields[19].At(0).(*json.RawMessage)
require.True(t, ok)
require.Equal(t, json.RawMessage(`{"key2": "value2"}`), *frames[0].Fields[19].At(0).(*json.RawMessage))
})
})
@@ -502,6 +502,15 @@ func convertResultsToFrame(results []*pgconn.Result, rowLimit int64) (*data.Fram
return nil, err
}
row[colIdx] = d
case pgtype.JSONOID, pgtype.JSONBOID:
var d *string
scanPlan := m.PlanScan(dataTypeOID, format, &d)
err := scanPlan.Scan(rawValue, &d)
if err != nil {
return nil, err
}
j := json.RawMessage(*d)
row[colIdx] = &j
default:
var d *string
scanPlan := m.PlanScan(dataTypeOID, format, &d)