Skip to content
Permalink
Browse files

MDEV-10148: Database crashes in the query to the View

Fix st_select_lex::is_merged_child_of to work across merged views or
derived tables.
  • Loading branch information...
spetrunia committed Dec 16, 2016
1 parent 268bb69 commit f23b41b9b8a30e0e54a1ec7a8923057b0e57e0f5
Showing with 78 additions and 0 deletions.
  1. +35 −0 mysql-test/r/subselect2.result
  2. +37 −0 mysql-test/t/subselect2.test
  3. +6 −0 sql/sql_lex.cc
@@ -348,4 +348,39 @@ where t1.a = t2.a and ( t1.a = ( select min(a) from t1 ) or 0 );
a a a
FRA FRA FRA
drop table t1,t2,t3;
#
# MDEV-10148: Database crashes in the query to the View
#
CREATE TABLE t1 (
key_code INT(11) NOT NULL,
value_string VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (key_code)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;
CREATE TABLE t2 (
key_code INT(11) NOT NULL,
target_date DATE NULL DEFAULT NULL,
PRIMARY KEY (key_code)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;
CREATE TABLE t3 (
now_date DATE NOT NULL,
PRIMARY KEY (now_date)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;
CREATE VIEW v1
AS
SELECT
B.key_code,
B.target_date
FROM
t2 B INNER JOIN t3 C ON
B.target_date = C.now_date
;
SET @s = 'SELECT A.* FROM t1 A WHERE A.key_code IN (SELECT key_code FROM v1)';
PREPARE stmt FROM @s;
EXECUTE stmt;
key_code value_string
EXECUTE stmt;
key_code value_string
DEALLOCATE PREPARE stmt;
DROP VIEW v1;
DROP TABLE t1,t2,t3;
set optimizer_switch=@subselect2_test_tmp;
@@ -359,5 +359,42 @@ where t1.a = t2.a and ( t1.a = ( select min(a) from t1 ) or 0 );

drop table t1,t2,t3;

--echo #
--echo # MDEV-10148: Database crashes in the query to the View
--echo #
CREATE TABLE t1 (
key_code INT(11) NOT NULL,
value_string VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (key_code)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;

CREATE TABLE t2 (
key_code INT(11) NOT NULL,
target_date DATE NULL DEFAULT NULL,
PRIMARY KEY (key_code)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;

CREATE TABLE t3 (
now_date DATE NOT NULL,
PRIMARY KEY (now_date)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;

CREATE VIEW v1
AS
SELECT
B.key_code,
B.target_date
FROM
t2 B INNER JOIN t3 C ON
B.target_date = C.now_date
;
SET @s = 'SELECT A.* FROM t1 A WHERE A.key_code IN (SELECT key_code FROM v1)';
PREPARE stmt FROM @s;
EXECUTE stmt; #1st time -> success
EXECUTE stmt; #2nd time -> crash
DEALLOCATE PREPARE stmt;
DROP VIEW v1;
DROP TABLE t1,t2,t3;

set optimizer_switch=@subselect2_test_tmp;

@@ -4247,6 +4247,12 @@ bool st_select_lex::is_merged_child_of(st_select_lex *ancestor)
{
continue;
}

if (sl->master_unit()->derived &&
sl->master_unit()->derived->is_merged_derived())
{
continue;
}
all_merged= FALSE;
break;
}

0 comments on commit f23b41b

Please sign in to comment.
You can’t perform that action at this time.