1use proc_macro2::Span;
2use proc_macro2::TokenStream;
3use quote::format_ident;
4use quote::quote;
5use quote::ToTokens;
6use quote::TokenStreamExt;
7use std::iter;
8use syn::parse::{Parse, ParseStream, Result};
9use syn::punctuated::Pair;
10use syn::punctuated::Punctuated;
11use syn::spanned::Spanned;
12use syn::{
13 parenthesized, parse_quote, Attribute, GenericArgument, Generics, Ident, ImplGenerics, LitStr,
14 PathArguments, Token, Type, TypeGenerics,
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) = &attr.item {
88 Some((c.base10_parse(), c.span()))
89 } else {
90 None
91 }
92 });
93
94 let Some((variadic_argument_count, variadic_span)) = variadic_argument_count else {
95 let sql_name = parse_sql_name_attr(&mut input);
96
97 return expand_nonvariadic(
98 input,
99 sql_name,
100 legacy_helper_type_and_module,
101 generate_return_type_helpers,
102 );
103 };
104
105 let variadic_argument_count = variadic_argument_count?;
106
107 let variadic_variants = VARIADIC_ARG_COUNT_ENV
108 .and_then(|arg_count| arg_count.parse::<usize>().ok())
109 .unwrap_or(VARIADIC_VARIANTS_DEFAULT);
110
111 let mut result = TokenStream::new();
112 let mut helper_type_modules = ::alloc::vec::Vec::new()vec![];
113 for variant_no in 0..=variadic_variants {
114 let expanded = expand_variadic(
115 input.clone(),
116 legacy_helper_type_and_module,
117 generate_return_type_helpers,
118 variadic_argument_count,
119 variant_no,
120 variadic_span,
121 )?;
122
123 if let Some(return_type_helper_module_path) = expanded.return_type_helper_module_path {
124 helper_type_modules.push(return_type_helper_module_path);
125 }
126
127 result.append_all(expanded.tokens);
128 }
129
130 if generate_return_type_helpers {
131 let return_types_module_name = Ident::new(
132 &::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__{0}_return_types",
input.fn_name))
})format!("__{}_return_types", input.fn_name),
133 input.fn_name.span(),
134 );
135 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! {
136 #result
137
138 #[allow(unused_imports)]
139 #[doc(inline)]
140 mod #return_types_module_name {
141 #(
142 #[doc(inline)]
143 pub use super:: #helper_type_modules ::*;
144 )*
145 }
146 };
147
148 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! {
149 #return_types_module_name
150 });
151
152 Ok(ExpandedSqlFunction {
153 tokens: result,
154 return_type_helper_module_path,
155 })
156 } else {
157 Ok(ExpandedSqlFunction {
158 tokens: result,
159 return_type_helper_module_path: None,
160 })
161 }
162}
163
164fn expand_variadic(
165 mut input: SqlFunctionDecl,
166 legacy_helper_type_and_module: bool,
167 generate_return_type_helpers: bool,
168 variadic_argument_count: usize,
169 variant_no: usize,
170 variadic_span: Span,
171) -> syn::Result<ExpandedSqlFunction> {
172 add_variadic_doc_comments(&mut input.attributes, &input.fn_name.to_string());
173
174 let sql_name = parse_sql_name_attr(&mut input);
175
176 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);
177
178 let nonvariadic_args_count = input
179 .args
180 .len()
181 .checked_sub(variadic_argument_count)
182 .ok_or_else(|| {
183 syn::Error::new(
184 variadic_span,
185 "invalid variadic argument count: not enough function arguments",
186 )
187 })?;
188
189 let mut variadic_generic_indexes = ::alloc::vec::Vec::new()vec![];
190 let mut arguments_with_generic_types = ::alloc::vec::Vec::new()vec![];
191 for (arg_idx, arg) in input.args.iter().skip(nonvariadic_args_count).enumerate() {
192 let Type::Path(ty_path) = arg.ty.clone() else {
194 continue;
195 };
196 let Ok(ty_ident) = ty_path.path.require_ident() else {
197 continue;
198 };
199
200 let idx = input.generics.params.iter().position(|param| match param {
201 GenericParam::Type(type_param) => type_param.ident == *ty_ident,
202 _ => false,
203 });
204
205 if let Some(idx) = idx {
206 variadic_generic_indexes.push(idx);
207 arguments_with_generic_types.push(arg_idx);
208 }
209 }
210
211 let mut args: Vec<_> = input.args.into_pairs().collect();
212 let variadic_args = args.split_off(nonvariadic_args_count);
213 let nonvariadic_args = args;
214
215 let variadic_args: Vec<_> = iter::repeat_n(variadic_args, variant_no)
216 .enumerate()
217 .flat_map(|(arg_group_idx, arg_group)| {
218 let mut resulting_args = ::alloc::vec::Vec::new()vec![];
219
220 for (arg_idx, arg) in arg_group.into_iter().enumerate() {
221 let mut arg = arg.into_value();
222
223 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);
224
225 if arguments_with_generic_types.contains(&arg_idx) {
226 let Type::Path(mut ty_path) = arg.ty.clone() else {
227 {
::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")
228 };
229 let Ok(ident) = ty_path.path.require_ident() else {
230 {
::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")
231 };
232
233 ty_path.path.segments[0].ident =
234 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);
235 arg.ty = Type::Path(ty_path);
236 }
237
238 let pair = Pair::new(arg, Some(::syn::token::CommaToken])));
239 resulting_args.push(pair);
240 }
241
242 resulting_args
243 })
244 .collect();
245
246 input.args = nonvariadic_args.into_iter().chain(variadic_args).collect();
247
248 let generics: Vec<_> = input.generics.params.into_pairs().collect();
249 input.generics.params = if variant_no == 0 {
250 generics
251 .into_iter()
252 .enumerate()
253 .filter_map(|(generic_idx, generic)| {
254 (!variadic_generic_indexes.contains(&generic_idx)).then_some(generic)
255 })
256 .collect()
257 } else {
258 iter::repeat_n(generics, variant_no)
259 .enumerate()
260 .flat_map(|(generic_group_idx, generic_group)| {
261 let mut resulting_generics = ::alloc::vec::Vec::new()vec![];
262
263 for (generic_idx, generic) in generic_group.into_iter().enumerate() {
264 if !variadic_generic_indexes.contains(&generic_idx) {
265 if generic_group_idx == 0 {
266 resulting_generics.push(generic);
267 }
268
269 continue;
270 }
271
272 let mut generic = generic.into_value();
273
274 if let GenericParam::Type(type_param) = &mut generic {
275 type_param.ident =
276 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);
277 } else {
278 {
::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")
279 }
280
281 let pair = Pair::new(generic, Some(::syn::token::CommaToken])));
282 resulting_generics.push(pair);
283 }
284
285 resulting_generics
286 })
287 .collect()
288 };
289
290 expand_nonvariadic(
291 input,
292 sql_name,
293 legacy_helper_type_and_module,
294 generate_return_type_helpers,
295 )
296}
297
298fn add_variadic_doc_comments(
299 attributes: &mut Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
300 fn_name: &str,
301) {
302 let doc_comments_end = attributes.len()
303 - attributes
304 .iter()
305 .rev()
306 .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")))
307 .unwrap_or(attributes.len());
308
309 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`");
310
311 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! {
312 #[doc = #fn_family]
319 #[doc(alias = #fn_name)]
335 };
336
337 for (doc_comments_end, new_attribute) in
338 (attributes.len() - doc_comments_end..).zip(doc_comments)
339 {
340 attributes.insert(
341 doc_comments_end,
342 AttributeSpanWrapper {
343 item: SqlFunctionAttribute::Other(new_attribute),
344 attribute_span: Span::mixed_site(),
345 ident_span: Span::mixed_site(),
346 },
347 );
348 }
349}
350
351fn parse_sql_name_attr(input: &mut SqlFunctionDecl) -> String {
352 let result = input
353 .attributes
354 .iter()
355 .find_map(|attr| match attr.item {
356 SqlFunctionAttribute::SqlName(_, ref value) => Some(value.value()),
357 _ => None,
358 })
359 .unwrap_or_else(|| input.fn_name.to_string());
360
361 result
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, "std");
::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: ::std::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, "std");
::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: ::std::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_ident(&mut _s, "std");
::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_ident(&mut _s, "std");
::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 + std::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 + std::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_ident(&mut _s, "std");
::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_ident(&mut _s, "std");
::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 + std::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 + std::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, "std");
::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, "std");
::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, "std");
::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 + ::std::panic::UnwindSafe
923 + ::std::panic::RefUnwindSafe,
924 A::Output: ToSql<#return_type, Sqlite>,
925 (#(#arg_name,)*): FromSqlRow<(#(#arg_type,)*), Sqlite> +
926 StaticallySizedRow<(#(#arg_type,)*), Sqlite> +
927 ::std::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_ident(&mut _s, "std");
::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, "std");
::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, "std");
::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 + std::panic::UnwindSafe
954 + std::panic::RefUnwindSafe,
955 A::Output: ToSql<#return_type, Sqlite>,
956 #arg_name: FromSqlRow<#arg_type, Sqlite> +
957 StaticallySizedRow<#arg_type, Sqlite> +
958 ::std::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: syn::LitInt = syn::parse2(tokens.clone()).map_err(|e| {
1224 syn::Error::new(
1225 e.span(),
1226 ::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)]`"),
1227 )
1228 })?;
1229 Ok(Some(AttributeSpanWrapper {
1230 item: SqlFunctionAttribute::Variadic(
1231 path.require_ident()
1232 .map_err(|e| {
1233 syn::Error::new(
1234 e.span(),
1235 ::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)]`"),
1236 )
1237 })?
1238 .clone(),
1239 count.clone(),
1240 ),
1241 attribute_span: attr.span(),
1242 ident_span: path.require_ident()?.span(),
1243 }))
1244 }
1245 syn::Meta::NameValue(_) | syn::Meta::Path(_) => Ok(Some(AttributeSpanWrapper {
1246 attribute_span: attr.span(),
1247 ident_span: attr.span(),
1248 item: SqlFunctionAttribute::Other(attr),
1249 })),
1250 syn::Meta::List(_) => {
1251 let name = attr.meta.path().require_ident()?;
1252 let attribute_span = attr.meta.span();
1253 attr.clone()
1254 .parse_args_with(|input: &syn::parse::ParseBuffer| {
1255 SqlFunctionAttribute::parse_attr(
1256 name.clone(),
1257 input,
1258 attr.clone(),
1259 attribute_span,
1260 )
1261 })
1262 }
1263 }
1264}
1265
1266fn parse_attributes(
1267 combine_error: &mut impl FnMut(syn::Error),
1268 attributes: Vec<Attribute>,
1269) -> Vec<AttributeSpanWrapper<SqlFunctionAttribute>> {
1270 let attribute_count = attributes.len();
1271
1272 let attributes = attributes
1273 .into_iter()
1274 .filter_map(|attr| parse_attribute(attr).transpose());
1275
1276 let mut attributes_collected = Vec::with_capacity(attribute_count);
1277 for attr in attributes {
1278 match attr {
1279 Ok(attr) => attributes_collected.push(attr),
1280 Err(e) => {
1281 combine_error(e);
1282 }
1283 }
1284 }
1285 attributes_collected
1286}
1287
1288#[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)]
1290struct StrictFnArg {
1291 name: Ident,
1292 colon_token: ::syn::token::ColonToken![:],
1293 ty: Type,
1294}
1295
1296impl Parse for StrictFnArg {
1297 fn parse(input: ParseStream) -> Result<Self> {
1298 let name = input.parse()?;
1299 let colon_token = input.parse()?;
1300 let ty = input.parse()?;
1301 Ok(Self {
1302 name,
1303 colon_token,
1304 ty,
1305 })
1306 }
1307}
1308
1309impl ToTokens for StrictFnArg {
1310 fn to_tokens(&self, tokens: &mut TokenStream) {
1311 self.name.to_tokens(tokens);
1312 self.colon_token.to_tokens(tokens);
1313 self.name.to_tokens(tokens);
1314 }
1315}
1316
1317fn is_sqlite_type(ty: &Type) -> bool {
1318 let last_segment = if let Type::Path(tp) = ty {
1319 if let Some(segment) = tp.path.segments.last() {
1320 segment
1321 } else {
1322 return false;
1323 }
1324 } else {
1325 return false;
1326 };
1327
1328 let ident = last_segment.ident.to_string();
1329 if ident == "Nullable" {
1330 if let PathArguments::AngleBracketed(ref ab) = last_segment.arguments {
1331 if let Some(GenericArgument::Type(ty)) = ab.args.first() {
1332 return is_sqlite_type(ty);
1333 }
1334 }
1335 return false;
1336 }
1337
1338 [
1339 "BigInt",
1340 "Binary",
1341 "Bool",
1342 "Date",
1343 "Double",
1344 "Float",
1345 "Integer",
1346 "Numeric",
1347 "SmallInt",
1348 "Text",
1349 "Time",
1350 "Timestamp",
1351 ]
1352 .contains(&ident.as_str())
1353}
1354
1355#[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)]
1356enum BackendRestriction {
1357 #[default]
1358 None,
1359 SqlDialect(syn::Ident, syn::Ident, syn::Path),
1360 BackendBound(
1361 syn::Ident,
1362 syn::punctuated::Punctuated<syn::TypeParamBound, ::syn::token::Plussyn::Token![+]>,
1363 ),
1364 Backends(
1365 syn::Ident,
1366 syn::punctuated::Punctuated<syn::Path, ::syn::token::Commasyn::Token![,]>,
1367 ),
1368}
1369
1370impl BackendRestriction {
1371 fn parse_from(input: &syn::parse::ParseBuffer<'_>) -> Result<Self> {
1372 if input.is_empty() {
1373 return Ok(Self::None);
1374 }
1375 Self::parse(input)
1376 }
1377
1378 fn parse_backends(
1379 input: &syn::parse::ParseBuffer<'_>,
1380 name: Ident,
1381 ) -> Result<BackendRestriction> {
1382 let backends = Punctuated::parse_terminated(input)?;
1383 Ok(Self::Backends(name, backends))
1384 }
1385
1386 fn parse_sql_dialect(
1387 content: &syn::parse::ParseBuffer<'_>,
1388 name: Ident,
1389 ) -> Result<BackendRestriction> {
1390 let dialect = content.parse()?;
1391 let _del: ::syn::token::Commasyn::Token![,] = content.parse()?;
1392 let dialect_variant = content.parse()?;
1393
1394 Ok(Self::SqlDialect(name, dialect, dialect_variant))
1395 }
1396
1397 fn parse_backend_bounds(
1398 input: &syn::parse::ParseBuffer<'_>,
1399 name: Ident,
1400 ) -> Result<BackendRestriction> {
1401 let restrictions = Punctuated::parse_terminated(input)?;
1402 Ok(Self::BackendBound(name, restrictions))
1403 }
1404
1405 fn generate_all_window_fragment_impls(
1406 &self,
1407 mut generics: Generics,
1408 ty_generics: &TypeGenerics<'_>,
1409 fn_name: &syn::Ident,
1410 require_order: bool,
1411 ) -> TokenStream {
1412 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));
1413 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));
1414 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));
1415 let order = if require_order {
1416 {
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! {
1417 diesel::internal::sql_functions::Order<__O, true>
1418 }
1419 } else {
1420 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__O");
_s
}quote::quote! {__O}
1421 };
1422 match *self {
1423 BackendRestriction::None => {
1424 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));
1425 let (impl_generics, _, _) = generics.split_for_impl();
1426 Self::generate_window_fragment_impl(
1427 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1428 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,)),
1429 &impl_generics,
1430 ty_generics,
1431 fn_name,
1432 None,
1433 &order,
1434 )
1435 }
1436 BackendRestriction::SqlDialect(_, ref dialect, ref dialect_type) => {
1437 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));
1438 let (impl_generics, _, _) = generics.split_for_impl();
1439 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! {
1440 impl #impl_generics WindowFunctionFragment<#fn_name #ty_generics, __DieselInternal>
1441 for OverClause<__P, #order, __F>
1442 where
1443 Self: WindowFunctionFragment<#fn_name #ty_generics, __DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>,
1444 __DieselInternal: diesel::backend::Backend,
1445 {
1446 }
1447
1448 };
1449 let specific_impl = Self::generate_window_fragment_impl(
1450 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1451 Some(
1452 ::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>,),
1453 ),
1454 &impl_generics,
1455 ty_generics,
1456 fn_name,
1457 Some(dialect_type),
1458 &order,
1459 );
1460 out.extend(specific_impl);
1461 out
1462 }
1463 BackendRestriction::BackendBound(_, ref restriction) => {
1464 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));
1465 let (impl_generics, _, _) = generics.split_for_impl();
1466 Self::generate_window_fragment_impl(
1467 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1468 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,)),
1469 &impl_generics,
1470 ty_generics,
1471 fn_name,
1472 None,
1473 &order,
1474 )
1475 }
1476 BackendRestriction::Backends(_, ref backends) => {
1477 let (impl_generics, _, _) = generics.split_for_impl();
1478 let backends = backends.iter().map(|b| {
1479 Self::generate_window_fragment_impl(
1480 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&b, &mut _s);
_s
}quote! {#b},
1481 None,
1482 &impl_generics,
1483 ty_generics,
1484 fn_name,
1485 None,
1486 &order,
1487 )
1488 });
1489
1490 ::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)*)
1491 }
1492 }
1493 }
1494
1495 fn generate_window_fragment_impl(
1496 backend: TokenStream,
1497 backend_bound: Option<proc_macro2::TokenStream>,
1498 impl_generics: &ImplGenerics<'_>,
1499 ty_generics: &TypeGenerics<'_>,
1500 fn_name: &syn::Ident,
1501 dialect: Option<&syn::Path>,
1502 order: &TokenStream,
1503 ) -> TokenStream {
1504 {
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! {
1505 impl #impl_generics WindowFunctionFragment<#fn_name #ty_generics, #backend, #dialect> for OverClause<__P, #order, __F>
1506 where #backend_bound
1507 {
1508
1509 }
1510 }
1511 }
1512
1513 fn generate_all_queryfragment_impls(
1514 &self,
1515 mut generics: Generics,
1516 ty_generics: &TypeGenerics<'_>,
1517 arg_name: &[&syn::Ident],
1518 fn_name: &syn::Ident,
1519 ) -> proc_macro2::TokenStream {
1520 match *self {
1521 BackendRestriction::None => {
1522 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));
1523 let (impl_generics, _, _) = generics.split_for_impl();
1524 Self::generate_queryfragment_impl(
1525 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1526 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,)),
1527 &impl_generics,
1528 ty_generics,
1529 arg_name,
1530 fn_name,
1531 None,
1532 )
1533 }
1534 BackendRestriction::BackendBound(_, ref restriction) => {
1535 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));
1536 let (impl_generics, _, _) = generics.split_for_impl();
1537 Self::generate_queryfragment_impl(
1538 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1539 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,)),
1540 &impl_generics,
1541 ty_generics,
1542 arg_name,
1543 fn_name,
1544 None,
1545 )
1546 }
1547 BackendRestriction::SqlDialect(_, ref dialect, ref dialect_type) => {
1548 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));
1549 let (impl_generics, _, _) = generics.split_for_impl();
1550 let specific_impl = Self::generate_queryfragment_impl(
1551 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1552 Some(
1553 ::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>,),
1554 ),
1555 &impl_generics,
1556 ty_generics,
1557 arg_name,
1558 fn_name,
1559 Some(dialect_type),
1560 );
1561 {
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! {
1562 impl #impl_generics QueryFragment<__DieselInternal>
1563 for #fn_name #ty_generics
1564 where
1565 Self: QueryFragment<__DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>,
1566 __DieselInternal: diesel::backend::Backend,
1567 {
1568 fn walk_ast<'__b>(&'__b self, mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
1569 <Self as QueryFragment<__DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>>::walk_ast(self, out)
1570 }
1571
1572 }
1573
1574 #specific_impl
1575 }
1576 }
1577 BackendRestriction::Backends(_, ref backends) => {
1578 let (impl_generics, _, _) = generics.split_for_impl();
1579 let backends = backends.iter().map(|b| {
1580 Self::generate_queryfragment_impl(
1581 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&b, &mut _s);
_s
}quote! {#b},
1582 None,
1583 &impl_generics,
1584 ty_generics,
1585 arg_name,
1586 fn_name,
1587 None,
1588 )
1589 });
1590
1591 ::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)*)
1592 }
1593 }
1594 }
1595
1596 fn generate_queryfragment_impl(
1597 backend: proc_macro2::TokenStream,
1598 backend_bound: Option<proc_macro2::TokenStream>,
1599 impl_generics: &ImplGenerics<'_>,
1600 ty_generics: &TypeGenerics<'_>,
1601 arg_name: &[&syn::Ident],
1602 fn_name: &syn::Ident,
1603 dialect: Option<&syn::Path>,
1604 ) -> proc_macro2::TokenStream {
1605 {
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! {
1606 impl #impl_generics QueryFragment<#backend, #dialect>
1607 for #fn_name #ty_generics
1608 where
1609 #backend_bound
1610 #(#arg_name: QueryFragment<#backend>,)*
1611 {
1612 fn walk_ast<'__b>(&'__b self, mut out: AstPass<'_, '__b, #backend>) -> QueryResult<()>{
1613 out.push_sql(<Self as FunctionFragment<#backend>>::FUNCTION_NAME);
1614 out.push_sql("(");
1615 self.walk_arguments(out.reborrow())?;
1616 out.push_sql(")");
1617 Ok(())
1618 }
1619 }
1620 }
1621 }
1622}
1623
1624impl Parse for BackendRestriction {
1625 fn parse(input: ParseStream) -> Result<Self> {
1626 let name: syn::Ident = input.parse()?;
1627 let name_str = name.to_string();
1628 let content;
1629 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);
1630 match &*name_str {
1631 "backends" => Self::parse_backends(&content, name),
1632 "dialect" => Self::parse_sql_dialect(&content, name),
1633 "backend_bounds" => Self::parse_backend_bounds(&content, name),
1634 _ => Err(syn::Error::new(
1635 name.span(),
1636 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unexpected option `{0}`",
name_str))
})format!("unexpected option `{name_str}`"),
1637 )),
1638 }
1639 }
1640}
1641
1642#[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) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Variadic", __self_0, &__self_1),
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) =>
SqlFunctionAttribute::Variadic(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
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)]
1643enum SqlFunctionAttribute {
1644 Aggregate(Ident),
1645 Window {
1646 ident: Ident,
1647 restrictions: BackendRestriction,
1648 require_order: Option<bool>,
1649 },
1650 SqlName(Ident, LitStr),
1651 Restriction(BackendRestriction),
1652 Variadic(Ident, LitInt),
1653 SkipReturnTypeHelper(Ident),
1654 Other(Attribute),
1655}
1656
1657impl MySpanned for SqlFunctionAttribute {
1658 fn span(&self) -> proc_macro2::Span {
1659 match self {
1660 SqlFunctionAttribute::Restriction(BackendRestriction::Backends(ref ident, ..))
1661 | SqlFunctionAttribute::Restriction(BackendRestriction::SqlDialect(ref ident, ..))
1662 | SqlFunctionAttribute::Restriction(BackendRestriction::BackendBound(ref ident, ..))
1663 | SqlFunctionAttribute::Aggregate(ref ident, ..)
1664 | SqlFunctionAttribute::Window { ref ident, .. }
1665 | SqlFunctionAttribute::Variadic(ref ident, ..)
1666 | SqlFunctionAttribute::SkipReturnTypeHelper(ref ident)
1667 | SqlFunctionAttribute::SqlName(ref ident, ..) => ident.span(),
1668 SqlFunctionAttribute::Restriction(BackendRestriction::None) => {
1669 {
::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")
1670 }
1671 SqlFunctionAttribute::Other(ref attribute) => attribute.span(),
1672 }
1673 }
1674}
1675
1676fn parse_require_order(input: &syn::parse::ParseBuffer<'_>) -> Result<bool> {
1677 let ident = input.parse::<Ident>()?;
1678 if ident == "require_order" {
1679 let _ = input.parse::<::syn::token::EqToken![=]>()?;
1680 let value = input.parse::<LitBool>()?;
1681 Ok(value.value)
1682 } else {
1683 Err(syn::Error::new(
1684 ident.span(),
1685 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Expected `require_order` but got `{0}`",
ident))
})format!("Expected `require_order` but got `{ident}`"),
1686 ))
1687 }
1688}
1689
1690impl SqlFunctionAttribute {
1691 fn parse_attr(
1692 name: Ident,
1693 input: &syn::parse::ParseBuffer<'_>,
1694 attr: Attribute,
1695 attribute_span: proc_macro2::Span,
1696 ) -> Result<Option<AttributeSpanWrapper<Self>>> {
1697 if name == "cfg_attr" {
1700 let ident = input.parse::<Ident>()?;
1701 if ident != "feature" {
1702 return Err(syn::Error::new(
1703 ident.span(),
1704 ::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!(
1705 "only single feature `cfg_attr` attributes are supported. \
1706 Got `{ident}` but expected `feature = \"foo\"`"
1707 ),
1708 ));
1709 }
1710 let _ = input.parse::<::syn::token::EqToken![=]>()?;
1711 let feature = input.parse::<LitStr>()?;
1712 let feature_value = feature.value();
1713 let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1714 let ignore = match feature_value.as_str() {
1715 "postgres_backend" => !truecfg!(feature = "postgres"),
1716 "sqlite" => !truecfg!(feature = "sqlite"),
1717 "mysql_backend" => !truecfg!(feature = "mysql"),
1718 feature => {
1719 return Err(syn::Error::new(
1720 feature.span(),
1721 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("only `mysql_backend`, `postgres_backend` and `sqlite` are supported features, but got `{0}`",
feature))
})format!(
1722 "only `mysql_backend`, `postgres_backend` and `sqlite` \
1723 are supported features, but got `{feature}`"
1724 ),
1725 ));
1726 }
1727 };
1728 let name = input.parse::<Ident>()?;
1729 let inner;
1730 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);
1731 let ret = SqlFunctionAttribute::parse_attr(name, &inner, attr, attribute_span)?;
1732 if ignore {
1733 Ok(None)
1734 } else {
1735 Ok(ret)
1736 }
1737 } else {
1738 let name_str = name.to_string();
1739 let parsed_attr = match &*name_str {
1740 "window" => {
1741 let restrictions = if BackendRestriction::parse_from(&input.fork()).is_ok() {
1742 BackendRestriction::parse_from(input).map(Ok).ok()
1743 } else {
1744 None
1745 };
1746 if input.fork().parse::<::syn::token::CommaToken![,]>().is_ok() {
1747 let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1748 }
1749 let require_order = if parse_require_order(&input.fork()).is_ok() {
1750 Some(parse_require_order(input)?)
1751 } else {
1752 None
1753 };
1754 if input.fork().parse::<::syn::token::CommaToken![,]>().is_ok() {
1755 let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1756 }
1757 let restrictions =
1758 restrictions.unwrap_or_else(|| BackendRestriction::parse_from(input))?;
1759 Self::Window {
1760 ident: name,
1761 restrictions,
1762 require_order,
1763 }
1764 }
1765 "sql_name" => {
1766 parse_eq(input, "sql_name = \"SUM\"").map(|v| Self::SqlName(name, v))?
1767 }
1768 "backends" => {
1769 BackendRestriction::parse_backends(input, name).map(Self::Restriction)?
1770 }
1771 "dialect" => {
1772 BackendRestriction::parse_sql_dialect(input, name).map(Self::Restriction)?
1773 }
1774 "backend_bounds" => {
1775 BackendRestriction::parse_backend_bounds(input, name).map(Self::Restriction)?
1776 }
1777 "variadic" => Self::Variadic(name, input.parse()?),
1778 _ => {
1779 let _ = input.step(|cursor| {
1781 let mut rest = *cursor;
1782 while let Some((_, next)) = rest.token_tree() {
1783 rest = next;
1784 }
1785 Ok(((), rest))
1786 });
1787 SqlFunctionAttribute::Other(attr)
1788 }
1789 };
1790 Ok(Some(AttributeSpanWrapper {
1791 ident_span: parsed_attr.span(),
1792 item: parsed_attr,
1793 attribute_span,
1794 }))
1795 }
1796 }
1797}
1798
1799#[derive(#[automatically_derived]
impl ::core::default::Default for DeclareSqlFunctionArgs {
#[inline]
fn default() -> DeclareSqlFunctionArgs {
DeclareSqlFunctionArgs {
generate_return_type_helpers: ::core::default::Default::default(),
}
}
}Default)]
1800pub(crate) struct DeclareSqlFunctionArgs {
1801 pub(crate) generate_return_type_helpers: bool,
1802}
1803
1804impl DeclareSqlFunctionArgs {
1805 pub(crate) fn parse_from_macro_input(input: TokenStream) -> syn::Result<Self> {
1806 if input.is_empty() {
1807 return Ok(Self::default());
1808 }
1809 let input_span = input.span();
1810 let parsed: syn::MetaNameValue = syn::parse2(input).map_err(|e| {
1811 let span = e.span();
1812 syn::Error::new(
1813 span,
1814 ::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`"),
1815 )
1816 })?;
1817 match parsed {
1818 syn::MetaNameValue {
1819 path,
1820 value:
1821 syn::Expr::Lit(syn::ExprLit {
1822 lit: syn::Lit::Bool(b),
1823 ..
1824 }),
1825 ..
1826 } if path.is_ident("generate_return_type_helpers") => Ok(Self {
1827 generate_return_type_helpers: b.value,
1828 }),
1829 _ => Err(syn::Error::new(input_span, "Invalid config")),
1830 }
1831 }
1832}