Expand description
Represents the output of numeric operators in SQL
Apps should not need to concern themselves with this module.
If you are looking for where the actual implementation of std::ops::Add
and friends are generated for columns, see
numeric_expr!
.
Crates which add new types which allow numeric operators should implement these traits to specify what the output is for a given right hand side.
Unlike the traits in std::ops
, the right hand side is an associated type
rather than a type parameter. The biggest drawback of this is that any type
can only have one right hand type which can be added/subtracted, etc. The
most immediately noticeable effect of this is that you cannot add a nullable
number to one that is not nullable.
The reason for this is because of the impl of std::ops::Add
that we need
to be able to write. We want the right hand side to allow Rust values which
should be sent as bind parameters, not just other Diesel expressions. That
means the impl would look like this:
impl<ST, T> std::ops::Add<T> for my_column
where
T: AsExpression<ST>,
my_column::SqlType: diesel::ops::Add<ST>,
This impl is not valid in Rust, as ST
is not constrained by the trait or
the implementing type. If there were two valid types for ST
which
satisfied all constraints, Rust would not know which one to use, and there
would be no way for the user to specify which one should be used.