diff --git a/mysql-test/main/type_newdecimal.result b/mysql-test/main/type_newdecimal.result index 7a19dcf91153e..327adbc728566 100644 --- a/mysql-test/main/type_newdecimal.result +++ b/mysql-test/main/type_newdecimal.result @@ -3053,4 +3053,16 @@ truncate 2 select '12185184186.000000000000000000000000000024692343000000000000000000000000000000000002' as 'exact result'; exact result 12185184186.000000000000000000000000000024692343000000000000000000000000000000000002 +# +# MDEV-39744: Assertion `buf != end` failed in `decimal_mul` +# +SET @old_prec_incr= @@SESSION.div_precision_increment; +SET @@SESSION.div_precision_increment=0; +SELECT ((273 / 941) * (-299 / 450)) as x; +x +0 +SELECT (-299 / 450) AS neg_div; +neg_div +0 +SET @@SESSION.div_precision_increment=@old_prec_incr; # End of 10.11 tests diff --git a/mysql-test/main/type_newdecimal.test b/mysql-test/main/type_newdecimal.test index 20acf54591108..af4fff2957aa2 100644 --- a/mysql-test/main/type_newdecimal.test +++ b/mysql-test/main/type_newdecimal.test @@ -2105,4 +2105,16 @@ select 12345678 * 987.000000000000000000000000000000000002 as 'truncate 1'; select 12345678.000000000000000000000000000000000001 * 987 as 'truncate 2'; select '12185184186.000000000000000000000000000024692343000000000000000000000000000000000002' as 'exact result'; +--echo # +--echo # MDEV-39744: Assertion `buf != end` failed in `decimal_mul` +--echo # + +SET @old_prec_incr= @@SESSION.div_precision_increment; + +SET @@SESSION.div_precision_increment=0; +SELECT ((273 / 941) * (-299 / 450)) as x; +SELECT (-299 / 450) AS neg_div; + +SET @@SESSION.div_precision_increment=@old_prec_incr; + --echo # End of 10.11 tests diff --git a/strings/decimal.c b/strings/decimal.c index e23b0a1f8bba6..64fa2e888d024 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -2314,6 +2314,11 @@ static int do_div_mod(const decimal_t *from1, const decimal_t *from2, to->sign=from1->sign != from2->sign; to->intg=intg0*DIG_PER_DEC1; to->frac=frac0*DIG_PER_DEC1; + if (unlikely(frac0==0 && intg0==0)) + { + decimal_make_zero(to); + return E_DEC_OK; + } } buf0=to->buf; stop0=buf0+intg0+frac0;