diesel/type_impls/
tuples.rs

1use crate::associations::BelongsTo;
2use crate::backend::Backend;
3use crate::deserialize::{
4    self, FromSqlRow, FromStaticSqlRow, Queryable, SqlTypeOrSelectable, StaticallySizedRow,
5};
6use crate::expression::{
7    is_contained_in_group_by, AppearsOnTable, Expression, IsContainedInGroupBy, MixedAggregates,
8    QueryMetadata, Selectable, SelectableExpression, TypedExpressionType, ValidGrouping,
9};
10use crate::insertable::{CanInsertInSingleQuery, InsertValues, Insertable, InsertableOptionHelper};
11use crate::query_builder::*;
12use crate::query_dsl::load_dsl::CompatibleType;
13use crate::query_source::*;
14use crate::result::QueryResult;
15use crate::row::*;
16use crate::sql_types::{HasSqlType, IntoNullable, Nullable, OneIsNullable, SqlType};
17use crate::util::{TupleAppend, TupleSize};
18
19impl<T> TupleSize for T
20where
21    T: crate::sql_types::SingleValue,
22{
23    const SIZE: usize = 1;
24}
25
26macro_rules! fake_variadic {
27    (1i32 -> $($tt: tt)*) => {
28        #[cfg_attr(diesel_docsrs, doc(fake_variadic))]
29        $($tt)*
30    };
31    ($idx:tt -> $($tt: tt)*) => {
32        #[cfg_attr(diesel_docsrs, doc(hidden))]
33        $($tt)*
34    };
35}
36
37macro_rules! tuple_impls {
38    ($(
39        $Tuple:tt {
40            $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)+
41        }
42    )+) => {
43        $(
44            fake_variadic!{
45                $Tuple ->
46                impl<$($T),+, __DB> HasSqlType<($($T,)+)> for __DB where
47                    $(__DB: HasSqlType<$T>),+,
48                    __DB: Backend,
49                {
50                    fn metadata(_: &mut __DB::MetadataLookup) -> __DB::TypeMetadata {
51                        unreachable!("Tuples should never implement `ToSql` directly");
52                    }
53                }
54            }
55
56            impl_from_sql_row!(($($T,)+), ($($ST,)+));
57
58
59            fake_variadic! {
60                $Tuple ->
61                #[diagnostic::do_not_recommend]
62                impl<$($T: Expression),+> Expression for ($($T,)+)
63                where ($($T::SqlType, )*): TypedExpressionType
64                {
65                    type SqlType = ($(<$T as Expression>::SqlType,)+);
66                }
67            }
68            fake_variadic! {
69                $Tuple -> impl<$($T: TypedExpressionType,)*> TypedExpressionType for ($($T,)*) {}
70            }
71            fake_variadic! {
72                $Tuple ->
73                impl<$($T: SqlType + TypedExpressionType,)*> TypedExpressionType for Nullable<($($T,)*)>
74                where ($($T,)*): SqlType
75                {
76                }
77            }
78            fake_variadic! {
79                $Tuple ->
80                impl<$($T: SqlType,)*> IntoNullable for ($($T,)*)
81                where Self: SqlType,
82                {
83                    type Nullable = Nullable<($($T,)*)>;
84                }
85            }
86
87            fake_variadic! {
88                $Tuple ->
89                impl<$($T,)+ __DB> Selectable<__DB> for ($($T,)+)
90                where
91                    __DB: Backend,
92                $($T: Selectable<__DB>),+,
93                {
94                    type SelectExpression = ($($T::SelectExpression,)+);
95
96                    fn construct_selection() -> Self::SelectExpression {
97                        ($($T::construct_selection(),)+)
98                    }
99                }
100            }
101
102            fake_variadic! {
103                $Tuple ->
104                impl<$($T: QueryFragment<__DB>),+, __DB: Backend> QueryFragment<__DB> for ($($T,)+) {
105                    #[allow(unused_assignments)]
106                    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, __DB>) -> QueryResult<()>
107                    {
108                        let mut needs_comma = false;
109                        $(
110                            if !self.$idx.is_noop(out.backend())? {
111                                if needs_comma {
112                                    out.push_sql(", ");
113                                }
114                                self.$idx.walk_ast(out.reborrow())?;
115                                needs_comma = true;
116                            }
117                        )+
118                            Ok(())
119                    }
120                }
121            }
122
123            // cannot use `#[diagnostic::do_not_recommend]` here yet to hide tuple impls
124            // as this makes the error message worse (not saying which column is problematic)
125            impl<$($T,)+ Tab> ColumnList for ($($T,)+)
126            where
127                $($T: ColumnList<Table = Tab>,)+
128            {
129                type Table = Tab;
130
131                fn walk_ast<__DB: Backend>(&self, mut out: AstPass<'_, '_, __DB>) -> QueryResult<()> {
132                    $(
133                        if $idx != 0 {
134                            out.push_sql(", ");
135                        }
136                        self.$idx.walk_ast(out.reborrow())?;
137                    )+
138                    Ok(())
139                }
140            }
141
142            fake_variadic! {
143                $Tuple ->
144                impl<$($T: QueryId),+> QueryId for ($($T,)+) {
145                    type QueryId = ($($T::QueryId,)+);
146
147                    const HAS_STATIC_QUERY_ID: bool = $($T::HAS_STATIC_QUERY_ID &&)+ true;
148                }
149            }
150
151            impl_valid_grouping_for_tuple_of_columns!($($T,)*);
152
153            impl<$($T,)+ Tab> UndecoratedInsertRecord<Tab> for ($($T,)+)
154            where
155                $($T: UndecoratedInsertRecord<Tab>,)+
156            {
157            }
158
159            impl<$($T,)+ __DB> CanInsertInSingleQuery<__DB> for ($($T,)+)
160            where
161                __DB: Backend,
162                $($T: CanInsertInSingleQuery<__DB>,)+
163            {
164                fn rows_to_insert(&self) -> Option<usize> {
165                    $(debug_assert_eq!(self.$idx.rows_to_insert(), Some(1));)+
166                    Some(1)
167                }
168            }
169
170            fake_variadic! {
171                $Tuple ->
172                impl<$($T,)+ $($ST,)+ Tab> Insertable<Tab> for ($($T,)+)
173                where
174                    $($T: Insertable<Tab, Values = ValuesClause<$ST, Tab>>,)+
175                {
176                    type Values = ValuesClause<($($ST,)+), Tab>;
177
178                    fn values(self) -> Self::Values {
179                        ValuesClause::new(($(self.$idx.values().values,)+))
180                    }
181                }
182            }
183
184            // that isn't supported by the derive yet?
185            // fake_variadic! {
186            //     $Tuple ->
187                impl<'a, $($T,)+ Tab> Insertable<Tab> for &'a ($($T,)+)
188                where
189                    ($(&'a $T,)+): Insertable<Tab>,
190                {
191                    type Values = <($(&'a $T,)+) as Insertable<Tab>>::Values;
192
193                    fn values(self) -> Self::Values {
194                        ($(&self.$idx,)+).values()
195                    }
196                }
197//            }
198
199            #[allow(unused_assignments)]
200            impl<$($T,)+ Tab, __DB> InsertValues<__DB, Tab> for ($($T,)+)
201            where
202                Tab: Table,
203                __DB: Backend,
204                $($T: InsertValues<__DB, Tab>,)+
205            {
206                fn column_names(&self, mut out: AstPass<'_, '_, __DB>) -> QueryResult<()> {
207                    let mut needs_comma = false;
208                    $(
209                        let noop_element = self.$idx.is_noop(out.backend())?;
210                        if !noop_element {
211                            if needs_comma {
212                                out.push_sql(", ");
213                            }
214                            self.$idx.column_names(out.reborrow())?;
215                            needs_comma = true;
216                        }
217                    )+
218                    Ok(())
219                }
220            }
221
222            impl<__T, $($ST,)* Tab> Insertable<Tab> for InsertableOptionHelper<__T, ($($ST,)*)>
223            where
224                __T: Insertable<Tab>,
225                __T::Values: Default,
226            {
227                type Values = __T::Values;
228
229                fn values(self) -> Self::Values {
230                    self.0.map(|v| v.values()).unwrap_or_default()
231                }
232            }
233
234            // not possible to use diagnostic::do_not_recommend to hide the tuple impls
235            // yet as it gives worse error messages
236            // (doesn't show anymore which tuple element doesn't implement the trait)
237            impl<$($T,)+ QS> SelectableExpression<QS> for ($($T,)+) where
238                $($T: SelectableExpression<QS>,)+
239                ($($T,)+): AppearsOnTable<QS>,
240            {
241            }
242
243            fake_variadic! {
244                $Tuple ->
245                impl<$($T,)+ QS> AppearsOnTable<QS> for ($($T,)+) where
246                    $($T: AppearsOnTable<QS>,)+
247                    ($($T,)+): Expression,
248                {
249                }
250            }
251
252            fake_variadic! {
253                $Tuple ->
254                impl<Target, $($T,)+> AsChangeset for ($($T,)+) where
255                    $($T: AsChangeset<Target=Target>,)+
256                    Target: QuerySource,
257                {
258                    type Target = Target;
259                    type Changeset = ($($T::Changeset,)+);
260
261                    fn as_changeset(self) -> Self::Changeset {
262                        ($(self.$idx.as_changeset(),)+)
263                    }
264                }
265            }
266
267            fake_variadic! {
268                $Tuple ->
269                impl<$($T,)+ Parent> BelongsTo<Parent> for ($($T,)+) where
270                    T: BelongsTo<Parent>,
271                {
272                    type ForeignKey = T::ForeignKey;
273                    type ForeignKeyColumn = T::ForeignKeyColumn;
274
275                    fn foreign_key(&self) -> Option<&Self::ForeignKey> {
276                        self.0.foreign_key()
277                    }
278
279                    fn foreign_key_column() -> Self::ForeignKeyColumn {
280                        T::foreign_key_column()
281                    }
282                }
283            }
284
285            impl<$($T,)+ Next> TupleAppend<Next> for ($($T,)+) {
286                type Output = ($($T,)+ Next);
287
288                #[allow(non_snake_case)]
289                fn tuple_append(self, next: Next) -> Self::Output {
290                    let ($($T,)+) = self;
291                    ($($T,)+ next)
292                }
293            }
294
295            impl_sql_type!($($T,)*);
296
297            fake_variadic! {
298                $Tuple ->
299                impl<$($T,)* __DB, $($ST,)*> Queryable<($($ST,)*), __DB> for ($($T,)*)
300                where __DB: Backend,
301                      Self: FromStaticSqlRow<($($ST,)*), __DB>,
302                {
303                    type Row = Self;
304
305                    fn build(row: Self::Row) -> deserialize::Result<Self> {
306                        Ok(row)
307                    }
308                }
309            }
310
311            // That's unfortunally not supported yet
312            // fake_variadic! {
313            //     $Tuple ->
314                impl<__T, $($ST,)*  __DB> FromStaticSqlRow<Nullable<($($ST,)*)>, __DB> for Option<__T> where
315                    __DB: Backend,
316                ($($ST,)*): SqlType,
317                    __T: FromSqlRow<($($ST,)*), __DB>,
318                {
319
320                    #[allow(non_snake_case, unused_variables, unused_mut)]
321                    fn build_from_row<'a>(row: &impl Row<'a, __DB>)
322                                          -> deserialize::Result<Self>
323                    {
324                        match <__T as FromSqlRow<($($ST,)*), __DB>>::build_from_row(row) {
325                            Ok(v) => Ok(Some(v)),
326                            Err(e) if e.is::<crate::result::UnexpectedNullError>() => Ok(None),
327                            Err(e) => Err(e)
328                        }
329                    }
330                }
331            //}
332
333            // That's unfortunally not supported yet
334            // fake_variadic! {
335            //     $Tuple ->
336                impl<__T,  __DB, $($ST,)*> Queryable<Nullable<($($ST,)*)>, __DB> for Option<__T>
337                where __DB: Backend,
338                      Self: FromStaticSqlRow<Nullable<($($ST,)*)>, __DB>,
339                ($($ST,)*): SqlType,
340                {
341                    type Row = Self;
342
343                    fn build(row: Self::Row) -> deserialize::Result<Self> {
344                        Ok(row)
345                    }
346                }
347            //}
348
349            impl<$($T,)*> TupleSize for ($($T,)*)
350                where $($T: TupleSize,)*
351            {
352                const SIZE: usize = $($T::SIZE +)* 0;
353            }
354
355            impl<$($T,)*> TupleSize for Nullable<($($T,)*)>
356            where $($T: TupleSize,)*
357                  ($($T,)*): SqlType,
358            {
359                const SIZE: usize = $($T::SIZE +)* 0;
360            }
361
362            fake_variadic! {
363                $Tuple ->
364                impl<$($T,)* __DB> QueryMetadata<($($T,)*)> for __DB
365                where __DB: Backend,
366                $(__DB: QueryMetadata<$T>,)*
367                {
368                    fn row_metadata(lookup: &mut Self::MetadataLookup, row: &mut Vec<Option<__DB::TypeMetadata>>) {
369                        $(
370                            <__DB as QueryMetadata<$T>>::row_metadata(lookup, row);
371                        )*
372                    }
373                }
374            }
375
376            // That's unfortunally not supported yet
377            // fake_variadic! {
378            //     $Tuple ->
379                impl<$($T,)* __DB> QueryMetadata<Nullable<($($T,)*)>> for __DB
380                where __DB: Backend,
381                $(__DB: QueryMetadata<$T>,)*
382                {
383                    fn row_metadata(lookup: &mut Self::MetadataLookup, row: &mut Vec<Option<__DB::TypeMetadata>>) {
384                        $(
385                            <__DB as QueryMetadata<$T>>::row_metadata(lookup, row);
386                        )*
387                    }
388                }
389            //}
390
391            fake_variadic! {
392                $Tuple ->
393                impl<$($T,)* __DB> deserialize::QueryableByName< __DB> for ($($T,)*)
394                where __DB: Backend,
395                $($T: deserialize::QueryableByName<__DB>,)*
396                {
397                    fn build<'a>(row: &impl NamedRow<'a, __DB>) -> deserialize::Result<Self> {
398                        Ok(($(
399                            <$T as deserialize::QueryableByName<__DB>>::build(row)?,
400                        )*))
401                    }
402                }
403            }
404
405            #[diagnostic::do_not_recommend]
406            impl<__T, $($ST,)* __DB> CompatibleType<__T, __DB> for ($($ST,)*)
407            where
408                __DB: Backend,
409                __T: FromSqlRow<($($ST,)*), __DB>,
410            {
411                type SqlType = Self;
412            }
413
414            impl<__T, $($ST,)* __DB> CompatibleType<Option<__T>, __DB> for Nullable<($($ST,)*)>
415            where
416                __DB: Backend,
417                ($($ST,)*): CompatibleType<__T, __DB>
418            {
419                type SqlType = Nullable<<($($ST,)*) as CompatibleType<__T, __DB>>::SqlType>;
420            }
421
422            impl<$($ST,)*> SqlTypeOrSelectable for ($($ST,)*)
423            where $($ST: SqlTypeOrSelectable,)*
424            {}
425
426            impl<$($ST,)*> SqlTypeOrSelectable for Nullable<($($ST,)*)>
427            where ($($ST,)*): SqlTypeOrSelectable
428            {}
429        )+
430    }
431}
432
433macro_rules! impl_from_sql_row {
434    (($T1: ident,), ($ST1: ident,)) => {
435        #[cfg_attr(diesel_docsrs, doc(fake_variadic))]
436        impl<$T1, $ST1, __DB> crate::deserialize::FromStaticSqlRow<($ST1,), __DB> for ($T1,) where
437            __DB: Backend,
438            $ST1: CompatibleType<$T1, __DB>,
439            $T1: FromSqlRow<<$ST1 as CompatibleType<$T1, __DB>>::SqlType, __DB>,
440        {
441
442            #[allow(non_snake_case, unused_variables, unused_mut)]
443            fn build_from_row<'a>(row: &impl Row<'a, __DB>)
444                                                       -> deserialize::Result<Self>
445            {
446                Ok(($T1::build_from_row(row)?,))
447            }
448        }
449    };
450    (($T1: ident, $($T: ident,)*), ($ST1: ident, $($ST: ident,)*)) => {
451        #[cfg_attr(diesel_docsrs, doc(hidden))]
452        #[diagnostic::do_not_recommend]
453        impl<$T1, $($T,)* $($ST,)* __DB> FromSqlRow<($($ST,)* crate::sql_types::Untyped), __DB> for ($($T,)* $T1)
454        where __DB: Backend,
455              $T1: FromSqlRow<crate::sql_types::Untyped, __DB>,
456            $(
457                $T: FromSqlRow<$ST, __DB> + StaticallySizedRow<$ST, __DB>,
458        )*
459        {
460            #[allow(non_snake_case, unused_variables, unused_mut)]
461            fn build_from_row<'a>(full_row: &impl Row<'a, __DB>)
462                -> deserialize::Result<Self>
463            {
464                let field_count = full_row.field_count();
465
466                let mut static_field_count = 0;
467                $(
468                    let row = full_row.partial_row(static_field_count..static_field_count + $T::FIELD_COUNT);
469                    static_field_count += $T::FIELD_COUNT;
470                    let $T = $T::build_from_row(&row)?;
471                )*
472
473                let row = full_row.partial_row(static_field_count..field_count);
474
475                Ok(($($T,)* $T1::build_from_row(&row)?,))
476            }
477        }
478
479        #[cfg_attr(diesel_docsrs, doc(hidden))]
480        impl<$T1, $ST1, $($T,)* $($ST,)* __DB> FromStaticSqlRow<($($ST,)* $ST1,), __DB> for ($($T,)* $T1,) where
481            __DB: Backend,
482            $ST1: CompatibleType<$T1, __DB>,
483            $T1: FromSqlRow<<$ST1 as CompatibleType<$T1, __DB>>::SqlType, __DB>,
484            $(
485                $ST: CompatibleType<$T, __DB>,
486                $T: FromSqlRow<<$ST as CompatibleType<$T, __DB>>::SqlType, __DB> + StaticallySizedRow<<$ST as CompatibleType<$T, __DB>>::SqlType, __DB>,
487            )*
488
489        {
490
491            #[allow(non_snake_case, unused_variables, unused_mut)]
492            fn build_from_row<'a>(full_row: &impl Row<'a, __DB>)
493                -> deserialize::Result<Self>
494            {
495                let field_count = full_row.field_count();
496
497                let mut static_field_count = 0;
498                $(
499                    let row = full_row.partial_row(static_field_count..static_field_count + $T::FIELD_COUNT);
500                    static_field_count += $T::FIELD_COUNT;
501                    let $T = <$T as FromSqlRow<<$ST as CompatibleType<$T, __DB>>::SqlType, __DB>>::build_from_row(&row)?;
502                )*
503
504                let row = full_row.partial_row(static_field_count..field_count);
505
506                Ok(($($T,)* $T1::build_from_row(&row)?,))
507            }
508        }
509    }
510}
511
512macro_rules! impl_valid_grouping_for_tuple_of_columns {
513    ($T1: ident, $($T: ident,)+) => {
514        #[cfg_attr(diesel_docsrs, doc(hidden))]
515        impl<$T1, $($T,)* __GroupByClause> ValidGrouping<__GroupByClause> for ($T1, $($T,)*)
516        where
517            $T1: ValidGrouping<__GroupByClause>,
518            ($($T,)*): ValidGrouping<__GroupByClause>,
519            $T1::IsAggregate: MixedAggregates<<($($T,)*) as ValidGrouping<__GroupByClause>>::IsAggregate>,
520        {
521            type IsAggregate = <$T1::IsAggregate as MixedAggregates<<($($T,)*) as ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
522        }
523
524        impl<$T1, $($T,)* Col> IsContainedInGroupBy<Col> for ($T1, $($T,)*)
525        where Col: Column,
526              ($($T,)*): IsContainedInGroupBy<Col>,
527              $T1: IsContainedInGroupBy<Col>,
528              $T1::Output: is_contained_in_group_by::IsAny<<($($T,)*) as IsContainedInGroupBy<Col>>::Output>
529        {
530            type Output = <$T1::Output as is_contained_in_group_by::IsAny<<($($T,)*) as IsContainedInGroupBy<Col>>::Output>>::Output;
531        }
532    };
533    ($T1: ident,) => {
534        impl<$T1, Col> IsContainedInGroupBy<Col> for ($T1,)
535        where Col: Column,
536              $T1: IsContainedInGroupBy<Col>
537        {
538            type Output = <$T1 as IsContainedInGroupBy<Col>>::Output;
539        }
540
541        #[cfg_attr(diesel_docsrs, doc(fake_variadic))]
542        impl<$T1, __GroupByClause> ValidGrouping<__GroupByClause> for ($T1,)
543            where $T1: ValidGrouping<__GroupByClause>
544        {
545            type IsAggregate = $T1::IsAggregate;
546        }
547    };
548}
549
550macro_rules! impl_sql_type {
551    (
552        @build
553        start_ts = [$($ST: ident,)*],
554        ts = [$T1: ident,],
555        bounds = [$($bounds: tt)*],
556        is_null = [$($is_null: tt)*],
557    )=> {
558        #[cfg_attr(diesel_docsrs, doc(hidden))]
559        impl<$($ST,)*> SqlType for ($($ST,)*)
560        where
561            $($ST: SqlType,)*
562            $($bounds)*
563            $T1::IsNull: OneIsNullable<$($is_null)*>,
564        {
565            type IsNull = <$T1::IsNull as OneIsNullable<$($is_null)*>>::Out;
566        }
567
568    };
569    (
570        @build
571        start_ts = [$($ST: ident,)*],
572        ts = [$T1: ident, $($T: ident,)+],
573        bounds = [$($bounds: tt)*],
574        is_null = [$($is_null: tt)*],
575    )=> {
576        impl_sql_type!{
577            @build
578            start_ts = [$($ST,)*],
579            ts = [$($T,)*],
580            bounds = [$($bounds)* $T1::IsNull: OneIsNullable<$($is_null)*>,],
581            is_null = [<$T1::IsNull as OneIsNullable<$($is_null)*>>::Out],
582        }
583    };
584    ($T1: ident, $($T: ident,)+) => {
585        impl_sql_type!{
586            @build
587            start_ts = [$T1, $($T,)*],
588            ts = [$($T,)*],
589            bounds = [],
590            is_null = [$T1::IsNull],
591        }
592    };
593    ($T1: ident,) => {
594        #[cfg_attr(diesel_docsrs, doc(fake_variadic))]
595        impl<$T1> SqlType for ($T1,)
596        where $T1: SqlType,
597        {
598            type IsNull = $T1::IsNull;
599        }
600    }
601}
602
603#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB>
    HasSqlType<(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    T14, T15)> for __DB where __DB: HasSqlType<T>, __DB: HasSqlType<T1>,
    __DB: HasSqlType<T2>, __DB: HasSqlType<T3>, __DB: HasSqlType<T4>,
    __DB: HasSqlType<T5>, __DB: HasSqlType<T6>, __DB: HasSqlType<T7>,
    __DB: HasSqlType<T8>, __DB: HasSqlType<T9>, __DB: HasSqlType<T10>,
    __DB: HasSqlType<T11>, __DB: HasSqlType<T12>, __DB: HasSqlType<T13>,
    __DB: HasSqlType<T14>, __DB: HasSqlType<T15>, __DB: Backend {
    fn metadata(_: &mut __DB::MetadataLookup) -> __DB::TypeMetadata {
        {
            ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
                    format_args!("Tuples should never implement `ToSql` directly")));
        };
    }
}
#[doc(hidden)]
#[diagnostic::do_not_recommend]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ST1,
    ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13, ST14,
    ST15, __DB>
    FromSqlRow<(ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
    ST13, ST14, ST15, crate::sql_types::Untyped), __DB> for
    (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T)
    where __DB: Backend, T: FromSqlRow<crate::sql_types::Untyped, __DB>,
    T1: FromSqlRow<ST1, __DB> + StaticallySizedRow<ST1, __DB>,
    T2: FromSqlRow<ST2, __DB> + StaticallySizedRow<ST2, __DB>,
    T3: FromSqlRow<ST3, __DB> + StaticallySizedRow<ST3, __DB>,
    T4: FromSqlRow<ST4, __DB> + StaticallySizedRow<ST4, __DB>,
    T5: FromSqlRow<ST5, __DB> + StaticallySizedRow<ST5, __DB>,
    T6: FromSqlRow<ST6, __DB> + StaticallySizedRow<ST6, __DB>,
    T7: FromSqlRow<ST7, __DB> + StaticallySizedRow<ST7, __DB>,
    T8: FromSqlRow<ST8, __DB> + StaticallySizedRow<ST8, __DB>,
    T9: FromSqlRow<ST9, __DB> + StaticallySizedRow<ST9, __DB>,
    T10: FromSqlRow<ST10, __DB> + StaticallySizedRow<ST10, __DB>,
    T11: FromSqlRow<ST11, __DB> + StaticallySizedRow<ST11, __DB>,
    T12: FromSqlRow<ST12, __DB> + StaticallySizedRow<ST12, __DB>,
    T13: FromSqlRow<ST13, __DB> + StaticallySizedRow<ST13, __DB>,
    T14: FromSqlRow<ST14, __DB> + StaticallySizedRow<ST14, __DB>,
    T15: FromSqlRow<ST15, __DB> + StaticallySizedRow<ST15, __DB> {
    #[allow(non_snake_case, unused_variables, unused_mut)]
    fn build_from_row<'a>(full_row: &impl Row<'a, __DB>)
        -> deserialize::Result<Self> {
        let field_count = full_row.field_count();
        let mut static_field_count = 0;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T1::FIELD_COUNT);
        static_field_count += T1::FIELD_COUNT;
        let T1 = T1::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T2::FIELD_COUNT);
        static_field_count += T2::FIELD_COUNT;
        let T2 = T2::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T3::FIELD_COUNT);
        static_field_count += T3::FIELD_COUNT;
        let T3 = T3::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T4::FIELD_COUNT);
        static_field_count += T4::FIELD_COUNT;
        let T4 = T4::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T5::FIELD_COUNT);
        static_field_count += T5::FIELD_COUNT;
        let T5 = T5::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T6::FIELD_COUNT);
        static_field_count += T6::FIELD_COUNT;
        let T6 = T6::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T7::FIELD_COUNT);
        static_field_count += T7::FIELD_COUNT;
        let T7 = T7::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T8::FIELD_COUNT);
        static_field_count += T8::FIELD_COUNT;
        let T8 = T8::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T9::FIELD_COUNT);
        static_field_count += T9::FIELD_COUNT;
        let T9 = T9::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T10::FIELD_COUNT);
        static_field_count += T10::FIELD_COUNT;
        let T10 = T10::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T11::FIELD_COUNT);
        static_field_count += T11::FIELD_COUNT;
        let T11 = T11::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T12::FIELD_COUNT);
        static_field_count += T12::FIELD_COUNT;
        let T12 = T12::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T13::FIELD_COUNT);
        static_field_count += T13::FIELD_COUNT;
        let T13 = T13::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T14::FIELD_COUNT);
        static_field_count += T14::FIELD_COUNT;
        let T14 = T14::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T15::FIELD_COUNT);
        static_field_count += T15::FIELD_COUNT;
        let T15 = T15::build_from_row(&row)?;
        let row = full_row.partial_row(static_field_count..field_count);
        Ok((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
                T::build_from_row(&row)?))
    }
}
#[doc(hidden)]
impl<T, ST, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13, ST14,
    ST15, __DB>
    FromStaticSqlRow<(ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11,
    ST12, ST13, ST14, ST15, ST), __DB> for
    (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T)
    where __DB: Backend, ST: CompatibleType<T, __DB>,
    T: FromSqlRow<<ST as CompatibleType<T, __DB>>::SqlType, __DB>,
    ST1: CompatibleType<T1, __DB>,
    T1: FromSqlRow<<ST1 as CompatibleType<T1, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST1 as CompatibleType<T1, __DB>>::SqlType, __DB>,
    ST2: CompatibleType<T2, __DB>,
    T2: FromSqlRow<<ST2 as CompatibleType<T2, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST2 as CompatibleType<T2, __DB>>::SqlType, __DB>,
    ST3: CompatibleType<T3, __DB>,
    T3: FromSqlRow<<ST3 as CompatibleType<T3, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST3 as CompatibleType<T3, __DB>>::SqlType, __DB>,
    ST4: CompatibleType<T4, __DB>,
    T4: FromSqlRow<<ST4 as CompatibleType<T4, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST4 as CompatibleType<T4, __DB>>::SqlType, __DB>,
    ST5: CompatibleType<T5, __DB>,
    T5: FromSqlRow<<ST5 as CompatibleType<T5, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST5 as CompatibleType<T5, __DB>>::SqlType, __DB>,
    ST6: CompatibleType<T6, __DB>,
    T6: FromSqlRow<<ST6 as CompatibleType<T6, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST6 as CompatibleType<T6, __DB>>::SqlType, __DB>,
    ST7: CompatibleType<T7, __DB>,
    T7: FromSqlRow<<ST7 as CompatibleType<T7, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST7 as CompatibleType<T7, __DB>>::SqlType, __DB>,
    ST8: CompatibleType<T8, __DB>,
    T8: FromSqlRow<<ST8 as CompatibleType<T8, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST8 as CompatibleType<T8, __DB>>::SqlType, __DB>,
    ST9: CompatibleType<T9, __DB>,
    T9: FromSqlRow<<ST9 as CompatibleType<T9, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST9 as CompatibleType<T9, __DB>>::SqlType, __DB>,
    ST10: CompatibleType<T10, __DB>,
    T10: FromSqlRow<<ST10 as CompatibleType<T10, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST10 as CompatibleType<T10, __DB>>::SqlType, __DB>,
    ST11: CompatibleType<T11, __DB>,
    T11: FromSqlRow<<ST11 as CompatibleType<T11, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST11 as CompatibleType<T11, __DB>>::SqlType, __DB>,
    ST12: CompatibleType<T12, __DB>,
    T12: FromSqlRow<<ST12 as CompatibleType<T12, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST12 as CompatibleType<T12, __DB>>::SqlType, __DB>,
    ST13: CompatibleType<T13, __DB>,
    T13: FromSqlRow<<ST13 as CompatibleType<T13, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST13 as CompatibleType<T13, __DB>>::SqlType, __DB>,
    ST14: CompatibleType<T14, __DB>,
    T14: FromSqlRow<<ST14 as CompatibleType<T14, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST14 as CompatibleType<T14, __DB>>::SqlType, __DB>,
    ST15: CompatibleType<T15, __DB>,
    T15: FromSqlRow<<ST15 as CompatibleType<T15, __DB>>::SqlType, __DB> +
    StaticallySizedRow<<ST15 as CompatibleType<T15, __DB>>::SqlType, __DB> {
    #[allow(non_snake_case, unused_variables, unused_mut)]
    fn build_from_row<'a>(full_row: &impl Row<'a, __DB>)
        -> deserialize::Result<Self> {
        let field_count = full_row.field_count();
        let mut static_field_count = 0;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T1::FIELD_COUNT);
        static_field_count += T1::FIELD_COUNT;
        let T1 =
            <T1 as
                        FromSqlRow<<ST1 as CompatibleType<T1, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T2::FIELD_COUNT);
        static_field_count += T2::FIELD_COUNT;
        let T2 =
            <T2 as
                        FromSqlRow<<ST2 as CompatibleType<T2, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T3::FIELD_COUNT);
        static_field_count += T3::FIELD_COUNT;
        let T3 =
            <T3 as
                        FromSqlRow<<ST3 as CompatibleType<T3, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T4::FIELD_COUNT);
        static_field_count += T4::FIELD_COUNT;
        let T4 =
            <T4 as
                        FromSqlRow<<ST4 as CompatibleType<T4, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T5::FIELD_COUNT);
        static_field_count += T5::FIELD_COUNT;
        let T5 =
            <T5 as
                        FromSqlRow<<ST5 as CompatibleType<T5, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T6::FIELD_COUNT);
        static_field_count += T6::FIELD_COUNT;
        let T6 =
            <T6 as
                        FromSqlRow<<ST6 as CompatibleType<T6, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T7::FIELD_COUNT);
        static_field_count += T7::FIELD_COUNT;
        let T7 =
            <T7 as
                        FromSqlRow<<ST7 as CompatibleType<T7, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T8::FIELD_COUNT);
        static_field_count += T8::FIELD_COUNT;
        let T8 =
            <T8 as
                        FromSqlRow<<ST8 as CompatibleType<T8, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T9::FIELD_COUNT);
        static_field_count += T9::FIELD_COUNT;
        let T9 =
            <T9 as
                        FromSqlRow<<ST9 as CompatibleType<T9, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T10::FIELD_COUNT);
        static_field_count += T10::FIELD_COUNT;
        let T10 =
            <T10 as
                        FromSqlRow<<ST10 as CompatibleType<T10, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T11::FIELD_COUNT);
        static_field_count += T11::FIELD_COUNT;
        let T11 =
            <T11 as
                        FromSqlRow<<ST11 as CompatibleType<T11, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T12::FIELD_COUNT);
        static_field_count += T12::FIELD_COUNT;
        let T12 =
            <T12 as
                        FromSqlRow<<ST12 as CompatibleType<T12, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T13::FIELD_COUNT);
        static_field_count += T13::FIELD_COUNT;
        let T13 =
            <T13 as
                        FromSqlRow<<ST13 as CompatibleType<T13, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T14::FIELD_COUNT);
        static_field_count += T14::FIELD_COUNT;
        let T14 =
            <T14 as
                        FromSqlRow<<ST14 as CompatibleType<T14, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row =
            full_row.partial_row(static_field_count..static_field_count +
                        T15::FIELD_COUNT);
        static_field_count += T15::FIELD_COUNT;
        let T15 =
            <T15 as
                        FromSqlRow<<ST15 as CompatibleType<T15, __DB>>::SqlType,
                        __DB>>::build_from_row(&row)?;
        let row = full_row.partial_row(static_field_count..field_count);
        Ok((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
                T::build_from_row(&row)?))
    }
}
#[doc(hidden)]
#[diagnostic::do_not_recommend]
impl<T: Expression, T1: Expression, T2: Expression, T3: Expression,
    T4: Expression, T5: Expression, T6: Expression, T7: Expression,
    T8: Expression, T9: Expression, T10: Expression, T11: Expression,
    T12: Expression, T13: Expression, T14: Expression, T15: Expression>
    Expression for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where
    (T::SqlType, T1::SqlType, T2::SqlType, T3::SqlType, T4::SqlType,
    T5::SqlType, T6::SqlType, T7::SqlType, T8::SqlType, T9::SqlType,
    T10::SqlType, T11::SqlType, T12::SqlType, T13::SqlType, T14::SqlType,
    T15::SqlType): TypedExpressionType {
    type SqlType =
        (<T as Expression>::SqlType, <T1 as Expression>::SqlType,
        <T2 as Expression>::SqlType, <T3 as Expression>::SqlType,
        <T4 as Expression>::SqlType, <T5 as Expression>::SqlType,
        <T6 as Expression>::SqlType, <T7 as Expression>::SqlType,
        <T8 as Expression>::SqlType, <T9 as Expression>::SqlType,
        <T10 as Expression>::SqlType, <T11 as Expression>::SqlType,
        <T12 as Expression>::SqlType, <T13 as Expression>::SqlType,
        <T14 as Expression>::SqlType, <T15 as Expression>::SqlType);
}
#[doc(hidden)]
impl<T: TypedExpressionType, T1: TypedExpressionType, T2: TypedExpressionType,
    T3: TypedExpressionType, T4: TypedExpressionType, T5: TypedExpressionType,
    T6: TypedExpressionType, T7: TypedExpressionType, T8: TypedExpressionType,
    T9: TypedExpressionType, T10: TypedExpressionType,
    T11: TypedExpressionType, T12: TypedExpressionType,
    T13: TypedExpressionType, T14: TypedExpressionType,
    T15: TypedExpressionType> TypedExpressionType for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) {
}
#[doc(hidden)]
impl<T: SqlType + TypedExpressionType, T1: SqlType + TypedExpressionType,
    T2: SqlType + TypedExpressionType, T3: SqlType + TypedExpressionType,
    T4: SqlType + TypedExpressionType, T5: SqlType + TypedExpressionType,
    T6: SqlType + TypedExpressionType, T7: SqlType + TypedExpressionType,
    T8: SqlType + TypedExpressionType, T9: SqlType + TypedExpressionType,
    T10: SqlType + TypedExpressionType, T11: SqlType + TypedExpressionType,
    T12: SqlType + TypedExpressionType, T13: SqlType + TypedExpressionType,
    T14: SqlType + TypedExpressionType, T15: SqlType + TypedExpressionType>
    TypedExpressionType for
    Nullable<(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15)> where
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15): SqlType {
}
#[doc(hidden)]
impl<T: SqlType, T1: SqlType, T2: SqlType, T3: SqlType, T4: SqlType,
    T5: SqlType, T6: SqlType, T7: SqlType, T8: SqlType, T9: SqlType,
    T10: SqlType, T11: SqlType, T12: SqlType, T13: SqlType, T14: SqlType,
    T15: SqlType> IntoNullable for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where Self: SqlType {
    type Nullable =
        Nullable<(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
        T14, T15)>;
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB> Selectable<__DB> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where __DB: Backend, T: Selectable<__DB>, T1: Selectable<__DB>,
    T2: Selectable<__DB>, T3: Selectable<__DB>, T4: Selectable<__DB>,
    T5: Selectable<__DB>, T6: Selectable<__DB>, T7: Selectable<__DB>,
    T8: Selectable<__DB>, T9: Selectable<__DB>, T10: Selectable<__DB>,
    T11: Selectable<__DB>, T12: Selectable<__DB>, T13: Selectable<__DB>,
    T14: Selectable<__DB>, T15: Selectable<__DB> {
    type SelectExpression =
        (T::SelectExpression, T1::SelectExpression, T2::SelectExpression,
        T3::SelectExpression, T4::SelectExpression, T5::SelectExpression,
        T6::SelectExpression, T7::SelectExpression, T8::SelectExpression,
        T9::SelectExpression, T10::SelectExpression, T11::SelectExpression,
        T12::SelectExpression, T13::SelectExpression, T14::SelectExpression,
        T15::SelectExpression);
    fn construct_selection() -> Self::SelectExpression {
        (T::construct_selection(), T1::construct_selection(),
            T2::construct_selection(), T3::construct_selection(),
            T4::construct_selection(), T5::construct_selection(),
            T6::construct_selection(), T7::construct_selection(),
            T8::construct_selection(), T9::construct_selection(),
            T10::construct_selection(), T11::construct_selection(),
            T12::construct_selection(), T13::construct_selection(),
            T14::construct_selection(), T15::construct_selection())
    }
}
#[doc(hidden)]
impl<T: QueryFragment<__DB>, T1: QueryFragment<__DB>, T2: QueryFragment<__DB>,
    T3: QueryFragment<__DB>, T4: QueryFragment<__DB>, T5: QueryFragment<__DB>,
    T6: QueryFragment<__DB>, T7: QueryFragment<__DB>, T8: QueryFragment<__DB>,
    T9: QueryFragment<__DB>, T10: QueryFragment<__DB>,
    T11: QueryFragment<__DB>, T12: QueryFragment<__DB>,
    T13: QueryFragment<__DB>, T14: QueryFragment<__DB>,
    T15: QueryFragment<__DB>, __DB: Backend> QueryFragment<__DB> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) {
    #[allow(unused_assignments)]
    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, __DB>)
        -> QueryResult<()> {
        let mut needs_comma = false;
        if !self.0.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.0.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.1.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.1.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.2.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.2.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.3.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.3.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.4.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.4.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.5.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.5.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.6.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.6.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.7.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.7.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.8.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.8.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.9.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.9.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.10.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.10.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.11.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.11.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.12.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.12.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.13.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.13.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.14.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.14.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        if !self.15.is_noop(out.backend())? {
            if needs_comma { out.push_sql(", "); }
            self.15.walk_ast(out.reborrow())?;
            needs_comma = true;
        }
        Ok(())
    }
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, Tab>
    ColumnList for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: ColumnList<Table = Tab>, T1: ColumnList<Table = Tab>,
    T2: ColumnList<Table = Tab>, T3: ColumnList<Table = Tab>,
    T4: ColumnList<Table = Tab>, T5: ColumnList<Table = Tab>,
    T6: ColumnList<Table = Tab>, T7: ColumnList<Table = Tab>,
    T8: ColumnList<Table = Tab>, T9: ColumnList<Table = Tab>,
    T10: ColumnList<Table = Tab>, T11: ColumnList<Table = Tab>,
    T12: ColumnList<Table = Tab>, T13: ColumnList<Table = Tab>,
    T14: ColumnList<Table = Tab>, T15: ColumnList<Table = Tab> {
    type Table = Tab;
    fn walk_ast<__DB: Backend>(&self, mut out: AstPass<'_, '_, __DB>)
        -> QueryResult<()> {
        if 0 != 0 { out.push_sql(", "); }
        self.0.walk_ast(out.reborrow())?;
        if 1 != 0 { out.push_sql(", "); }
        self.1.walk_ast(out.reborrow())?;
        if 2 != 0 { out.push_sql(", "); }
        self.2.walk_ast(out.reborrow())?;
        if 3 != 0 { out.push_sql(", "); }
        self.3.walk_ast(out.reborrow())?;
        if 4 != 0 { out.push_sql(", "); }
        self.4.walk_ast(out.reborrow())?;
        if 5 != 0 { out.push_sql(", "); }
        self.5.walk_ast(out.reborrow())?;
        if 6 != 0 { out.push_sql(", "); }
        self.6.walk_ast(out.reborrow())?;
        if 7 != 0 { out.push_sql(", "); }
        self.7.walk_ast(out.reborrow())?;
        if 8 != 0 { out.push_sql(", "); }
        self.8.walk_ast(out.reborrow())?;
        if 9 != 0 { out.push_sql(", "); }
        self.9.walk_ast(out.reborrow())?;
        if 10 != 0 { out.push_sql(", "); }
        self.10.walk_ast(out.reborrow())?;
        if 11 != 0 { out.push_sql(", "); }
        self.11.walk_ast(out.reborrow())?;
        if 12 != 0 { out.push_sql(", "); }
        self.12.walk_ast(out.reborrow())?;
        if 13 != 0 { out.push_sql(", "); }
        self.13.walk_ast(out.reborrow())?;
        if 14 != 0 { out.push_sql(", "); }
        self.14.walk_ast(out.reborrow())?;
        if 15 != 0 { out.push_sql(", "); }
        self.15.walk_ast(out.reborrow())?;
        Ok(())
    }
}
#[doc(hidden)]
impl<T: QueryId, T1: QueryId, T2: QueryId, T3: QueryId, T4: QueryId,
    T5: QueryId, T6: QueryId, T7: QueryId, T8: QueryId, T9: QueryId,
    T10: QueryId, T11: QueryId, T12: QueryId, T13: QueryId, T14: QueryId,
    T15: QueryId> QueryId for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) {
    type QueryId =
        (T::QueryId, T1::QueryId, T2::QueryId, T3::QueryId, T4::QueryId,
        T5::QueryId, T6::QueryId, T7::QueryId, T8::QueryId, T9::QueryId,
        T10::QueryId, T11::QueryId, T12::QueryId, T13::QueryId, T14::QueryId,
        T15::QueryId);
    const HAS_STATIC_QUERY_ID: bool =
        T::HAS_STATIC_QUERY_ID && T1::HAS_STATIC_QUERY_ID &&
                                                                    T2::HAS_STATIC_QUERY_ID && T3::HAS_STATIC_QUERY_ID &&
                                                            T4::HAS_STATIC_QUERY_ID && T5::HAS_STATIC_QUERY_ID &&
                                                    T6::HAS_STATIC_QUERY_ID && T7::HAS_STATIC_QUERY_ID &&
                                            T8::HAS_STATIC_QUERY_ID && T9::HAS_STATIC_QUERY_ID &&
                                    T10::HAS_STATIC_QUERY_ID && T11::HAS_STATIC_QUERY_ID &&
                            T12::HAS_STATIC_QUERY_ID && T13::HAS_STATIC_QUERY_ID &&
                    T14::HAS_STATIC_QUERY_ID && T15::HAS_STATIC_QUERY_ID &&
            true;
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __GroupByClause> ValidGrouping<__GroupByClause> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: ValidGrouping<__GroupByClause>,
    (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15): ValidGrouping<__GroupByClause>,
    T::IsAggregate: MixedAggregates<<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
    T11, T12, T13, T14, T15) as ValidGrouping<__GroupByClause>>::IsAggregate>
    {
    type IsAggregate =
        <T::IsAggregate as
        MixedAggregates<<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
        T13, T14, T15) as
        ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, Col>
    IsContainedInGroupBy<Col> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where Col: Column,
    (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15): IsContainedInGroupBy<Col>, T: IsContainedInGroupBy<Col>,
    T::Output: is_contained_in_group_by::IsAny<<(T1, T2, T3, T4, T5, T6, T7,
    T8, T9, T10, T11, T12, T13, T14, T15) as
    IsContainedInGroupBy<Col>>::Output> {
    type Output =
        <T::Output as
        is_contained_in_group_by::IsAny<<(T1, T2, T3, T4, T5, T6, T7, T8, T9,
        T10, T11, T12, T13, T14, T15) as
        IsContainedInGroupBy<Col>>::Output>>::Output;
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, Tab>
    UndecoratedInsertRecord<Tab> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: UndecoratedInsertRecord<Tab>, T1: UndecoratedInsertRecord<Tab>,
    T2: UndecoratedInsertRecord<Tab>, T3: UndecoratedInsertRecord<Tab>,
    T4: UndecoratedInsertRecord<Tab>, T5: UndecoratedInsertRecord<Tab>,
    T6: UndecoratedInsertRecord<Tab>, T7: UndecoratedInsertRecord<Tab>,
    T8: UndecoratedInsertRecord<Tab>, T9: UndecoratedInsertRecord<Tab>,
    T10: UndecoratedInsertRecord<Tab>, T11: UndecoratedInsertRecord<Tab>,
    T12: UndecoratedInsertRecord<Tab>, T13: UndecoratedInsertRecord<Tab>,
    T14: UndecoratedInsertRecord<Tab>, T15: UndecoratedInsertRecord<Tab> {}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB> CanInsertInSingleQuery<__DB> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where __DB: Backend, T: CanInsertInSingleQuery<__DB>,
    T1: CanInsertInSingleQuery<__DB>, T2: CanInsertInSingleQuery<__DB>,
    T3: CanInsertInSingleQuery<__DB>, T4: CanInsertInSingleQuery<__DB>,
    T5: CanInsertInSingleQuery<__DB>, T6: CanInsertInSingleQuery<__DB>,
    T7: CanInsertInSingleQuery<__DB>, T8: CanInsertInSingleQuery<__DB>,
    T9: CanInsertInSingleQuery<__DB>, T10: CanInsertInSingleQuery<__DB>,
    T11: CanInsertInSingleQuery<__DB>, T12: CanInsertInSingleQuery<__DB>,
    T13: CanInsertInSingleQuery<__DB>, T14: CanInsertInSingleQuery<__DB>,
    T15: CanInsertInSingleQuery<__DB> {
    fn rows_to_insert(&self) -> Option<usize> {
        if true {
            match (&self.0.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.1.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.2.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.3.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.4.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.5.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.6.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.7.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.8.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.9.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.10.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.11.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.12.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.13.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.14.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        if true {
            match (&self.15.rows_to_insert(), &Some(1)) {
                (left_val, right_val) => {
                    if !(*left_val == *right_val) {
                        let kind = ::core::panicking::AssertKind::Eq;
                        ::core::panicking::assert_failed(kind, &*left_val,
                            &*right_val, ::core::option::Option::None);
                    }
                }
            };
        };
        Some(1)
    }
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ST,
    ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13, ST14,
    ST15, Tab> Insertable<Tab> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: Insertable<Tab, Values = ValuesClause<ST, Tab>>,
    T1: Insertable<Tab, Values = ValuesClause<ST1, Tab>>,
    T2: Insertable<Tab, Values = ValuesClause<ST2, Tab>>,
    T3: Insertable<Tab, Values = ValuesClause<ST3, Tab>>,
    T4: Insertable<Tab, Values = ValuesClause<ST4, Tab>>,
    T5: Insertable<Tab, Values = ValuesClause<ST5, Tab>>,
    T6: Insertable<Tab, Values = ValuesClause<ST6, Tab>>,
    T7: Insertable<Tab, Values = ValuesClause<ST7, Tab>>,
    T8: Insertable<Tab, Values = ValuesClause<ST8, Tab>>,
    T9: Insertable<Tab, Values = ValuesClause<ST9, Tab>>,
    T10: Insertable<Tab, Values = ValuesClause<ST10, Tab>>,
    T11: Insertable<Tab, Values = ValuesClause<ST11, Tab>>,
    T12: Insertable<Tab, Values = ValuesClause<ST12, Tab>>,
    T13: Insertable<Tab, Values = ValuesClause<ST13, Tab>>,
    T14: Insertable<Tab, Values = ValuesClause<ST14, Tab>>,
    T15: Insertable<Tab, Values = ValuesClause<ST15, Tab>> {
    type Values =
        ValuesClause<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10,
        ST11, ST12, ST13, ST14, ST15), Tab>;
    fn values(self) -> Self::Values {
        ValuesClause::new((self.0.values().values, self.1.values().values,
                self.2.values().values, self.3.values().values,
                self.4.values().values, self.5.values().values,
                self.6.values().values, self.7.values().values,
                self.8.values().values, self.9.values().values,
                self.10.values().values, self.11.values().values,
                self.12.values().values, self.13.values().values,
                self.14.values().values, self.15.values().values))
    }
}
impl<'a, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    Tab> Insertable<Tab> for
    &'a (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where
    (&'a T, &'a T1, &'a T2, &'a T3, &'a T4, &'a T5, &'a T6, &'a T7, &'a T8,
    &'a T9, &'a T10, &'a T11, &'a T12, &'a T13, &'a T14,
    &'a T15): Insertable<Tab> {
    type Values =
        <(&'a T, &'a T1, &'a T2, &'a T3, &'a T4, &'a T5, &'a T6, &'a T7,
        &'a T8, &'a T9, &'a T10, &'a T11, &'a T12, &'a T13, &'a T14, &'a T15)
        as Insertable<Tab>>::Values;
    fn values(self) -> Self::Values {
        (&self.0, &self.1, &self.2, &self.3, &self.4, &self.5, &self.6,
                &self.7, &self.8, &self.9, &self.10, &self.11, &self.12,
                &self.13, &self.14, &self.15).values()
    }
}
#[allow(unused_assignments)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, Tab,
    __DB> InsertValues<__DB, Tab> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where Tab: Table, __DB: Backend, T: InsertValues<__DB, Tab>,
    T1: InsertValues<__DB, Tab>, T2: InsertValues<__DB, Tab>,
    T3: InsertValues<__DB, Tab>, T4: InsertValues<__DB, Tab>,
    T5: InsertValues<__DB, Tab>, T6: InsertValues<__DB, Tab>,
    T7: InsertValues<__DB, Tab>, T8: InsertValues<__DB, Tab>,
    T9: InsertValues<__DB, Tab>, T10: InsertValues<__DB, Tab>,
    T11: InsertValues<__DB, Tab>, T12: InsertValues<__DB, Tab>,
    T13: InsertValues<__DB, Tab>, T14: InsertValues<__DB, Tab>,
    T15: InsertValues<__DB, Tab> {
    fn column_names(&self, mut out: AstPass<'_, '_, __DB>)
        -> QueryResult<()> {
        let mut needs_comma = false;
        let noop_element = self.0.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.0.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.1.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.1.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.2.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.2.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.3.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.3.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.4.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.4.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.5.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.5.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.6.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.6.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.7.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.7.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.8.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.8.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.9.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.9.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.10.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.10.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.11.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.11.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.12.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.12.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.13.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.13.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.14.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.14.column_names(out.reborrow())?;
            needs_comma = true;
        }
        let noop_element = self.15.is_noop(out.backend())?;
        if !noop_element {
            if needs_comma { out.push_sql(", "); }
            self.15.column_names(out.reborrow())?;
            needs_comma = true;
        }
        Ok(())
    }
}
impl<__T, ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
    ST13, ST14, ST15, Tab> Insertable<Tab> for
    InsertableOptionHelper<__T,
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15)> where __T: Insertable<Tab>, __T::Values: Default {
    type Values = __T::Values;
    fn values(self) -> Self::Values {
        self.0.map(|v| v.values()).unwrap_or_default()
    }
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, QS>
    SelectableExpression<QS> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: SelectableExpression<QS>, T1: SelectableExpression<QS>,
    T2: SelectableExpression<QS>, T3: SelectableExpression<QS>,
    T4: SelectableExpression<QS>, T5: SelectableExpression<QS>,
    T6: SelectableExpression<QS>, T7: SelectableExpression<QS>,
    T8: SelectableExpression<QS>, T9: SelectableExpression<QS>,
    T10: SelectableExpression<QS>, T11: SelectableExpression<QS>,
    T12: SelectableExpression<QS>, T13: SelectableExpression<QS>,
    T14: SelectableExpression<QS>, T15: SelectableExpression<QS>,
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15): AppearsOnTable<QS> {}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, QS>
    AppearsOnTable<QS> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: AppearsOnTable<QS>, T1: AppearsOnTable<QS>,
    T2: AppearsOnTable<QS>, T3: AppearsOnTable<QS>, T4: AppearsOnTable<QS>,
    T5: AppearsOnTable<QS>, T6: AppearsOnTable<QS>, T7: AppearsOnTable<QS>,
    T8: AppearsOnTable<QS>, T9: AppearsOnTable<QS>, T10: AppearsOnTable<QS>,
    T11: AppearsOnTable<QS>, T12: AppearsOnTable<QS>, T13: AppearsOnTable<QS>,
    T14: AppearsOnTable<QS>, T15: AppearsOnTable<QS>,
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15): Expression {
}
#[doc(hidden)]
impl<Target, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15> AsChangeset for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: AsChangeset<Target = Target>, T1: AsChangeset<Target = Target>,
    T2: AsChangeset<Target = Target>, T3: AsChangeset<Target = Target>,
    T4: AsChangeset<Target = Target>, T5: AsChangeset<Target = Target>,
    T6: AsChangeset<Target = Target>, T7: AsChangeset<Target = Target>,
    T8: AsChangeset<Target = Target>, T9: AsChangeset<Target = Target>,
    T10: AsChangeset<Target = Target>, T11: AsChangeset<Target = Target>,
    T12: AsChangeset<Target = Target>, T13: AsChangeset<Target = Target>,
    T14: AsChangeset<Target = Target>, T15: AsChangeset<Target = Target>,
    Target: QuerySource {
    type Target = Target;
    type Changeset =
        (T::Changeset, T1::Changeset, T2::Changeset, T3::Changeset,
        T4::Changeset, T5::Changeset, T6::Changeset, T7::Changeset,
        T8::Changeset, T9::Changeset, T10::Changeset, T11::Changeset,
        T12::Changeset, T13::Changeset, T14::Changeset, T15::Changeset);
    fn as_changeset(self) -> Self::Changeset {
        (self.0.as_changeset(), self.1.as_changeset(), self.2.as_changeset(),
            self.3.as_changeset(), self.4.as_changeset(),
            self.5.as_changeset(), self.6.as_changeset(),
            self.7.as_changeset(), self.8.as_changeset(),
            self.9.as_changeset(), self.10.as_changeset(),
            self.11.as_changeset(), self.12.as_changeset(),
            self.13.as_changeset(), self.14.as_changeset(),
            self.15.as_changeset())
    }
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    Parent> BelongsTo<Parent> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: BelongsTo<Parent> {
    type ForeignKey = T::ForeignKey;
    type ForeignKeyColumn = T::ForeignKeyColumn;
    fn foreign_key(&self) -> Option<&Self::ForeignKey> {
        self.0.foreign_key()
    }
    fn foreign_key_column() -> Self::ForeignKeyColumn {
        T::foreign_key_column()
    }
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    Next> TupleAppend<Next> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) {
    type Output =
        (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
        Next);
    #[allow(non_snake_case)]
    fn tuple_append(self, next: Next) -> Self::Output {
        let (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
                T15) = self;
        (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
            next)
    }
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
    SqlType for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: SqlType, T1: SqlType, T2: SqlType, T3: SqlType, T4: SqlType,
    T5: SqlType, T6: SqlType, T7: SqlType, T8: SqlType, T9: SqlType,
    T10: SqlType, T11: SqlType, T12: SqlType, T13: SqlType, T14: SqlType,
    T15: SqlType, T1::IsNull: OneIsNullable<T::IsNull>,
    T2::IsNull: OneIsNullable<<T1::IsNull as OneIsNullable<T::IsNull>>::Out>,
    T3::IsNull: OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as OneIsNullable<T::IsNull>>::Out>>::Out>,
    T4::IsNull: OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>,
    T5::IsNull: OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>,
    T6::IsNull: OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T7::IsNull: OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T8::IsNull: OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T9::IsNull: OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T10::IsNull: OneIsNullable<<T9::IsNull as
    OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T11::IsNull: OneIsNullable<<T10::IsNull as
    OneIsNullable<<T9::IsNull as
    OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T12::IsNull: OneIsNullable<<T11::IsNull as
    OneIsNullable<<T10::IsNull as
    OneIsNullable<<T9::IsNull as
    OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T13::IsNull: OneIsNullable<<T12::IsNull as
    OneIsNullable<<T11::IsNull as
    OneIsNullable<<T10::IsNull as
    OneIsNullable<<T9::IsNull as
    OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T14::IsNull: OneIsNullable<<T13::IsNull as
    OneIsNullable<<T12::IsNull as
    OneIsNullable<<T11::IsNull as
    OneIsNullable<<T10::IsNull as
    OneIsNullable<<T9::IsNull as
    OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>,
    T15::IsNull: OneIsNullable<<T14::IsNull as
    OneIsNullable<<T13::IsNull as
    OneIsNullable<<T12::IsNull as
    OneIsNullable<<T11::IsNull as
    OneIsNullable<<T10::IsNull as
    OneIsNullable<<T9::IsNull as
    OneIsNullable<<T8::IsNull as
    OneIsNullable<<T7::IsNull as
    OneIsNullable<<T6::IsNull as
    OneIsNullable<<T5::IsNull as
    OneIsNullable<<T4::IsNull as
    OneIsNullable<<T3::IsNull as
    OneIsNullable<<T2::IsNull as
    OneIsNullable<<T1::IsNull as
    OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>
    {
    type IsNull =
        <T15::IsNull as
        OneIsNullable<<T14::IsNull as
        OneIsNullable<<T13::IsNull as
        OneIsNullable<<T12::IsNull as
        OneIsNullable<<T11::IsNull as
        OneIsNullable<<T10::IsNull as
        OneIsNullable<<T9::IsNull as
        OneIsNullable<<T8::IsNull as
        OneIsNullable<<T7::IsNull as
        OneIsNullable<<T6::IsNull as
        OneIsNullable<<T5::IsNull as
        OneIsNullable<<T4::IsNull as
        OneIsNullable<<T3::IsNull as
        OneIsNullable<<T2::IsNull as
        OneIsNullable<<T1::IsNull as
        OneIsNullable<T::IsNull>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out>>::Out;
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB, ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
    ST13, ST14, ST15>
    Queryable<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11,
    ST12, ST13, ST14, ST15), __DB> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where __DB: Backend,
    Self: FromStaticSqlRow<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9,
    ST10, ST11, ST12, ST13, ST14, ST15), __DB> {
    type Row = Self;
    fn build(row: Self::Row) -> deserialize::Result<Self> { Ok(row) }
}
impl<__T, ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
    ST13, ST14, ST15, __DB>
    FromStaticSqlRow<Nullable<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8,
    ST9, ST10, ST11, ST12, ST13, ST14, ST15)>, __DB> for Option<__T> where
    __DB: Backend,
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15): SqlType,
    __T: FromSqlRow<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10,
    ST11, ST12, ST13, ST14, ST15), __DB> {
    #[allow(non_snake_case, unused_variables, unused_mut)]
    fn build_from_row<'a>(row: &impl Row<'a, __DB>)
        -> deserialize::Result<Self> {
        match <__T as
                    FromSqlRow<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9,
                    ST10, ST11, ST12, ST13, ST14, ST15),
                    __DB>>::build_from_row(row) {
            Ok(v) => Ok(Some(v)),
            Err(e) if e.is::<crate::result::UnexpectedNullError>() =>
                Ok(None),
            Err(e) => Err(e),
        }
    }
}
impl<__T, __DB, ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11,
    ST12, ST13, ST14, ST15>
    Queryable<Nullable<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10,
    ST11, ST12, ST13, ST14, ST15)>, __DB> for Option<__T> where __DB: Backend,
    Self: FromStaticSqlRow<Nullable<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7,
    ST8, ST9, ST10, ST11, ST12, ST13, ST14, ST15)>, __DB>,
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15): SqlType {
    type Row = Self;
    fn build(row: Self::Row) -> deserialize::Result<Self> { Ok(row) }
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
    TupleSize for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where T: TupleSize, T1: TupleSize, T2: TupleSize, T3: TupleSize,
    T4: TupleSize, T5: TupleSize, T6: TupleSize, T7: TupleSize, T8: TupleSize,
    T9: TupleSize, T10: TupleSize, T11: TupleSize, T12: TupleSize,
    T13: TupleSize, T14: TupleSize, T15: TupleSize {
    const SIZE: usize =
        T::SIZE + T1::SIZE + T2::SIZE + T3::SIZE + T4::SIZE + T5::SIZE +
                                                    T6::SIZE + T7::SIZE + T8::SIZE + T9::SIZE + T10::SIZE +
                                T11::SIZE + T12::SIZE + T13::SIZE + T14::SIZE + T15::SIZE +
            0;
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
    TupleSize for
    Nullable<(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15)> where T: TupleSize, T1: TupleSize, T2: TupleSize, T3: TupleSize,
    T4: TupleSize, T5: TupleSize, T6: TupleSize, T7: TupleSize, T8: TupleSize,
    T9: TupleSize, T10: TupleSize, T11: TupleSize, T12: TupleSize,
    T13: TupleSize, T14: TupleSize, T15: TupleSize,
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
    T15): SqlType {
    const SIZE: usize =
        T::SIZE + T1::SIZE + T2::SIZE + T3::SIZE + T4::SIZE + T5::SIZE +
                                                    T6::SIZE + T7::SIZE + T8::SIZE + T9::SIZE + T10::SIZE +
                                T11::SIZE + T12::SIZE + T13::SIZE + T14::SIZE + T15::SIZE +
            0;
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB>
    QueryMetadata<(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
    T14, T15)> for __DB where __DB: Backend, __DB: QueryMetadata<T>,
    __DB: QueryMetadata<T1>, __DB: QueryMetadata<T2>, __DB: QueryMetadata<T3>,
    __DB: QueryMetadata<T4>, __DB: QueryMetadata<T5>, __DB: QueryMetadata<T6>,
    __DB: QueryMetadata<T7>, __DB: QueryMetadata<T8>, __DB: QueryMetadata<T9>,
    __DB: QueryMetadata<T10>, __DB: QueryMetadata<T11>,
    __DB: QueryMetadata<T12>, __DB: QueryMetadata<T13>,
    __DB: QueryMetadata<T14>, __DB: QueryMetadata<T15> {
    fn row_metadata(lookup: &mut Self::MetadataLookup,
        row: &mut Vec<Option<__DB::TypeMetadata>>) {
        <__DB as QueryMetadata<T>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T1>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T2>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T3>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T4>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T5>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T6>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T7>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T8>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T9>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T10>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T11>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T12>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T13>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T14>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T15>>::row_metadata(lookup, row);
    }
}
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB>
    QueryMetadata<Nullable<(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
    T12, T13, T14, T15)>> for __DB where __DB: Backend,
    __DB: QueryMetadata<T>, __DB: QueryMetadata<T1>, __DB: QueryMetadata<T2>,
    __DB: QueryMetadata<T3>, __DB: QueryMetadata<T4>, __DB: QueryMetadata<T5>,
    __DB: QueryMetadata<T6>, __DB: QueryMetadata<T7>, __DB: QueryMetadata<T8>,
    __DB: QueryMetadata<T9>, __DB: QueryMetadata<T10>,
    __DB: QueryMetadata<T11>, __DB: QueryMetadata<T12>,
    __DB: QueryMetadata<T13>, __DB: QueryMetadata<T14>,
    __DB: QueryMetadata<T15> {
    fn row_metadata(lookup: &mut Self::MetadataLookup,
        row: &mut Vec<Option<__DB::TypeMetadata>>) {
        <__DB as QueryMetadata<T>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T1>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T2>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T3>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T4>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T5>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T6>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T7>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T8>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T9>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T10>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T11>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T12>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T13>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T14>>::row_metadata(lookup, row);
        <__DB as QueryMetadata<T15>>::row_metadata(lookup, row);
    }
}
#[doc(hidden)]
impl<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    __DB> deserialize::QueryableByName<__DB> for
    (T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where __DB: Backend, T: deserialize::QueryableByName<__DB>,
    T1: deserialize::QueryableByName<__DB>,
    T2: deserialize::QueryableByName<__DB>,
    T3: deserialize::QueryableByName<__DB>,
    T4: deserialize::QueryableByName<__DB>,
    T5: deserialize::QueryableByName<__DB>,
    T6: deserialize::QueryableByName<__DB>,
    T7: deserialize::QueryableByName<__DB>,
    T8: deserialize::QueryableByName<__DB>,
    T9: deserialize::QueryableByName<__DB>,
    T10: deserialize::QueryableByName<__DB>,
    T11: deserialize::QueryableByName<__DB>,
    T12: deserialize::QueryableByName<__DB>,
    T13: deserialize::QueryableByName<__DB>,
    T14: deserialize::QueryableByName<__DB>,
    T15: deserialize::QueryableByName<__DB> {
    fn build<'a>(row: &impl NamedRow<'a, __DB>) -> deserialize::Result<Self> {
        Ok((<T as deserialize::QueryableByName<__DB>>::build(row)?,
                <T1 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T2 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T3 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T4 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T5 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T6 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T7 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T8 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T9 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T10 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T11 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T12 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T13 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T14 as deserialize::QueryableByName<__DB>>::build(row)?,
                <T15 as deserialize::QueryableByName<__DB>>::build(row)?))
    }
}
#[diagnostic::do_not_recommend]
impl<__T, ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
    ST13, ST14, ST15, __DB> CompatibleType<__T, __DB> for
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15) where __DB: Backend,
    __T: FromSqlRow<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10,
    ST11, ST12, ST13, ST14, ST15), __DB> {
    type SqlType = Self;
}
impl<__T, ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
    ST13, ST14, ST15, __DB> CompatibleType<Option<__T>, __DB> for
    Nullable<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11,
    ST12, ST13, ST14, ST15)> where __DB: Backend,
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15): CompatibleType<__T, __DB> {
    type SqlType =
        Nullable<<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10,
        ST11, ST12, ST13, ST14, ST15) as CompatibleType<__T, __DB>>::SqlType>;
}
impl<ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15> SqlTypeOrSelectable for
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15) where ST: SqlTypeOrSelectable, ST1: SqlTypeOrSelectable,
    ST2: SqlTypeOrSelectable, ST3: SqlTypeOrSelectable,
    ST4: SqlTypeOrSelectable, ST5: SqlTypeOrSelectable,
    ST6: SqlTypeOrSelectable, ST7: SqlTypeOrSelectable,
    ST8: SqlTypeOrSelectable, ST9: SqlTypeOrSelectable,
    ST10: SqlTypeOrSelectable, ST11: SqlTypeOrSelectable,
    ST12: SqlTypeOrSelectable, ST13: SqlTypeOrSelectable,
    ST14: SqlTypeOrSelectable, ST15: SqlTypeOrSelectable {}
impl<ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15> SqlTypeOrSelectable for
    Nullable<(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11,
    ST12, ST13, ST14, ST15)> where
    (ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12, ST13,
    ST14, ST15): SqlTypeOrSelectable {}diesel_derives::__diesel_for_each_tuple!(tuple_impls);