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