Skip to main content

diesel_derives/
sql_function.rs

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