diff --git a/postgres-derive-test/src/domains.rs b/postgres-derive-test/src/domains.rs index 25674f75e..bee415b62 100644 --- a/postgres-derive-test/src/domains.rs +++ b/postgres-derive-test/src/domains.rs @@ -119,3 +119,36 @@ fn domain_in_composite() { )], ); } + +#[test] +fn composite_in_domain_in_composite() { + #[derive(FromSql, ToSql, Debug, PartialEq)] + #[postgres(name = "leaf_composite")] + struct LeafComposite { + prim: i32, + } + + #[derive(FromSql, ToSql, Debug, PartialEq)] + #[postgres(name = "domain")] + struct Domain(LeafComposite); + + #[derive(FromSql, ToSql, Debug, PartialEq)] + #[postgres(name = "root_composite")] + struct RootComposite { + domain: Domain, + } + + let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap(); + conn.batch_execute("CREATE TYPE leaf_composite AS (prim integer); CREATE DOMAIN domain AS leaf_composite; CREATE TYPE root_composite AS (domain domain);").unwrap(); + + test_type( + &mut conn, + "root_composite", + &[( + RootComposite { + domain: Domain(LeafComposite { prim: 1 }), + }, + "ROW(ROW(1))", + )], + ); +} diff --git a/postgres-derive/src/fromsql.rs b/postgres-derive/src/fromsql.rs index d3ac47f4f..7017f4bd9 100644 --- a/postgres-derive/src/fromsql.rs +++ b/postgres-derive/src/fromsql.rs @@ -179,7 +179,10 @@ fn domain_accepts_body(name: &str, field: &syn::Field) -> TokenStream { fn domain_body(ident: &Ident, field: &syn::Field) -> TokenStream { let ty = &field.ty; quote! { - <#ty as postgres_types::FromSql>::from_sql(_type, buf).map(#ident) + <#ty as postgres_types::FromSql>::from_sql(match *_type.kind() { + postgres_types::Kind::Domain(ref _type) => _type, + _ => _type + }, buf).map(#ident) } }