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,146 @@
# name: test/sql/function/operator/test_arithmetic.test
# description: Test arithmetic statements
# group: [operator]
statement ok
SET default_null_order='nulls_first';
statement ok
CREATE TABLE integers(i INTEGER);
statement ok
INSERT INTO integers VALUES (1), (2), (3), (NULL)
# comparisons involving arithmetic
# these are interesting because these will be folded by optimizers
# so we test if the optimizers work correctly
# addition is unordered (i.e. i+2=2+i)
# i+2=5 => i=3
query TT
SELECT i+2=5, 5=i+2 FROM integers ORDER BY i
----
NULL NULL
0 0
0 0
1 1
# 2+i=5 => i=3
query TT
SELECT 2+i=5, 5=2+i FROM integers ORDER BY i
----
NULL NULL
0 0
0 0
1 1
# multiplication is unordered
# i*2=6 => i=3
query TT
SELECT i*2=6, 6=i*2 FROM integers ORDER BY i
----
NULL NULL
0 0
0 0
1 1
# 2*i=6 => i=3
query TT
SELECT 2*i=6, 6=2*i FROM integers ORDER BY i
----
NULL NULL
0 0
0 0
1 1
# i*2=5 (this comparison is always FALSE, except if i is NULL in which case it is NULL)
query T
SELECT i*2=5 FROM integers ORDER BY i
----
NULL
0
0
0
# i*0=5
query T
SELECT i*0=5 FROM integers ORDER BY i
----
NULL
0
0
0
# -i>-2 => i<2
query T
SELECT -i>-2 FROM integers ORDER BY i
----
NULL
1
0
0
# subtraction is ordered
# i-2=1 => i=3
query TT
SELECT i-2=1, 1=i-2 FROM integers ORDER BY i
----
NULL NULL
0 0
0 0
1 1
# 3-i=1 => i=2
query TT
SELECT 3-i=1, 1=3-i FROM integers ORDER BY i
----
NULL NULL
0 0
1 1
0 0
# non-equality comparisons should also be flipped in this case
# 3-i<2 => i>2
query TT
SELECT 3-i<2, 2>3-i FROM integers ORDER BY i
----
NULL NULL
0 0
1 1
1 1
query TT
SELECT 3-i<=1, 1>=3-i FROM integers ORDER BY i
----
NULL NULL
0 0
1 1
1 1
# division is ordered
# i/2=1 => i>=2 or i<=3
query TT
SELECT i//2=1, 1=i//2 FROM integers ORDER BY i
----
NULL NULL
0 0
1 1
1 1
# 2/i=1 => i=2
query TT
SELECT 2/i=1, 1=2/i FROM integers ORDER BY i
----
NULL NULL
0 0
1 1
0 0
# 3/i=2 => i=2
query TT
SELECT 2/i=1, 1=2/i FROM integers ORDER BY i
----
NULL NULL
0 0
1 1
0 0

View File

@@ -0,0 +1,51 @@
# name: test/sql/function/operator/test_arithmetic_sqllogic.test
# description: SQLogicTest inspired arithmetic tests
# group: [operator]
statement ok
CREATE TABLE tab0(col0 INTEGER, col1 INTEGER, col2 INTEGER);
statement ok
CREATE TABLE tab1(col0 INTEGER, col1 INTEGER, col2 INTEGER);
statement ok
CREATE TABLE tab2(col0 INTEGER, col1 INTEGER, col2 INTEGER);
statement ok
INSERT INTO tab0 VALUES(97,1,99);
statement ok
INSERT INTO tab0 VALUES(15,81,47);
statement ok
INSERT INTO tab0 VALUES(87,21,10);
statement ok
INSERT INTO tab1 VALUES(51,14,96);
statement ok
INSERT INTO tab1 VALUES(85,5,59);
statement ok
INSERT INTO tab1 VALUES(91,47,68);
statement ok
INSERT INTO tab2 VALUES(64,77,40);
statement ok
INSERT INTO tab2 VALUES(75,67,58);
statement ok
INSERT INTO tab2 VALUES(46,51,23);
query I
SELECT DISTINCT - col2 AS col2 FROM tab1 WHERE NOT 18 BETWEEN NULL AND ( + col0 * + CAST ( NULL AS INTEGER ) + - 3 / col2 ) OR NOT col0 BETWEEN col2 + + col1 AND NULL ORDER BY 1 DESC;
----
-68
-96
query I
SELECT MIN ( DISTINCT + CAST ( NULL AS INTEGER ) ) * COUNT ( * ) * - + 16 * CASE + + AVG ( ALL 97 ) WHEN ( + NULLIF ( SUM ( CAST ( NULL AS REAL ) ), 6 ) ) THEN 51 * 31 + - 6 WHEN + 48 * - 34 THEN NULL WHEN 91 * + ( SUM ( CAST ( NULL AS INTEGER ) ) ) THEN NULL END * - 4 + - 67;
----
NULL

View File

@@ -0,0 +1,79 @@
# name: test/sql/function/operator/test_bitwise_ops.test
# description: Test scalar bitwise ops
# group: [operator]
# left shift
query III
SELECT 1 << 2, NULL << 2, 2 << NULL
----
4 NULL NULL
# right shift
query IIII
SELECT 16 >> 2, 1 >> 2, NULL >> 2, 2 >> NULL
----
4 0 NULL NULL
# bitwise and
query IIIII
SELECT 1 & 1, 1 & 0, 0 & 0, NULL & 1, 1 & NULL
----
1 0 0 NULL NULL
# bitwise or
query IIIII
SELECT 1 | 1, 1 | 0, 0 | 0, NULL | 1, 1 | NULL
----
1 1 0 NULL NULL
# bitwise xor
query IIIII
SELECT xor(1, 1), xor(1, 0), xor(0, 0), xor(NULL, 1), xor(1, NULL)
----
0 1 0 NULL NULL
# out of range shifts throw an error
statement error
SELECT 1::TINYINT << -1::TINYINT, 1::TINYINT >> -1::TINYINT, 1::TINYINT << 12::TINYINT, 1::TINYINT >> 12::TINYINT
----
statement error
SELECT 1::SMALLINT << -1::SMALLINT, 1::SMALLINT >> -1::SMALLINT, 1::SMALLINT << 20::SMALLINT, 1::SMALLINT >> 20::SMALLINT
----
statement error
SELECT 1::INT << -1::INT, 1::INT >> -1::INT, 1::INT << 40::INT, 1::INT >> 40::INT
----
statement error
SELECT 1::BIGINT << -1::BIGINT, 1::BIGINT >> -1::BIGINT, 1::BIGINT << 1000::BIGINT, 1::BIGINT >> 1000::BIGINT
----
# test invalid bitwise ops
statement error
SELECT 'hello' << 3
----
statement error
SELECT 3 << 'hello'
----
statement error
SELECT 2.0 << 1
----
# unsigned numbers
query IIII
SELECT 1::UTINYINT << 7, 1::USMALLINT << 15, 1::UINT32 << 31, 1::UBIGINT << 63
----
128 32768 2147483648 9223372036854775808
statement error
SELECT 1::UINT32 << 32
----
Overflow in left shift
statement error
SELECT 2::UINT32 << 31
----
Overflow in left shift

View File

@@ -0,0 +1,100 @@
# name: test/sql/function/operator/test_bitwise_ops_types.test
# description: Test bitwise ops with tables and different types
# group: [operator]
# type TINYINT
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE bitwise_test(i TINYINT, j TINYINT)
statement ok
INSERT INTO bitwise_test VALUES (1, 1), (1, 0), (0, 1), (0, 0), (1, NULL), (NULL, 1), (NULL, NULL)
query IIIII
SELECT i << j, i >> j, i & j, i | j, xor(i, j) FROM bitwise_test
----
2 0 1 1 0
1 1 0 1 1
0 0 0 1 1
0 0 0 0 0
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
statement ok
ROLLBACK
# type SMALLINT
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE bitwise_test(i SMALLINT, j SMALLINT)
statement ok
INSERT INTO bitwise_test VALUES (1, 1), (1, 0), (0, 1), (0, 0), (1, NULL), (NULL, 1), (NULL, NULL)
query IIIII
SELECT i << j, i >> j, i & j, i | j, xor(i, j) FROM bitwise_test
----
2 0 1 1 0
1 1 0 1 1
0 0 0 1 1
0 0 0 0 0
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
statement ok
ROLLBACK
# type INTEGER
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE bitwise_test(i INTEGER, j INTEGER)
statement ok
INSERT INTO bitwise_test VALUES (1, 1), (1, 0), (0, 1), (0, 0), (1, NULL), (NULL, 1), (NULL, NULL)
query IIIII
SELECT i << j, i >> j, i & j, i | j, xor(i, j) FROM bitwise_test
----
2 0 1 1 0
1 1 0 1 1
0 0 0 1 1
0 0 0 0 0
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
statement ok
ROLLBACK
# type BIGINT
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE bitwise_test(i BIGINT, j BIGINT)
statement ok
INSERT INTO bitwise_test VALUES (1, 1), (1, 0), (0, 1), (0, 0), (1, NULL), (NULL, 1), (NULL, NULL)
query IIIII
SELECT i << j, i >> j, i & j, i | j, xor(i, j) FROM bitwise_test
----
2 0 1 1 0
1 1 0 1 1
0 0 0 1 1
0 0 0 0 0
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
statement ok
ROLLBACK

View File

@@ -0,0 +1,47 @@
# name: test/sql/function/operator/test_comparison.test
# description: Test basic comparison statements
# group: [operator]
# = and == are the same
query TTTTT
SELECT 1 == 1, 1 = 1, 1 == 0, 1 = 0, 1 == NULL
----
1 1 0 0 NULL
# != and <> are the same
query TTTTT
SELECT 1 <> 1, 1 != 1, 1 <> 0, 1 != 0, 1 <> NULL
----
0 0 1 1 NULL
# Test auto casting of comparison statements
# string <> number comparisons should result in the string being cast to a number
statement error
select ('abc' between 20 and True);
----
statement error
select 'abc' > 10
----
statement error
select 20.0 = 'abc'
----
# 1000 > 20
query T
select '1000' > 20
----
1
# ... but '1000' < '20'!
query T
select '1000' > '20'
----
0
query T
select ('abc' between '20' and 'true');
----
1

View File

@@ -0,0 +1,194 @@
# name: test/sql/function/operator/test_conjunction.test
# description: Test conjunction statements
# group: [operator]
# create table
statement ok
CREATE TABLE a (i integer, j integer);
statement ok
INSERT INTO a VALUES (3, 4), (4, 5), (5, 6);
query II
SELECT * FROM a WHERE (i > 3 AND j < 5) OR (i > 3 AND j > 5);
----
5 6
query II
explain SELECT * FROM a WHERE (i > 3 AND j < 5) OR (i > 3 AND j > 5);
----
physical_plan <REGEX>:.*optional.*
# test boolean logic in conjunctions
query T
SELECT true AND true
----
1
query T
SELECT true AND false
----
0
query T
SELECT false AND true
----
0
query T
SELECT false AND false
----
0
query T
SELECT false AND NULL
----
0
query T
SELECT NULL AND false
----
0
query T
SELECT NULL AND true
----
NULL
query T
SELECT true AND NULL
----
NULL
query T
SELECT true OR true
----
1
query T
SELECT true OR NULL
----
1
query T
SELECT NULL OR true
----
1
query T
SELECT false OR NULL
----
NULL
query T
SELECT NULL OR false
----
NULL
query T
SELECT true OR false
----
1
query T
SELECT false OR true
----
1
query T
SELECT false OR false
----
0
# test single constant in conjunctions
query T
SELECT true AND i>3 FROM a ORDER BY i
----
0
1
1
query T
SELECT i>3 AND true FROM a ORDER BY i
----
0
1
1
query T
SELECT 2>3 AND i>3 FROM a ORDER BY i
----
0
0
0
query T
SELECT false AND i>3 FROM a ORDER BY i
----
0
0
0
query T
SELECT i>3 AND false FROM a ORDER BY i
----
0
0
0
query T
SELECT false OR i>3 FROM a ORDER BY i
----
0
1
1
query T
SELECT i>3 OR false FROM a ORDER BY i
----
0
1
1
query T
SELECT true OR i>3 FROM a ORDER BY i
----
1
1
1
query T
SELECT i>3 OR true FROM a ORDER BY i
----
1
1
1
query T
SELECT NULL OR i>3 FROM a ORDER BY i
----
NULL
1
1
query T
SELECT i>3 OR NULL FROM a ORDER BY i
----
NULL
1
1
query T
SELECT NULL AND i>3 FROM a ORDER BY i
----
0
NULL
NULL
query T
SELECT i>3 AND NULL FROM a ORDER BY i
----
0
NULL
NULL

View File

@@ -0,0 +1,190 @@
# name: test/sql/function/operator/test_date_arithmetic.test
# description: Test DATE + TIME
# group: [operator]
statement ok
SET default_null_order='nulls_first';
statement ok
CREATE TABLE dates(d DATE);
statement ok
INSERT INTO dates VALUES
('1992-01-01'),
('1992-03-03'),
('1992-05-05'),
('2022-01-01'),
('044-03-15 (BC)'),
(NULL);
statement ok
CREATE TABLE times(t TIME)
statement ok
INSERT INTO times VALUES
('00:01:20'),
('20:08:10.998'),
('20:08:10.33'),
('20:08:10.001'),
(NULL);
query III
SELECT d, t, d + t
FROM dates, times
ORDER BY 1, 2
----
NULL NULL NULL
NULL 00:01:20 NULL
NULL 20:08:10.001 NULL
NULL 20:08:10.33 NULL
NULL 20:08:10.998 NULL
0044-03-15 (BC) NULL NULL
0044-03-15 (BC) 00:01:20 0044-03-15 (BC) 00:01:20
0044-03-15 (BC) 20:08:10.001 0044-03-15 (BC) 20:08:10.001
0044-03-15 (BC) 20:08:10.33 0044-03-15 (BC) 20:08:10.33
0044-03-15 (BC) 20:08:10.998 0044-03-15 (BC) 20:08:10.998
1992-01-01 NULL NULL
1992-01-01 00:01:20 1992-01-01 00:01:20
1992-01-01 20:08:10.001 1992-01-01 20:08:10.001
1992-01-01 20:08:10.33 1992-01-01 20:08:10.33
1992-01-01 20:08:10.998 1992-01-01 20:08:10.998
1992-03-03 NULL NULL
1992-03-03 00:01:20 1992-03-03 00:01:20
1992-03-03 20:08:10.001 1992-03-03 20:08:10.001
1992-03-03 20:08:10.33 1992-03-03 20:08:10.33
1992-03-03 20:08:10.998 1992-03-03 20:08:10.998
1992-05-05 NULL NULL
1992-05-05 00:01:20 1992-05-05 00:01:20
1992-05-05 20:08:10.001 1992-05-05 20:08:10.001
1992-05-05 20:08:10.33 1992-05-05 20:08:10.33
1992-05-05 20:08:10.998 1992-05-05 20:08:10.998
2022-01-01 NULL NULL
2022-01-01 00:01:20 2022-01-01 00:01:20
2022-01-01 20:08:10.001 2022-01-01 20:08:10.001
2022-01-01 20:08:10.33 2022-01-01 20:08:10.33
2022-01-01 20:08:10.998 2022-01-01 20:08:10.998
query III
SELECT d, t, t + d
FROM dates, times
ORDER BY 1, 2
----
NULL NULL NULL
NULL 00:01:20 NULL
NULL 20:08:10.001 NULL
NULL 20:08:10.33 NULL
NULL 20:08:10.998 NULL
0044-03-15 (BC) NULL NULL
0044-03-15 (BC) 00:01:20 0044-03-15 (BC) 00:01:20
0044-03-15 (BC) 20:08:10.001 0044-03-15 (BC) 20:08:10.001
0044-03-15 (BC) 20:08:10.33 0044-03-15 (BC) 20:08:10.33
0044-03-15 (BC) 20:08:10.998 0044-03-15 (BC) 20:08:10.998
1992-01-01 NULL NULL
1992-01-01 00:01:20 1992-01-01 00:01:20
1992-01-01 20:08:10.001 1992-01-01 20:08:10.001
1992-01-01 20:08:10.33 1992-01-01 20:08:10.33
1992-01-01 20:08:10.998 1992-01-01 20:08:10.998
1992-03-03 NULL NULL
1992-03-03 00:01:20 1992-03-03 00:01:20
1992-03-03 20:08:10.001 1992-03-03 20:08:10.001
1992-03-03 20:08:10.33 1992-03-03 20:08:10.33
1992-03-03 20:08:10.998 1992-03-03 20:08:10.998
1992-05-05 NULL NULL
1992-05-05 00:01:20 1992-05-05 00:01:20
1992-05-05 20:08:10.001 1992-05-05 20:08:10.001
1992-05-05 20:08:10.33 1992-05-05 20:08:10.33
1992-05-05 20:08:10.998 1992-05-05 20:08:10.998
2022-01-01 NULL NULL
2022-01-01 00:01:20 2022-01-01 00:01:20
2022-01-01 20:08:10.001 2022-01-01 20:08:10.001
2022-01-01 20:08:10.33 2022-01-01 20:08:10.33
2022-01-01 20:08:10.998 2022-01-01 20:08:10.998
statement ok
CREATE TABLE timetzs(ttz TIMETZ)
statement ok
INSERT INTO timetzs VALUES
('00:01:20+00'),
('20:08:10.998-07'),
('20:08:10.33+12'),
('20:08:10.001-1559'),
(NULL);
query III
SELECT d, ttz, d + ttz
FROM dates, timetzs
ORDER BY 1, 2
----
NULL NULL NULL
NULL 00:01:20+00 NULL
NULL 20:08:10.33+12 NULL
NULL 20:08:10.998-07 NULL
NULL 20:08:10.001-15:59 NULL
0044-03-15 (BC) NULL NULL
0044-03-15 (BC) 00:01:20+00 0044-03-15 (BC) 00:01:20+00
0044-03-15 (BC) 20:08:10.33+12 0044-03-15 (BC) 08:08:10.33+00
0044-03-15 (BC) 20:08:10.998-07 0044-03-16 (BC) 03:08:10.998+00
0044-03-15 (BC) 20:08:10.001-15:59 0044-03-16 (BC) 12:07:10.001+00
1992-01-01 NULL NULL
1992-01-01 00:01:20+00 1992-01-01 00:01:20+00
1992-01-01 20:08:10.33+12 1992-01-01 08:08:10.33+00
1992-01-01 20:08:10.998-07 1992-01-02 03:08:10.998+00
1992-01-01 20:08:10.001-15:59 1992-01-02 12:07:10.001+00
1992-03-03 NULL NULL
1992-03-03 00:01:20+00 1992-03-03 00:01:20+00
1992-03-03 20:08:10.33+12 1992-03-03 08:08:10.33+00
1992-03-03 20:08:10.998-07 1992-03-04 03:08:10.998+00
1992-03-03 20:08:10.001-15:59 1992-03-04 12:07:10.001+00
1992-05-05 NULL NULL
1992-05-05 00:01:20+00 1992-05-05 00:01:20+00
1992-05-05 20:08:10.33+12 1992-05-05 08:08:10.33+00
1992-05-05 20:08:10.998-07 1992-05-06 03:08:10.998+00
1992-05-05 20:08:10.001-15:59 1992-05-06 12:07:10.001+00
2022-01-01 NULL NULL
2022-01-01 00:01:20+00 2022-01-01 00:01:20+00
2022-01-01 20:08:10.33+12 2022-01-01 08:08:10.33+00
2022-01-01 20:08:10.998-07 2022-01-02 03:08:10.998+00
2022-01-01 20:08:10.001-15:59 2022-01-02 12:07:10.001+00
query III
SELECT d, ttz, ttz + d
FROM dates, timetzs
ORDER BY 1, 2
----
NULL NULL NULL
NULL 00:01:20+00 NULL
NULL 20:08:10.33+12 NULL
NULL 20:08:10.998-07 NULL
NULL 20:08:10.001-15:59 NULL
0044-03-15 (BC) NULL NULL
0044-03-15 (BC) 00:01:20+00 0044-03-15 (BC) 00:01:20+00
0044-03-15 (BC) 20:08:10.33+12 0044-03-15 (BC) 08:08:10.33+00
0044-03-15 (BC) 20:08:10.998-07 0044-03-16 (BC) 03:08:10.998+00
0044-03-15 (BC) 20:08:10.001-15:59 0044-03-16 (BC) 12:07:10.001+00
1992-01-01 NULL NULL
1992-01-01 00:01:20+00 1992-01-01 00:01:20+00
1992-01-01 20:08:10.33+12 1992-01-01 08:08:10.33+00
1992-01-01 20:08:10.998-07 1992-01-02 03:08:10.998+00
1992-01-01 20:08:10.001-15:59 1992-01-02 12:07:10.001+00
1992-03-03 NULL NULL
1992-03-03 00:01:20+00 1992-03-03 00:01:20+00
1992-03-03 20:08:10.33+12 1992-03-03 08:08:10.33+00
1992-03-03 20:08:10.998-07 1992-03-04 03:08:10.998+00
1992-03-03 20:08:10.001-15:59 1992-03-04 12:07:10.001+00
1992-05-05 NULL NULL
1992-05-05 00:01:20+00 1992-05-05 00:01:20+00
1992-05-05 20:08:10.33+12 1992-05-05 08:08:10.33+00
1992-05-05 20:08:10.998-07 1992-05-06 03:08:10.998+00
1992-05-05 20:08:10.001-15:59 1992-05-06 12:07:10.001+00
2022-01-01 NULL NULL
2022-01-01 00:01:20+00 2022-01-01 00:01:20+00
2022-01-01 20:08:10.33+12 2022-01-01 08:08:10.33+00
2022-01-01 20:08:10.998-07 2022-01-02 03:08:10.998+00
2022-01-01 20:08:10.001-15:59 2022-01-02 12:07:10.001+00
# Overflow
statement error
SELECT '294247-01-10'::DATE + '04:00:54.775808'::TIME;
----
<REGEX>:.*Out of Range Error.*out of range.*

View File

@@ -0,0 +1,39 @@
# name: test/sql/function/operator/test_division_overflow.test
# description: Test division overflow
# group: [operator]
statement error
SELECT (-128)::TINYINT // (-1)::TINYINT
----
query I
SELECT (-127)::TINYINT // (-1)::TINYINT
----
127
statement error
SELECT (-32768)::SMALLINT // (-1)::SMALLINT
----
query I
SELECT (-32767)::SMALLINT // (-1)::SMALLINT
----
32767
statement error
SELECT (-2147483648)::INTEGER // (-1)::INTEGER
----
query I
SELECT (-2147483647)::INTEGER // (-1)::INTEGER
----
2147483647
statement error
SELECT (-9223372036854775808)::BIGINT // (-1)::BIGINT
----
query I
SELECT (-9223372036854775807)::BIGINT // (-1)::BIGINT
----
9223372036854775807

View File

@@ -0,0 +1,18 @@
# name: test/sql/function/operator/test_in_empty_table.test
# description: Issue #11063 - IN operator throws a Conversion Error when checking INTEGER column for 5 or more VARCHAR elements
# group: [operator]
statement ok
CREATE OR REPLACE TABLE test (a INTEGER)
query I
SELECT * FROM test WHERE a IN ('a', 'b', 'c', 'd', 'e')
----
statement ok
INSERT INTO test VALUES (42)
statement error
SELECT * FROM test WHERE a IN ('a', 'b', 'c', 'd', 'e')
----
Could not convert string