It’s possible to explicitly cast
between all numeric types. All numeric types can also be cast to and
from str
and json
.
A 16-bit signed integer.
An integer value in range from -32768
to +32767
(inclusive).
A 32-bit signed integer.
An integer value in range from -2147483648
to +2147483647
(inclusive).
A 64-bit signed integer.
An integer value in range from -9223372036854775808
to
+9223372036854775807
(inclusive).
A variable precision, inexact number.
Minimal guaranteed precision is at least 6 decimal digits. The
approximate range of a float32
is -3.4e+38
to
+3.4e+38
.
A variable precision, inexact number.
Minimal guaranteed precision is at least 15 decimal digits. The
approximate range of a float64
is -1.7e+308
to +1.7e+308
.
Arbitrary precision integer.
The EdgeDB philosophy is that using bigint type should be an explicit opt-in, but once used, the values should not be accidentally cast into a numeric type with less precision.
In accordance with this the mathematical functions are designed to keep the separation between bigint values and the rest of the numeric types.
All of the following types can be explicitly cast into bigint:
str
, json
, int16
,
int32
, int64
, float32
,
float64
, and decimal
.
A bigint literal is an integer literal followed by ‘n’:
db>
SELECT 42n IS bigint;
{true}
To represent really big integers it is possible to use the
exponent notation (e.g. 1e20n
instead of 100000000000000000000n
)
as long as the exponent is positive and there is no dot anywhere.
db>
SELECT 1e+100n IS bigint;
{true}
When a float literal is followed by ‘n’ it produces a
decimal
instead:
db>
SELECT 1.23n IS decimal;
{true}
db>
SELECT 1.0e+100n IS decimal;
{true}
Caution is advised when casting bigint
values into
json
. The JSON specification does not have a limit on
significant digits, so a bigint
number can be losslessly
represented in JSON. However, JSON decoders in many languages
will read all such numbers as some kind of 32- or 64-bit
number type, which may result in errors or precision loss. If
such loss is unacceptable, then consider casting the value
into str
and decoding it on the client side into a more
appropriate type.
Any number of arbitrary precision.
The EdgeDB philosophy is that using a decimal type should be an explicit opt-in, but once used, the values should not be accidentally cast into a numeric type with less precision.
In accordance with this the mathematical functions are designed to keep the separation between decimal values and the rest of the numeric types.
All of the following types can be explicitly cast into decimal:
str
, json
, int16
,
int32
, int64
, float32
,
float64
, and bigint
.
A decimal literal is a float literal followed by ‘n’:
db>
SELECT 1.23n IS decimal;
{true}
db>
SELECT 1.0e+100n IS decimal;
{true}
Note that an integer literal (without a dot or exponent) followed
by ‘n’ produces a bigint
. A literal without a dot
and with a positive exponent makes a bigint
, too:
db>
SELECT 42n IS bigint;
{true}
db>
SELECT 12e+34n IS bigint;
{true}
Caution is advised when casting decimal
values into
json
. The JSON specification does not have a limit on
significant digits, so a decimal
number can be losslessly
represented in JSON. However, JSON decoders in many languages
will read all such numbers as some kind of floating point
values, which may result in precision loss. If such loss is
unacceptable, then consider casting the value into str
and
decoding it on the client side into a more appropriate type.
Auto-incrementing sequence of int64
.
This type can be used to create auto-incrementing properties.
scalar type TicketNo extending sequence;
type Ticket {
property number -> TicketNo {
constraint exclusive;
}
}
The sequence is bound to the scalar type, not to the property, so
if multiple properties use the same sequence
type they will
share the same counter. For each distinct counter, a separate
scalar type that is extending sequence
should be used.
Scalar type
SDL,
DDL,
introspection,
arithmetic operators and numeric converter functions,
mathematical functions,
max()
,
min()
,
random()
,
round()
,
sum()
.