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)] impl<'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 let InsertStatement {
117 operator,
118 target: _,
119 records,
120 returning,
121 into_clause,
122 } = self.query;
123 let records = unsafe {
124 &*(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 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);