mysql-server/mysql-test/t/qualify_hypergraph.test
2025-03-05 14:31:37 +07:00

389 lines
9.6 KiB
Text

# Run with hypergraph optimizer
--source include/have_hypergraph.inc
CREATE TABLE t1 (
a int NOT NULL,
b int NOT NULL,
c double NOT NULL
);
INSERT INTO t1 VALUES (1,1,5),(1,1,2),(1,2,5),(2,1,4),(2,1,1),(2,2,2),(2,2,3),
(2,3,1),(2,3,1),(3,3,3),(3,3,5),(3,4,5),(4,4,5),(4,4,3),(5,3,1);
ANALYZE TABLE t1;
--sorted_result
SELECT a, b, c, ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,c) AS rnk
FROM t1 QUALIFY rnk>1;
--sorted_result
SELECT a, b, c
FROM t1 QUALIFY ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,c)>1;
--sorted_result
--error ER_SUBQUERY_NO_1_ROW
SELECT a, b, c
FROM t1
QUALIFY ROW_NUMBER() OVER () >
(SELECT MIN(c) FROM t1 GROUP BY a HAVING MAX(c) > 3);
--sorted_result
SELECT a, b, c
FROM t1
QUALIFY (MIN(a) OVER () + RANK() OVER () ) > 5;
--sorted_result
SELECT a, b, c,
MIN(b) OVER (PARTITION BY b ORDER BY a DESC,b ASC,c DESC) AS mn
FROM t1
QUALIFY ( RANK() OVER () + mn) >5;
--sorted_result
SELECT a, b, c,
MIN(b) OVER (PARTITION BY b ORDER BY a DESC,b ASC,c DESC) AS mn,
RANK() OVER (PARTITION BY b ORDER BY a DESC,b ASC,c DESC) AS rnk
FROM t1
QUALIFY ( rnk + mn) >5;
--sorted_result
SELECT a, b,
MIN(b) OVER (PARTITION BY b ORDER BY a DESC,b ASC,c DESC) AS mn,
RANK() OVER (PARTITION BY b ORDER BY a DESC,b ASC,c DESC) AS rnk
FROM t1
QUALIFY ROW_NUMBER() OVER (PARTITION BY a ORDER BY b)>1;
--sorted_result
SELECT
a, b, ( SELECT sum(rnk)
FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,c) AS rnk
FROM t1 qualify rnk > t0.a
) as z
)
FROM (values row(1,10), row(2,20)) as t0(a,b);
--echo ##
--echo ## Syntax checks
--echo ##
--sorted_result
SELECT b
FROM t1
QUALIFY ROW_NUMBER() OVER (PARTITION BY a ORDER BY a)>1;
--sorted_result
SELECT b
FROM t1
QUALIFY ROW_NUMBER() OVER ()>1 and 2*b>2;
--sorted_result
SELECT b
FROM t1
QUALIFY ROW_NUMBER() OVER (PARTITION BY a ORDER BY a)>1 and c>2;
--sorted_result
SELECT b
FROM t1
QUALIFY ROW_NUMBER() OVER (PARTITION BY a ORDER BY a)>1 and a>2;
--sorted_result
SELECT a, b, c, ROW_NUMBER() OVER () AS rnk
FROM t1
QUALIFY 2*rnk>1;
--sorted_result
SELECT a, b, c, ROW_NUMBER() OVER () AS rnk
FROM t1
QUALIFY a+rnk>5;
## Aggregate over window functions is not supported
--error ER_WINDOW_INVALID_WINDOW_FUNC_USE
SELECT a, b, c
FROM t1
QUALIFY AVG(ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,c))>1;
--error ER_QUALIFY_WITHOUT_WINDOW_FUNCTION
SELECT a FROM t1 QUALIFY b> 10;
--sorted_result
SELECT a, b, ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b) AS rnk
FROM t1
QUALIFY c>1;
--sorted_result
SELECT a, b, ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b) AS rnk
FROM t1
QUALIFY 2*a>1;
--sorted_result
SELECT a
FROM t1
QUALIFY ROW_NUMBER() OVER (PARTITION BY a) + b > 0;
--sorted_result
SELECT a, b, ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,c) AS rnk
FROM t1
QUALIFY rnk>1 and c>2;
--error ER_WRONG_FIELD_WITH_GROUP
SELECT MAX(a)
FROM t1 GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER () + RANK() OVER () ) > 5;
--error ER_WRONG_FIELD_WITH_GROUP
SELECT MAX(a)
FROM t1 GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER () + RANK() OVER () ) >= 2;
--sorted_result
SELECT MAX(a) FROM t1
GROUP BY b, 2*c WITH ROLLUP
HAVING AVG(c)>1
QUALIFY MIN(2*b) OVER () + RANK() OVER () > 3;
--sorted_result
SELECT 1 FROM t1
GROUP BY b, 2*c WITH ROLLUP
HAVING AVG(c)>1
QUALIFY MIN(2*b) OVER () + RANK() OVER () + MAX(a) > 4;
--sorted_result
SELECT MAX(b) FROM t1
GROUP BY b, 2*c WITH ROLLUP
HAVING AVG(c)>1
QUALIFY MIN(2*b) OVER () + RANK() OVER () + MAX(a) > 4;
--error ER_WRONG_FIELD_WITH_GROUP
SELECT MAX(a) FROM t1
GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER ()) > 1;
--error ER_WRONG_FIELD_WITH_GROUP
SELECT MAX(a)
FROM t1
GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER () + RANK() OVER () ) > 5;
SET @orig_sql_mode = @@sql_mode;
SET @@sql_mode = '';
--sorted_result
SELECT MAX(a)
FROM t1 GROUP BY b WITH ROLLUP
QUALIFY (MIN(c) OVER () + RANK() OVER () ) >= 2;
--sorted_result
SELECT MAX(a)
FROM t1 GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER () + RANK() OVER () ) >= 2;
--sorted_result
SELECT MAX(a)
FROM t1 GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER () + RANK() OVER () ) > 5;
--sorted_result
SELECT MAX(a) FROM t1
GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER ()) > 1;
--sorted_result
SELECT MAX(a)
FROM t1
GROUP BY b,c WITH ROLLUP
QUALIFY (MIN(a) OVER () + RANK() OVER () ) > 5;
--sorted_result
SELECT a FROM t1 GROUP BY b, 2*c WITH ROLLUP
HAVING AVG(c)>1
QUALIFY ROW_NUMBER() OVER () + MAX(a) > 4;
--sorted_result
SELECT a FROM t1
GROUP BY b, 2*c WITH ROLLUP
QUALIFY LEAD(c,2) OVER () > 4;
--sorted_result
SELECT a FROM t1
GROUP BY b, 2*c WITH ROLLUP
QUALIFY LAG(c,6) OVER () > 4;
--sorted_result
SELECT b,c, MAX(a)
FROM t1 GROUP BY b,c WITH ROLLUP
QUALIFY LEAD(b) OVER(ORDER BY a,b,c) >1 AND b IS NULL;
SET @@sql_mode = @orig_sql_mode;
DROP TABLE t1;
--echo #
--echo # Bug 35800175 - #wl15864-Query does not gets offloaded when QUALIFY does not use alias name
--echo #
CREATE TABLE sales (salesperson_id INT, sale_amount DECIMAL(10, 2));
INSERT INTO sales (salesperson_id, sale_amount)
VALUES (1, 100.00), (2, 200.00), (1, 150.00),
(3, 300.00),(2, 120.00), (3, 250.00);
ANALYZE TABLE sales;
--sorted_result
SELECT RANK() OVER () AS sales_rank
FROM sales QUALIFY SUM(sale_amount) > 300;
--echo #
--echo # Qualify with VIEW
--echo #
CREATE VIEW v1 as
SELECT salesperson_id, SUM(sale_amount) AS total_sales,
RANK() OVER (ORDER BY SUM(sale_amount) DESC) AS sales_rank
FROM sales GROUP BY salesperson_id
QUALIFY SUM(sale_amount) > 3000;
SHOW CREATE VIEW v1;
--sorted_result
SELECT * FROM v1;
SET @start_value_optimizer_switch = @@optimizer_switch;
SET optimizer_switch="hypergraph_optimizer=off";
SHOW CREATE VIEW v1;
--sorted_result
--error ER_SUPPORTED_ONLY_WITH_HYPERGRAPH
SELECT * FROM v1;
CREATE VIEW v2 as
SELECT SUM(sale_amount) AS total_sales,
RANK() OVER (ORDER BY SUM(sale_amount) DESC) AS sales_rank
FROM sales GROUP BY salesperson_id
QUALIFY SUM(sale_amount) > 3000;
SHOW CREATE VIEW v2;
--error ER_SUPPORTED_ONLY_WITH_HYPERGRAPH
SELECT * FROM v2;
SET @@optimizer_switch = @start_value_optimizer_switch;
SHOW CREATE VIEW v2;
--sorted_result
SELECT * FROM v2;
DROP VIEW v1, v2;
DROP TABLE sales;
--echo #
--echo # Bug 35809648 - #wl15864-Mysqld Crash-Assertion-Item_func::contributes_to_filter
--echo #
CREATE TABLE t1 (pk INT);
CREATE TABLE t2 (pk INT, col_decimal_10_8 DECIMAL(10,8));
ANALYZE TABLE t1, t2;
SET @start_value_optimizer_switch = @@optimizer_switch;
SET optimizer_switch="subquery_to_derived=on,hypergraph_optimizer=on";
--sorted_result
SELECT RANK() OVER () AS field3
FROM t1
WHERE ( SELECT MAX( t2.col_decimal_10_8 ) AS derived_1
FROM t2) IS NOT NULL
QUALIFY field3 <=> 'a';
SET @@optimizer_switch = @start_value_optimizer_switch;
DROP TABLE t1, t2;
--echo #
--echo # Bug 35826727 - #wl15864-Mysqld-crash-Segmentation Fault- Item_ref::fix_fields
--echo #
CREATE TABLE t1 (col_varchar137 VARCHAR(137), col_float FLOAT);
CREATE TABLE t2 (pk INT);
ANALYZE TABLE t1, t2;
--error ER_QUALIFY_WITHOUT_WINDOW_FUNCTION
SELECT t1.col_varchar137 AS field1
FROM t1, LATERAL ( SELECT t1.col_float AS field2 FROM t2 ) AS table6
QUALIFY field2 != 'USA';
DROP TABLE t1, t2;
--echo #
--echo # Bug 35831314 - #wl15864-Mysqld Crash-Assertion-Item_func::contributes_to_filter
--echo #
CREATE TABLE t1 (pk INT, col_float_key FLOAT );
CREATE TABLE t2 (col_varchar132 VARCHAR(132), col_timestamp_key TIMESTAMP);
ANALYZE TABLE t1, t2;
--sorted_result
SELECT CUME_DIST() OVER () AS field1
FROM t1
WHERE
EXISTS ( SELECT LEAST(t2.col_varchar132, t2.col_timestamp_key) AS SQ1_field1
FROM t2
)
AND ( FLOOR(ATAN(t1.col_float_key) ) IS NULL )
QUALIFY field1 = 'V' COLLATE utf8mb4_icelandic_ci;
DROP TABLE t1, t2;
--echo #
--echo # Bug 35846292 - #wl15864-Mysqld Crash-Item_func::contributes_to_filter
--echo #
CREATE TABLE cc (col_time TIME, col_year YEAR, col_double_key DOUBLE,
col_char_255 CHAR(255));
ANALYZE TABLE cc;
SET @orig_sql_mode = @@sql_mode;
SET @@sql_mode = '';
SELECT SUM( col_time + CAST(col_year AS FLOAT) ) AS field1,
ROW_NUMBER() OVER () AS field2
FROM cc
WHERE (12, 'H') IN ( SELECT
DENSE_RANK() OVER ( ORDER BY col_double_key ),
FIRST_VALUE(col_char_255)
OVER ( ROWS BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING )
FROM cc )
QUALIFY field1 <=> 'M';
SET @@sql_mode = @orig_sql_mode;
DROP TABLE cc;
--echo #
--echo # Bug#36172350: Wrong result with QUALIFY referencing columns not present
--echo # in the SELECT list
--echo #
CREATE TABLE t(id INT PRIMARY KEY, x INT, b BLOB);
INSERT INTO t(id, x) VALUES (1,1),(2,1),(3,1),(4,1),(5,0);
SELECT id, b FROM t GROUP BY id WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
SELECT id, b, ROW_NUMBER() OVER w FROM t
GROUP BY id WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
SELECT id, b, ROW_NUMBER() OVER w FROM t
WINDOW w AS (ORDER BY id) QUALIFY x + SUM(x) OVER w <> 4;
SELECT id, x, ROW_NUMBER() OVER w FROM t GROUP BY id, x
WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
SELECT id, x, ROW_NUMBER() OVER w FROM t GROUP BY id, x WITH ROLLUP
WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
SELECT id FROM t GROUP BY id, x WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
SELECT id, x, ROW_NUMBER() OVER w FROM (SELECT * FROM t) AS dt
GROUP BY id, x WITH ROLLUP WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
SELECT id, ROW_NUMBER() OVER w FROM (SELECT * FROM t) AS dt
GROUP BY id, x WITH ROLLUP WINDOW w AS (ORDER BY id) QUALIFY x <> 1;
DROP TABLE t;
--echo #
--echo # Bug#36313072: mysqld crash in Item_ref::real_item
--echo #
CREATE TABLE t1 (f1 INTEGER);
SELECT NTILE(1) OVER() FROM (SELECT * FROM t1) as dt QUALIFY f1 AND FALSE;
DROP TABLE t1;