macro_rules! sqlfunc {
    (
        fn $fn_name:ident $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        fn $fn_name:ident $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[is_monotone = $is_monotone:expr]
        fn $fn_name:ident $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[preserves_uniqueness = $preserves_uniqueness:expr]
        fn $fn_name:ident $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[preserves_uniqueness = $preserves_uniqueness:expr]
        #[is_monotone = $is_monotone:expr]
        fn $fn_name:ident $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[preserves_uniqueness = $preserves_uniqueness:expr]
        #[inverse = $inverse:expr]
        fn $fn_name:ident $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[preserves_uniqueness = $preserves_uniqueness:expr]
        #[inverse = $inverse:expr]
        #[is_monotone = $is_monotone:expr]
        fn $fn_name:ident ($($params:tt)*) $($tail:tt)*
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[preserves_uniqueness = $preserves_uniqueness:expr]
        #[inverse = $inverse:expr]
        #[is_monotone = $is_monotone:expr]
        fn $fn_name:ident<$lt:lifetime>(mut $param_name:ident: $input_ty:ty $(,)?) -> $output_ty:ty
            $body:block
    ) => { ... };
    (
        #[sqlname = $name:expr]
        #[preserves_uniqueness = $preserves_uniqueness:expr]
        #[inverse = $inverse:expr]
        #[is_monotone = $is_monotone:expr]
        fn $fn_name:ident<$lt:lifetime>($param_name:ident: $input_ty:ty $(,)?) -> $output_ty:ty
            $body:block
    ) => { ... };
}