1use crate::expression::*;
2use crate::query_builder::*;
3use crate::query_dsl::RunQueryDslSupport;
4use crate::result::QueryResult;
5use crate::sql_types::DieselNumericOps;
6use alloc::string::String;
7use core::marker::PhantomData;
8
9#[derive(#[automatically_derived]impl<ST: ::core::fmt::Debug, T: ::core::fmt::Debug>
::core::fmt::Debug for SqlLiteral<ST, T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"SqlLiteral sql inner _marker", &self.sql, &self.inner,
&&self._marker)
}
}Debug, #[automatically_derived]impl<ST: ::core::clone::Clone,
T: ::core::clone::Clone> ::core::clone::Clone for SqlLiteral<ST, T> {
#[inline]
fn clone(&self) -> Self {
SqlLiteral {
sql: ::core::clone::Clone::clone(&self.sql),
inner: ::core::clone::Clone::clone(&self.inner),
_marker: ::core::clone::Clone::clone(&self._marker),
}
}
}Clone, const _: () =
{
use diesel;
use diesel::internal::derives::numeric_ops as ops;
use diesel::expression::{Expression, AsExpression};
use diesel::sql_types::ops::{Add, Sub, Mul, Div};
use diesel::sql_types::{SqlType, SingleValue};
impl<ST, T, __Rhs> ::core::ops::Add<__Rhs> for SqlLiteral<ST, T> where
Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Add,
<<Self as Expression>::SqlType as Add>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
type Output = ops::Add<Self, __Rhs::Expression>;
fn add(self, rhs: __Rhs) -> Self::Output {
ops::Add::new(self, rhs.as_expression())
}
}
impl<ST, T, __Rhs> ::core::ops::Sub<__Rhs> for SqlLiteral<ST, T> where
Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Sub,
<<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
type Output = ops::Sub<Self, __Rhs::Expression>;
fn sub(self, rhs: __Rhs) -> Self::Output {
ops::Sub::new(self, rhs.as_expression())
}
}
impl<ST, T, __Rhs> ::core::ops::Mul<__Rhs> for SqlLiteral<ST, T> where
Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Mul,
<<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
type Output = ops::Mul<Self, __Rhs::Expression>;
fn mul(self, rhs: __Rhs) -> Self::Output {
ops::Mul::new(self, rhs.as_expression())
}
}
impl<ST, T, __Rhs> ::core::ops::Div<__Rhs> for SqlLiteral<ST, T> where
Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Div,
<<Self as Expression>::SqlType as Div>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
type Output = ops::Div<Self, __Rhs::Expression>;
fn div(self, rhs: __Rhs) -> Self::Output {
ops::Div::new(self, rhs.as_expression())
}
}
};DieselNumericOps)]
10#[must_use = "Queries are only executed when calling `load`, `get_result`, or similar."]
11pub struct SqlLiteral<ST, T = self::private::Empty> {
15 sql: String,
16 inner: T,
17 _marker: PhantomData<ST>,
18}
19
20impl<ST, T> SqlLiteral<ST, T>
21where
22 ST: TypedExpressionType,
23{
24 pub(crate) fn new(sql: String, inner: T) -> Self {
25 SqlLiteral {
26 sql,
27 inner,
28 _marker: PhantomData,
29 }
30 }
31
32 pub fn bind<BindST, U>(self, bind_value: U) -> UncheckedBind<Self, U::Expression>
108 where
109 BindST: SqlType + TypedExpressionType,
110 U: AsExpression<BindST>,
111 {
112 UncheckedBind::new(self, bind_value.as_expression())
113 }
114
115 pub fn sql(self, sql: &str) -> SqlLiteral<ST, Self> {
163 SqlLiteral::new(sql.into(), self)
164 }
165}
166
167impl<ST, T> Expression for SqlLiteral<ST, T>
168where
169 ST: TypedExpressionType,
170{
171 type SqlType = ST;
172}
173
174impl<ST, T, DB> QueryFragment<DB> for SqlLiteral<ST, T>
175where
176 DB: Backend,
177 T: QueryFragment<DB>,
178{
179 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
180 out.unsafe_to_cache_prepared();
181 self.inner.walk_ast(out.reborrow())?;
182 out.push_sql(&self.sql);
183 Ok(())
184 }
185}
186
187impl<ST, T> QueryId for SqlLiteral<ST, T> {
188 type QueryId = ();
189
190 const HAS_STATIC_QUERY_ID: bool = false;
191}
192
193impl<ST, T> Query for SqlLiteral<ST, T>
194where
195 Self: Expression,
196{
197 type SqlType = ST;
198}
199
200impl<ST, T> RunQueryDslSupport for SqlLiteral<ST, T> {}
201
202impl<QS, ST, T> SelectableExpression<QS> for SqlLiteral<ST, T> where Self: Expression {}
203
204impl<QS, ST, T> AppearsOnTable<QS> for SqlLiteral<ST, T> where Self: Expression {}
205
206impl<ST, T, GB> ValidGrouping<GB> for SqlLiteral<ST, T> {
207 type IsAggregate = is_aggregate::Never;
208}
209
210pub fn sql<ST>(sql: &str) -> SqlLiteral<ST>
284where
285 ST: TypedExpressionType,
286{
287 SqlLiteral::new(sql.into(), self::private::Empty)
288}
289
290#[derive(const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl<Query: diesel::query_builder::QueryId,
Value: diesel::query_builder::QueryId>
diesel::query_builder::QueryId for UncheckedBind<Query, Value> {
type QueryId =
UncheckedBind<<Query as
diesel::query_builder::QueryId>::QueryId,
<Value as diesel::query_builder::QueryId>::QueryId>;
const HAS_STATIC_QUERY_ID: bool =
<Query as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
&&
<Value as
diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
true;
const IS_WINDOW_FUNCTION: bool =
<Query as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
||
<Value as
diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
false;
}
};QueryId, #[automatically_derived]impl<Query: ::core::fmt::Debug,
Value: ::core::fmt::Debug> ::core::fmt::Debug for
UncheckedBind<Query, Value> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UncheckedBind query value", &self.query, &&self.value)
}
}Debug, #[automatically_derived]impl<Query: ::core::clone::Clone,
Value: ::core::clone::Clone> ::core::clone::Clone for
UncheckedBind<Query, Value> {
#[inline]
fn clone(&self) -> Self {
UncheckedBind {
query: ::core::clone::Clone::clone(&self.query),
value: ::core::clone::Clone::clone(&self.value),
}
}
}Clone, #[automatically_derived]impl<Query: ::core::marker::Copy,
Value: ::core::marker::Copy> ::core::marker::Copy for
UncheckedBind<Query, Value> {
}Copy)]
291#[must_use = "Queries are only executed when calling `load`, `get_result`, or similar."]
292pub struct UncheckedBind<Query, Value> {
294 query: Query,
295 value: Value,
296}
297
298impl<Query, Value> UncheckedBind<Query, Value>
299where
300 Query: Expression,
301{
302 pub(crate) fn new(query: Query, value: Value) -> Self {
303 UncheckedBind { query, value }
304 }
305
306 pub fn sql(self, sql: &str) -> SqlLiteral<Query::SqlType, Self> {
357 SqlLiteral::new(sql.into(), self)
358 }
359}
360
361impl<Query, Value> Expression for UncheckedBind<Query, Value>
362where
363 Query: Expression,
364{
365 type SqlType = Query::SqlType;
366}
367
368impl<Query, Value, DB> QueryFragment<DB> for UncheckedBind<Query, Value>
369where
370 DB: Backend,
371 Query: QueryFragment<DB>,
372 Value: QueryFragment<DB>,
373{
374 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
375 self.query.walk_ast(out.reborrow())?;
376 self.value.walk_ast(out.reborrow())?;
377 Ok(())
378 }
379}
380
381impl<Q, Value> Query for UncheckedBind<Q, Value>
382where
383 Q: Query,
384{
385 type SqlType = Q::SqlType;
386}
387
388impl<Query, Value, GB> ValidGrouping<GB> for UncheckedBind<Query, Value> {
389 type IsAggregate = is_aggregate::Never;
390}
391
392impl<QS, Query, Value> SelectableExpression<QS> for UncheckedBind<Query, Value> where
393 Self: AppearsOnTable<QS>
394{
395}
396
397impl<QS, Query, Value> AppearsOnTable<QS> for UncheckedBind<Query, Value> where Self: Expression {}
398
399impl<Query, Value> RunQueryDslSupport for UncheckedBind<Query, Value> {}
400
401mod private {
402 use crate::backend::{Backend, DieselReserveSpecialization};
403 use crate::query_builder::{QueryFragment, QueryId};
404
405 #[derive(#[automatically_derived]impl ::core::fmt::Debug for Empty {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "Empty")
}
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Empty {
}
#[automatically_derived]impl ::core::clone::Clone for Empty {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::Copy for Empty { }Copy, const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl diesel::query_builder::QueryId for Empty {
type QueryId = Empty<>;
const HAS_STATIC_QUERY_ID: bool = true;
const IS_WINDOW_FUNCTION: bool = false;
}
};QueryId)]
406 pub struct Empty;
407
408 impl<DB> QueryFragment<DB> for Empty
409 where
410 DB: Backend + DieselReserveSpecialization,
411 {
412 fn walk_ast<'b>(
413 &'b self,
414 _pass: crate::query_builder::AstPass<'_, 'b, DB>,
415 ) -> crate::QueryResult<()> {
416 Ok(())
417 }
418 }
419}