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.

Traits

Represents SQL types which can be added.
Represents SQL types which can be divided.
Represents SQL types which can be multiplied.
Represents SQL types which can be subtracted.