From 904ac415e4b135a14033fe792bb1045feec648fa Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Tue, 26 Mar 2024 14:17:40 +0000 Subject: [PATCH] fix(plugin) MCOL-5699: throw error for unimplemented INTERSECT and EXCEPT --- dbcon/mysql/ha_mcs_execplan.cpp | 15 +++++++++ .../columnstore/bugfixes/MCOL-5699.result | 33 +++++++++++++++++++ .../columnstore/bugfixes/MCOL-5699.test | 25 ++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 mysql-test/columnstore/bugfixes/MCOL-5699.result create mode 100644 mysql-test/columnstore/bugfixes/MCOL-5699.test diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index e88fcbec9..efcb9586f 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -6742,6 +6742,21 @@ int processFrom(bool& isUnion, SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& // Existed pushdown handlers won't get in this scope // MDEV-25080 Union pushdown would enter this scope // is_unit_op() give a segv for derived_handler's SELECT_LEX + + // check INTERSECT or EXCEPT, that are not implemented + auto * nextSelect = select_lex.master_unit()->first_select()->next_select(); + if (nextSelect) + { + if (nextSelect->get_linkage() == INTERSECT_TYPE) + { + setError(gwi.thd, ER_INTERNAL_ERROR, "INTERSECT is not supported by Columnstore engine", gwi); + } + else if (nextSelect->get_linkage() == EXCEPT_TYPE) + { + setError(gwi.thd, ER_INTERNAL_ERROR, "EXCEPT is not supported by Columnstore engine", gwi); + } + } + if (!isUnion && (!isSelectHandlerTop || isSelectLexUnit) && select_lex.master_unit()->is_unit_op()) { // MCOL-2178 isUnion member only assigned, never used diff --git a/mysql-test/columnstore/bugfixes/MCOL-5699.result b/mysql-test/columnstore/bugfixes/MCOL-5699.result new file mode 100644 index 000000000..d89cfe5c4 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/MCOL-5699.result @@ -0,0 +1,33 @@ +DROP DATABASE IF EXISTS mcol_5699 ; +CREATE DATABASE mcol_5699 ; +USE mcol_5699 ; +CREATE TABLE cs1(a text) ENGINE=columnstore; +INSERT INTO cs1 VALUES('a'),('b'),('c'),('x'); +CREATE TABLE cs2(a text) ENGINE=columnstore; +INSERT INTO cs1 VALUES('y'),('z'),('x'); +SELECT a from cs1 UNION ALL select a from cs2; +a +a +b +c +x +y +z +x +SELECT a from cs1 UNION DISTINCT select a from cs2; +a +a +b +c +x +y +z +SELECT a from cs1 INTERSECT ALL select a from cs2; +ERROR HY000: Internal error: INTERSECT is not supported by Columnstore engine +SELECT a from cs1 INTERSECT DISTINCT select a from cs2; +ERROR HY000: Internal error: INTERSECT is not supported by Columnstore engine +SELECT a from cs1 EXCEPT ALL select a from cs2; +ERROR HY000: Internal error: EXCEPT is not supported by Columnstore engine +SELECT a from cs1 EXCEPT DISTINCT select a from cs2; +ERROR HY000: Internal error: EXCEPT is not supported by Columnstore engine +DROP DATABASE mcol_5699 ; diff --git a/mysql-test/columnstore/bugfixes/MCOL-5699.test b/mysql-test/columnstore/bugfixes/MCOL-5699.test new file mode 100644 index 000000000..6b7e25349 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/MCOL-5699.test @@ -0,0 +1,25 @@ +--source ../include/have_columnstore.inc +--disable_warnings +DROP DATABASE IF EXISTS mcol_5699 ; +--enable_warnings +CREATE DATABASE mcol_5699 ; +USE mcol_5699 ; +CREATE TABLE cs1(a text) ENGINE=columnstore; +INSERT INTO cs1 VALUES('a'),('b'),('c'),('x'); + +CREATE TABLE cs2(a text) ENGINE=columnstore; +INSERT INTO cs1 VALUES('y'),('z'),('x'); + +SELECT a from cs1 UNION ALL select a from cs2; +SELECT a from cs1 UNION DISTINCT select a from cs2; + +--ERROR 1815 +SELECT a from cs1 INTERSECT ALL select a from cs2; +--ERROR 1815 +SELECT a from cs1 INTERSECT DISTINCT select a from cs2; +--ERROR 1815 +SELECT a from cs1 EXCEPT ALL select a from cs2; +--ERROR 1815 +SELECT a from cs1 EXCEPT DISTINCT select a from cs2; + +DROP DATABASE mcol_5699 ;