Skip to content

Latest commit

 

History

History
441 lines (376 loc) · 6.73 KB

File metadata and controls

441 lines (376 loc) · 6.73 KB

Scalar bigint

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

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

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

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

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

Native-scalar arithmetic (native op scalar)

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

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

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

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

Scalar-scalar arithmetic (via native extraction)

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

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

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

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

Test construction of min, zero and max values:

select '-1'::bigint::scalar;
  scalar  
----------
 int64:-1
(1 row)

select '0'::bigint::scalar;
 scalar  
---------
 int64:0
(1 row)

select '1'::bigint::scalar;
 scalar  
---------
 int64:1
(1 row)

Test setting a scalar value from max to 2

select set('1'::bigint::scalar, 2);
   set   
---------
 int64:2
(1 row)

Test setting to min, zero, max

select set('0'::bigint::scalar, -1::bigint);
   set    
----------
 int64:-1
(1 row)

select set('1'::bigint::scalar, 0::bigint);
   set   
---------
 int64:0
(1 row)

select set('-1'::bigint::scalar, 1::bigint);
   set   
---------
 int64:1
(1 row)

Comparison operations (via extraction)

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

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

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

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

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

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

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

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

Compare two scalar values (via extraction)

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

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

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

Edge case: operations with zero

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

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

select (0::bigint)::scalar * 1::bigint;
 ?column? 
----------
 int64:0
(1 row)

select (1::bigint)::scalar * 0::bigint;
 ?column? 
----------
 int64:0
(1 row)

Edge case: operations at boundaries

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

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

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

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

Test various casting functions used by the CREATE CAST machinery:

select scalar_bigint((-1)::bigint);
 scalar_bigint 
---------------
 int64:-1
(1 row)

select scalar_bigint((0)::bigint);
 scalar_bigint 
---------------
 int64:0
(1 row)

select scalar_bigint((1)::bigint);
 scalar_bigint 
---------------
 int64:1
(1 row)

select bigint_scalar((-1)::bigint::scalar);
 bigint_scalar 
---------------
            -1
(1 row)

select bigint_scalar((0)::bigint::scalar);
 bigint_scalar 
---------------
             0
(1 row)

select bigint_scalar((1)::bigint::scalar);
 bigint_scalar 
---------------
             1
(1 row)

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

select cast(-1::bigint as scalar);
  scalar  
----------
 int64:-1
(1 row)

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

select cast(1::bigint as scalar);
 scalar  
---------
 int64:1
(1 row)

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

select cast((-1::bigint)::scalar as bigint);
 int8 
------
   -1
(1 row)

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

select cast((1::bigint)::scalar as scalar);
 scalar  
---------
 int64:1
(1 row)

Round-trip conversion tests (value should be preserved)

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

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

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

Multiple round-trips should preserve value

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

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

NULL handling

select NULL::bigint::scalar;
 scalar 
--------
 int64
(1 row)

select (1::bigint)::scalar + NULL::bigint;
ERROR:  Cannot pass NULL to scalar_plus_int64
select NULL::bigint + (1::bigint)::scalar;
ERROR:  Cannot pass NULL to plus_scalar_int64
select NULL::bigint * (0::bigint)::scalar;
ERROR:  Cannot pass NULL to mult_scalar_int64

Utility functions

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

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

select type((1::bigint)::scalar);
 type  
-------
 int64
(1 row)

select print((1::bigint)::scalar);
 print 
-------
 1
(1 row)

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

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

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