diff options
author | Michael Widenius <monty@askmonty.org> | 2014-01-26 21:48:23 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2014-01-26 21:48:23 +0100 |
commit | fb018850dc04f15234e3b1afdfb5911f28f9ecb9 (patch) | |
tree | f88c8c8a1c22da1a9904a1662bdc87234d416fe0 /sql | |
parent | 6e699eb409df090fd3ac77d68d11e31990405954 (diff) | |
download | mariadb-git-fb018850dc04f15234e3b1afdfb5911f28f9ecb9.tar.gz |
Fixed that setup_natural_join_row_types can safely be called twice
sql/item.h:
Added cache for setup_natural_join_row_types
sql/sql_base.cc:
Cache old value of first_name_resolution_table for next call.
(It's not safe to try to recalculate the value as the join structure may have been changed by the optimizer)
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.h | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/sql/item.h b/sql/item.h index c4fe24bf482..20b7104bcda 100644 --- a/sql/item.h +++ b/sql/item.h @@ -332,6 +332,8 @@ struct Name_resolution_context: Sql_alloc */ TABLE_LIST *last_name_resolution_table; + /* Cache first_name_resolution_table in setup_natural_join_row_types */ + TABLE_LIST *natural_join_first_table; /* SELECT_LEX item belong to, in case of merged VIEW it can differ from SELECT_LEX where item was created, so we can't use table_list/field_list diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 1dbb23226ef..723c4f2c50d 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7925,6 +7925,11 @@ err: order, thus when we iterate over it, we are moving from the right to the left in the FROM clause. + NOTES + We can't run this many times as the first_name_resolution_table would + be different for subsequent runs when sub queries has been optimized + away. + RETURN TRUE Error FALSE OK @@ -7946,7 +7951,8 @@ static bool setup_natural_join_row_types(THD *thd, */ if (!context->select_lex->first_natural_join_processing) { - DBUG_PRINT("info", ("using cached store_top_level_join_columns")); + context->first_name_resolution_table= context->natural_join_first_table; + DBUG_PRINT("info", ("using cached setup_natural_join_row_types")); DBUG_RETURN(false); } context->select_lex->first_natural_join_processing= false; @@ -7989,6 +7995,11 @@ static bool setup_natural_join_row_types(THD *thd, DBUG_ASSERT(right_neighbor); context->first_name_resolution_table= right_neighbor->first_leaf_for_name_resolution(); + /* + This is only to ensure that first_name_resolution_table doesn't + change on re-execution + */ + context->natural_join_first_table= context->first_name_resolution_table; DBUG_RETURN (false); } |