diff options
author | unknown <monty@mysql.com> | 2004-12-31 00:44:00 +0200 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-12-31 00:44:00 +0200 |
commit | 2e8d13c73ec986dde580c9c840f421af4279611a (patch) | |
tree | 77b085cd22eae45e57f4e20f35ecfc231153d656 /sql/sql_update.cc | |
parent | bb2d3eaa30a3881927142c985fb637aca06d9823 (diff) | |
download | mariadb-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.cc | 66 |
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); |