summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorGeorgi Kodinov <kgeorge@mysql.com>2008-10-17 17:55:06 +0300
committerGeorgi Kodinov <kgeorge@mysql.com>2008-10-17 17:55:06 +0300
commita0e3001cdbe8a308e01f984a006cc003c82ebd82 (patch)
tree9cc59e113b7bc151b40b190f7fc2e5bb12aa8534 /sql/sql_select.cc
parent4ab10baace0960f18a843beb880c99b6cd9ca2e3 (diff)
downloadmariadb-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.cc14
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);
}