diff options
author | igor@rurik.mysql.com <> | 2005-05-10 16:41:47 -0700 |
---|---|---|
committer | igor@rurik.mysql.com <> | 2005-05-10 16:41:47 -0700 |
commit | 33512333492f66c14ceb8eb49de9f485d826c577 (patch) | |
tree | b58f759e8150bea46c200748f35cd96be94e1b59 /sql | |
parent | 3c81444476cebbf34ea99dae567077ca2f1648dc (diff) | |
parent | 9d4b228b61e4ecc1a023dca92a253bea0a4ec91a (diff) | |
download | mariadb-git-33512333492f66c14ceb8eb49de9f485d826c577.tar.gz |
Manual merge
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_base.cc | 4 | ||||
-rw-r--r-- | sql/sql_delete.cc | 2 | ||||
-rw-r--r-- | sql/sql_insert.cc | 8 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 6 | ||||
-rw-r--r-- | sql/sql_select.cc | 4 | ||||
-rw-r--r-- | sql/sql_update.cc | 14 | ||||
-rw-r--r-- | sql/sql_view.cc | 4 | ||||
-rw-r--r-- | sql/table.cc | 28 | ||||
-rw-r--r-- | sql/table.h | 7 |
10 files changed, 38 insertions, 41 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc index abdb21dae63..bda5700b273 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -3169,10 +3169,8 @@ TABLE_LIST **make_leaves_list(TABLE_LIST **list, TABLE_LIST *tables) { for (TABLE_LIST *table= tables; table; table= table->next_local) { - if (table->view && !table->table) + if (table->view && table->effective_algorithm == VIEW_ALGORITHM_MERGE) { - /* it is for multi table views only, check it */ - DBUG_ASSERT(table->ancestor->next_local != 0); list= make_leaves_list(list, table->ancestor); } else diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index d524bbcf164..cded9e2a13e 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -46,8 +46,6 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, DBUG_RETURN(TRUE); if (!(table= table_list->table)) { - DBUG_ASSERT(table_list->view && - table_list->ancestor && table_list->ancestor->next_local); my_error(ER_VIEW_DELETE_MERGE_VIEW, MYF(0), table_list->view_db.str, table_list->view_name.str); DBUG_RETURN(-1); diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index f2b363a622b..adb33af05b9 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -81,8 +81,6 @@ static int check_insert_fields(THD *thd, TABLE_LIST *table_list, { if (!table) { - DBUG_ASSERT(table_list->view && - table_list->ancestor && table_list->ancestor->next_local); my_error(ER_VIEW_NO_INSERT_FIELD_LIST, MYF(0), table_list->view_db.str, table_list->view_name.str); return -1; @@ -125,7 +123,7 @@ static int check_insert_fields(THD *thd, TABLE_LIST *table_list, thd->lex->select_lex.no_wrap_view_item= 0; if (res) return -1; - if (table == 0) + if (table_list->effective_algorithm == VIEW_ALGORITHM_MERGE) { /* it is join view => we need to find table for update */ List_iterator_fast<Item> it(fields); @@ -135,7 +133,7 @@ static int check_insert_fields(THD *thd, TABLE_LIST *table_list, while ((item= it++)) map|= item->used_tables(); - if (table_list->check_single_table(&tbl, map) || tbl == 0) + if (table_list->check_single_table(&tbl, map, table_list) || tbl == 0) { my_error(ER_VIEW_MULTIUPDATE, MYF(0), table_list->view_db.str, table_list->view_name.str); @@ -709,8 +707,6 @@ static bool mysql_prepare_insert_check_table(THD *thd, TABLE_LIST *table_list, thd->lex->empty_field_list_on_rset= 1; if (!table_list->table) { - DBUG_ASSERT(table_list->view && - table_list->ancestor && table_list->ancestor->next_local); my_error(ER_VIEW_NO_INSERT_FIELD_LIST, MYF(0), table_list->view_db.str, table_list->view_name.str); DBUG_RETURN(TRUE); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8c8dcc938cb..47ac8d3afc1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1764,7 +1764,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->lex-> select_lex.table_list.link_in_list((byte*) &table_list, (byte**) &table_list.next_local); - thd->lex->query_tables= &table_list; + thd->lex->add_to_query_tables(&table_list); /* switch on VIEW optimisation: do not fill temporary tables */ thd->lex->sql_command= SQLCOM_SHOW_FIELDS; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 17c5f51f1e1..022eb272f7c 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1006,7 +1006,7 @@ static int mysql_test_update(Prepared_statement *stmt, if (!open_tables(thd, &table_list, &table_count)) { - if (table_list->ancestor && table_list->ancestor->next_local) + if (table_list->multitable_view) { DBUG_ASSERT(table_list->view != 0); DBUG_PRINT("info", ("Switch to multi-update")); @@ -1095,8 +1095,6 @@ static int mysql_test_delete(Prepared_statement *stmt, bool res; if (!table_list->table) { - DBUG_ASSERT(table_list->view && - table_list->ancestor && table_list->ancestor->next_local); my_error(ER_VIEW_DELETE_MERGE_VIEW, MYF(0), table_list->view_db.str, table_list->view_name.str); DBUG_RETURN(-1); @@ -1458,8 +1456,6 @@ static int mysql_test_multidelete(Prepared_statement *stmt, return res; if (!tables->table) { - DBUG_ASSERT(tables->view && - tables->ancestor && tables->ancestor->next_local); my_error(ER_VIEW_DELETE_MERGE_VIEW, MYF(0), tables->view_db.str, tables->view_name.str); return -1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 47c7de6eba7..ed4d7138403 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7300,7 +7300,7 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top) */ if (table->on_expr) { - Item *expr; + Item *expr= table->prep_on_expr ? table->prep_on_expr : table->on_expr; /* If an on expression E is attached to the table, check all null rejected predicates in this expression. @@ -7310,7 +7310,7 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top) the corresponding on expression is added to E. */ expr= simplify_joins(join, &nested_join->join_list, - table->on_expr, FALSE); + expr, FALSE); table->prep_on_expr= table->on_expr= expr; } nested_join->used_tables= (table_map) 0; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 86aa0bf9890..95268c41aed 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -139,7 +139,7 @@ int mysql_update(THD *thd, if (open_tables(thd, &table_list, &table_count)) DBUG_RETURN(1); - if (table_list->ancestor && table_list->ancestor->next_local) + if (table_list->multitable_view) { DBUG_ASSERT(table_list->view != 0); DBUG_PRINT("info", ("Switch to multi-update")); @@ -706,9 +706,11 @@ bool mysql_multi_update_prepare(THD *thd) if (!tl->placeholder() && !tl->schema_table && !using_lock_tables) tl->table->reginfo.lock_type= tl->lock_type; } - + } + for(tl= table_list; tl; tl= tl->next_local) + { /* Check access privileges for table */ - if (!tl->derived && !tl->belong_to_view) + if (!tl->derived) { uint want_privilege= tl->updating ? UPDATE_ACL : SELECT_ACL; if (check_access(thd, want_privilege, @@ -721,12 +723,10 @@ bool mysql_multi_update_prepare(THD *thd) /* check single table update for view compound from several tables */ for (tl= table_list; tl; tl= tl->next_local) { - if (tl->table == 0) + if (tl->effective_algorithm == VIEW_ALGORITHM_MERGE) { - DBUG_ASSERT(tl->view && - tl->ancestor && tl->ancestor->next_local); TABLE_LIST *for_update= 0; - if (tl->check_single_table(&for_update, tables_for_update)) + if (tl->check_single_table(&for_update, tables_for_update, tl)) { my_error(ER_VIEW_MULTIUPDATE, MYF(0), tl->view_db.str, tl->view_name.str); diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 15a8f52af20..289bf9d28a3 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -774,9 +774,9 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) for (tbl= lex->select_lex.get_table_list(); tbl; tbl= tbl->next_local) tbl->select_lex= table->select_lex; - /* multi table view */ - if (view_tables->next_local) { + if (view_tables->next_local) + table->multitable_view= TRUE; /* make nested join structure for view tables */ NESTED_JOIN *nested_join; if (!(nested_join= table->nested_join= diff --git a/sql/table.cc b/sql/table.cc index e587660e180..82a8afd826b 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1655,11 +1655,13 @@ void st_table_list::set_ancestor() */ tbl->ancestor->set_ancestor(); } - tbl->table->grant= grant; + if (tbl->multitable_view) + multitable_view= TRUE; + if (tbl->table) + tbl->table->grant= grant; } while ((tbl= tbl->next_local)); - /* if view contain only one table, substitute TABLE of it */ - if (!ancestor->next_local) + if (!multitable_view) { table= ancestor->table; schema_table= ancestor->schema_table; @@ -1686,8 +1688,6 @@ void st_table_list::save_and_clear_want_privilege() } else { - DBUG_ASSERT(tbl->view && tbl->ancestor && - tbl->ancestor->next_local); tbl->save_and_clear_want_privilege(); } } @@ -1709,8 +1709,6 @@ void st_table_list::restore_want_privilege() tbl->table->grant.want_privilege= privilege_backup; else { - DBUG_ASSERT(tbl->view && tbl->ancestor && - tbl->ancestor->next_local); tbl->restore_want_privilege(); } } @@ -2064,16 +2062,17 @@ int st_table_list::view_check_option(THD *thd, bool ignore_failure) { if (check_option && check_option->val_int() == 0) { + TABLE_LIST *view= (belong_to_view ? belong_to_view : this); if (ignore_failure) { push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, ER_VIEW_CHECK_FAILED, ER(ER_VIEW_CHECK_FAILED), - view_db.str, view_name.str); + view->view_db.str, view->view_name.str); return(VIEW_CHECK_SKIP); } else { - my_error(ER_VIEW_CHECK_FAILED, MYF(0), view_db.str, view_name.str); + my_error(ER_VIEW_CHECK_FAILED, MYF(0), view->view_db.str, view->view_name.str); return(VIEW_CHECK_ERROR); } } @@ -2091,13 +2090,15 @@ int st_table_list::view_check_option(THD *thd, bool ignore_failure) (should be 0 on call, to find table, or point to table for unique test) map bit mask of tables + view view for which we are looking table RETURN FALSE table not found or found only one TRUE found several tables */ -bool st_table_list::check_single_table(st_table_list **table, table_map map) +bool st_table_list::check_single_table(st_table_list **table, table_map map, + st_table_list *view) { for (TABLE_LIST *tbl= ancestor; tbl; tbl= tbl->next_local) { @@ -2108,11 +2109,14 @@ bool st_table_list::check_single_table(st_table_list **table, table_map map) if (*table) return TRUE; else + { *table= tbl; + tbl->check_option= view->check_option; + } } } else - if (tbl->check_single_table(table, map)) + if (tbl->check_single_table(table, map, view)) return TRUE; } return FALSE; @@ -2142,7 +2146,7 @@ bool st_table_list::set_insert_values(MEM_ROOT *mem_root) } else { - DBUG_ASSERT(view && ancestor && ancestor->next_local); + DBUG_ASSERT(view && ancestor); for (TABLE_LIST *tbl= ancestor; tbl; tbl= tbl->next_local) if (tbl->set_insert_values(mem_root)) return TRUE; diff --git a/sql/table.h b/sql/table.h index 0a4a06a75d1..2e397ff95bf 100644 --- a/sql/table.h +++ b/sql/table.h @@ -436,6 +436,10 @@ typedef struct st_table_list bool skip_temporary; /* this table shouldn't be temporary */ /* TRUE if this merged view contain auto_increment field */ bool contain_auto_increment; +#if 0 +#else + bool multitable_view; /* TRUE iff this is multitable view */ +#endif /* FRMTYPE_ERROR if any type is acceptable */ enum frm_type_enum required_type; char timestamp_buffer[20]; /* buffer for timestamp (19+1) */ @@ -454,7 +458,8 @@ typedef struct st_table_list void print(THD *thd, String *str); void save_and_clear_want_privilege(); void restore_want_privilege(); - bool check_single_table(st_table_list **table, table_map map); + bool check_single_table(st_table_list **table, table_map map, + st_table_list *view); bool set_insert_values(MEM_ROOT *mem_root); st_table_list *find_underlying_table(TABLE *table); } TABLE_LIST; |