summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorigor@rurik.mysql.com <>2005-05-10 16:41:47 -0700
committerigor@rurik.mysql.com <>2005-05-10 16:41:47 -0700
commit33512333492f66c14ceb8eb49de9f485d826c577 (patch)
treeb58f759e8150bea46c200748f35cd96be94e1b59 /sql
parent3c81444476cebbf34ea99dae567077ca2f1648dc (diff)
parent9d4b228b61e4ecc1a023dca92a253bea0a4ec91a (diff)
downloadmariadb-git-33512333492f66c14ceb8eb49de9f485d826c577.tar.gz
Manual merge
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_base.cc4
-rw-r--r--sql/sql_delete.cc2
-rw-r--r--sql/sql_insert.cc8
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_prepare.cc6
-rw-r--r--sql/sql_select.cc4
-rw-r--r--sql/sql_update.cc14
-rw-r--r--sql/sql_view.cc4
-rw-r--r--sql/table.cc28
-rw-r--r--sql/table.h7
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;