There are different ways that casts appear in EdgeQL.
An explicit cast is just using the angle brackets <type>
:
# Cast a string literal into an integer.
SELECT <int64>"42";
Assignment casts happen when inserting new objects. Numeric types will often be automatically cast into the specific type corresponding to the property they are assigned to. This is to avoid extra typing when dealing with numeric value using fewer bits:
# Automatically cast a literal 42 (which is int64
# by default) into an int16 value.
INSERT MyObject {
int16_val := 42
};
If assignment casting is supported for a given pair of types, explicit casting of those types is also supported.
Implicit casts happen automatically whenever the value type doesn’t
match the expected type in an expression. This is mostly supported for
numeric casts that don’t incur any potential information loss (in form
of truncation), so typically from a less precise type, to a more
precise one. The int64
to float64
is a notable
exception, which can suffer from truncation of significant digits for
very large integer values. There are a few scenarios when implicit
casts can occur:
Passing arguments that don’t match exactly the types in the function signature:
db> ...
WITH x := <float32>12.34
SELECT math::ceil(x);
{13}
The function math::ceil()
only takes int64
,
float64
, bigint
, or decimal
as
its argument. So the float32
value will be implicitly
cast into a float64
in order to match a valid
signature.
Using operands that don’t match exactly the types in the operator signature (this works the same way as for functions):
db>
SELECT 1 + 2.3;
{3.3}
The operator +
is defined only for operands of
the same type, so in the expression above the int64
value 1
is implicitly cast into a float64
in
order to match the other operand and produce a valid signature.
Mixing different numeric types in a set:
db>
SELECT {1, 2.3, <float32>4.5} IS float64;
{true, true, true}
All elements in a set have to be of the same type, so the values
are cast into float64
as that happens to be the common
type to which all the set elements can be implicitly cast. This
would work out the same way if UNION
was used instead:
db>
SELECT (1 UNION 2.3 UNION <float32>4.5) IS float64;
{true, true, true}
If implicit casting is supported for a given pair of types, assignment and explicit casting of those types is also supported.
from \ to | |||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||
|
|
impl |
|
|
|
|
| ||||||||||
|
|
|
|
|
|
|
| ||||||||||
|
|
impl |
impl |
impl |
impl |
impl |
impl | ||||||||||
|
|
impl |
|
impl |
impl |
impl | |||||||||||
|
|
|
impl |
|
|
impl |
impl | ||||||||||
impl | |||||||||||||||||
|
|
|
|
|
|
|
| ||||||||||
|
| ||||||||||||||||
|
| ||||||||||||||||
|
| ||||||||||||||||
|
| ||||||||||||||||
|
|
| |||||||||||||||
|
|
|
| ||||||||||||||
|
|
<>
- can be cast explicitly
:=
- assignment cast is supported
“impl” - implicit cast is supported