Test various scalar math operations with native Postgres types Scalar-native arithmetic (scalar op native)
select (1::float4)::scalar + -1::float4;
?column?
---------------
fp32:0.000000
(1 row)
select (1::float4)::scalar - 1::float4;
?column?
---------------
fp32:0.000000
(1 row)
select (1::float4)::scalar * -1::float4;
?column?
----------------
fp32:-1.000000
(1 row)
select (1::float4)::scalar / 1::float4;
?column?
---------------
fp32:1.000000
(1 row)
Native-scalar arithmetic (native op scalar)
select 1::float4 + (-1::float4)::scalar;
?column?
----------
0
(1 row)
select 1::float4 - (1::float4)::scalar;
?column?
----------
0
(1 row)
select 1::float4 * (-1::float4)::scalar;
?column?
----------
-1
(1 row)
select 1::float4 / (1::float4)::scalar;
?column?
----------
1
(1 row)
Scalar-scalar arithmetic (via native extraction)
select ((1::float4)::scalar)::float4 + ((-1::float4)::scalar)::float4;
?column?
----------
0
(1 row)
select ((1::float4)::scalar)::float4 - ((0::float4)::scalar)::float4;
?column?
----------
1
(1 row)
select ((1::float4)::scalar)::float4 * ((-1::float4)::scalar)::float4;
?column?
----------
-1
(1 row)
select ((1::float4)::scalar)::float4 / ((1::float4)::scalar)::float4;
?column?
----------
1
(1 row)
Test construction of min, zero and max values:
select '-1'::float4::scalar;
scalar
----------------
fp32:-1.000000
(1 row)
select '0'::float4::scalar;
scalar
---------------
fp32:0.000000
(1 row)
select '1'::float4::scalar;
scalar
---------------
fp32:1.000000
(1 row)
Test setting a scalar value from max to 2
select set('1'::float4::scalar, 2);
set
---------------
fp32:2.000000
(1 row)
Test setting to min, zero, max
select set('0'::float4::scalar, -1::float4);
set
----------------
fp32:-1.000000
(1 row)
select set('1'::float4::scalar, 0::float4);
set
---------------
fp32:0.000000
(1 row)
select set('-1'::float4::scalar, 1::float4);
set
---------------
fp32:1.000000
(1 row)
Comparison operations (via extraction)
select ((1::float4)::scalar)::float4 = 1::float4;
?column?
----------
t
(1 row)
select ((-1::float4)::scalar)::float4 = -1::float4;
?column?
----------
t
(1 row)
select ((0::float4)::scalar)::float4 = 0::float4;
?column?
----------
t
(1 row)
select ((1::float4)::scalar)::float4 > -1::float4;
?column?
----------
t
(1 row)
select ((-1::float4)::scalar)::float4 < 1::float4;
?column?
----------
t
(1 row)
select ((1::float4)::scalar)::float4 >= 1::float4;
?column?
----------
t
(1 row)
select ((-1::float4)::scalar)::float4 <= -1::float4;
?column?
----------
t
(1 row)
select ((1::float4)::scalar)::float4 != -1::float4;
?column?
----------
t
(1 row)
Compare two scalar values (via extraction)
select ((1::float4)::scalar)::float4 = ((1::float4)::scalar)::float4;
?column?
----------
t
(1 row)
select ((1::float4)::scalar)::float4 > ((-1::float4)::scalar)::float4;
?column?
----------
t
(1 row)
select ((-1::float4)::scalar)::float4 < ((1::float4)::scalar)::float4;
?column?
----------
t
(1 row)
Edge case: operations with zero
select (0::float4)::scalar + 1::float4;
?column?
---------------
fp32:1.000000
(1 row)
select (1::float4)::scalar - 0::float4;
?column?
---------------
fp32:1.000000
(1 row)
select (0::float4)::scalar * 1::float4;
?column?
---------------
fp32:0.000000
(1 row)
select (1::float4)::scalar * 0::float4;
?column?
---------------
fp32:0.000000
(1 row)
Edge case: operations at boundaries
select (1::float4)::scalar + 0::float4;
?column?
---------------
fp32:1.000000
(1 row)
select (-1::float4)::scalar - 0::float4;
?column?
----------------
fp32:-1.000000
(1 row)
select (1::float4)::scalar / 1::float4;
?column?
---------------
fp32:1.000000
(1 row)
select (-1::float4)::scalar * 1::float4;
?column?
----------------
fp32:-1.000000
(1 row)
Test various casting functions used by the CREATE CAST machinery:
select scalar_float4((-1)::float4);
scalar_float4
----------------
fp32:-1.000000
(1 row)
select scalar_float4((0)::float4);
scalar_float4
---------------
fp32:0.000000
(1 row)
select scalar_float4((1)::float4);
scalar_float4
---------------
fp32:1.000000
(1 row)
select float4_scalar((-1)::float4::scalar);
float4_scalar
---------------
-1
(1 row)
select float4_scalar((0)::float4::scalar);
float4_scalar
---------------
0
(1 row)
select float4_scalar((1)::float4::scalar);
float4_scalar
---------------
1
(1 row)
These casting functions cast the Postgres type float4 to the
GraphBLAS scalar type GrB_INT32.
select cast(-1::float4 as scalar);
scalar
----------------
fp32:-1.000000
(1 row)
select cast(0::float4 as scalar);
scalar
---------------
fp32:0.000000
(1 row)
select cast(1::float4 as scalar);
scalar
---------------
fp32:1.000000
(1 row)
These tests cast back from the scalar type GrB_INT32 to the
Postgres type float4
select cast((-1::float4)::scalar as float4);
float4
--------
-1
(1 row)
select cast((0::float4)::scalar as float4);
float4
--------
0
(1 row)
select cast((1::float4)::scalar as scalar);
scalar
---------------
fp32:1.000000
(1 row)
Round-trip conversion tests (value should be preserved)
select (-1::float4)::scalar::float4 = -1::float4;
?column?
----------
t
(1 row)
select (0::float4)::scalar::float4 = 0::float4;
?column?
----------
t
(1 row)
select (1::float4)::scalar::float4 = 1::float4;
?column?
----------
t
(1 row)
Multiple round-trips should preserve value
select ((-1::float4)::scalar::float4)::scalar::float4 = -1::float4;
?column?
----------
t
(1 row)
select ((1::float4)::scalar::float4)::scalar::float4 = 1::float4;
?column?
----------
t
(1 row)
NULL handling
select NULL::float4::scalar;
scalar
--------
fp32
(1 row)
select (1::float4)::scalar + NULL::float4;
ERROR: Cannot pass NULL to scalar_plus_fp32
select NULL::float4 + (1::float4)::scalar;
ERROR: Cannot pass NULL to plus_scalar_fp32
select NULL::float4 * (0::float4)::scalar;
ERROR: Cannot pass NULL to mult_scalar_fp32
Utility functions
select nvals((1::float4)::scalar) as has_value;
has_value
-----------
1
(1 row)
select nvals(('fp32')::scalar) as empty_scalar;
empty_scalar
--------------
0
(1 row)
select type((1::float4)::scalar);
type
------
fp32
(1 row)
select print((1::float4)::scalar);
print
----------
1.000000
(1 row)
select dup((1::float4)::scalar)::float4;
dup
-----
1
(1 row)
select wait((1::float4)::scalar)::float4;
wait
------
1
(1 row)
select nvals(clear((1::float4)::scalar)) as cleared;
cleared
---------
0
(1 row)