Skip to content

Commit fd3a2c2

Browse files
committed
RunQueryDsl: match same trait constraints as diesel
This resolves issue #142 As it more closely matches the Ts that diesel::RunQueryDsl is implemented for as opposed to all Ts
1 parent c46c94b commit fd3a2c2

File tree

3 files changed

+154
-3
lines changed

3 files changed

+154
-3
lines changed

src/run_query_dsl/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub mod methods {
6666
/// to call `load` from generic code.
6767
///
6868
/// [`RunQueryDsl`]: super::RunQueryDsl
69-
pub trait LoadQuery<'query, Conn: AsyncConnection, U> {
69+
pub trait LoadQuery<'query, Conn: AsyncConnection, U>: RunQueryDsl<Conn> {
7070
/// The future returned by [`LoadQuery::internal_load`]
7171
type LoadFuture<'conn>: Future<Output = QueryResult<Self::Stream<'conn>>> + Send
7272
where
@@ -85,7 +85,7 @@ pub mod methods {
8585
Conn: AsyncConnection<Backend = DB>,
8686
U: Send,
8787
DB: Backend + 'static,
88-
T: AsQuery + Send + 'query,
88+
T: AsQuery + RunQueryDsl<Conn> + Send + 'query,
8989
T::Query: QueryFragment<DB> + QueryId + Send + 'query,
9090
T::SqlType: CompatibleType<U, DB, SqlType = ST>,
9191
U: FromSqlRow<ST, DB> + Send + 'static,
@@ -641,7 +641,9 @@ pub trait RunQueryDsl<Conn>: Sized {
641641
}
642642
}
643643

644-
impl<T, Conn> RunQueryDsl<Conn> for T {}
644+
// Note: Match the same types that diesel::RunQueryDsl applies to this
645+
// seems safe currently, as the trait imposes no restrictions based on Conn, only on T.
646+
impl<T, Conn> RunQueryDsl<Conn> for T where T: diesel::query_builder::AsQuery {}
645647

646648
/// Sugar for types which implement both `AsChangeset` and `Identifiable`
647649
///

tests/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod custom_types;
1010
mod instrumentation;
1111
#[cfg(any(feature = "bb8", feature = "deadpool", feature = "mobc"))]
1212
mod pooling;
13+
mod run_query_dsl_impl_match;
1314
#[cfg(feature = "async-connection-wrapper")]
1415
mod sync_wrapper;
1516
mod type_check;

tests/run_query_dsl_impl_match.rs

+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
use super::{connection, users, User};
2+
use diesel::prelude::*;
3+
use diesel_async::RunQueryDsl;
4+
5+
#[derive(Debug, QueryableByName, PartialEq)]
6+
struct CountType {
7+
#[diesel(sql_type = diesel::sql_types::BigInt)]
8+
pub count: i64,
9+
}
10+
11+
#[tokio::test]
12+
async fn test_boxed_sql() {
13+
use diesel::query_builder::BoxedSqlQuery;
14+
15+
let mut con = connection().await;
16+
17+
let boxed: BoxedSqlQuery<_, _> =
18+
diesel::sql_query("select count(*) as count from users").into_boxed();
19+
20+
let result = boxed.get_result::<CountType>(&mut con).await.unwrap();
21+
22+
assert_eq!(result.count, 0);
23+
}
24+
25+
#[tokio::test]
26+
async fn test_select_statement() {
27+
use diesel::query_builder::SelectStatement;
28+
29+
let mut con = connection().await;
30+
31+
let select: SelectStatement<_, _, _, _, _, _, _> = users::table.select(User::as_select());
32+
33+
let result = select.get_results(&mut con).await.unwrap();
34+
35+
assert_eq!(result.len(), 0);
36+
}
37+
38+
#[tokio::test]
39+
async fn test_sql_query() {
40+
use diesel::query_builder::SqlQuery;
41+
42+
let mut con = connection().await;
43+
44+
let sql: SqlQuery<_> = diesel::sql_query("select count(*) as count from users");
45+
46+
let result: CountType = sql.get_result(&mut con).await.unwrap();
47+
48+
assert_eq!(result.count, 0);
49+
}
50+
51+
#[tokio::test]
52+
async fn test_unchecked_bind() {
53+
use diesel::expression::UncheckedBind;
54+
use diesel::sql_types::{BigInt, Text};
55+
56+
let mut con = connection().await;
57+
58+
let unchecked: UncheckedBind<_, _> =
59+
diesel::dsl::sql::<BigInt>("SELECT count(id) FROM users WHERE name = ")
60+
.bind::<Text, _>("Bob");
61+
62+
let result = unchecked.get_result(&mut con).await;
63+
64+
assert_eq!(Ok(0), result);
65+
}
66+
67+
#[tokio::test]
68+
async fn test_alias() {
69+
use diesel::query_source::Alias;
70+
71+
let mut con = connection().await;
72+
73+
let aliased: Alias<_> = diesel::alias!(users as other);
74+
75+
let result = aliased.get_results::<User>(&mut con).await.unwrap();
76+
77+
assert_eq!(result.len(), 0);
78+
}
79+
80+
#[tokio::test]
81+
async fn test_boxed_select() {
82+
use diesel::query_builder::BoxedSelectStatement;
83+
84+
let mut con = connection().await;
85+
86+
let select: BoxedSelectStatement<_, _, _, _> =
87+
users::table.select(User::as_select()).into_boxed();
88+
89+
let result = select.get_results(&mut con).await.unwrap();
90+
91+
assert_eq!(result.len(), 0);
92+
}
93+
94+
#[tokio::test]
95+
async fn test_sql_literal() {
96+
use diesel::expression::SqlLiteral;
97+
use diesel::sql_types::Integer;
98+
99+
let mut con = connection().await;
100+
101+
let literal: SqlLiteral<_> = diesel::dsl::sql::<Integer>("SELECT 6");
102+
103+
let result = literal.get_result(&mut con).await;
104+
105+
assert_eq!(Ok(6), result);
106+
}
107+
108+
#[tokio::test]
109+
async fn test_delete() {
110+
use diesel::query_builder::DeleteStatement;
111+
112+
let mut con = connection().await;
113+
114+
let delete: DeleteStatement<_, _, _> = diesel::delete(users::table);
115+
116+
let result = delete.execute(&mut con).await;
117+
118+
assert_eq!(Ok(0), result);
119+
}
120+
121+
#[tokio::test]
122+
async fn test_insert_statement() {
123+
use diesel::query_builder::InsertStatement;
124+
125+
let mut con = connection().await;
126+
127+
let inserted_names: InsertStatement<_, _, _, _> =
128+
diesel::insert_into(users::table).values(users::name.eq("Timmy"));
129+
130+
let result = inserted_names.execute(&mut con).await;
131+
132+
assert_eq!(Ok(1), result);
133+
}
134+
135+
#[tokio::test]
136+
async fn test_update_statement() {
137+
use diesel::query_builder::UpdateStatement;
138+
139+
let mut con = connection().await;
140+
141+
let update: UpdateStatement<_, _, _, _> = diesel::update(users::table)
142+
.set(users::name.eq("Jim"))
143+
.filter(users::name.eq("Sean"));
144+
145+
let result = update.execute(&mut con).await;
146+
147+
assert_eq!(Ok(0), result);
148+
}

0 commit comments

Comments
 (0)