diff options
author | jani@rhols221.adsl.netsonic.fi <> | 2004-01-29 01:16:24 +0200 |
---|---|---|
committer | jani@rhols221.adsl.netsonic.fi <> | 2004-01-29 01:16:24 +0200 |
commit | 85b00b7fb5288cf93360cc0ba5401eb37edc8ae8 (patch) | |
tree | 7decb199e3be93935d478081d28ccce1827cc3fe | |
parent | a70ae4375a88a7f8f90efd1a3601770f8be75456 (diff) | |
download | mariadb-git-85b00b7fb5288cf93360cc0ba5401eb37edc8ae8.tar.gz |
Fixed Bug#2479, "dependant subquery with limit crash".
The problem was that memory was free'd, but it was referenced
later. This free was unneccessary anyway, because join_free() /
JOIN::cleanup takes care of this later on.
Added test case into t/subselect.test for it.
Regards,
Jani
-rw-r--r-- | mysql-test/r/subselect.result | 47 | ||||
-rw-r--r-- | mysql-test/t/subselect.test | 54 | ||||
-rw-r--r-- | sql/sql_select.cc | 1 |
3 files changed, 101 insertions, 1 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index ded98265a1c..a398b13498b 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1578,3 +1578,50 @@ select * from t1; a b 1 0.123 drop table t1; +CREATE TABLE tab_01 ( +id int(11) NOT NULL auto_increment, +ts timestamp NOT NULL, +id_cns tinyint(3) unsigned NOT NULL default '0', +id_desc_nota int(11) NOT NULL default '1', +id_publ_uff int(11) NOT NULL default '0', +tipo enum('','UNO','DUE') NOT NULL default '', +f_aggiunte set('TRE','TRETRE','QUATTRO','CINQUE','SEI','SETTE') NOT NULL +default '', +anno_dep smallint(4) unsigned zerofill NOT NULL default '0000', +data_dep smallint(4) unsigned zerofill NOT NULL default '0000', +particolare mediumint(8) unsigned NOT NULL default '0', +generale mediumint(8) unsigned NOT NULL default '0', +bis tinyint(3) unsigned NOT NULL default '0', +PRIMARY KEY(id), +UNIQUE KEY idx_cns_gen_anno (anno_dep,id_cns,generale,particolare), +UNIQUE KEY idx_cns_par_anno (id_cns,anno_dep,tipo,particolare,bis) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; +INSERT INTO tab_01 (id, ts, id_cns, id_desc_nota, id_publ_uff, tipo, f_aggiunte, +anno_dep, data_dep, particolare, generale, bis) VALUES +(NULL, NULL, 16, 29, 622, 'UNO', '', 1987, 1218, 2048, 9681, 0), +(NULL, NULL, 50, 23, 1717, 'UNO', '', 1987, 1126, 1536, 13987, 0), +(NULL, NULL, 16, 123, 123, 'UNO', '', 1987, 1221, 2432, 14594, 0), +(NULL, NULL, 16, 124, 124, 'UNO', '', 1987, 1201, 1792, 13422, 0), +(NULL, NULL, 16, 125, 125, 'UNO', '', 1987, 0723, 1025, 10240, 0), +(NULL, NULL, 16, 126, 126, 'UNO', '', 1987, 1204, 1026, 7089, 0); +CREATE TABLE tab_02 ( +id tinyint(3) unsigned NOT NULL auto_increment, +descr varchar(40) NOT NULL default '', +f_servizi set('UNO','DUE') NOT NULL default '', +data_uno_min int(8) unsigned NOT NULL default '0', +data_due_min int(8) unsigned NOT NULL default '0', +max_anno_dep smallint(6) unsigned NOT NULL default '0', +data_agg int(8) unsigned NOT NULL default '0', +PRIMARY KEY (id) +); +INSERT INTO tab_02 (id, descr, f_servizi, data_uno_min, data_due_min, +max_anno_dep, data_agg) VALUES +(16, 'C_UNO', 'UNO,DUE', 19000000, 30000000, 1987, 0), +(50, 'C_TRE', 'UNO', 19000000, 30000000, 1990, 0); +SELECT cns.max_anno_dep = (SELECT s.anno_dep FROM tab_01 AS s WHERE +s.id_cns = cns.id ORDER BY s.anno_dep DESC LIMIT 1) AS PIPPO FROM +tab_02 AS cns; +PIPPO +1 +NULL +DROP TABLE tab_01, tab_02; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 37dbc8f24d9..55ca8afe7fd 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1021,3 +1021,57 @@ delete from t1; load data infile "subselect.out.file.1" into table t1; select * from t1; drop table t1; + +# +# Bug 2479 +# + +CREATE TABLE tab_01 ( +id int(11) NOT NULL auto_increment, +ts timestamp NOT NULL, +id_cns tinyint(3) unsigned NOT NULL default '0', +id_desc_nota int(11) NOT NULL default '1', +id_publ_uff int(11) NOT NULL default '0', +tipo enum('','UNO','DUE') NOT NULL default '', +f_aggiunte set('TRE','TRETRE','QUATTRO','CINQUE','SEI','SETTE') NOT NULL +default '', +anno_dep smallint(4) unsigned zerofill NOT NULL default '0000', +data_dep smallint(4) unsigned zerofill NOT NULL default '0000', +particolare mediumint(8) unsigned NOT NULL default '0', +generale mediumint(8) unsigned NOT NULL default '0', +bis tinyint(3) unsigned NOT NULL default '0', +PRIMARY KEY(id), +UNIQUE KEY idx_cns_gen_anno (anno_dep,id_cns,generale,particolare), +UNIQUE KEY idx_cns_par_anno (id_cns,anno_dep,tipo,particolare,bis) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; + +INSERT INTO tab_01 (id, ts, id_cns, id_desc_nota, id_publ_uff, tipo, f_aggiunte, +anno_dep, data_dep, particolare, generale, bis) VALUES +(NULL, NULL, 16, 29, 622, 'UNO', '', 1987, 1218, 2048, 9681, 0), +(NULL, NULL, 50, 23, 1717, 'UNO', '', 1987, 1126, 1536, 13987, 0), +(NULL, NULL, 16, 123, 123, 'UNO', '', 1987, 1221, 2432, 14594, 0), +(NULL, NULL, 16, 124, 124, 'UNO', '', 1987, 1201, 1792, 13422, 0), +(NULL, NULL, 16, 125, 125, 'UNO', '', 1987, 0723, 1025, 10240, 0), +(NULL, NULL, 16, 126, 126, 'UNO', '', 1987, 1204, 1026, 7089, 0); + +CREATE TABLE tab_02 ( +id tinyint(3) unsigned NOT NULL auto_increment, +descr varchar(40) NOT NULL default '', +f_servizi set('UNO','DUE') NOT NULL default '', +data_uno_min int(8) unsigned NOT NULL default '0', +data_due_min int(8) unsigned NOT NULL default '0', +max_anno_dep smallint(6) unsigned NOT NULL default '0', +data_agg int(8) unsigned NOT NULL default '0', +PRIMARY KEY (id) +); + +INSERT INTO tab_02 (id, descr, f_servizi, data_uno_min, data_due_min, +max_anno_dep, data_agg) VALUES +(16, 'C_UNO', 'UNO,DUE', 19000000, 30000000, 1987, 0), +(50, 'C_TRE', 'UNO', 19000000, 30000000, 1990, 0); + +SELECT cns.max_anno_dep = (SELECT s.anno_dep FROM tab_01 AS s WHERE +s.id_cns = cns.id ORDER BY s.anno_dep DESC LIMIT 1) AS PIPPO FROM +tab_02 AS cns; + +DROP TABLE tab_01, tab_02; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index e4f7214ad00..f6e7a474eca 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7200,7 +7200,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, table->sort.found_records=filesort(thd, table,sortorder, length, select, filesort_limit, &examined_rows); tab->records=table->sort.found_records; // For SQL_CALC_ROWS - delete select; // filesort did select tab->select=0; tab->select_cond=0; tab->type=JT_ALL; // Read with normal read_record |