From a6ab9bd615f4d57a945d610564d87ab538cdda79 Mon Sep 17 00:00:00 2001 From: Akhmad Oripov <96055449+AestheticAkhmad@users.noreply.github.com> Date: Tue, 8 Apr 2025 17:47:47 +0200 Subject: [PATCH] fix(funcexp): MCOL-5386 Bitwise aggregation functions do not work with wide decimals (internal error) (#3485) --- .../columnstore/bugfixes/mcol_5386.result | 11 ++++++++++ .../columnstore/bugfixes/mcol_5386.test | 21 +++++++++++++++++++ utils/rowgroup/rowgroup.h | 2 ++ 3 files changed, 34 insertions(+) create mode 100644 mysql-test/columnstore/bugfixes/mcol_5386.result create mode 100644 mysql-test/columnstore/bugfixes/mcol_5386.test diff --git a/mysql-test/columnstore/bugfixes/mcol_5386.result b/mysql-test/columnstore/bugfixes/mcol_5386.result new file mode 100644 index 000000000..be7da80c1 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol_5386.result @@ -0,0 +1,11 @@ +DROP DATABASE IF EXISTS mcol_5386; +CREATE DATABASE mcol_5386; +USE mcol_5386; +DROP TABLE IF EXISTS t1; +create table t1(c decimal(19)) engine=columnstore; +insert into t1(c) values (-2); +select bit_or(c), bit_xor(c), bit_and(c) from t1; +bit_or(c) bit_xor(c) bit_and(c) +18446744073709551614 18446744073709551614 18446744073709551614 +DROP TABLE IF EXISTS t1; +DROP DATABASE mcol_5386; diff --git a/mysql-test/columnstore/bugfixes/mcol_5386.test b/mysql-test/columnstore/bugfixes/mcol_5386.test new file mode 100644 index 000000000..ab81c0177 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol_5386.test @@ -0,0 +1,21 @@ +-- source ../include/have_columnstore.inc +--disable_warnings +DROP DATABASE IF EXISTS mcol_5386; +--enable_warnings +CREATE DATABASE mcol_5386; +USE mcol_5386; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +create table t1(c decimal(19)) engine=columnstore; +insert into t1(c) values (-2); +select bit_or(c), bit_xor(c), bit_and(c) from t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +--disable_warnings +DROP DATABASE mcol_5386; +--enable_warnings diff --git a/utils/rowgroup/rowgroup.h b/utils/rowgroup/rowgroup.h index 573d10611..7ecab0eca 100644 --- a/utils/rowgroup/rowgroup.h +++ b/utils/rowgroup/rowgroup.h @@ -866,6 +866,8 @@ inline int64_t Row::getIntField(uint32_t colIndex) const case 8: return *((int64_t*)&data[offsets[colIndex]]); + case 16: return *((int128_t*)&data[offsets[colIndex]]); + default: idbassert(0); throw std::logic_error("Row::getIntField(): bad length."); } }