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