2
0

ArrayType requires element OID

This commit is contained in:
Jack Christensen
2020-05-13 07:11:10 -05:00
parent ee0e207ee4
commit f8471ebfa8
2 changed files with 7 additions and 13 deletions
+5 -11
View File
@@ -18,11 +18,12 @@ type ArrayType struct {
status Status status Status
typeName string typeName string
elementOID uint32
newElement func() ValueTranscoder newElement func() ValueTranscoder
} }
func NewArrayType(typeName string, newElement func() ValueTranscoder) *ArrayType { func NewArrayType(typeName string, elementOID uint32, newElement func() ValueTranscoder) *ArrayType {
return &ArrayType{typeName: typeName, newElement: newElement} return &ArrayType{typeName: typeName, elementOID: elementOID, newElement: newElement}
} }
func (at *ArrayType) NewTypeValue() Value { func (at *ArrayType) NewTypeValue() Value {
@@ -32,6 +33,7 @@ func (at *ArrayType) NewTypeValue() Value {
status: at.status, status: at.status,
typeName: at.typeName, typeName: at.typeName,
elementOID: at.elementOID,
newElement: at.newElement, newElement: at.newElement,
} }
} }
@@ -281,15 +283,7 @@ func (src ArrayType) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) {
arrayHeader := ArrayHeader{ arrayHeader := ArrayHeader{
Dimensions: src.dimensions, Dimensions: src.dimensions,
} ElementOID: int32(src.elementOID),
{
value := src.newElement()
if dt, ok := ci.DataTypeForValue(value); ok {
arrayHeader.ElementOID = int32(dt.OID)
} else {
return nil, errors.Errorf("unable to find oid for element type %v", value)
}
} }
for i := range src.elements { for i := range src.elements {
+2 -2
View File
@@ -10,7 +10,7 @@ import (
) )
func TestArrayTypeValue(t *testing.T) { func TestArrayTypeValue(t *testing.T) {
arrayType := pgtype.NewArrayType("_text", func() pgtype.ValueTranscoder { return &pgtype.Text{} }) arrayType := pgtype.NewArrayType("_text", pgtype.TextOID, func() pgtype.ValueTranscoder { return &pgtype.Text{} })
err := arrayType.Set(nil) err := arrayType.Set(nil)
require.NoError(t, err) require.NoError(t, err)
@@ -49,7 +49,7 @@ func TestArrayTypeTranscode(t *testing.T) {
defer testutil.MustCloseContext(t, conn) defer testutil.MustCloseContext(t, conn)
conn.ConnInfo().RegisterDataType(pgtype.DataType{ conn.ConnInfo().RegisterDataType(pgtype.DataType{
Value: pgtype.NewArrayType("_text", func() pgtype.ValueTranscoder { return &pgtype.Text{} }), Value: pgtype.NewArrayType("_text", pgtype.TextOID, func() pgtype.ValueTranscoder { return &pgtype.Text{} }),
Name: "_text", Name: "_text",
OID: pgtype.TextArrayOID, OID: pgtype.TextArrayOID,
}) })