Loading BitKeeper/etc/logging_ok +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ bar@gw.udmsearch.izhnet.ru bar@mysql.com bar@noter.intranet.mysql.r18.ru bell@51.0.168.192.in-addr.arpa bell@52.0.168.192.in-addr.arpa bell@laptop.sanja.is.com.ua bell@sanja.is.com.ua bk@admin.bk Loading sql/table.cc +54 −42 Original line number Diff line number Diff line Loading @@ -1599,26 +1599,44 @@ void st_table_list::calc_md5(char *buffer) /* set ancestor TABLE for table place holder of VIEW DESCRIPTION Replace all views that only uses one table with the table itself. This allows us to treat the view as a simple table and even update it SYNOPSIS st_table_list::set_ancestor() */ void st_table_list::set_ancestor() { /* process all tables of view */ for (TABLE_LIST *tbl= ancestor; tbl; tbl= tbl->next_local) TABLE_LIST *tbl; if ((tbl= ancestor)) { if (tbl->ancestor) ancestor->set_ancestor(); tbl->table->grant= grant; /* This is a view. Process all tables of view */ DBUG_ASSERT(view); do { if (tbl->ancestor) // This is a view { /* This is the only case where set_ancestor is called on an object that may not be a view (in which case ancestor is 0) */ tbl->ancestor->set_ancestor(); } tbl->table->grant= grant; } while ((tbl= tbl->next_local)); /* if view contain only one table, substitute TABLE of it */ if (ancestor && !ancestor->next_local) if (!ancestor->next_local) { table= ancestor->table; schema_table= ancestor->schema_table; } } } /* Loading Loading @@ -1679,6 +1697,8 @@ void st_table_list::restore_want_privilege() conds - condition of this JOIN check_opt_type - WHITH CHECK OPTION type (VIEW_CHECK_NONE, VIEW_CHECK_LOCAL, VIEW_CHECK_CASCADED) NOTES ancestor is list of tables and views used by view DESCRIPTION It is: Loading @@ -1689,8 +1709,8 @@ void st_table_list::restore_want_privilege() If there are underlying view(s) procedure first will be called for them. RETURN 0 - OK 1 - error FALSE - OK TRUE - error */ bool st_table_list::setup_ancestor(THD *thd, Item **conds, Loading @@ -1709,6 +1729,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, bool save_set_query_id= thd->set_query_id; bool save_wrapper= select_lex->no_wrap_view_item; bool save_allow_sum_func= thd->allow_sum_func; bool res= FALSE; DBUG_ENTER("st_table_list::setup_ancestor"); for (tbl= ancestor; tbl; tbl= tbl->next_local) Loading @@ -1718,21 +1739,24 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, (check_opt_type == VIEW_CHECK_CASCADED ? VIEW_CHECK_CASCADED : VIEW_CHECK_NONE))) DBUG_RETURN(1); DBUG_RETURN(TRUE); } if (field_translation) { DBUG_PRINT("info", ("there are already translation table")); /* Prevent look up in SELECTs tree (DERIVED_TABLE_TYPE is barrier for name lookup) and emulate main table list by ancestor table list for subquery processing We have to ensure that inside the view we are not referring to any table outside of the view. We do it by changing the pointers used by fix_fields to look up tables so that only tables and views in view are seen. We also set linkage to DERIVED_TABLE_TYPE as a barrier so that we stop resolving fields as this level. */ thd->lex->current_select= select_lex; select_lex->table_list.first= (byte *)ancestor; select_lex->master_unit()->first_select()->linkage= DERIVED_TABLE_TYPE; if (field_translation) { DBUG_PRINT("info", ("there are already translation table")); select_lex->no_wrap_view_item= 1; thd->set_query_id= 1; Loading Loading @@ -1769,24 +1793,16 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, goto ok; } /* view fields translation table */ /* Create view fields translation table */ if (!(transl= (Field_translator*)(thd->current_arena-> alloc(select->item_list.elements * sizeof(Field_translator))))) { DBUG_RETURN(1); DBUG_RETURN(TRUE); } /* Prevent look up in SELECTs tree (DERIVED_TABLE_TYPE is barrier for name lookup) and emulate main table list by ancestor table list for subquery processing */ thd->lex->current_select= select_lex; select_lex->table_list.first= (byte *)ancestor; select_lex->master_unit()->first_select()->linkage= DERIVED_TABLE_TYPE; select_lex->no_wrap_view_item= 1; /* Loading Loading @@ -1928,16 +1944,10 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, thd->restore_backup_item_arena(arena, &backup); } ok: select_lex->no_wrap_view_item= save_wrapper; thd->lex->current_select= current_select_save; select_lex->table_list.first= main_table_list_save; select_lex->master_unit()->first_select()->linkage= linkage_save; thd->set_query_id= save_set_query_id; thd->allow_sum_func= save_allow_sum_func; DBUG_RETURN(0); goto ok; err: res= TRUE; /* Hide "Unknown column" or "Unknown function" error */ if (thd->net.last_errno == ER_BAD_FIELD_ERROR || thd->net.last_errno == ER_SP_DOES_NOT_EXIST) Loading @@ -1945,13 +1955,15 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, thd->clear_error(); my_error(ER_VIEW_INVALID, MYF(0), view_db.str, view_name.str); } ok: select_lex->no_wrap_view_item= save_wrapper; thd->lex->current_select= current_select_save; select_lex->table_list.first= main_table_list_save; select_lex->master_unit()->first_select()->linkage= linkage_save; thd->set_query_id= save_set_query_id; thd->allow_sum_func= save_allow_sum_func; DBUG_RETURN(1); DBUG_RETURN(res); } Loading Loading
BitKeeper/etc/logging_ok +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ bar@gw.udmsearch.izhnet.ru bar@mysql.com bar@noter.intranet.mysql.r18.ru bell@51.0.168.192.in-addr.arpa bell@52.0.168.192.in-addr.arpa bell@laptop.sanja.is.com.ua bell@sanja.is.com.ua bk@admin.bk Loading
sql/table.cc +54 −42 Original line number Diff line number Diff line Loading @@ -1599,26 +1599,44 @@ void st_table_list::calc_md5(char *buffer) /* set ancestor TABLE for table place holder of VIEW DESCRIPTION Replace all views that only uses one table with the table itself. This allows us to treat the view as a simple table and even update it SYNOPSIS st_table_list::set_ancestor() */ void st_table_list::set_ancestor() { /* process all tables of view */ for (TABLE_LIST *tbl= ancestor; tbl; tbl= tbl->next_local) TABLE_LIST *tbl; if ((tbl= ancestor)) { if (tbl->ancestor) ancestor->set_ancestor(); tbl->table->grant= grant; /* This is a view. Process all tables of view */ DBUG_ASSERT(view); do { if (tbl->ancestor) // This is a view { /* This is the only case where set_ancestor is called on an object that may not be a view (in which case ancestor is 0) */ tbl->ancestor->set_ancestor(); } tbl->table->grant= grant; } while ((tbl= tbl->next_local)); /* if view contain only one table, substitute TABLE of it */ if (ancestor && !ancestor->next_local) if (!ancestor->next_local) { table= ancestor->table; schema_table= ancestor->schema_table; } } } /* Loading Loading @@ -1679,6 +1697,8 @@ void st_table_list::restore_want_privilege() conds - condition of this JOIN check_opt_type - WHITH CHECK OPTION type (VIEW_CHECK_NONE, VIEW_CHECK_LOCAL, VIEW_CHECK_CASCADED) NOTES ancestor is list of tables and views used by view DESCRIPTION It is: Loading @@ -1689,8 +1709,8 @@ void st_table_list::restore_want_privilege() If there are underlying view(s) procedure first will be called for them. RETURN 0 - OK 1 - error FALSE - OK TRUE - error */ bool st_table_list::setup_ancestor(THD *thd, Item **conds, Loading @@ -1709,6 +1729,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, bool save_set_query_id= thd->set_query_id; bool save_wrapper= select_lex->no_wrap_view_item; bool save_allow_sum_func= thd->allow_sum_func; bool res= FALSE; DBUG_ENTER("st_table_list::setup_ancestor"); for (tbl= ancestor; tbl; tbl= tbl->next_local) Loading @@ -1718,21 +1739,24 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, (check_opt_type == VIEW_CHECK_CASCADED ? VIEW_CHECK_CASCADED : VIEW_CHECK_NONE))) DBUG_RETURN(1); DBUG_RETURN(TRUE); } if (field_translation) { DBUG_PRINT("info", ("there are already translation table")); /* Prevent look up in SELECTs tree (DERIVED_TABLE_TYPE is barrier for name lookup) and emulate main table list by ancestor table list for subquery processing We have to ensure that inside the view we are not referring to any table outside of the view. We do it by changing the pointers used by fix_fields to look up tables so that only tables and views in view are seen. We also set linkage to DERIVED_TABLE_TYPE as a barrier so that we stop resolving fields as this level. */ thd->lex->current_select= select_lex; select_lex->table_list.first= (byte *)ancestor; select_lex->master_unit()->first_select()->linkage= DERIVED_TABLE_TYPE; if (field_translation) { DBUG_PRINT("info", ("there are already translation table")); select_lex->no_wrap_view_item= 1; thd->set_query_id= 1; Loading Loading @@ -1769,24 +1793,16 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, goto ok; } /* view fields translation table */ /* Create view fields translation table */ if (!(transl= (Field_translator*)(thd->current_arena-> alloc(select->item_list.elements * sizeof(Field_translator))))) { DBUG_RETURN(1); DBUG_RETURN(TRUE); } /* Prevent look up in SELECTs tree (DERIVED_TABLE_TYPE is barrier for name lookup) and emulate main table list by ancestor table list for subquery processing */ thd->lex->current_select= select_lex; select_lex->table_list.first= (byte *)ancestor; select_lex->master_unit()->first_select()->linkage= DERIVED_TABLE_TYPE; select_lex->no_wrap_view_item= 1; /* Loading Loading @@ -1928,16 +1944,10 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, thd->restore_backup_item_arena(arena, &backup); } ok: select_lex->no_wrap_view_item= save_wrapper; thd->lex->current_select= current_select_save; select_lex->table_list.first= main_table_list_save; select_lex->master_unit()->first_select()->linkage= linkage_save; thd->set_query_id= save_set_query_id; thd->allow_sum_func= save_allow_sum_func; DBUG_RETURN(0); goto ok; err: res= TRUE; /* Hide "Unknown column" or "Unknown function" error */ if (thd->net.last_errno == ER_BAD_FIELD_ERROR || thd->net.last_errno == ER_SP_DOES_NOT_EXIST) Loading @@ -1945,13 +1955,15 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, thd->clear_error(); my_error(ER_VIEW_INVALID, MYF(0), view_db.str, view_name.str); } ok: select_lex->no_wrap_view_item= save_wrapper; thd->lex->current_select= current_select_save; select_lex->table_list.first= main_table_list_save; select_lex->master_unit()->first_select()->linkage= linkage_save; thd->set_query_id= save_set_query_id; thd->allow_sum_func= save_allow_sum_func; DBUG_RETURN(1); DBUG_RETURN(res); } Loading