1
0
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:
Roman Nozdrin
2023-02-28 11:23:50 +00:00
committed by GitHub
21 changed files with 989 additions and 202 deletions

View File

@ -1,3 +1,5 @@
# MCOL-641 Union Test Cases
# Once MCOL-5417 is supported, the errored out queries below should be fixed.
DROP DATABASE IF EXISTS mcol641_union_db;
CREATE DATABASE mcol641_union_db;
USE mcol641_union_db;
@ -11,63 +13,52 @@ INSERT INTO cs1 values (99999999999999999999999999999999999999, 9999999999999999
INSERT INTO cs1 values (-99999999999999999999999999999999999998, -9999999999999999999999999999.9999999998, -0.99999999999999999999999999999999999998);
INSERT INTO cs1 values (-99999999999999999999999999999999999999, -9999999999999999999999999999.9999999999, -0.99999999999999999999999999999999999999);
SELECT d1, d1, d2 FROM cs1 UNION SELECT d2, d3, d3 FROM cs1;
d1 d1 d2
125.0000000000 125.00000000000000000000000000000000000000 1.25000000000000000000000000000000000000
-125.0000000000 -125.00000000000000000000000000000000000000 -1.25000000000000000000000000000000000000
99999999999999999999999999999999999998.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
99999999999999999999999999999999999999.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
-99999999999999999999999999999999999998.0000000000 -999999999999999999999999999.99999999999999999999999999999999999999 -999999999999999999999999999.99999999999999999999999999999999999999
-99999999999999999999999999999999999999.0000000000 -999999999999999999999999999.99999999999999999999999999999999999999 -999999999999999999999999999.99999999999999999999999999999999999999
1.2500000000 0.12500000000000000000000000000000000000 0.12500000000000000000000000000000000000
-1.2500000000 -0.12500000000000000000000000000000000000 -0.12500000000000000000000000000000000000
9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998 0.99999999999999999999999999999999999998
9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999 0.99999999999999999999999999999999999999
-9999999999999999999999999999.9999999998 -0.99999999999999999999999999999999999998 -0.99999999999999999999999999999999999998
-9999999999999999999999999999.9999999999 -0.99999999999999999999999999999999999999 -0.99999999999999999999999999999999999999
ERROR 42000: The storage engine for the table doesn't support MCS-2060: Union operation exceeds maximum DECIMAL precision of 38.
SELECT d2, d3, d3 FROM cs1 UNION SELECT d1, d1, d2 FROM cs1;
d2 d3 d3
1.2500000000 0.12500000000000000000000000000000000000 0.12500000000000000000000000000000000000
-1.2500000000 -0.12500000000000000000000000000000000000 -0.12500000000000000000000000000000000000
9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998 0.99999999999999999999999999999999999998
9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999 0.99999999999999999999999999999999999999
-9999999999999999999999999999.9999999998 -0.99999999999999999999999999999999999998 -0.99999999999999999999999999999999999998
-9999999999999999999999999999.9999999999 -0.99999999999999999999999999999999999999 -0.99999999999999999999999999999999999999
125.0000000000 125.00000000000000000000000000000000000000 1.25000000000000000000000000000000000000
-125.0000000000 -125.00000000000000000000000000000000000000 -1.25000000000000000000000000000000000000
99999999999999999999999999999999999998.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
99999999999999999999999999999999999999.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
-99999999999999999999999999999999999998.0000000000 -999999999999999999999999999.99999999999999999999999999999999999999 -999999999999999999999999999.99999999999999999999999999999999999999
-99999999999999999999999999999999999999.0000000000 -999999999999999999999999999.99999999999999999999999999999999999999 -999999999999999999999999999.99999999999999999999999999999999999999
ERROR 42000: The storage engine for the table doesn't support MCS-2060: Union operation exceeds maximum DECIMAL precision of 38.
SELECT d1, d2, d3 FROM cs1 UNION SELECT d1, d2, d3 FROM cs1;
d1 d2 d3
125 1.2500000000 0.12500000000000000000000000000000000000
-125 -1.2500000000 -0.12500000000000000000000000000000000000
99999999999999999999999999999999999998 9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998
99999999999999999999999999999999999999 9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999
-99999999999999999999999999999999999998 -9999999999999999999999999999.9999999998 -0.99999999999999999999999999999999999998
-99999999999999999999999999999999999999 -9999999999999999999999999999.9999999999 -0.99999999999999999999999999999999999999
125 1.2500000000 0.12500000000000000000000000000000000000
99999999999999999999999999999999999998 9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998
99999999999999999999999999999999999999 9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999
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);
SELECT d1, d1, d2 FROM cs2 UNION SELECT d2, d3, d3 FROM cs2;
d1 d1 d2
125.0000000000 125.00000000000000000000000000000000000000 1.25000000000000000000000000000000000000
99999999999999999999999999999999999998.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
99999999999999999999999999999999999999.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
1.2500000000 0.12500000000000000000000000000000000000 0.12500000000000000000000000000000000000
9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998 0.99999999999999999999999999999999999998
9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999 0.99999999999999999999999999999999999999
ERROR 42000: The storage engine for the table doesn't support MCS-2060: Union operation exceeds maximum DECIMAL precision of 38.
SELECT d2, d3, d3 FROM cs2 UNION SELECT d1, d1, d2 FROM cs2;
d2 d3 d3
1.2500000000 0.12500000000000000000000000000000000000 0.12500000000000000000000000000000000000
9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998 0.99999999999999999999999999999999999998
9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999 0.99999999999999999999999999999999999999
125.0000000000 125.00000000000000000000000000000000000000 1.25000000000000000000000000000000000000
99999999999999999999999999999999999998.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
99999999999999999999999999999999999999.0000000000 999999999999999999999999999.99999999999999999999999999999999999999 999999999999999999999999999.99999999999999999999999999999999999999
ERROR 42000: The storage engine for the table doesn't support MCS-2060: Union operation exceeds maximum DECIMAL precision of 38.
SELECT d1, d2, d3 FROM cs2 UNION SELECT d1, d2, d3 FROM cs2;
d1 d2 d3
125 1.2500000000 0.12500000000000000000000000000000000000
99999999999999999999999999999999999998 9999999999999999999999999999.9999999998 0.99999999999999999999999999999999999998
99999999999999999999999999999999999999 9999999999999999999999999999.9999999999 0.99999999999999999999999999999999999999
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);
SELECT d1, d1, d2 FROM cs1 UNION SELECT d2, d3, d3 FROM cs1;
d1 d1 d2
-12.345678901234567891 -0.123456789012345678 -0.123456789012345678
-12345678901234567890.000000000000000000 -12345678901234567890.000000000000000000 -12.345678901234567891
-99.999999999999999999 -0.999999999999999999 -0.999999999999999999
-99999999999999999999.000000000000000000 -99999999999999999999.000000000000000000 -99.999999999999999999
12.345678901234567891 0.123456789012345678 0.123456789012345678
12345678901234567890.000000000000000000 12345678901234567890.000000000000000000 12.345678901234567891
99.999999999999999999 0.999999999999999999 0.999999999999999999
99999999999999999999.000000000000000000 99999999999999999999.000000000000000000 99.999999999999999999
SELECT d1, d1, d2 FROM cs2 UNION SELECT d2, d3, d3 FROM cs2;
d1 d1 d2
12.345678901234567891 0.123456789012345678 0.123456789012345678
12345678901234567890.000000000000000000 12345678901234567890.000000000000000000 12.345678901234567891
99.999999999999999999 0.999999999999999999 0.999999999999999999
99999999999999999999.000000000000000000 99999999999999999999.000000000000000000 99.999999999999999999
DROP DATABASE mcol641_union_db;

View File

@ -0,0 +1,313 @@
#
# MDEV-25080: Allow pushdown of queries involving UNIONs
# in outer select to foreign engines
#
# Remove the sorted_result MTR qualifier and add ORDER BY
# clause after MCOL-5222 is fixed
#
CREATE USER IF NOT EXISTS'cejuser'@'localhost' IDENTIFIED BY 'Vagrant1|0000001';
GRANT ALL PRIVILEGES ON *.* TO 'cejuser'@'localhost';
FLUSH PRIVILEGES;
DROP DATABASE IF EXISTS mdev25080;
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');
# Pushdown of the whole UNION
SELECT * FROM t1 UNION SELECT * FROM t2;
a
abc
bcd
cde
def
efg
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
a
abc
bcd
bcd
cde
cde
def
efg
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
# UNION with a foreign engine
SELECT * FROM t1 UNION SELECT * FROM t3;
a
abc
bcd
cde
t3_myisam1
t3_myisam2
t3_myisam3
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t3;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
# More than two SELECTs in a UNIT:
SELECT * FROM t1 UNION
SELECT * FROM t2 UNION ALL
SELECT * FROM t1;
a
abc
abc
bcd
bcd
cde
cde
def
efg
EXPLAIN SELECT * FROM t1 UNION
SELECT * FROM t2 UNION ALL
SELECT * FROM t1;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
(SELECT * FROM t1 UNION
SELECT * FROM t2) UNION ALL
SELECT * FROM t1;
a
abc
abc
bcd
bcd
cde
cde
def
efg
EXPLAIN (SELECT * FROM t1 UNION
SELECT * FROM t2) UNION ALL
SELECT * FROM t1;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
SELECT * FROM t1 UNION
SELECT * FROM t2 UNION ALL
SELECT * FROM t3 UNION
SELECT * FROM t4;
a
abc
bcd
cde
def
efg
t3_myisam1
t3_myisam2
t3_myisam3
t4_myisam1
t4_myisam2
t4_myisam3
EXPLAIN SELECT * FROM t1 UNION
SELECT * FROM t2 UNION ALL
SELECT * FROM t3 UNION
SELECT * FROM t4;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
(SELECT * FROM t1 UNION
SELECT * FROM t2) UNION ALL
(SELECT * FROM t3 UNION
SELECT * FROM t4);
a
abc
bcd
cde
def
efg
t3_myisam1
t3_myisam2
t3_myisam3
t4_myisam1
t4_myisam2
t4_myisam3
EXPLAIN (SELECT * FROM t1 UNION
SELECT * FROM t2) UNION ALL
(SELECT * FROM t3 UNION
SELECT * FROM t4);
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
SELECT count(*) FROM t1 UNION
SELECT count(*) FROM t2 UNION ALL
SELECT count(*)+20 FROM t2 UNION
SELECT count(*)+5 FROM t1;
count(*)
24
3
4
8
EXPLAIN
SELECT count(*) FROM t1 UNION
SELECT count(*) FROM t2 UNION ALL
SELECT count(*)+20 FROM t2 UNION
SELECT count(*)+5 FROM t1;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
# 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;
a
abc
bcd
bcd
cde
cde
def
efg
EXPLAIN
SELECT a FROM
(SELECT a FROM t1 UNION ALL SELECT a FROM t2) q ORDER BY a;
id select_type table type possible_keys key key_len ref rows Extra
1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL
SELECT a FROM
(SELECT a FROM t1 UNION ALL SELECT a FROM t3) q ORDER BY a;
a
abc
bcd
cde
t3_myisam1
t3_myisam2
t3_myisam3
EXPLAIN
SELECT a FROM
(SELECT a FROM t1 UNION ALL SELECT a FROM t3) q ORDER BY a;
id select_type table type possible_keys key key_len ref rows Extra
1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL
# Prepared statements
PREPARE stmt FROM "SELECT * FROM t1 UNION
SELECT * FROM t2";
EXECUTE stmt;
a
abc
bcd
cde
def
efg
EXECUTE stmt;
a
abc
bcd
cde
def
efg
EXECUTE stmt;
a
abc
bcd
cde
def
efg
PREPARE stmt FROM "EXPLAIN SELECT * FROM t1 UNION
SELECT * FROM t2";
EXECUTE stmt;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
EXECUTE stmt;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
PREPARE stmt FROM "(SELECT * FROM t1 UNION
SELECT * FROM t2) UNION ALL
(SELECT * FROM t1 UNION
SELECT * FROM t2)";
EXECUTE stmt;
a
abc
abc
bcd
bcd
cde
cde
def
def
efg
efg
EXECUTE stmt;
a
abc
abc
bcd
bcd
cde
cde
def
def
efg
efg
EXECUTE stmt;
a
abc
abc
bcd
bcd
cde
cde
def
def
efg
efg
PREPARE stmt FROM "EXPLAIN (SELECT * FROM t1 UNION
SELECT * FROM t2) UNION ALL
(SELECT * FROM t1 UNION
SELECT * FROM t2)";
EXECUTE stmt;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
EXECUTE stmt;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
# MCOL-5432 Disable UNION pushdown if an ORDER BY or a LIMIT
# clause is involved, until MCOL-5222 is fixed.
SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a;
a
abc
bcd
bcd
cde
cde
def
efg
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 2000
2 UNION t2 ALL NULL NULL NULL NULL 2000
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL Using filesort
SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 3;
a
abc
bcd
cde
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 3;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 2000
2 UNION t2 ALL NULL NULL NULL NULL 2000
SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a DESC LIMIT 5;
a
efg
def
cde
cde
bcd
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a DESC LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 2000
2 UNION t2 ALL NULL NULL NULL NULL 2000
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL Using filesort
SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a LIMIT 3 OFFSET 2;
a
bcd
cde
cde
EXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY a LIMIT 3 OFFSET 2;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 2000
2 UNION t2 ALL NULL NULL NULL NULL 2000
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL Using filesort
DROP USER 'cejuser'@'localhost';
DROP TABLE t1, t2, t3, t4;
DROP DATABASE mdev25080;

View File

@ -5,6 +5,9 @@ USE mcs_union;
#
# MCOL-4700 Wrong result of a UNION for INT and INT UNSIGNED
#
# Move the UNIONs from the subqueries to outer selects and add
# ORDER BY clause after MCOL-5222 is fixed
#
CREATE TABLE t1 (a INT, b INT UNSIGNED);
INSERT INTO t1 VALUES (-1, 1), (-1, 1), (-2, 2);
SELECT * FROM (SELECT * FROM t1 UNION SELECT * FROM t1) tu ORDER BY b;
@ -862,4 +865,58 @@ a
16777213
9223372036854775807
DROP TABLE t1,t2;
#
# Union of tables containing different string data types
#
# Remove the sorted_result MTR qualifier and add ORDER BY clause
# after MCOL-5222 is fixed
#
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');
SELECT * FROM t1 UNION SELECT * FROM t2;
a
common
t13abc
t13xx
t14abcde
t14xyzzz
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
SELECT * FROM t2 UNION ALL SELECT * FROM t1;
a
common
common
t13abc
t13xx
t14abcde
t14xyzzz
EXPLAIN SELECT * FROM t2 UNION ALL SELECT * FROM t1;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT '123456789000';
a
123456789000
common
t13abc
t13xx
t14abcde
t14xyzzz
EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT '123456789000';
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
SELECT * FROM t1 UNION SELECT '123456789000' UNION SELECT * FROM t2;
a
123456789000
common
t13abc
t13xx
t14abcde
t14xyzzz
EXPLAIN SELECT * FROM t1 UNION SELECT '123456789000' UNION SELECT * FROM t2;
id select_type table type possible_keys key key_len ref rows Extra
NULL PUSHED UNION NULL NULL NULL NULL NULL NULL NULL NULL
DROP TABLE t1,t2;
DROP DATABASE mcs_union;

View File

@ -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;

View 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;

View File

@ -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;