diff options
author | Georgi Kodinov <kgeorge@mysql.com> | 2008-10-17 17:55:06 +0300 |
---|---|---|
committer | Georgi Kodinov <kgeorge@mysql.com> | 2008-10-17 17:55:06 +0300 |
commit | a0e3001cdbe8a308e01f984a006cc003c82ebd82 (patch) | |
tree | 9cc59e113b7bc151b40b190f7fc2e5bb12aa8534 /sql/sql_select.cc | |
parent | 4ab10baace0960f18a843beb880c99b6cd9ca2e3 (diff) | |
download | mariadb-git-a0e3001cdbe8a308e01f984a006cc003c82ebd82.tar.gz |
Bug #33811: Call to stored procedure with SELECT * / RIGHT JOIN
fails after the first time
Two separate problems :
1. When flattening joins the linked list used for name resolution
(next_name_resolution_table) was not updated.
Fixed by updating the pointers when extending the table list
2. The items created by expanding a * (star) as a column reference
were marked as fixed, but no cached table was assigned to them
(unlike what Item_field::fix_fields does).
Fixed by assigning a cached table (so the re-preparation is done
faster).
Note that the fix for #2 hides the fix for #1 in most cases
(except when a table reference cannot be cached).
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 14 |
1 files changed, 12 insertions, 2 deletions
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); } |