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,28 @@
# name: test/sql/index/art/scan/test_art_adaptive_scan.test
# description: Test scanning more than standard vector size rows with an index scan.
# group: [scan]
statement ok
CREATE TABLE integers AS SELECT 42 AS i FROM range(2050);
statement ok
INSERT INTO integers SELECT 42 + 1 + range FROM range(5000);
statement ok
CREATE INDEX i_index ON integers USING ART(i);
statement ok
SET index_scan_percentage = 1.0;
statement ok
SET index_scan_max_count = 0;
query II
EXPLAIN ANALYZE SELECT COUNT(i) FROM integers WHERE i = 42;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT COUNT(i) FROM integers WHERE i = 42;
----
2050

View File

@@ -0,0 +1,95 @@
# name: test/sql/index/art/scan/test_art_many_matches.test
# description: Test ART index with many matches
# group: [scan]
statement ok
BEGIN TRANSACTION
# create a table with the values [0, 1, 0, 1, ..., 0, 1]
statement ok
CREATE TABLE integers(i INTEGER)
statement ok
INSERT INTO integers SELECT i FROM RANGE(0, 1024, 1) t2(j), (VALUES (0), (1)) t1(i) ORDER BY j, i;
statement ok
CREATE INDEX i_index ON integers using art(i)
query I
SELECT COUNT(*) FROM integers WHERE i<1
----
1024
query I
SELECT COUNT(*) FROM integers WHERE i<=1
----
2048
query I
SELECT COUNT(*) FROM integers WHERE i=0
----
1024
query I
SELECT COUNT(*) FROM integers WHERE i=1
----
1024
query I
SELECT COUNT(*) FROM integers WHERE i>0
----
1024
query I
SELECT COUNT(*) FROM integers WHERE i>=0
----
2048
statement ok
ROLLBACK
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE integers(i INTEGER)
statement ok
INSERT INTO integers SELECT i FROM RANGE(0, 2048, 1) t2(j), (VALUES (0), (1)) t1(i) ORDER BY j, i;
statement ok
CREATE INDEX i_index ON integers using art(i)
query I
SELECT COUNT(*) FROM integers WHERE i<1
----
2048
query I
SELECT COUNT(*) FROM integers WHERE i<=1
----
4096
query I
SELECT COUNT(*) FROM integers WHERE i=0
----
2048
query I
SELECT COUNT(*) FROM integers WHERE i=1
----
2048
query I
SELECT COUNT(*) FROM integers WHERE i>0
----
2048
query I
SELECT COUNT(*) FROM integers WHERE i>=0
----
4096
statement ok
ROLLBACK

View File

@@ -0,0 +1,33 @@
# name: test/sql/index/art/scan/test_art_negative_range_scan.test
# description: Test negative range scans on an ART
# group: [scan]
statement ok
CREATE TABLE integers(i integer)
statement ok
INSERT INTO integers SELECT * FROM range(-500, 500, 1)
statement ok
CREATE INDEX i_index ON integers(i)
query R
SELECT sum(i) FROM integers WHERE i >= -500 AND i <= -498
----
-1497.000000
query R
SELECT sum(i) FROM integers WHERE i >= -10 AND i <= 5
----
-40.000000
query R
SELECT sum(i) FROM integers WHERE i >= 10 AND i <= 15
----
75.000000
statement ok
DROP INDEX i_index
statement ok
DROP TABLE integers

View File

@@ -0,0 +1,83 @@
# name: test/sql/index/art/scan/test_art_null_bytes.test
# description: Test ART keys containing NULL bytes.
# group: [scan]
statement ok
CREATE TABLE varchars(v VARCHAR PRIMARY KEY);
statement ok
INSERT INTO varchars VALUES ('hello'), ('hello' || chr(0)), ('hello' || chr(0) || chr(0)), ('hello' || chr(0) || chr(0) || chr(0));
statement error
INSERT INTO varchars VALUES ('hello' || chr(0) || chr(0) || chr(0));
----
Duplicate key
query I
SELECT * FROM varchars WHERE v = 'hello'
----
hello
query I
SELECT * FROM varchars WHERE v = 'hello' || chr(0)
----
hello\0
query I
SELECT * FROM varchars WHERE v = 'hello' || chr(0) || chr(0)
----
hello\0\0
query I
SELECT * FROM varchars WHERE v = 'hello' || chr(0) || chr(0) || chr(0)
----
hello\0\0\0
statement ok
CREATE TABLE blobs(b BLOB PRIMARY KEY);
statement ok
INSERT INTO blobs VALUES (''), ('\x00'), ('\x01'), ('\x00\x01'), ('\x01\x00'), ('\x01\x01'), ('\x00\x00');
statement error
INSERT INTO blobs VALUES ('\x00\x01');
----
Duplicate key
query I
SELECT * FROM blobs WHERE b = ''
----
(empty)
query I
SELECT * FROM blobs WHERE b = '\x00'
----
\x00
query I
SELECT * FROM blobs WHERE b = '\x00\x01'
----
\x00\x01
query I
SELECT * FROM blobs WHERE b >= '\x00' ORDER BY b::VARCHAR
----
\x00
\x00\x00
\x00\x01
\x01
\x01\x00
\x01\x01
query I
SELECT * FROM blobs WHERE b >= '\x01' ORDER BY b::VARCHAR
----
\x01
\x01\x00
\x01\x01
query I
SELECT * FROM blobs WHERE b >= '\x01\x00' ORDER BY b::VARCHAR
----
\x01\x00
\x01\x01

View File

@@ -0,0 +1,35 @@
# name: test/sql/index/art/scan/test_art_prepared_scan.test
# description: Test the usage of prepared statements for ART index scans
# group: [scan]
statement ok
CREATE TABLE integers(i INTEGER);
statement ok
INSERT INTO integers VALUES (1), (2), (4);
statement ok
CREATE INDEX i_index ON integers(i);
query II
EXPLAIN ANALYZE SELECT i FROM integers WHERE i = 2;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM integers WHERE i = 2;
----
2
statement ok
PREPARE v1 AS SELECT * FROM integers WHERE i = $1;
query II
EXPLAIN ANALYZE EXECUTE v1(2);
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
EXECUTE v1(2);
----
2

View File

@@ -0,0 +1,86 @@
# name: test/sql/index/art/scan/test_art_range_scan.test
# description: Test ART range scan
# group: [scan]
statement ok
CREATE TABLE test (x VARCHAR PRIMARY KEY);
statement ok
INSERT INTO test VALUES ('abc');
statement ok
INSERT INTO test VALUES ('def');
query I
SELECT * FROM test WHERE x > 'z';
----
statement ok
INSERT INTO test VALUES ('abcd');
query I
SELECT x FROM test WHERE x > 'abce';
----
def
statement ok
DROP TABLE test;
statement ok
CREATE TABLE test (x VARCHAR PRIMARY KEY);
statement ok
INSERT INTO test VALUES ('abcd'), ('abde');
query I
SELECT x FROM test WHERE x > 'abce';
----
abde
statement ok
DROP TABLE test;
statement ok
CREATE TABLE test (x USMALLINT PRIMARY KEY);
# node 48
statement ok
INSERT INTO test SELECT i FROM range(1, 20) tbl(i);
query I
SELECT x FROM test WHERE x > 20;
----
statement ok
INSERT INTO test VALUES (256);
query I
SELECT x FROM test WHERE x > 20;
----
256
statement ok
DROP TABLE test;
statement ok
CREATE TABLE test (x USMALLINT PRIMARY KEY);
# node 256
statement ok
INSERT INTO test SELECT i FROM range(1, 135) tbl(i);
query I
SELECT x FROM test WHERE x > 135;
----
statement ok
INSERT INTO test VALUES (256), (257);
query I
SELECT x FROM test WHERE x > 135;
----
256
257
statement ok
DROP TABLE test;

View File

@@ -0,0 +1,124 @@
# name: test/sql/index/art/scan/test_art_scan_coverage.test
# description: Test edge cases during index scans
# group: [scan]
statement ok
CREATE TABLE tab0(pk INTEGER PRIMARY KEY, col0 INTEGER, col1 FLOAT, col2 TEXT, col3 INTEGER, col4 FLOAT, col5 TEXT)
statement ok
INSERT INTO tab0 VALUES(0,25,74.4,'vvcgn',47,57.68,'ymlye')
statement ok
INSERT INTO tab0 VALUES(1,72,81.64,'zsnbm',42,74.55,'tzagd')
statement ok
INSERT INTO tab0 VALUES(2,45,38.39,'dmsso',87,29.20,'ywydk')
statement ok
INSERT INTO tab0 VALUES(3,81,97.79,'tdbjm',48,89.67,'hvaol')
statement ok
INSERT INTO tab0 VALUES(4,17,18.5,'ddcya',66,87.1,'ndulx')
statement ok
INSERT INTO tab0 VALUES(5,46,83.75,'khqpe',31,31.98,'hzpio')
statement ok
INSERT INTO tab0 VALUES(6,85,8.45,'ugwie',30,22.61,'klsxt')
statement ok
INSERT INTO tab0 VALUES(7,36,54.34,'pflrv',18,61.89,'vrltg')
statement ok
INSERT INTO tab0 VALUES(8,47,41.84,'plpkl',76,65.31,'yzivj')
statement ok
INSERT INTO tab0 VALUES(9,76,63.21,'uakya',80,80.58,'ocfgj')
statement ok
CREATE TABLE tab1(pk INTEGER PRIMARY KEY, col0 INTEGER, col1 FLOAT, col2 TEXT, col3 INTEGER, col4 FLOAT, col5 TEXT)
statement ok
CREATE INDEX idx_tab1_0 on tab1 (col0)
statement ok
CREATE INDEX idx_tab1_1 on tab1 (col1)
statement ok
CREATE INDEX idx_tab1_3 on tab1 (col3)
statement ok
CREATE INDEX idx_tab1_4 on tab1 (col4)
statement ok
INSERT INTO tab1 SELECT * FROM tab0
statement ok
DELETE FROM tab1 WHERE col3 = 54 AND col1 <= 76.83
query I rowsort label-empty
SELECT pk FROM tab1 WHERE col3 = 54 AND col1 <= 76.83
----
query I rowsort label-225
SELECT pk FROM tab1 WHERE NOT (col3 = 54 AND col1 <= 76.83)
----
10 values hashing to e20b902b49a98b1a05ed62804c757f94
statement ok
DELETE FROM tab1 WHERE (col4 > 71.47) OR col0 IN (98,26,25,60)
query I rowsort label-empty
SELECT pk FROM tab1 WHERE (col4 > 71.47) OR col0 IN (98,26,25,60)
----
query I rowsort label-240
SELECT pk FROM tab1 WHERE NOT ((col4 > 71.47) OR col0 IN (98,26,25,60))
----
2
5
6
7
8
statement ok
DELETE FROM tab1 WHERE ((col0 > 32) AND col0 < 87)
query I rowsort label-empty
SELECT pk FROM tab1 WHERE ((col0 > 32) AND col0 < 87)
----
# Issue #13785
statement ok
CREATE TABLE t0_varchar(c0 VARCHAR);
statement ok
INSERT INTO t0_varchar(c0) VALUES ('a'), ('a');
statement ok
CREATE INDEX t0i0_idx ON t0_varchar(c0 );
query I
SELECT c0 FROM t0_varchar WHERE t0_varchar.c0 <= 'a';
----
a
a
# Issue #13842
statement ok
CREATE TABLE t0_scan(c0 DATE);
statement ok
INSERT INTO t0_scan(c0) VALUES ('1970-01-02'), ('1970-01-02'), ('1970-01-03');
statement ok
CREATE INDEX t0i0 ON t0_scan(c0 DESC);
query I
SELECT c0 FROM t0_scan WHERE '1970-01-03' >= t0_scan.c0 ORDER BY c0;
----
1970-01-02
1970-01-02
1970-01-03

View File

@@ -0,0 +1,58 @@
# name: test/sql/index/art/scan/test_art_scan_duplicate_filters.test
# description: Test index scans with duplicate filters.
# group: [scan]
statement ok
CREATE TABLE t_1 (fIdx VARCHAR, sIdx UUID,);
statement ok
CREATE TABLE t_3 (fIdx VARCHAR, sIdx UUID);
statement ok
CREATE TABLE t_4 (sIdx UUID);
statement ok
CREATE TABLE t_5 (sIdx UUID);
statement ok
CREATE UNIQUE INDEX _pk_idx_t_5 ON t_5 (sIdx);
statement ok
INSERT INTO t_4 (sIdx) VALUES
('1381e0ce-6b3e-43f5-9536-5e7af3a512a5'::UUID),
('6880cdba-09f5-3c4f-8eb8-391aefdd8052'::UUID),
('a3e876dd-5e50-3af7-9649-689fd938daeb'::UUID),
('e0abc0d3-63be-41d8-99ca-b1269ed153a8'::UUID);
statement ok
INSERT INTO t_5 (sIdx) VALUES
('a3e876dd-5e50-3af7-9649-689fd938daeb'::UUID),
('e0abc0d3-63be-41d8-99ca-b1269ed153a8'::UUID),
('91c79790-5828-45f2-ad88-50e9b541cc05'::UUID),
('1381e0ce-6b3e-43f5-9536-5e7af3a512a5'::UUID),
('d9f29fa5-2051-3ea4-9d9e-15c3698b4bb8'::UUID),
('6880cdba-09f5-3c4f-8eb8-391aefdd8052'::UUID),
('3239280c-2204-3e60-b3a1-3ad3acc8fd59'::UUID),
('2fced822-342d-344a-aa34-2707e593be52'::UUID);
query I
WITH
cte_5 AS (
SELECT sIdx FROM t_4 ANTI JOIN t_3 USING (sIdx)
),
cte_6 AS MATERIALIZED (
SELECT
COALESCE(cte_5.sIdx, t_1.sIdx) AS sIdx,
COALESCE(t_1.fIdx, cte_5.sIdx::VARCHAR) AS fIdx,
FROM cte_5 FULL JOIN t_1 USING (sIdx)
),
cte_7 AS (
SELECT t_5.sIdx, FROM t_5
WHERE sIdx IN (SELECT sIdx FROM cte_6)
)
SELECT fIdx, FROM cte_6 JOIN cte_7 USING (sIdx) ORDER BY fIdx;
----
1381e0ce-6b3e-43f5-9536-5e7af3a512a5
6880cdba-09f5-3c4f-8eb8-391aefdd8052
a3e876dd-5e50-3af7-9649-689fd938daeb
e0abc0d3-63be-41d8-99ca-b1269ed153a8

View File

@@ -0,0 +1,35 @@
# name: test/sql/index/art/scan/test_art_scan_normal_to_nested.test
# description: Test range scanning with an iterator moving from a normal leaf to a nested leaf.
# group: [scan]
statement ok
CREATE TABLE integers (i BIGINT);
statement ok
CREATE INDEX idx_integers ON integers (i);
statement ok
INSERT INTO integers (i) VALUES ('1'), ('-1'), ('1');
# The border is exactly when moving from a non-nested leaf to a nested leaf.
query I
SELECT i FROM integers WHERE i <= 0;
----
-1
# Issue 16074.
statement ok
CREATE TABLE t0(c1 TIMESTAMP);
statement ok
INSERT INTO t0(c1) VALUES ('2020-02-29 12:00:00'), ('1969-12-09 09:26:38'), ('2020-02-29 12:00:00');
statement ok
CREATE INDEX i0 ON t0(c1);
query I
SELECT c1 FROM t0 WHERE c1 <= '2007-07-07 07:07:07';
----
1969-12-09 09:26:38

View File

@@ -0,0 +1,51 @@
# name: test/sql/index/art/scan/test_art_scan_thresholds.test
# description: Test setting different index scan thresholds.
# group: [scan]
# Take the maximum of the absolute count and the percentage, which is 100%.
statement ok
SET index_scan_max_count = 1;
statement ok
SET index_scan_percentage = 1.0;
statement ok
CREATE TABLE integers(i INTEGER);
statement ok
INSERT INTO integers SELECT 42 FROM range(1000);
statement ok
INSERT INTO integers SELECT 43 FROM range(10000);
statement ok
CREATE INDEX idx ON integers(i);
query II
EXPLAIN ANALYZE SELECT i FROM integers WHERE i = 42;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
statement ok
SET index_scan_percentage = 0.000001;
# Use one as the maximum count, with the matching keys exceeding that maximum.
query II
EXPLAIN ANALYZE SELECT i FROM integers WHERE i = 42;
----
analyzed_plan <REGEX>:.*Type: Sequential Scan.*
# Let's also test more than STANDARD_VECTOR_SIZE values.
statement ok
SET index_scan_max_count = 4000;
statement ok
INSERT INTO integers SELECT 4242 FROM range(4000);
query II
EXPLAIN ANALYZE SELECT i FROM integers WHERE i = 4242;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*

View File

@@ -0,0 +1,44 @@
# name: test/sql/index/art/scan/test_hash_join_in_filter_index_scan.test
# description: Test using an index scan for IN filter pushdown via hash joins.
# group: [scan]
require tpch
statement ok
CALL dbgen(sf=0.01);
statement ok
CREATE TABLE random_orders AS (
(SELECT o_orderkey FROM orders
OFFSET 100
LIMIT 3)
UNION
(SELECT o_orderkey FROM orders
OFFSET (SELECT COUNT(*) FROM orders) / 2
LIMIT 3)
UNION
(SELECT o_orderkey FROM orders
OFFSET (SELECT COUNT(*) FROM orders) / 2 + 100000
LIMIT 3));
statement ok
CREATE TABLE orders_shuffled AS FROM orders ORDER BY random();
query II
EXPLAIN ANALYZE
SELECT o_orderkey FROM orders_shuffled WHERE o_orderkey IN (
SELECT UNNEST(LIST(o_orderkey)) FROM random_orders
) ORDER BY ALL;
----
analyzed_plan <REGEX>:.*Type: Sequential Scan.*
statement ok
ALTER TABLE orders_shuffled ADD PRIMARY KEY (o_orderkey);
query II
EXPLAIN ANALYZE
SELECT o_orderkey FROM orders_shuffled WHERE o_orderkey IN (
SELECT UNNEST(LIST(o_orderkey)) FROM random_orders
) ORDER BY ALL;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*

View File

@@ -0,0 +1,91 @@
# name: test/sql/index/art/scan/test_in_filter_index_scan.test
# description: Test using an index scan for IN filter pushdown.
# group: [scan]
statement ok
CREATE TABLE tbl AS SELECT range AS i FROM range(500000);
statement ok
ALTER TABLE tbl ADD PRIMARY KEY(i);
query II
EXPLAIN ANALYZE DELETE FROM tbl WHERE i IN (3, 50, 299, 123);
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT COUNT(*) FROM tbl;
----
499996
# Test with duplicate values.
query II
EXPLAIN ANALYZE SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101);
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) ORDER BY i;
----
2
42
100
101
# Test with different CONJUNCTION_AND removing values from the IN.
query II
EXPLAIN ANALYZE SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i != 42 AND i <= 100;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i != 42 AND i <= 100 ORDER BY i;
----
2
100
query II
EXPLAIN ANALYZE SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i = 42 AND i <= 100;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i = 42 AND i <= 100 ORDER BY i;
----
42
query II
EXPLAIN ANALYZE SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i < 101 AND i >= 42;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i < 101 AND i >= 42 ORDER BY i;
----
42
100
query II
EXPLAIN ANALYZE SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i > 42 AND i >= 42;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i > 42 AND i >= 42 ORDER BY i;
----
100
101
# Test with multiple IN filters.
query II
EXPLAIN ANALYZE SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i > 42 AND i IN (56, 200, 2, 100);
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query I
SELECT i FROM tbl WHERE i IN (2, 42, 100, 42, 101) AND i > 42 AND i IN (56, 200, 2, 100) ORDER BY i;
----
100