diff --git a/dbcon/joblist/tupleunion.cpp b/dbcon/joblist/tupleunion.cpp index 2c01bbf19..895c1e954 100644 --- a/dbcon/joblist/tupleunion.cpp +++ b/dbcon/joblist/tupleunion.cpp @@ -1766,12 +1766,14 @@ void TupleUnion::writeNull(Row* out, uint32_t col) { case 1: out->setUintField<1>(joblist::TINYINTNULL, col); break; - case 2: out->setUintField<1>(joblist::SMALLINTNULL, col); break; + case 2: out->setUintField<2>(joblist::SMALLINTNULL, col); break; case 4: out->setUintField<4>(joblist::INTNULL, col); break; case 8: out->setUintField<8>(joblist::BIGINTNULL, col); break; + case 16: out->setInt128Field(datatypes::Decimal128Null, col); break; + default: { } diff --git a/dbcon/mysql/ha_mcs_pushdown.cpp b/dbcon/mysql/ha_mcs_pushdown.cpp index 9a8242e2e..b57147d00 100644 --- a/dbcon/mysql/ha_mcs_pushdown.cpp +++ b/dbcon/mysql/ha_mcs_pushdown.cpp @@ -779,6 +779,15 @@ select_handler* create_columnstore_select_handler_(THD* thd, SELECT_LEX* sel_lex return nullptr; } + // MCOL-5432 Disable partial pushdown of the UNION operation if the query + // involves an order by or a limit clause. + if (sel_lex && sel_unit && + (sel_unit->global_parameters()->limit_params.explicit_limit == true || + sel_unit->global_parameters()->order_list.elements != 0)) + { + return nullptr; + } + std::vector select_lex_vec; if (sel_unit && !sel_lex) @@ -1036,13 +1045,23 @@ select_handler* create_columnstore_select_handler(THD* thd, SELECT_LEX* select_l select_handler* create_columnstore_unit_handler(THD* thd, SELECT_LEX_UNIT* sel_unit) { if (thd->lex->sql_command == SQLCOM_CREATE_VIEW) + { return nullptr; + } if (thd->stmt_arena && thd->stmt_arena->is_stmt_prepare()) { return nullptr; } + // MCOL-5432 Disable UNION pushdown if the query involves an order by + // or a limit clause. + if (sel_unit->global_parameters()->limit_params.explicit_limit == true || + sel_unit->global_parameters()->order_list.elements != 0) + { + return nullptr; + } + return create_columnstore_select_handler_(thd, 0, sel_unit); } diff --git a/mysql-test/columnstore/basic/r/mdev-25080.result b/mysql-test/columnstore/basic/r/mdev-25080.result index 054ebae26..e69b3ad30 100644 --- a/mysql-test/columnstore/basic/r/mdev-25080.result +++ b/mysql-test/columnstore/basic/r/mdev-25080.result @@ -261,6 +261,53 @@ 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 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 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 ALL NULL NULL NULL NULL NULL Using filesort DROP USER 'cejuser'@'localhost'; DROP TABLE t1, t2, t3, t4; DROP DATABASE mdev25080; diff --git a/mysql-test/columnstore/basic/t/mdev-25080.test b/mysql-test/columnstore/basic/t/mdev-25080.test index d4f5536d3..98ac13802 100644 --- a/mysql-test/columnstore/basic/t/mdev-25080.test +++ b/mysql-test/columnstore/basic/t/mdev-25080.test @@ -169,6 +169,17 @@ PREPARE stmt FROM "EXPLAIN (SELECT * FROM t1 UNION 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;