From ca119d390e1fd739419e5c5ab8122c21f3065a8a Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Apr 2005 02:43:56 +0300 Subject: if outer refernce (identifier) was resolved with help of cache all subqueries and resolved item itseld have to be correctly marked as dependent (BUG#10041) sql/item.cc: depended_from shoudl be cleaned layout fixed function to mark range of SELECTs as dependent (used if item was resolved with PS cache of resolving identifiers) sql/item.h: function to mark range of SELECTs as dependent (used if item was resolved with PS cache of resolving identifiers) sql/item_subselect.h: function to mark range of SELECTs as dependent (used if item was resolved with PS cache of resolving identifiers) sql/sql_base.cc: if outer refernce (identifier) was resolved with help of cache all subqueries and resolved item itseld have to be correctly marked as dependent --- sql/item.cc | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'sql/item.cc') diff --git a/sql/item.cc b/sql/item.cc index 73c8e80228b..805336e92f8 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -454,6 +454,7 @@ void Item_ident::cleanup() db_name= orig_db_name; table_name= orig_table_name; field_name= orig_field_name; + depended_from= 0; DBUG_VOID_RETURN; } @@ -2334,7 +2335,7 @@ bool Item_ref_null_helper::get_date(TIME *ltime, uint fuzzydate) */ static void mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current, - Item_ident *resolved_item, + Item_ident *resolved_item, Item_ident *mark_item) { const char *db_name= (resolved_item->db_name ? @@ -2359,6 +2360,71 @@ static void mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current, } +/* + Mark range of selects and resolved identifier (field/reference) item as + dependent + + SYNOPSIS + mark_select_range_as_dependent() + thd - thread handler + current_sel - current select (select where resolved_item was placed) + last_select - select where resolved_item was resolved + found_field - field which was found during resolving + found_item - Item which was found during resolving (if resolved + identifier belongs to VIEW) + resolved_item - Identifier which was resolved + + NOTE: + We have to mark all items between current_sel (including) and + last_select (excluding) as dependend (select before last_select should + be marked with actual table mask used by resolved item, all other with + OUTER_REF_TABLE_BIT) and also write dependence information to Item of + resolved identifier. +*/ + +void mark_select_range_as_dependent(THD *thd, + SELECT_LEX *current_sel, + SELECT_LEX *last_select, + Field *found_field, Item *found_item, + Item_ident *resolved_item) +{ + /* + Go from current SELECT to SELECT where field was resolved (it + have to be reachable from current SELECT, because it was already + done once when we resolved this field and cached result of + resolving) + */ + SELECT_LEX *previous_select= current_sel; + for(; + previous_select->outer_select() != last_select; + previous_select= previous_select->outer_select()) + { + Item_subselect *prev_subselect_item= + previous_select->master_unit()->item; + prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT; + prev_subselect_item->const_item_cache= 0; + } + { + Item_subselect *prev_subselect_item= + previous_select->master_unit()->item; + Item_ident *dependent= resolved_item; + if (found_field == view_ref_found) + { + Item::Type type= found_item->type(); + prev_subselect_item->used_tables_cache|= + found_item->used_tables(); + dependent= ((type == Item::REF_ITEM || type == Item::FIELD_ITEM) ? + (Item_ident*) found_item : + 0); + } + else + prev_subselect_item->used_tables_cache|= + found_field->table->map; + prev_subselect_item->const_item_cache= 0; + mark_as_dependent(thd, last_select, current_sel, resolved_item, + dependent); + } +} /* -- cgit v1.2.1 From d45f95f04ab8011d2d1c7fe361ec4df3dbdbe697 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 30 Apr 2005 19:27:22 +0300 Subject: postreview changes sql/item.cc: changed parameters order sql/item.h: changed parameters order sql/sql_base.cc: fixed comment changed parameters order --- sql/item.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sql/item.cc') diff --git a/sql/item.cc b/sql/item.cc index 9902b14ece5..a2649d7506f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2367,8 +2367,8 @@ static void mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current, SYNOPSIS mark_select_range_as_dependent() thd - thread handler - current_sel - current select (select where resolved_item was placed) last_select - select where resolved_item was resolved + current_sel - current select (select where resolved_item was placed) found_field - field which was found during resolving found_item - Item which was found during resolving (if resolved identifier belongs to VIEW) @@ -2383,8 +2383,8 @@ static void mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current, */ void mark_select_range_as_dependent(THD *thd, - SELECT_LEX *current_sel, SELECT_LEX *last_select, + SELECT_LEX *current_sel, Field *found_field, Item *found_item, Item_ident *resolved_item) { -- cgit v1.2.1