mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
a7ed6ce441
Procedure analyse() redefines select's fields_list. setup_copy_fields() assumes that fields_list is a part of all_fields_list. Because select have only 3 columns and analyse() redefines it to have 10 columns, int overrun in setup_copy_fields() occurs and server goes to almost infinite loop. Because fields_list used not only to send data ad fields types, it's wrong to allow procedure redefine it. This patch separates select's fileds_list and procedure's one. Now if procedure is present, copy of fields_list is created in procedure_fields_list and it is used for sending data and fields. mysql-test/t/analyse.test: Test case for bug #14138 ROLLUP and PROCEDURE ANALYSE() hang server mysql-test/r/analyse.result: Test case for bug #14138 ROLLUP and PROCEDURE ANALYSE() hang server sql/sql_select.h: Fix bug #14138 ROLLUP and PROCEDURE ANALYSE() hang server To JOIN Added separate fields_list for procedure. sql/sql_select.cc: Fix bug #14138 ROLLUP and PROCEDURE ANALYSE() hang server SELECT's fields_list and procedure's fields_list made split. If procedure is defined then procedure's fields_list is used to send fields and data.
136 lines
7.3 KiB
Text
136 lines
7.3 KiB
Text
drop table if exists t1,t2;
|
|
create table t1 (i int, j int, empty_string char(10), bool char(1), d date);
|
|
insert into t1 values (1,2,"","Y","2002-03-03"), (3,4,"","N","2002-03-04"), (5,6,"","Y","2002-03-04"), (7,8,"","N","2002-03-05");
|
|
select count(*) from t1 procedure analyse();
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
count(*) 4 4 1 1 0 0 4.0000 0.0000 ENUM('4') NOT NULL
|
|
select * from t1 procedure analyse();
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
|
|
test.t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
|
|
test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
|
|
test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
|
|
test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
|
|
select * from t1 procedure analyse(2);
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.i 1 7 1 1 0 0 4.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL
|
|
test.t1.j 2 8 1 1 0 0 5.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL
|
|
test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
|
|
test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
|
|
test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
|
|
create table t2 select * from t1 procedure analyse();
|
|
select * from t2;
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
|
|
test.t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
|
|
test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
|
|
test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
|
|
test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
|
|
drop table t1,t2;
|
|
EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
|
|
2 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
create table t1 (a int not null);
|
|
create table t2 select * from t1 where 0=1 procedure analyse();
|
|
show create table t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`Field_name` binary(255) NOT NULL default '',
|
|
`Min_value` binary(255) default NULL,
|
|
`Max_value` binary(255) default NULL,
|
|
`Min_length` bigint(11) NOT NULL default '0',
|
|
`Max_length` bigint(11) NOT NULL default '0',
|
|
`Empties_or_zeros` bigint(11) NOT NULL default '0',
|
|
`Nulls` bigint(11) NOT NULL default '0',
|
|
`Avg_value_or_avg_length` binary(255) NOT NULL default '',
|
|
`Std` binary(255) default NULL,
|
|
`Optimal_fieldtype` binary(64) NOT NULL default ''
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
select * from t1 where 0=1 procedure analyse();
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
insert into t1 values(1);
|
|
drop table t2;
|
|
create table t2 select * from t1 where 0=1 procedure analyse();
|
|
show create table t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`Field_name` binary(255) NOT NULL default '',
|
|
`Min_value` binary(255) default NULL,
|
|
`Max_value` binary(255) default NULL,
|
|
`Min_length` bigint(11) NOT NULL default '0',
|
|
`Max_length` bigint(11) NOT NULL default '0',
|
|
`Empties_or_zeros` bigint(11) NOT NULL default '0',
|
|
`Nulls` bigint(11) NOT NULL default '0',
|
|
`Avg_value_or_avg_length` binary(255) NOT NULL default '',
|
|
`Std` binary(255) default NULL,
|
|
`Optimal_fieldtype` binary(64) NOT NULL default ''
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
select * from t2;
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
insert into t2 select * from t1 procedure analyse();
|
|
select * from t2;
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.a 1 1 1 1 0 0 1.0000 0.0000 ENUM('1') NOT NULL
|
|
insert into t1 values(2);
|
|
drop table t2;
|
|
create table t2 select * from t1 where 0=1 procedure analyse();
|
|
show create table t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`Field_name` binary(255) NOT NULL default '',
|
|
`Min_value` binary(255) default NULL,
|
|
`Max_value` binary(255) default NULL,
|
|
`Min_length` bigint(11) NOT NULL default '0',
|
|
`Max_length` bigint(11) NOT NULL default '0',
|
|
`Empties_or_zeros` bigint(11) NOT NULL default '0',
|
|
`Nulls` bigint(11) NOT NULL default '0',
|
|
`Avg_value_or_avg_length` binary(255) NOT NULL default '',
|
|
`Std` binary(255) default NULL,
|
|
`Optimal_fieldtype` binary(64) NOT NULL default ''
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
select * from t2;
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
insert into t2 select * from t1 procedure analyse();
|
|
select * from t2;
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.a 1 2 1 1 0 0 1.5000 0.5000 ENUM('1','2') NOT NULL
|
|
drop table t1,t2;
|
|
create table t1 (v varchar(128));
|
|
insert into t1 values ('abc'),('abc\'def\\hij\"klm\0opq'),('\''),('\"'),('\\'),('a\0'),('b\''),('c\"'),('d\\'),('\'b'),('\"c'),('\\d'),('a\0\0\0b'),('a\'\'\'\'b'),('a\"\"\"\"b'),('a\\\\\\\\b'),('\'\0\\\"'),('\'\''),('\"\"'),('\\\\'),('The\ZEnd');
|
|
select * from t1 procedure analyse();
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.v " \\ 1 19 0 0 3.7619 NULL ENUM('"','""','"c','\'\0\\"','\'','\'\'','\'b','a\0\0\0b','a\0','a""""b','a\'\'\'\'b','abc','abc\'def\\hij"klm\0opq','a\\\\\\\\b','b\'','c"','d\\','The\ZEnd','\\','\\d','\\\\') NOT NULL
|
|
drop table t1;
|
|
create table t1 (d double);
|
|
insert into t1 values (100000);
|
|
select * from t1 procedure analyse (1,1);
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.d 100000 100000 6 6 0 0 100000 0 MEDIUMINT(6) UNSIGNED NOT NULL
|
|
drop table t1;
|
|
create table t1 (product varchar(32), country_id int not null, year int,
|
|
profit int);
|
|
insert into t1 values ( 'Computer', 2,2000, 1200),
|
|
( 'TV', 1, 1999, 150),
|
|
( 'Calculator', 1, 1999,50),
|
|
( 'Computer', 1, 1999,1500),
|
|
( 'Computer', 1, 2000,1500),
|
|
( 'TV', 1, 2000, 150),
|
|
( 'TV', 2, 2000, 100),
|
|
( 'TV', 2, 2000, 100),
|
|
( 'Calculator', 1, 2000,75),
|
|
( 'Calculator', 2, 2000,75),
|
|
( 'TV', 1, 1999, 100),
|
|
( 'Computer', 1, 1999,1200),
|
|
( 'Computer', 2, 2000,1500),
|
|
( 'Calculator', 2, 2000,75),
|
|
( 'Phone', 3, 2003,10)
|
|
;
|
|
create table t2 (country_id int primary key, country char(20) not null);
|
|
insert into t2 values (1, 'USA'),(2,'India'), (3,'Finland');
|
|
select product, sum(profit),avg(profit) from t1 group by product with rollup procedure analyse();
|
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
|
test.t1.product Computer TV 2 8 0 0 4.2500 NULL ENUM('Computer','Phone','TV') NOT NULL
|
|
sum(profit) 10 6900 2 4 0 0 1946 2868 ENUM('10','275','600','6900') NOT NULL
|
|
avg(profit) 10.0000 1380.0000 7 9 0 0 394.6875 570.2003 ENUM('10.0000','68.7500','120.0000','1380.0000') NOT NULL
|
|
drop table t1,t2;
|