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