mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
BUG#20492: Subsequent calls to stored procedure yield incorrect result
if join is used For procedures with selects that use complicated joins with ON expression re-execution could erroneously ignore this ON expression, giving incorrect result. The problem was that optimized ON expression wasn't saved for re-execution. The solution is to properly save it. mysql-test/r/sp.result: Add result for bug#20492: Subsequent calls to stored procedure yield incorrect result if join is used. mysql-test/t/sp.test: Add test case for bug#20492: Subsequent calls to stored procedure yield incorrect result if join is used. sql/sql_select.cc: Save modified ON expression for re-execution.
This commit is contained in:
@ -5394,4 +5394,30 @@ Procedure sql_mode Create Procedure
|
|||||||
bug21416 CREATE DEFINER=`root`@`localhost` PROCEDURE `bug21416`()
|
bug21416 CREATE DEFINER=`root`@`localhost` PROCEDURE `bug21416`()
|
||||||
show create procedure bug21416
|
show create procedure bug21416
|
||||||
drop procedure bug21416|
|
drop procedure bug21416|
|
||||||
|
DROP PROCEDURE IF EXISTS p1|
|
||||||
|
DROP VIEW IF EXISTS v1, v2|
|
||||||
|
DROP TABLE IF EXISTS t3, t4|
|
||||||
|
CREATE TABLE t3 (t3_id INT)|
|
||||||
|
INSERT INTO t3 VALUES (0)|
|
||||||
|
INSERT INTO t3 VALUES (1)|
|
||||||
|
CREATE TABLE t4 (t4_id INT)|
|
||||||
|
INSERT INTO t4 VALUES (2)|
|
||||||
|
CREATE VIEW v1 AS
|
||||||
|
SELECT t3.t3_id, t4.t4_id
|
||||||
|
FROM t3 JOIN t4 ON t3.t3_id = 0|
|
||||||
|
CREATE VIEW v2 AS
|
||||||
|
SELECT t3.t3_id AS t3_id_1, v1.t3_id AS t3_id_2, v1.t4_id
|
||||||
|
FROM t3 LEFT JOIN v1 ON t3.t3_id = 0|
|
||||||
|
CREATE PROCEDURE p1() SELECT * FROM v2|
|
||||||
|
CALL p1()|
|
||||||
|
t3_id_1 t3_id_2 t4_id
|
||||||
|
0 0 2
|
||||||
|
1 NULL NULL
|
||||||
|
CALL p1()|
|
||||||
|
t3_id_1 t3_id_2 t4_id
|
||||||
|
0 0 2
|
||||||
|
1 NULL NULL
|
||||||
|
DROP PROCEDURE p1|
|
||||||
|
DROP VIEW v1, v2|
|
||||||
|
DROP TABLE t3, t4|
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
@ -6322,6 +6322,47 @@ create procedure bug21416() show create procedure bug21416|
|
|||||||
call bug21416()|
|
call bug21416()|
|
||||||
drop procedure bug21416|
|
drop procedure bug21416|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#20492: Subsequent calls to stored procedure yeild incorrect
|
||||||
|
# result if join is used
|
||||||
|
#
|
||||||
|
# Optimized ON expression in join wasn't properly saved for reuse.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP PROCEDURE IF EXISTS p1|
|
||||||
|
DROP VIEW IF EXISTS v1, v2|
|
||||||
|
DROP TABLE IF EXISTS t3, t4|
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t3 (t3_id INT)|
|
||||||
|
|
||||||
|
INSERT INTO t3 VALUES (0)|
|
||||||
|
INSERT INTO t3 VALUES (1)|
|
||||||
|
|
||||||
|
CREATE TABLE t4 (t4_id INT)|
|
||||||
|
|
||||||
|
INSERT INTO t4 VALUES (2)|
|
||||||
|
|
||||||
|
CREATE VIEW v1 AS
|
||||||
|
SELECT t3.t3_id, t4.t4_id
|
||||||
|
FROM t3 JOIN t4 ON t3.t3_id = 0|
|
||||||
|
|
||||||
|
CREATE VIEW v2 AS
|
||||||
|
SELECT t3.t3_id AS t3_id_1, v1.t3_id AS t3_id_2, v1.t4_id
|
||||||
|
FROM t3 LEFT JOIN v1 ON t3.t3_id = 0|
|
||||||
|
|
||||||
|
CREATE PROCEDURE p1() SELECT * FROM v2|
|
||||||
|
|
||||||
|
# Results should not differ.
|
||||||
|
CALL p1()|
|
||||||
|
CALL p1()|
|
||||||
|
|
||||||
|
DROP PROCEDURE p1|
|
||||||
|
DROP VIEW v1, v2|
|
||||||
|
DROP TABLE t3, t4|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#NNNN: New bug synopsis
|
# BUG#NNNN: New bug synopsis
|
||||||
#
|
#
|
||||||
|
@ -7427,9 +7427,14 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top)
|
|||||||
*/
|
*/
|
||||||
expr= simplify_joins(join, &nested_join->join_list,
|
expr= simplify_joins(join, &nested_join->join_list,
|
||||||
expr, FALSE);
|
expr, FALSE);
|
||||||
table->on_expr= expr;
|
|
||||||
if (!table->prep_on_expr)
|
if (!table->prep_on_expr || expr != table->on_expr)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(expr);
|
||||||
|
|
||||||
|
table->on_expr= expr;
|
||||||
table->prep_on_expr= expr->copy_andor_structure(join->thd);
|
table->prep_on_expr= expr->copy_andor_structure(join->thd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nested_join->used_tables= (table_map) 0;
|
nested_join->used_tables= (table_map) 0;
|
||||||
nested_join->not_null_tables=(table_map) 0;
|
nested_join->not_null_tables=(table_map) 0;
|
||||||
@ -7439,7 +7444,7 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(table->prep_on_expr))
|
if (!table->prep_on_expr)
|
||||||
table->prep_on_expr= table->on_expr;
|
table->prep_on_expr= table->on_expr;
|
||||||
used_tables= table->table->map;
|
used_tables= table->table->map;
|
||||||
if (conds)
|
if (conds)
|
||||||
|
Reference in New Issue
Block a user