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
6#[doc(hidden)]
7pub trait OnConflictTarget<Table> {}
8
9#[doc(hidden)]
10#[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)]
11pub struct NoConflictTarget;
12
13impl<DB> QueryFragment<DB> for NoConflictTarget
14where
15    DB: Backend,
16    DB::OnConflictClause: sql_dialect::on_conflict_clause::SupportsOnConflictClause,
17{
18    fn walk_ast<'b>(&'b self, _: AstPass<'_, 'b, DB>) -> QueryResult<()> {
19        Ok(())
20    }
21}
22
23impl<Table> OnConflictTarget<Table> for NoConflictTarget {}
24
25#[doc(hidden)]
26#[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)]
27pub struct ConflictTarget<T>(pub T);
28
29impl<DB, T> QueryFragment<DB> for ConflictTarget<T>
30where
31    DB: Backend,
32    Self: QueryFragment<DB, DB::OnConflictClause>,
33{
34    fn walk_ast<'b>(&'b self, pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
35        <Self as QueryFragment<DB, DB::OnConflictClause>>::walk_ast(self, pass)
36    }
37}
38
39impl<DB, T, SP> QueryFragment<DB, SP> for ConflictTarget<T>
40where
41    DB: Backend<OnConflictClause = SP>,
42    SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
43    T: Column,
44{
45    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
46        out.push_sql(" (");
47        out.push_identifier(T::NAME)?;
48        out.push_sql(")");
49        Ok(())
50    }
51}
52
53impl<T> OnConflictTarget<T::Table> for ConflictTarget<T> where T: Column {}
54
55impl<DB, ST, SP> QueryFragment<DB, SP> for ConflictTarget<SqlLiteral<ST>>
56where
57    DB: Backend<OnConflictClause = SP>,
58    SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
59    SqlLiteral<ST>: QueryFragment<DB>,
60{
61    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
62        out.push_sql(" ");
63        self.0.walk_ast(out.reborrow())?;
64        Ok(())
65    }
66}
67
68impl<Tab, ST> OnConflictTarget<Tab> for ConflictTarget<SqlLiteral<ST>> {}
69
70impl<DB, T, SP> QueryFragment<DB, SP> for ConflictTarget<(T,)>
71where
72    DB: Backend<OnConflictClause = SP>,
73    SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
74    T: Column,
75{
76    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
77        out.push_sql(" (");
78        out.push_identifier(T::NAME)?;
79        out.push_sql(")");
80        Ok(())
81    }
82}
83
84impl<T> OnConflictTarget<T::Table> for ConflictTarget<(T,)> where T: Column {}
85
86macro_rules! on_conflict_tuples {
87    ($(
88        $Tuple:tt {
89            $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)*
90        }
91    )+) => {
92        $(
93            impl<_DB, _T, _SP, $($T),*> QueryFragment<_DB, _SP> for ConflictTarget<(_T, $($T),*)> where
94                _DB: Backend<OnConflictClause = _SP>,
95                _SP: sql_dialect::on_conflict_clause::PgLikeOnConflictClause,
96                _T: Column,
97                $($T: Column<Table=_T::Table>,)*
98            {
99                fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, _DB>) -> QueryResult<()>
100                {
101                    out.push_sql(" (");
102                    out.push_identifier(_T::NAME)?;
103                    $(
104                        out.push_sql(", ");
105                        out.push_identifier($T::NAME)?;
106                    )*
107                    out.push_sql(")");
108                    Ok(())
109                }
110            }
111
112            impl<_T, $($T),*> OnConflictTarget<_T::Table> for ConflictTarget<(_T, $($T),*)> where
113                _T: Column,
114                $($T: Column<Table=_T::Table>,)*
115            {
116            }
117        )*
118    }
119}
120
121impl<_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);