Commit d89d12e3 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-17759 Assertion `precision > 0' failed in decimal_bin_size upon CREATE TABLE .. SELECT

parent 812bb130
...@@ -3753,5 +3753,23 @@ t1 CREATE TABLE `t1` ( ...@@ -3753,5 +3753,23 @@ t1 CREATE TABLE `t1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-17759 Assertion `precision > 0' failed in decimal_bin_size upon CREATE TABLE .. SELECT
#
SET sql_mode='';
CREATE TABLE t1 (d DECIMAL(43,0) UNSIGNED);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 AS SELECT
IFNULL(SLEEP(0.01), NULL DIV d) AS f0,
IFNULL(SLEEP(0.01), '' DIV d) AS f1
FROM t1;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`f0` decimal(1,0) DEFAULT NULL,
`f1` decimal(1,0) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET sql_mode=DEFAULT;
#
# End of 10.3 tests # End of 10.3 tests
# #
...@@ -611,6 +611,22 @@ CREATE TABLE t1 AS SELECT ...@@ -611,6 +611,22 @@ CREATE TABLE t1 AS SELECT
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-17759 Assertion `precision > 0' failed in decimal_bin_size upon CREATE TABLE .. SELECT
--echo #
SET sql_mode='';
CREATE TABLE t1 (d DECIMAL(43,0) UNSIGNED);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 AS SELECT
IFNULL(SLEEP(0.01), NULL DIV d) AS f0,
IFNULL(SLEEP(0.01), '' DIV d) AS f1
FROM t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
SET sql_mode=DEFAULT;
--echo # --echo #
--echo # End of 10.3 tests --echo # End of 10.3 tests
--echo # --echo #
......
...@@ -1285,3 +1285,36 @@ E59B9BE4BA94E585AD 2914501801 ...@@ -1285,3 +1285,36 @@ E59B9BE4BA94E585AD 2914501801
E4B883E585ABE4B99D 2374586519 E4B883E585ABE4B99D 2374586519
DROP TABLE t1; DROP TABLE t1;
SET NAMES default; SET NAMES default;
#
# MDEV-17759 Assertion `precision > 0' failed in decimal_bin_size upon CREATE TABLE .. SELECT
#
SET sql_mode='';
CREATE TABLE t1 (d DECIMAL(43,0) UNSIGNED);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 AS SELECT
NULL DIV d AS d_null,
'' DIV d AS d_empty_string,
X'32' DIV d AS d_hex_string2,
X'3232' DIV d AS d_hex_string4,
TIME(0) DIV d AS d_time,
CURRENT_DATE DIV d AS d_date,
CURRENT_TIMESTAMP DIV d AS d_datetime
FROM t1;
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ''
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`d_null` int(1) unsigned DEFAULT NULL,
`d_empty_string` int(1) unsigned DEFAULT NULL,
`d_hex_string2` int(1) unsigned DEFAULT NULL,
`d_hex_string4` int(2) unsigned DEFAULT NULL,
`d_time` int(7) unsigned DEFAULT NULL,
`d_date` int(8) unsigned DEFAULT NULL,
`d_datetime` bigint(14) unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET sql_mode=DEFAULT;
#
# End of 10.3 tests
#
...@@ -897,3 +897,28 @@ LOAD DATA INFILE '../../std_data/loaddata_utf8.dat' INTO TABLE t1 CHARACTER SET ...@@ -897,3 +897,28 @@ LOAD DATA INFILE '../../std_data/loaddata_utf8.dat' INTO TABLE t1 CHARACTER SET
SELECT HEX(a), CRC32(a) from t1; SELECT HEX(a), CRC32(a) from t1;
DROP TABLE t1; DROP TABLE t1;
SET NAMES default; SET NAMES default;
--echo #
--echo # MDEV-17759 Assertion `precision > 0' failed in decimal_bin_size upon CREATE TABLE .. SELECT
--echo #
SET sql_mode='';
CREATE TABLE t1 (d DECIMAL(43,0) UNSIGNED);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 AS SELECT
NULL DIV d AS d_null,
'' DIV d AS d_empty_string,
X'32' DIV d AS d_hex_string2,
X'3232' DIV d AS d_hex_string4,
TIME(0) DIV d AS d_time,
CURRENT_DATE DIV d AS d_date,
CURRENT_TIMESTAMP DIV d AS d_datetime
FROM t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
SET sql_mode=DEFAULT;
--echo #
--echo # End of 10.3 tests
--echo #
...@@ -1752,13 +1752,9 @@ longlong Item_func_int_div::val_int() ...@@ -1752,13 +1752,9 @@ longlong Item_func_int_div::val_int()
bool Item_func_int_div::fix_length_and_dec() bool Item_func_int_div::fix_length_and_dec()
{ {
Item_result argtype= args[0]->result_type(); uint32 prec= args[0]->decimal_int_part();
/* use precision ony for the data type it is applicable for and valid */ set_if_smaller(prec, MY_INT64_NUM_DECIMAL_DIGITS);
uint32 char_length= args[0]->max_char_length() - fix_char_length(prec);
(argtype == DECIMAL_RESULT || argtype == INT_RESULT ?
args[0]->decimals : 0);
fix_char_length(char_length > MY_INT64_NUM_DECIMAL_DIGITS ?
MY_INT64_NUM_DECIMAL_DIGITS : char_length);
maybe_null=1; maybe_null=1;
unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag; unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag;
return false; return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment