| //! Helper macros to define custom sql functions |
| |
| #[doc(inline)] |
| pub use diesel_derives::sql_function_proc as sql_function; |
| |
| #[macro_export] |
| #[doc(hidden)] |
| macro_rules! no_arg_sql_function_body_except_to_sql { |
| ($type_name:ident, $return_type:ty, $docs:expr) => { |
| #[allow(non_camel_case_types)] |
| #[doc=$docs] |
| #[derive( |
| Debug, |
| Clone, |
| Copy, |
| $crate::query_builder::QueryId, |
| $crate::expression::ValidGrouping |
| )] |
| pub struct $type_name; |
| |
| impl $crate::expression::Expression for $type_name { |
| type SqlType = $return_type; |
| } |
| |
| impl<QS> $crate::expression::SelectableExpression<QS> for $type_name {} |
| |
| impl<QS> $crate::expression::AppearsOnTable<QS> for $type_name {} |
| }; |
| } |
| |
| #[macro_export] |
| #[doc(hidden)] |
| macro_rules! no_arg_sql_function_body { |
| ($type_name:ident, $return_type:ty, $docs:expr, $($constraint:ident)::+) => { |
| no_arg_sql_function_body_except_to_sql!($type_name, $return_type, $docs); |
| |
| impl<DB> $crate::query_builder::QueryFragment<DB> for $type_name where |
| DB: $crate::backend::Backend + $($constraint)::+, |
| { |
| fn walk_ast(&self, mut out: $crate::query_builder::AstPass<DB>) -> $crate::result::QueryResult<()> { |
| out.push_sql(concat!(stringify!($type_name), "()")); |
| Ok(()) |
| } |
| } |
| }; |
| |
| ($type_name:ident, $return_type:ty, $docs:expr) => { |
| no_arg_sql_function_body_except_to_sql!($type_name, $return_type, $docs); |
| |
| impl<DB> $crate::query_builder::QueryFragment<DB> for $type_name where |
| DB: $crate::backend::Backend, |
| { |
| fn walk_ast(&self, mut out: $crate::query_builder::AstPass<DB>) -> $crate::result::QueryResult<()> { |
| out.push_sql(concat!(stringify!($type_name), "()")); |
| Ok(()) |
| } |
| } |
| }; |
| } |
| |
| #[macro_export] |
| /// Declare a 0 argument SQL function for use in your code. This will generate a |
| /// unit struct, which is an expression representing calling this function. See |
| /// [`now`](expression/dsl/struct.now.html) for example output. `now` was |
| /// generated using: |
| /// |
| /// ```no_run |
| /// # pub use diesel::*; |
| /// no_arg_sql_function!(now, sql_types::Timestamp, "Represents the SQL NOW() function"); |
| /// # fn main() {} |
| /// ``` |
| /// |
| /// You can optionally pass the name of a trait, as a constraint for backends which support the |
| /// function. |
| macro_rules! no_arg_sql_function { |
| ($type_name:ident, $return_type:ty) => { |
| no_arg_sql_function!($type_name, $return_type, ""); |
| }; |
| |
| ($type_name:ident, $return_type:ty, $docs:expr) => { |
| no_arg_sql_function_body!($type_name, $return_type, $docs); |
| }; |
| |
| ($type_name:ident, $return_type:ty, $docs:expr, $($constraint:ident)::+) => { |
| no_arg_sql_function_body!($type_name, $return_type, $docs, $($constraint)::+); |
| }; |
| } |
| |
| #[doc(hidden)] |
| pub mod aggregate_folding; |
| #[doc(hidden)] |
| pub mod aggregate_ordering; |
| #[doc(hidden)] |
| pub mod date_and_time; |
| #[doc(hidden)] |
| pub mod helper_types; |