blob: edd0aad59dcc88454718793c4bc999beb3d5a137 [file] [log] [blame]
--
-- complex
--
-- start_ignore
DROP TABLE complex_ttbl;
ERROR: table "complex_ttbl" does not exist
DROP SEQUENCE complex_seq;
ERROR: sequence "complex_seq" does not exist
-- end_ignore
CREATE SEQUENCE complex_seq CACHE 1;
CREATE TABLE complex_ttbl (id INTEGER NOT NULL DEFAULT 1, orderid INTEGER NOT NULL DEFAULT NEXTVAL('complex_seq'), c COMPLEX) DISTRIBUTED BY (id);
-- regular input
INSERT INTO complex_ttbl(c) VALUES (' 5');
INSERT INTO complex_ttbl(c) VALUES ('3 ');
INSERT INTO complex_ttbl(c) VALUES (' 6 ');
INSERT INTO complex_ttbl(c) VALUES (' -6 ');
INSERT INTO complex_ttbl(c) VALUES (' 5i');
INSERT INTO complex_ttbl(c) VALUES ('3i ');
INSERT INTO complex_ttbl(c) VALUES (' 6i ');
INSERT INTO complex_ttbl(c) VALUES (' -6i ');
INSERT INTO complex_ttbl(c) VALUES (' 5 + 3i ');
INSERT INTO complex_ttbl(c) VALUES (' 5 + -3i ');
INSERT INTO complex_ttbl(c) VALUES (' 6 - -7i ');
INSERT INTO complex_ttbl(c) VALUES (' -6 - -7i ');
INSERT INTO complex_ttbl(c) VALUES (' 1.2345678901234e+200 - -1.2345678901234e+200i ');
INSERT INTO complex_ttbl(c) VALUES (' -0 + -0i ');
INSERT INTO complex_ttbl(c) VALUES (' -0 - -0i ');
INSERT INTO complex_ttbl(c) VALUES (' -0 - 0i ');
INSERT INTO complex_ttbl(c) VALUES ('9+10i ');
INSERT INTO complex_ttbl(c) VALUES (' 9+10i');
INSERT INTO complex_ttbl(c) VALUES ('9-10i');
-- special input
INSERT INTO COMPLEX_ttbl(c) VALUES ('infinity + infinityi');
INSERT INTO COMPLEX_ttbl(c) VALUES ('infinity - infinityi');
INSERT INTO COMPLEX_ttbl(c) VALUES ('-InFiNity - -infinityi');
INSERT INTO COMPLEX_ttbl(c) VALUES ('-infinity + -InFinItyi');
INSERT INTO COMPLEX_ttbl(c) VALUES ('nan + nani');
INSERT INTO COMPLEX_ttbl(c) VALUES ('nan - nani');
INSERT INTO COMPLEX_ttbl(c) VALUES ('-nan - -NAni');
INSERT INTO COMPLEX_ttbl(c) VALUES ('-nAn + -naNi');
SELECT id, c FROM complex_ttbl ORDER BY orderid;
id | c
----+----------------------------------------------
1 | 5 + 0i
1 | 3 + 0i
1 | 6 + 0i
1 | -6 + 0i
1 | 0 + 5i
1 | 0 + 3i
1 | 0 + 6i
1 | 0 - 6i
1 | 5 + 3i
1 | 5 - 3i
1 | 6 + 7i
1 | -6 + 7i
1 | 1.2345678901234e+200 + 1.2345678901234e+200i
1 | -0 + -0i
1 | -0 + 0i
1 | -0 + -0i
1 | 9 + 10i
1 | 9 + 10i
1 | 9 - 10i
1 | Infinity + Infinityi
1 | Infinity - Infinityi
1 | -Infinity + Infinityi
1 | -Infinity - Infinityi
1 | NaN + NaNi
1 | NaN + NaNi
1 | NaN + NaNi
1 | NaN + NaNi
(27 rows)
-- test for underflow and overflow
SELECT COMPLEX '10e400';
ERROR: "10e400" is out of range for type double precision
LINE 1: SELECT COMPLEX '10e400';
^
SELECT COMPLEX '10e400i';
ERROR: "10e400i" is out of range for type double precision
LINE 1: SELECT COMPLEX '10e400i';
^
SELECT COMPLEX '-10e400';
ERROR: "-10e400" is out of range for type double precision
LINE 1: SELECT COMPLEX '-10e400';
^
SELECT COMPLEX '-10e400i';
ERROR: "-10e400i" is out of range for type double precision
LINE 1: SELECT COMPLEX '-10e400i';
^
SELECT COMPLEX '10e-400';
ERROR: "10e-400" is out of range for type double precision
LINE 1: SELECT COMPLEX '10e-400';
^
SELECT COMPLEX '10e-400i';
ERROR: "10e-400i" is out of range for type double precision
LINE 1: SELECT COMPLEX '10e-400i';
^
SELECT COMPLEX '-10e-400';
ERROR: "-10e-400" is out of range for type double precision
LINE 1: SELECT COMPLEX '-10e-400';
^
SELECT COMPLEX '-10e-400i';
ERROR: "-10e-400i" is out of range for type double precision
LINE 1: SELECT COMPLEX '-10e-400i';
^
-- bad input
INSERT INTO complex_ttbl(c) VALUES ('');
ERROR: invalid input syntax for type complex: ""
LINE 1: INSERT INTO complex_ttbl(c) VALUES ('');
^
INSERT INTO complex_ttbl(c) VALUES (' ');
ERROR: invalid input syntax for type complex: " "
LINE 1: INSERT INTO complex_ttbl(c) VALUES (' ');
^
INSERT INTO complex_ttbl(c) VALUES ('xyi');
ERROR: invalid input syntax for type complex: "xyi"
LINE 1: INSERT INTO complex_ttbl(c) VALUES ('xyi');
^
INSERT INTO complex_ttbl(c) VALUES ('i');
ERROR: invalid input syntax for type complex: "i"
LINE 1: INSERT INTO complex_ttbl(c) VALUES ('i');
^
INSERT INTO complex_ttbl(c) VALUES ('5.0.0 + 1i');
ERROR: invalid input syntax for type complex: "5.0.0 + 1i"
LINE 1: INSERT INTO complex_ttbl(c) VALUES ('5.0.0 + 1i');
^
INSERT INTO complex_ttbl(c) VALUES ('5.0 + 1 i');
ERROR: invalid input syntax for type complex: "5.0 + 1 i"
LINE 1: INSERT INTO complex_ttbl(c) VALUES ('5.0 + 1 i');
^
INSERT INTO complex_ttbl(c) VALUES ('5.0 + i1');
ERROR: invalid input syntax for type complex: "i1"
LINE 1: INSERT INTO complex_ttbl(c) VALUES ('5.0 + i1');
^
-- re
SELECT re(COMPLEX(5, 3)) AS five;
five
------
5
(1 row)
SELECT re(COMPLEX(-5, 3)) AS minus_five;
minus_five
------------
-5
(1 row)
SELECT re(COMPLEX(5.1, 3)) AS five_point_one;
five_point_one
----------------
5.1
(1 row)
SELECT re(COMPLEX(-5.1, 3)) AS minus_five_point_one;
minus_five_point_one
----------------------
-5.1
(1 row)
SELECT re(COMPLEX('infinity', 3)) AS inf;
inf
----------
Infinity
(1 row)
SELECT re(COMPLEX('-infinity', 3)) AS minus_inf;
minus_inf
-----------
-Infinity
(1 row)
SELECT re(COMPLEX('nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT re(COMPLEX('-nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT re(COMPLEX('nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT re(COMPLEX('-nan', 3)) AS nan;
nan
-----
NaN
(1 row)
-- im
SELECT im(COMPLEX(5, 3)) AS three;
three
-------
3
(1 row)
SELECT im(COMPLEX(5, -3)) AS minus_three;
minus_three
-------------
-3
(1 row)
SELECT im(COMPLEX(5, 3.1)) AS three_point_1;
three_point_1
---------------
3.1
(1 row)
SELECT im(COMPLEX(5, -3.1)) AS minus_three_point_1;
minus_three_point_1
---------------------
-3.1
(1 row)
SELECT im(COMPLEX(5, 'infinity')) AS inf;
inf
----------
Infinity
(1 row)
SELECT im(COMPLEX(5, '-infinity')) AS minus_inf;
minus_inf
-----------
-Infinity
(1 row)
SELECT im(COMPLEX(5, 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT im(COMPLEX(5, '-nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT im(COMPLEX(5, 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT im(COMPLEX(5, '-nan')) AS nan;
nan
-----
NaN
(1 row)
-- abs
SELECT abs(COMPLEX(4, 3)) AS five;
five
------
5
(1 row)
SELECT abs(COMPLEX(4, -3)) AS five;
five
------
5
(1 row)
SELECT abs(COMPLEX(-4, 3)) AS five;
five
------
5
(1 row)
SELECT abs(COMPLEX(-4, -3)) AS five;
five
------
5
(1 row)
SELECT abs(COMPLEX('infinity', 3)) AS inf;
inf
----------
Infinity
(1 row)
SELECT abs(COMPLEX('-infinity', 3)) AS inf;
inf
----------
Infinity
(1 row)
SELECT abs(COMPLEX(5, 'infinity')) AS inf;
inf
----------
Infinity
(1 row)
SELECT abs(COMPLEX(5, '-infinity')) AS inf;
inf
----------
Infinity
(1 row)
SELECT abs(COMPLEX('infinity', 'infinity')) AS inf;
inf
----------
Infinity
(1 row)
SELECT abs(COMPLEX('nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT abs(COMPLEX('-nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT abs(COMPLEX(5, 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT abs(COMPLEX(5, '-nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT abs(COMPLEX('nan', 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT abs(COMPLEX('infinity', 'nan')) AS inf;
inf
----------
Infinity
(1 row)
SELECT abs(COMPLEX('nan', 'infinity')) AS inf;
inf
----------
Infinity
(1 row)
-- radians
SELECT abs(radians(COMPLEX(1, sqrt(3))) - pi()/3) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT abs(radians(COMPLEX(1, -sqrt(3))) + pi()/3) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT abs(radians(COMPLEX(-1, sqrt(3))) - pi()*2/3) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT abs(radians(COMPLEX(-1, -sqrt(3))) + pi()*2/3) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT radians(COMPLEX('infinity', 3)) AS zero;
zero
------
0
(1 row)
SELECT abs(radians(COMPLEX('-infinity', 3)) - pi()) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT abs(radians(COMPLEX(5, 'infinity')) - pi()/2) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT abs(radians(COMPLEX(5, '-infinity')) + pi()/2) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT abs(radians(COMPLEX('infinity', 'infinity')) - pi()*45/180) < 1e-6 AS tr;
tr
----
t
(1 row)
SELECT radians(COMPLEX('nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT radians(COMPLEX('-nan', 3)) AS nan;
nan
-----
NaN
(1 row)
SELECT radians(COMPLEX(5, 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT radians(COMPLEX(5, '-nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT radians(COMPLEX('nan', 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT radians(COMPLEX('infinity', 'nan')) AS nan;
nan
-----
NaN
(1 row)
SELECT radians(COMPLEX('nan', 'infinity')) AS nan;
nan
-----
NaN
(1 row)
-- conj
SELECT conj(COMPLEX(5, 3)) = (COMPLEX(5,-3)) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, -3)) = (COMPLEX(5,3)) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, 3.1)) = (COMPLEX(5,-3.1)) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, -3.1)) = (COMPLEX(5,3.1)) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, 'infinity')) = (COMPLEX(5,'-infinity')) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, '-infinity')) = (COMPLEX(5,'infinity')) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, 'nan')) = (COMPLEX(5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, '-nan')) = (COMPLEX(5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, 'nan')) = (COMPLEX(5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT conj(COMPLEX(5, '-nan')) = (COMPLEX(5,'nan')) AS tr;
tr
----
t
(1 row)
-- hashcomplex
SELECT hashcomplex(COMPLEX(0,0)) = hashcomplex(COMPLEX(0,-0)) AS tr;
tr
----
t
(1 row)
SELECT hashcomplex(COMPLEX(0,0)) = hashcomplex(COMPLEX(-0,0)) AS tr;
tr
----
t
(1 row)
SELECT hashcomplex(COMPLEX(0,0)) = hashcomplex(COMPLEX(-0,-0)) AS tr;
tr
----
t
(1 row)
-- not equal
SELECT NOT c != c AS tr FROM complex_ttbl;
tr
----
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
(27 rows)
-- unary plus
SELECT +(COMPLEX(5, 3)) = (COMPLEX(5, 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(-5, 3)) = (COMPLEX(-5, 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5.1, 3)) = (COMPLEX(5.1, 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(-5.1, 3)) = (COMPLEX(-5.1, 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX('infinity', 3)) = (COMPLEX('infinity', 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX('-infinity', 3)) = (COMPLEX('-infinity', 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX('nan', 3)) = (COMPLEX('nan', 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX('-nan', 3)) = (COMPLEX('-nan', 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX('nan', 3)) = (COMPLEX('-nan', 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX('-nan', 3)) = (COMPLEX('nan', 3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, 3)) = (COMPLEX(5,3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, -3)) = (COMPLEX(5,-3)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, 3.1)) = (COMPLEX(5,3.1)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, -3.1)) = (COMPLEX(5,-3.1)) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, 'infinity')) = (COMPLEX(5,'infinity')) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, '-infinity')) = (COMPLEX(5,'-infinity')) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, 'nan')) = (COMPLEX(5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, '-nan')) = (COMPLEX(5,'-nan')) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, 'nan')) = (COMPLEX(5,'-nan')) AS tr;
tr
----
t
(1 row)
SELECT +(COMPLEX(5, '-nan')) = (COMPLEX(5,'nan')) AS tr;
tr
----
t
(1 row)
-- unary minus
SELECT -(COMPLEX(5, 3)) = (COMPLEX(-5, -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(-5, 3)) = (COMPLEX(5, -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5.1, 3)) = (COMPLEX(-5.1, -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(-5.1, 3)) = (COMPLEX(5.1, -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX('infinity', 3)) = (COMPLEX('-infinity', -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX('-infinity', 3)) = (COMPLEX('infinity', -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX('nan', 3)) = (COMPLEX('nan', -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX('-nan', 3)) = (COMPLEX('nan', -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX('nan', 3)) = (COMPLEX('nan', -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX('-nan', 3)) = (COMPLEX('nan', -3)) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5, 'infinity')) = (COMPLEX(-5,'-infinity')) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5, '-infinity')) = (COMPLEX(-5,'infinity')) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5, 'nan')) = (COMPLEX(-5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5, '-nan')) = (COMPLEX(-5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5, 'nan')) = (COMPLEX(-5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT -(COMPLEX(5, '-nan')) = (COMPLEX(-5,'nan')) AS tr;
tr
----
t
(1 row)
SELECT c + -c = COMPLEX(0,0)
FROM complex_ttbl
WHERE re(c) <> FLOAT8 'nan' AND im(c) <> FLOAT8 'nan' AND abs(re(c)) <> FLOAT8 'infinity' AND abs(im(c)) <> FLOAT8 'infinity';
?column?
----------
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
t
(19 rows)
-- plus
SELECT COMPLEX(3, 5) + COMPLEX(6, 7) = COMPLEX(9,12) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'infinity') + COMPLEX(6, 7) = COMPLEX(9, 'infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('infinity', 5) + COMPLEX(6, 7) = COMPLEX('infinity', 12) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, '-infinity') + COMPLEX(6, 7) = COMPLEX(9, '-infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('-infinity', 5) + COMPLEX(6, 7) = COMPLEX('-infinity', 12) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') + COMPLEX(6, 7) = COMPLEX(9, 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('nan', 5) + COMPLEX(6, 7) = COMPLEX('nan', 12) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, '-nan') + COMPLEX(6, 7) = COMPLEX(9, 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('-nan', 5) + COMPLEX(6, 7) = COMPLEX('nan', 12) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') + COMPLEX(6, 'infinity') = COMPLEX(9, 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('nan', 5) + COMPLEX('infinity', 7) = COMPLEX('nan', 12) AS tr;
tr
----
t
(1 row)
-- minus
SELECT COMPLEX(3, 5) - COMPLEX(6, 7) = COMPLEX(-3, -2) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'infinity') - COMPLEX(6, 7) = COMPLEX(-3, 'infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('infinity', 5) - COMPLEX(6, 7) = COMPLEX('infinity', -2) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, '-infinity') - COMPLEX(6, 7) = COMPLEX(-3, '-infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('-infinity', 5) - COMPLEX(6, 7) = COMPLEX('-infinity', -2) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') - COMPLEX(6, 7) = COMPLEX(-3, 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('nan', 5) - COMPLEX(6, 7) = COMPLEX('nan', -2) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, '-nan') - COMPLEX(6, 7) = COMPLEX(-3, 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('-nan', 5) - COMPLEX(6, 7) = COMPLEX('nan', -2) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') - COMPLEX(6, 'infinity') = COMPLEX(-3, 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('nan', 5) - COMPLEX('infinity', 7) = COMPLEX('nan', -2) AS tr;
tr
----
t
(1 row)
-- multiply
SELECT COMPLEX(3, 5) * COMPLEX(6, 7) = COMPLEX(-17, 51) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'infinity') * COMPLEX(6, 7) = COMPLEX('-infinity', 'infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('infinity', 5) * COMPLEX(6, 7) = COMPLEX('infinity', 'infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, '-infinity') * COMPLEX(6, 7) = COMPLEX('infinity', '-infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('-infinity', 5) * COMPLEX(6, 7) = COMPLEX('-infinity', '-infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') * COMPLEX(6, 7) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('nan', 5) * COMPLEX(6, 7) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, '-nan') * COMPLEX(6, 7) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('-nan', 5) * COMPLEX(6, 7) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') * COMPLEX(6, 'infinity') = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('nan', 5) * COMPLEX('infinity', 7) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
-- divide
CREATE OR REPLACE FUNCTION complex_dp_eq(a COMPLEX, b COMPLEX, diff FLOAT8) RETURNS BOOLEAN AS $$
BEGIN
RETURN (abs(re(a) - re(b)) < diff) AND (abs(im(a) - im(b)) < diff);
END;
$$ LANGUAGE PLPGSQL IMMUTABLE STRICT;
SELECT COMPLEX(2,2)/COMPLEX(1,1) = COMPLEX(2,0) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'infinity') / COMPLEX(6, 7) = COMPLEX('infinity', 'infinity') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(3, 'nan') / COMPLEX(6, 7) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
-- for division the denominator is special
SELECT COMPLEX(3, 5) / COMPLEX('infinity', 7) = COMPLEX('NaN','NaN') AS tr;
tr
----
t
(1 row)
-- divived by 0, python not supported divided by zero, and different version of glibc have different behavior
SELECT COMPLEX(5,3)/COMPLEX(0,0) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX('infinity',3)/COMPLEX(0,0) = COMPLEX('nan', 'nan') AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(5,'nan')/COMPLEX(0,0) = COMPLEX('infinity', 'nan') AS tr;
tr
----
t
(1 row)
-- @
SELECT @(COMPLEX(5,3)) = abs(COMPLEX(5,3)) AS tr;
tr
----
t
(1 row)
-- pow and ^
SELECT complex_dp_eq(COMPLEX(1,sqrt(3))^3 , COMPLEX(-1*2^3, 0), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(COMPLEX(0.5, 0.5*sqrt(3))^0.5, COMPLEX(0.5*sqrt(3), 0.5), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(5,3)^0 = COMPLEX(1,0) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(COMPLEX(5,3)^(-0.5) , COMPLEX(1,0)/(COMPLEX(5,3)^0.5), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(COMPLEX(5,3)^(-3) , COMPLEX(1,0)/COMPLEX(5,3)^3, 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(COMPLEX(5,3)^COMPLEX(3,5), COMPLEX(-7.04464, -11.27606), 1e-5) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(5^COMPLEX(3,5), COMPLEX(-24.00101, 122.67416), 1e-5) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(5,3)^COMPLEX(3,5) = power(COMPLEX(5,3), COMPLEX(3,5)) AS tr;
tr
----
t
(1 row)
SELECT (-1)^0.5 AS wrong;
ERROR: a negative number raised to a non-integer power yields a complex result
SELECT power(-1, 0.5) AS wrong;
ERROR: a negative number raised to a non-integer power yields a complex result
SELECT complex_dp_eq(power(-1::COMPLEX, 0.5), COMPLEX(0, -1), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(power(COMPLEX(-1, 0), 0.5), COMPLEX(0,1), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(power('-1 + -0i'::COMPLEX, 0.5), COMPLEX(0, -1), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(power('-1 - 0i'::COMPLEX, 0.5), COMPLEX(0, -1), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(power('-1 + 0i'::COMPLEX, 0.5), COMPLEX(0,1), 1e-6) AS tr;
tr
----
t
(1 row)
-- sqrt
SELECT sqrt(COMPLEX(5,3)) = power(COMPLEX(5,3), 0.5) AS tr;
tr
----
t
(1 row)
-- cbrt
SELECT cbrt(COMPLEX(5,3)) = power(COMPLEX(5,3), (1.0/3)) AS tr;
tr
----
t
(1 row)
-- degrees
SELECT degrees(COMPLEX(5,3)) = degrees(radians(COMPLEX(5,3))) AS tr;
tr
----
t
(1 row)
-- exp
SELECT complex_dp_eq(exp(COMPLEX(5,3)), COMPLEX(-146.927913908319 , 20.944066208746), 1e-6) AS tr;
tr
----
t
(1 row)
-- ln
SELECT complex_dp_eq(ln(COMPLEX(5,3)), COMPLEX(1.76318026230808 , 0.540419500270584), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT complex_dp_eq(exp(ln(COMPLEX(5,3))), COMPLEX(5,3), 1e-6) AS tr;
tr
----
t
(1 row)
SELECT ln(0::COMPLEX) = COMPLEX('-infinity', 0) AS tr;
tr
----
t
(1 row)
-- log10
SELECT complex_dp_eq(log(COMPLEX(5,3)) , ln(COMPLEX(5,3))/ln(10), 1e-6) AS tr;
tr
----
t
(1 row)
-- log
SELECT complex_dp_eq(log(COMPLEX(3,5),COMPLEX(5,3)) , ln(COMPLEX(5,3))/ln(COMPLEX(3,5)), 1e-6) AS tr;
tr
----
t
(1 row)
-- acos
SELECT complex_dp_eq(acos(COMPLEX(5,3)), COMPLEX(0, -1)*ln(COMPLEX(5,3) + COMPLEX(0,1)*sqrt(1 - COMPLEX(5,3)^2)), 1e-6) AS tr;
tr
----
t
(1 row)
-- asin
SELECT complex_dp_eq(asin(COMPLEX(5,3)), COMPLEX(0, -1)*ln(COMPLEX(5,3)*COMPLEX(0,1) + sqrt(1 - COMPLEX(5,3)^2)), 1e-6) AS tr;
tr
----
t
(1 row)
-- atan
SELECT complex_dp_eq(atan(COMPLEX(5,3)), 0.5*COMPLEX(0,1)*(ln(1 - COMPLEX(5,3)*COMPLEX(0,1)) - ln(1 + COMPLEX(5,3)*COMPLEX(0,1))), 1e-6) AS tr;
tr
----
t
(1 row)
-- cos
SELECT complex_dp_eq(cos(COMPLEX(5,3)), COMPLEX( 2.85581500422739 , 9.60638344843258), 1e-6) AS tr;
tr
----
t
(1 row)
-- sin
SELECT complex_dp_eq(sin(COMPLEX(5,3)), COMPLEX(-9.65412547685484 , 2.84169229560635), 1e-6) AS tr;
tr
----
t
(1 row)
-- cot
SELECT complex_dp_eq(cot(COMPLEX(5,3)), cos(COMPLEX(5,3))/sin(COMPLEX(5,3)), 1e-6) AS tr;
tr
----
t
(1 row)
-- tan
SELECT complex_dp_eq(tan(COMPLEX(5,3)), sin(COMPLEX(5,3))/cos(COMPLEX(5,3)), 1e-6) AS tr;
tr
----
t
(1 row)
-- type cast
SELECT COMPLEX '5+3i' ^ 4::int2 = power(COMPLEX(5,3),4::COMPLEX) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX '5+3i' ^ 4::INT4 = power(COMPLEX(5,3),4::COMPLEX) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX '5+3i' ^ 4::INT8 = power(COMPLEX(5,3),4::COMPLEX) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX '5+3i' ^ 4 = power(COMPLEX(5,3),4::COMPLEX) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX '5+3i' ^ 4.5::FLOAT4 = power(COMPLEX(5,3),COMPLEX(4.5,0)) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX '5+3i' ^ 4.5::FLOAT8 = power(COMPLEX(5,3),COMPLEX(4.5,0)) AS tr;
tr
----
t
(1 row)
SELECT COMPLEX(5,4)::POINT = POINT(5,4) AS tr;
ERROR: operator does not exist: point = point
LINE 1: SELECT COMPLEX(5,4)::POINT = POINT(5,4) AS tr;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
SELECT POINT(5,4)::COMPLEX = COMPLEX(5,4) AS tr;
tr
----
t
(1 row)
-- clear up
DROP TABLE complex_ttbl;
DROP SEQUENCE complex_seq;
DROP FUNCTION complex_dp_eq(a COMPLEX, b COMPLEX, diff FLOAT8);
-- check hashable
CREATE SEQUENCE complex_seq CACHE 1;
CREATE TABLE complex_ttbl (id INT4 DEFAULT NEXTVAL('complex_seq'), c COMPLEX) DISTRIBUTED BY (c);
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(NEXTVAL('complex_seq'), NEXTVAL('complex_seq')));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(NEXTVAL('complex_seq'), NEXTVAL('complex_seq')));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(NEXTVAL('complex_seq'), NEXTVAL('complex_seq')));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(NEXTVAL('complex_seq'), NEXTVAL('complex_seq')));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(NEXTVAL('complex_seq'), NEXTVAL('complex_seq')));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(NEXTVAL('complex_seq'), NEXTVAL('complex_seq')));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(0, 0));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(0, -0));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(-0, 0));
INSERT INTO complex_ttbl(c) VALUES (COMPLEX(-0, -0));
SELECT * FROM complex_ttbl ORDER BY id;
id | c
----+----------
1 | 2 + 3i
4 | 5 + 6i
7 | 8 + 9i
10 | 11 + 12i
13 | 14 + 15i
16 | 17 + 18i
19 | 0 + 0i
20 | 0 + 0i
21 | 0 + 0i
22 | 0 + 0i
(10 rows)
SELECT COUNT(c) = 4 AS tr, COUNT(DISTINCT gp_segment_id) = 1 AS tr
FROM complex_ttbl
WHERE re(c) = 0 AND im(c) = 0;
tr | tr
----+----
t | t
(1 row)
-- Use a complex in GROUP BY, to test the hash function used in hash agg.
set enable_groupagg = off;
SELECT c, count(*) FROM complex_ttbl GROUP BY c;
c | count
----------+-------
0 + 0i | 4
11 + 12i | 1
14 + 15i | 1
17 + 18i | 1
2 + 3i | 1
5 + 6i | 1
8 + 9i | 1
(7 rows)
reset enable_groupagg;
DROP TABLE complex_ttbl;
DROP SEQUENCE complex_seq;
-- dot product
SELECT dotproduct(ARRAY[COMPLEX(1,3),COMPLEX(5,7)], ARRAY[COMPLEX(2,4),COMPLEX(6,8)]) = COMPLEX(1,3)*COMPLEX(2,4) + COMPLEX(5,7)*COMPLEX(6,8) AS tr;
tr
----
t
(1 row)
SELECT dotproduct(ARRAY[COMPLEX(1,3),COMPLEX(5,7)], ARRAY[COMPLEX(2,4),NULL]) IS NULL AS tr;
tr
----
t
(1 row)
SELECT dotproduct(ARRAY[COMPLEX(1,3),COMPLEX(5,7)], ARRAY[COMPLEX(2,4),COMPLEX(6,8), COMPLEX(10,12)]);
ERROR: cannot dot product two 1-dim arrays with different number of elements
DETAIL: The number of elements of the left argument is 2, the number of elements of the right argument is 3.
SELECT dotproduct(ARRAY[COMPLEX(1,3),COMPLEX(5,7)], ARRAY[ARRAY[COMPLEX(2,4)],ARRAY[COMPLEX(6,8)]]);
ERROR: cannot dot product two multi-dimentsion arrays
DETAIL: The dimension of the left argument is 1, the dimension of the right argument is 2.
-- GIN index on complex array
CREATE TABLE complex_array_tab (complex_arr complex[]);
CREATE INDEX ON complex_array_tab USING gin (complex_arr);
INSERT INTO complex_array_tab VALUES (ARRAY[COMPLEX(1,3), COMPLEX(5,7)]);
INSERT INTO complex_array_tab VALUES (ARRAY[COMPLEX(2,4), COMPLEX(6,8)]);
SELECT * FROM complex_array_tab WHERE complex_arr @> ARRAY[COMPLEX(2,4)];
complex_arr
---------------------
{"2 + 4i","6 + 8i"}
(1 row)