diesel/query_builder/update_statement/
changeset.rs1use crate::backend::DieselReserveSpecialization;
2use crate::expression::grouped::Grouped;
3use crate::expression::operators::Eq;
4use crate::expression::AppearsOnTable;
5use crate::query_builder::*;
6use crate::query_source::{Column, QuerySource};
7use crate::Table;
8
9pub trait AsChangeset {
14 type Target: QuerySource;
16
17 type Changeset;
19
20 #[allow(clippy::wrong_self_convention)]
24 fn as_changeset(self) -> Self::Changeset;
25}
26
27#[allow(unreachable_pub)]
29#[doc(inline)]
30pub use diesel_derives::AsChangeset;
31
32impl<T: AsChangeset> AsChangeset for Option<T> {
33 type Target = T::Target;
34 type Changeset = Option<T::Changeset>;
35
36 fn as_changeset(self) -> Self::Changeset {
37 self.map(AsChangeset::as_changeset)
38 }
39}
40
41impl<'update, T> AsChangeset for &'update Option<T>
42where
43 &'update T: AsChangeset,
44{
45 type Target = <&'update T as AsChangeset>::Target;
46 type Changeset = Option<<&'update T as AsChangeset>::Changeset>;
47
48 fn as_changeset(self) -> Self::Changeset {
49 self.as_ref().map(AsChangeset::as_changeset)
50 }
51}
52
53impl<Left, Right> AsChangeset for Eq<Left, Right>
54where
55 Left: AssignmentTarget,
56 Right: AppearsOnTable<Left::Table>,
57{
58 type Target = Left::Table;
59 type Changeset = Assign<<Left as AssignmentTarget>::QueryAstNode, Right>;
60
61 fn as_changeset(self) -> Self::Changeset {
62 Assign {
63 target: self.left.into_target(),
64 expr: self.right,
65 }
66 }
67}
68
69impl<Left, Right> AsChangeset for Grouped<Eq<Left, Right>>
70where
71 Eq<Left, Right>: AsChangeset,
72{
73 type Target = <Eq<Left, Right> as AsChangeset>::Target;
74
75 type Changeset = <Eq<Left, Right> as AsChangeset>::Changeset;
76
77 fn as_changeset(self) -> Self::Changeset {
78 self.0.as_changeset()
79 }
80}
81
82#[derive(#[automatically_derived]
impl<Target: ::core::fmt::Debug, Expr: ::core::fmt::Debug> ::core::fmt::Debug
for Assign<Target, Expr> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Assign",
"target", &self.target, "expr", &&self.expr)
}
}Debug, #[automatically_derived]
impl<Target: ::core::clone::Clone, Expr: ::core::clone::Clone>
::core::clone::Clone for Assign<Target, Expr> {
#[inline]
fn clone(&self) -> Assign<Target, Expr> {
Assign {
target: ::core::clone::Clone::clone(&self.target),
expr: ::core::clone::Clone::clone(&self.expr),
}
}
}Clone, #[automatically_derived]
impl<Target: ::core::marker::Copy, Expr: ::core::marker::Copy>
::core::marker::Copy for Assign<Target, Expr> {
}Copy, const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl<Target: diesel::query_builder::QueryId,
Expr: diesel::query_builder::QueryId>
diesel::query_builder::QueryId for Assign<Target, Expr> {
type QueryId =
Assign<<Target as diesel::query_builder::QueryId>::QueryId,
<Expr as diesel::query_builder::QueryId>::QueryId>;
const HAS_STATIC_QUERY_ID: bool =
<Target as
diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
<Expr as
diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
true;
const IS_WINDOW_FUNCTION: bool =
<Target as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
||
<Expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
|| false;
}
};QueryId)]
83pub struct Assign<Target, Expr> {
84 target: Target,
85 expr: Expr,
86}
87
88impl<T, U, DB> QueryFragment<DB> for Assign<T, U>
89where
90 DB: Backend,
91 T: QueryFragment<DB>,
92 U: QueryFragment<DB>,
93{
94 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
95 QueryFragment::walk_ast(&self.target, out.reborrow())?;
96 out.push_sql(" = ");
97 QueryFragment::walk_ast(&self.expr, out.reborrow())
98 }
99}
100
101pub trait AssignmentTarget {
107 type Table: Table;
109 type QueryAstNode;
112
113 fn into_target(self) -> Self::QueryAstNode;
115}
116
117#[derive(#[automatically_derived]
impl<C: ::core::fmt::Debug> ::core::fmt::Debug for ColumnWrapperForUpdate<C> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ColumnWrapperForUpdate", &&self.0)
}
}Debug, #[automatically_derived]
impl<C: ::core::clone::Clone> ::core::clone::Clone for
ColumnWrapperForUpdate<C> {
#[inline]
fn clone(&self) -> ColumnWrapperForUpdate<C> {
ColumnWrapperForUpdate(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl<C: ::core::marker::Copy> ::core::marker::Copy for
ColumnWrapperForUpdate<C> {
}Copy)]
120pub struct ColumnWrapperForUpdate<C>(pub C);
121
122impl<DB, C> QueryFragment<DB> for ColumnWrapperForUpdate<C>
123where
124 DB: Backend + DieselReserveSpecialization,
125 C: Column,
126{
127 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
128 out.push_identifier(C::NAME)
129 }
130}
131
132impl<C> AssignmentTarget for C
133where
134 C: Column,
135{
136 type Table = C::Table;
137 type QueryAstNode = ColumnWrapperForUpdate<C>;
138
139 fn into_target(self) -> Self::QueryAstNode {
140 ColumnWrapperForUpdate(self)
141 }
142}