Riak TS Arithmetic Operations

Riak TS supports arithmetic operations in the SELECT list.

Note: Arithmetic operations and aggregate functions cannot currently be mixed in a single value expression.

Arithmetic operations default to 64-bit integer math, unless mixed with a double, at which point they become floating-point.

Important: Proper spacing around arithmetic operators is required.

Numeric Literals

Integer, decimal floating point, and exponent notation floating point numeric literals are accepted:

SELECT 555, 1.1, 1e1, 1.123e-2 from GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'
555<SINT64> 1.1<DOUBLE> 10.0<DOUBLE> 0.01123<DOUBLE>
555 1.1 10.0 0.01123

Addition and Subtraction

SELECT temperature, temperature + 1, temperature - 1 FROM GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'
temperature<DOUBLE> (temperature+1)<DOUBLE> (temperature-1)<DOUBLE>
27.1 28.1 26.1

Multiplication and Division

SELECT temperature, temperature * 2, temperature / 2 from GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'
temperature<DOUBLE> (temperature*2)<DOUBLE> (temperature/2)<DOUBLE>
27.1 54.2 13.55

Negation

SELECT temperature, -temperature from GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'
temperature<DOUBLE> -temperature<DOUBLE>
27.1 -27.1

Order of Operations

SELECT temperature + 2 * 3, (temperature + 2) * 3 from GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'
(temperature+(2*3))<DOUBLE> ((temperature+2)*3)<DOUBLE>
33.1 87.30000000000001

Floating Point Odds and Ends

Operations on floating point numbers that would return Infinity or NaN are not supported.

For example, neither of these queries return successfully:

SELECT 0.0 / 0.0 from GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'

SELECT 1.0 / 0.0 from GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'

Operations with Multiple Field References

Operations involving two or more references to fields/columns are not supported.

This query will return an error:

SELECT temperature + temperature FROM GeoCheckin
WHERE time > 1452252523182 AND time < 1452252543182 AND myfamily = 'family1' AND myseries = 'series1'