Commit c3d67c17 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-20292 REPEAT(x,-1) returns a wrong data type

parent e555df64
...@@ -5068,5 +5068,21 @@ NULL ...@@ -5068,5 +5068,21 @@ NULL
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-20292 REPEAT(x,-1) returns a wrong data type
#
CREATE OR REPLACE TABLE t1 (i BIGINT);
INSERT INTO t1 VALUES (42);
CREATE OR REPLACE TABLE t2 AS SELECT
REPEAT(i,0) AS c0,
REPEAT(i,-1) AS c1
FROM t1;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`c0` char(0) CHARACTER SET utf8 DEFAULT NULL,
`c1` char(0) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
#
# End of 10.3 tests # End of 10.3 tests
# #
...@@ -2028,6 +2028,19 @@ SELECT LPAD( c, 0, '?' ) FROM t1; ...@@ -2028,6 +2028,19 @@ SELECT LPAD( c, 0, '?' ) FROM t1;
SELECT RPAD( c, 0, '?' ) FROM t1; SELECT RPAD( c, 0, '?' ) FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-20292 REPEAT(x,-1) returns a wrong data type
--echo #
CREATE OR REPLACE TABLE t1 (i BIGINT);
INSERT INTO t1 VALUES (42);
CREATE OR REPLACE TABLE t2 AS SELECT
REPEAT(i,0) AS c0,
REPEAT(i,-1) AS c1
FROM t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
--echo # --echo #
--echo # End of 10.3 tests --echo # End of 10.3 tests
......
...@@ -2967,21 +2967,21 @@ bool Item_func_repeat::fix_length_and_dec() ...@@ -2967,21 +2967,21 @@ bool Item_func_repeat::fix_length_and_dec()
if (agg_arg_charsets_for_string_result(collation, args, 1)) if (agg_arg_charsets_for_string_result(collation, args, 1))
return TRUE; return TRUE;
DBUG_ASSERT(collation.collation != NULL); DBUG_ASSERT(collation.collation != NULL);
if (args[1]->const_item()) if (args[1]->const_item() && !args[1]->is_expensive())
{
Longlong_hybrid nr= args[1]->to_longlong_hybrid();
if (args[1]->null_value || nr.neg())
fix_char_length(0);
else
{ {
/* must be longlong to avoid truncation */
longlong count= args[1]->val_int();
/* Assumes that the maximum length of a String is < INT_MAX32. */ /* Assumes that the maximum length of a String is < INT_MAX32. */
/* Set here so that rest of code sees out-of-bound value as such. */ longlong count= nr.value();
if (args[1]->null_value) if (count > INT_MAX32)
count= 0;
else if (count > INT_MAX32)
count= INT_MAX32; count= INT_MAX32;
ulonglong char_length= (ulonglong) args[0]->max_char_length() * count; ulonglong char_length= (ulonglong) args[0]->max_char_length() * count;
fix_char_length_ulonglong(char_length); fix_char_length_ulonglong(char_length);
} }
}
else else
{ {
max_length= MAX_BLOB_WIDTH; max_length= MAX_BLOB_WIDTH;
......
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