mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-20303 SPACE(-1) returns a wrong data type
This commit is contained in:
@ -5073,16 +5073,84 @@ DROP TABLE t1;
|
|||||||
CREATE OR REPLACE TABLE t1 (i BIGINT);
|
CREATE OR REPLACE TABLE t1 (i BIGINT);
|
||||||
INSERT INTO t1 VALUES (42);
|
INSERT INTO t1 VALUES (42);
|
||||||
CREATE OR REPLACE TABLE t2 AS SELECT
|
CREATE OR REPLACE TABLE t2 AS SELECT
|
||||||
|
REPEAT(i,NULL) AS cn,
|
||||||
REPEAT(i,0) AS c0,
|
REPEAT(i,0) AS c0,
|
||||||
REPEAT(i,-1) AS c1
|
REPEAT(i,-1) AS c1
|
||||||
FROM t1;
|
FROM t1;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
|
`cn` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
`c0` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
`c0` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
`c1` char(0) CHARACTER SET utf8 DEFAULT NULL
|
`c1` char(0) CHARACTER SET utf8 DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
#
|
#
|
||||||
|
# MDEV-20303 SPACE(-1) returns a wrong data type
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
SPACE(NULL) AS cn,
|
||||||
|
SPACE(0) AS c0,
|
||||||
|
SPACE(-1) AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`cn` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
|
`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;
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
LPAD(i,NULL,'a') AS cn,
|
||||||
|
LPAD(i,0,'a') AS c0,
|
||||||
|
LPAD(i,-1,'a') AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`cn` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
|
`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;
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
RPAD(i,NULL,'a') AS cn,
|
||||||
|
RPAD(i,0,'a') AS c0,
|
||||||
|
RPAD(i,-1,'a') AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`cn` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
|
`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;
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
LEFT(i,NULL) AS cn,
|
||||||
|
LEFT(i,0) AS c0,
|
||||||
|
LEFT(i,18446744073709551615) AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`cn` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
|
`c0` char(0) CHARACTER SET utf8 DEFAULT NULL,
|
||||||
|
`c1` varchar(20) CHARACTER SET utf8 DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
SELECT c1 FROM t2;
|
||||||
|
c1
|
||||||
|
42
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
#
|
#
|
||||||
|
@ -2035,6 +2035,7 @@ DROP TABLE t1;
|
|||||||
CREATE OR REPLACE TABLE t1 (i BIGINT);
|
CREATE OR REPLACE TABLE t1 (i BIGINT);
|
||||||
INSERT INTO t1 VALUES (42);
|
INSERT INTO t1 VALUES (42);
|
||||||
CREATE OR REPLACE TABLE t2 AS SELECT
|
CREATE OR REPLACE TABLE t2 AS SELECT
|
||||||
|
REPEAT(i,NULL) AS cn,
|
||||||
REPEAT(i,0) AS c0,
|
REPEAT(i,0) AS c0,
|
||||||
REPEAT(i,-1) AS c1
|
REPEAT(i,-1) AS c1
|
||||||
FROM t1;
|
FROM t1;
|
||||||
@ -2042,6 +2043,52 @@ SHOW CREATE TABLE t2;
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20303 SPACE(-1) returns a wrong data type
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
SPACE(NULL) AS cn,
|
||||||
|
SPACE(0) AS c0,
|
||||||
|
SPACE(-1) AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
LPAD(i,NULL,'a') AS cn,
|
||||||
|
LPAD(i,0,'a') AS c0,
|
||||||
|
LPAD(i,-1,'a') AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
RPAD(i,NULL,'a') AS cn,
|
||||||
|
RPAD(i,0,'a') AS c0,
|
||||||
|
RPAD(i,-1,'a') AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (42);
|
||||||
|
CREATE TABLE t2 AS SELECT
|
||||||
|
LEFT(i,NULL) AS cn,
|
||||||
|
LEFT(i,0) AS c0,
|
||||||
|
LEFT(i,18446744073709551615) AS c1
|
||||||
|
FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
SELECT c1 FROM t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.3 tests
|
--echo # End of 10.3 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -58,6 +58,27 @@ C_MODE_END
|
|||||||
|
|
||||||
size_t username_char_length= 80;
|
size_t username_char_length= 80;
|
||||||
|
|
||||||
|
|
||||||
|
class Repeat_count
|
||||||
|
{
|
||||||
|
ulonglong m_count;
|
||||||
|
public:
|
||||||
|
Repeat_count(Item *item)
|
||||||
|
:m_count(0)
|
||||||
|
{
|
||||||
|
Longlong_hybrid nr= item->to_longlong_hybrid();
|
||||||
|
if (!item->null_value && !nr.neg())
|
||||||
|
{
|
||||||
|
// Assume that the maximum length of a String is < INT_MAX32
|
||||||
|
m_count= (ulonglong) nr.value();
|
||||||
|
if (m_count > (ulonglong) INT_MAX32)
|
||||||
|
m_count= (ulonglong) INT_MAX32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ulonglong count() const { return m_count; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
For the Items which have only val_str_ascii() method
|
For the Items which have only val_str_ascii() method
|
||||||
and don't have their own "native" val_str(),
|
and don't have their own "native" val_str(),
|
||||||
@ -1635,13 +1656,10 @@ String *Item_func_left::val_str(String *str)
|
|||||||
void Item_str_func::left_right_max_length()
|
void Item_str_func::left_right_max_length()
|
||||||
{
|
{
|
||||||
uint32 char_length= args[0]->max_char_length();
|
uint32 char_length= args[0]->max_char_length();
|
||||||
if (args[1]->const_item())
|
if (args[1]->const_item() && !args[1]->is_expensive())
|
||||||
{
|
{
|
||||||
int length= (int) args[1]->val_int();
|
Repeat_count tmp(args[1]);
|
||||||
if (args[1]->null_value || length <= 0)
|
set_if_smaller(char_length, (uint) tmp.count());
|
||||||
char_length=0;
|
|
||||||
else
|
|
||||||
set_if_smaller(char_length, (uint) length);
|
|
||||||
}
|
}
|
||||||
fix_char_length(char_length);
|
fix_char_length(char_length);
|
||||||
}
|
}
|
||||||
@ -2969,25 +2987,14 @@ bool Item_func_repeat::fix_length_and_dec()
|
|||||||
DBUG_ASSERT(collation.collation != NULL);
|
DBUG_ASSERT(collation.collation != NULL);
|
||||||
if (args[1]->const_item() && !args[1]->is_expensive())
|
if (args[1]->const_item() && !args[1]->is_expensive())
|
||||||
{
|
{
|
||||||
Longlong_hybrid nr= args[1]->to_longlong_hybrid();
|
Repeat_count tmp(args[1]);
|
||||||
if (args[1]->null_value || nr.neg())
|
ulonglong char_length= (ulonglong) args[0]->max_char_length() * tmp.count();
|
||||||
fix_char_length(0);
|
fix_char_length_ulonglong(char_length);
|
||||||
else
|
return false;
|
||||||
{
|
|
||||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
|
||||||
longlong count= nr.value();
|
|
||||||
if (count > INT_MAX32)
|
|
||||||
count= INT_MAX32;
|
|
||||||
ulonglong char_length= (ulonglong) args[0]->max_char_length() * count;
|
|
||||||
fix_char_length_ulonglong(char_length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
max_length= MAX_BLOB_WIDTH;
|
||||||
{
|
maybe_null= true;
|
||||||
max_length= MAX_BLOB_WIDTH;
|
return false;
|
||||||
maybe_null= 1;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3052,26 +3059,14 @@ err:
|
|||||||
bool Item_func_space::fix_length_and_dec()
|
bool Item_func_space::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
collation.set(default_charset(), DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII);
|
collation.set(default_charset(), DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII);
|
||||||
if (args[0]->const_item())
|
if (args[0]->const_item() && !args[0]->is_expensive())
|
||||||
{
|
{
|
||||||
/* must be longlong to avoid truncation */
|
fix_char_length_ulonglong(Repeat_count(args[0]).count());
|
||||||
longlong count= args[0]->val_int();
|
return false;
|
||||||
if (args[0]->null_value)
|
|
||||||
goto end;
|
|
||||||
/*
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
if (count > INT_MAX32)
|
|
||||||
count= INT_MAX32;
|
|
||||||
fix_char_length_ulonglong(count);
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
|
||||||
max_length= MAX_BLOB_WIDTH;
|
max_length= MAX_BLOB_WIDTH;
|
||||||
maybe_null= 1;
|
maybe_null= true;
|
||||||
return FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3182,24 +3177,15 @@ bool Item_func_pad::fix_length_and_dec()
|
|||||||
pad_str.append(" ", 1);
|
pad_str.append(" ", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args[1]->const_item())
|
DBUG_ASSERT(collation.collation->mbmaxlen > 0);
|
||||||
|
if (args[1]->const_item() && !args[1]->is_expensive())
|
||||||
{
|
{
|
||||||
ulonglong char_length= (ulonglong) args[1]->val_int();
|
fix_char_length(Repeat_count(args[1]).count());
|
||||||
DBUG_ASSERT(collation.collation->mbmaxlen > 0);
|
return false;
|
||||||
/* 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. */
|
|
||||||
if (args[1]->null_value)
|
|
||||||
char_length= 0;
|
|
||||||
else if (char_length > INT_MAX32)
|
|
||||||
char_length= INT_MAX32;
|
|
||||||
fix_char_length_ulonglong(char_length);
|
|
||||||
}
|
}
|
||||||
else
|
max_length= MAX_BLOB_WIDTH;
|
||||||
{
|
maybe_null= true;
|
||||||
max_length= MAX_BLOB_WIDTH;
|
return false;
|
||||||
maybe_null= 1;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user