summaryrefslogtreecommitdiff
path: root/sql/sql_update.cc
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-12-31 00:44:00 +0200
committerunknown <monty@mysql.com>2004-12-31 00:44:00 +0200
commit2e8d13c73ec986dde580c9c840f421af4279611a (patch)
tree77b085cd22eae45e57f4e20f35ecfc231153d656 /sql/sql_update.cc
parentbb2d3eaa30a3881927142c985fb637aca06d9823 (diff)
downloadmariadb-git-2e8d13c73ec986dde580c9c840f421af4279611a.tar.gz
After merge fixes
config/ac-macros/character_sets.m4: Added latin1_spanish_ci dbug/dbug_analyze.c: Remove compiler warnings include/my_handler.h: Reorder structure arguments to be more optimal innobase/dict/dict0load.c: Fixed wrong define tag (for MySQL 5.0) innobase/fil/fil0fil.c: Fixed compiler warning innobase/os/os0file.c: Fixed compiler warning myisam/ft_boolean_search.c: Fixed compiler warning myisam/ft_static.c: Update to use new HA_KEYSEG structure myisam/mi_open.c: Simple optimization myisammrg/myrg_static.c: Removed compiler warning mysql-test/r/grant.result: Update results after merge mysql-test/r/index_merge.result: Update results after merge mysql-test/r/information_schema_inno.result: Add missing drop table mysql-test/r/lowercase_table.result: safety fix mysql-test/r/multi_update.result: safety fix mysql-test/r/ps_1general.result: safety fix mysql-test/r/ps_2myisam.result: Update results after merge (set is not anymore of binary type) mysql-test/r/ps_3innodb.result: Update results after merge mysql-test/r/ps_4heap.result: Update results after merge mysql-test/r/ps_5merge.result: Update results after merge mysql-test/r/ps_6bdb.result: Update results after merge mysql-test/r/show_check.result: Update results after merge mysql-test/r/subselect.result: Update results after merge (added missing quotes) mysql-test/r/timezone2.result: Update results after merge mysql-test/r/view.result: Update results after merge (note that INSERT IGNORE will work again after next merge from 4.1) mysql-test/t/derived.test: Removed empty line mysql-test/t/grant.test: Update results after merge mysql-test/t/information_schema_inno.test: added missing drop table mysql-test/t/lowercase_table.test: safety fix mysql-test/t/multi_update.test: safety fix mysql-test/t/ps_1general.test: safety fix mysql-test/t/view.test: update error codes after merge ndb/src/mgmsrv/main.cpp: after merge fix ndb/tools/ndb_test_platform.cpp: removed compiler warnings regex/main.c: remove compiler warnings sql/field.cc: Remove compiler warning sql/gen_lex_hash.cc: Added DBUG support sql/ha_myisam.cc: Removed warning from valgrind sql/ha_ndbcluster.cc: Remove compiler warning sql/item_cmpfunc.cc: Better to use val_int() instead of val_real() as we don't want Item_func_nop_all to return different value than the original ref element sql/mysqld.cc: Remove compiler warning sql/sql_acl.cc: More debugging sql/sql_lex.cc: Remove unnecessary 'else' sql/sql_parse.cc: After merge fixes Simplify reset of thd->server_status for SQLCOM_CALL sql/sql_prepare.cc: After merge fixes Removed possible core dump in mysql_stmt_fetch() sql/sql_update.cc: After merge fixes (together with Sanja) strings/ctype-czech.c: Remove compiler warning strings/ctype-ucs2.c: Remove compiler warning strings/ctype-win1250ch.c: Remove compiler warning strings/xml.c: Remove compiler warning tests/client_test.c: Fix test to work with 5.0 vio/test-sslserver.c: Portability fix
Diffstat (limited to 'sql/sql_update.cc')
-rw-r--r--sql/sql_update.cc66
1 files changed, 29 insertions, 37 deletions
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index fa4acce31f7..d10c54f6fab 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -620,9 +620,8 @@ bool mysql_multi_update_prepare(THD *thd)
LEX *lex= thd->lex;
ulong opened_tables;
TABLE_LIST *table_list= lex->query_tables;
+ TABLE_LIST *tl, *leaves;
List<Item> *fields= &lex->select_lex.item_list;
- TABLE_LIST *tl;
- TABLE_LIST *leaves;
table_map tables_for_update;
int res;
bool update_view= 0;
@@ -634,9 +633,10 @@ bool mysql_multi_update_prepare(THD *thd)
uint table_count= lex->table_count;
const bool using_lock_tables= thd->locked_tables != 0;
bool original_multiupdate= (thd->lex->sql_command == SQLCOM_UPDATE_MULTI);
+ DBUG_ENTER("mysql_multi_update_prepare");
+
/* following need for prepared statements, to run next time multi-update */
thd->lex->sql_command= SQLCOM_UPDATE_MULTI;
- DBUG_ENTER("mysql_multi_update_prepare");
/* open tables and create derived ones, but do not lock and fill them */
if ((original_multiupdate && open_tables(thd, table_list, & table_count)) ||
@@ -651,24 +651,7 @@ bool mysql_multi_update_prepare(THD *thd)
if (setup_tables(thd, table_list, &lex->select_lex.where,
&lex->select_lex.leaf_tables, FALSE, FALSE))
DBUG_RETURN(TRUE);
- /*
- Ensure that we have update privilege for all tables and columns in the
- SET part
- */
- for (tl= (leaves= lex->select_lex.leaf_tables); tl; tl= tl->next_leaf)
- {
- /*
- Update of derived tables is checked later
- We don't check privileges here, becasue then we would get error
- "UPDATE command denided .. for column N" instead of
- "Target table ... is not updatable"
- */
- TABLE *table= tl->table;
- TABLE_LIST *tlist;
- if (!(tlist= tl->belong_to_view?tl->belong_to_view:tl)->derived)
- tlist->grant.want_privilege= table->grant.want_privilege=
- (UPDATE_ACL & ~table->grant.privilege);
- }
+ leaves= lex->select_lex.leaf_tables;
if ((lex->select_lex.no_wrap_view_item= 1,
res= setup_fields(thd, 0, table_list, *fields, 1, 0, 0),
@@ -698,11 +681,6 @@ bool mysql_multi_update_prepare(THD *thd)
for (tl= leaves; tl; tl= tl->next_leaf)
{
TABLE *table= tl->table;
- TABLE_LIST *tlist= tl->belong_to_view?tl->belong_to_view:tl;
-
- /* We only need SELECT privilege for columns in the values list */
- tlist->grant.want_privilege= table->grant.want_privilege=
- (SELECT_ACL & ~table->grant.privilege);
/* Only set timestamp column if this is not modified */
if (table->timestamp_field &&
table->timestamp_field->query_id == thd->query_id)
@@ -730,26 +708,24 @@ bool mysql_multi_update_prepare(THD *thd)
DBUG_PRINT("info",("setting table `%s` for update", tl->alias));
tl->lock_type= lex->multi_lock_option;
tl->updating= 1;
- }
+ }
else
{
DBUG_PRINT("info",("setting table `%s` for read-only", tl->alias));
tl->lock_type= TL_READ;
tl->updating= 0;
}
- if (!using_lock_tables)
- tl->table->reginfo.lock_type= tl->lock_type;
/* Check access privileges for table */
+ if (!tl->derived)
{
- TABLE_LIST *save= tl->next;
- bool res;
- tl->next= 0;
- res= (check_access(thd, tl->updating ? UPDATE_ACL : SELECT_ACL,
- tl->db, &tl->grant.privilege, 0, 0) ||
- (grant_option && check_grant(thd, wants, tl, 0, 0, 0)));
- tl->next= save;
- if (res)
+ uint want_privilege= tl->updating ? UPDATE_ACL : SELECT_ACL;
+ if (!using_lock_tables)
+ tl->table->reginfo.lock_type= tl->lock_type;
+
+ if (check_access(thd, want_privilege,
+ tl->db, &tl->grant.privilege, 0, 0) ||
+ (grant_option && check_grant(thd, want_privilege, tl, 0, 1, 0)))
DBUG_RETURN(TRUE);
}
}
@@ -806,6 +782,22 @@ bool mysql_multi_update_prepare(THD *thd)
res))
DBUG_RETURN(TRUE);
}
+
+ /* We only need SELECT privilege for columns in the values list */
+ for (tl= leaves; tl; tl= tl->next_leaf)
+ {
+ TABLE *table= tl->table;
+ TABLE_LIST *tlist;
+ if (!(tlist= tl->belong_to_view ? tl->belong_to_view : tl)->derived)
+ {
+ tlist->grant.want_privilege=
+ (SELECT_ACL & ~tlist->grant.privilege);
+ table->grant.want_privilege= (SELECT_ACL & ~table->grant.privilege);
+ }
+ DBUG_PRINT("info", ("table: %s want_privilege: %u", tl->alias,
+ (uint) table->grant.want_privilege));
+ }
+
if (thd->fill_derived_tables() &&
mysql_handle_derived(lex, &mysql_derived_filling))
DBUG_RETURN(TRUE);