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,219 @@
# name: test/sql/aggregate/qualify/test_qualify.test
# description: Test QUALIFY clause
# group: [qualify]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (a INTEGER, b INTEGER);
statement ok
INSERT INTO test VALUES (11, 22), (13, 22), (12, 21)
statement ok
CREATE TABLE qt (a INTEGER, b CHAR(1), c INTEGER);
statement ok
INSERT INTO qt VALUES (1, 'A', 1), (2, 'A', 2), (3, 'B', 1), (4, 'B', 2)
# basic test
query ITI
SELECT * from qt QUALIFY row_number() over (PARTITION BY b ORDER BY c) = 1 ORDER BY b
----
1 A 1
3 B 1
query ITII
SELECT a, b, c, row_number() over (PARTITION BY b ORDER BY c) as row_num FROM qt QUALIFY row_num = 1 ORDER BY b
----
1 A 1 1
3 B 1 1
statement ok
CREATE TABLE exam (student TEXT, subject TEXT, mark INTEGER);
statement ok
INSERT INTO exam VALUES
('Lily', 'Maths', 65),
('Lily', 'Science', 80),
('Lily', 'english', 70),
('Isabella', 'Maths', 50),
('Isabella', 'Science', 70),
('Isabella', 'english', 90),
('Olivia', 'Maths', 55),
('Olivia', 'Science', 60),
('Olivia', 'english', 89);
query TTI
SELECT * FROM exam QUALIFY rank() OVER (ORDER BY mark desc) = 4
----
Lily english 70
Isabella Science 70
query TTI
SELECT * FROM exam QUALIFY rank() OVER (PARTITION BY student ORDER BY mark DESC) = 2 ORDER BY student
----
Isabella Science 70
Lily english 70
Olivia Science 60
query TTI
SELECT * FROM exam WINDOW w AS (ORDER BY mark) QUALIFY row_number() OVER w >= 1 AND (rank() OVER w) <= 2 ORDER BY student
----
Isabella Maths 50
Olivia Maths 55
query TTI
SELECT * FROM exam QUALIFY first_value(mark) OVER (PARTITION BY student ORDER BY mark) >= 60 order by mark
----
Lily Maths 65
Lily english 70
Lily Science 80
query TTI
SELECT * FROM exam QUALIFY last_value(mark) OVER (PARTITION BY student ORDER BY mark) >= 85 order by mark
----
Olivia english 89
Isabella english 90
statement ok
CREATE TABLE power (plant TEXT, date DATE, mwh INTEGER);
statement ok
INSERT INTO power VALUES
('Boston', '2019-01-02', 564337),
('Boston', '2019-01-03', 507405),
('Boston', '2019-01-04', 528523),
('Boston', '2019-01-05', 469538),
('Boston', '2019-01-06', 474163),
('Boston', '2019-01-07', 507213),
('Boston', '2019-01-08', 613040),
('Boston', '2019-01-09', 582588),
('Boston', '2019-01-10', 499506),
('Boston', '2019-01-11', 482014),
('Boston', '2019-01-12', 486134),
('Boston', '2019-01-13', 531518),
('Worcester', '2019-01-02', 118860),
('Worcester', '2019-01-03', 101977),
('Worcester', '2019-01-04', 106054),
('Worcester', '2019-01-05', 92182),
('Worcester', '2019-01-06', 94492),
('Worcester', '2019-01-07', 99932),
('Worcester', '2019-01-08', 118854),
('Worcester', '2019-01-09', 113506),
('Worcester', '2019-01-10', 96644),
('Worcester', '2019-01-11', 93806),
('Worcester', '2019-01-12', 98963),
('Worcester', '2019-01-13', 107170);
# qualify with ORDER
query TTI
SELECT * FROM power QUALIFY rank() OVER (PARTITION BY plant ORDER BY date DESC) = 2 ORDER BY plant
----
Boston 2019-01-12 486134
Worcester 2019-01-12 98963
query TTR
SELECT * FROM (SELECT plant, date, avg(mwh) OVER (PARTITION BY plant ORDER BY date ASC RANGE BETWEEN INTERVAL 3 DAYS PRECEDING AND INTERVAL 3 DAYS FOLLOWING) AS avgmwh FROM power
ORDER BY plant, avgmwh DESC) QUALIFY row_number() OVER (PARTITION BY plant ORDER BY avgmwh DESC) = 1 ORDER BY plant
----
Boston 2019-01-11 532466.666667
Worcester 2019-01-11 104823.833333
# QUALIFY with condition on ALIAS
query II
SELECT b, SUM(a) AS sum FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) >= 1 AND sum < 20 ORDER BY b;
----
21 12
# expression in qualify
statement ok
SELECT b, SUM(a) AS sum FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) > sum * 10;
query ITI
SELECT * FROM qt QUALIFY row_number() OVER (PARTITION BY b ORDER BY c) = (SELECT max(c) FROM qt) ORDER BY b;
----
2 A 2
4 B 2
statement ok
CREATE TABLE tenk1 (unique1 int4, unique2 int4, two int4, four int4, ten int4, twenty int4, hundred int4, thousand int4, twothousand int4, fivethous int4, tenthous int4, odd int4, even int4, stringu1 varchar, stringu2 varchar, string4 varchar)
statement ok
insert into tenk1 values (8800,0,0,0,0,0,0,800,800,3800,8800,0,1,'MAAAAA','AAAAAA','AAAAxx'), (1891,1,1,3,1,11,91,891,1891,1891,1891,182,183,'TUAAAA','BAAAAA','HHHHxx'), (3420,2,0,0,0,0,20,420,1420,3420,3420,40,41,'OBAAAA','CAAAAA','OOOOxx'), (9850,3,0,2,0,10,50,850,1850,4850,9850,100,101,'WOAAAA','DAAAAA','VVVVxx'), (7164,4,0,0,4,4,64,164,1164,2164,7164,128,129,'OPAAAA','EAAAAA','AAAAxx'), (8009,5,1,1,9,9,9,9,9,3009,8009,18,19,'BWAAAA','FAAAAA','HHHHxx'), (5057,6,1,1,7,17,57,57,1057,57,5057,114,115,'NMAAAA','GAAAAA','OOOOxx'), (6701,7,1,1,1,1,1,701,701,1701,6701,2,3,'TXAAAA','HAAAAA','VVVVxx'), (4321,8,1,1,1,1,21,321,321,4321,4321,42,43,'FKAAAA','IAAAAA','AAAAxx'), (3043,9,1,3,3,3,43,43,1043,3043,3043,86,87,'BNAAAA','JAAAAA','HHHHxx')
# cume_dist
query I
SELECT unique1 FROM tenk1 QUALIFY cast(cume_dist() OVER (PARTITION BY four ORDER BY ten)*10 as integer) = 5 order by four, ten
----
6701
4321
1891
# first_value
query I
SELECT unique1 FROM tenk1 QUALIFY first_value(ten) OVER (PARTITION BY four ORDER BY ten) = 1 order by four, ten
----
6701
4321
5057
8009
1891
3043
# lead
query I
SELECT unique1 FROM tenk1 qualify lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten) = -1 order by four, ten
----
7164
8009
9850
3043
# using in subquery
query I
SELECT *
FROM (
SELECT b FROM test as t
GROUP BY b
QUALIFY rank() OVER (PARTITION BY t.b) = 1
)
QUALIFY row_number() OVER (PARTITION BY b) = 1
ORDER BY 1
----
21
22
query II
SELECT * FROM test QUALIFY row_number() OVER (PARTITION BY test.b) = (SELECT max(a) FROM qt GROUP BY qt.b QUALIFY rank() OVER (PARTITION BY qt.b) = 1 order by qt.b limit 1)
----
13 22
# in the order of WINDOW clause
statement ok
SELECT * FROM exam WINDOW w AS (ORDER BY mark) QUALIFY row_number() OVER w = 1
# must appear WINDOW clause before QUALIFY clause
statement error
SELECT * FROM exam QUALIFY row_number() OVER w = 1 WINDOW w AS (ORDER BY mark)
----
Parser Error: syntax error at or near "WINDOW"
# QUALIFY clause requires at least one window function to be specified in at least one of the SELECT column list or the filter predicate of the QUALIFY clause
statement error
SELECT b, avg(a) AS avga FROM test GROUP BY b QUALIFY avga > 10
----
Binder Error: at least one window function must appear in the SELECT
# invalid window function
statement error
SELECT b FROM test QUALIFY avga() > 10
----
Catalog Error: Scalar Function with name avga does not exist
# column not found in from clause and can't find in alias map
statement error
SELECT b, SUM(a) FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) > sum;
----
Binder Error: Referenced column sum not found in FROM clause

View File

@@ -0,0 +1,52 @@
# name: test/sql/aggregate/qualify/test_qualify_macro.test
# description: Test QUALIFY clause in the subquery of a macro function
# group: [qualify]
# load the DB from disk
load __TEST_DIR__/macro_storage.db
statement ok
PRAGMA disable_checkpoint_on_shutdown
statement ok
PRAGMA wal_autocheckpoint='1TB';
statement ok
CREATE TABLE test (a INTEGER, b INTEGER);
statement ok
INSERT INTO test VALUES (11, 22), (13, 22), (12, 21)
# create a macro
statement ok
CREATE MACRO plus1(x) AS (x + (SELECT COUNT(*) FROM (SELECT b, SUM(test.a) FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) = 1)))
# use the macro
query T
SELECT plus1(3)
----
5
loop i 0 2
# restart the system
restart
query T
SELECT plus1(5)
----
7
# drop the macro again
statement ok
DROP MACRO plus1
statement error
SELECT plus1(2)
----
# after recreating the macro we can use it again
statement ok
CREATE MACRO plus1(x) AS (x + (SELECT COUNT(*) FROM (SELECT b, SUM(test.a) FROM test GROUP BY b QUALIFY row_number() OVER (PARTITION BY b) = 1)))
endloop

View File

@@ -0,0 +1,86 @@
# name: test/sql/aggregate/qualify/test_qualify_view.test
# description: Test QUALIFY clause in a view over different runs
# group: [qualify]
require skip_reload
# load the DB from disk
load __TEST_DIR__/view_storage.db
statement ok
set enable_view_dependencies=true
statement ok
PRAGMA disable_checkpoint_on_shutdown
statement ok
PRAGMA wal_autocheckpoint='1TB';
# create a schema and view
statement ok
CREATE SCHEMA test;
statement ok
CREATE TABLE test.t (a INTEGER, b INTEGER);
statement ok
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
statement ok
CREATE VIEW test.v AS SELECT * FROM test.t QUALIFY row_number() OVER (PARTITION BY b) = 1;
query II
SELECT b, SUM(a)
FROM test.v
GROUP BY b
QUALIFY row_number() OVER (PARTITION BY b) = 1
ORDER BY ALL
----
21 12
22 11
# drop the table the view is based on
statement error
DROP TABLE test.t
----
view "v" depends on table "t".
statement ok
DROP TABLE test.t CASCADE;
loop i 0 2
# restart the system
restart
# we first need to recreate both the table and the view before we can query it again
statement ok
CREATE TABLE test.t (a INTEGER, b INTEGER);
statement ok
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
statement ok
CREATE VIEW test.v AS SELECT * FROM test.t QUALIFY row_number() OVER (PARTITION BY b) = 1;
query II
SELECT b, SUM(a)
FROM test.v
GROUP BY b
QUALIFY row_number() OVER (PARTITION BY b) = 1
ORDER BY ALL
----
21 12
22 11
# drop the table again
statement ok
DROP TABLE test.t CASCADE;
# dropping the table also caused the view to be dropped
statement error
SELECT * FROM test.v
----
Catalog Error: Table with name v does not exist!
endloop

View File

@@ -0,0 +1,71 @@
# name: test/sql/aggregate/qualify/test_qualify_view_no_view_dependencies.test
# description: Test QUALIFY clause in a view over different runs
# group: [qualify]
# load the DB from disk
load __TEST_DIR__/view_storage.db
statement ok
PRAGMA disable_checkpoint_on_shutdown
statement ok
PRAGMA wal_autocheckpoint='1TB';
# create a schema and view
statement ok
CREATE SCHEMA test;
statement ok
CREATE TABLE test.t (a INTEGER, b INTEGER);
statement ok
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
statement ok
CREATE VIEW test.v AS SELECT * FROM test.t QUALIFY row_number() OVER (PARTITION BY b) = 1;
query II
SELECT b, SUM(a)
FROM test.v
GROUP BY b
QUALIFY row_number() OVER (PARTITION BY b) = 1
ORDER BY ALL
----
21 12
22 11
# drop the table the view is based on
statement ok
DROP TABLE test.t
loop i 0 2
# restart the system
restart
# after recreating the table, we can query the view again
statement ok
CREATE TABLE test.t (a INTEGER, b INTEGER);
statement ok
INSERT INTO test.t VALUES (11, 22), (13, 22), (12, 21)
query II
SELECT b, SUM(a)
FROM test.v
GROUP BY b
QUALIFY row_number() OVER (PARTITION BY b) = 1
ORDER BY ALL
----
21 12
22 11
# drop the table again
statement ok
DROP TABLE test.t
statement error
SELECT * FROM test.v
----
endloop