Skip to main content

diesel_derives/
sql_function.rs

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