You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
Merge pull request #2741 from mariadb-corporation/MDEV-25080-CS-dev
MDEV-25080 Allow pushdown of queries involving UNIONs in outer select to ColumnStore
This commit is contained in:
@ -1,5 +1,8 @@
|
||||
-- source ../include/have_columnstore.inc
|
||||
|
||||
--echo # MCOL-641 Union Test Cases
|
||||
--echo # Once MCOL-5417 is supported, the errored out queries below should be fixed.
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS mcol641_union_db;
|
||||
--enable_warnings
|
||||
@ -19,17 +22,38 @@ INSERT INTO cs1 values (99999999999999999999999999999999999999, 9999999999999999
|
||||
INSERT INTO cs1 values (-99999999999999999999999999999999999998, -9999999999999999999999999999.9999999998, -0.99999999999999999999999999999999999998);
|
||||
INSERT INTO cs1 values (-99999999999999999999999999999999999999, -9999999999999999999999999999.9999999999, -0.99999999999999999999999999999999999999);
|
||||
|
||||
--error ER_CHECK_NOT_IMPLEMENTED
|
||||
SELECT d1, d1, d2 FROM cs1 UNION SELECT d2, d3, d3 FROM cs1;
|
||||
--error ER_CHECK_NOT_IMPLEMENTED
|
||||
SELECT d2, d3, d3 FROM cs1 UNION SELECT d1, d1, d2 FROM cs1;
|
||||
--sorted_result
|
||||
SELECT d1, d2, d3 FROM cs1 UNION SELECT d1, d2, d3 FROM cs1;
|
||||
|
||||
INSERT INTO cs2 VALUES (125, 1.25, 0.125);
|
||||
INSERT INTO cs2 values (99999999999999999999999999999999999998, 9999999999999999999999999999.9999999998, 0.99999999999999999999999999999999999998);
|
||||
INSERT INTO cs2 values (99999999999999999999999999999999999999, 9999999999999999999999999999.9999999999, 0.99999999999999999999999999999999999999);
|
||||
|
||||
--error ER_CHECK_NOT_IMPLEMENTED
|
||||
SELECT d1, d1, d2 FROM cs2 UNION SELECT d2, d3, d3 FROM cs2;
|
||||
--error ER_CHECK_NOT_IMPLEMENTED
|
||||
SELECT d2, d3, d3 FROM cs2 UNION SELECT d1, d1, d2 FROM cs2;
|
||||
--sorted_result
|
||||
SELECT d1, d2, d3 FROM cs2 UNION SELECT d1, d2, d3 FROM cs2;
|
||||
|
||||
DROP TABLE cs1, cs2;
|
||||
CREATE TABLE cs1 (d1 DECIMAL(20, 0), d2 DECIMAL(20, 18), d3 DECIMAL(18, 18)) ENGINE=columnstore;
|
||||
CREATE TABLE cs2 (d1 DECIMAL(20, 0) UNSIGNED, d2 DECIMAL(20, 18) UNSIGNED, d3 DECIMAL(18, 18) UNSIGNED) ENGINE=columnstore;
|
||||
INSERT INTO cs1 VALUES (12345678901234567890, 12.345678901234567891, 0.123456789012345678);
|
||||
INSERT INTO cs1 VALUES (-12345678901234567890, -12.345678901234567891, -0.123456789012345678);
|
||||
INSERT INTO cs1 VALUES (99999999999999999999, 99.999999999999999999, 0.999999999999999999);
|
||||
INSERT INTO cs1 VALUES (-99999999999999999999, -99.999999999999999999, -0.999999999999999999);
|
||||
INSERT INTO cs2 VALUES (12345678901234567890, 12.345678901234567891, 0.123456789012345678);
|
||||
INSERT INTO cs2 VALUES (99999999999999999999, 99.999999999999999999, 0.999999999999999999);
|
||||
|
||||
--sorted_result
|
||||
SELECT d1, d1, d2 FROM cs1 UNION SELECT d2, d3, d3 FROM cs1;
|
||||
--sorted_result
|
||||
SELECT d1, d1, d2 FROM cs2 UNION SELECT d2, d3, d3 FROM cs2;
|
||||
|
||||
# Clean UP
|
||||
DROP DATABASE mcol641_union_db;
|
||||
|
185
mysql-test/columnstore/basic/t/mdev-25080.test
Normal file
185
mysql-test/columnstore/basic/t/mdev-25080.test
Normal file
@ -0,0 +1,185 @@
|
||||
--echo #
|
||||
--echo # MDEV-25080: Allow pushdown of queries involving UNIONs
|
||||
--echo # in outer select to foreign engines
|
||||
--echo #
|
||||
--echo # Remove the sorted_result MTR qualifier and add ORDER BY
|
||||
--echo # clause after MCOL-5222 is fixed
|
||||
--echo #
|
||||
|
||||
--source ../include/have_columnstore.inc
|
||||
|
||||
if (!$MASTER_MYPORT)
|
||||
{
|
||||
# Running with --extern
|
||||
let $MASTER_MYPORT=`SELECT @@port`;
|
||||
}
|
||||
|
||||
#
|
||||
# Enable cross engine join
|
||||
# Configure user and password in Columnstore.xml file
|
||||
#
|
||||
--exec $MCS_MCSSETCONFIG CrossEngineSupport User 'cejuser'
|
||||
--exec $MCS_MCSSETCONFIG CrossEngineSupport Password 'Vagrant1|0000001'
|
||||
--exec $MCS_MCSSETCONFIG CrossEngineSupport Port $MASTER_MYPORT
|
||||
|
||||
#
|
||||
# Create corresponding in the server
|
||||
#
|
||||
--disable_warnings
|
||||
CREATE USER IF NOT EXISTS'cejuser'@'localhost' IDENTIFIED BY 'Vagrant1|0000001';
|
||||
--enable_warnings
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'cejuser'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS mdev25080;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DATABASE mdev25080;
|
||||
|
||||
USE mdev25080;
|
||||
|
||||
CREATE TABLE t1 (a varchar(30)) ENGINE=ColumnStore;
|
||||
CREATE TABLE t2 (a varchar(30)) ENGINE=ColumnStore;
|
||||
CREATE TABLE t3 (a varchar(30)) ENGINE=MyISAM;
|
||||
CREATE TABLE t4 (a varchar(30)) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t1 VALUES ('abc'), ('bcd'), ('cde');
|
||||
INSERT INTO t2 VALUES ('bcd'), ('cde'), ('def'), ('efg');
|
||||
|
||||
INSERT INTO t3 VALUES ('t3_myisam1'), ('t3_myisam2'), ('t3_myisam3');
|
||||
INSERT INTO t4 VALUES ('t4_myisam1'), ('t4_myisam2'), ('t4_myisam3');
|
||||
|
||||
--echo # Pushdown of the whole UNION
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2;
|
||||
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2;
|
||||
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
|
||||
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2;
|
||||
|
||||
--echo # UNION with a foreign engine
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION SELECT * FROM t3;
|
||||
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t3;
|
||||
|
||||
--echo # More than two SELECTs in a UNIT:
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2 UNION ALL
|
||||
SELECT * FROM t1;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2 UNION ALL
|
||||
SELECT * FROM t1;
|
||||
|
||||
--sorted_result
|
||||
(SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2) UNION ALL
|
||||
SELECT * FROM t1;
|
||||
|
||||
EXPLAIN (SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2) UNION ALL
|
||||
SELECT * FROM t1;
|
||||
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2 UNION ALL
|
||||
SELECT * FROM t3 UNION
|
||||
SELECT * FROM t4;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2 UNION ALL
|
||||
SELECT * FROM t3 UNION
|
||||
SELECT * FROM t4;
|
||||
|
||||
--sorted_result
|
||||
(SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2) UNION ALL
|
||||
(SELECT * FROM t3 UNION
|
||||
SELECT * FROM t4);
|
||||
|
||||
EXPLAIN (SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2) UNION ALL
|
||||
(SELECT * FROM t3 UNION
|
||||
SELECT * FROM t4);
|
||||
|
||||
--sorted_result
|
||||
SELECT count(*) FROM t1 UNION
|
||||
SELECT count(*) FROM t2 UNION ALL
|
||||
SELECT count(*)+20 FROM t2 UNION
|
||||
SELECT count(*)+5 FROM t1;
|
||||
|
||||
EXPLAIN
|
||||
SELECT count(*) FROM t1 UNION
|
||||
SELECT count(*) FROM t2 UNION ALL
|
||||
SELECT count(*)+20 FROM t2 UNION
|
||||
SELECT count(*)+5 FROM t1;
|
||||
|
||||
--echo # UNION inside a derived table: the whole derived table must be pushed
|
||||
SELECT a FROM
|
||||
(SELECT a FROM t1 UNION ALL SELECT a FROM t2) q ORDER BY a;
|
||||
|
||||
EXPLAIN
|
||||
SELECT a FROM
|
||||
(SELECT a FROM t1 UNION ALL SELECT a FROM t2) q ORDER BY a;
|
||||
|
||||
SELECT a FROM
|
||||
(SELECT a FROM t1 UNION ALL SELECT a FROM t3) q ORDER BY a;
|
||||
|
||||
EXPLAIN
|
||||
SELECT a FROM
|
||||
(SELECT a FROM t1 UNION ALL SELECT a FROM t3) q ORDER BY a;
|
||||
|
||||
--echo # Prepared statements
|
||||
PREPARE stmt FROM "SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2";
|
||||
|
||||
--sorted_result
|
||||
EXECUTE stmt;
|
||||
--sorted_result
|
||||
EXECUTE stmt;
|
||||
--sorted_result
|
||||
EXECUTE stmt;
|
||||
|
||||
PREPARE stmt FROM "EXPLAIN SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2";
|
||||
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
|
||||
PREPARE stmt FROM "(SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2) UNION ALL
|
||||
(SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2)";
|
||||
|
||||
--sorted_result
|
||||
EXECUTE stmt;
|
||||
--sorted_result
|
||||
EXECUTE stmt;
|
||||
--sorted_result
|
||||
EXECUTE stmt;
|
||||
|
||||
PREPARE stmt FROM "EXPLAIN (SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2) UNION ALL
|
||||
(SELECT * FROM t1 UNION
|
||||
SELECT * FROM t2)";
|
||||
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
|
||||
--echo # MCOL-5432 Disable UNION pushdown if an ORDER BY or a LIMIT
|
||||
--echo # clause is involved, until MCOL-5222 is fixed.
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a;
|
||||
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a;
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 3;
|
||||
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 3;
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a DESC LIMIT 5;
|
||||
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a DESC LIMIT 5;
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a LIMIT 3 OFFSET 2;
|
||||
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a LIMIT 3 OFFSET 2;
|
||||
|
||||
DROP USER 'cejuser'@'localhost';
|
||||
DROP TABLE t1, t2, t3, t4;
|
||||
DROP DATABASE mdev25080;
|
@ -12,6 +12,9 @@ USE mcs_union;
|
||||
--echo #
|
||||
--echo # MCOL-4700 Wrong result of a UNION for INT and INT UNSIGNED
|
||||
--echo #
|
||||
--echo # Move the UNIONs from the subqueries to outer selects and add
|
||||
--echo # ORDER BY clause after MCOL-5222 is fixed
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT UNSIGNED);
|
||||
INSERT INTO t1 VALUES (-1, 1), (-1, 1), (-2, 2);
|
||||
@ -273,4 +276,29 @@ SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT a FROM t2) tu ORDER BY a;
|
||||
SELECT * FROM (SELECT a FROM t2 UNION ALL SELECT a FROM t1) tu ORDER BY a;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # Union of tables containing different string data types
|
||||
--echo #
|
||||
--echo # Remove the sorted_result MTR qualifier and add ORDER BY clause
|
||||
--echo # after MCOL-5222 is fixed
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a CHAR(6));
|
||||
INSERT INTO t1 VALUES ('t13abc'), ('t13xx'), ('common');
|
||||
CREATE TABLE t2 (a VARCHAR(8));
|
||||
INSERT INTO t2 VALUES ('t14abcde'), ('t14xyzzz'), ('common');
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2;
|
||||
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2;
|
||||
--sorted_result
|
||||
SELECT * FROM t2 UNION ALL SELECT * FROM t1;
|
||||
EXPLAIN SELECT * FROM t2 UNION ALL SELECT * FROM t1;
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT '123456789000';
|
||||
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT '123456789000';
|
||||
--sorted_result
|
||||
SELECT * FROM t1 UNION SELECT '123456789000' UNION SELECT * FROM t2;
|
||||
EXPLAIN SELECT * FROM t1 UNION SELECT '123456789000' UNION SELECT * FROM t2;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
DROP DATABASE mcs_union;
|
||||
|
Reference in New Issue
Block a user