diff --git a/ydb/library/yql/tests/postgresql/cases/float4.out b/ydb/library/yql/tests/postgresql/cases/float4.out index d9bebce62be2..69e63f9ca83e 100644 --- a/ydb/library/yql/tests/postgresql/cases/float4.out +++ b/ydb/library/yql/tests/postgresql/cases/float4.out @@ -229,15 +229,6 @@ SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f 1.2345679e-20 | -1.2345678e-19 (3 rows) -SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f - WHERE f.f1 > '0.0'; - f1 | x ----------------+--------------- - 1004.3 | 994.3 - 1.2345679e+20 | 1.2345679e+20 - 1.2345679e-20 | -10 -(3 rows) - SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f WHERE f.f1 > '0.0'; f1 | x diff --git a/ydb/library/yql/tests/postgresql/cases/float4.sql b/ydb/library/yql/tests/postgresql/cases/float4.sql index 6b4a1e9941e7..7260ea8a372d 100644 --- a/ydb/library/yql/tests/postgresql/cases/float4.sql +++ b/ydb/library/yql/tests/postgresql/cases/float4.sql @@ -54,8 +54,6 @@ SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1; SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3'; SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f WHERE f.f1 > '0.0'; -SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f - WHERE f.f1 > '0.0'; SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f WHERE f.f1 > '0.0'; SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f diff --git a/ydb/library/yql/tests/postgresql/cases/float8.out b/ydb/library/yql/tests/postgresql/cases/float8.out index 69d701a2069c..87f089819ce6 100644 --- a/ydb/library/yql/tests/postgresql/cases/float8.out +++ b/ydb/library/yql/tests/postgresql/cases/float8.out @@ -216,16 +216,6 @@ SELECT f.f1, f.f1 + '-10' AS x 1.2345678901234e-200 | -10 (3 rows) -SELECT f.f1, f.f1 / '-10' AS x - FROM FLOAT8_TBL f - WHERE f.f1 > '0.0'; - f1 | x -----------------------+----------------------- - 1004.3 | -100.42999999999999 - 1.2345678901234e+200 | -1.2345678901234e+199 - 1.2345678901234e-200 | -1.2345678901234e-201 -(3 rows) - SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT8_TBL f WHERE f.f1 > '0.0'; @@ -236,13 +226,6 @@ SELECT f.f1, f.f1 - '-10' AS x 1.2345678901234e-200 | 10 (3 rows) -SELECT f.f1 ^ '2.0' AS square_f1 - FROM FLOAT8_TBL f where f.f1 = '1004.3'; - square_f1 --------------------- - 1008618.4899999999 -(1 row) - -- absolute value SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT8_TBL f; @@ -294,6 +277,16 @@ SELECT |/ float8 '64' AS eight; 8 (1 row) +SELECT f.f1, |/f.f1 AS sqrt_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | sqrt_f1 +----------------------+----------------------- + 1004.3 | 31.6906926399535 + 1.2345678901234e+200 | 1.11111110611109e+100 + 1.2345678901234e-200 | 1.11111110611109e-100 +(3 rows) + -- power SELECT power(float8 '144', float8 '0.5'); power @@ -493,6 +486,17 @@ SELECT power(float8 '-inf', float8 '-inf'); 0 (1 row) +-- take exp of ln(f.f1) +SELECT f.f1, exp(ln(f.f1)) AS exp_ln_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | exp_ln_f1 +----------------------+----------------------- + 1004.3 | 1004.3 + 1.2345678901234e+200 | 1.23456789012338e+200 + 1.2345678901234e-200 | 1.23456789012339e-200 +(3 rows) + -- check edge cases for exp SELECT exp('inf'::float8), exp('-inf'::float8), exp('nan'::float8); exp | exp | exp @@ -500,6 +504,23 @@ SELECT exp('inf'::float8), exp('-inf'::float8), exp('nan'::float8); Infinity | 0 | NaN (1 row) +-- cube root +SELECT ||/ float8 '27' AS three; + three +------- + 3 +(1 row) + +SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f; + f1 | cbrt_f1 +----------------------+---------------------- + 0 | 0 + 1004.3 | 10.014312837827 + -34.84 | -3.26607421344208 + 1.2345678901234e+200 | 4.97933859234765e+66 + 1.2345678901234e-200 | 2.3112042409018e-67 +(5 rows) + SELECT * FROM FLOAT8_TBL; f1 ---------------------- @@ -526,12 +547,45 @@ SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ; ERROR: cannot take logarithm of a negative number SELECT f.f1 / '0.0' from FLOAT8_TBL f; ERROR: division by zero +-- hyperbolic functions +-- we run these with extra_float_digits = 0 too, since different platforms +-- tend to produce results that vary in the last place. +SELECT sinh(float8 '1'); + sinh +----------------- + 1.1752011936438 +(1 row) + +SELECT cosh(float8 '1'); + cosh +------------------ + 1.54308063481524 +(1 row) + +SELECT tanh(float8 '1'); + tanh +------------------- + 0.761594155955765 +(1 row) + SELECT asinh(float8 '1'); asinh ------------------- 0.881373587019543 (1 row) +SELECT acosh(float8 '2'); + acosh +------------------ + 1.31695789692482 +(1 row) + +SELECT atanh(float8 '0.5'); + atanh +------------------- + 0.549306144334055 +(1 row) + -- test Inf/NaN cases for hyperbolic functions SELECT sinh(float8 'infinity'); sinh diff --git a/ydb/library/yql/tests/postgresql/cases/float8.sql b/ydb/library/yql/tests/postgresql/cases/float8.sql index 2ae7768bf80c..d45889997f93 100644 --- a/ydb/library/yql/tests/postgresql/cases/float8.sql +++ b/ydb/library/yql/tests/postgresql/cases/float8.sql @@ -50,14 +50,9 @@ SELECT f.f1, f.f1 * '-10' AS x SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT8_TBL f WHERE f.f1 > '0.0'; -SELECT f.f1, f.f1 / '-10' AS x - FROM FLOAT8_TBL f - WHERE f.f1 > '0.0'; SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT8_TBL f WHERE f.f1 > '0.0'; -SELECT f.f1 ^ '2.0' AS square_f1 - FROM FLOAT8_TBL f where f.f1 = '1004.3'; -- absolute value SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT8_TBL f; @@ -72,6 +67,9 @@ SET extra_float_digits = 0; -- square root SELECT sqrt(float8 '64') AS eight; SELECT |/ float8 '64' AS eight; +SELECT f.f1, |/f.f1 AS sqrt_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; -- power SELECT power(float8 '144', float8 '0.5'); SELECT power(float8 'NaN', float8 '0.5'); @@ -109,8 +107,15 @@ SELECT power(float8 '-inf', float8 '3'); SELECT power(float8 '-inf', float8 '3.5'); SELECT power(float8 '-inf', float8 'inf'); SELECT power(float8 '-inf', float8 '-inf'); +-- take exp of ln(f.f1) +SELECT f.f1, exp(ln(f.f1)) AS exp_ln_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; -- check edge cases for exp SELECT exp('inf'::float8), exp('-inf'::float8), exp('nan'::float8); +-- cube root +SELECT ||/ float8 '27' AS three; +SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f; SELECT * FROM FLOAT8_TBL; SELECT f.f1 * '1e200' from FLOAT8_TBL f; SELECT f.f1 ^ '1e200' from FLOAT8_TBL f; @@ -118,7 +123,15 @@ SELECT 0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5; SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ; SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ; SELECT f.f1 / '0.0' from FLOAT8_TBL f; +-- hyperbolic functions +-- we run these with extra_float_digits = 0 too, since different platforms +-- tend to produce results that vary in the last place. +SELECT sinh(float8 '1'); +SELECT cosh(float8 '1'); +SELECT tanh(float8 '1'); SELECT asinh(float8 '1'); +SELECT acosh(float8 '2'); +SELECT atanh(float8 '0.5'); -- test Inf/NaN cases for hyperbolic functions SELECT sinh(float8 'infinity'); SELECT sinh(float8 '-infinity'); diff --git a/ydb/library/yql/tools/pgrun/pgrun.cpp b/ydb/library/yql/tools/pgrun/pgrun.cpp index 6d3fcb148bae..960880ae1aaa 100644 --- a/ydb/library/yql/tools/pgrun/pgrun.cpp +++ b/ydb/library/yql/tools/pgrun/pgrun.cpp @@ -762,13 +762,13 @@ const TString FormatFloat(const TString& value, std::function