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