mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug #28492: subselect returns LONG in >5.0.24a and LONGLONG in <=5.0.24a
Integer values with 10 digits may or may not fit into an int column (e.g. 2147483647 vs 6147483647). Thus when creating a temp table column for such an int we must use bigint instead. Fixed to use bigint. Also subsituted a "magic number" with a named constant.
This commit is contained in:
@ -39,10 +39,10 @@ t2 CREATE TABLE `t2` (
|
|||||||
`Field_name` varbinary(255) NOT NULL default '',
|
`Field_name` varbinary(255) NOT NULL default '',
|
||||||
`Min_value` varbinary(255) default NULL,
|
`Min_value` varbinary(255) default NULL,
|
||||||
`Max_value` varbinary(255) default NULL,
|
`Max_value` varbinary(255) default NULL,
|
||||||
`Min_length` int(11) NOT NULL default '0',
|
`Min_length` bigint(11) NOT NULL default '0',
|
||||||
`Max_length` int(11) NOT NULL default '0',
|
`Max_length` bigint(11) NOT NULL default '0',
|
||||||
`Empties_or_zeros` int(11) NOT NULL default '0',
|
`Empties_or_zeros` bigint(11) NOT NULL default '0',
|
||||||
`Nulls` int(11) NOT NULL default '0',
|
`Nulls` bigint(11) NOT NULL default '0',
|
||||||
`Avg_value_or_avg_length` varbinary(255) NOT NULL default '',
|
`Avg_value_or_avg_length` varbinary(255) NOT NULL default '',
|
||||||
`Std` varbinary(255) default NULL,
|
`Std` varbinary(255) default NULL,
|
||||||
`Optimal_fieldtype` varbinary(64) NOT NULL default ''
|
`Optimal_fieldtype` varbinary(64) NOT NULL default ''
|
||||||
@ -58,10 +58,10 @@ t2 CREATE TABLE `t2` (
|
|||||||
`Field_name` varbinary(255) NOT NULL default '',
|
`Field_name` varbinary(255) NOT NULL default '',
|
||||||
`Min_value` varbinary(255) default NULL,
|
`Min_value` varbinary(255) default NULL,
|
||||||
`Max_value` varbinary(255) default NULL,
|
`Max_value` varbinary(255) default NULL,
|
||||||
`Min_length` int(11) NOT NULL default '0',
|
`Min_length` bigint(11) NOT NULL default '0',
|
||||||
`Max_length` int(11) NOT NULL default '0',
|
`Max_length` bigint(11) NOT NULL default '0',
|
||||||
`Empties_or_zeros` int(11) NOT NULL default '0',
|
`Empties_or_zeros` bigint(11) NOT NULL default '0',
|
||||||
`Nulls` int(11) NOT NULL default '0',
|
`Nulls` bigint(11) NOT NULL default '0',
|
||||||
`Avg_value_or_avg_length` varbinary(255) NOT NULL default '',
|
`Avg_value_or_avg_length` varbinary(255) NOT NULL default '',
|
||||||
`Std` varbinary(255) default NULL,
|
`Std` varbinary(255) default NULL,
|
||||||
`Optimal_fieldtype` varbinary(64) NOT NULL default ''
|
`Optimal_fieldtype` varbinary(64) NOT NULL default ''
|
||||||
@ -81,10 +81,10 @@ t2 CREATE TABLE `t2` (
|
|||||||
`Field_name` varbinary(255) NOT NULL default '',
|
`Field_name` varbinary(255) NOT NULL default '',
|
||||||
`Min_value` varbinary(255) default NULL,
|
`Min_value` varbinary(255) default NULL,
|
||||||
`Max_value` varbinary(255) default NULL,
|
`Max_value` varbinary(255) default NULL,
|
||||||
`Min_length` int(11) NOT NULL default '0',
|
`Min_length` bigint(11) NOT NULL default '0',
|
||||||
`Max_length` int(11) NOT NULL default '0',
|
`Max_length` bigint(11) NOT NULL default '0',
|
||||||
`Empties_or_zeros` int(11) NOT NULL default '0',
|
`Empties_or_zeros` bigint(11) NOT NULL default '0',
|
||||||
`Nulls` int(11) NOT NULL default '0',
|
`Nulls` bigint(11) NOT NULL default '0',
|
||||||
`Avg_value_or_avg_length` varbinary(255) NOT NULL default '',
|
`Avg_value_or_avg_length` varbinary(255) NOT NULL default '',
|
||||||
`Std` varbinary(255) default NULL,
|
`Std` varbinary(255) default NULL,
|
||||||
`Optimal_fieldtype` varbinary(64) NOT NULL default ''
|
`Optimal_fieldtype` varbinary(64) NOT NULL default ''
|
||||||
|
@ -130,3 +130,14 @@ def v3 renamed 8 12 0 Y 32896 0 63
|
|||||||
renamed
|
renamed
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop view v1,v2,v3;
|
drop view v1,v2,v3;
|
||||||
|
select a.* from (select 2147483648 as v_large) a;
|
||||||
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
|
def a v_large v_large 8 10 10 N 32769 0 63
|
||||||
|
v_large
|
||||||
|
2147483648
|
||||||
|
select a.* from (select 214748364 as v_small) a;
|
||||||
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
|
def a v_small v_small 3 9 9 N 32769 0 63
|
||||||
|
v_small
|
||||||
|
214748364
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -696,8 +696,8 @@ CREATE VIEW v1 AS
|
|||||||
SELECT a, LENGTH(a), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP;
|
SELECT a, LENGTH(a), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP;
|
||||||
DESC v1;
|
DESC v1;
|
||||||
Field Type Null Key Default Extra
|
Field Type Null Key Default Extra
|
||||||
a int(11) YES 0
|
a bigint(11) YES NULL
|
||||||
LENGTH(a) int(10) YES NULL
|
LENGTH(a) bigint(10) YES NULL
|
||||||
COUNT(*) bigint(21) NO 0
|
COUNT(*) bigint(21) NO 0
|
||||||
SELECT * FROM v1;
|
SELECT * FROM v1;
|
||||||
a LENGTH(a) COUNT(*)
|
a LENGTH(a) COUNT(*)
|
||||||
|
@ -4909,7 +4909,7 @@ create table t3 as select * from v1|
|
|||||||
show create table t3|
|
show create table t3|
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t3 CREATE TABLE `t3` (
|
t3 CREATE TABLE `t3` (
|
||||||
`j` int(11) default NULL
|
`j` bigint(11) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
select * from t3|
|
select * from t3|
|
||||||
j
|
j
|
||||||
|
@ -2779,7 +2779,7 @@ CREATE TABLE t1 (i int, j int);
|
|||||||
CREATE VIEW v1 AS SELECT COALESCE(i,j) FROM t1;
|
CREATE VIEW v1 AS SELECT COALESCE(i,j) FROM t1;
|
||||||
DESCRIBE v1;
|
DESCRIBE v1;
|
||||||
Field Type Null Key Default Extra
|
Field Type Null Key Default Extra
|
||||||
COALESCE(i,j) int(11) YES NULL
|
COALESCE(i,j) bigint(11) YES NULL
|
||||||
CREATE TABLE t2 SELECT COALESCE(i,j) FROM t1;
|
CREATE TABLE t2 SELECT COALESCE(i,j) FROM t1;
|
||||||
DESCRIBE t2;
|
DESCRIBE t2;
|
||||||
Field Type Null Key Default Extra
|
Field Type Null Key Default Extra
|
||||||
|
@ -81,3 +81,14 @@ drop view v1,v2,v3;
|
|||||||
--disable_metadata
|
--disable_metadata
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #28492: subselect returns LONG in >5.0.24a and LONGLONG in <=5.0.24a
|
||||||
|
#
|
||||||
|
--enable_metadata
|
||||||
|
select a.* from (select 2147483648 as v_large) a;
|
||||||
|
select a.* from (select 214748364 as v_small) a;
|
||||||
|
--disable_metadata
|
||||||
|
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -675,7 +675,7 @@ public:
|
|||||||
void sort_string(char *buff,uint length);
|
void sort_string(char *buff,uint length);
|
||||||
uint32 pack_length() const { return 4; }
|
uint32 pack_length() const { return 4; }
|
||||||
void sql_type(String &str) const;
|
void sql_type(String &str) const;
|
||||||
uint32 max_display_length() { return 11; }
|
uint32 max_display_length() { return MY_INT32_NUM_DECIMAL_DIGITS; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -8869,8 +8869,13 @@ static Field *create_tmp_field_from_item(THD *thd, Item *item, TABLE *table,
|
|||||||
item->name, table, item->decimals, TRUE);
|
item->name, table, item->decimals, TRUE);
|
||||||
break;
|
break;
|
||||||
case INT_RESULT:
|
case INT_RESULT:
|
||||||
/* Select an integer type with the minimal fit precision */
|
/*
|
||||||
if (item->max_length > MY_INT32_NUM_DECIMAL_DIGITS)
|
Select an integer type with the minimal fit precision.
|
||||||
|
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
|
||||||
|
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
|
||||||
|
Field_long : make them Field_longlong.
|
||||||
|
*/
|
||||||
|
if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
|
||||||
new_field=new Field_longlong(item->max_length, maybe_null,
|
new_field=new Field_longlong(item->max_length, maybe_null,
|
||||||
item->name, table, item->unsigned_flag);
|
item->name, table, item->unsigned_flag);
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user