CompositeTextScanner handles backslash escapes

fixes https://github.com/jackc/pgx/issues/874
non-blocking
Jack Christensen 2021-04-24 08:08:34 -05:00
parent 4a3a424dff
commit 4380e23ae1
2 changed files with 47 additions and 0 deletions

View File

@ -491,6 +491,10 @@ func (cfs *CompositeTextScanner) Next() bool {
} else {
break
}
} else if ch == '\\' {
cfs.rp++
cfs.fieldBytes = append(cfs.fieldBytes, cfs.src[cfs.rp])
cfs.rp++
} else {
cfs.fieldBytes = append(cfs.fieldBytes, ch)
cfs.rp++

View File

@ -204,6 +204,49 @@ create type ct_test as (
}
}
// https://github.com/jackc/pgx/issues/874
func TestCompositeTypeTextDecodeNested(t *testing.T) {
newCompositeType := func(name string, fieldNames []string, vals ...pgtype.ValueTranscoder) *pgtype.CompositeType {
fields := make([]pgtype.CompositeTypeField, len(fieldNames))
for i, name := range fieldNames {
fields[i] = pgtype.CompositeTypeField{Name: name}
}
rowType, err := pgtype.NewCompositeTypeValues(name, fields, vals)
require.NoError(t, err)
return rowType
}
dimensionsType := func() pgtype.ValueTranscoder {
return newCompositeType(
"dimensions",
[]string{"width", "height"},
&pgtype.Int4{},
&pgtype.Int4{},
)
}
productImageType := func() pgtype.ValueTranscoder {
return newCompositeType(
"product_image_type",
[]string{"source", "dimensions"},
&pgtype.Text{},
dimensionsType(),
)
}
productImageSetType := newCompositeType(
"product_image_set_type",
[]string{"name", "orig_image", "images"},
&pgtype.Text{},
productImageType(),
pgtype.NewArrayType("product_image", 0, func() pgtype.ValueTranscoder {
return productImageType()
}),
)
err := productImageSetType.DecodeText(nil, []byte(`(name,"(img1,""(11,11)"")","{""(img2,\\""(22,22)\\"")"",""(img3,\\""(33,33)\\"")""}")`))
require.NoError(t, err)
}
func Example_composite() {
conn, err := pgx.Connect(context.Background(), os.Getenv("PGX_TEST_DATABASE"))
if err != nil {