From e32a1c923a1be736e6e99fed06de17c8cbd00ca1 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sun, 2 Nov 2003 13:53:38 +0200 Subject: [PATCH] fixed locking problem with innodb & subqueries (BUG#1708) tests with innodb moved to separate file --- mysql-test/r/subselect.result | 37 ----------------------------- mysql-test/t/subselect.test | 44 ----------------------------------- sql/sql_select.cc | 5 ++-- 3 files changed, 3 insertions(+), 83 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index db0c3184120..26a802af478 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1219,31 +1219,6 @@ drop table if exists t1; (SELECT 1 as a) UNION (SELECT 1) ORDER BY (SELECT a+0); a 1 -CREATE TABLE t1 -( -FOLDERID VARCHAR(32)BINARY NOT NULL -, FOLDERNAME VARCHAR(255)BINARY NOT NULL -, CREATOR VARCHAR(255)BINARY -, CREATED TIMESTAMP NOT NULL -, DESCRIPTION VARCHAR(255)BINARY -, FOLDERTYPE INTEGER NOT NULL -, MODIFIED TIMESTAMP -, MODIFIER VARCHAR(255)BINARY -, FOLDERSIZE INTEGER NOT NULL -, PARENTID VARCHAR(32)BINARY -, REPID VARCHAR(32)BINARY -, ORIGINATOR INTEGER -, PRIMARY KEY ( FOLDERID ) -) TYPE=InnoDB; -CREATE INDEX FFOLDERID_IDX ON t1 (FOLDERID); -CREATE INDEX CMFLDRPARNT_IDX ON t1 (PARENTID); -INSERT INTO t1 VALUES("0c9aab05b15048c59bc35c8461507deb", "System", "System", "2003-06-05 16:30:00", "The system content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "9c9aab05b15048c59bc35c8461507deb", "1"); -INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", "2003-06-09 10:52:02", "The default content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "03eea05112b845949f3fd03278b5fe43", "1"); -INSERT INTO t1 VALUES("c373e9f5ad0791724315444553544200", "AddDocumentTest", "admin", "2003-06-09 10:51:25", "Movie Reviews", "0", "2003-06-09 10:51:25", "admin", "0", "2f6161e879db43c1a5b82c21ddc49089", "03eea05112b845949f3fd03278b5fe43", NULL); -SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1'); -'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1') -0 -drop table t1; create table t1 (a int not null, b int, primary key (a)); create table t2 (a int not null, primary key (a)); create table t3 (a int not null, b int, primary key (a)); @@ -1351,18 +1326,6 @@ insert into t2 values (1); update t1 set s1 = s1 + 1 where 1 = (select x.s1 as A from t2 WHERE t2.s1 > t1.s1 order by A); ERROR 42S02: Unknown table 'x' in field list DROP TABLE t1, t2; -create table t1 (a int) type=innodb; -create table t2 (a int) type=innodb; -create table t3 (a int) type=innodb; -insert into t1 values (1),(2),(3),(4); -insert into t2 values (10),(20),(30),(40); -insert into t3 values (1),(2),(10),(50); -select a from t3 where t3.a in (select a from t1 where a <= 3 union select * from t2 where a <= 30); -a -1 -2 -10 -drop table t1,t2,t3; CREATE TABLE t1 (s1 CHAR(5) COLLATE latin1_german1_ci, s2 CHAR(5) COLLATE latin1_swedish_ci); INSERT INTO t1 VALUES ('z','?'); diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 576e96c5c18..b601838c378 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -784,36 +784,6 @@ drop table if exists t1; (SELECT 1 as a) UNION (SELECT 1) ORDER BY (SELECT a+0); -# -# key field overflow test -# ---disable_warnings -CREATE TABLE t1 -( -FOLDERID VARCHAR(32)BINARY NOT NULL -, FOLDERNAME VARCHAR(255)BINARY NOT NULL -, CREATOR VARCHAR(255)BINARY -, CREATED TIMESTAMP NOT NULL -, DESCRIPTION VARCHAR(255)BINARY -, FOLDERTYPE INTEGER NOT NULL -, MODIFIED TIMESTAMP -, MODIFIER VARCHAR(255)BINARY -, FOLDERSIZE INTEGER NOT NULL -, PARENTID VARCHAR(32)BINARY -, REPID VARCHAR(32)BINARY -, ORIGINATOR INTEGER - -, PRIMARY KEY ( FOLDERID ) -) TYPE=InnoDB; ---enable_warnings -CREATE INDEX FFOLDERID_IDX ON t1 (FOLDERID); -CREATE INDEX CMFLDRPARNT_IDX ON t1 (PARENTID); -INSERT INTO t1 VALUES("0c9aab05b15048c59bc35c8461507deb", "System", "System", "2003-06-05 16:30:00", "The system content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "9c9aab05b15048c59bc35c8461507deb", "1"); -INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", "2003-06-09 10:52:02", "The default content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "03eea05112b845949f3fd03278b5fe43", "1"); -INSERT INTO t1 VALUES("c373e9f5ad0791724315444553544200", "AddDocumentTest", "admin", "2003-06-09 10:51:25", "Movie Reviews", "0", "2003-06-09 10:51:25", "admin", "0", "2f6161e879db43c1a5b82c21ddc49089", "03eea05112b845949f3fd03278b5fe43", NULL); -SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1'); -drop table t1; - # # IN subselect optimization test # @@ -891,20 +861,6 @@ insert into t2 values (1); update t1 set s1 = s1 + 1 where 1 = (select x.s1 as A from t2 WHERE t2.s1 > t1.s1 order by A); DROP TABLE t1, t2; -# -# UNION unlocking test -# ---disable_warnings -create table t1 (a int) type=innodb; -create table t2 (a int) type=innodb; -create table t3 (a int) type=innodb; ---enable_warnings -insert into t1 values (1),(2),(3),(4); -insert into t2 values (10),(20),(30),(40); -insert into t3 values (1),(2),(10),(50); -select a from t3 where t3.a in (select a from t1 where a <= 3 union select * from t2 where a <= 30); -drop table t1,t2,t3; - # # collation test # diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 65515ce7ad9..400919779a2 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3684,7 +3684,7 @@ join_free(JOIN *join, bool full) free_io_cache(join->table[join->const_tables]); filesort_free_buffers(join->table[join->const_tables]); } - if (join->select_lex->dependent && !full) + if (!full && join->select_lex->dependent) { for (tab=join->join_tab,end=tab+join->tables ; tab != end ; tab++) { @@ -3736,7 +3736,8 @@ join_free(JOIN *join, bool full) We are not using tables anymore Unlock all tables. We may be in an INSERT .... SELECT statement. */ - if (join->lock && join->thd->lock && + if ((full || !join->select_lex->dependent) && + join->lock && join->thd->lock && !(join->select_options & SELECT_NO_UNLOCK)) { mysql_unlock_read_tables(join->thd, join->lock);// Don't free join->lock