From 2c424b6d63f52e15013a05fb784f8e83dcbc75a4 Mon Sep 17 00:00:00 2001 From: Austin Bonander Date: Fri, 27 Dec 2019 23:20:01 -0800 Subject: [PATCH] allow slices to be passed to `query!()` capture args by ref --- sqlx-macros/src/database/mysql.rs | 2 +- sqlx-macros/src/database/postgres.rs | 2 +- sqlx-macros/src/query_macros/args.rs | 2 +- src/ty_cons.rs | 11 ++++++++++- tests/postgres-macros.rs | 20 ++++++++++++++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/sqlx-macros/src/database/mysql.rs b/sqlx-macros/src/database/mysql.rs index 0f653d9f..76bef311 100644 --- a/sqlx-macros/src/database/mysql.rs +++ b/sqlx-macros/src/database/mysql.rs @@ -1,7 +1,7 @@ impl_database_ext! { sqlx::MySql { bool, - String | &str, + String, i16, i32, i64, diff --git a/sqlx-macros/src/database/postgres.rs b/sqlx-macros/src/database/postgres.rs index ad890c95..75806560 100644 --- a/sqlx-macros/src/database/postgres.rs +++ b/sqlx-macros/src/database/postgres.rs @@ -1,7 +1,7 @@ impl_database_ext! { sqlx::Postgres { bool, - String | &str, + String, i16, i32, i64, diff --git a/sqlx-macros/src/query_macros/args.rs b/sqlx-macros/src/query_macros/args.rs index 0b334b88..d3580531 100644 --- a/sqlx-macros/src/query_macros/args.rs +++ b/sqlx-macros/src/query_macros/args.rs @@ -61,7 +61,7 @@ pub fn quote_args( let args = input.args.iter(); Ok(quote! { - let args = (#(#args),*,); + let args = (#(&#args),*,); #args_check }) } diff --git a/src/ty_cons.rs b/src/ty_cons.rs index 6aa3b863..c6e06e93 100644 --- a/src/ty_cons.rs +++ b/src/ty_cons.rs @@ -27,10 +27,19 @@ impl TyCons> { } } -impl TyConsExt for TyCons<&'_ T> { +// no overlap with the following impls because of the `: Sized` bound +impl TyConsExt for TyCons<&'_ T> { type Cons = T; } +impl TyConsExt for TyCons<&'_ str> { + type Cons = String; +} + +impl TyConsExt for TyCons<&'_ [T]> { + type Cons = Vec; +} + impl TyConsExt for TyCons> { type Cons = T; } diff --git a/tests/postgres-macros.rs b/tests/postgres-macros.rs index 40e66a82..a5137baf 100644 --- a/tests/postgres-macros.rs +++ b/tests/postgres-macros.rs @@ -64,6 +64,26 @@ async fn test_query_file_as() -> sqlx::Result<()> { Ok(()) } +#[async_std::test] +async fn query_by_string() -> sqlx::Result<()> { + let mut conn = sqlx::postgres::connect(&dotenv::var("DATABASE_URL").unwrap()).await?; + + let string = "Hello, world!".to_string(); + + let result = sqlx::query!( + "SELECT * from (VALUES('Hello, world!')) strings(string)\ + where string = $1 or string = $2", + string, + string[..] + ) + .fetch_one(&mut conn) + .await?; + + assert_eq!(result.string, string); + + Ok(()) +} + #[async_std::test] async fn test_nullable_err() -> sqlx::Result<()> { #[derive(Debug)]