@@ -65,15 +65,9 @@ func (rs *RelationSet) Values(id uint32, row *pglogrepl.TupleData) (map[string]a
6565 // assert same number of row and rel columns
6666 for i , tuple := range row .Columns {
6767 col := rel .Columns [i ]
68- decoder := rs .oidToCodec (col .DataType )
69- val , err := decoder .DecodeValue (rs .connInfo , col .DataType , pgtype .TextFormatCode , tuple .Data )
70- if err != nil {
71- return nil , fmt .Errorf ("failed to decode tuple %d: %w" , i , err )
72- }
73-
74- v , err := types .Format (col .DataType , val )
75- if err != nil {
76- return nil , fmt .Errorf ("failed to format column %q type %T: %w" , col .Name , val , err )
68+ v , decodeErr := rs .decodeValue (col , tuple .Data )
69+ if decodeErr != nil {
70+ return nil , fmt .Errorf ("failed to decode value for column %q: %w" , col .Name , err )
7771 }
7872
7973 values [col .Name ] = v
@@ -89,3 +83,30 @@ func (rs *RelationSet) oidToCodec(id uint32) pgtype.Codec {
8983 }
9084 return dt .Codec
9185}
86+
87+ func (rs * RelationSet ) decodeValue (col * pglogrepl.RelationMessageColumn , data []byte ) (any , error ) {
88+ decoder := rs .oidToCodec (col .DataType )
89+ // This workaround is due to an issue in pgx v5.7.1.
90+ // Namely, that version introduces an XML codec
91+ // (see: https://github.com/jackc/pgx/pull/2083/files#diff-8288d41e69f73d01a874b40de086684e5894da83a627e845e484b06d5e053a44).
92+ // The XML codec, however, always return nil when deserializing input bytes
93+ // (see: https://github.com/jackc/pgx/pull/2083#discussion_r1755768269).
94+ var val any
95+ var err error
96+ if col .DataType == pgtype .XMLOID || col .DataType == pgtype .XMLArrayOID {
97+ val , err = decoder .DecodeDatabaseSQLValue (rs .connInfo , col .DataType , pgtype .TextFormatCode , data )
98+ } else {
99+ val , err = decoder .DecodeValue (rs .connInfo , col .DataType , pgtype .TextFormatCode , data )
100+ }
101+
102+ if err != nil {
103+ return nil , fmt .Errorf ("failed to decode value of pgtype %v: %w" , col .DataType , err )
104+ }
105+
106+ v , err := types .Format (col .DataType , val )
107+ if err != nil {
108+ return nil , fmt .Errorf ("failed to format column %q type %T: %w" , col .Name , val , err )
109+ }
110+
111+ return v , nil
112+ }
0 commit comments