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