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