mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#14026: When doing the end-of-prepare fix up for TABLE_LISTs used in the PS, do the fixup
for underlying tables of a merge VIEWs, too.
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
drop table if exists t1,t2,t9,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||
drop table if exists t1,t2,t3,t4,t9,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||
drop view if exists t1,t2,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||
drop database if exists mysqltest;
|
||||
use test;
|
||||
@ -2323,3 +2323,24 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1,t2,t3;
|
||||
create table t1 (x int, y int);
|
||||
create table t2 (x int, y int, z int);
|
||||
create table t3 (x int, y int, z int);
|
||||
create table t4 (x int, y int, z int);
|
||||
create view v1 as
|
||||
select t1.x
|
||||
from (
|
||||
(t1 join t2 on ((t1.y = t2.y)))
|
||||
join
|
||||
(t3 left join t4 on (t3.y = t4.y) and (t3.z = t4.z))
|
||||
);
|
||||
prepare stmt1 from "select count(*) from v1 where x = ?";
|
||||
set @parm1=1;
|
||||
execute stmt1 using @parm1;
|
||||
count(*)
|
||||
0
|
||||
execute stmt1 using @parm1;
|
||||
count(*)
|
||||
0
|
||||
drop view v1;
|
||||
drop table t1,t2,t3,t4;
|
||||
|
@ -1,5 +1,5 @@
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2,t9,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||
drop table if exists t1,t2,t3,t4,t9,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||
drop view if exists t1,t2,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||
drop database if exists mysqltest;
|
||||
--enable_warnings
|
||||
@ -2189,4 +2189,26 @@ EXPLAIN SELECT * FROM v2 WHERE a=1;
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1,t2,t3;
|
||||
|
||||
#
|
||||
# BUG#14026 Crash on second PS execution when using views
|
||||
#
|
||||
create table t1 (x int, y int);
|
||||
create table t2 (x int, y int, z int);
|
||||
create table t3 (x int, y int, z int);
|
||||
create table t4 (x int, y int, z int);
|
||||
|
||||
create view v1 as
|
||||
select t1.x
|
||||
from (
|
||||
(t1 join t2 on ((t1.y = t2.y)))
|
||||
join
|
||||
(t3 left join t4 on (t3.y = t4.y) and (t3.z = t4.z))
|
||||
);
|
||||
|
||||
prepare stmt1 from "select count(*) from v1 where x = ?";
|
||||
set @parm1=1;
|
||||
|
||||
execute stmt1 using @parm1;
|
||||
execute stmt1 using @parm1;
|
||||
drop view v1;
|
||||
drop table t1,t2,t3,t4;
|
||||
|
@ -2037,6 +2037,35 @@ void st_lex::cleanup_after_one_table_open()
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
|
||||
|
||||
SYNOPSIS
|
||||
fix_prepare_info_in_table_list()
|
||||
thd Thread handle
|
||||
tbl List of tables to process
|
||||
|
||||
DESCRIPTION
|
||||
Perform end-end-of prepare fixup for list of tables, if any of the tables
|
||||
is a merge-algorithm VIEW, recursively fix up its underlying tables as
|
||||
well.
|
||||
|
||||
*/
|
||||
|
||||
static void fix_prepare_info_in_table_list(THD *thd, TABLE_LIST *tbl)
|
||||
{
|
||||
for (; tbl; tbl= tbl->next_local)
|
||||
{
|
||||
if (tbl->on_expr)
|
||||
{
|
||||
tbl->prep_on_expr= tbl->on_expr;
|
||||
tbl->on_expr= tbl->on_expr->copy_andor_structure(thd);
|
||||
}
|
||||
fix_prepare_info_in_table_list(thd, tbl->merge_underlying_list);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
fix some structures at the end of preparation
|
||||
|
||||
@ -2056,16 +2085,7 @@ void st_select_lex::fix_prepare_information(THD *thd, Item **conds)
|
||||
prep_where= *conds;
|
||||
*conds= where= prep_where->copy_andor_structure(thd);
|
||||
}
|
||||
for (TABLE_LIST *tbl= (TABLE_LIST *)table_list.first;
|
||||
tbl;
|
||||
tbl= tbl->next_local)
|
||||
{
|
||||
if (tbl->on_expr)
|
||||
{
|
||||
tbl->prep_on_expr= tbl->on_expr;
|
||||
tbl->on_expr= tbl->on_expr->copy_andor_structure(thd);
|
||||
}
|
||||
}
|
||||
fix_prepare_info_in_table_list(thd, (TABLE_LIST *)table_list.first);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user