Skip to main content

diesel/query_builder/insert_statement/
insert_with_default_for_sqlite.rs

1use super::{BatchInsert, InsertStatement};
2use crate::insertable::InsertValues;
3use crate::insertable::{CanInsertInSingleQuery, ColumnInsertValue, DefaultableColumnInsertValue};
4use crate::prelude::*;
5use crate::query_builder::upsert::on_conflict_clause::OnConflictValues;
6use crate::query_builder::{AstPass, QueryId, ValuesClause};
7use crate::query_builder::{DebugQuery, QueryFragment};
8use crate::query_dsl::{LoadQuery, methods::ExecuteDsl};
9use crate::sqlite::Sqlite;
10use alloc::string::String;
11use alloc::string::ToString;
12use alloc::vec::Vec;
13use core::fmt::{self, Debug, Display};
14
15pub trait DebugQueryHelper<ContainsDefaultableValue> {
16    fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
17    fn fmt_display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
18}
19
20impl<T, V, QId, Op, Ret, const STATIC_QUERY_ID: bool> DebugQueryHelper<Yes>
21    for DebugQuery<
22        '_,
23        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op, Ret>,
24        Sqlite,
25    >
26where
27    V: QueryFragment<Sqlite>,
28    T: Copy + QuerySource,
29    Op: Copy,
30    Ret: Copy,
31    for<'b> InsertStatement<T, &'b ValuesClause<V, T>, Op, Ret>: QueryFragment<Sqlite>,
32{
33    fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        let mut statements = <[_]>::into_vec(::alloc::boxed::box_new([String::from("BEGIN")]))alloc::vec![String::from("BEGIN")];
35        for record in self.query.records.values.iter() {
36            let stmt = InsertStatement::new(
37                self.query.target,
38                record,
39                self.query.operator,
40                self.query.returning,
41            );
42            statements.push(crate::debug_query(&stmt).to_string());
43        }
44        statements.push("COMMIT".into());
45
46        f.debug_struct("Query")
47            .field("sql", &statements)
48            .field("binds", &[] as &[i32; 0])
49            .finish()
50    }
51
52    fn fmt_display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53        f.write_fmt(format_args!("BEGIN;\n"))writeln!(f, "BEGIN;")?;
54        for record in self.query.records.values.iter() {
55            let stmt = InsertStatement::new(
56                self.query.target,
57                record,
58                self.query.operator,
59                self.query.returning,
60            );
61            f.write_fmt(format_args!("{0}\n", crate::debug_query(&stmt)))writeln!(f, "{}", crate::debug_query(&stmt))?;
62        }
63        f.write_fmt(format_args!("COMMIT;\n"))writeln!(f, "COMMIT;")?;
64        Ok(())
65    }
66}
67
68#[allow(unsafe_code)] // cast to transparent wrapper type
69impl<'a, T, V, QId, Op, const STATIC_QUERY_ID: bool> DebugQueryHelper<No>
70    for DebugQuery<'a, InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>, Sqlite>
71where
72    T: Copy + QuerySource,
73    Op: Copy,
74    DebugQuery<
75        'a,
76        InsertStatement<T, SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Op>,
77        Sqlite,
78    >: Debug + Display,
79{
80    fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
81        let value = unsafe {
82            // This cast is safe as `SqliteBatchInsertWrapper` is #[repr(transparent)]
83            &*(self as *const DebugQuery<
84                'a,
85                InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>,
86                Sqlite,
87            >
88                as *const DebugQuery<
89                    'a,
90                    InsertStatement<T, SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Op>,
91                    Sqlite,
92                >)
93        };
94        <_ as Debug>::fmt(value, f)
95    }
96
97    fn fmt_display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98        let value = unsafe {
99            // This cast is safe as `SqliteBatchInsertWrapper` is #[repr(transparent)]
100            &*(self as *const DebugQuery<
101                'a,
102                InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>,
103                Sqlite,
104            >
105                as *const DebugQuery<
106                    'a,
107                    InsertStatement<T, SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Op>,
108                    Sqlite,
109                >)
110        };
111        <_ as Display>::fmt(value, f)
112    }
113}
114
115impl<T, V, QId, Op, O, const STATIC_QUERY_ID: bool> Display
116    for DebugQuery<
117        '_,
118        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
119        Sqlite,
120    >
121where
122    T: QuerySource,
123    V: ContainsDefaultableValue<Out = O>,
124    Self: DebugQueryHelper<O>,
125{
126    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
127        self.fmt_display(f)
128    }
129}
130
131impl<T, V, QId, Op, O, const STATIC_QUERY_ID: bool> Debug
132    for DebugQuery<
133        '_,
134        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
135        Sqlite,
136    >
137where
138    T: QuerySource,
139    V: ContainsDefaultableValue<Out = O>,
140    Self: DebugQueryHelper<O>,
141{
142    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
143        self.fmt_debug(f)
144    }
145}
146
147#[allow(missing_debug_implementations, missing_copy_implementations)]
148pub struct Yes;
149
150impl Default for Yes {
151    fn default() -> Self {
152        Yes
153    }
154}
155
156#[allow(missing_debug_implementations, missing_copy_implementations)]
157pub struct No;
158
159impl Default for No {
160    fn default() -> Self {
161        No
162    }
163}
164
165pub trait Any<Rhs> {
166    type Out: Any<Yes> + Any<No>;
167}
168
169impl Any<No> for No {
170    type Out = No;
171}
172
173impl Any<Yes> for No {
174    type Out = Yes;
175}
176
177impl Any<No> for Yes {
178    type Out = Yes;
179}
180
181impl Any<Yes> for Yes {
182    type Out = Yes;
183}
184
185pub trait ContainsDefaultableValue {
186    type Out: Any<Yes> + Any<No>;
187}
188
189impl<C, B> ContainsDefaultableValue for ColumnInsertValue<C, B> {
190    type Out = No;
191}
192
193impl<I> ContainsDefaultableValue for DefaultableColumnInsertValue<I> {
194    type Out = Yes;
195}
196
197impl<I, const SIZE: usize> ContainsDefaultableValue for [I; SIZE]
198where
199    I: ContainsDefaultableValue,
200{
201    type Out = I::Out;
202}
203
204impl<I, T> ContainsDefaultableValue for ValuesClause<I, T>
205where
206    I: ContainsDefaultableValue,
207{
208    type Out = I::Out;
209}
210
211impl<T> ContainsDefaultableValue for &T
212where
213    T: ContainsDefaultableValue,
214{
215    type Out = T::Out;
216}
217
218impl<V, T, QId, C, Op, O, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
219    for InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>
220where
221    T: QuerySource,
222    C: Connection<Backend = Sqlite>,
223    V: ContainsDefaultableValue<Out = O>,
224    O: Default,
225    (O, Self): ExecuteDsl<C, Sqlite>,
226{
227    fn execute(query: Self, conn: &mut C) -> QueryResult<usize> {
228        <(O, Self) as ExecuteDsl<C, Sqlite>>::execute((O::default(), query), conn)
229    }
230}
231
232impl<V, T, QId, C, Op, O, Target, ConflictOpt, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
233    for InsertStatement<
234        T,
235        OnConflictValues<
236            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
237            Target,
238            ConflictOpt,
239        >,
240        Op,
241    >
242where
243    T: QuerySource,
244    C: Connection<Backend = Sqlite>,
245    V: ContainsDefaultableValue<Out = O>,
246    O: Default,
247    (O, Self): ExecuteDsl<C, Sqlite>,
248{
249    fn execute(query: Self, conn: &mut C) -> QueryResult<usize> {
250        <(O, Self) as ExecuteDsl<C, Sqlite>>::execute((O::default(), query), conn)
251    }
252}
253
254impl<V, T, QId, C, Op, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
255    for (
256        Yes,
257        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
258    )
259where
260    C: Connection<Backend = Sqlite>,
261    T: Table + Copy + QueryId + 'static,
262    T::FromClause: QueryFragment<Sqlite>,
263    Op: Copy + QueryId + QueryFragment<Sqlite>,
264    V: InsertValues<Sqlite, T> + CanInsertInSingleQuery<Sqlite> + QueryId,
265{
266    fn execute((Yes, query): Self, conn: &mut C) -> QueryResult<usize> {
267        conn.transaction(|conn| {
268            let mut result = 0;
269            for record in &query.records.values {
270                let stmt =
271                    InsertStatement::new(query.target, record, query.operator, query.returning);
272                result += stmt.execute(conn)?;
273            }
274            Ok(result)
275        })
276    }
277}
278
279impl<'query, V, T, QId, Op, O, U, B, const STATIC_QUERY_ID: bool>
280    LoadQuery<'query, SqliteConnection, U, B>
281    for InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>
282where
283    T: QuerySource,
284    V: ContainsDefaultableValue<Out = O>,
285    O: Default,
286    (O, Self): LoadQuery<'query, SqliteConnection, U, B>,
287{
288    type RowIter<'conn> = <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
289
290    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
291        <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::internal_load(
292            (O::default(), self),
293            conn,
294        )
295    }
296}
297
298impl<'query, V, T, QId, Op, O, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
299    LoadQuery<'query, SqliteConnection, U, B>
300    for InsertStatement<
301        T,
302        OnConflictValues<
303            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
304            Target,
305            ConflictOpt,
306        >,
307        Op,
308    >
309where
310    T: QuerySource,
311    V: ContainsDefaultableValue<Out = O>,
312    O: Default,
313    (O, Self): LoadQuery<'query, SqliteConnection, U, B>,
314{
315    type RowIter<'conn> = <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
316
317    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
318        <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::internal_load(
319            (O::default(), self),
320            conn,
321        )
322    }
323}
324
325impl<V, T, QId, Op, O, const STATIC_QUERY_ID: bool> RunQueryDsl<SqliteConnection>
326    for (
327        O,
328        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
329    )
330where
331    T: QuerySource,
332    V: ContainsDefaultableValue<Out = O>,
333    O: Default,
334    InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>:
335        RunQueryDsl<SqliteConnection>,
336{
337}
338
339impl<V, T, QId, Op, O, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
340    RunQueryDsl<SqliteConnection>
341    for (
342        O,
343        InsertStatement<
344            T,
345            OnConflictValues<
346                BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
347                Target,
348                ConflictOpt,
349            >,
350            Op,
351        >,
352    )
353where
354    T: QuerySource,
355    V: ContainsDefaultableValue<Out = O>,
356    O: Default,
357    InsertStatement<
358        T,
359        OnConflictValues<
360            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
361            Target,
362            ConflictOpt,
363        >,
364        Op,
365    >: RunQueryDsl<SqliteConnection>,
366{
367}
368
369#[diagnostic::do_not_recommend]
370impl<'query, V, T, QId, Op, U, B, const STATIC_QUERY_ID: bool>
371    LoadQuery<'query, SqliteConnection, U, B>
372    for (
373        Yes,
374        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
375    )
376where
377    T: Table + Copy + QueryId + 'static,
378    Op: Copy + QueryId + QueryFragment<Sqlite>,
379    InsertStatement<T, ValuesClause<V, T>, Op>: LoadQuery<'query, SqliteConnection, U, B>,
380    Self: RunQueryDsl<SqliteConnection>,
381{
382    type RowIter<'conn> = alloc::vec::IntoIter<QueryResult<U>>;
383
384    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
385        let (Yes, query) = self;
386
387        conn.transaction(|conn| {
388            let mut results = Vec::with_capacity(query.records.values.len());
389
390            for record in query.records.values {
391                let stmt =
392                    InsertStatement::new(query.target, record, query.operator, query.returning);
393
394                let result = stmt
395                    .internal_load(conn)?
396                    .next()
397                    .ok_or(crate::result::Error::NotFound)?;
398
399                match &result {
400                    Ok(_) | Err(crate::result::Error::DeserializationError(_)) => {
401                        results.push(result)
402                    }
403                    Err(_) => {
404                        result?;
405                    }
406                };
407            }
408
409            Ok(results.into_iter())
410        })
411    }
412}
413
414#[diagnostic::do_not_recommend]
415impl<'query, V, T, QId, Op, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
416    LoadQuery<'query, SqliteConnection, U, B>
417    for (
418        Yes,
419        InsertStatement<
420            T,
421            OnConflictValues<
422                BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
423                Target,
424                ConflictOpt,
425            >,
426            Op,
427        >,
428    )
429where
430    T: Table + Copy + QueryId + 'static,
431    T::FromClause: Copy,
432    Op: Copy,
433    Target: Copy,
434    ConflictOpt: Copy,
435    InsertStatement<T, OnConflictValues<ValuesClause<V, T>, Target, ConflictOpt>, Op>:
436        LoadQuery<'query, SqliteConnection, U, B>,
437    Self: RunQueryDsl<SqliteConnection>,
438{
439    type RowIter<'conn> = alloc::vec::IntoIter<QueryResult<U>>;
440
441    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
442        let (Yes, query) = self;
443
444        conn.transaction(|conn| {
445            let mut results = Vec::with_capacity(query.records.values.values.len());
446
447            for record in query.records.values.values {
448                let stmt = InsertStatement {
449                    operator: query.operator,
450                    target: query.target,
451                    records: OnConflictValues {
452                        values: record,
453                        target: query.records.target,
454                        action: query.records.action,
455                        where_clause: query.records.where_clause,
456                    },
457                    returning: query.returning,
458                    into_clause: query.into_clause,
459                };
460
461                let result = stmt
462                    .internal_load(conn)?
463                    .next()
464                    .ok_or(crate::result::Error::NotFound)?;
465
466                match &result {
467                    Ok(_) | Err(crate::result::Error::DeserializationError(_)) => {
468                        results.push(result)
469                    }
470                    Err(_) => {
471                        result?;
472                    }
473                };
474            }
475
476            Ok(results.into_iter())
477        })
478    }
479}
480
481#[allow(missing_debug_implementations, missing_copy_implementations)]
482#[repr(transparent)]
483pub struct SqliteBatchInsertWrapper<V, T, QId, const STATIC_QUERY_ID: bool>(
484    BatchInsert<V, T, QId, STATIC_QUERY_ID>,
485);
486
487impl<V, Tab, QId, const STATIC_QUERY_ID: bool> QueryFragment<Sqlite>
488    for SqliteBatchInsertWrapper<Vec<ValuesClause<V, Tab>>, Tab, QId, STATIC_QUERY_ID>
489where
490    ValuesClause<V, Tab>: QueryFragment<Sqlite>,
491    V: QueryFragment<Sqlite>,
492{
493    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, Sqlite>) -> QueryResult<()> {
494        if !STATIC_QUERY_ID {
495            out.unsafe_to_cache_prepared();
496        }
497
498        let mut values = self.0.values.iter();
499        if let Some(value) = values.next() {
500            value.walk_ast(out.reborrow())?;
501        }
502        for value in values {
503            out.push_sql(", (");
504            value.values.walk_ast(out.reborrow())?;
505            out.push_sql(")");
506        }
507        Ok(())
508    }
509}
510
511#[allow(missing_copy_implementations, missing_debug_implementations)]
512#[repr(transparent)]
513pub struct SqliteCanInsertInSingleQueryHelper<T: ?Sized>(T);
514
515impl<V, T, QId, const STATIC_QUERY_ID: bool> CanInsertInSingleQuery<Sqlite>
516    for SqliteBatchInsertWrapper<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>
517where
518    // We constrain that here on an internal helper type
519    // to make sure that this does not accidentally leak
520    // so that none does really implement normal batch
521    // insert for inserts with default values here
522    SqliteCanInsertInSingleQueryHelper<V>: CanInsertInSingleQuery<Sqlite>,
523{
524    fn rows_to_insert(&self) -> Option<usize> {
525        Some(self.0.values.len())
526    }
527}
528
529impl<T> CanInsertInSingleQuery<Sqlite> for SqliteCanInsertInSingleQueryHelper<T>
530where
531    T: CanInsertInSingleQuery<Sqlite>,
532{
533    fn rows_to_insert(&self) -> Option<usize> {
534        self.0.rows_to_insert()
535    }
536}
537
538impl<V, T, QId, const STATIC_QUERY_ID: bool> QueryId
539    for SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>
540where
541    BatchInsert<V, T, QId, STATIC_QUERY_ID>: QueryId,
542{
543    type QueryId = <BatchInsert<V, T, QId, STATIC_QUERY_ID> as QueryId>::QueryId;
544
545    const HAS_STATIC_QUERY_ID: bool =
546        <BatchInsert<V, T, QId, STATIC_QUERY_ID> as QueryId>::HAS_STATIC_QUERY_ID;
547}
548
549impl<V, T, QId, C, Op, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
550    for (
551        No,
552        InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>,
553    )
554where
555    C: Connection<Backend = Sqlite>,
556    T: Table + QueryId + 'static,
557    T::FromClause: QueryFragment<Sqlite>,
558    Op: QueryFragment<Sqlite> + QueryId,
559    SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>:
560        QueryFragment<Sqlite> + QueryId + CanInsertInSingleQuery<Sqlite>,
561{
562    fn execute((No, query): Self, conn: &mut C) -> QueryResult<usize> {
563        let query = InsertStatement {
564            records: SqliteBatchInsertWrapper(query.records),
565            operator: query.operator,
566            target: query.target,
567            returning: query.returning,
568            into_clause: query.into_clause,
569        };
570        query.execute(conn)
571    }
572}
573
574impl<V, T, QId, C, Op, Target, ConflictOpt, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
575    for (
576        No,
577        InsertStatement<
578            T,
579            OnConflictValues<BatchInsert<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
580            Op,
581        >,
582    )
583where
584    C: Connection<Backend = Sqlite>,
585    T: Table + QueryId + 'static,
586    T::FromClause: QueryFragment<Sqlite>,
587    Op: QueryFragment<Sqlite> + QueryId,
588    OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>:
589        QueryFragment<Sqlite> + CanInsertInSingleQuery<Sqlite> + QueryId,
590{
591    fn execute((No, query): Self, conn: &mut C) -> QueryResult<usize> {
592        let query = InsertStatement {
593            operator: query.operator,
594            target: query.target,
595            records: OnConflictValues {
596                values: SqliteBatchInsertWrapper(query.records.values),
597                target: query.records.target,
598                action: query.records.action,
599                where_clause: query.records.where_clause,
600            },
601            returning: query.returning,
602            into_clause: query.into_clause,
603        };
604        query.execute(conn)
605    }
606}
607
608#[diagnostic::do_not_recommend]
609impl<'query, V, T, QId, Op, U, B, const STATIC_QUERY_ID: bool>
610    LoadQuery<'query, SqliteConnection, U, B>
611    for (
612        No,
613        InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>,
614    )
615where
616    T: Table + QueryId + 'static,
617    InsertStatement<T, SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Op>:
618        LoadQuery<'query, SqliteConnection, U, B>,
619    Self: RunQueryDsl<SqliteConnection>,
620{
621    type RowIter<'conn> = <InsertStatement<
622        T,
623        SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>,
624        Op,
625    > as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
626
627    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
628        let (No, query) = self;
629
630        let query = InsertStatement {
631            records: SqliteBatchInsertWrapper(query.records),
632            operator: query.operator,
633            target: query.target,
634            returning: query.returning,
635            into_clause: query.into_clause,
636        };
637
638        query.internal_load(conn)
639    }
640}
641
642#[diagnostic::do_not_recommend]
643impl<'query, V, T, QId, Op, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
644    LoadQuery<'query, SqliteConnection, U, B>
645    for (
646        No,
647        InsertStatement<
648            T,
649            OnConflictValues<BatchInsert<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
650            Op,
651        >,
652    )
653where
654    T: Table + QueryId + 'static,
655    InsertStatement<
656        T,
657        OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
658        Op,
659    >: LoadQuery<'query, SqliteConnection, U, B>,
660    Self: RunQueryDsl<SqliteConnection>,
661{
662    type RowIter<'conn> = <InsertStatement<
663        T,
664        OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
665        Op,
666    > as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
667
668    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
669        let (No, query) = self;
670
671        let query = InsertStatement {
672            operator: query.operator,
673            target: query.target,
674            records: OnConflictValues {
675                values: SqliteBatchInsertWrapper(query.records.values),
676                target: query.records.target,
677                action: query.records.action,
678                where_clause: query.records.where_clause,
679            },
680            returning: query.returning,
681            into_clause: query.into_clause,
682        };
683
684        query.internal_load(conn)
685    }
686}
687
688macro_rules! tuple_impls {
689        ($(
690            $Tuple:tt {
691                $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)+
692            }
693        )+) => {
694            $(
695                impl_contains_defaultable_value!($($T,)*);
696            )*
697        }
698    }
699
700macro_rules! impl_contains_defaultable_value {
701      (
702        @build
703        start_ts = [$($ST: ident,)*],
704        ts = [$T1: ident,],
705        bounds = [$($bounds: tt)*],
706        out = [$($out: tt)*],
707    )=> {
708        impl<$($ST,)*> ContainsDefaultableValue for ($($ST,)*)
709        where
710            $($ST: ContainsDefaultableValue,)*
711            $($bounds)*
712            $T1::Out: Any<$($out)*>,
713        {
714            type Out = <$T1::Out as Any<$($out)*>>::Out;
715        }
716
717    };
718    (
719        @build
720        start_ts = [$($ST: ident,)*],
721        ts = [$T1: ident, $($T: ident,)+],
722        bounds = [$($bounds: tt)*],
723        out = [$($out: tt)*],
724    )=> {
725        impl_contains_defaultable_value! {
726            @build
727            start_ts = [$($ST,)*],
728            ts = [$($T,)*],
729            bounds = [$($bounds)* $T1::Out: Any<$($out)*>,],
730            out = [<$T1::Out as Any<$($out)*>>::Out],
731        }
732    };
733    ($T1: ident, $($T: ident,)+) => {
734        impl_contains_defaultable_value! {
735            @build
736            start_ts = [$T1, $($T,)*],
737            ts = [$($T,)*],
738            bounds = [],
739            out = [$T1::Out],
740        }
741    };
742    ($T1: ident,) => {
743        impl<$T1> ContainsDefaultableValue for ($T1,)
744        where $T1: ContainsDefaultableValue,
745        {
746            type Out = <$T1 as ContainsDefaultableValue>::Out;
747        }
748    }
749}
750
751impl<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>
    ContainsDefaultableValue for
    (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: ContainsDefaultableValue, T1: ContainsDefaultableValue,
    T2: ContainsDefaultableValue, T3: ContainsDefaultableValue,
    T4: ContainsDefaultableValue, T5: ContainsDefaultableValue,
    T6: ContainsDefaultableValue, T7: ContainsDefaultableValue,
    T8: ContainsDefaultableValue, T9: ContainsDefaultableValue,
    T10: ContainsDefaultableValue, T11: ContainsDefaultableValue,
    T12: ContainsDefaultableValue, T13: ContainsDefaultableValue,
    T14: ContainsDefaultableValue, T15: ContainsDefaultableValue,
    T16: ContainsDefaultableValue, T17: ContainsDefaultableValue,
    T18: ContainsDefaultableValue, T19: ContainsDefaultableValue,
    T20: ContainsDefaultableValue, T21: ContainsDefaultableValue,
    T22: ContainsDefaultableValue, T23: ContainsDefaultableValue,
    T24: ContainsDefaultableValue, T25: ContainsDefaultableValue,
    T26: ContainsDefaultableValue, T27: ContainsDefaultableValue,
    T28: ContainsDefaultableValue, T29: ContainsDefaultableValue,
    T30: ContainsDefaultableValue, T31: ContainsDefaultableValue,
    T1::Out: Any<T::Out>, T2::Out: Any<<T1::Out as Any<T::Out>>::Out>,
    T3::Out: Any<<T2::Out as Any<<T1::Out as Any<T::Out>>::Out>>::Out>,
    T4::Out: Any<<T3::Out as
    Any<<T2::Out as Any<<T1::Out as Any<T::Out>>::Out>>::Out>>::Out>,
    T5::Out: Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as Any<<T1::Out as Any<T::Out>>::Out>>::Out>>::Out>>::Out>,
    T6::Out: Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T7::Out: Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T8::Out: Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T9::Out: Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T10::Out: Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T11::Out: Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T12::Out: Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T13::Out: Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T14::Out: Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T15::Out: Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T16::Out: Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T17::Out: Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T18::Out: Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T19::Out: Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T20::Out: Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T21::Out: Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T22::Out: Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T23::Out: Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T24::Out: Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T25::Out: Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T26::Out: Any<<T25::Out as
    Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T27::Out: Any<<T26::Out as
    Any<<T25::Out as
    Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T28::Out: Any<<T27::Out as
    Any<<T26::Out as
    Any<<T25::Out as
    Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T29::Out: Any<<T28::Out as
    Any<<T27::Out as
    Any<<T26::Out as
    Any<<T25::Out as
    Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T30::Out: Any<<T29::Out as
    Any<<T28::Out as
    Any<<T27::Out as
    Any<<T26::Out as
    Any<<T25::Out as
    Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T31::Out: Any<<T30::Out as
    Any<<T29::Out as
    Any<<T28::Out as
    Any<<T27::Out as
    Any<<T26::Out as
    Any<<T25::Out as
    Any<<T24::Out as
    Any<<T23::Out as
    Any<<T22::Out as
    Any<<T21::Out as
    Any<<T20::Out as
    Any<<T19::Out as
    Any<<T18::Out as
    Any<<T17::Out as
    Any<<T16::Out as
    Any<<T15::Out as
    Any<<T14::Out as
    Any<<T13::Out as
    Any<<T12::Out as
    Any<<T11::Out as
    Any<<T10::Out as
    Any<<T9::Out as
    Any<<T8::Out as
    Any<<T7::Out as
    Any<<T6::Out as
    Any<<T5::Out as
    Any<<T4::Out as
    Any<<T3::Out as
    Any<<T2::Out as
    Any<<T1::Out as
    Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>
    {
    type Out =
        <T31::Out as
        Any<<T30::Out as
        Any<<T29::Out as
        Any<<T28::Out as
        Any<<T27::Out as
        Any<<T26::Out as
        Any<<T25::Out as
        Any<<T24::Out as
        Any<<T23::Out as
        Any<<T22::Out as
        Any<<T21::Out as
        Any<<T20::Out as
        Any<<T19::Out as
        Any<<T18::Out as
        Any<<T17::Out as
        Any<<T16::Out as
        Any<<T15::Out as
        Any<<T14::Out as
        Any<<T13::Out as
        Any<<T12::Out as
        Any<<T11::Out as
        Any<<T10::Out as
        Any<<T9::Out as
        Any<<T8::Out as
        Any<<T7::Out as
        Any<<T6::Out as
        Any<<T5::Out as
        Any<<T4::Out as
        Any<<T3::Out as
        Any<<T2::Out as
        Any<<T1::Out as
        Any<T::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out;
}diesel_derives::__diesel_for_each_tuple!(tuple_impls);