Skip to main content

diesel/query_builder/insert_statement/
insert_with_default_for_sqlite.rs

1use super::{BatchInsert, InsertStatement};
2use crate::insertable::{
3    CanInsertInSingleQuery, ColumnInsertValue, DefaultableColumnInsertValue, InsertValues,
4};
5use crate::prelude::*;
6use crate::query_builder::debug_query::DebugBinds;
7use crate::query_builder::returning::ReturningClause;
8use crate::query_builder::upsert::on_conflict_clause::OnConflictValues;
9use crate::query_builder::{
10    AstPass, DebugQuery, QueryBuilder, QueryFragment, QueryId, ValuesClause,
11};
12use crate::query_dsl::LoadQuery;
13use crate::query_dsl::methods::ExecuteDsl;
14use crate::sqlite::{Sqlite, SqliteQueryBuilder};
15use alloc::string::{String, ToString};
16use alloc::vec::Vec;
17use core::fmt::{self, Debug, Display};
18
19pub trait DebugQueryHelper<ContainsDefaultableValue> {
20    fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
21    fn fmt_display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
22}
23
24impl<T, V, QId, Op, Ret, const STATIC_QUERY_ID: bool> DebugQueryHelper<Yes>
25    for DebugQuery<
26        '_,
27        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op, Ret>,
28        Sqlite,
29    >
30where
31    V: QueryFragment<Sqlite>,
32    T: Copy + QuerySource,
33    Op: Copy,
34    Ret: Copy,
35    for<'b> InsertStatement<T, &'b ValuesClause<V, T>, Op, Ret>: QueryFragment<Sqlite>,
36{
37    fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38        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")];
39        for record in self.query.records.values.iter() {
40            let stmt = InsertStatement::new(
41                self.query.target,
42                record,
43                self.query.operator,
44                self.query.returning,
45            );
46            statements.push(crate::debug_query(&stmt).to_string());
47        }
48        statements.push("COMMIT".into());
49
50        f.debug_struct("Query")
51            .field("sql", &statements)
52            .field("binds", &[] as &[i32; 0])
53            .finish()
54    }
55
56    fn fmt_display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
57        f.write_fmt(format_args!("BEGIN;\n"))writeln!(f, "BEGIN;")?;
58        for record in self.query.records.values.iter() {
59            let stmt = InsertStatement::new(
60                self.query.target,
61                record,
62                self.query.operator,
63                self.query.returning,
64            );
65            f.write_fmt(format_args!("{0}\n", crate::debug_query(&stmt)))writeln!(f, "{}", crate::debug_query(&stmt))?;
66        }
67        f.write_fmt(format_args!("COMMIT;\n"))writeln!(f, "COMMIT;")?;
68        Ok(())
69    }
70}
71
72impl<'a, T, V, QId, Op, const STATIC_QUERY_ID: bool> DebugQueryHelper<No>
73    for DebugQuery<
74        'a,
75        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
76        Sqlite,
77    >
78where
79    T: Copy + Table,
80    Op: Copy + QueryFragment<Sqlite>,
81    SqliteBatchInsertWrapper<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>:
82        QueryFragment<Sqlite>,
83    V: CanInsertInSingleQuery<Sqlite>,
84    T::FromClause: QueryFragment<Sqlite>,
85{
86    fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87        self.fmt_helper(f, crate::query_builder::debug_query::debug)
88    }
89
90    fn fmt_display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
91        self.fmt_helper(f, crate::query_builder::debug_query::display)
92    }
93}
94
95#[allow(unsafe_code)] // cast to transparent wrapper type
96impl<'a, T, V, QId, Op, const STATIC_QUERY_ID: bool>
97    DebugQuery<
98        'a,
99        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
100        Sqlite,
101    >
102where
103    T: Copy + Table,
104    Op: Copy + QueryFragment<Sqlite>,
105    SqliteBatchInsertWrapper<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>:
106        QueryFragment<Sqlite>,
107    V: CanInsertInSingleQuery<Sqlite>,
108    T::FromClause: QueryFragment<Sqlite>,
109{
110    fn fmt_helper(
111        &self,
112        f: &mut fmt::Formatter<'_>,
113        formatter: fn(String, &DebugBinds<'_>, &mut fmt::Formatter<'_>) -> fmt::Result,
114    ) -> fmt::Result {
115        // explicit destruct to make sure we use all  the fields
116        let InsertStatement {
117            operator,
118            target: _,
119            records,
120            returning,
121            into_clause,
122        } = self.query;
123        let records = unsafe {
124            // SAFETY:
125            // * SqliteBatchInsertWrapper is `#[repr(transparent)]` so this cast
126            // is allowed
127            &*(records as *const _
128                as *const SqliteBatchInsertWrapper<
129                    Vec<ValuesClause<V, T>>,
130                    T,
131                    QId,
132                    STATIC_QUERY_ID,
133                >)
134        };
135        let mut buffer = Vec::new();
136        let ast_pass = AstPass::debug_binds(&mut buffer, &Sqlite);
137        super::insert_statement::walk_ast_intern::<T, _, _, _, Sqlite>(
138            ast_pass,
139            records,
140            into_clause,
141            operator,
142            returning,
143        )
144        .map_err(|_| fmt::Error)?;
145        let mut query_builder = SqliteQueryBuilder::default();
146        let mut ast_pass_to_sql_options = Default::default();
147        let sql_pass = AstPass::to_sql(&mut query_builder, &mut ast_pass_to_sql_options, &Sqlite);
148        super::insert_statement::walk_ast_intern::<T, _, _, _, Sqlite>(
149            sql_pass,
150            records,
151            into_clause,
152            operator,
153            returning,
154        )
155        .map_err(|_| fmt::Error)?;
156        let query = query_builder.finish();
157        let debug_binds = crate::query_builder::debug_query::DebugBinds::new(&buffer);
158        formatter(query, &debug_binds, f)
159    }
160}
161
162impl<T, V, QId, Op, O, const STATIC_QUERY_ID: bool> Display
163    for DebugQuery<
164        '_,
165        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
166        Sqlite,
167    >
168where
169    T: QuerySource,
170    V: ContainsDefaultableValue<Out = O>,
171    Self: DebugQueryHelper<O>,
172{
173    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
174        self.fmt_display(f)
175    }
176}
177
178impl<T, V, QId, Op, O, const STATIC_QUERY_ID: bool> Debug
179    for DebugQuery<
180        '_,
181        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
182        Sqlite,
183    >
184where
185    T: QuerySource,
186    V: ContainsDefaultableValue<Out = O>,
187    Self: DebugQueryHelper<O>,
188{
189    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
190        self.fmt_debug(f)
191    }
192}
193
194#[allow(missing_debug_implementations, missing_copy_implementations)]
195pub struct Yes;
196
197impl Default for Yes {
198    fn default() -> Self {
199        Yes
200    }
201}
202
203#[allow(missing_debug_implementations, missing_copy_implementations)]
204pub struct No;
205
206impl Default for No {
207    fn default() -> Self {
208        No
209    }
210}
211
212pub trait Any<Rhs> {
213    type Out: Any<Yes> + Any<No>;
214}
215
216impl Any<No> for No {
217    type Out = No;
218}
219
220impl Any<Yes> for No {
221    type Out = Yes;
222}
223
224impl Any<No> for Yes {
225    type Out = Yes;
226}
227
228impl Any<Yes> for Yes {
229    type Out = Yes;
230}
231
232pub trait ContainsDefaultableValue {
233    type Out: Any<Yes> + Any<No>;
234}
235
236impl<C, B> ContainsDefaultableValue for ColumnInsertValue<C, B> {
237    type Out = No;
238}
239
240impl<I> ContainsDefaultableValue for DefaultableColumnInsertValue<I> {
241    type Out = Yes;
242}
243
244impl<I, const SIZE: usize> ContainsDefaultableValue for [I; SIZE]
245where
246    I: ContainsDefaultableValue,
247{
248    type Out = I::Out;
249}
250
251impl<I, T> ContainsDefaultableValue for ValuesClause<I, T>
252where
253    I: ContainsDefaultableValue,
254{
255    type Out = I::Out;
256}
257
258impl<T> ContainsDefaultableValue for &T
259where
260    T: ContainsDefaultableValue,
261{
262    type Out = T::Out;
263}
264
265impl<V, T, QId, C, Op, O, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
266    for InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>
267where
268    T: QuerySource,
269    C: Connection<Backend = Sqlite>,
270    V: ContainsDefaultableValue<Out = O>,
271    O: Default,
272    (O, Self): ExecuteDsl<C, Sqlite>,
273{
274    fn execute(query: Self, conn: &mut C) -> QueryResult<usize> {
275        <(O, Self) as ExecuteDsl<C, Sqlite>>::execute((O::default(), query), conn)
276    }
277}
278
279impl<V, T, QId, C, Op, O, Target, ConflictOpt, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
280    for InsertStatement<
281        T,
282        OnConflictValues<
283            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
284            Target,
285            ConflictOpt,
286        >,
287        Op,
288    >
289where
290    T: QuerySource,
291    C: Connection<Backend = Sqlite>,
292    V: ContainsDefaultableValue<Out = O>,
293    O: Default,
294    (O, Self): ExecuteDsl<C, Sqlite>,
295{
296    fn execute(query: Self, conn: &mut C) -> QueryResult<usize> {
297        <(O, Self) as ExecuteDsl<C, Sqlite>>::execute((O::default(), query), conn)
298    }
299}
300
301impl<V, T, QId, C, Op, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
302    for (
303        Yes,
304        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
305    )
306where
307    C: Connection<Backend = Sqlite>,
308    T: Table + Copy + QueryId + 'static,
309    T::FromClause: QueryFragment<Sqlite>,
310    Op: Copy + QueryId + QueryFragment<Sqlite>,
311    V: InsertValues<Sqlite, T> + CanInsertInSingleQuery<Sqlite> + QueryId,
312{
313    fn execute((Yes, query): Self, conn: &mut C) -> QueryResult<usize> {
314        conn.transaction(|conn| {
315            let mut result = 0;
316            for record in &query.records.values {
317                let stmt =
318                    InsertStatement::new(query.target, record, query.operator, query.returning);
319                result += stmt.execute(conn)?;
320            }
321            Ok(result)
322        })
323    }
324}
325
326impl<'query, V, T, QId, Op, O, U, B, const STATIC_QUERY_ID: bool>
327    LoadQuery<'query, SqliteConnection, U, B>
328    for InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>
329where
330    T: QuerySource,
331    V: ContainsDefaultableValue<Out = O>,
332    O: Default,
333    (O, Self): LoadQuery<'query, SqliteConnection, U, B>,
334{
335    type RowIter<'conn> = <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
336
337    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
338        <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::internal_load(
339            (O::default(), self),
340            conn,
341        )
342    }
343}
344
345impl<'query, V, T, QId, Op, Ret, O, U, B, const STATIC_QUERY_ID: bool>
346    LoadQuery<'query, SqliteConnection, U, B>
347    for InsertStatement<
348        T,
349        BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
350        Op,
351        ReturningClause<Ret>,
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<'query, V, T, QId, Op, O, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
370    LoadQuery<'query, SqliteConnection, U, B>
371    for InsertStatement<
372        T,
373        OnConflictValues<
374            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
375            Target,
376            ConflictOpt,
377        >,
378        Op,
379    >
380where
381    T: QuerySource,
382    V: ContainsDefaultableValue<Out = O>,
383    O: Default,
384    (O, Self): LoadQuery<'query, SqliteConnection, U, B>,
385{
386    type RowIter<'conn> = <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
387
388    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
389        <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::internal_load(
390            (O::default(), self),
391            conn,
392        )
393    }
394}
395
396impl<'query, V, T, QId, Op, Ret, O, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
397    LoadQuery<'query, SqliteConnection, U, B>
398    for InsertStatement<
399        T,
400        OnConflictValues<
401            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
402            Target,
403            ConflictOpt,
404        >,
405        Op,
406        ReturningClause<Ret>,
407    >
408where
409    T: QuerySource,
410    V: ContainsDefaultableValue<Out = O>,
411    O: Default,
412    (O, Self): LoadQuery<'query, SqliteConnection, U, B>,
413{
414    type RowIter<'conn> = <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
415
416    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
417        <(O, Self) as LoadQuery<'query, SqliteConnection, U, B>>::internal_load(
418            (O::default(), self),
419            conn,
420        )
421    }
422}
423
424impl<V, T, QId, Op, O, const STATIC_QUERY_ID: bool> RunQueryDsl<SqliteConnection>
425    for (
426        O,
427        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
428    )
429where
430    T: QuerySource,
431    V: ContainsDefaultableValue<Out = O>,
432    O: Default,
433    InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>:
434        RunQueryDsl<SqliteConnection>,
435{
436}
437
438impl<V, T, QId, Op, Ret, O, const STATIC_QUERY_ID: bool> RunQueryDsl<SqliteConnection>
439    for (
440        O,
441        InsertStatement<
442            T,
443            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
444            Op,
445            ReturningClause<Ret>,
446        >,
447    )
448where
449    T: QuerySource,
450    V: ContainsDefaultableValue<Out = O>,
451    O: Default,
452    InsertStatement<
453        T,
454        BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
455        Op,
456        ReturningClause<Ret>,
457    >: RunQueryDsl<SqliteConnection>,
458{
459}
460
461impl<V, T, QId, Op, O, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
462    RunQueryDsl<SqliteConnection>
463    for (
464        O,
465        InsertStatement<
466            T,
467            OnConflictValues<
468                BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
469                Target,
470                ConflictOpt,
471            >,
472            Op,
473        >,
474    )
475where
476    T: QuerySource,
477    V: ContainsDefaultableValue<Out = O>,
478    O: Default,
479    InsertStatement<
480        T,
481        OnConflictValues<
482            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
483            Target,
484            ConflictOpt,
485        >,
486        Op,
487    >: RunQueryDsl<SqliteConnection>,
488{
489}
490
491impl<V, T, QId, Op, Ret, O, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
492    RunQueryDsl<SqliteConnection>
493    for (
494        O,
495        InsertStatement<
496            T,
497            OnConflictValues<
498                BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
499                Target,
500                ConflictOpt,
501            >,
502            Op,
503            ReturningClause<Ret>,
504        >,
505    )
506where
507    T: QuerySource,
508    V: ContainsDefaultableValue<Out = O>,
509    O: Default,
510    InsertStatement<
511        T,
512        OnConflictValues<
513            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
514            Target,
515            ConflictOpt,
516        >,
517        Op,
518        ReturningClause<Ret>,
519    >: RunQueryDsl<SqliteConnection>,
520{
521}
522
523#[diagnostic::do_not_recommend]
524impl<'query, V, T, QId, Op, U, B, const STATIC_QUERY_ID: bool>
525    LoadQuery<'query, SqliteConnection, U, B>
526    for (
527        Yes,
528        InsertStatement<T, BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>, Op>,
529    )
530where
531    T: Table + Copy + QueryId + 'static,
532    Op: Copy + QueryId + QueryFragment<Sqlite>,
533    InsertStatement<T, ValuesClause<V, T>, Op>: LoadQuery<'query, SqliteConnection, U, B>,
534    Self: RunQueryDsl<SqliteConnection>,
535{
536    type RowIter<'conn> = alloc::vec::IntoIter<QueryResult<U>>;
537
538    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
539        let (Yes, query) = self;
540
541        conn.transaction(|conn| {
542            let mut results = Vec::with_capacity(query.records.values.len());
543
544            for record in query.records.values {
545                let stmt =
546                    InsertStatement::new(query.target, record, query.operator, query.returning);
547
548                let result = stmt
549                    .internal_load(conn)?
550                    .next()
551                    .ok_or(crate::result::Error::NotFound)?;
552
553                match &result {
554                    Ok(_) | Err(crate::result::Error::DeserializationError(_)) => {
555                        results.push(result)
556                    }
557                    Err(_) => {
558                        result?;
559                    }
560                };
561            }
562
563            Ok(results.into_iter())
564        })
565    }
566}
567
568#[diagnostic::do_not_recommend]
569impl<'query, V, T, QId, Op, Ret, U, B, const STATIC_QUERY_ID: bool>
570    LoadQuery<'query, SqliteConnection, U, B>
571    for (
572        Yes,
573        InsertStatement<
574            T,
575            BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
576            Op,
577            ReturningClause<Ret>,
578        >,
579    )
580where
581    T: Table + Copy + QueryId + 'static,
582    Op: Copy + QueryId + QueryFragment<Sqlite>,
583    ReturningClause<Ret>: Copy,
584    InsertStatement<T, ValuesClause<V, T>, Op, ReturningClause<Ret>>:
585        LoadQuery<'query, SqliteConnection, U, B>,
586    Self: RunQueryDsl<SqliteConnection>,
587{
588    type RowIter<'conn> = alloc::vec::IntoIter<QueryResult<U>>;
589
590    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
591        let (Yes, query) = self;
592
593        conn.transaction(|conn| {
594            let mut results = Vec::with_capacity(query.records.values.len());
595
596            for record in query.records.values {
597                let stmt =
598                    InsertStatement::new(query.target, record, query.operator, query.returning);
599
600                let result = stmt
601                    .internal_load(conn)?
602                    .next()
603                    .ok_or(crate::result::Error::NotFound)?;
604
605                match &result {
606                    Ok(_) | Err(crate::result::Error::DeserializationError(_)) => {
607                        results.push(result)
608                    }
609                    Err(_) => {
610                        result?;
611                    }
612                };
613            }
614
615            Ok(results.into_iter())
616        })
617    }
618}
619
620#[diagnostic::do_not_recommend]
621impl<'query, V, T, QId, Op, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
622    LoadQuery<'query, SqliteConnection, U, B>
623    for (
624        Yes,
625        InsertStatement<
626            T,
627            OnConflictValues<
628                BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
629                Target,
630                ConflictOpt,
631            >,
632            Op,
633        >,
634    )
635where
636    T: Table + Copy + QueryId + 'static,
637    T::FromClause: Copy,
638    Op: Copy,
639    Target: Copy,
640    ConflictOpt: Copy,
641    InsertStatement<T, OnConflictValues<ValuesClause<V, T>, Target, ConflictOpt>, Op>:
642        LoadQuery<'query, SqliteConnection, U, B>,
643    Self: RunQueryDsl<SqliteConnection>,
644{
645    type RowIter<'conn> = alloc::vec::IntoIter<QueryResult<U>>;
646
647    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
648        let (Yes, query) = self;
649
650        conn.transaction(|conn| {
651            let mut results = Vec::with_capacity(query.records.values.values.len());
652
653            for record in query.records.values.values {
654                let stmt = InsertStatement {
655                    operator: query.operator,
656                    target: query.target,
657                    records: OnConflictValues {
658                        values: record,
659                        target: query.records.target,
660                        action: query.records.action,
661                        where_clause: query.records.where_clause,
662                    },
663                    returning: query.returning,
664                    into_clause: query.into_clause,
665                };
666
667                let result = stmt
668                    .internal_load(conn)?
669                    .next()
670                    .ok_or(crate::result::Error::NotFound)?;
671
672                match &result {
673                    Ok(_) | Err(crate::result::Error::DeserializationError(_)) => {
674                        results.push(result)
675                    }
676                    Err(_) => {
677                        result?;
678                    }
679                };
680            }
681
682            Ok(results.into_iter())
683        })
684    }
685}
686
687#[diagnostic::do_not_recommend]
688impl<'query, V, T, QId, Op, Ret, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
689    LoadQuery<'query, SqliteConnection, U, B>
690    for (
691        Yes,
692        InsertStatement<
693            T,
694            OnConflictValues<
695                BatchInsert<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>,
696                Target,
697                ConflictOpt,
698            >,
699            Op,
700            ReturningClause<Ret>,
701        >,
702    )
703where
704    T: Table + Copy + QueryId + 'static,
705    T::FromClause: Copy,
706    Op: Copy,
707    ReturningClause<Ret>: Copy,
708    Target: Copy,
709    ConflictOpt: Copy,
710    InsertStatement<
711        T,
712        OnConflictValues<ValuesClause<V, T>, Target, ConflictOpt>,
713        Op,
714        ReturningClause<Ret>,
715    >: LoadQuery<'query, SqliteConnection, U, B>,
716    Self: RunQueryDsl<SqliteConnection>,
717{
718    type RowIter<'conn> = alloc::vec::IntoIter<QueryResult<U>>;
719
720    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
721        let (Yes, query) = self;
722
723        conn.transaction(|conn| {
724            let mut results = Vec::with_capacity(query.records.values.values.len());
725
726            for record in query.records.values.values {
727                let stmt = InsertStatement {
728                    operator: query.operator,
729                    target: query.target,
730                    records: OnConflictValues {
731                        values: record,
732                        target: query.records.target,
733                        action: query.records.action,
734                        where_clause: query.records.where_clause,
735                    },
736                    returning: query.returning,
737                    into_clause: query.into_clause,
738                };
739
740                let result = stmt
741                    .internal_load(conn)?
742                    .next()
743                    .ok_or(crate::result::Error::NotFound)?;
744
745                match &result {
746                    Ok(_) | Err(crate::result::Error::DeserializationError(_)) => {
747                        results.push(result)
748                    }
749                    Err(_) => {
750                        result?;
751                    }
752                };
753            }
754
755            Ok(results.into_iter())
756        })
757    }
758}
759
760#[allow(missing_debug_implementations, missing_copy_implementations)]
761#[repr(transparent)]
762pub struct SqliteBatchInsertWrapper<V, T, QId, const STATIC_QUERY_ID: bool>(
763    BatchInsert<V, T, QId, STATIC_QUERY_ID>,
764);
765
766impl<V, T, QId, const STATIC_QUERY_ID: bool> crate::query_builder::returning::InsertStmtKind
767    for SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>
768{
769    type StmtKind = crate::query_builder::returning::InsertStmtWithoutOnConflictDoUpdate;
770}
771
772impl<V, Tab, QId, const STATIC_QUERY_ID: bool> QueryFragment<Sqlite>
773    for SqliteBatchInsertWrapper<Vec<ValuesClause<V, Tab>>, Tab, QId, STATIC_QUERY_ID>
774where
775    ValuesClause<V, Tab>: QueryFragment<Sqlite>,
776    V: QueryFragment<Sqlite>,
777{
778    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, Sqlite>) -> QueryResult<()> {
779        if !STATIC_QUERY_ID {
780            out.unsafe_to_cache_prepared();
781        }
782
783        let mut values = self.0.values.iter();
784        if let Some(value) = values.next() {
785            value.walk_ast(out.reborrow())?;
786        }
787        for value in values {
788            out.push_sql(", (");
789            value.values.walk_ast(out.reborrow())?;
790            out.push_sql(")");
791        }
792        Ok(())
793    }
794}
795
796#[allow(missing_copy_implementations, missing_debug_implementations)]
797#[repr(transparent)]
798pub struct SqliteCanInsertInSingleQueryHelper<T: ?Sized>(T);
799
800impl<V, T, QId, const STATIC_QUERY_ID: bool> CanInsertInSingleQuery<Sqlite>
801    for SqliteBatchInsertWrapper<Vec<ValuesClause<V, T>>, T, QId, STATIC_QUERY_ID>
802where
803    // We constrain that here on an internal helper type
804    // to make sure that this does not accidentally leak
805    // so that none does really implement normal batch
806    // insert for inserts with default values here
807    SqliteCanInsertInSingleQueryHelper<V>: CanInsertInSingleQuery<Sqlite>,
808{
809    fn rows_to_insert(&self) -> Option<usize> {
810        Some(self.0.values.len())
811    }
812}
813
814impl<T> CanInsertInSingleQuery<Sqlite> for SqliteCanInsertInSingleQueryHelper<T>
815where
816    T: CanInsertInSingleQuery<Sqlite>,
817{
818    fn rows_to_insert(&self) -> Option<usize> {
819        self.0.rows_to_insert()
820    }
821}
822
823impl<V, T, QId, const STATIC_QUERY_ID: bool> QueryId
824    for SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>
825where
826    BatchInsert<V, T, QId, STATIC_QUERY_ID>: QueryId,
827{
828    type QueryId = <BatchInsert<V, T, QId, STATIC_QUERY_ID> as QueryId>::QueryId;
829
830    const HAS_STATIC_QUERY_ID: bool =
831        <BatchInsert<V, T, QId, STATIC_QUERY_ID> as QueryId>::HAS_STATIC_QUERY_ID;
832}
833
834impl<V, T, QId, C, Op, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
835    for (
836        No,
837        InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>,
838    )
839where
840    C: Connection<Backend = Sqlite>,
841    T: Table + QueryId + 'static,
842    T::FromClause: QueryFragment<Sqlite>,
843    Op: QueryFragment<Sqlite> + QueryId,
844    SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>:
845        QueryFragment<Sqlite> + QueryId + CanInsertInSingleQuery<Sqlite>,
846{
847    fn execute((No, query): Self, conn: &mut C) -> QueryResult<usize> {
848        let query = InsertStatement {
849            records: SqliteBatchInsertWrapper(query.records),
850            operator: query.operator,
851            target: query.target,
852            returning: query.returning,
853            into_clause: query.into_clause,
854        };
855        query.execute(conn)
856    }
857}
858
859impl<V, T, QId, C, Op, Target, ConflictOpt, const STATIC_QUERY_ID: bool> ExecuteDsl<C, Sqlite>
860    for (
861        No,
862        InsertStatement<
863            T,
864            OnConflictValues<BatchInsert<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
865            Op,
866        >,
867    )
868where
869    C: Connection<Backend = Sqlite>,
870    T: Table + QueryId + 'static,
871    T::FromClause: QueryFragment<Sqlite>,
872    Op: QueryFragment<Sqlite> + QueryId,
873    OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>:
874        QueryFragment<Sqlite> + CanInsertInSingleQuery<Sqlite> + QueryId,
875{
876    fn execute((No, query): Self, conn: &mut C) -> QueryResult<usize> {
877        let query = InsertStatement {
878            operator: query.operator,
879            target: query.target,
880            records: OnConflictValues {
881                values: SqliteBatchInsertWrapper(query.records.values),
882                target: query.records.target,
883                action: query.records.action,
884                where_clause: query.records.where_clause,
885            },
886            returning: query.returning,
887            into_clause: query.into_clause,
888        };
889        query.execute(conn)
890    }
891}
892
893#[diagnostic::do_not_recommend]
894impl<'query, V, T, QId, Op, U, B, const STATIC_QUERY_ID: bool>
895    LoadQuery<'query, SqliteConnection, U, B>
896    for (
897        No,
898        InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op>,
899    )
900where
901    T: Table + QueryId + 'static,
902    InsertStatement<T, SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Op>:
903        LoadQuery<'query, SqliteConnection, U, B>,
904    Self: RunQueryDsl<SqliteConnection>,
905{
906    type RowIter<'conn> = <InsertStatement<
907        T,
908        SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>,
909        Op,
910    > as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
911
912    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
913        let (No, query) = self;
914
915        let query = InsertStatement {
916            records: SqliteBatchInsertWrapper(query.records),
917            operator: query.operator,
918            target: query.target,
919            returning: query.returning,
920            into_clause: query.into_clause,
921        };
922
923        query.internal_load(conn)
924    }
925}
926
927#[diagnostic::do_not_recommend]
928impl<'query, V, T, QId, Op, Ret, U, B, const STATIC_QUERY_ID: bool>
929    LoadQuery<'query, SqliteConnection, U, B>
930    for (
931        No,
932        InsertStatement<T, BatchInsert<V, T, QId, STATIC_QUERY_ID>, Op, ReturningClause<Ret>>,
933    )
934where
935    T: Table + QueryId + 'static,
936    InsertStatement<
937        T,
938        SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>,
939        Op,
940        ReturningClause<Ret>,
941    >: LoadQuery<'query, SqliteConnection, U, B>,
942    Self: RunQueryDsl<SqliteConnection>,
943{
944    type RowIter<'conn> = <InsertStatement<
945        T,
946        SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>,
947        Op,
948        ReturningClause<Ret>,
949    > as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
950
951    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
952        let (No, query) = self;
953
954        let query = InsertStatement {
955            records: SqliteBatchInsertWrapper(query.records),
956            operator: query.operator,
957            target: query.target,
958            returning: query.returning,
959            into_clause: query.into_clause,
960        };
961
962        query.internal_load(conn)
963    }
964}
965
966#[diagnostic::do_not_recommend]
967impl<'query, V, T, QId, Op, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
968    LoadQuery<'query, SqliteConnection, U, B>
969    for (
970        No,
971        InsertStatement<
972            T,
973            OnConflictValues<BatchInsert<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
974            Op,
975        >,
976    )
977where
978    T: Table + QueryId + 'static,
979    InsertStatement<
980        T,
981        OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
982        Op,
983    >: LoadQuery<'query, SqliteConnection, U, B>,
984    Self: RunQueryDsl<SqliteConnection>,
985{
986    type RowIter<'conn> = <InsertStatement<
987        T,
988        OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
989        Op,
990    > as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
991
992    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
993        let (No, query) = self;
994
995        let query = InsertStatement {
996            operator: query.operator,
997            target: query.target,
998            records: OnConflictValues {
999                values: SqliteBatchInsertWrapper(query.records.values),
1000                target: query.records.target,
1001                action: query.records.action,
1002                where_clause: query.records.where_clause,
1003            },
1004            returning: query.returning,
1005            into_clause: query.into_clause,
1006        };
1007
1008        query.internal_load(conn)
1009    }
1010}
1011
1012#[diagnostic::do_not_recommend]
1013impl<'query, V, T, QId, Op, Ret, U, B, Target, ConflictOpt, const STATIC_QUERY_ID: bool>
1014    LoadQuery<'query, SqliteConnection, U, B>
1015    for (
1016        No,
1017        InsertStatement<
1018            T,
1019            OnConflictValues<BatchInsert<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
1020            Op,
1021            ReturningClause<Ret>,
1022        >,
1023    )
1024where
1025    T: Table + QueryId + 'static,
1026    InsertStatement<
1027        T,
1028        OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
1029        Op,
1030        ReturningClause<Ret>,
1031    >: LoadQuery<'query, SqliteConnection, U, B>,
1032    Self: RunQueryDsl<SqliteConnection>,
1033{
1034    type RowIter<'conn> = <InsertStatement<
1035        T,
1036        OnConflictValues<SqliteBatchInsertWrapper<V, T, QId, STATIC_QUERY_ID>, Target, ConflictOpt>,
1037        Op,
1038        ReturningClause<Ret>,
1039    > as LoadQuery<'query, SqliteConnection, U, B>>::RowIter<'conn>;
1040
1041    fn internal_load(self, conn: &mut SqliteConnection) -> QueryResult<Self::RowIter<'_>> {
1042        let (No, query) = self;
1043
1044        let query = InsertStatement {
1045            operator: query.operator,
1046            target: query.target,
1047            records: OnConflictValues {
1048                values: SqliteBatchInsertWrapper(query.records.values),
1049                target: query.records.target,
1050                action: query.records.action,
1051                where_clause: query.records.where_clause,
1052            },
1053            returning: query.returning,
1054            into_clause: query.into_clause,
1055        };
1056
1057        query.internal_load(conn)
1058    }
1059}
1060
1061macro_rules! tuple_impls {
1062        ($(
1063            $Tuple:tt {
1064                $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)+
1065            }
1066        )+) => {
1067            $(
1068                impl_contains_defaultable_value!($($T,)*);
1069            )*
1070        }
1071    }
1072
1073macro_rules! impl_contains_defaultable_value {
1074      (
1075        @build
1076        start_ts = [$($ST: ident,)*],
1077        ts = [$T1: ident,],
1078        bounds = [$($bounds: tt)*],
1079        out = [$($out: tt)*],
1080    )=> {
1081        impl<$($ST,)*> ContainsDefaultableValue for ($($ST,)*)
1082        where
1083            $($ST: ContainsDefaultableValue,)*
1084            $($bounds)*
1085            $T1::Out: Any<$($out)*>,
1086        {
1087            type Out = <$T1::Out as Any<$($out)*>>::Out;
1088        }
1089
1090    };
1091    (
1092        @build
1093        start_ts = [$($ST: ident,)*],
1094        ts = [$T1: ident, $($T: ident,)+],
1095        bounds = [$($bounds: tt)*],
1096        out = [$($out: tt)*],
1097    )=> {
1098        impl_contains_defaultable_value! {
1099            @build
1100            start_ts = [$($ST,)*],
1101            ts = [$($T,)*],
1102            bounds = [$($bounds)* $T1::Out: Any<$($out)*>,],
1103            out = [<$T1::Out as Any<$($out)*>>::Out],
1104        }
1105    };
1106    ($T1: ident, $($T: ident,)+) => {
1107        impl_contains_defaultable_value! {
1108            @build
1109            start_ts = [$T1, $($T,)*],
1110            ts = [$($T,)*],
1111            bounds = [],
1112            out = [$T1::Out],
1113        }
1114    };
1115    ($T1: ident,) => {
1116        impl<$T1> ContainsDefaultableValue for ($T1,)
1117        where $T1: ContainsDefaultableValue,
1118        {
1119            type Out = <$T1 as ContainsDefaultableValue>::Out;
1120        }
1121    }
1122}
1123
1124impl<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;
}crate::for_each_tuple!(tuple_impls);