should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,9 @@
# name: test/sql/function/numeric/abs.test
# description: Test abs
# group: [numeric]
# test abs on negative zero
query II
SELECT abs('-0.0'::float), abs('-0.0'::double)
----
0.0 0.0

View File

@@ -0,0 +1,40 @@
# name: test/sql/function/numeric/decimal_mod.test
# description: Test decimal modulo
# group: [numeric]
query II
SELECT 10 % 2.4, -10 % 2.4
----
0.4 -0.4
query II
SELECT 10.0 % 2.4, -10.0 % 2.4
----
0.4 -0.4
# large decimals
query I
SELECT 12345678901111111 % 2.0;
----
1
query I
select 12345678901234567890 % 123;
----
78
# if the required width exceeds the maximum decimal width we fallback to double
query I
SELECT 10000000000000000000000000000000000001::DECIMAL(38,0) % 0.00000000000000000000000000000000004
----
0.0
query II
SELECT typeof(10.0 % 2.0), typeof(10.0 % 2.0 % 2.0 % 2.0)
----
DECIMAL(3,1) DECIMAL(3,1)
query I
SELECT 10.0 % 0.0
----
NULL

View File

@@ -0,0 +1,20 @@
# name: test/sql/function/numeric/set_seed_for_sample.test
# description: Test setseed for samples
# group: [numeric]
statement ok
create table t1 as select * from generate_series(1,50) as t(number);
set seed 0.1
query I rowsort result_1
select * from t1 using sample 5;
----
set seed 0.1
query I rowsort result_1
select * from t1 using sample 5;
----

View File

@@ -0,0 +1,41 @@
# name: test/sql/function/numeric/test_arithmetic_aliases.test
# description: Check aliases for + - * /
# group: [numeric]
statement ok
CREATE TABLE test(a integer)
statement ok
insert into test values (1), (2), (3), (NULL)
query I
select add(a,a) from test
----
2
4
6
NULL
query I
select subtract(a,a) from test
----
0
0
0
NULL
query I
select multiply(a,a) from test
----
1
4
9
NULL
query I
select divide(a,a) from test
----
1
1
1
NULL

View File

@@ -0,0 +1,17 @@
# name: test/sql/function/numeric/test_bit_count.test
# description: BIT_COUNT test
# group: [numeric]
statement ok
CREATE TABLE bits(t tinyint, s smallint, i integer, b bigint, h hugeint)
statement ok
INSERT INTO bits VALUES (NULL, NULL, NULL, NULL, NULL), (31, 1023, 11834119, 50827156903621017, 3141592653589793238462643383279528841), (-59, -517, -575693, -9876543210, -148873535527910577765226390751398592512)
query IIIII
select bit_count(t), bit_count(s), bit_count(i), bit_count(b), bit_count(h) from bits
----
NULL NULL NULL NULL NULL
5 10 11 27 67
4 14 24 49 2

View File

@@ -0,0 +1,67 @@
# name: test/sql/function/numeric/test_even.test
# description: Test even
# group: [numeric]
query II
select i, even(i + 0.4) from generate_series(-4,4) tbl(i);
----
-4 -4
-3 -4
-2 -2
-1 -2
0 2
1 2
2 4
3 4
4 6
query II
select i, even(i + 0.9) from generate_series(-4,4) tbl(i);
----
-4 -4
-3 -4
-2 -2
-1 -2
0 2
1 2
2 4
3 4
4 6
# decimals
query II
SELECT even(19.4), even(-19.4)
----
20 -20
query II
SELECT even(8.9), even(-8.9)
----
10 -10
# doubles
query II
SELECT even(45::DOUBLE), even(-35::DOUBLE)
----
46 -36
query I
SELECT even(NULL)
----
NULL
statement error
SELECT even('abcd')
----
# check bound
query I
SELECT even(1.7976931348623155e+308)
----
1.7976931348623155e+308
query I
SELECT even(-1.7976931348623155e+308)
----
-1.7976931348623155e+308

View File

@@ -0,0 +1,50 @@
# name: test/sql/function/numeric/test_factorial.test
# description: Mod test
# group: [numeric]
query I
SELECT factorial(0);
----
1
query I
SELECT factorial(-1);
----
1
query I
SELECT factorial(NULL);
----
NULL
query I
SELECT factorial(2);
----
2
query I
SELECT factorial(10);
----
3628800
# postfix op
query I
SELECT 10!;
----
3628800
query I
SELECT factorial(20);
----
2432902008176640000
query I
SELECT factorial(30);
----
265252859812191058636308480000000
# overflow
statement error
SELECT factorial(40);
----
<REGEX>:.*Out of Range Error.*out of range.*

View File

@@ -0,0 +1,88 @@
# name: test/sql/function/numeric/test_fdiv_fmod.test
# description: Test floored division and modulus
# group: [numeric]
statement ok
SET ieee_floating_point_ops=false;
statement ok
CREATE TABLE rs(x DOUBLE, y INTEGER)
statement ok
INSERT INTO rs VALUES (10, 3),(10,-3),(-10,3),(-10,-3),(0,1),(1,1),(NULL,10),(10,NULL),(NULL,NULL)
query I
SELECT fmod(x, y) FROM rs
----
1
-2
2
-1
0
0
NULL
NULL
NULL
query I
SELECT fdiv(x, y) FROM rs
----
3
-4
-4
3
0
1
NULL
NULL
NULL
# fmod by 0 results in NULL: should be NaN (if supported)
query I
SELECT fmod(42, 0)
----
NULL
# fmod 0 by 0 results in NULL: should be NaN (if supported)
query I
SELECT fmod(0, 0)
----
NULL
# fdiv by 0 results in NULL: should be Inf (if supported)
query I
SELECT fdiv(42, 0)
----
NULL
# fdiv by 0 results in NULL: should be -Inf (if supported)
query I
SELECT fdiv(-42, 0)
----
NULL
# fdiv 0 by 0 results in NULL: should be NaN (if supported)
query I
SELECT fdiv(0, 0)
----
NULL
query R
SELECT fmod(12.3456789, 5)
----
2.345679
query I
SELECT fdiv(12.3456789, 5)
----
2
query R
SELECT fmod(3, 2.1)
----
0.900000
query I
SELECT fdiv(3, 2.1)
----
1

View File

@@ -0,0 +1,143 @@
# name: test/sql/function/numeric/test_floor_ceil.test
# description: Test ceil(ing)/floor function
# group: [numeric]
statement ok
SET default_null_order='nulls_first';
statement ok
CREATE TABLE numbers(n DOUBLE)
statement ok
INSERT INTO numbers VALUES (NULL),(-42.8),(-42.2),(0), (42.2), (42.8)
query I
SELECT cast(CEIL(n::tinyint) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(CEIL(n::smallint) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(CEIL(n::integer) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(CEIL(n::bigint) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(CEIL(n::float) as bigint) FROM numbers ORDER BY n
----
NULL
-42
-42
0
43
43
query I
SELECT cast(CEIL(n::double) as bigint) FROM numbers ORDER BY n
----
NULL
-42
-42
0
43
43
query I
SELECT cast(CEILING(n::double) as bigint) FROM numbers ORDER BY n
----
NULL
-42
-42
0
43
43
query I
SELECT cast(FLOOR(n::tinyint) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(FLOOR(n::smallint) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(FLOOR(n::integer) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(FLOOR(n::bigint) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-42
0
42
43
query I
SELECT cast(FLOOR(n::float) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-43
0
42
42
query I
SELECT cast(FLOOR(n::double) as bigint) FROM numbers ORDER BY n
----
NULL
-43
-43
0
42
42

View File

@@ -0,0 +1,110 @@
# name: test/sql/function/numeric/test_gamma.test
# description: Test gamma function
# group: [numeric]
query I
SELECT gamma(NULL)
----
NULL
statement error
SELECT gamma(0)
----
<REGEX>:.*Out of Range Error: cannot take gamma.*
query I
SELECT gamma(-1)
----
nan
query I
SELECT gamma(1)
----
1
query I
SELECT gamma(-0.1)
----
-10.686287021193193
query I
SELECT gamma(2)
----
1
query I
SELECT gamma(10)
----
362880.0
query I
SELECT gamma(2::tinyint)
----
1
query I
SELECT gamma(2::hugeint)
----
1
statement error
SELECT gamma('asdf')
----
<REGEX>:.*Conversion Error: Could not convert string.*
query I
SELECT lgamma(NULL)
----
NULL
statement error
SELECT lgamma(0)
----
<REGEX>:.*Out of Range Error: cannot take.*
query I
SELECT lgamma(-1)
----
inf
query I
SELECT lgamma(-100)
----
inf
query I
SELECT lgamma(1)
----
0
query I
SELECT lgamma(2)
----
0
query I
SELECT lgamma(3)
----
0.693147180559945
query I
SELECT lgamma(10)
----
12.801827480081467
query I
SELECT lgamma(2::tinyint)
----
0
query I
SELECT lgamma(2::hugeint)
----
0
statement error
SELECT lgamma('asdf')
----
<REGEX>:.*Conversion Error: Could not convert string.*

View File

@@ -0,0 +1,64 @@
# name: test/sql/function/numeric/test_gcd_lcm.test
# description: Test gcd and lcm
# group: [numeric]
query IIIIII
SELECT a, b, gcd(a, b), gcd(a, -b), gcd(b, a), gcd(-b, a)
FROM (VALUES (0::int8, 0::int8),
(0::int8, 29893644334::int8),
(288484263558::int8, 29893644334::int8),
(-288484263558::int8, 29893644334::int8),
((-9223372036854775808)::int8, 1::int8),
((-9223372036854775808)::int8, 9223372036854775807::int8),
((-9223372036854775808)::int8, 4611686018427387904::int8)) AS v(a, b);
----
0 0 0 0 0 0
0 29893644334 29893644334 29893644334 29893644334 29893644334
288484263558 29893644334 6835958 6835958 6835958 6835958
-288484263558 29893644334 6835958 6835958 6835958 6835958
-9223372036854775808 1 1 1 1 1
-9223372036854775808 9223372036854775807 1 1 1 1
-9223372036854775808 4611686018427387904 4611686018427387904 4611686018427387904 4611686018427387904 4611686018427387904
query I
SELECT gcd(42, NULL)
----
NULL
statement error
SELECT gcd(42, 'abcd')
----
query I
select lcm(120,25);
----
600
query IIIIII
SELECT a, b, lcm(a, b), lcm(a, -b), lcm(b, a), lcm(-b, a)
FROM (VALUES (0::int8, 0::int8),
(0::int8, 29893644334::int8),
(29893644334::int8, 29893644334::int8),
(288484263558::int8, 29893644334::int8),
(-288484263558::int8, 29893644334::int8),
((-9223372036854775808)::int8, 0::int8)) AS v(a, b);
----
0 0 0 0 0 0
0 29893644334 0 0 0 0
29893644334 29893644334 29893644334 29893644334 29893644334 29893644334
288484263558 29893644334 1261541684539134 1261541684539134 1261541684539134 1261541684539134
-288484263558 29893644334 1261541684539134 1261541684539134 1261541684539134 1261541684539134
-9223372036854775808 0 0 0 0 0
query I
SELECT lcm(42, NULL)
----
NULL
statement error
SELECT lcm(42, 'abcd')
----
statement error
select lcm(4200000000000000000,5700000000000000000)
----

View File

@@ -0,0 +1,24 @@
# name: test/sql/function/numeric/test_geomean.test
# description: Test geometric mean (geomean) function
# group: [numeric]
statement ok
CREATE TABLE numbers(x DOUBLE)
statement ok
INSERT INTO numbers VALUES (NULL), (1), (2)
query I
SELECT geomean(x) FROM numbers
----
1.414213562373095
query I
SELECT geomean(x::integer) FROM numbers
----
1.414213562373095
query I
SELECT geomean(i) FROM generate_series(1000, 2000) tbl(i);
----
1471.459313166229

View File

@@ -0,0 +1,53 @@
# name: test/sql/function/numeric/test_invalid_math.test
# description: Test invalid input for math functions
# group: [numeric]
# cannot take log of negative number or zero
statement error
SELECT log(0);
----
statement error
SELECT log(-1);
----
statement error
SELECT ln(0);
----
statement error
SELECT ln(-1);
----
statement error
SELECT log10(0);
----
statement error
SELECT log10(-1);
----
# cannot take square root of a negative number
statement error
SELECT sqrt(-1);
----
query I
SELECT SQRT(0)
----
0
query RRR
SELECT POW(1e300,100), POW(-1e300,100), POW(-1.0, 0.5)
----
inf inf nan
query RR
SELECT EXP(1e300), EXP(1e100)
----
inf inf
query R
SELECT DEGREES(1e308)
----
inf

View File

@@ -0,0 +1,33 @@
# name: test/sql/function/numeric/test_is_nan.test
# description: isnan test
# group: [numeric]
statement ok
SET default_null_order='nulls_first';
foreach type FLOAT DOUBLE
query III
SELECT isnan(3::${type}), isnan('nan'::${type}), isnan(NULL::${type})
----
false true NULL
statement ok
CREATE TABLE floats(f ${type})
statement ok
INSERT INTO floats VALUES (3), ('nan'), ('inf'), ('-inf'), (NULL)
query IIII
SELECT f, isnan(f), isinf(f), isfinite(f) FROM floats ORDER BY f
----
NULL NULL NULL NULL
-inf False True False
3 False False True
inf False True False
nan True False False
statement ok
DROP TABLE floats
endloop

View File

@@ -0,0 +1,31 @@
# name: test/sql/function/numeric/test_mod.test
# description: Mod test
# group: [numeric]
statement ok
CREATE TABLE modme(a DOUBLE, b INTEGER)
statement ok
INSERT INTO modme VALUES (42.123456, 3)
query R
select mod(a, 40) from modme
----
2.123456
# mod 0 results in NULL: SQLite behavior
query I
select mod(42, 0)
----
NULL
query R
select mod(a, 2) from modme
----
0.123456
query R
select mod(b, 2.1) from modme
----
0.900000

View File

@@ -0,0 +1,89 @@
# name: test/sql/function/numeric/test_nextafter.test
# description: Next After test
# group: [numeric]
statement error
select nextafter()
----
statement error
select nextafter('bla','bla')
----
query I
select nextafter(NULL,1)
----
NULL
query I
select nextafter(1,NULL)
----
NULL
query I
select nextafter(99, 1)
----
99
query R
select nextafter(99.0::DOUBLE, 1.0::DOUBLE) < 99
----
True
query R
select nextafter(99.0::DOUBLE, 99.0::DOUBLE) = 99
----
True
query R
select nextafter(99.0::DOUBLE, 100.0::DOUBLE) > 99
----
True
query R
select nextafter(nextafter(99.0::DOUBLE, 100.0::DOUBLE),0::DOUBLE) = 99
----
True
query R
select nextafter(99.0::FLOAT, 1.0::FLOAT) < 99
----
True
query R
select nextafter(99.0::FLOAT, 100.0::FLOAT) > 99
----
True
query R
select nextafter(nextafter(99.0::FLOAT, 100.0::FLOAT),0::FLOAT) = 99
----
True
statement ok
create table test (a FLOAT)
statement ok
INSERT INTO test VALUES (10),(20),(30),(40)
query R
select nextafter(a, 0::FLOAT) from test
----
9.999999
19.999998
29.999998
39.999996
statement ok
create table test_twoc (a FLOAT, b FLOAT)
statement ok
INSERT INTO test_twoc VALUES (10,1),(20,21),(30,1),(40,41)
query R
select nextafter(a, b) from test_twoc
----
9.999999
20.000002
29.999998
40.000004

View File

@@ -0,0 +1,176 @@
# name: test/sql/function/numeric/test_pg_math.test
# description: Function test cases from PG docs
# group: [numeric]
# see https://www.postgresql.org/docs/10/functions-math.html
query R
select abs(-17.4)
----
17.4
query R
select cbrt(27.0)
----
3.000000
query R
select ceil(-42.8)
----
-42
query R
select ceiling(-95.3)
----
-95
query R
select exp(1.0)
----
2.718282
query R
select floor(-42.8)
----
-43
query R
select ln(2.0)
----
0.693147
query R
select log(100.0)
----
2.000000
query R
select log10(100.0)
----
2.000000
query R
select log2(4.0)
----
2.000000
query R
select pi()
----
3.141593
query R
select sqrt(2.0)
----
1.414214
query R
select radians(45.0)
----
0.785398
query R
select degrees(0.5)
----
28.647890
query I
select sign(4.1)
----
1
query I
select sign(-4.1)
----
-1
query I
select sign(0)
----
0
query I
select sign(3)
----
1
query I
select log(2, 64)
----
6
statement error
select log(0, 64)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*
statement error
select log(2, 0)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*
statement error
select log(-1, 64)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*
statement error
select log(2, -1)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*
statement error
select log(1, 64)
----
<REGEX>:.*Out of Range Error.*divison by zero.*
query I
select log(2, 1)
----
0
query I
select log(0.5, 64)
----
-6
query I
select log(0.5, 64)
----
-6
query I
select log('Inf'::DOUBLE, 64)
----
0
query I
select log(64, 'Inf'::DOUBLE)
----
Inf
query I
select log(64, 'NaN'::DOUBLE)
----
NaN
query I
select log('NaN'::DOUBLE, 64)
----
NaN
statement error
select log('-Inf'::DOUBLE, 64)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*
statement error
select log(64, '-Inf'::DOUBLE)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*
statement error
select log(2, -1)
----
<REGEX>:.*Out of Range Error.*cannot take logarithm.*

View File

@@ -0,0 +1,35 @@
# name: test/sql/function/numeric/test_pow.test
# description: Power test
# group: [numeric]
statement ok
CREATE TABLE powerme(a DOUBLE, b INTEGER)
statement ok
INSERT INTO powerme VALUES (2.1, 3)
query R
select pow(a, 0) from powerme
----
1.000000
query R
select pow(b, -2) from powerme
----
0.111111
query R
select pow(a, b) from powerme
----
9.261000
query R
select pow(b, a) from powerme
----
10.045109
query R
select power(b, a) from powerme
----
10.045109

View File

@@ -0,0 +1,135 @@
# name: test/sql/function/numeric/test_random.test
# description: Test random & setseed functions
# group: [numeric]
# we need to be a bit more clever here for testing random
# it's very unlikely that three random variables are exactly equivalent
# test random in lambdas and ranges
statement ok
CREATE TABLE t1 AS SELECT [random() for a IN range(1)] FROM range(2);
statement ok
CREATE TABLE t2 AS SELECT random() FROM range(2);
statement ok
CREATE TABLE t3 AS SELECT [random()] FROM range(2);
statement ok
CREATE TABLE t4 AS SELECT [random() + range * 0 for a IN range(1)] FROM range(2);
query I
SELECT count(*) FROM t1 WHERE (SELECT min(#1) FROM t1 ) == (SELECT max(#1) FROM t1);
----
0
query I
SELECT count(*) FROM t2 WHERE (SELECT min(#1) FROM t2 ) == (SELECT max(#1) FROM t2);
----
0
query I
SELECT count(*) FROM t3 WHERE (SELECT min(#1) FROM t3 ) == (SELECT max(#1) FROM t3);
----
0
query I
SELECT count(*) FROM t4 WHERE (SELECT min(#1) FROM t4 ) == (SELECT max(#1) FROM t4);
----
0
require skip_reload
statement ok
BEGIN TRANSACTION
statement ok
CREATE TEMPORARY TABLE t1 AS SELECT RANDOM() a;
statement ok
CREATE TEMPORARY TABLE t2 AS SELECT RANDOM() b;
statement ok
CREATE TEMPORARY TABLE t3 AS SELECT RANDOM() c;
# empty result on this join
query I
SELECT COUNT(*) FROM (SELECT a FROM t1 JOIN t2 ON (a=b) JOIN t3 ON (b=c)) s1
----
0
statement ok
ROLLBACK
# with setseed we can enforce the equivalence of these values
statement ok
select setseed(0.1)
statement ok
CREATE TEMPORARY TABLE t1 AS SELECT RANDOM() a;
statement ok
select setseed(0.1)
statement ok
CREATE TEMPORARY TABLE t2 AS SELECT RANDOM() b;
statement ok
select setseed(0.1)
statement ok
CREATE TEMPORARY TABLE t3 AS SELECT RANDOM() c;
# now the join has one value
query I
SELECT COUNT(*) FROM (SELECT a FROM t1 JOIN t2 ON (a=b) JOIN t3 ON (b=c)) s1
----
1
# incorrect usage of setseed
statement error
select setseed(1.1)
----
statement error
select setseed(-1.1)
----
# we can use setseed with a table as well
statement ok
CREATE TABLE seeds(a DOUBLE)
statement ok
INSERT INTO seeds VALUES (-0.1), (0.0), (0.1)
query IR
select setseed(a), a from seeds;
----
NULL -0.100000
NULL 0.000000
NULL 0.100000
# use random in some complicated expressions
statement ok
CREATE TABLE numbers(a INTEGER)
statement ok
INSERT INTO numbers VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
query I
select case when min(random()) >= 0 then 1 else 0 end from numbers;
----
1
query I
select case when max(random()) < 1 then 1 else 0 end from numbers;
----
1
# we can order by random
statement ok
select * from numbers order by random()
# we can select random
statement ok
select random() from numbers

View File

@@ -0,0 +1,64 @@
# name: test/sql/function/numeric/test_round.test
# description: Rounding test
# group: [numeric]
statement ok
CREATE TABLE roundme(a DOUBLE, b INTEGER)
statement ok
INSERT INTO roundme VALUES (42.123456, 3)
query R
select round(42.12345::DOUBLE, 0)
----
42.000000
query R
select round(42.12345::DOUBLE)
----
42.000000
query R
select round(42.12345::DOUBLE, 2)
----
42.120000
query RR
select round(42.12345::DOUBLE, 4), round(42.1235::DOUBLE, 1000)
----
42.123400 42.12345
query I
select round(42::DOUBLE, 0)
----
42
query III
select round(42::DOUBLE, -1), round(42::DOUBLE, -2), round(42::DOUBLE, -1000)
----
40 0 0
query R
select round(a, 1) from roundme
----
42.100000
query I
select round(b, 1) from roundme
----
3
query R
select round(a, b) from roundme
----
42.123000
query I
SELECT round(1.0, (-2147483648)::INT);
----
0
query I
SELECT round(1.0::DOUBLE, (-2147483648)::INT);
----
0

View File

@@ -0,0 +1,95 @@
# name: test/sql/function/numeric/test_round_even.test
# description: Test round even
# group: [numeric]
query I
SELECT roundBankers(45, -1)
----
40
query II
select i, round_even(i + 0.5, 0) from generate_series(-2,4) tbl(i);
----
-2 -2
-1 0
0 0
1 2
2 2
3 4
4 4
query II
select i, round_even(i + 0.55, 0) from generate_series(-2,4) tbl(i);
----
-2 -1
-1 0
0 1
1 2
2 3
3 4
4 5
query II
select i, roundBankers(i + 0.55, 0) from generate_series(-2,4) tbl(i);
----
-2 -1
-1 0
0 1
1 2
2 3
3 4
4 5
# decimals
query II
SELECT roundBankers(45, -1), roundBankers(35, -1)
----
40 40
query II
SELECT roundBankers(45.5, 0), roundBankers(44.5, 0)
----
46 44
query II
SELECT roundBankers(45.55, 1), roundBankers(45.45, 1)
----
45.6 45.4
# negative values
query II
SELECT roundBankers(-45, -1), roundBankers(-35, -1)
----
-40 -40
query II
SELECT roundBankers(-45.5, 0), roundBankers(-44.5, 0)
----
-46 -44
query II
SELECT roundBankers(-45.55, 1), roundBankers(-45.45, 1)
----
-45.6 -45.4
# doubles
query II
SELECT roundBankers(45::DOUBLE, -1), roundBankers(35::DOUBLE, -1)
----
40 40
query II
SELECT roundBankers(45.5::DOUBLE, 0), roundBankers(44.5::DOUBLE, 0)
----
46 44
query II
SELECT roundBankers(45.55::DOUBLE, 1), roundBankers(45.45::DOUBLE, 1)
----
45.6 45.4
query III
SELECT roundBankers(NULL, 1), roundBankers(45, NULL), roundBankers(NULL, NULL)
----
NULL NULL NULL

View File

@@ -0,0 +1,44 @@
# name: test/sql/function/numeric/test_round_integers.test
# description: Test the special cased integer rounding
# group: [numeric]
statement ok
CREATE TABLE zz AS
SELECT
CAST(i AS SMALLINT) AS id,
CAST(i AS SMALLINT) AS si
FROM generate_series(1, 1000) t(i);
query I
SELECT ROUND(53) AS ag_column3
FROM zz
GROUP BY ag_column3
ORDER BY ag_column3
----
53
query I
SELECT ROUND(53, si) AS ag_column3
FROM zz
GROUP BY ag_column3
ORDER BY ag_column3
----
53
query I
SELECT ROUND(53, -si) AS ag_column3
FROM zz
GROUP BY ag_column3
ORDER BY ag_column3
----
0
50
100
query I
select round(100::INTEGER, int)
from test_all_types();
----
0
100
NULL

View File

@@ -0,0 +1,37 @@
# name: test/sql/function/numeric/test_sign_bit.test
# description: signbit test
# group: [numeric]
statement ok
SET default_null_order='nulls_first';
foreach type FLOAT DOUBLE
query III
SELECT signbit(3::${type}), signbit(-3::${type}), signbit(NULL::${type})
----
false true NULL
statement ok
CREATE TABLE floats(f ${type})
statement ok
INSERT INTO floats VALUES (3), (1.0::float), (-0.0::float), ('inf'), ('-inf'), (NULL)
query IIII
SELECT f, signbit(f), isinf(f), isfinite(f) FROM floats ORDER BY f
----
NULL NULL NULL NULL
-inf True True False
-0 True False True
1 False False True
3 False False True
inf False True False
statement ok
SELECT signbit(1.0 / 0.0);
statement ok
DROP TABLE floats
endloop

View File

@@ -0,0 +1,511 @@
# name: test/sql/function/numeric/test_trigo.test
# description: Test trigonometric function
# group: [numeric]
statement ok
SET default_null_order='nulls_first';
statement ok
CREATE TABLE numbers(n DOUBLE)
statement ok
INSERT INTO numbers VALUES (-42),(-1),(0), (1), (42), (NULL)
query I
SELECT cast(SIN(n::tinyint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
917
-841
0
841
-917
query I
SELECT cast(SIN(n::smallint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
917
-841
0
841
-917
query I
SELECT cast(SIN(n::integer)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
917
-841
0
841
-917
query I
SELECT cast(SIN(n::bigint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
917
-841
0
841
-917
query I
SELECT cast(SIN(n::float)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
917
-841
0
841
-917
query I
SELECT cast(SIN(n::double)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
917
-841
0
841
-917
query I
SELECT cast(COS(n::tinyint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-400
540
1000
540
-400
query I
SELECT cast(COS(n::smallint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-400
540
1000
540
-400
query I
SELECT cast(COS(n::integer)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-400
540
1000
540
-400
query I
SELECT cast(COS(n::bigint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-400
540
1000
540
-400
query I
SELECT cast(COS(n::float)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-400
540
1000
540
-400
query I
SELECT cast(COS(n::double)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-400
540
1000
540
-400
query I
SELECT cast(TAN(n::tinyint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-2291
-1557
0
1557
2291
query I
SELECT cast(TAN(n::smallint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-2291
-1557
0
1557
2291
query I
SELECT cast(TAN(n::integer)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-2291
-1557
0
1557
2291
query I
SELECT cast(TAN(n::bigint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-2291
-1557
0
1557
2291
query I
SELECT cast(TAN(n::float)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-2291
-1557
0
1557
2291
query I
SELECT cast(TAN(n::double)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-2291
-1557
0
1557
2291
query I
SELECT cast(ATAN(n::tinyint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-1547
-785
0
785
1547
query I
SELECT cast(ATAN(n::smallint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-1547
-785
0
785
1547
query I
SELECT cast(ATAN(n::integer)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-1547
-785
0
785
1547
query I
SELECT cast(ATAN(n::bigint)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-1547
-785
0
785
1547
query I
SELECT cast(ATAN(n::float)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-1547
-785
0
785
1547
query I
SELECT cast(ATAN(n::double)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-1547
-785
0
785
1547
query I
SELECT cast(ASIN(n::tinyint)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
-1571
0
1571
query I
SELECT cast(ASIN(n::smallint)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
-1571
0
1571
query I
SELECT cast(ASIN(n::integer)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
-1571
0
1571
query I
SELECT cast(ASIN(n::bigint)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
-1571
0
1571
query I
SELECT cast(ASIN(n::float)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
-1571
0
1571
query I
SELECT cast(ASIN(n::double)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
-1571
0
1571
query I
SELECT cast(ACOS(n::tinyint)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
3142
1571
0
query I
SELECT cast(ACOS(n::smallint)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
3142
1571
0
query I
SELECT cast(ACOS(n::integer)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
3142
1571
0
query I
SELECT cast(ACOS(n::bigint)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
3142
1571
0
query I
SELECT cast(ACOS(n::float)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
3142
1571
0
query I
SELECT cast(ACOS(n::double)*1000 as bigint) FROM numbers WHERE n between -1 and 1 ORDER BY n
----
3142
1571
0
statement error
SELECT cast(ASIN(n)*1000 as bigint) FROM numbers ORDER BY n
----
query I
SELECT cast(COT(n::tinyint)*1000 as bigint) FROM numbers WHERE n > 0.1 OR N < -0.1 ORDER BY n
----
-436
-642
642
436
query I
SELECT cast(COT(n::smallint)*1000 as bigint) FROM numbers WHERE n > 0.1 OR N < -0.1 ORDER BY n
----
-436
-642
642
436
query I
SELECT cast(COT(n::integer)*1000 as bigint) FROM numbers WHERE n > 0.1 OR N < -0.1 ORDER BY n
----
-436
-642
642
436
query I
SELECT cast(COT(n::bigint)*1000 as bigint) FROM numbers WHERE n > 0.1 OR N < -0.1 ORDER BY n
----
-436
-642
642
436
query I
SELECT cast(COT(n::float)*1000 as bigint) FROM numbers WHERE n > 0.1 OR N < -0.1 ORDER BY n
----
-436
-642
642
436
query I
SELECT cast(COT(n::double)*1000 as bigint) FROM numbers WHERE n > 0.1 OR N < -0.1 ORDER BY n
----
-436
-642
642
436
query I
SELECT cast(ATAN2(n::tinyint, 42)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-785
-24
0
24
785
query I
SELECT cast(ATAN2(n::smallint, 42)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-785
-24
0
24
785
query I
SELECT cast(ATAN2(n::integer, 42)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-785
-24
0
24
785
query I
SELECT cast(ATAN2(n::bigint, 42)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-785
-24
0
24
785
query I
SELECT cast(ATAN2(n::float, 42)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-785
-24
0
24
785
query I
SELECT cast(ATAN2(n::double, 42)*1000 as bigint) FROM numbers ORDER BY n
----
NULL
-785
-24
0
24
785
statement error
select asin(-2);
----
Invalid Input Error: ASIN is undefined outside [-1,1]
statement error
select acos(-2);
----
Invalid Input Error: ACOS is undefined outside [-1,1]
# Hyperbolic trigo functions
# ATANH
foreach value 1.1 -1.1
statement error
select atanh(${value});
----
Invalid Input Error: ATANH is undefined outside [-1,1]
endloop
query II
select atanh(1), atanh(-1);
----
inf inf
query III
select atanh(-0.5), atanh(0), atanh(0.5);
----
-0.5493061443340549 0.0 0.5493061443340549
# ACOSH
query IIII
select acosh(-1), acosh(0), acosh(1), acosh(2);
----
NaN NaN 0.0 1.3169578969248166
# ASINH
query III
select asinh(-1), asinh(0), asinh(2);
----
-0.881373587019543 0.0 1.4436354751788103
# TANH
query IIII
select tanh(-0.5), tanh(0), tanh(0.5), tanh(1000);
----
-0.46211715726000974 0.0 0.46211715726000974 1.0
# COSH
query IIII
select cosh(-1), cosh(0), cosh(1), cosh(1000);
----
1.5430806348152437 1.0 1.5430806348152437 inf
# SINH
query IIII
select sinh(-1), sinh(0), sinh(1), sinh(1000);
----
-1.1752011936438014 0.0 1.1752011936438014 inf

View File

@@ -0,0 +1,92 @@
# name: test/sql/function/numeric/test_trunc.test
# description: Truncation test
# group: [numeric]
statement ok
CREATE TABLE truncme(a DOUBLE, b INTEGER, c UINTEGER)
statement ok
INSERT INTO truncme VALUES (42.123456, 3, 19), (-3.141592, -7, 5);
# Non-intergral should truncate
foreach datatype DOUBLE FLOAT DECIMAL(10,6)
query R
select trunc(42.12345::${datatype})
----
42.000000
query R
select trunc(-42.12345::${datatype})
----
-42.000000
query R
select trunc(127::${datatype})
----
127.000000
query R
select trunc(-127::${datatype})
----
-127.000000
query R
select trunc(0::${datatype})
----
0.000000
query I
select trunc(a::${datatype}) from truncme
----
42.000000
-3.000000
endloop
# Signed integers should be a NOP
foreach signed TINYINT SMALLINT INTEGER BIGINT HUGEINT
query R
select trunc(54::${signed})
----
54
query R
select trunc(-27::${signed})
----
-27
query I
select trunc(b::${signed}) from truncme
----
3
-7
endloop
# Unsigned integers should be a NOP
foreach unsigned UTINYINT USMALLINT UINTEGER UBIGINT UHUGEINT
query R
select trunc(15::${unsigned})
----
15
query I
select trunc(c::${unsigned}) from truncme
----
19
5
endloop
# Test specials
foreach special DOUBLE FLOAT
query III
select trunc('NAN'::${special}), trunc('infinity'::${special}), trunc('-infinity'::${special});
----
NAN infinity -infinity
endloop

View File

@@ -0,0 +1,106 @@
# name: test/sql/function/numeric/test_trunc_precision.test
# description: Truncation to precision tests
# group: [numeric]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE truncme(a DOUBLE, b INTEGER, c UINTEGER)
statement ok
INSERT INTO truncme VALUES (42.123456, 37, 19), (-3.141592, -75, 5);
# Non-integral types should truncate
foreach datatype DOUBLE FLOAT DECIMAL(10,6)
query RR
select trunc(42.12345::${datatype}, 2), trunc(42.12345::${datatype}, -1)
----
42.12 40
query RR
select trunc(-42.12345::${datatype}, 2), trunc(-42.12345::${datatype}, -1)
----
-42.12 -40
query RR
select trunc(127::${datatype}, 2), trunc(127::${datatype}, -1)
----
127.000000 120
query RR
select trunc(-127::${datatype}, 2), trunc(-127::${datatype}, -1)
----
-127.000000 -120
query RR
select trunc(0::${datatype}, 2), trunc(0::${datatype}, -1)
----
0.000000 0.000000
query II
select trunc(a::${datatype}, 2), trunc(a::${datatype}, -1)
from truncme
----
42.12 40
-3.14 0
endloop
# Signed integers should truncate too
foreach signed TINYINT SMALLINT INTEGER BIGINT HUGEINT
query RR
select trunc(54::${signed}, 2), trunc(54::${signed}, -1)
----
54 50
query RR
select trunc(-27::${signed}, 2), trunc(-27::${signed}, -1)
----
-27 -20
query II
select trunc(b::${signed}, 2), trunc(b::${signed}, -1)
from truncme
----
37 30
-75 -70
endloop
# Unsigned integers should truncate too
foreach unsigned UTINYINT USMALLINT UINTEGER UBIGINT UHUGEINT
query RR
select trunc(15::${unsigned}, 2), trunc(15::${unsigned}, -1)
----
15 10
query II
select trunc(c::${unsigned}, 2), trunc(c::${unsigned}, -1)
from truncme
----
19 10
5 0
endloop
# Test specials
foreach special DOUBLE FLOAT
foreach precision 2 0 -1
query III
select
trunc('NAN'::${special}, ${precision}),
trunc('infinity'::${special}, ${precision}),
trunc('-infinity'::${special}, ${precision})
;
----
NAN infinity -infinity
endloop
endloop

View File

@@ -0,0 +1,213 @@
# name: test/sql/function/numeric/test_type_resolution.test
# group: [numeric]
# test type resolution of various additions
query I
SELECT 1::TINYINT + 1::TINYINT
----
2
query I
SELECT 1::TINYINT + 1::SMALLINT
----
2
query I
SELECT 1::TINYINT + 1::INT
----
2
query I
SELECT 1::TINYINT + 1::BIGINT
----
2
query R
SELECT 1::TINYINT + 1::REAL
----
2.000000
query R
SELECT 1::TINYINT + 1::DOUBLE
----
2.000000
statement error
SELECT 1::TINYINT + 1::VARCHAR
----
<REGEX>:.*Binder Error: No function matches.*
query I
SELECT 1::SMALLINT + 1::TINYINT
----
2
query I
SELECT 1::SMALLINT + 1::SMALLINT
----
2
query I
SELECT 1::SMALLINT + 1::INT
----
2
query I
SELECT 1::SMALLINT + 1::BIGINT
----
2
query R
SELECT 1::SMALLINT + 1::REAL
----
2.000000
query R
SELECT 1::SMALLINT + 1::DOUBLE
----
2.000000
statement error
SELECT 1::SMALLINT + 1::VARCHAR
----
<REGEX>:.*Binder Error: No function matches.*
query I
SELECT 1::INTEGER + 1::TINYINT
----
2
query I
SELECT 1::INTEGER + 1::SMALLINT
----
2
query I
SELECT 1::INTEGER + 1::INT
----
2
query I
SELECT 1::INTEGER + 1::BIGINT
----
2
query R
SELECT 1::INTEGER + 1::REAL
----
2.000000
query R
SELECT 1::INTEGER + 1::DOUBLE
----
2.000000
statement error
SELECT 1::INTEGER + 1::VARCHAR
----
<REGEX>:.*Binder Error: No function matches.*
query I
SELECT 1::BIGINT + 1::TINYINT
----
2
query I
SELECT 1::BIGINT + 1::SMALLINT
----
2
query I
SELECT 1::BIGINT + 1::INT
----
2
query I
SELECT 1::BIGINT + 1::BIGINT
----
2
query R
SELECT 1::BIGINT + 1::REAL
----
2.000000
query R
SELECT 1::BIGINT + 1::DOUBLE
----
2.000000
statement error
SELECT 1::BIGINT + 1::VARCHAR
----
<REGEX>:.*Binder Error: No function matches.*
query R
SELECT 1::REAL + 1::TINYINT
----
2.000000
query R
SELECT 1::REAL + 1::SMALLINT
----
2.000000
query R
SELECT 1::REAL + 1::INT
----
2.000000
query R
SELECT 1::REAL + 1::BIGINT
----
2.000000
query R
SELECT 1::REAL + 1::REAL
----
2.000000
query R
SELECT 1::REAL + 1::DOUBLE
----
2.000000
statement error
SELECT 1::REAL + 1::VARCHAR
----
<REGEX>:.*Binder Error: No function matches.*
query R
SELECT 1::DOUBLE + 1::TINYINT
----
2.000000
query R
SELECT 1::DOUBLE + 1::SMALLINT
----
2.000000
query R
SELECT 1::DOUBLE + 1::INT
----
2.000000
query R
SELECT 1::DOUBLE + 1::BIGINT
----
2.000000
query R
SELECT 1::DOUBLE + 1::REAL
----
2.000000
query R
SELECT 1::DOUBLE + 1::DOUBLE
----
2.000000
statement error
SELECT 1::DOUBLE + 1::VARCHAR
----
<REGEX>:.*Binder Error: No function matches.*

View File

@@ -0,0 +1,88 @@
# name: test/sql/function/numeric/test_unary.test
# description: Test unary operators
# group: [numeric]
statement ok
CREATE TABLE test(i INTEGER)
statement ok
INSERT INTO test VALUES (2)
query I
SELECT ++-++-+i FROM test
----
2
# test simple unary operators
query I
SELECT +i FROM test
----
2
query I
SELECT -i FROM test
----
-2
# we can also stack unary functions
query I
SELECT +++++++i FROM test
----
2
query I
SELECT ++-++-+i FROM test
----
2
query I
SELECT -+-+-+-+-i FROM test
----
-2
# Test negation of minima
statement ok
CREATE TABLE minima (t TINYINT, s SMALLINT, i INTEGER, b BIGINT);
statement ok
INSERT INTO minima VALUES (-128, -32768, -2147483648, -9223372036854775808);
statement error
SELECT -t from minima;
----
statement error
SELECT -s from minima;
----
statement error
SELECT -i from minima;
----
statement error
SELECT -b from minima;
----
# cannot apply these to a string
statement error
SELECT +'hello'
----
statement error
SELECT -'hello'
----
# cannot apply these to a date either
statement ok
CREATE TABLE dates(d DATE)
statement ok
INSERT INTO dates VALUES ('1992-02-02')
statement error
SELECT +d FROM dates
----
statement error
SELECT -d FROM dates
----