Skip to main content

diesel/query_builder/upsert/
on_conflict_target.rs

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
13/// Represents the target of an `ON CONFLICT` clause.
14///
15/// This trait is sealed and cannot be implemented for types outside of Diesel,
16/// and may be used to constrain generic parameters.
17pub 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    /// Creates a new `ConflictTarget` wrapping the given target.
44    ///
45    /// # Arguments
46    ///
47    /// * `target` - The target of the `ON CONFLICT` clause.
48    pub(crate) fn new(target: T) -> Self {
49        ConflictTarget(target)
50    }
51    /// Returns a reference to the inner target.
52    #[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);