Skip to main content

diesel_derives/
sql_function.rs

1use proc_macro2::Span;
2use proc_macro2::TokenStream;
3use quote::ToTokens;
4use quote::TokenStreamExt;
5use quote::format_ident;
6use quote::quote;
7use std::iter;
8use syn::parse::{Parse, ParseStream, Result};
9use syn::punctuated::Pair;
10use syn::punctuated::Punctuated;
11use syn::spanned::Spanned;
12use syn::{
13    Attribute, GenericArgument, Generics, Ident, ImplGenerics, LitStr, PathArguments, Token, Type,
14    TypeGenerics, parenthesized, parse_quote,
15};
16use syn::{GenericParam, Meta};
17use syn::{LitBool, Path};
18use syn::{LitInt, MetaNameValue};
19
20use crate::attrs::{AttributeSpanWrapper, MySpanned};
21use crate::util::parse_eq;
22
23const VARIADIC_VARIANTS_DEFAULT: usize = 2;
24const VARIADIC_ARG_COUNT_ENV: Option<&str> = ::core::option::Option::None::<&'static str>option_env!("DIESEL_VARIADIC_FUNCTION_ARGS");
25
26pub(crate) fn expand(
27    input: Vec<SqlFunctionDecl>,
28    legacy_helper_type_and_module: bool,
29    generate_return_type_helpers: bool,
30) -> TokenStream {
31    let mut result = TokenStream::new();
32    let mut return_type_helper_module_paths = ::alloc::vec::Vec::new()vec![];
33
34    for decl in input {
35        let expanded = expand_one(
36            decl,
37            legacy_helper_type_and_module,
38            generate_return_type_helpers,
39        );
40        let expanded = match expanded {
41            Err(err) => err.into_compile_error(),
42            Ok(expanded) => {
43                if let Some(return_type_helper_module_path) =
44                    expanded.return_type_helper_module_path
45                {
46                    return_type_helper_module_paths.push(return_type_helper_module_path);
47                }
48
49                expanded.tokens
50            }
51        };
52
53        result.append_all(expanded);
54    }
55
56    if !generate_return_type_helpers {
57        return result;
58    }
59
60    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&result, &mut _s);
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "unused_imports");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "hidden");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "mod");
    ::quote::__private::push_ident(&mut _s, "return_type_helpers");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut return_type_helper_module_paths, i) =
                    return_type_helper_module_paths.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let return_type_helper_module_paths =
                        match return_type_helper_module_paths.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "doc");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "inline");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "pub");
                    ::quote::__private::push_ident(&mut _s, "use");
                    ::quote::__private::push_ident(&mut _s, "super");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type_helper_module_paths,
                        &mut _s);
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_star(&mut _s);
                    ::quote::__private::push_semi(&mut _s);
                }
            }
            _s
        });
    _s
}quote! {
61        #result
62
63        #[allow(unused_imports)]
64        #[doc(hidden)]
65        mod return_type_helpers {
66            #(
67                #[doc(inline)]
68                pub use super:: #return_type_helper_module_paths ::*;
69            )*
70        }
71    }
72}
73
74struct ExpandedSqlFunction {
75    tokens: TokenStream,
76    return_type_helper_module_path: Option<Path>,
77}
78
79fn expand_one(
80    mut input: SqlFunctionDecl,
81    legacy_helper_type_and_module: bool,
82    generate_return_type_helpers: bool,
83) -> syn::Result<ExpandedSqlFunction> {
84    let attributes = &mut input.attributes;
85
86    let variadic_argument_count = attributes.iter().find_map(|attr| {
87        if let SqlFunctionAttribute::Variadic {
88            count: number,
89            skip_zero_arg_variant: flag,
90            ..
91        } = &attr.item
92        {
93            Some((number.base10_parse(), number.span(), flag.value))
94        } else {
95            None
96        }
97    });
98
99    let Some((variadic_argument_count, variadic_span, non_zero_variadic)) = variadic_argument_count
100    else {
101        let sql_name = parse_sql_name_attr(&mut input);
102
103        return expand_nonvariadic(
104            input,
105            sql_name,
106            legacy_helper_type_and_module,
107            generate_return_type_helpers,
108        );
109    };
110
111    let variadic_argument_count = variadic_argument_count?;
112    let start_idx = if non_zero_variadic { 1 } else { 0 };
113
114    let variadic_variants = VARIADIC_ARG_COUNT_ENV
115        .and_then(|arg_count| arg_count.parse::<usize>().ok())
116        .unwrap_or(VARIADIC_VARIANTS_DEFAULT);
117
118    let mut result = TokenStream::new();
119    let mut helper_type_modules = ::alloc::vec::Vec::new()vec![];
120    for variant_no in start_idx..=variadic_variants {
121        let expanded = expand_variadic(
122            input.clone(),
123            legacy_helper_type_and_module,
124            generate_return_type_helpers,
125            variadic_argument_count,
126            variant_no,
127            variadic_span,
128        )?;
129
130        if let Some(return_type_helper_module_path) = expanded.return_type_helper_module_path {
131            helper_type_modules.push(return_type_helper_module_path);
132        }
133
134        result.append_all(expanded.tokens);
135    }
136
137    if generate_return_type_helpers {
138        let return_types_module_name = Ident::new(
139            &::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("__{0}_return_types",
                input.fn_name))
    })format!("__{}_return_types", input.fn_name),
140            input.fn_name.span(),
141        );
142        let result = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&result, &mut _s);
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "unused_imports");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "inline");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "mod");
    ::quote::ToTokens::to_tokens(&return_types_module_name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut helper_type_modules, i) =
                    helper_type_modules.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let helper_type_modules =
                        match helper_type_modules.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "doc");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "inline");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "pub");
                    ::quote::__private::push_ident(&mut _s, "use");
                    ::quote::__private::push_ident(&mut _s, "super");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::ToTokens::to_tokens(&helper_type_modules, &mut _s);
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_star(&mut _s);
                    ::quote::__private::push_semi(&mut _s);
                }
            }
            _s
        });
    _s
}quote! {
143            #result
144
145            #[allow(unused_imports)]
146            #[doc(inline)]
147            mod #return_types_module_name {
148                #(
149                    #[doc(inline)]
150                    pub use super:: #helper_type_modules ::*;
151                )*
152            }
153        };
154
155        let return_type_helper_module_path = Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::ToTokens::to_tokens(&return_types_module_name, &mut _s);
        _s
    })parse_quote! {
156            #return_types_module_name
157        });
158
159        Ok(ExpandedSqlFunction {
160            tokens: result,
161            return_type_helper_module_path,
162        })
163    } else {
164        Ok(ExpandedSqlFunction {
165            tokens: result,
166            return_type_helper_module_path: None,
167        })
168    }
169}
170
171fn expand_variadic(
172    mut input: SqlFunctionDecl,
173    legacy_helper_type_and_module: bool,
174    generate_return_type_helpers: bool,
175    variadic_argument_count: usize,
176    variant_no: usize,
177    variadic_span: Span,
178) -> syn::Result<ExpandedSqlFunction> {
179    add_variadic_doc_comments(&mut input.attributes, &input.fn_name.to_string());
180
181    let sql_name = parse_sql_name_attr(&mut input);
182
183    input.fn_name = match ::quote::__private::IdentFragmentAdapter(&input.fn_name) {
    arg =>
        match ::quote::__private::IdentFragmentAdapter(&variant_no) {
            arg =>
                ::quote::__private::mk_ident(&::alloc::__export::must_use({
                                ::alloc::fmt::format(format_args!("{0}_{1}", arg, arg))
                            }),
                    ::quote::__private::Option::None.or(arg.span()).or(arg.span())),
        },
}format_ident!("{}_{}", input.fn_name, variant_no);
184
185    let nonvariadic_args_count = input
186        .args
187        .len()
188        .checked_sub(variadic_argument_count)
189        .ok_or_else(|| {
190            syn::Error::new(
191                variadic_span,
192                "invalid variadic argument count: not enough function arguments",
193            )
194        })?;
195
196    let mut variadic_generic_indexes = ::alloc::vec::Vec::new()vec![];
197    let mut arguments_with_generic_types = ::alloc::vec::Vec::new()vec![];
198    for (arg_idx, arg) in input.args.iter().skip(nonvariadic_args_count).enumerate() {
199        // If argument is of type that definitely cannot be a generic then we skip it.
200        let Type::Path(ty_path) = arg.ty.clone() else {
201            continue;
202        };
203        let Ok(ty_ident) = ty_path.path.require_ident() else {
204            continue;
205        };
206
207        let idx = input.generics.params.iter().position(|param| match param {
208            GenericParam::Type(type_param) => type_param.ident == *ty_ident,
209            _ => false,
210        });
211
212        if let Some(idx) = idx {
213            variadic_generic_indexes.push(idx);
214            arguments_with_generic_types.push(arg_idx);
215        }
216    }
217
218    let mut args: Vec<_> = input.args.into_pairs().collect();
219    let variadic_args = args.split_off(nonvariadic_args_count);
220    let nonvariadic_args = args;
221
222    let variadic_args: Vec<_> = iter::repeat_n(variadic_args, variant_no)
223        .enumerate()
224        .flat_map(|(arg_group_idx, arg_group)| {
225            let mut resulting_args = ::alloc::vec::Vec::new()vec![];
226
227            for (arg_idx, arg) in arg_group.into_iter().enumerate() {
228                let mut arg = arg.into_value();
229
230                arg.name = match ::quote::__private::IdentFragmentAdapter(&arg.name) {
    arg =>
        match ::quote::__private::IdentFragmentAdapter(&(arg_group_idx + 1)) {
            arg =>
                ::quote::__private::mk_ident(&::alloc::__export::must_use({
                                ::alloc::fmt::format(format_args!("{0}_{1}", arg, arg))
                            }),
                    ::quote::__private::Option::None.or(arg.span()).or(arg.span())),
        },
}format_ident!("{}_{}", arg.name, arg_group_idx + 1);
231
232                if arguments_with_generic_types.contains(&arg_idx) {
233                    let Type::Path(mut ty_path) = arg.ty.clone() else {
234                        {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("This argument should have path type as checked earlier")));
}unreachable!("This argument should have path type as checked earlier")
235                    };
236                    let Ok(ident) = ty_path.path.require_ident() else {
237                        {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("This argument should have ident type as checked earlier")));
}unreachable!("This argument should have ident type as checked earlier")
238                    };
239
240                    ty_path.path.segments[0].ident =
241                        match ::quote::__private::IdentFragmentAdapter(&ident) {
    arg =>
        match ::quote::__private::IdentFragmentAdapter(&(arg_group_idx + 1)) {
            arg =>
                ::quote::__private::mk_ident(&::alloc::__export::must_use({
                                ::alloc::fmt::format(format_args!("{0}{1}", arg, arg))
                            }),
                    ::quote::__private::Option::None.or(arg.span()).or(arg.span())),
        },
}format_ident!("{}{}", ident, arg_group_idx + 1);
242                    arg.ty = Type::Path(ty_path);
243                }
244
245                let pair = Pair::new(arg, Some(::syn::token::CommaToken![,]([Span::call_site()])));
246                resulting_args.push(pair);
247            }
248
249            resulting_args
250        })
251        .collect();
252
253    input.args = nonvariadic_args.into_iter().chain(variadic_args).collect();
254
255    let generics: Vec<_> = input.generics.params.into_pairs().collect();
256    input.generics.params = if variant_no == 0 {
257        generics
258            .into_iter()
259            .enumerate()
260            .filter_map(|(generic_idx, generic)| {
261                (!variadic_generic_indexes.contains(&generic_idx)).then_some(generic)
262            })
263            .collect()
264    } else {
265        iter::repeat_n(generics, variant_no)
266            .enumerate()
267            .flat_map(|(generic_group_idx, generic_group)| {
268                let mut resulting_generics = ::alloc::vec::Vec::new()vec![];
269
270                for (generic_idx, generic) in generic_group.into_iter().enumerate() {
271                    if !variadic_generic_indexes.contains(&generic_idx) {
272                        if generic_group_idx == 0 {
273                            resulting_generics.push(generic);
274                        }
275
276                        continue;
277                    }
278
279                    let mut generic = generic.into_value();
280
281                    if let GenericParam::Type(type_param) = &mut generic {
282                        type_param.ident =
283                            match ::quote::__private::IdentFragmentAdapter(&type_param.ident) {
    arg =>
        match ::quote::__private::IdentFragmentAdapter(&(generic_group_idx +
                        1)) {
            arg =>
                ::quote::__private::mk_ident(&::alloc::__export::must_use({
                                ::alloc::fmt::format(format_args!("{0}{1}", arg, arg))
                            }),
                    ::quote::__private::Option::None.or(arg.span()).or(arg.span())),
        },
}format_ident!("{}{}", type_param.ident, generic_group_idx + 1);
284                    } else {
285                        {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("This generic should be a type param as checked earlier")));
}unreachable!("This generic should be a type param as checked earlier")
286                    }
287
288                    let pair = Pair::new(generic, Some(::syn::token::CommaToken![,]([Span::call_site()])));
289                    resulting_generics.push(pair);
290                }
291
292                resulting_generics
293            })
294            .collect()
295    };
296
297    expand_nonvariadic(
298        input,
299        sql_name,
300        legacy_helper_type_and_module,
301        generate_return_type_helpers,
302    )
303}
304
305fn add_variadic_doc_comments(
306    attributes: &mut Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
307    fn_name: &str,
308) {
309    let doc_comments_end = attributes.len()
310        - attributes
311            .iter()
312            .rev()
313            .position(|attr| #[allow(non_exhaustive_omitted_patterns)] match &attr.item {
    SqlFunctionAttribute::Other(syn::Attribute {
        meta: Meta::NameValue(MetaNameValue { path, .. }), .. }) if
        path.is_ident("doc") => true,
    _ => false,
}matches!(&attr.item, SqlFunctionAttribute::Other(syn::Attribute{ meta: Meta::NameValue(MetaNameValue { path, .. }), ..}) if path.is_ident("doc")))
314            .unwrap_or(attributes.len());
315
316    let fn_family = ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("`{0}_0`, `{0}_1`, ... `{0}_n`",
                fn_name))
    })format!("`{fn_name}_0`, `{fn_name}_1`, ... `{fn_name}_n`");
317
318    let doc_comments: Vec<Attribute> = ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" # Variadic functions\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" This function is variadic in SQL, so there\'s a family of functions\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\" on a diesel side:\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::ToTokens::to_tokens(&fn_family, &mut _s);
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" Here, the postfix number indicates repetitions of variadic arguments.\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" To use this function, the appropriate version with the correct\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" argument count must be selected.\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" ## Controlling the generation of variadic function variants\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" By default, only variants with 0, 1, and 2 repetitions of variadic\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" arguments are generated. To generate more variants, set the\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" `DIESEL_VARIADIC_FUNCTION_ARGS` environment variable to the desired\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" number of variants.\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s, "r\"\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" For a greater convenience this environment variable can also be set\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" in a `.cargo/config.toml` file as described in the\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_eq(&mut _s);
                ::quote::__private::parse(&mut _s,
                    "r\" [cargo documentation](https://doc.rust-lang.org/cargo/reference/config.html#env).\"");
                _s
            });
        ::quote::__private::push_pound(&mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Bracket,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "doc");
                ::quote::__private::push_group(&mut _s,
                    ::quote::__private::Delimiter::Parenthesis,
                    {
                        let mut _s = ::quote::__private::TokenStream::new();
                        ::quote::__private::push_ident(&mut _s, "alias");
                        ::quote::__private::push_eq(&mut _s);
                        ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
                        _s
                    });
                _s
            });
        _s
    })parse_quote! {
319        ///
320        /// # Variadic functions
321        ///
322        /// This function is variadic in SQL, so there's a family of functions
323        /// on a diesel side:
324        ///
325        #[doc = #fn_family]
326        ///
327        /// Here, the postfix number indicates repetitions of variadic arguments.
328        /// To use this function, the appropriate version with the correct
329        /// argument count must be selected.
330        ///
331        /// ## Controlling the generation of variadic function variants
332        ///
333        /// By default, only variants with 0, 1, and 2 repetitions of variadic
334        /// arguments are generated. To generate more variants, set the
335        /// `DIESEL_VARIADIC_FUNCTION_ARGS` environment variable to the desired
336        /// number of variants.
337        ///
338        /// For a greater convenience this environment variable can also be set
339        /// in a `.cargo/config.toml` file as described in the
340        /// [cargo documentation](https://doc.rust-lang.org/cargo/reference/config.html#env).
341        #[doc(alias = #fn_name)]
342    };
343
344    for (doc_comments_end, new_attribute) in
345        (attributes.len() - doc_comments_end..).zip(doc_comments)
346    {
347        attributes.insert(
348            doc_comments_end,
349            AttributeSpanWrapper {
350                item: SqlFunctionAttribute::Other(new_attribute),
351                attribute_span: Span::mixed_site(),
352                ident_span: Span::mixed_site(),
353            },
354        );
355    }
356}
357
358fn parse_sql_name_attr(input: &mut SqlFunctionDecl) -> String {
359    input
360        .attributes
361        .iter()
362        .find_map(|attr| match attr.item {
363            SqlFunctionAttribute::SqlName { ref value, .. } => Some(value.value()),
364            _ => None,
365        })
366        .unwrap_or_else(|| input.fn_name.to_string())
367}
368
369fn expand_nonvariadic(
370    input: SqlFunctionDecl,
371    sql_name: String,
372    legacy_helper_type_and_module: bool,
373    generate_return_type_helpers: bool,
374) -> syn::Result<ExpandedSqlFunction> {
375    let SqlFunctionDecl {
376        attributes,
377        fn_token,
378        fn_name,
379        mut generics,
380        args,
381        return_type,
382    } = input;
383
384    let is_aggregate = attributes
385        .iter()
386        .any(|attr| #[allow(non_exhaustive_omitted_patterns)] match attr.item {
    SqlFunctionAttribute::Aggregate { .. } => true,
    _ => false,
}matches!(attr.item, SqlFunctionAttribute::Aggregate { .. }));
387
388    let can_be_called_directly = !function_cannot_be_called_directly(&attributes);
389
390    let skip_return_type_helper = attributes
391        .iter()
392        .any(|attr| #[allow(non_exhaustive_omitted_patterns)] match attr.item {
    SqlFunctionAttribute::SkipReturnTypeHelper { .. } => true,
    _ => false,
}matches!(attr.item, SqlFunctionAttribute::SkipReturnTypeHelper { .. }));
393
394    let window_attrs = attributes
395        .iter()
396        .filter(|a| #[allow(non_exhaustive_omitted_patterns)] match a.item {
    SqlFunctionAttribute::Window { .. } => true,
    _ => false,
}matches!(a.item, SqlFunctionAttribute::Window { .. }))
397        .cloned()
398        .collect::<Vec<_>>();
399
400    let restrictions = attributes
401        .iter()
402        .find_map(|a| match a.item {
403            SqlFunctionAttribute::Restriction {
404                ref restriction, ..
405            } => Some(restriction.clone()),
406            _ => None,
407        })
408        .unwrap_or_default();
409
410    let attributes = attributes
411        .into_iter()
412        .filter_map(|a| match a.item {
413            SqlFunctionAttribute::Other(a) => Some(a),
414            _ => None,
415        })
416        .collect::<Vec<_>>();
417
418    let (ref arg_name, ref arg_type): (Vec<_>, Vec<_>) = args
419        .iter()
420        .map(|StrictFnArg { name, ty, .. }| (name, ty))
421        .unzip();
422    let arg_struct_assign = args.iter().map(
423        |StrictFnArg {
424             name, colon_token, ..
425         }| {
426            let name2 = name.clone();
427            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::ToTokens::to_tokens(&colon_token, &mut _s);
    ::quote::ToTokens::to_tokens(&name2, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "as_expression");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        ::quote::__private::TokenStream::new());
    _s
}quote!(#name #colon_token #name2.as_expression())
428        },
429    );
430
431    let type_args = &generics
432        .type_params()
433        .map(|type_param| type_param.ident.clone())
434        .collect::<Vec<_>>();
435
436    for StrictFnArg { name, .. } in &args {
437        generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::ToTokens::to_tokens(&name, &mut _s);
        _s
    })parse_quote!(#name));
438    }
439
440    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
441    // Even if we force an empty where clause, it still won't print the where
442    // token with no bounds.
443    let where_clause = where_clause
444        .map(|w| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&w, &mut _s);
    _s
}quote!(#w))
445        .unwrap_or_else(|| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "where");
    _s
}quote!(where));
446
447    let mut generics_with_internal = generics.clone();
448    generics_with_internal
449        .params
450        .push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
451    let (impl_generics_internal, _, _) = generics_with_internal.split_for_impl();
452
453    let sql_type;
454    let numeric_derive;
455
456    if arg_name.is_empty() {
457        sql_type = None;
458        // FIXME: We can always derive once trivial bounds are stable
459        numeric_derive = None;
460    } else {
461        sql_type = Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let mut _first = true;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_name, i) = arg_name.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_name =
                        match arg_name.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    if !_first { ::quote::__private::push_comma(&mut _s); }
                    _first = false;
                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                }
            }
            _s
        });
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Expression");
    ::quote::__private::push_comma(&mut _s);
    _s
}quote!((#(#arg_name),*): Expression,));
462        numeric_derive = Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "derive");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sql_types");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "DieselNumericOps");
                    _s
                });
            _s
        });
    _s
}quote!(#[derive(diesel::sql_types::DieselNumericOps)]));
463    }
464
465    let helper_type_doc = ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("The return type of [`{0}()`](fn@{0})",
                fn_name))
    })format!("The return type of [`{fn_name}()`](fn@{fn_name})");
466    let query_fragment_impl =
467        can_be_called_directly.then_some(restrictions.generate_all_queryfragment_impls(
468            generics.clone(),
469            &ty_generics,
470            arg_name,
471            &fn_name,
472        ));
473
474    let args_iter = args.iter();
475    let mut tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expression");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "AsExpression");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Expression");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "SelectableExpression");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AppearsOnTable");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ValidGrouping");
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "query_builder");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "QueryFragment");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AstPass");
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_types");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_star(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_star(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "use");
    ::quote::__private::push_ident(&mut _s, "super");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_star(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "derive");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "Debug");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Clone");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Copy");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "query_builder");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "QueryId");
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&numeric_derive, &mut _s);
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "struct");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut args_iter, i) = args_iter.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let args_iter =
                        match args_iter.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::__private::push_ident(&mut _s, "pub");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "in");
                            ::quote::__private::push_ident(&mut _s, "super");
                            _s
                        });
                    ::quote::ToTokens::to_tokens(&args_iter, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut type_args, i) = type_args.quote_into_iter();
                let has_iter = has_iter | i;
                #[allow(unused_mut)]
                let (mut type_args, i) = type_args.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let type_args =
                        match type_args.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    let type_args =
                        match type_args.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::__private::push_ident(&mut _s, "pub");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "in");
                            ::quote::__private::push_ident(&mut _s, "super");
                            _s
                        });
                    ::quote::ToTokens::to_tokens(&type_args, &mut _s);
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "core");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "marker");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "PhantomData");
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::ToTokens::to_tokens(&type_args, &mut _s);
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_eq(&mut _s);
            ::quote::ToTokens::to_tokens(&helper_type_doc, &mut _s);
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "type");
    ::quote::__private::push_ident(&mut _s, "HelperType");
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_eq(&mut _s);
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::__private::push_lt(&mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut type_args, i) = type_args.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let type_args =
                match type_args.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&type_args, &mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        #[allow(unused_mut)]
        let (mut arg_type, i) = arg_type.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            let arg_type =
                match arg_type.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_ident(&mut _s, "AsExpression");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
            ::quote::__private::push_shr(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Expression");
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "Expression");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    ::quote::ToTokens::to_tokens(&sql_type, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "type");
            ::quote::__private::push_ident(&mut _s, "SqlType");
            ::quote::__private::push_eq(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
    ::quote::__private::push_ident(&mut _s, "SelectableExpression");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "SelectableExpression");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__DieselInternal");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "AppearsOnTable");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
    ::quote::__private::push_ident(&mut _s, "AppearsOnTable");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AppearsOnTable");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__DieselInternal");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Expression");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
    ::quote::__private::push_ident(&mut _s, "FunctionFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "where");
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backend");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backend");
    ::quote::__private::push_comma(&mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryFragment");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__DieselInternal");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "const");
            ::quote::__private::push_ident(&mut _s, "FUNCTION_NAME");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_ident(&mut _s, "str");
            ::quote::__private::push_eq(&mut _s);
            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s,
                                "unused_assignments");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "walk_arguments");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'__b");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'__b");
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "out");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "AstPass");
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'_");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'__b");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
                    ::quote::__private::push_gt(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "let");
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "needs_comma");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "false");
                    ::quote::__private::push_semi(&mut _s);
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::__private::push_ident(&mut _s, "if");
                            ::quote::__private::push_bang(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "self");
                            ::quote::__private::push_dot(&mut _s);
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_dot(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "is_noop");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "out");
                                    ::quote::__private::push_dot(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "backend");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        ::quote::__private::TokenStream::new());
                                    _s
                                });
                            ::quote::__private::push_question(&mut _s);
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Brace,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "if");
                                    ::quote::__private::push_ident(&mut _s, "needs_comma");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Brace,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::__private::push_ident(&mut _s, "out");
                                            ::quote::__private::push_dot(&mut _s);
                                            ::quote::__private::push_ident(&mut _s, "push_sql");
                                            ::quote::__private::push_group(&mut _s,
                                                ::quote::__private::Delimiter::Parenthesis,
                                                {
                                                    let mut _s = ::quote::__private::TokenStream::new();
                                                    ::quote::__private::parse(&mut _s, "\", \"");
                                                    _s
                                                });
                                            ::quote::__private::push_semi(&mut _s);
                                            _s
                                        });
                                    ::quote::__private::push_ident(&mut _s, "self");
                                    ::quote::__private::push_dot(&mut _s);
                                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                                    ::quote::__private::push_dot(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "walk_ast");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::__private::push_ident(&mut _s, "out");
                                            ::quote::__private::push_dot(&mut _s);
                                            ::quote::__private::push_ident(&mut _s, "reborrow");
                                            ::quote::__private::push_group(&mut _s,
                                                ::quote::__private::Delimiter::Parenthesis,
                                                ::quote::__private::TokenStream::new());
                                            _s
                                        });
                                    ::quote::__private::push_question(&mut _s);
                                    ::quote::__private::push_semi(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "needs_comma");
                                    ::quote::__private::push_eq(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "true");
                                    ::quote::__private::push_semi(&mut _s);
                                    _s
                                });
                        }
                    }
                    ::quote::__private::push_ident(&mut _s, "Ok");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                ::quote::__private::TokenStream::new());
                            _s
                        });
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&query_fragment_impl, &mut _s);
    _s
}quote! {
476        use diesel::{self, QueryResult};
477        use diesel::expression::{AsExpression, Expression, SelectableExpression, AppearsOnTable, ValidGrouping};
478        use diesel::query_builder::{QueryFragment, AstPass};
479        use diesel::sql_types::*;
480        use diesel::internal::sql_functions::*;
481        use super::*;
482
483        #[derive(Debug, Clone, Copy, diesel::query_builder::QueryId)]
484        #numeric_derive
485        pub struct #fn_name #ty_generics {
486            #(pub(in super) #args_iter,)*
487            #(pub(in super) #type_args: ::core::marker::PhantomData<#type_args>,)*
488        }
489
490        #[doc = #helper_type_doc]
491        pub type HelperType #ty_generics = #fn_name <
492            #(#type_args,)*
493            #(<#arg_name as AsExpression<#arg_type>>::Expression,)*
494        >;
495
496        impl #impl_generics Expression for #fn_name #ty_generics
497        #where_clause
498            #sql_type
499        {
500            type SqlType = #return_type;
501        }
502
503        // __DieselInternal is what we call QS normally
504        impl #impl_generics_internal SelectableExpression<__DieselInternal>
505            for #fn_name #ty_generics
506        #where_clause
507            #(#arg_name: SelectableExpression<__DieselInternal>,)*
508            Self: AppearsOnTable<__DieselInternal>,
509        {
510        }
511
512        // __DieselInternal is what we call QS normally
513        impl #impl_generics_internal AppearsOnTable<__DieselInternal>
514            for #fn_name #ty_generics
515        #where_clause
516            #(#arg_name: AppearsOnTable<__DieselInternal>,)*
517            Self: Expression,
518        {
519        }
520
521        impl #impl_generics_internal FunctionFragment<__DieselInternal>
522            for #fn_name #ty_generics
523        where
524            __DieselInternal: diesel::backend::Backend,
525            #(#arg_name: QueryFragment<__DieselInternal>,)*
526        {
527            const FUNCTION_NAME: &'static str = #sql_name;
528
529            #[allow(unused_assignments)]
530            fn walk_arguments<'__b>(&'__b self, mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
531                // we unroll the arguments manually here, to prevent borrow check issues
532                let mut needs_comma = false;
533                #(
534                    if !self.#arg_name.is_noop(out.backend())? {
535                        if needs_comma {
536                            out.push_sql(", ");
537                        }
538                        self.#arg_name.walk_ast(out.reborrow())?;
539                        needs_comma = true;
540                    }
541                )*
542                Ok(())
543            }
544        }
545
546        #query_fragment_impl
547    };
548
549    for window in &window_attrs {
550        tokens.extend(generate_window_function_tokens(
551            window,
552            generics.clone(),
553            &ty_generics,
554            &fn_name,
555        ));
556    }
557    if !window_attrs.is_empty() {
558        tokens.extend({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "IsWindowFunction");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "type");
            ::quote::__private::push_ident(&mut _s, "ArgTypes");
            ::quote::__private::push_eq(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote::quote! {
559            impl #impl_generics IsWindowFunction for #fn_name #ty_generics {
560                type ArgTypes = (#(#arg_name,)*);
561            }
562        });
563    }
564
565    if is_aggregate {
566        tokens = generate_tokens_for_aggregate_functions(
567            tokens,
568            &impl_generics_internal,
569            &impl_generics,
570            &fn_name,
571            &ty_generics,
572            arg_name,
573            arg_type,
574            !window_attrs.is_empty(),
575            &return_type,
576            &sql_name,
577        );
578    } else if window_attrs.is_empty() {
579        tokens = generate_tokens_for_non_aggregate_functions(
580            tokens,
581            &impl_generics_internal,
582            &fn_name,
583            &ty_generics,
584            arg_name,
585            arg_type,
586            &return_type,
587            &sql_name,
588        );
589    }
590
591    let args_iter = args.iter();
592
593    let (outside_of_module_helper_type, return_type_path, internals_module_name) =
594        if legacy_helper_type_and_module {
595            (None, {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "HelperType");
    _s
}quote! { #fn_name::HelperType }, fn_name.clone())
596        } else {
597            let internals_module_name = Ident::new(&::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}_utils", fn_name))
    })format!("{fn_name}_utils"), fn_name.span());
598            (
599                Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "non_camel_case_types");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "non_snake_case");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_eq(&mut _s);
            ::quote::ToTokens::to_tokens(&helper_type_doc, &mut _s);
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "type");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_eq(&mut _s);
    ::quote::ToTokens::to_tokens(&internals_module_name, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::__private::push_lt(&mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut type_args, i) = type_args.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let type_args =
                match type_args.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&type_args, &mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        #[allow(unused_mut)]
        let (mut arg_type, i) = arg_type.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            let arg_type =
                match arg_type.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "expression");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AsExpression");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
            ::quote::__private::push_shr(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Expression");
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
600                    #[allow(non_camel_case_types, non_snake_case)]
601                    #[doc = #helper_type_doc]
602                    pub type #fn_name #ty_generics = #internals_module_name::#fn_name <
603                        #(#type_args,)*
604                        #(<#arg_name as diesel::expression::AsExpression<#arg_type>>::Expression,)*
605                    >;
606                }),
607                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    _s
}quote! { #fn_name },
608                internals_module_name,
609            )
610        };
611
612    let (return_type_helper_module, return_type_helper_module_path) =
613        if !generate_return_type_helpers || skip_return_type_helper {
614            (None, None)
615        } else {
616            let auto_derived_types = type_args
617                .iter()
618                .map(|type_arg| {
619                    for arg in &args {
620                        let Type::Path(path) = &arg.ty else {
621                            continue;
622                        };
623
624                        let Some(path_ident) = path.path.get_ident() else {
625                            continue;
626                        };
627
628                        if path_ident == type_arg {
629                            return Ok(arg.name.clone());
630                        }
631                    }
632
633                    Err(syn::Error::new(
634                        type_arg.span(),
635                        "cannot find argument corresponding to the generic",
636                    ))
637                })
638                .collect::<Result<Vec<_>>>()?;
639
640            let arg_names_iter: Vec<_> = args.iter().map(|arg| arg.name.clone()).collect();
641
642            let return_type_module_name =
643                Ident::new(&::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("__{0}_return_type", fn_name))
    })format!("__{fn_name}_return_type"), fn_name.span());
644
645            let doc =
646                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("Return type of the [`{0}()`](fn@super::{0}) SQL function.",
                fn_name))
    })format!("Return type of the [`{fn_name}()`](fn@super::{fn_name}) SQL function.");
647            let return_type_helper_module = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "non_camel_case_types");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "non_snake_case");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "unused_imports");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "inline");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "mod");
    ::quote::ToTokens::to_tokens(&return_type_module_name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::ToTokens::to_tokens(&doc, &mut _s);
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "type");
            ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
            ::quote::__private::push_lt(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_names_iter, i) =
                    arg_names_iter.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_names_iter =
                        match arg_names_iter.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_names_iter, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_eq(&mut _s);
            ::quote::__private::push_ident(&mut _s, "super");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
            ::quote::__private::push_lt(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut auto_derived_types, i) =
                    auto_derived_types.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let auto_derived_types =
                        match auto_derived_types.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::ToTokens::to_tokens(&auto_derived_types, &mut _s);
                    ::quote::__private::push_ident(&mut _s, "as");
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "expression");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Expression");
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqlType");
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_names_iter, i) =
                    arg_names_iter.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_names_iter =
                        match arg_names_iter.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_names_iter, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
648                #[allow(non_camel_case_types, non_snake_case, unused_imports)]
649                #[doc(inline)]
650                mod #return_type_module_name {
651                    #[doc = #doc]
652                    pub type #fn_name<
653                        #(#arg_names_iter,)*
654                    > = super::#fn_name<
655                        #( <#auto_derived_types as diesel::expression::Expression>::SqlType, )*
656                        #(#arg_names_iter,)*
657                    >;
658                }
659            };
660
661            let module_path = ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::ToTokens::to_tokens(&return_type_module_name, &mut _s);
        _s
    })parse_quote!(
662                #return_type_module_name
663            );
664
665            (Some(return_type_helper_module), Some(module_path))
666        };
667
668    let tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut attributes, i) = attributes.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let attributes =
                match attributes.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&attributes, &mut _s);
        }
    }
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "non_camel_case_types");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::ToTokens::to_tokens(&fn_token, &mut _s);
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut args_iter, i) = args_iter.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let args_iter =
                        match args_iter.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&args_iter, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            _s
        });
    ::quote::__private::push_rarrow(&mut _s);
    ::quote::ToTokens::to_tokens(&return_type_path, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&where_clause, &mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        #[allow(unused_mut)]
        let (mut arg_type, i) = arg_type.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            let arg_type =
                match arg_type.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "expression");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "AsExpression");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&internals_module_name, &mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_struct_assign, i) =
                            arg_struct_assign.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_struct_assign =
                                match arg_struct_assign.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_struct_assign, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut type_args, i) = type_args.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let type_args =
                                match type_args.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&type_args, &mut _s);
                            ::quote::__private::push_colon(&mut _s);
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "core");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "marker");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "PhantomData");
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&outside_of_module_helper_type, &mut _s);
    ::quote::ToTokens::to_tokens(&return_type_helper_module, &mut _s);
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "hidden");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "non_camel_case_types");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "non_snake_case");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "unused_imports");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "crate");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "mod");
    ::quote::ToTokens::to_tokens(&internals_module_name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&tokens, &mut _s);
            _s
        });
    _s
}quote! {
669        #(#attributes)*
670        #[allow(non_camel_case_types)]
671        pub #fn_token #fn_name #impl_generics (#(#args_iter,)*)
672            -> #return_type_path #ty_generics
673        #where_clause
674            #(#arg_name: diesel::expression::AsExpression<#arg_type>,)*
675        {
676            #internals_module_name::#fn_name {
677                #(#arg_struct_assign,)*
678                #(#type_args: ::core::marker::PhantomData,)*
679            }
680        }
681
682        #outside_of_module_helper_type
683
684        #return_type_helper_module
685
686        #[doc(hidden)]
687        #[allow(non_camel_case_types, non_snake_case, unused_imports)]
688        pub(crate) mod #internals_module_name {
689            #tokens
690        }
691    };
692
693    Ok(ExpandedSqlFunction {
694        tokens,
695        return_type_helper_module_path,
696    })
697}
698
699fn generate_window_function_tokens(
700    window: &AttributeSpanWrapper<SqlFunctionAttribute>,
701    generics: Generics,
702    ty_generics: &TypeGenerics<'_>,
703    fn_name: &Ident,
704) -> TokenStream {
705    let SqlFunctionAttribute::Window {
706        restrictions,
707        require_order,
708        wrap_macro,
709        ..
710    } = &window.item
711    else {
712        {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("We filtered for window attributes above")));
}unreachable!("We filtered for window attributes above")
713    };
714    restrictions.generate_all_window_fragment_impls(
715        generics,
716        ty_generics,
717        fn_name,
718        require_order.unwrap_or_default(),
719        wrap_macro.as_ref(),
720    )
721}
722
723#[allow(clippy::too_many_arguments)]
724fn generate_tokens_for_non_aggregate_functions(
725    mut tokens: TokenStream,
726    impl_generics_internal: &syn::ImplGenerics<'_>,
727    fn_name: &syn::Ident,
728    ty_generics: &syn::TypeGenerics<'_>,
729    arg_name: &[&syn::Ident],
730    arg_type: &[&syn::Type],
731    return_type: &syn::Type,
732    sql_name: &str,
733) -> TokenStream {
734    tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tokens, &mut _s);
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "derive");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "ValidGrouping");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "struct");
    ::quote::__private::push_ident(&mut _s, "__Derived");
    ::quote::__private::push_lt(&mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_name, i) = arg_name.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_name =
                        match arg_name.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
    ::quote::__private::push_ident(&mut _s, "ValidGrouping");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "where");
    ::quote::__private::push_ident(&mut _s, "__Derived");
    ::quote::__private::push_lt(&mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "ValidGrouping");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "type");
            ::quote::__private::push_ident(&mut _s, "IsAggregate");
            ::quote::__private::push_eq(&mut _s);
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__Derived");
            ::quote::__private::push_lt(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_name, i) = arg_name.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_name =
                        match arg_name.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_ident(&mut _s, "ValidGrouping");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__DieselInternal");
            ::quote::__private::push_shr(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "IsAggregate");
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
735        #tokens
736
737        #[derive(ValidGrouping)]
738        pub struct __Derived<#(#arg_name,)*>(#(#arg_name,)*);
739
740        impl #impl_generics_internal ValidGrouping<__DieselInternal>
741            for #fn_name #ty_generics
742        where
743            __Derived<#(#arg_name,)*>: ValidGrouping<__DieselInternal>,
744        {
745            type IsAggregate = <__Derived<#(#arg_name,)*> as ValidGrouping<__DieselInternal>>::IsAggregate;
746        }
747    };
748    let (contains_none, types_for_sqlite_impl) =
749        collect_types_for_sqlite_impl(arg_type, return_type);
750
751    if !contains_none && !arg_name.is_empty() {
752        tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tokens, &mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types_for_sqlite_impl, i) =
                            types_for_sqlite_impl.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types_for_sqlite_impl =
                                match types_for_sqlite_impl.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
                                &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" Registers an implementation for this function on the given connection\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s, "r\"\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" This function must be called for every `SqliteConnection` before\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" this SQL function can be used on SQLite. The implementation must be\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" deterministic (returns the same result given the same arguments). If\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" the function is nondeterministic, call\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `register_nondeterministic_impl` instead.\"");
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "register_impl");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_comma(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_name, i) = arg_name.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_name =
                        match arg_name.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sqlite");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqliteConnection");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "f");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "F");
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "result");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "where");
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Fn");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Send");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FromSqlRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_type, i) = arg_type.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_type =
                                match arg_type.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_type, i) = arg_type.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_type =
                                match arg_type.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ToSql");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "register_sql_function");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut arg_type, i) = arg_type.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let arg_type =
                                        match arg_type.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                                    ::quote::__private::push_comma(&mut _s);
                                }
                            }
                            _s
                        });
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "true");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "move");
                            ::quote::__private::push_or(&mut _s);
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    {
                                        use ::quote::__private::ext::*;
                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                        #[allow(unused_mut)]
                                        let (mut arg_name, i) = arg_name.quote_into_iter();
                                        let has_iter = has_iter | i;
                                        <_ as
                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                        while true {
                                            let arg_name =
                                                match arg_name.next() {
                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                    None => break,
                                                };
                                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                                            ::quote::__private::push_comma(&mut _s);
                                        }
                                    }
                                    _s
                                });
                            ::quote::__private::push_or(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "f");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    {
                                        use ::quote::__private::ext::*;
                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                        #[allow(unused_mut)]
                                        let (mut arg_name, i) = arg_name.quote_into_iter();
                                        let has_iter = has_iter | i;
                                        <_ as
                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                        while true {
                                            let arg_name =
                                                match arg_name.next() {
                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                    None => break,
                                                };
                                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                                            ::quote::__private::push_comma(&mut _s);
                                        }
                                    }
                                    _s
                                });
                            ::quote::__private::push_comma(&mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types_for_sqlite_impl, i) =
                            types_for_sqlite_impl.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types_for_sqlite_impl =
                                match types_for_sqlite_impl.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
                                &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" Registers an implementation for this function on the given connection\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s, "r\"\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" This function must be called for every `SqliteConnection` before\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" this SQL function can be used on SQLite.\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `register_nondeterministic_impl` should only be used if your\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" function can return different results with the same arguments (e.g.\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `random`). If your function is deterministic, you should call\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `register_impl` instead.\"");
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s,
                "register_nondeterministic_impl");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_comma(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_name, i) = arg_name.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_name =
                        match arg_name.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sqlite");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqliteConnection");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "f");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "F");
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "result");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "where");
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FnMut");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Send");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FromSqlRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_type, i) = arg_type.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_type =
                                match arg_type.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_type, i) = arg_type.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_type =
                                match arg_type.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ToSql");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "register_sql_function");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut arg_type, i) = arg_type.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let arg_type =
                                        match arg_type.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                                    ::quote::__private::push_comma(&mut _s);
                                }
                            }
                            _s
                        });
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "false");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "move");
                            ::quote::__private::push_or(&mut _s);
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    {
                                        use ::quote::__private::ext::*;
                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                        #[allow(unused_mut)]
                                        let (mut arg_name, i) = arg_name.quote_into_iter();
                                        let has_iter = has_iter | i;
                                        <_ as
                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                        while true {
                                            let arg_name =
                                                match arg_name.next() {
                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                    None => break,
                                                };
                                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                                            ::quote::__private::push_comma(&mut _s);
                                        }
                                    }
                                    _s
                                });
                            ::quote::__private::push_or(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "f");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    {
                                        use ::quote::__private::ext::*;
                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                        #[allow(unused_mut)]
                                        let (mut arg_name, i) = arg_name.quote_into_iter();
                                        let has_iter = has_iter | i;
                                        <_ as
                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                        while true {
                                            let arg_name =
                                                match arg_name.next() {
                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                    None => break,
                                                };
                                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                                            ::quote::__private::push_comma(&mut _s);
                                        }
                                    }
                                    _s
                                });
                            ::quote::__private::push_comma(&mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
753            #tokens
754
755            diesel::internal::sql_functions::expand_sqlite_function!{
756                [#(#types_for_sqlite_impl,)*],
757
758                #[allow(dead_code)]
759                /// Registers an implementation for this function on the given connection
760                ///
761                /// This function must be called for every `SqliteConnection` before
762                /// this SQL function can be used on SQLite. The implementation must be
763                /// deterministic (returns the same result given the same arguments). If
764                /// the function is nondeterministic, call
765                /// `register_nondeterministic_impl` instead.
766                pub fn register_impl<F, Ret, #(#arg_name,)*>(
767                    conn: &mut diesel::sqlite::SqliteConnection,
768                    f: F,
769                ) -> diesel::result::QueryResult<()>
770                where
771                    F: Fn(#(#arg_name,)*) -> Ret + ::core::panic::UnwindSafe + Send + 'static,
772                (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
773                    diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite>,
774                    Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
775                {
776                    conn.register_sql_function::<(#(#arg_type,)*), #return_type, _, _, _>(
777                        #sql_name,
778                        true,
779                        move |(#(#arg_name,)*)| f(#(#arg_name,)*),
780                    )
781                }
782            }
783            diesel::internal::sql_functions::expand_sqlite_function!{
784                [#(#types_for_sqlite_impl,)*],
785
786                #[allow(dead_code)]
787                /// Registers an implementation for this function on the given connection
788                ///
789                /// This function must be called for every `SqliteConnection` before
790                /// this SQL function can be used on SQLite.
791                /// `register_nondeterministic_impl` should only be used if your
792                /// function can return different results with the same arguments (e.g.
793                /// `random`). If your function is deterministic, you should call
794                /// `register_impl` instead.
795                pub fn register_nondeterministic_impl<F, Ret, #(#arg_name,)*>(
796                    conn: &mut diesel::sqlite::SqliteConnection,
797                    mut f: F,
798                ) -> diesel::result::QueryResult<()>
799                where
800                    F: FnMut(#(#arg_name,)*) -> Ret + ::core::panic::UnwindSafe + Send + 'static,
801                (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
802                    diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite>,
803                    Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
804                {
805                    conn.register_sql_function::<(#(#arg_type,)*), #return_type, _, _, _>(
806                        #sql_name,
807                        false,
808                        move |(#(#arg_name,)*)| f(#(#arg_name,)*),
809                    )
810                }
811            }
812        };
813    }
814
815    if !contains_none && arg_name.is_empty() {
816        tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tokens, &mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types_for_sqlite_impl, i) =
                            types_for_sqlite_impl.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types_for_sqlite_impl =
                                match types_for_sqlite_impl.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
                                &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" Registers an implementation for this function on the given connection\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s, "r\"\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" This function must be called for every `SqliteConnection` before\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" this SQL function can be used on SQLite. The implementation must be\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" deterministic (returns the same result given the same arguments). If\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" the function is nondeterministic, call\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `register_nondeterministic_impl` instead.\"");
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "register_impl");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sqlite");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqliteConnection");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "f");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "F");
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "where");
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Fn");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Send");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ToSql");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "register_noarg_sql_function");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "true");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "f");
                            ::quote::__private::push_comma(&mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types_for_sqlite_impl, i) =
                            types_for_sqlite_impl.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types_for_sqlite_impl =
                                match types_for_sqlite_impl.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
                                &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" Registers an implementation for this function on the given connection\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s, "r\"\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" This function must be called for every `SqliteConnection` before\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" this SQL function can be used on SQLite.\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `register_nondeterministic_impl` should only be used if your\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" function can return different results with the same arguments (e.g.\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `random`). If your function is deterministic, you should call\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" `register_impl` instead.\"");
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s,
                "register_nondeterministic_impl");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sqlite");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqliteConnection");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "f");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "F");
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "result");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "where");
            ::quote::__private::push_ident(&mut _s, "F");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FnMut");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Send");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ret");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ToSql");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "register_noarg_sql_function");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "false");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "f");
                            ::quote::__private::push_comma(&mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
817            #tokens
818            diesel::internal::sql_functions::expand_sqlite_function!{
819                [#(#types_for_sqlite_impl,)*],
820
821                #[allow(dead_code)]
822                /// Registers an implementation for this function on the given connection
823                ///
824                /// This function must be called for every `SqliteConnection` before
825                /// this SQL function can be used on SQLite. The implementation must be
826                /// deterministic (returns the same result given the same arguments). If
827                /// the function is nondeterministic, call
828                /// `register_nondeterministic_impl` instead.
829                pub fn register_impl<F, Ret>(
830                    conn: &diesel::sqlite::SqliteConnection,
831                    f: F,
832                ) -> QueryResult<()>
833                where
834                    F: Fn() -> Ret + ::core::panic::UnwindSafe + Send + 'static,
835                    Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
836                {
837                    conn.register_noarg_sql_function::<#return_type, _, _>(
838                        #sql_name,
839                        true,
840                        f,
841                    )
842                }
843
844            }
845            diesel::internal::sql_functions::expand_sqlite_function!{
846                [#(#types_for_sqlite_impl,)*],
847                #[allow(dead_code)]
848                /// Registers an implementation for this function on the given connection
849                ///
850                /// This function must be called for every `SqliteConnection` before
851                /// this SQL function can be used on SQLite.
852                /// `register_nondeterministic_impl` should only be used if your
853                /// function can return different results with the same arguments (e.g.
854                /// `random`). If your function is deterministic, you should call
855                /// `register_impl` instead.
856                pub fn register_nondeterministic_impl<F, Ret>(
857                    conn: &diesel::sqlite::SqliteConnection,
858                    mut f: F,
859                ) -> diesel::result::QueryResult<()>
860                where
861                    F: FnMut() -> Ret + ::core::panic::UnwindSafe + Send + 'static,
862                    Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
863                {
864                    conn.register_noarg_sql_function::<#return_type, _, _>(
865                        #sql_name,
866                        false,
867                        f,
868                    )
869                }
870            }
871        };
872    }
873    tokens
874}
875
876fn collect_types_for_sqlite_impl<'a>(
877    arg_type: &[&'a Type],
878    return_type: &'a Type,
879) -> (bool, Vec<&'a Ident>) {
880    let mut contains_none = false;
881    let types_for_sqlite_impl = std::iter::once(return_type)
882        .chain(arg_type.iter().copied())
883        .filter_map(|t| {
884            let r = is_sqlite_type(t);
885            contains_none = contains_none || r.is_none();
886            r
887        })
888        .collect::<Vec<_>>();
889    (contains_none, types_for_sqlite_impl)
890}
891
892#[allow(clippy::too_many_arguments)]
893fn generate_tokens_for_aggregate_functions(
894    mut tokens: TokenStream,
895    impl_generics_internal: &syn::ImplGenerics<'_>,
896    impl_generics: &syn::ImplGenerics<'_>,
897    fn_name: &syn::Ident,
898    ty_generics: &syn::TypeGenerics<'_>,
899    arg_name: &[&syn::Ident],
900    arg_type: &[&syn::Type],
901    is_window: bool,
902    return_type: &syn::Type,
903    sql_name: &str,
904) -> TokenStream {
905    tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tokens, &mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
    ::quote::__private::push_ident(&mut _s, "ValidGrouping");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "type");
            ::quote::__private::push_ident(&mut _s, "IsAggregate");
            ::quote::__private::push_eq(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "expression");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "is_aggregate");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Yes");
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "IsAggregateFunction");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    _s
}quote! {
906        #tokens
907
908        impl #impl_generics_internal ValidGrouping<__DieselInternal>
909            for #fn_name #ty_generics
910        {
911            type IsAggregate = diesel::expression::is_aggregate::Yes;
912        }
913
914        impl #impl_generics IsAggregateFunction for #fn_name #ty_generics {}
915    };
916
917    let (contains_none, types_for_sqlite_impl) =
918        collect_types_for_sqlite_impl(arg_type, return_type);
919    let types_for_sqlite_impl = &types_for_sqlite_impl;
920
921    // we do not support custom window functions for sqlite yet
922    if !contains_none && !is_window {
923        // tokens = quote! {
924        //     #tokens
925
926        //     diesel::internal::sql_functions::expand_sqlite_function! {
927        //         [#(#types_for_sqlite_impl,)*],
928        //         use diesel::sqlite::{Sqlite, SqliteConnection};
929        //         use diesel::serialize::ToSql;
930        //         use diesel::deserialize::{FromSqlRow, StaticallySizedRow};
931        //         use diesel::sqlite::SqliteAggregateFunction;
932        //         use diesel::sql_types::IntoNullable;
933        //     }
934        // };
935
936        match arg_name.len() {
937            x if x > 1 => {
938                tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tokens, &mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types_for_sqlite_impl, i) =
                            types_for_sqlite_impl.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types_for_sqlite_impl =
                                match types_for_sqlite_impl.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
                                &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" Registers an implementation for this aggregate function on the given connection\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s, "r\"\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" This function must be called for every `SqliteConnection` before\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" this SQL function can be used on SQLite. The implementation must be\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" deterministic (returns the same result given the same arguments).\"");
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "register_impl");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "A");
            ::quote::__private::push_comma(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut arg_name, i) = arg_name.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let arg_name =
                        match arg_name.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                }
            }
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sqlite");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqliteConnection");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "result");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "where");
            ::quote::__private::push_ident(&mut _s, "A");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s,
                "SqliteAggregateFunction");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Send");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "RefUnwindSafe");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "A");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Output");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ToSql");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_name, i) = arg_name.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_name =
                                match arg_name.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FromSqlRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_type, i) = arg_type.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_type =
                                match arg_type.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut arg_type, i) = arg_type.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let arg_type =
                                match arg_type.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "register_aggregate_function");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut arg_type, i) = arg_type.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let arg_type =
                                        match arg_type.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                                    ::quote::__private::push_comma(&mut _s);
                                }
                            }
                            _s
                        });
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "A");
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
939                    #tokens
940                    diesel::internal::sql_functions::expand_sqlite_function! {
941                        [#(#types_for_sqlite_impl,)*],
942                        #[allow(dead_code)]
943                        /// Registers an implementation for this aggregate function on the given connection
944                        ///
945                        /// This function must be called for every `SqliteConnection` before
946                        /// this SQL function can be used on SQLite. The implementation must be
947                        /// deterministic (returns the same result given the same arguments).
948                        pub fn register_impl<A, #(#arg_name,)*>(
949                            conn: &mut diesel::sqlite::SqliteConnection
950                        ) -> diesel::result::QueryResult<()>
951                        where
952                            A: diesel::sqlite::SqliteAggregateFunction<(#(#arg_name,)*)>
953                            + Send
954                            + 'static
955                            + ::core::panic::UnwindSafe
956                            + ::core::panic::RefUnwindSafe,
957                            A::Output: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
958                        (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
959                            diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
960                            ::core::panic::UnwindSafe,
961                        {
962                            conn.register_aggregate_function::<(#(#arg_type,)*), #return_type, _, _, A>(#sql_name)
963                        }
964                    }
965                };
966            }
967            1 => {
968                let arg_name = arg_name[0];
969                let arg_type = arg_type[0];
970
971                tokens = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tokens, &mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types_for_sqlite_impl, i) =
                            types_for_sqlite_impl.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types_for_sqlite_impl =
                                match types_for_sqlite_impl.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            ::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
                                &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                        }
                    }
                    _s
                });
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" Registers an implementation for this aggregate function on the given connection\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s, "r\"\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" This function must be called for every `SqliteConnection` before\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" this SQL function can be used on SQLite. The implementation must be\"");
                    _s
                });
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::__private::parse(&mut _s,
                        "r\" deterministic (returns the same result given the same arguments).\"");
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "register_impl");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "A");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "sqlite");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqliteConnection");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "result");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "where");
            ::quote::__private::push_ident(&mut _s, "A");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s,
                "SqliteAggregateFunction");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Send");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'static");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "RefUnwindSafe");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "A");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Output");
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "ToSql");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&return_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FromSqlRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "deserialize");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "diesel");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "sqlite");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Sqlite");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_add(&mut _s);
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "core");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "panic");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "UnwindSafe");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "conn");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "register_aggregate_function");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::ToTokens::to_tokens(&arg_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&return_type, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_underscore(&mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "A");
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&sql_name, &mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
972                    #tokens
973
974                    diesel::internal::sql_functions::expand_sqlite_function! {
975                        [#(#types_for_sqlite_impl,)*],
976                        #[allow(dead_code)]
977                        /// Registers an implementation for this aggregate function on the given connection
978                        ///
979                        /// This function must be called for every `SqliteConnection` before
980                        /// this SQL function can be used on SQLite. The implementation must be
981                        /// deterministic (returns the same result given the same arguments).
982                        pub fn register_impl<A, #arg_name>(
983                            conn: &mut diesel::sqlite::SqliteConnection
984                        ) -> diesel::result::QueryResult<()>
985                        where
986                            A: diesel::sqlite::SqliteAggregateFunction<#arg_name>
987                            + Send
988                            + 'static
989                            + ::core::panic::UnwindSafe
990                            + ::core::panic::RefUnwindSafe,
991                            A::Output: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
992                        #arg_name: diesel::deserialize::FromSqlRow<#arg_type, diesel::sqlite::Sqlite> +
993                            diesel::deserialize::StaticallySizedRow<#arg_type, diesel::sqlite::Sqlite> +
994                            ::core::panic::UnwindSafe,
995                        {
996                            conn.register_aggregate_function::<#arg_type, #return_type, _, _, A>(#sql_name)
997                        }
998                    }
999                };
1000            }
1001            _ => (),
1002        }
1003    }
1004    tokens
1005}
1006
1007fn function_cannot_be_called_directly(
1008    attributes: &[AttributeSpanWrapper<SqlFunctionAttribute>],
1009) -> bool {
1010    let mut has_aggregate = false;
1011    let mut has_window = false;
1012    for attr in attributes {
1013        has_aggregate =
1014            has_aggregate || #[allow(non_exhaustive_omitted_patterns)] match attr.item {
    SqlFunctionAttribute::Aggregate { .. } => true,
    _ => false,
}matches!(attr.item, SqlFunctionAttribute::Aggregate { .. });
1015        has_window = has_window || #[allow(non_exhaustive_omitted_patterns)] match attr.item {
    SqlFunctionAttribute::Window { .. } => true,
    _ => false,
}matches!(attr.item, SqlFunctionAttribute::Window { .. });
1016    }
1017    has_window && !has_aggregate
1018}
1019
1020pub(crate) struct ExternSqlBlock {
1021    pub(crate) function_decls: Vec<SqlFunctionDecl>,
1022}
1023
1024impl Parse for ExternSqlBlock {
1025    fn parse(input: ParseStream) -> Result<Self> {
1026        let mut error = None::<syn::Error>;
1027
1028        let mut combine_error = |e: syn::Error| {
1029            error = Some(
1030                error
1031                    .take()
1032                    .map(|mut o| {
1033                        o.combine(e.clone());
1034                        o
1035                    })
1036                    .unwrap_or(e),
1037            )
1038        };
1039
1040        let block = syn::ItemForeignMod::parse(input)?;
1041        if block.abi.name.as_ref().map(|n| n.value()) != Some("SQL".into()) {
1042            return Err(syn::Error::new(block.abi.span(), "expect `SQL` as ABI"));
1043        }
1044        if let Some(unsafety) = block.unsafety {
1045            return Err(syn::Error::new(
1046                unsafety.span(),
1047                "expect `SQL` function blocks to be safe",
1048            ));
1049        }
1050
1051        let parsed_block_attrs = parse_attributes(&mut combine_error, block.attrs);
1052
1053        let item_count = block.items.len();
1054        let function_decls_input = block
1055            .items
1056            .into_iter()
1057            .map(|i| syn::parse2::<SqlFunctionDecl>({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&i, &mut _s);
    _s
}quote! { #i }));
1058
1059        let mut function_decls = Vec::with_capacity(item_count);
1060        for decl in function_decls_input {
1061            match decl {
1062                Ok(mut decl) => {
1063                    decl.attributes = merge_attributes(&parsed_block_attrs, decl.attributes);
1064                    function_decls.push(decl)
1065                }
1066                Err(e) => {
1067                    error = Some(
1068                        error
1069                            .take()
1070                            .map(|mut o| {
1071                                o.combine(e.clone());
1072                                o
1073                            })
1074                            .unwrap_or(e),
1075                    );
1076                }
1077            }
1078        }
1079
1080        error
1081            .map(Err)
1082            .unwrap_or(Ok(ExternSqlBlock { function_decls }))
1083    }
1084}
1085
1086fn merge_attributes(
1087    parsed_block_attrs: &[AttributeSpanWrapper<SqlFunctionAttribute>],
1088    mut attributes: Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
1089) -> Vec<AttributeSpanWrapper<SqlFunctionAttribute>> {
1090    for attr in parsed_block_attrs {
1091        if attributes.iter().all(|a| match (&a.item, &attr.item) {
1092            (SqlFunctionAttribute::Aggregate { .. }, SqlFunctionAttribute::Aggregate { .. }) => {
1093                ::core::panicking::panic("not yet implemented")todo!()
1094            }
1095            (SqlFunctionAttribute::Window { .. }, SqlFunctionAttribute::Window { .. })
1096            | (SqlFunctionAttribute::SqlName { .. }, SqlFunctionAttribute::SqlName { .. })
1097            | (
1098                SqlFunctionAttribute::Restriction { .. },
1099                SqlFunctionAttribute::Restriction { .. },
1100            )
1101            | (SqlFunctionAttribute::Variadic { .. }, SqlFunctionAttribute::Variadic { .. })
1102            | (
1103                SqlFunctionAttribute::SkipReturnTypeHelper { .. },
1104                SqlFunctionAttribute::SkipReturnTypeHelper { .. },
1105            ) => false,
1106            _ => true,
1107        }) {
1108            attributes.push(attr.clone());
1109        }
1110    }
1111    attributes
1112}
1113
1114#[derive(#[automatically_derived]
impl ::core::clone::Clone for SqlFunctionDecl {
    #[inline]
    fn clone(&self) -> SqlFunctionDecl {
        SqlFunctionDecl {
            attributes: ::core::clone::Clone::clone(&self.attributes),
            fn_token: ::core::clone::Clone::clone(&self.fn_token),
            fn_name: ::core::clone::Clone::clone(&self.fn_name),
            generics: ::core::clone::Clone::clone(&self.generics),
            args: ::core::clone::Clone::clone(&self.args),
            return_type: ::core::clone::Clone::clone(&self.return_type),
        }
    }
}Clone)]
1115pub(crate) struct SqlFunctionDecl {
1116    attributes: Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
1117    fn_token: ::syn::token::FnToken![fn],
1118    fn_name: Ident,
1119    generics: Generics,
1120    args: Punctuated<StrictFnArg, ::syn::token::CommaToken![,]>,
1121    return_type: Type,
1122}
1123
1124impl Parse for SqlFunctionDecl {
1125    fn parse(input: ParseStream) -> Result<Self> {
1126        let mut error = None::<syn::Error>;
1127        let mut combine_error = |e: syn::Error| {
1128            error = Some(
1129                error
1130                    .take()
1131                    .map(|mut o| {
1132                        o.combine(e.clone());
1133                        o
1134                    })
1135                    .unwrap_or(e),
1136            )
1137        };
1138
1139        let attributes = Attribute::parse_outer(input).unwrap_or_else(|e| {
1140            combine_error(e);
1141            Vec::new()
1142        });
1143        let attributes_collected = parse_attributes(&mut combine_error, attributes);
1144
1145        let fn_token: ::syn::token::FnToken![fn] = input.parse().unwrap_or_else(|e| {
1146            combine_error(e);
1147            Default::default()
1148        });
1149        let fn_name = Ident::parse(input).unwrap_or_else(|e| {
1150            combine_error(e);
1151            Ident::new("dummy", Span::call_site())
1152        });
1153        let generics = Generics::parse(input).unwrap_or_else(|e| {
1154            combine_error(e);
1155            Generics {
1156                lt_token: None,
1157                params: Punctuated::new(),
1158                gt_token: None,
1159                where_clause: None,
1160            }
1161        });
1162        let args;
1163        let _paren = match ::syn::__private::parse_parens(&input) {
    ::syn::__private::Ok(parens) => {
        args = parens.content;
        _ = args;
        parens.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
}parenthesized!(args in input);
1164        let args = args
1165            .parse_terminated(StrictFnArg::parse, ::syn::token::CommaToken![,])
1166            .unwrap_or_else(|e| {
1167                combine_error(e);
1168                Punctuated::new()
1169            });
1170        let rarrow = Option::<::syn::token::RArrowToken![->]>::parse(input).unwrap_or_else(|e| {
1171            combine_error(e);
1172            None
1173        });
1174        let return_type = if rarrow.is_some() {
1175            Type::parse(input).unwrap_or_else(|e| {
1176                combine_error(e);
1177                Type::Never(syn::TypeNever {
1178                    bang_token: Default::default(),
1179                })
1180            })
1181        } else {
1182            ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "expression");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "expression_types");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "NotSelectable");
        _s
    })parse_quote!(diesel::expression::expression_types::NotSelectable)
1183        };
1184        let _semi = Option::<::syn::token::SemiToken![;]>::parse(input).unwrap_or_else(|e| {
1185            combine_error(e);
1186            None
1187        });
1188
1189        error.map(Err).unwrap_or(Ok(Self {
1190            attributes: attributes_collected,
1191            fn_token,
1192            fn_name,
1193            generics,
1194            args,
1195            return_type,
1196        }))
1197    }
1198}
1199
1200fn parse_attribute(attr: syn::Attribute) -> Result<AttributeSpanWrapper<SqlFunctionAttribute>> {
1201    match &attr.meta {
1202        syn::Meta::NameValue(syn::MetaNameValue {
1203            path,
1204            value:
1205                syn::Expr::Lit(syn::ExprLit {
1206                    lit: syn::Lit::Str(sql_name),
1207                    ..
1208                }),
1209            ..
1210        }) if path.is_ident("sql_name") => Ok(AttributeSpanWrapper {
1211            attribute_span: attr.span(),
1212            ident_span: sql_name.span(),
1213            item: SqlFunctionAttribute::SqlName {
1214                ident: path.require_ident()?.clone(),
1215                value: sql_name.clone(),
1216            },
1217        }),
1218        syn::Meta::Path(path) if path.is_ident("aggregate") => Ok(AttributeSpanWrapper {
1219            attribute_span: attr.span(),
1220            ident_span: path.span(),
1221            item: SqlFunctionAttribute::Aggregate {
1222                ident: path
1223                    .require_ident()
1224                    .map_err(|e| {
1225                        syn::Error::new(
1226                            e.span(),
1227                            ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}, the correct format is `#[aggregate]`",
                e))
    })format!("{e}, the correct format is `#[aggregate]`"),
1228                        )
1229                    })?
1230                    .clone(),
1231            },
1232        }),
1233        syn::Meta::Path(path) if path.is_ident("skip_return_type_helper") => {
1234            Ok(AttributeSpanWrapper {
1235                ident_span: attr.span(),
1236                attribute_span: path.span(),
1237                item: SqlFunctionAttribute::SkipReturnTypeHelper {
1238                    ident: path
1239                        .require_ident()
1240                        .map_err(|e| {
1241                            syn::Error::new(
1242                                e.span(),
1243                                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}, the correct format is `#[skip_return_type_helper]`",
                e))
    })format!("{e}, the correct format is `#[skip_return_type_helper]`"),
1244                            )
1245                        })?
1246                        .clone(),
1247                },
1248            })
1249        }
1250        syn::Meta::Path(path) if path.is_ident("window") => Ok(AttributeSpanWrapper {
1251            attribute_span: attr.span(),
1252            ident_span: path.span(),
1253            item: SqlFunctionAttribute::Window {
1254                ident: path
1255                    .require_ident()
1256                    .map_err(|e| {
1257                        syn::Error::new(e.span(), ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}, the correct format is `#[window]`",
                e))
    })format!("{e}, the correct format is `#[window]`"))
1258                    })?
1259                    .clone(),
1260                restrictions: BackendRestriction::None,
1261                require_order: None,
1262                wrap_macro: None,
1263            },
1264        }),
1265        syn::Meta::List(syn::MetaList {
1266            path,
1267            delimiter: syn::MacroDelimiter::Paren(_),
1268            tokens: _,
1269        }) if path.is_ident("variadic") => {
1270            let (count, flag) = attr
1271                .parse_args_with(|input: syn::parse::ParseStream| {
1272                    if input.peek(LitInt){
1273                        let count = input.parse::<LitInt>()?;
1274                        if !input.is_empty(){
1275                            return Err(syn::Error::new(input.span(), "unexpected token after positional `#[variadic(..)]`"));
1276                        }
1277                        Ok((count, LitBool::new(false, Span::call_site())))
1278                    }
1279                    else {
1280                        let key: Ident = input.parse()?;
1281                        if key != "last_arguments" {
1282                            return Err(syn::Error::new(key.span(), "expect `last_arguments`"));
1283                        }
1284                        let _eq: ::syn::token::EqToken![=] = input.parse()?;
1285                        let count: LitInt = input.parse()?;
1286                        let skip_zero: LitBool = if input.peek(::syn::token::CommaToken![,]) {
1287                            let _: ::syn::token::CommaToken![,] = input.parse()?;
1288                            let key: Ident = input.parse()?;
1289                            if key != "skip_zero_argument_variant" {
1290                                return Err(
1291                                    syn::Error::new(
1292                                        key.span(), "expect `skip_zero_argument_variant`"
1293                                    )
1294                                );
1295                            }
1296                            let _eq: ::syn::token::EqToken![=] = input.parse()?;
1297                            input.parse()?
1298                        } else {
1299                            LitBool::new(false, Span::call_site())
1300                        };
1301                        Ok((count, skip_zero))
1302                    }
1303                })
1304                .map_err(|e| {
1305                    syn::Error::new(
1306                        e.span(),
1307                        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}, the correct format is `#[variadic(last_arguments = 3)]` or `#[variadic(last_arguments = 3, skip_zero_argument_variant = true)]`",
                e))
    })format!(
1308                            "{e}, the correct format is `#[variadic(last_arguments = 3)]` or `#[variadic(last_arguments = 3, skip_zero_argument_variant = true)]`"
1309                        ),
1310                    )
1311                })?;
1312            Ok(AttributeSpanWrapper {
1313                item: SqlFunctionAttribute::Variadic {
1314                    ident: path
1315                        .require_ident()
1316                        .map_err(|e| {
1317                            syn::Error::new(
1318                                e.span(),
1319                                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}, the correct format is `#[variadic(3)]`",
                e))
    })format!("{e}, the correct format is `#[variadic(3)]`"),
1320                            )
1321                        })?
1322                        .clone(),
1323                    count: count.clone(),
1324                    skip_zero_arg_variant: flag,
1325                },
1326                attribute_span: attr.span(),
1327                ident_span: path.require_ident()?.span(),
1328            })
1329        }
1330        syn::Meta::NameValue(_) | syn::Meta::Path(_) => Ok(AttributeSpanWrapper {
1331            attribute_span: attr.span(),
1332            ident_span: attr.span(),
1333            item: SqlFunctionAttribute::Other(attr),
1334        }),
1335        syn::Meta::List(_) => {
1336            let name = attr.meta.path().require_ident()?;
1337            let attribute_span = attr.meta.span();
1338            attr.clone()
1339                .parse_args_with(|input: &syn::parse::ParseBuffer| {
1340                    SqlFunctionAttribute::parse_attr(
1341                        name.clone(),
1342                        input,
1343                        attr.clone(),
1344                        attribute_span,
1345                    )
1346                })
1347        }
1348    }
1349}
1350
1351fn parse_attributes(
1352    combine_error: &mut impl FnMut(syn::Error),
1353    attributes: Vec<Attribute>,
1354) -> Vec<AttributeSpanWrapper<SqlFunctionAttribute>> {
1355    let attribute_count = attributes.len();
1356
1357    let attributes = attributes.into_iter().map(parse_attribute);
1358
1359    let mut attributes_collected = Vec::with_capacity(attribute_count);
1360    for attr in attributes {
1361        match attr {
1362            Ok(attr) => attributes_collected.push(attr),
1363            Err(e) => {
1364                combine_error(e);
1365            }
1366        }
1367    }
1368    attributes_collected
1369}
1370
1371/// Essentially the same as ArgCaptured, but only allowing ident patterns
1372#[derive(#[automatically_derived]
impl ::core::clone::Clone for StrictFnArg {
    #[inline]
    fn clone(&self) -> StrictFnArg {
        StrictFnArg {
            name: ::core::clone::Clone::clone(&self.name),
            colon_token: ::core::clone::Clone::clone(&self.colon_token),
            ty: ::core::clone::Clone::clone(&self.ty),
        }
    }
}Clone)]
1373struct StrictFnArg {
1374    name: Ident,
1375    colon_token: ::syn::token::ColonToken![:],
1376    ty: Type,
1377}
1378
1379impl Parse for StrictFnArg {
1380    fn parse(input: ParseStream) -> Result<Self> {
1381        let name = input.parse()?;
1382        let colon_token = input.parse()?;
1383        let ty = input.parse()?;
1384        Ok(Self {
1385            name,
1386            colon_token,
1387            ty,
1388        })
1389    }
1390}
1391
1392impl ToTokens for StrictFnArg {
1393    fn to_tokens(&self, tokens: &mut TokenStream) {
1394        self.name.to_tokens(tokens);
1395        self.colon_token.to_tokens(tokens);
1396        self.name.to_tokens(tokens);
1397    }
1398}
1399
1400fn is_sqlite_type(ty: &Type) -> Option<&Ident> {
1401    let last_segment = if let Type::Path(tp) = ty {
1402        tp.path.segments.last()?
1403    } else {
1404        return None;
1405    };
1406
1407    let ident = &last_segment.ident;
1408    if ident == "Nullable" {
1409        if let PathArguments::AngleBracketed(ref ab) = last_segment.arguments
1410            && let Some(GenericArgument::Type(ty)) = ab.args.first()
1411        {
1412            return is_sqlite_type(ty);
1413        }
1414        return None;
1415    }
1416
1417    Some(ident)
1418}
1419
1420#[derive(#[automatically_derived]
impl ::core::default::Default for BackendRestriction {
    #[inline]
    fn default() -> BackendRestriction { Self::None }
}Default, #[automatically_derived]
impl ::core::clone::Clone for BackendRestriction {
    #[inline]
    fn clone(&self) -> BackendRestriction {
        match self {
            BackendRestriction::None => BackendRestriction::None,
            BackendRestriction::SqlDialect(__self_0, __self_1, __self_2) =>
                BackendRestriction::SqlDialect(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            BackendRestriction::BackendBound(__self_0, __self_1) =>
                BackendRestriction::BackendBound(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            BackendRestriction::Backends(__self_0, __self_1) =>
                BackendRestriction::Backends(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BackendRestriction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BackendRestriction::None =>
                ::core::fmt::Formatter::write_str(f, "None"),
            BackendRestriction::SqlDialect(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "SqlDialect", __self_0, __self_1, &__self_2),
            BackendRestriction::BackendBound(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "BackendBound", __self_0, &__self_1),
            BackendRestriction::Backends(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Backends", __self_0, &__self_1),
        }
    }
}Debug)]
1421enum BackendRestriction {
1422    #[default]
1423    None,
1424    SqlDialect(syn::Ident, syn::Ident, syn::Path),
1425    BackendBound(
1426        syn::Ident,
1427        syn::punctuated::Punctuated<syn::TypeParamBound, ::syn::token::Plussyn::Token![+]>,
1428    ),
1429    Backends(
1430        syn::Ident,
1431        syn::punctuated::Punctuated<syn::Path, ::syn::token::Commasyn::Token![,]>,
1432    ),
1433}
1434
1435impl BackendRestriction {
1436    fn parse_from(input: &syn::parse::ParseBuffer<'_>) -> Result<Self> {
1437        if input.is_empty() {
1438            return Ok(Self::None);
1439        }
1440        Self::parse(input)
1441    }
1442
1443    fn parse_backends(
1444        input: &syn::parse::ParseBuffer<'_>,
1445        name: Ident,
1446    ) -> Result<BackendRestriction> {
1447        let backends = Punctuated::parse_terminated(input)?;
1448        Ok(Self::Backends(name, backends))
1449    }
1450
1451    fn parse_sql_dialect(
1452        content: &syn::parse::ParseBuffer<'_>,
1453        name: Ident,
1454    ) -> Result<BackendRestriction> {
1455        let dialect = content.parse()?;
1456        let _del: ::syn::token::Commasyn::Token![,] = content.parse()?;
1457        let dialect_variant = content.parse()?;
1458
1459        Ok(Self::SqlDialect(name, dialect, dialect_variant))
1460    }
1461
1462    fn parse_backend_bounds(
1463        input: &syn::parse::ParseBuffer<'_>,
1464        name: Ident,
1465    ) -> Result<BackendRestriction> {
1466        let restrictions = Punctuated::parse_terminated(input)?;
1467        Ok(Self::BackendBound(name, restrictions))
1468    }
1469
1470    fn generate_all_window_fragment_impls(
1471        &self,
1472        mut generics: Generics,
1473        ty_generics: &TypeGenerics<'_>,
1474        fn_name: &syn::Ident,
1475        require_order: bool,
1476        wrap_macro: Option<&Path>,
1477    ) -> TokenStream {
1478        generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__P");
        _s
    })parse_quote!(__P));
1479        generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__O");
        _s
    })parse_quote!(__O));
1480        generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__F");
        _s
    })parse_quote!(__F));
1481        let order = if require_order {
1482            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "internal");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "sql_functions");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Order");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__O");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "true");
    ::quote::__private::push_gt(&mut _s);
    _s
}quote::quote! {
1483                diesel::internal::sql_functions::Order<__O, true>
1484            }
1485        } else {
1486            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "__O");
    _s
}quote::quote! {__O}
1487        };
1488        let out = match *self {
1489            BackendRestriction::None => {
1490                generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
1491                let (impl_generics, _, _) = generics.split_for_impl();
1492                Self::generate_window_fragment_impl(
1493                    ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal),
1494                    Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        ::quote::__private::push_colon(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Backend");
        ::quote::__private::push_comma(&mut _s);
        _s
    })parse_quote!(__DieselInternal: diesel::backend::Backend,)),
1495                    &impl_generics,
1496                    ty_generics,
1497                    fn_name,
1498                    None,
1499                    &order,
1500                )
1501            }
1502            BackendRestriction::SqlDialect(_, ref dialect, ref dialect_type) => {
1503                generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
1504                let (impl_generics, _, _) = generics.split_for_impl();
1505                let mut out = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "WindowFunctionFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::__private::push_ident(&mut _s, "OverClause");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__P");
    ::quote::__private::push_comma(&mut _s);
    ::quote::ToTokens::to_tokens(&order, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__F");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "where");
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "WindowFunctionFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_ident(&mut _s, "as");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backend");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "SqlDialect");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&dialect, &mut _s);
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backend");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backend");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    _s
}quote::quote! {
1506                    impl #impl_generics WindowFunctionFragment<#fn_name #ty_generics, __DieselInternal>
1507                        for OverClause<__P, #order, __F>
1508                    where
1509                        Self: WindowFunctionFragment<#fn_name #ty_generics, __DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>,
1510                        __DieselInternal: diesel::backend::Backend,
1511                    {
1512                    }
1513
1514                };
1515                let specific_impl = Self::generate_window_fragment_impl(
1516                    ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal),
1517                    Some(
1518                        ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        ::quote::__private::push_colon(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Backend");
        ::quote::__private::push_add(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SqlDialect");
        ::quote::__private::push_lt(&mut _s);
        ::quote::ToTokens::to_tokens(&dialect, &mut _s);
        ::quote::__private::push_eq(&mut _s);
        ::quote::ToTokens::to_tokens(&dialect_type, &mut _s);
        ::quote::__private::push_gt(&mut _s);
        ::quote::__private::push_comma(&mut _s);
        _s
    })parse_quote!(__DieselInternal: diesel::backend::Backend + diesel::backend::SqlDialect<#dialect = #dialect_type>,),
1519                    ),
1520                    &impl_generics,
1521                    ty_generics,
1522                    fn_name,
1523                    Some(dialect_type),
1524                    &order,
1525                );
1526                out.extend(specific_impl);
1527                out
1528            }
1529            BackendRestriction::BackendBound(_, ref restriction) => {
1530                generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
1531                let (impl_generics, _, _) = generics.split_for_impl();
1532                Self::generate_window_fragment_impl(
1533                    ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal),
1534                    Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        ::quote::__private::push_colon(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Backend");
        ::quote::__private::push_add(&mut _s);
        ::quote::ToTokens::to_tokens(&restriction, &mut _s);
        ::quote::__private::push_comma(&mut _s);
        _s
    })parse_quote!(__DieselInternal: diesel::backend::Backend + #restriction,)),
1535                    &impl_generics,
1536                    ty_generics,
1537                    fn_name,
1538                    None,
1539                    &order,
1540                )
1541            }
1542            BackendRestriction::Backends(_, ref backends) => {
1543                let (impl_generics, _, _) = generics.split_for_impl();
1544                let backends = backends.iter().map(|b| {
1545                    Self::generate_window_fragment_impl(
1546                        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&b, &mut _s);
    _s
}quote! {#b},
1547                        None,
1548                        &impl_generics,
1549                        ty_generics,
1550                        fn_name,
1551                        None,
1552                        &order,
1553                    )
1554                });
1555
1556                ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut backends, i) = backends.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let backends =
                    match backends.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&backends, &mut _s);
            }
        }
        _s
    })parse_quote!(#(#backends)*)
1557            }
1558        };
1559        if let Some(wrap_macro) = wrap_macro {
1560            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&wrap_macro, &mut _s);
    ::quote::__private::push_bang(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&out, &mut _s);
            _s
        });
    _s
}quote::quote! {
1561                #wrap_macro! {
1562                    #out
1563                }
1564            }
1565        } else {
1566            out
1567        }
1568    }
1569
1570    fn generate_window_fragment_impl(
1571        backend: TokenStream,
1572        backend_bound: Option<proc_macro2::TokenStream>,
1573        impl_generics: &ImplGenerics<'_>,
1574        ty_generics: &TypeGenerics<'_>,
1575        fn_name: &syn::Ident,
1576        dialect: Option<&syn::Path>,
1577        order: &TokenStream,
1578    ) -> TokenStream {
1579        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "WindowFunctionFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::ToTokens::to_tokens(&backend, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::ToTokens::to_tokens(&dialect, &mut _s);
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::__private::push_ident(&mut _s, "OverClause");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__P");
    ::quote::__private::push_comma(&mut _s);
    ::quote::ToTokens::to_tokens(&order, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__F");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "where");
    ::quote::ToTokens::to_tokens(&backend_bound, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        ::quote::__private::TokenStream::new());
    _s
}quote::quote! {
1580            impl #impl_generics WindowFunctionFragment<#fn_name #ty_generics, #backend, #dialect> for OverClause<__P, #order, __F>
1581                where #backend_bound
1582            {
1583
1584            }
1585        }
1586    }
1587
1588    fn generate_all_queryfragment_impls(
1589        &self,
1590        mut generics: Generics,
1591        ty_generics: &TypeGenerics<'_>,
1592        arg_name: &[&syn::Ident],
1593        fn_name: &syn::Ident,
1594    ) -> proc_macro2::TokenStream {
1595        match *self {
1596            BackendRestriction::None => {
1597                generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
1598                let (impl_generics, _, _) = generics.split_for_impl();
1599                Self::generate_queryfragment_impl(
1600                    ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal),
1601                    Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        ::quote::__private::push_colon(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Backend");
        ::quote::__private::push_comma(&mut _s);
        _s
    })parse_quote!(__DieselInternal: diesel::backend::Backend,)),
1602                    &impl_generics,
1603                    ty_generics,
1604                    arg_name,
1605                    fn_name,
1606                    None,
1607                )
1608            }
1609            BackendRestriction::BackendBound(_, ref restriction) => {
1610                generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
1611                let (impl_generics, _, _) = generics.split_for_impl();
1612                Self::generate_queryfragment_impl(
1613                    ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal),
1614                    Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        ::quote::__private::push_colon(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Backend");
        ::quote::__private::push_add(&mut _s);
        ::quote::ToTokens::to_tokens(&restriction, &mut _s);
        ::quote::__private::push_comma(&mut _s);
        _s
    })parse_quote!(__DieselInternal: diesel::backend::Backend + #restriction,)),
1615                    &impl_generics,
1616                    ty_generics,
1617                    arg_name,
1618                    fn_name,
1619                    None,
1620                )
1621            }
1622            BackendRestriction::SqlDialect(_, ref dialect, ref dialect_type) => {
1623                generics.params.push(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal));
1624                let (impl_generics, _, _) = generics.split_for_impl();
1625                let specific_impl = Self::generate_queryfragment_impl(
1626                    ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        _s
    })parse_quote!(__DieselInternal),
1627                    Some(
1628                        ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "__DieselInternal");
        ::quote::__private::push_colon(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Backend");
        ::quote::__private::push_add(&mut _s);
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "backend");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SqlDialect");
        ::quote::__private::push_lt(&mut _s);
        ::quote::ToTokens::to_tokens(&dialect, &mut _s);
        ::quote::__private::push_eq(&mut _s);
        ::quote::ToTokens::to_tokens(&dialect_type, &mut _s);
        ::quote::__private::push_gt(&mut _s);
        ::quote::__private::push_comma(&mut _s);
        _s
    })parse_quote!(__DieselInternal: diesel::backend::Backend + diesel::backend::SqlDialect<#dialect = #dialect_type>,),
1629                    ),
1630                    &impl_generics,
1631                    ty_generics,
1632                    arg_name,
1633                    fn_name,
1634                    Some(dialect_type),
1635                );
1636                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "QueryFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "where");
    ::quote::__private::push_ident(&mut _s, "Self");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "QueryFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_ident(&mut _s, "as");
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backend");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "SqlDialect");
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&dialect, &mut _s);
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
    ::quote::__private::push_colon(&mut _s);
    ::quote::__private::push_ident(&mut _s, "diesel");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "backend");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Backend");
    ::quote::__private::push_comma(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "walk_ast");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'__b");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'__b");
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "out");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "AstPass");
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'_");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'__b");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
                    ::quote::__private::push_gt(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Self");
                    ::quote::__private::push_ident(&mut _s, "as");
                    ::quote::__private::push_ident(&mut _s, "QueryFragment");
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__DieselInternal");
                    ::quote::__private::push_ident(&mut _s, "as");
                    ::quote::__private::push_ident(&mut _s, "diesel");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "backend");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "SqlDialect");
                    ::quote::__private::push_gt(&mut _s);
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::ToTokens::to_tokens(&dialect, &mut _s);
                    ::quote::__private::push_shr(&mut _s);
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "walk_ast");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "self");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "out");
                            _s
                        });
                    _s
                });
            _s
        });
    ::quote::ToTokens::to_tokens(&specific_impl, &mut _s);
    _s
}quote::quote! {
1637                    impl #impl_generics QueryFragment<__DieselInternal>
1638                        for #fn_name #ty_generics
1639                    where
1640                        Self: QueryFragment<__DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>,
1641                        __DieselInternal: diesel::backend::Backend,
1642                    {
1643                        fn walk_ast<'__b>(&'__b self, mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
1644                            <Self as QueryFragment<__DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>>::walk_ast(self, out)
1645                        }
1646
1647                    }
1648
1649                    #specific_impl
1650                }
1651            }
1652            BackendRestriction::Backends(_, ref backends) => {
1653                let (impl_generics, _, _) = generics.split_for_impl();
1654                let backends = backends.iter().map(|b| {
1655                    Self::generate_queryfragment_impl(
1656                        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&b, &mut _s);
    _s
}quote! {#b},
1657                        None,
1658                        &impl_generics,
1659                        ty_generics,
1660                        arg_name,
1661                        fn_name,
1662                        None,
1663                    )
1664                });
1665
1666                ::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut backends, i) = backends.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let backends =
                    match backends.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&backends, &mut _s);
            }
        }
        _s
    })parse_quote!(#(#backends)*)
1667            }
1668        }
1669    }
1670
1671    fn generate_queryfragment_impl(
1672        backend: proc_macro2::TokenStream,
1673        backend_bound: Option<proc_macro2::TokenStream>,
1674        impl_generics: &ImplGenerics<'_>,
1675        ty_generics: &TypeGenerics<'_>,
1676        arg_name: &[&syn::Ident],
1677        fn_name: &syn::Ident,
1678        dialect: Option<&syn::Path>,
1679    ) -> proc_macro2::TokenStream {
1680        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "QueryFragment");
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&backend, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    ::quote::ToTokens::to_tokens(&dialect, &mut _s);
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&fn_name, &mut _s);
    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "where");
    ::quote::ToTokens::to_tokens(&backend_bound, &mut _s);
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut arg_name, i) = arg_name.quote_into_iter();
        let has_iter = has_iter | i;
        #[allow(unused_mut)]
        let (mut backend, i) = backend.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let arg_name =
                match arg_name.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            let backend =
                match backend.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&arg_name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryFragment");
            ::quote::__private::push_lt(&mut _s);
            ::quote::ToTokens::to_tokens(&backend, &mut _s);
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_comma(&mut _s);
        }
    }
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "walk_ast");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_lifetime(&mut _s, "\'__b");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'__b");
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "mut");
                    ::quote::__private::push_ident(&mut _s, "out");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "AstPass");
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'_");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_lifetime(&mut _s, "\'__b");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&backend, &mut _s);
                    ::quote::__private::push_gt(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "QueryResult");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "out");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "push_sql");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_lt(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "Self");
                            ::quote::__private::push_ident(&mut _s, "as");
                            ::quote::__private::push_ident(&mut _s, "FunctionFragment");
                            ::quote::__private::push_lt(&mut _s);
                            ::quote::ToTokens::to_tokens(&backend, &mut _s);
                            ::quote::__private::push_shr(&mut _s);
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "FUNCTION_NAME");
                            _s
                        });
                    ::quote::__private::push_semi(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "out");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "push_sql");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::parse(&mut _s, "\"(\"");
                            _s
                        });
                    ::quote::__private::push_semi(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "walk_arguments");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "out");
                            ::quote::__private::push_dot(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "reborrow");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                ::quote::__private::TokenStream::new());
                            _s
                        });
                    ::quote::__private::push_question(&mut _s);
                    ::quote::__private::push_semi(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "out");
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "push_sql");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::parse(&mut _s, "\")\"");
                            _s
                        });
                    ::quote::__private::push_semi(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Ok");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                ::quote::__private::TokenStream::new());
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote::quote! {
1681            impl #impl_generics QueryFragment<#backend, #dialect>
1682                for #fn_name #ty_generics
1683            where
1684                #backend_bound
1685            #(#arg_name: QueryFragment<#backend>,)*
1686            {
1687                fn walk_ast<'__b>(&'__b self, mut out: AstPass<'_, '__b, #backend>) -> QueryResult<()>{
1688                    out.push_sql(<Self as FunctionFragment<#backend>>::FUNCTION_NAME);
1689                    out.push_sql("(");
1690                    self.walk_arguments(out.reborrow())?;
1691                    out.push_sql(")");
1692                    Ok(())
1693                }
1694            }
1695        }
1696    }
1697}
1698
1699impl Parse for BackendRestriction {
1700    fn parse(input: ParseStream) -> Result<Self> {
1701        let name: syn::Ident = input.parse()?;
1702        let name_str = name.to_string();
1703        let content;
1704        match ::syn::__private::parse_parens(&input) {
    ::syn::__private::Ok(parens) => {
        content = parens.content;
        _ = content;
        parens.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};parenthesized!(content in input);
1705        match &*name_str {
1706            "backends" => Self::parse_backends(&content, name),
1707            "dialect" => Self::parse_sql_dialect(&content, name),
1708            "backend_bounds" => Self::parse_backend_bounds(&content, name),
1709            _ => Err(syn::Error::new(
1710                name.span(),
1711                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("unexpected option `{0}`",
                name_str))
    })format!("unexpected option `{name_str}`"),
1712            )),
1713        }
1714    }
1715}
1716
1717#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SqlFunctionAttribute {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SqlFunctionAttribute::Aggregate { ident: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Aggregate", "ident", &__self_0),
            SqlFunctionAttribute::Window {
                ident: __self_0,
                restrictions: __self_1,
                require_order: __self_2,
                wrap_macro: __self_3 } =>
                ::core::fmt::Formatter::debug_struct_field4_finish(f,
                    "Window", "ident", __self_0, "restrictions", __self_1,
                    "require_order", __self_2, "wrap_macro", &__self_3),
            SqlFunctionAttribute::SqlName { ident: __self_0, value: __self_1 }
                =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "SqlName", "ident", __self_0, "value", &__self_1),
            SqlFunctionAttribute::Restriction { restriction: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Restriction", "restriction", &__self_0),
            SqlFunctionAttribute::Variadic {
                ident: __self_0,
                count: __self_1,
                skip_zero_arg_variant: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Variadic", "ident", __self_0, "count", __self_1,
                    "skip_zero_arg_variant", &__self_2),
            SqlFunctionAttribute::SkipReturnTypeHelper { ident: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "SkipReturnTypeHelper", "ident", &__self_0),
            SqlFunctionAttribute::Other(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for SqlFunctionAttribute {
    #[inline]
    fn clone(&self) -> SqlFunctionAttribute {
        match self {
            SqlFunctionAttribute::Aggregate { ident: __self_0 } =>
                SqlFunctionAttribute::Aggregate {
                    ident: ::core::clone::Clone::clone(__self_0),
                },
            SqlFunctionAttribute::Window {
                ident: __self_0,
                restrictions: __self_1,
                require_order: __self_2,
                wrap_macro: __self_3 } =>
                SqlFunctionAttribute::Window {
                    ident: ::core::clone::Clone::clone(__self_0),
                    restrictions: ::core::clone::Clone::clone(__self_1),
                    require_order: ::core::clone::Clone::clone(__self_2),
                    wrap_macro: ::core::clone::Clone::clone(__self_3),
                },
            SqlFunctionAttribute::SqlName { ident: __self_0, value: __self_1 }
                =>
                SqlFunctionAttribute::SqlName {
                    ident: ::core::clone::Clone::clone(__self_0),
                    value: ::core::clone::Clone::clone(__self_1),
                },
            SqlFunctionAttribute::Restriction { restriction: __self_0 } =>
                SqlFunctionAttribute::Restriction {
                    restriction: ::core::clone::Clone::clone(__self_0),
                },
            SqlFunctionAttribute::Variadic {
                ident: __self_0,
                count: __self_1,
                skip_zero_arg_variant: __self_2 } =>
                SqlFunctionAttribute::Variadic {
                    ident: ::core::clone::Clone::clone(__self_0),
                    count: ::core::clone::Clone::clone(__self_1),
                    skip_zero_arg_variant: ::core::clone::Clone::clone(__self_2),
                },
            SqlFunctionAttribute::SkipReturnTypeHelper { ident: __self_0 } =>
                SqlFunctionAttribute::SkipReturnTypeHelper {
                    ident: ::core::clone::Clone::clone(__self_0),
                },
            SqlFunctionAttribute::Other(__self_0) =>
                SqlFunctionAttribute::Other(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone)]
1718enum SqlFunctionAttribute {
1719    Aggregate {
1720        ident: Ident,
1721    },
1722    Window {
1723        ident: Ident,
1724        restrictions: BackendRestriction,
1725        require_order: Option<bool>,
1726        wrap_macro: Option<Path>,
1727    },
1728    SqlName {
1729        ident: Ident,
1730        value: LitStr,
1731    },
1732    Restriction {
1733        restriction: BackendRestriction,
1734    },
1735    Variadic {
1736        ident: Ident,
1737        count: LitInt,
1738        skip_zero_arg_variant: LitBool,
1739    },
1740    SkipReturnTypeHelper {
1741        ident: Ident,
1742    },
1743    Other(Attribute),
1744}
1745
1746impl MySpanned for SqlFunctionAttribute {
1747    fn span(&self) -> proc_macro2::Span {
1748        match self {
1749            SqlFunctionAttribute::Restriction {
1750                restriction: BackendRestriction::Backends(ident, ..),
1751                ..
1752            }
1753            | SqlFunctionAttribute::Restriction {
1754                restriction: BackendRestriction::SqlDialect(ident, ..),
1755                ..
1756            }
1757            | SqlFunctionAttribute::Restriction {
1758                restriction: BackendRestriction::BackendBound(ident, ..),
1759                ..
1760            }
1761            | SqlFunctionAttribute::Aggregate { ident, .. }
1762            | SqlFunctionAttribute::Window { ident, .. }
1763            | SqlFunctionAttribute::Variadic { ident, .. }
1764            | SqlFunctionAttribute::SkipReturnTypeHelper { ident, .. }
1765            | SqlFunctionAttribute::SqlName { ident, .. } => ident.span(),
1766            SqlFunctionAttribute::Restriction {
1767                restriction: BackendRestriction::None,
1768                ..
1769            } => {
1770                {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("We do not construct that")));
}unreachable!("We do not construct that")
1771            }
1772            SqlFunctionAttribute::Other(attribute) => attribute.span(),
1773        }
1774    }
1775}
1776
1777fn parse_require_order(input: &syn::parse::ParseBuffer<'_>) -> Result<bool> {
1778    let ident = input.parse::<Ident>()?;
1779    if ident == "require_order" {
1780        let _ = input.parse::<::syn::token::EqToken![=]>()?;
1781        let value = input.parse::<LitBool>()?;
1782        Ok(value.value)
1783    } else {
1784        Err(syn::Error::new(
1785            ident.span(),
1786            ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("Expected `require_order` but got `{0}`",
                ident))
    })format!("Expected `require_order` but got `{ident}`"),
1787        ))
1788    }
1789}
1790
1791impl SqlFunctionAttribute {
1792    fn parse_attr(
1793        name: Ident,
1794        input: &syn::parse::ParseBuffer<'_>,
1795        attr: Attribute,
1796        attribute_span: proc_macro2::Span,
1797    ) -> Result<AttributeSpanWrapper<Self>> {
1798        // rustc doesn't resolve cfg attrs for us :(
1799        // This is hacky, but mostly for internal use
1800        if name == "cfg_attr" {
1801            let ident = input.parse::<Ident>()?;
1802            if ident != "feature" {
1803                return Err(syn::Error::new(
1804                    ident.span(),
1805                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("only single feature `cfg_attr` attributes are supported. Got `{0}` but expected `feature = \"foo\"`",
                ident))
    })format!(
1806                        "only single feature `cfg_attr` attributes are supported. \
1807                             Got `{ident}` but expected `feature = \"foo\"`"
1808                    ),
1809                ));
1810            }
1811            let _ = input.parse::<::syn::token::EqToken![=]>()?;
1812            let feature = input.parse::<LitStr>()?;
1813            let feature_value = feature.value();
1814            let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1815            let wrap_macro = match feature_value.as_str() {
1816                "postgres_backend" => Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "internal");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "sql_functions");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "expand_pg");
        _s
    })syn::parse_quote!(
1817                    diesel::internal::sql_functions::expand_pg
1818                )),
1819                "sqlite" | "__sqlite_shared" => Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "internal");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "sql_functions");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "expand_sqlite");
        _s
    })syn::parse_quote!(
1820                    diesel::internal::sql_functions::expand_sqlite
1821                )),
1822                "mysql_backend" => Some(::syn::__private::parse_quote({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "diesel");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "internal");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "sql_functions");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "expand_mysql");
        _s
    })syn::parse_quote!(
1823                    diesel::internal::sql_functions::expand_mysql
1824                )),
1825                feature => {
1826                    return Err(syn::Error::new(
1827                        feature.span(),
1828                        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("only `mysql_backend`, `postgres_backend` and `sqlite` are supported features, but got `{0}`",
                feature))
    })format!(
1829                            "only `mysql_backend`, `postgres_backend` and `sqlite` \
1830                                 are supported features, but got `{feature}`"
1831                        ),
1832                    ));
1833                }
1834            };
1835            let name = input.parse::<Ident>()?;
1836            let inner;
1837            let _paren = match ::syn::__private::parse_parens(&input) {
    ::syn::__private::Ok(parens) => {
        inner = parens.content;
        _ = inner;
        parens.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
}parenthesized!(inner in input);
1838            let mut ret = SqlFunctionAttribute::parse_attr(name, &inner, attr, attribute_span)?;
1839            if let SqlFunctionAttribute::Window { wrap_macro: w, .. } = &mut ret.item {
1840                *w = wrap_macro;
1841            }
1842            Ok(ret)
1843        } else {
1844            let name_str = name.to_string();
1845            let parsed_attr = match &*name_str {
1846                "window" => {
1847                    let restrictions = if BackendRestriction::parse_from(&input.fork()).is_ok() {
1848                        BackendRestriction::parse_from(input).map(Ok).ok()
1849                    } else {
1850                        None
1851                    };
1852                    if input.fork().parse::<::syn::token::CommaToken![,]>().is_ok() {
1853                        let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1854                    }
1855                    let require_order = if parse_require_order(&input.fork()).is_ok() {
1856                        Some(parse_require_order(input)?)
1857                    } else {
1858                        None
1859                    };
1860                    if input.fork().parse::<::syn::token::CommaToken![,]>().is_ok() {
1861                        let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1862                    }
1863                    let restrictions =
1864                        restrictions.unwrap_or_else(|| BackendRestriction::parse_from(input))?;
1865                    Self::Window {
1866                        ident: name,
1867                        restrictions,
1868                        require_order,
1869                        wrap_macro: None,
1870                    }
1871                }
1872                "sql_name" => parse_eq(input, "sql_name = \"SUM\"").map(|v| Self::SqlName {
1873                    ident: name,
1874                    value: v,
1875                })?,
1876                "backends" => BackendRestriction::parse_backends(input, name)
1877                    .map(|r| Self::Restriction { restriction: r })?,
1878                "dialect" => BackendRestriction::parse_sql_dialect(input, name)
1879                    .map(|r| Self::Restriction { restriction: r })?,
1880                "backend_bounds" => BackendRestriction::parse_backend_bounds(input, name)
1881                    .map(|r| Self::Restriction { restriction: r })?,
1882                "variadic" => {
1883                    if input.peek(LitInt) {
1884                        let count = input.parse::<LitInt>()?;
1885                        if !input.is_empty() {
1886                            return Err(syn::Error::new(
1887                                input.span(),
1888                                "unexpected token after positional `#[variadic(..)]`",
1889                            ));
1890                        }
1891                        Self::Variadic {
1892                            ident: name,
1893                            count,
1894                            skip_zero_arg_variant: LitBool::new(false, Span::call_site()),
1895                        }
1896                    } else {
1897                        let key: Ident = input.parse()?;
1898                        if key != "last_arguments" {
1899                            return Err(syn::Error::new(key.span(), "expect `last_arguments`"));
1900                        }
1901                        let _eq: ::syn::token::EqToken![=] = input.parse()?;
1902                        let count: LitInt = input.parse()?;
1903                        let skip_zero: LitBool = if input.peek(::syn::token::CommaToken![,]) {
1904                            let _: ::syn::token::CommaToken![,] = input.parse()?;
1905                            let key: Ident = input.parse()?;
1906                            if key != "skip_zero_argument_variant" {
1907                                return Err(syn::Error::new(
1908                                    key.span(),
1909                                    "expect `skip_zero_argument_variant`",
1910                                ));
1911                            }
1912                            let _eq: ::syn::token::EqToken![=] = input.parse()?;
1913                            input.parse()?
1914                        } else {
1915                            LitBool::new(false, Span::call_site())
1916                        };
1917                        Self::Variadic {
1918                            ident: name,
1919                            count,
1920                            skip_zero_arg_variant: skip_zero,
1921                        }
1922                    }
1923                }
1924                _ => {
1925                    // empty the parse buffer otherwise syn will return an error
1926                    let _ = input.step(|cursor| {
1927                        let mut rest = *cursor;
1928                        while let Some((_, next)) = rest.token_tree() {
1929                            rest = next;
1930                        }
1931                        Ok(((), rest))
1932                    });
1933                    SqlFunctionAttribute::Other(attr)
1934                }
1935            };
1936            Ok(AttributeSpanWrapper {
1937                ident_span: parsed_attr.span(),
1938                item: parsed_attr,
1939                attribute_span,
1940            })
1941        }
1942    }
1943}
1944
1945#[derive(#[automatically_derived]
impl ::core::default::Default for DeclareSqlFunctionArgs {
    #[inline]
    fn default() -> DeclareSqlFunctionArgs {
        DeclareSqlFunctionArgs {
            generate_return_type_helpers: ::core::default::Default::default(),
        }
    }
}Default)]
1946pub(crate) struct DeclareSqlFunctionArgs {
1947    pub(crate) generate_return_type_helpers: bool,
1948}
1949
1950impl DeclareSqlFunctionArgs {
1951    pub(crate) fn parse_from_macro_input(input: TokenStream) -> syn::Result<Self> {
1952        if input.is_empty() {
1953            return Ok(Self::default());
1954        }
1955        let input_span = input.span();
1956        let parsed: syn::MetaNameValue = syn::parse2(input).map_err(|e| {
1957            let span = e.span();
1958            syn::Error::new(
1959                span,
1960                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}, the correct format is `generate_return_type_helpers = true/false`",
                e))
    })format!("{e}, the correct format is `generate_return_type_helpers = true/false`"),
1961            )
1962        })?;
1963        match parsed {
1964            syn::MetaNameValue {
1965                path,
1966                value:
1967                    syn::Expr::Lit(syn::ExprLit {
1968                        lit: syn::Lit::Bool(b),
1969                        ..
1970                    }),
1971                ..
1972            } if path.is_ident("generate_return_type_helpers") => Ok(Self {
1973                generate_return_type_helpers: b.value,
1974            }),
1975            _ => Err(syn::Error::new(input_span, "Invalid config")),
1976        }
1977    }
1978}