1use crate::backend::sql_dialect;
2use crate::expression::SqlLiteral;
3use crate::query_builder::*;
4use crate::query_source::Column;
5
6mod sealed {
7 pub trait Sealed {}
8}
9
10impl sealed::Sealed for NoConflictTarget {}
11impl<T> sealed::Sealed for ConflictTarget<T> {}
12
13pub trait OnConflictTarget<Table>: sealed::Sealed {}
18
19#[doc(hidden)]
20#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NoConflictTarget {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "NoConflictTarget")
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NoConflictTarget {
#[inline]
fn clone(&self) -> NoConflictTarget { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for NoConflictTarget { }Copy, const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl diesel::query_builder::QueryId for NoConflictTarget {
type QueryId = NoConflictTarget<>;
const HAS_STATIC_QUERY_ID: bool = true;
const IS_WINDOW_FUNCTION: bool = false;
}
};QueryId)]
21pub struct NoConflictTarget;
22
23impl<DB> QueryFragment<DB> for NoConflictTarget
24where
25 DB: Backend,
26 DB::OnConflictClause: sql_dialect::on_conflict_clause::SupportsOnConflictClause,
27{
28 fn walk_ast<'b>(&'b self, _: AstPass<'_, 'b, DB>) -> QueryResult<()> {
29 Ok(())
30 }
31}
32
33impl<Table> OnConflictTarget<Table> for NoConflictTarget {}
34
35#[doc(hidden)]
36#[derive(#[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for ConflictTarget<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "ConflictTarget",
&&self.0)
}
}Debug, #[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for ConflictTarget<T> {
#[inline]
fn clone(&self) -> ConflictTarget<T> {
ConflictTarget(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl<T: ::core::marker::Copy> ::core::marker::Copy for ConflictTarget<T> { }Copy, const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl<T: diesel::query_builder::QueryId> diesel::query_builder::QueryId
for ConflictTarget<T> {
type QueryId =
ConflictTarget<<T as
diesel::query_builder::QueryId>::QueryId>;
const HAS_STATIC_QUERY_ID: bool =
<T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
true;
const IS_WINDOW_FUNCTION: bool =
<T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
false;
}
};QueryId)]
37pub struct ConflictTarget<T>(T);
38
39impl<T> ConflictTarget<T> {
40 #[diesel_derives::__diesel_public_if(
41 feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes"
42 )]
43 pub(crate) fn new(target: T) -> Self {
49 ConflictTarget(target)
50 }
51 #[allow(dead_code)]
53 pub(crate) fn target(&self) -> &T {
54 &self.0
55 }
56}
57
58impl<DB, T> QueryFragment<DB> for ConflictTarget<T>
59where
60 DB: Backend,
61 Self: QueryFragment<DB, DB::OnConflictClause>,
62{
63 fn walk_ast<'b>(&'b self, pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
64 <Self as QueryFragment<DB, DB::OnConflictClause>>::walk_ast(self, pass)
65 }
66}
67
68impl<DB, T, SP> QueryFragment<DB, SP> for ConflictTarget<T>
69where
70 DB: Backend<OnConflictClause = SP>,
71 SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
72 T: Column,
73{
74 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
75 out.push_sql(" (");
76 out.push_identifier(T::NAME)?;
77 out.push_sql(")");
78 Ok(())
79 }
80}
81
82impl<T> OnConflictTarget<T::Table> for ConflictTarget<T> where T: Column {}
83
84impl<DB, ST, SP> QueryFragment<DB, SP> for ConflictTarget<SqlLiteral<ST>>
85where
86 DB: Backend<OnConflictClause = SP>,
87 SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
88 SqlLiteral<ST>: QueryFragment<DB>,
89{
90 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
91 out.push_sql(" ");
92 self.0.walk_ast(out.reborrow())?;
93 Ok(())
94 }
95}
96
97impl<Tab, ST> OnConflictTarget<Tab> for ConflictTarget<SqlLiteral<ST>> {}
98
99impl<DB, T, SP> QueryFragment<DB, SP> for ConflictTarget<(T,)>
100where
101 DB: Backend<OnConflictClause = SP>,
102 SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
103 T: Column,
104{
105 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
106 out.push_sql(" (");
107 out.push_identifier(T::NAME)?;
108 out.push_sql(")");
109 Ok(())
110 }
111}
112
113impl<T> OnConflictTarget<T::Table> for ConflictTarget<(T,)> where T: Column {}
114
115macro_rules! on_conflict_tuples {
116 ($(
117 $Tuple:tt {
118 $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)*
119 }
120 )+) => {
121 $(
122 impl<_DB, _T, _SP, $($T),*> QueryFragment<_DB, _SP> for ConflictTarget<(_T, $($T),*)> where
123 _DB: Backend<OnConflictClause = _SP>,
124 _SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
125 _T: Column,
126 $($T: Column<Table=_T::Table>,)*
127 {
128 fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, _DB>) -> QueryResult<()>
129 {
130 out.push_sql(" (");
131 out.push_identifier(_T::NAME)?;
132 $(
133 out.push_sql(", ");
134 out.push_identifier($T::NAME)?;
135 )*
136 out.push_sql(")");
137 Ok(())
138 }
139 }
140
141 impl<_T, $($T),*> OnConflictTarget<_T::Table> for ConflictTarget<(_T, $($T),*)> where
142 _T: Column,
143 $($T: Column<Table=_T::Table>,)*
144 {
145 }
146 )*
147 }
148}
149
150impl<_DB, _T, _SP, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
T29, T30, T31> QueryFragment<_DB, _SP> for
ConflictTarget<(_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
T28, T29, T30, T31)> where _DB: Backend<OnConflictClause = _SP>,
_SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause, _T: Column,
T: Column<Table = _T::Table>, T1: Column<Table = _T::Table>,
T2: Column<Table = _T::Table>, T3: Column<Table = _T::Table>,
T4: Column<Table = _T::Table>, T5: Column<Table = _T::Table>,
T6: Column<Table = _T::Table>, T7: Column<Table = _T::Table>,
T8: Column<Table = _T::Table>, T9: Column<Table = _T::Table>,
T10: Column<Table = _T::Table>, T11: Column<Table = _T::Table>,
T12: Column<Table = _T::Table>, T13: Column<Table = _T::Table>,
T14: Column<Table = _T::Table>, T15: Column<Table = _T::Table>,
T16: Column<Table = _T::Table>, T17: Column<Table = _T::Table>,
T18: Column<Table = _T::Table>, T19: Column<Table = _T::Table>,
T20: Column<Table = _T::Table>, T21: Column<Table = _T::Table>,
T22: Column<Table = _T::Table>, T23: Column<Table = _T::Table>,
T24: Column<Table = _T::Table>, T25: Column<Table = _T::Table>,
T26: Column<Table = _T::Table>, T27: Column<Table = _T::Table>,
T28: Column<Table = _T::Table>, T29: Column<Table = _T::Table>,
T30: Column<Table = _T::Table>, T31: Column<Table = _T::Table> {
fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, _DB>)
-> QueryResult<()> {
out.push_sql(" (");
out.push_identifier(_T::NAME)?;
out.push_sql(", ");
out.push_identifier(T::NAME)?;
out.push_sql(", ");
out.push_identifier(T1::NAME)?;
out.push_sql(", ");
out.push_identifier(T2::NAME)?;
out.push_sql(", ");
out.push_identifier(T3::NAME)?;
out.push_sql(", ");
out.push_identifier(T4::NAME)?;
out.push_sql(", ");
out.push_identifier(T5::NAME)?;
out.push_sql(", ");
out.push_identifier(T6::NAME)?;
out.push_sql(", ");
out.push_identifier(T7::NAME)?;
out.push_sql(", ");
out.push_identifier(T8::NAME)?;
out.push_sql(", ");
out.push_identifier(T9::NAME)?;
out.push_sql(", ");
out.push_identifier(T10::NAME)?;
out.push_sql(", ");
out.push_identifier(T11::NAME)?;
out.push_sql(", ");
out.push_identifier(T12::NAME)?;
out.push_sql(", ");
out.push_identifier(T13::NAME)?;
out.push_sql(", ");
out.push_identifier(T14::NAME)?;
out.push_sql(", ");
out.push_identifier(T15::NAME)?;
out.push_sql(", ");
out.push_identifier(T16::NAME)?;
out.push_sql(", ");
out.push_identifier(T17::NAME)?;
out.push_sql(", ");
out.push_identifier(T18::NAME)?;
out.push_sql(", ");
out.push_identifier(T19::NAME)?;
out.push_sql(", ");
out.push_identifier(T20::NAME)?;
out.push_sql(", ");
out.push_identifier(T21::NAME)?;
out.push_sql(", ");
out.push_identifier(T22::NAME)?;
out.push_sql(", ");
out.push_identifier(T23::NAME)?;
out.push_sql(", ");
out.push_identifier(T24::NAME)?;
out.push_sql(", ");
out.push_identifier(T25::NAME)?;
out.push_sql(", ");
out.push_identifier(T26::NAME)?;
out.push_sql(", ");
out.push_identifier(T27::NAME)?;
out.push_sql(", ");
out.push_identifier(T28::NAME)?;
out.push_sql(", ");
out.push_identifier(T29::NAME)?;
out.push_sql(", ");
out.push_identifier(T30::NAME)?;
out.push_sql(", ");
out.push_identifier(T31::NAME)?;
out.push_sql(")");
Ok(())
}
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
T31> OnConflictTarget<_T::Table> for
ConflictTarget<(_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
T28, T29, T30, T31)> where _T: Column, T: Column<Table = _T::Table>,
T1: Column<Table = _T::Table>, T2: Column<Table = _T::Table>,
T3: Column<Table = _T::Table>, T4: Column<Table = _T::Table>,
T5: Column<Table = _T::Table>, T6: Column<Table = _T::Table>,
T7: Column<Table = _T::Table>, T8: Column<Table = _T::Table>,
T9: Column<Table = _T::Table>, T10: Column<Table = _T::Table>,
T11: Column<Table = _T::Table>, T12: Column<Table = _T::Table>,
T13: Column<Table = _T::Table>, T14: Column<Table = _T::Table>,
T15: Column<Table = _T::Table>, T16: Column<Table = _T::Table>,
T17: Column<Table = _T::Table>, T18: Column<Table = _T::Table>,
T19: Column<Table = _T::Table>, T20: Column<Table = _T::Table>,
T21: Column<Table = _T::Table>, T22: Column<Table = _T::Table>,
T23: Column<Table = _T::Table>, T24: Column<Table = _T::Table>,
T25: Column<Table = _T::Table>, T26: Column<Table = _T::Table>,
T27: Column<Table = _T::Table>, T28: Column<Table = _T::Table>,
T29: Column<Table = _T::Table>, T30: Column<Table = _T::Table>,
T31: Column<Table = _T::Table> {}diesel_derives::__diesel_for_each_tuple!(on_conflict_tuples);