diff options
-rw-r--r-- | mysql-test/r/sp.result | 18 | ||||
-rw-r--r-- | mysql-test/t/sp.test | 15 | ||||
-rw-r--r-- | sql/sql_base.cc | 4 | ||||
-rw-r--r-- | sql/sql_select.cc | 14 |
4 files changed, 49 insertions, 2 deletions
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index dea51bb4c2c..ec00435548c 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -6646,6 +6646,24 @@ ttt 2 drop function func30787; drop table t1; +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3),(4); +CREATE PROCEDURE test_sp() +SELECT t1.* FROM t1 RIGHT JOIN t1 t2 ON t1.id=t2.id; +CALL test_sp(); +id +1 +2 +3 +4 +CALL test_sp(); +id +1 +2 +3 +4 +DROP PROCEDURE test_sp; +DROP TABLE t1; create table t1(c1 INT); create function f1(p1 int) returns varchar(32) return 'aaa'; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 6d7a4b96167..d5bb565cbc8 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -7793,6 +7793,21 @@ select (select func30787(f1)) as ttt from t1; drop function func30787; drop table t1; +# +# Bug #33811: Call to stored procedure with SELECT * / RIGHT JOIN fails +# after the first time +# +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3),(4); + +CREATE PROCEDURE test_sp() + SELECT t1.* FROM t1 RIGHT JOIN t1 t2 ON t1.id=t2.id; + +CALL test_sp(); +CALL test_sp(); + +DROP PROCEDURE test_sp; +DROP TABLE t1; # # Bug#38291 memory corruption and server crash with view/sp/function diff --git a/sql/sql_base.cc b/sql/sql_base.cc index d969c837891..873a3eac24e 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -5508,6 +5508,10 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name, if (!(item= field_iterator.create_item(thd))) DBUG_RETURN(TRUE); + DBUG_ASSERT(item->fixed); + /* cache the table for the Item_fields inserted by expanding stars */ + if (item->type() == Item::FIELD_ITEM && tables->cacheable_table) + ((Item_field *)item)->cached_table= tables; if (!found) { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7ff069f0996..8da520e78ff 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8268,6 +8268,8 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top) } /* Flatten nested joins that can be flattened. */ + TABLE_LIST *right_neighbor= NULL; + bool fix_name_res= FALSE; li.rewind(); while ((table= li++)) { @@ -8280,9 +8282,17 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top) { tbl->embedding= table->embedding; tbl->join_list= table->join_list; - } + } li.replace(nested_join->join_list); - } + /* Need to update the name resolution table chain when flattening joins */ + fix_name_res= TRUE; + table= *li.ref(); + } + if (fix_name_res) + table->next_name_resolution_table= right_neighbor ? + right_neighbor->first_leaf_for_name_resolution() : + NULL; + right_neighbor= table; } DBUG_RETURN(conds); } |