1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-17 10:37:05 +03:00

fix(MCOL-5889): Improper handle of DOUBLE result type with DECIMAL arguments

Sometimes server assigns DOUBLE type for arithmetic operations over
DECIMAL arguments. In this rare case width of result was incorrectly
adjusted and it triggered an assertion.

Now width of result gets adjusted only if result type is also DECIMAL.
This commit is contained in:
Serguey Zefiov 2025-02-10 20:18:06 +00:00 committed by Sergey Zefirov
parent 7dcc6a251a
commit 8b9db66ddd
4 changed files with 57 additions and 1 deletions

View File

@ -4025,7 +4025,8 @@ ReturnedColumn* buildArithmeticColumnBody(Item_func* item, gp_walk_info& gwi, bo
int32_t leftColWidth = leftColType.colWidth;
int32_t rightColWidth = rightColType.colWidth;
if (leftColWidth == datatypes::MAXDECIMALWIDTH || rightColWidth == datatypes::MAXDECIMALWIDTH)
if ((leftColWidth == datatypes::MAXDECIMALWIDTH || rightColWidth == datatypes::MAXDECIMALWIDTH)
&& datatypes::isDecimal(mysqlType.colDataType))
{
mysqlType.colWidth = datatypes::MAXDECIMALWIDTH;

View File

@ -0,0 +1,25 @@
DROP DATABASE IF EXISTS MCOL5889;
CREATE DATABASE MCOL5889;
USE MCOL5889;
CREATE TABLE t1 (f1 DECIMAL, f2 BIGINT, f3 DOUBLE) ENGINE=columnstore;
CREATE TABLE t2 (f1 DECIMAL, f2 INT, f3 DOUBLE) ENGINE=columnstore;
INSERT INTO t1 VALUES (1, 2, 3), (2, 3, 4), (3, 4, 5);
INSERT INTO t2 VALUES (4, 5, 6), (5, 6, 7), (6, 7, 8);
SELECT f1, f2, f3, f2 * f3 FROM
(
SELECT f1, f2, AVG(f3) f3 FROM
(
SELECT f1, f2, f3 FROM t1
UNION ALL
SELECT f1, f2, f3 FROM t2
) U
GROUP BY f1
) V;
f1 f2 f3 f2 * f3
1 2 3 6
2 3 4 12
3 4 5 20
4 5 6 30
5 6 7 42
6 7 8 56
DROP DATABASE MCOL5889;

View File

@ -0,0 +1,24 @@
--disable_warnings
DROP DATABASE IF EXISTS MCOL5889;
--enable_warnings
CREATE DATABASE MCOL5889;
USE MCOL5889;
CREATE TABLE t1 (f1 DECIMAL, f2 BIGINT, f3 DOUBLE) ENGINE=columnstore;
CREATE TABLE t2 (f1 DECIMAL, f2 INT, f3 DOUBLE) ENGINE=columnstore;
INSERT INTO t1 VALUES (1, 2, 3), (2, 3, 4), (3, 4, 5);
INSERT INTO t2 VALUES (4, 5, 6), (5, 6, 7), (6, 7, 8);
--sorted_result
SELECT f1, f2, f3, f2 * f3 FROM
(
SELECT f1, f2, AVG(f3) f3 FROM
(
SELECT f1, f2, f3 FROM t1
UNION ALL
SELECT f1, f2, f3 FROM t2
) U
GROUP BY f1
) V;
DROP DATABASE MCOL5889;

View File

@ -40,6 +40,12 @@ if (( $# == 2 )); then
exit 1
fi
if (( $# == 1 )); then
run_suite $1
exit 1
fi
run_suite basic
run_suite bugfixes
run_suite setup