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