mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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 view if exists t1,t2,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
use test;
|
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
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
|
||||||
DROP VIEW v1,v2;
|
DROP VIEW v1,v2;
|
||||||
DROP TABLE t1,t2,t3;
|
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
|
--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 view if exists t1,t2,`t1a``b`,v1,v2,v3,v4,v5,v6;
|
||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
@ -2189,4 +2189,26 @@ EXPLAIN SELECT * FROM v2 WHERE a=1;
|
|||||||
DROP VIEW v1,v2;
|
DROP VIEW v1,v2;
|
||||||
DROP TABLE t1,t2,t3;
|
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
|
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;
|
prep_where= *conds;
|
||||||
*conds= where= prep_where->copy_andor_structure(thd);
|
*conds= where= prep_where->copy_andor_structure(thd);
|
||||||
}
|
}
|
||||||
for (TABLE_LIST *tbl= (TABLE_LIST *)table_list.first;
|
fix_prepare_info_in_table_list(thd, (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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user