1use std::marker::PhantomData;
2
3use crate::expression::*;
4use crate::query_builder::*;
5use crate::query_dsl::RunQueryDsl;
6use crate::result::QueryResult;
7use crate::sql_types::DieselNumericOps;
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", &self.sql, "inner", &self.inner, "_marker", &&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) -> SqlLiteral<ST, T> {
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> ::std::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> ::std::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> ::std::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> ::std::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>
103 where
104 BindST: SqlType + TypedExpressionType,
105 U: AsExpression<BindST>,
106 {
107 UncheckedBind::new(self, bind_value.as_expression())
108 }
109
110 pub fn sql(self, sql: &str) -> SqlLiteral<ST, Self> {
150 SqlLiteral::new(sql.into(), self)
151 }
152}
153
154impl<ST, T> Expression for SqlLiteral<ST, T>
155where
156 ST: TypedExpressionType,
157{
158 type SqlType = ST;
159}
160
161impl<ST, T, DB> QueryFragment<DB> for SqlLiteral<ST, T>
162where
163 DB: Backend,
164 T: QueryFragment<DB>,
165{
166 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
167 out.unsafe_to_cache_prepared();
168 self.inner.walk_ast(out.reborrow())?;
169 out.push_sql(&self.sql);
170 Ok(())
171 }
172}
173
174impl<ST, T> QueryId for SqlLiteral<ST, T> {
175 type QueryId = ();
176
177 const HAS_STATIC_QUERY_ID: bool = false;
178}
179
180impl<ST, T> Query for SqlLiteral<ST, T>
181where
182 Self: Expression,
183{
184 type SqlType = ST;
185}
186
187impl<ST, T, Conn> RunQueryDsl<Conn> for SqlLiteral<ST, T> {}
188
189impl<QS, ST, T> SelectableExpression<QS> for SqlLiteral<ST, T> where Self: Expression {}
190
191impl<QS, ST, T> AppearsOnTable<QS> for SqlLiteral<ST, T> where Self: Expression {}
192
193impl<ST, T, GB> ValidGrouping<GB> for SqlLiteral<ST, T> {
194 type IsAggregate = is_aggregate::Never;
195}
196
197pub fn sql<ST>(sql: &str) -> SqlLiteral<ST>
261where
262 ST: TypedExpressionType,
263{
264 SqlLiteral::new(sql.into(), self::private::Empty)
265}
266
267#[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", &self.query, "value", &&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) -> UncheckedBind<Query, Value> {
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)]
268#[must_use = "Queries are only executed when calling `load`, `get_result`, or similar."]
269pub struct UncheckedBind<Query, Value> {
271 query: Query,
272 value: Value,
273}
274
275impl<Query, Value> UncheckedBind<Query, Value>
276where
277 Query: Expression,
278{
279 pub(crate) fn new(query: Query, value: Value) -> Self {
280 UncheckedBind { query, value }
281 }
282
283 pub fn sql(self, sql: &str) -> SqlLiteral<Query::SqlType, Self> {
327 SqlLiteral::new(sql.into(), self)
328 }
329}
330
331impl<Query, Value> Expression for UncheckedBind<Query, Value>
332where
333 Query: Expression,
334{
335 type SqlType = Query::SqlType;
336}
337
338impl<Query, Value, DB> QueryFragment<DB> for UncheckedBind<Query, Value>
339where
340 DB: Backend,
341 Query: QueryFragment<DB>,
342 Value: QueryFragment<DB>,
343{
344 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
345 self.query.walk_ast(out.reborrow())?;
346 self.value.walk_ast(out.reborrow())?;
347 Ok(())
348 }
349}
350
351impl<Q, Value> Query for UncheckedBind<Q, Value>
352where
353 Q: Query,
354{
355 type SqlType = Q::SqlType;
356}
357
358impl<Query, Value, GB> ValidGrouping<GB> for UncheckedBind<Query, Value> {
359 type IsAggregate = is_aggregate::Never;
360}
361
362impl<QS, Query, Value> SelectableExpression<QS> for UncheckedBind<Query, Value> where
363 Self: AppearsOnTable<QS>
364{
365}
366
367impl<QS, Query, Value> AppearsOnTable<QS> for UncheckedBind<Query, Value> where Self: Expression {}
368
369impl<Query, Value, Conn> RunQueryDsl<Conn> for UncheckedBind<Query, Value> {}
370
371mod private {
372 use crate::backend::{Backend, DieselReserveSpecialization};
373 use crate::query_builder::{QueryFragment, QueryId};
374
375 #[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]
impl ::core::clone::Clone for Empty {
#[inline]
fn clone(&self) -> Empty { *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)]
376 pub struct Empty;
377
378 impl<DB> QueryFragment<DB> for Empty
379 where
380 DB: Backend + DieselReserveSpecialization,
381 {
382 fn walk_ast<'b>(
383 &'b self,
384 _pass: crate::query_builder::AstPass<'_, 'b, DB>,
385 ) -> crate::QueryResult<()> {
386 Ok(())
387 }
388 }
389}