Test domains when registered and unregistered

Fix bug assigning to unknown type.
pull/483/head
Jack Christensen 2019-04-13 17:09:51 -05:00
parent a6bdd8fd49
commit 5cc4796c96
39 changed files with 88 additions and 5 deletions

View File

@ -680,23 +680,69 @@ func TestConnInitConnInfo(t *testing.T) {
ensureConnValid(t, conn)
}
func TestRegisteredDomainType(t *testing.T) {
func TestUnregisteredTypeUsableAsStringArgumentAndBaseResult(t *testing.T) {
conn := mustConnectString(t, os.Getenv("PGX_TEST_DATABASE"))
defer closeConn(t, conn)
var n uint64
err := conn.QueryRow(context.Background(), "select $1::uint64", "42").Scan(&n)
if err != nil {
t.Fatal(err)
}
if n != 42 {
t.Fatalf("Expected n to be 42, but was %v", n)
}
ensureConnValid(t, conn)
}
func TestDomainType(t *testing.T) {
conn := mustConnectString(t, os.Getenv("PGX_TEST_DATABASE"))
defer closeConn(t, conn)
var err error
var n uint64
// Domain type uint64 is a PostgreSQL domain of underlying type numeric.
// Since it is not registered, pgx does not know how to encode Go uint64 argument.
err = conn.QueryRow(context.Background(), "select $1::uint64", uint64(24)).Scan(&n)
if err == nil {
t.Fatal("expected error encoding uint64 into unregistered domain")
}
// A string can be used. But a string cannot be the result because the describe result from the PostgreSQL server gives
// the underlying type of numeric.
err = conn.QueryRow(context.Background(), "select $1::uint64", "42").Scan(&n)
if err != nil {
t.Fatal(err)
}
if n != 42 {
t.Fatalf("Expected n to be 42, but was %v", n)
}
var uint64OID pgtype.OID
err := conn.QueryRow(context.Background(), "select t.oid from pg_type t where t.typname='uint64';").Scan(&uint64OID)
err = conn.QueryRow(context.Background(), "select t.oid from pg_type t where t.typname='uint64';").Scan(&uint64OID)
if err != nil {
t.Fatalf("did not find uint64 OID, %v", err)
}
conn.ConnInfo.RegisterDataType(pgtype.DataType{Value: &pgtype.Numeric{}, Name: "uint64", OID: uint64OID})
var n uint64
// String is still an acceptable argument after registration
err = conn.QueryRow(context.Background(), "select $1::uint64", "7").Scan(&n)
if err != nil {
t.Fatal(err)
}
if n != 7 {
t.Fatalf("Expected n to be 7, but was %v", n)
}
// But a uint64 is acceptable
err = conn.QueryRow(context.Background(), "select $1::uint64", uint64(24)).Scan(&n)
if err != nil {
t.Fatal(err)
}
if n != 24 {
t.Fatalf("Expected n to be 24, but was %v", n)
}

View File

@ -65,6 +65,7 @@ func (src *ACLItem) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -79,6 +79,7 @@ func (src *ACLItemArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -59,6 +59,7 @@ func (src *Bool) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *BoolArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *BPCharArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -59,6 +59,7 @@ func (src *Bytea) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *ByteaArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -110,6 +110,7 @@ func (src *CIDRArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -67,6 +67,7 @@ func (src *Date) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -82,6 +82,7 @@ func (src *DateArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -79,6 +79,7 @@ func (src *EnumArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -78,6 +78,7 @@ func (src *UUID) AssignTo(dst interface{}) error {
if nextDst, retry := pgtype.GetAssignToDstType(v); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case pgtype.Null:
return pgtype.NullAssignTo(dst)

View File

@ -205,6 +205,7 @@ func (src *Numeric) AssignTo(dst interface{}) error {
if nextDst, retry := pgtype.GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case pgtype.Null:
return pgtype.NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *Float4Array) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *Float8Array) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -68,6 +68,7 @@ func (src *Hstore) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *HstoreArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -86,6 +86,7 @@ func (src *Inet) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -110,6 +110,7 @@ func (src *InetArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -109,6 +109,7 @@ func (src *Int2Array) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -128,6 +128,7 @@ func (src *Int4Array) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -109,6 +109,7 @@ func (src *Int8Array) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -69,6 +69,7 @@ func (src *Interval) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -65,6 +65,7 @@ func (src *Macaddr) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -82,6 +82,7 @@ func (src *MacaddrArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -250,6 +250,7 @@ func (src *Numeric) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -165,6 +165,7 @@ func (src *NumericArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -62,6 +62,7 @@ func (src *Record) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -69,6 +69,7 @@ func (src *Text) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *TextArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -71,6 +71,7 @@ func (src *Timestamp) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -82,6 +82,7 @@ func (src *TimestampArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -72,6 +72,7 @@ func (src *Timestamptz) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -82,6 +82,7 @@ func (src *TimestamptzArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *<%= pgtype_array_type %>) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -137,6 +137,7 @@ func (src *UUIDArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -81,6 +81,7 @@ func (src *VarcharArray) AssignTo(dst interface{}) error {
if nextDst, retry := GetAssignToDstType(dst); retry {
return src.AssignTo(nextDst)
}
return errors.Errorf("unable to assign to %T", dst)
}
case Null:
return NullAssignTo(dst)

View File

@ -889,7 +889,7 @@ func TestQueryRowErrors(t *testing.T) {
}{
// {"select $1::badtype", []interface{}{"Jack"}, []interface{}{&actual.i16}, `type "badtype" does not exist`},
// {"SYNTAX ERROR", []interface{}{}, []interface{}{&actual.i16}, "SQLSTATE 42601"},
{"select $1::text", []interface{}{"Jack"}, []interface{}{&actual.i16}, "cannot decode"},
{"select $1::text", []interface{}{"Jack"}, []interface{}{&actual.i16}, "unable to assign"},
// {"select $1::point", []interface{}{int(705)}, []interface{}{&actual.s}, "cannot convert 705 to Point"},
}