Skip to content

Latest commit

 

History

History
441 lines (376 loc) · 7.16 KB

File metadata and controls

441 lines (376 loc) · 7.16 KB

Scalar float8

Test various scalar math operations with native Postgres types Scalar-native arithmetic (scalar op native)

select (1::float8)::scalar + -1::float8;
   ?column?    
---------------
 fp64:0.000000
(1 row)

select (1::float8)::scalar - 1::float8;
   ?column?    
---------------
 fp64:0.000000
(1 row)

select (1::float8)::scalar * -1::float8;
    ?column?    
----------------
 fp64:-1.000000
(1 row)

select (1::float8)::scalar / 1::float8;
   ?column?    
---------------
 fp64:1.000000
(1 row)

Native-scalar arithmetic (native op scalar)

select 1::float8 + (-1::float8)::scalar;
 ?column? 
----------
        0
(1 row)

select 1::float8 - (1::float8)::scalar;
 ?column? 
----------
        0
(1 row)

select 1::float8 * (-1::float8)::scalar;
 ?column? 
----------
       -1
(1 row)

select 1::float8 / (1::float8)::scalar;
 ?column? 
----------
        1
(1 row)

Scalar-scalar arithmetic (via native extraction)

select ((1::float8)::scalar)::float8 + ((-1::float8)::scalar)::float8;
 ?column? 
----------
        0
(1 row)

select ((1::float8)::scalar)::float8 - ((0::float8)::scalar)::float8;
 ?column? 
----------
        1
(1 row)

select ((1::float8)::scalar)::float8 * ((-1::float8)::scalar)::float8;
 ?column? 
----------
       -1
(1 row)

select ((1::float8)::scalar)::float8 / ((1::float8)::scalar)::float8;
 ?column? 
----------
        1
(1 row)

Test construction of min, zero and max values:

select '-1'::float8::scalar;
     scalar     
----------------
 fp64:-1.000000
(1 row)

select '0'::float8::scalar;
    scalar     
---------------
 fp64:0.000000
(1 row)

select '1'::float8::scalar;
    scalar     
---------------
 fp64:1.000000
(1 row)

Test setting a scalar value from max to 2

select set('1'::float8::scalar, 2);
      set      
---------------
 fp64:2.000000
(1 row)

Test setting to min, zero, max

select set('0'::float8::scalar, -1::float8);
      set       
----------------
 fp64:-1.000000
(1 row)

select set('1'::float8::scalar, 0::float8);
      set      
---------------
 fp64:0.000000
(1 row)

select set('-1'::float8::scalar, 1::float8);
      set      
---------------
 fp64:1.000000
(1 row)

Comparison operations (via extraction)

select ((1::float8)::scalar)::float8 = 1::float8;
 ?column? 
----------
 t
(1 row)

select ((-1::float8)::scalar)::float8 = -1::float8;
 ?column? 
----------
 t
(1 row)

select ((0::float8)::scalar)::float8 = 0::float8;
 ?column? 
----------
 t
(1 row)

select ((1::float8)::scalar)::float8 > -1::float8;
 ?column? 
----------
 t
(1 row)

select ((-1::float8)::scalar)::float8 < 1::float8;
 ?column? 
----------
 t
(1 row)

select ((1::float8)::scalar)::float8 >= 1::float8;
 ?column? 
----------
 t
(1 row)

select ((-1::float8)::scalar)::float8 <= -1::float8;
 ?column? 
----------
 t
(1 row)

select ((1::float8)::scalar)::float8 != -1::float8;
 ?column? 
----------
 t
(1 row)

Compare two scalar values (via extraction)

select ((1::float8)::scalar)::float8 = ((1::float8)::scalar)::float8;
 ?column? 
----------
 t
(1 row)

select ((1::float8)::scalar)::float8 > ((-1::float8)::scalar)::float8;
 ?column? 
----------
 t
(1 row)

select ((-1::float8)::scalar)::float8 < ((1::float8)::scalar)::float8;
 ?column? 
----------
 t
(1 row)

Edge case: operations with zero

select (0::float8)::scalar + 1::float8;
   ?column?    
---------------
 fp64:1.000000
(1 row)

select (1::float8)::scalar - 0::float8;
   ?column?    
---------------
 fp64:1.000000
(1 row)

select (0::float8)::scalar * 1::float8;
   ?column?    
---------------
 fp64:0.000000
(1 row)

select (1::float8)::scalar * 0::float8;
   ?column?    
---------------
 fp64:0.000000
(1 row)

Edge case: operations at boundaries

select (1::float8)::scalar + 0::float8;
   ?column?    
---------------
 fp64:1.000000
(1 row)

select (-1::float8)::scalar - 0::float8;
    ?column?    
----------------
 fp64:-1.000000
(1 row)

select (1::float8)::scalar / 1::float8;
   ?column?    
---------------
 fp64:1.000000
(1 row)

select (-1::float8)::scalar * 1::float8;
    ?column?    
----------------
 fp64:-1.000000
(1 row)

Test various casting functions used by the CREATE CAST machinery:

select scalar_float8((-1)::float8);
 scalar_float8  
----------------
 fp64:-1.000000
(1 row)

select scalar_float8((0)::float8);
 scalar_float8 
---------------
 fp64:0.000000
(1 row)

select scalar_float8((1)::float8);
 scalar_float8 
---------------
 fp64:1.000000
(1 row)

select float8_scalar((-1)::float8::scalar);
 float8_scalar 
---------------
            -1
(1 row)

select float8_scalar((0)::float8::scalar);
 float8_scalar 
---------------
             0
(1 row)

select float8_scalar((1)::float8::scalar);
 float8_scalar 
---------------
             1
(1 row)

These casting functions cast the Postgres type float8 to the GraphBLAS scalar type GrB_INT64.

select cast(-1::float8 as scalar);
     scalar     
----------------
 fp64:-1.000000
(1 row)

select cast(0::float8 as scalar);
    scalar     
---------------
 fp64:0.000000
(1 row)

select cast(1::float8 as scalar);
    scalar     
---------------
 fp64:1.000000
(1 row)

These tests cast back from the scalar type GrB_INT64 to the Postgres type float8

select cast((-1::float8)::scalar as float8);
 float8 
--------
     -1
(1 row)

select cast((0::float8)::scalar as  float8);
 float8 
--------
      0
(1 row)

select cast((1::float8)::scalar as scalar);
    scalar     
---------------
 fp64:1.000000
(1 row)

Round-trip conversion tests (value should be preserved)

select (-1::float8)::scalar::float8 = -1::float8;
 ?column? 
----------
 t
(1 row)

select (0::float8)::scalar::float8 = 0::float8;
 ?column? 
----------
 t
(1 row)

select (1::float8)::scalar::float8 = 1::float8;
 ?column? 
----------
 t
(1 row)

Multiple round-trips should preserve value

select ((-1::float8)::scalar::float8)::scalar::float8 = -1::float8;
 ?column? 
----------
 t
(1 row)

select ((1::float8)::scalar::float8)::scalar::float8 = 1::float8;
 ?column? 
----------
 t
(1 row)

NULL handling

select NULL::float8::scalar;
 scalar 
--------
 fp64
(1 row)

select (1::float8)::scalar + NULL::float8;
ERROR:  Cannot pass NULL to scalar_plus_fp64
select NULL::float8 + (1::float8)::scalar;
ERROR:  Cannot pass NULL to plus_scalar_fp64
select NULL::float8 * (0::float8)::scalar;
ERROR:  Cannot pass NULL to mult_scalar_fp64

Utility functions

select nvals((1::float8)::scalar) as has_value;
 has_value 
-----------
         1
(1 row)

select nvals(('fp64')::scalar) as empty_scalar;
 empty_scalar 
--------------
            0
(1 row)

select type((1::float8)::scalar);
 type 
------
 fp64
(1 row)

select print((1::float8)::scalar);
  print   
----------
 1.000000
(1 row)

select dup((1::float8)::scalar)::float8;
 dup 
-----
   1
(1 row)

select wait((1::float8)::scalar)::float8;
 wait 
------
    1
(1 row)

select nvals(clear((1::float8)::scalar)) as cleared;
 cleared 
---------
       0
(1 row)