diff --git a/src/types/mod.rs b/src/types/mod.rs index 6b398406..4aa8d8ce 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -815,6 +815,25 @@ pub trait ToSql: fmt::Debug { -> Result; } +impl<'a, T> ToSql for &'a T where T: ToSql { + fn to_sql_checked(&self, ty: &Type, out: &mut Write, ctx: &SessionInfo) + -> Result { + if !<&'a T as ToSql>::accepts(ty) { + return Err(Error::WrongType(ty.clone())); + } + self.to_sql(ty, out, ctx) + } + + + fn to_sql(&self, ty: &Type, out: &mut W, ctx: &SessionInfo) -> Result { + (*self).to_sql(ty, out, ctx) + } + + fn accepts(ty: &Type) -> bool { T::accepts(ty) } +} + + + impl ToSql for Option { to_sql_checked!(); diff --git a/tests/types/mod.rs b/tests/types/mod.rs index 22e3fbe3..1736e878 100644 --- a/tests/types/mod.rs +++ b/tests/types/mod.rs @@ -31,6 +31,14 @@ fn test_type(sql_type: &str, checks } } +#[test] +fn test_ref_tosql() { + let conn = or_panic!(Connection::connect("postgres://postgres@localhost", &SslMode::None)); + let stmt = conn.prepare("SELECT $1::Int").unwrap(); + let num: &ToSql = &&7; + stmt.query(&[num]).unwrap(); +} + #[test] fn test_bool_params() { test_type("BOOL", &[(Some(true), "'t'"), (Some(false), "'f'"),