diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 6df636386d6a3b8dc96621e8b082c2b6eed8a48e..596619b3955c6ae494adad1233889f667e36dd73 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2539,7 +2539,7 @@ void grant_reload(THD *thd)
 
 /****************************************************************************
   Check grants
-  All errors are written directly to the client if command name is given !
+  All errors are written directly to the client if no_errors is given !
 ****************************************************************************/
 
 bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 0d22704ef3cef9a04c4d3dcf59288e50b25540e9..f97b1b8f8be3d15238d1a5cf0bf0621f66cd81e1 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -63,6 +63,8 @@ static bool append_file_to_dir(THD *thd, const char **filename_ptr,
 			       const char *table_name);
 static bool create_total_list(THD *thd, LEX *lex,
 			      TABLE_LIST **result, bool skip_first);
+static bool check_one_table_access(THD *thd, ulong want_access,
+				   TABLE_LIST *table, bool no_errors);
 
 const char *any_db="*any*";	// Special symbol for check_access
 
@@ -870,11 +872,8 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd)
   if (!(table=open_ltable(thd, table_list, TL_READ_NO_INSERT)))
     DBUG_RETURN(1);
 
-  if (check_access(thd, SELECT_ACL, db, &table_list->grant.privilege))
+  if (check_one_table_access(thd, SELECT_ACL, table_list, 0))
     goto err;
-  if (grant_option && check_grant(thd, SELECT_ACL, table_list))
-    goto err;
-
   thd->free_list = 0;
   thd->query_length=(uint) strlen(tbl_name);
   thd->query = tbl_name;
@@ -1102,9 +1101,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
       casedn_str(table_list.real_name);
     remove_escape(table_list.real_name);	// This can't have wildcards
 
-    if (check_access(thd,SELECT_ACL,table_list.db,&thd->col_access))
+    if (check_access(thd,SELECT_ACL,table_list.db,&table_list.grant.privilege))
       break;
-    table_list.grant.privilege=thd->col_access;
     if (grant_option && check_grant(thd,SELECT_ACL,&table_list,2))
       break;
     mysqld_list_fields(thd,&table_list,fields);
@@ -1693,12 +1691,8 @@ mysql_execute_command(void)
     break;
   }
   case SQLCOM_CREATE_INDEX:
-    if (!tables->db)
-      tables->db=thd->db;
-    if (check_access(thd,INDEX_ACL,tables->db,&tables->grant.privilege))
+    if (check_one_table_access(thd, INDEX_ACL, tables, 0))
       goto error; /* purecov: inspected */
-    if (grant_option && check_grant(thd,INDEX_ACL,tables))
-      goto error;
     if (end_active_trans(thd))
       res= -1;
     else
@@ -1753,8 +1747,6 @@ mysql_execute_command(void)
 	res=0;
 	break;
       }
-      if (!tables->db)
-	tables->db=thd->db;
       if (!select_lex->db)
 	select_lex->db=tables->db;
       if (check_access(thd,ALTER_ACL,tables->db,&tables->grant.privilege) ||
@@ -1763,8 +1755,6 @@ mysql_execute_command(void)
 				   (TABLE_LIST *)
 				   lex->create_info.merge_list.first))
 	goto error;				/* purecov: inspected */
-      if (!tables->db)
-	tables->db=thd->db;
       if (grant_option)
       {
 	if (check_grant(thd,ALTER_ACL,tables))
@@ -1909,16 +1899,8 @@ mysql_execute_command(void)
     break;
   }
   case SQLCOM_UPDATE:
-    TABLE_LIST *table;
     if (check_db_used(thd,tables))
       goto error;
-    for (table=tables ; table ; table=table->next)
-    {
-      if (check_access(thd,UPDATE_ACL,table->db,&table->grant.privilege))
-	goto error;
-    }
-    if (grant_option && check_grant(thd,UPDATE_ACL,tables))
-      goto error;
     if (select_lex->item_list.elements != lex->value_list.elements)
     {
       send_error(&thd->net,ER_WRONG_VALUE_COUNT);
@@ -1926,6 +1908,10 @@ mysql_execute_command(void)
     }
     if (select_lex->table_list.elements == 1)
     {
+      if (check_one_table_access(thd, UPDATE_ACL, tables, 0))
+	goto error; /* purecov: inspected */
+
+
       res= mysql_update(thd,tables,
 			select_lex->item_list,
 			lex->value_list,
@@ -1937,7 +1923,22 @@ mysql_execute_command(void)
     else
     {
       const char *msg= 0;
+      TABLE_LIST *table;
       lex->sql_command= SQLCOM_MULTI_UPDATE;
+
+      /*
+	Ensure that we have UPDATE or SELECT privilege for each table
+	The exact privilege is checked in mysql_multi_update()
+      */
+      for (table= tables ; table ; table= table->next)
+      {
+	TABLE_LIST *save= table->next;
+	table->next= 0;
+	if (check_one_table_access(thd, UPDATE_ACL, table, 1) &&
+	    check_one_table_access(thd, SELECT_ACL, table, 0))
+	    goto error;
+	table->next= save;
+      }
       if (select_lex->order_list.elements)
 	msg="ORDER BY";
       else if (select_lex->select_limit && select_lex->select_limit !=
@@ -1958,21 +1959,14 @@ mysql_execute_command(void)
     }
     break;
   case SQLCOM_INSERT:
-    if (check_access(thd,INSERT_ACL,tables->db,&tables->grant.privilege))
+    if (check_one_table_access(thd, INSERT_ACL, tables, 0))
       goto error; /* purecov: inspected */
-    if (grant_option && check_grant(thd,INSERT_ACL,tables))
-      goto error;
     res = mysql_insert(thd,tables,lex->field_list,lex->many_values,
 		       lex->duplicates);
     break;
   case SQLCOM_REPLACE:
-    if (check_access(thd,INSERT_ACL | DELETE_ACL,
-		     tables->db,&tables->grant.privilege))
+    if (check_one_table_access(thd, INSERT_ACL | DELETE_ACL, tables, 0))
       goto error; /* purecov: inspected */
-    if (grant_option && check_grant(thd,INSERT_ACL | DELETE_ACL,
-				    tables))
-
-      goto error;
     res = mysql_insert(thd,tables,lex->field_list,lex->many_values,
 		       DUP_REPLACE);
     break;
@@ -1988,9 +1982,7 @@ mysql_execute_command(void)
 			INSERT_ACL : INSERT_ACL | DELETE_ACL);
       TABLE_LIST *save_next=tables->next;
       tables->next=0;
-      if (check_access(thd, privilege,
-		       tables->db,&tables->grant.privilege) ||
-	  (grant_option && check_grant(thd, privilege, tables)))
+      if (check_one_table_access(thd, privilege, tables, 0))
 	goto error;
       tables->next=save_next;
       if ((res=check_table_access(thd, SELECT_ACL, save_next)))
@@ -2035,10 +2027,8 @@ mysql_execute_command(void)
     break;
   }
   case SQLCOM_TRUNCATE:
-    if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege))
+    if (check_one_table_access(thd, DELETE_ACL, tables, 0))
       goto error; /* purecov: inspected */
-    if (grant_option && check_grant(thd,DELETE_ACL,tables))
-      goto error;
     /*
       Don't allow this within a transaction because we want to use
       re-generate table
@@ -2052,9 +2042,7 @@ mysql_execute_command(void)
     break;
   case SQLCOM_DELETE:
   {
-    if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege))
-      goto error; /* purecov: inspected */
-    if (grant_option && check_grant(thd,DELETE_ACL,tables))
+    if (check_one_table_access(thd, DELETE_ACL, tables, 0))
       goto error;
     // Set privilege for the WHERE clause
     tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
@@ -2139,8 +2127,8 @@ mysql_execute_command(void)
       DROP / * 40005 TEMPORARY * / TABLE
       that come from parts of binlogs (likely if we use RESET SLAVE or CHANGE
       MASTER TO), while the temporary table has already been dropped.
-      To not generate such irrelevant "table does not exist errors", we silently
-      add IF EXISTS if TEMPORARY was used.
+      To not generate such irrelevant "table does not exist errors",
+      we silently add IF EXISTS if TEMPORARY was used.
     */
     if (thd->slave_thread && lex->drop_temporary)
       lex->drop_if_exists= 1;
@@ -2151,12 +2139,8 @@ mysql_execute_command(void)
   }
   break;
   case SQLCOM_DROP_INDEX:
-    if (!tables->db)
-      tables->db=thd->db;
-    if (check_access(thd,INDEX_ACL,tables->db,&tables->grant.privilege))
-      goto error;				/* purecov: inspected */
-    if (grant_option && check_grant(thd,INDEX_ACL,tables))
-      goto error;
+    if (check_one_table_access(thd, INDEX_ACL, tables, 0))
+      goto error; /* purecov: inspected */
     if (end_active_trans(thd))
       res= -1;
     else
@@ -2242,16 +2226,11 @@ mysql_execute_command(void)
 #else
     {
       char *db=tables->db;
-      if (!*db)
-      {
-	send_error(&thd->net,ER_NO_DB_ERROR);	/* purecov: inspected */
-	goto error;				/* purecov: inspected */
-      }
       remove_escape(db);			// Fix escaped '_'
       remove_escape(tables->real_name);
-      if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,&thd->col_access))
+      if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,
+		       &tables->grant.privilege))
 	goto error;				/* purecov: inspected */
-      tables->grant.privilege=thd->col_access;
       if (grant_option && check_grant(thd,SELECT_ACL,tables,2))
 	goto error;
       res= mysqld_show_fields(thd,tables,
@@ -2267,18 +2246,10 @@ mysql_execute_command(void)
 #else
     {
       char *db=tables->db;
-      if (!db)
-      {
-	send_error(&thd->net,ER_NO_DB_ERROR);	/* purecov: inspected */
-	goto error;				/* purecov: inspected */
-      }
       remove_escape(db);			// Fix escaped '_'
       remove_escape(tables->real_name);
-      if (!tables->db)
-	tables->db=thd->db;
-      if (check_access(thd,SELECT_ACL,db,&thd->col_access))
+      if (check_access(thd,SELECT_ACL,db,&tables->grant.privilege))
 	goto error; /* purecov: inspected */
-      tables->grant.privilege=thd->col_access;
       if (grant_option && check_grant(thd,SELECT_ACL,tables,2))
 	goto error;
       res= mysqld_show_keys(thd,tables);
@@ -2306,8 +2277,7 @@ mysql_execute_command(void)
 	send_error(&thd->net,ER_NOT_ALLOWED_COMMAND);
 	goto error;
       }
-      if (check_access(thd,privilege,tables->db,&tables->grant.privilege) ||
-	  grant_option && check_grant(thd,privilege,tables))
+      if (check_one_table_access(thd, privilege, tables, 0))
 	goto error;
     }
     res=mysql_load(thd, lex->exchange, tables, lex->field_list,
@@ -2805,6 +2775,18 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
 }
 
 
+static bool
+check_one_table_access(THD *thd, ulong want_access, TABLE_LIST *table,
+		       bool no_errors)
+{
+  if (check_access(thd, want_access, table->db, &table->grant.privilege, 0,
+		   no_errors))
+    return 1;
+  return (grant_option && check_grant(thd, want_access, table, 0,
+				      no_errors));
+}
+
+
 static bool check_db_used(THD *thd,TABLE_LIST *tables)
 {
   for (; tables ; tables=tables->next)
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index d34e2e68067485cce1bb4242620308461d36b0d8..addea958ff63e0d66fbd4c5d592c15d24593c17d 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -491,11 +491,6 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
   {
     if (!wild || !wild[0] || !wild_case_compare(field->field_name,wild))
     {
-#ifdef NOT_USED
-      if (thd->col_access & TABLE_ACLS ||
-          ! check_grant_column(thd,table,field->field_name,
-                               (uint) strlen(field->field_name),1))
-#endif
       {
         byte *pos;
         uint flags=field->flags;
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 4f5f21d61adac35ebb2828c40182460074d2aae6..d2ccd02051bd664bd67010598c3afe78f22d5fbb 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -15,8 +15,9 @@
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
 
-/* Update of records 
-   Multi-table updates were introduced by Monty and Sinisa <sinisa@mysql.com>
+/*
+  Single table and multi table updates of tables.
+  Multi-table updates were introduced by Sinisa & Monty
 */
 
 #include "mysql_priv.h"
@@ -398,20 +399,33 @@ int mysql_multi_update(THD *thd,
   TABLE_LIST *tl;
   DBUG_ENTER("mysql_multi_update");
 
-  table_list->grant.want_privilege=(SELECT_ACL & ~table_list->grant.privilege);
   if ((res=open_and_lock_tables(thd,table_list)))
     DBUG_RETURN(res);
 
   thd->select_limit=HA_POS_ERROR;
+
+  /*
+    Ensure that we have update privilege for all tables and columns in the
+    SET part
+  */
+  for (tl= table_list ; tl ; tl=tl->next)
+  {
+    TABLE *table= tl->table;
+    table->grant.want_privilege= (UPDATE_ACL & ~table->grant.privilege);
+  }
+
   if (setup_fields(thd, table_list, *fields, 1, 0, 0))
     DBUG_RETURN(-1);
 
   /*
     Count tables and setup timestamp handling
   */
-  for (tl= (TABLE_LIST*) table_list ; tl ; tl=tl->next)
+  for (tl= table_list ; tl ; tl=tl->next)
   {
     TABLE *table= tl->table;
+
+    /* We only need SELECT privilege for columns in the values list */
+    table->grant.want_privilege= (SELECT_ACL & ~table->grant.privilege);
     if (table->timestamp_field)
     {
       table->time_stamp=0;
diff --git a/tests/grant.pl b/tests/grant.pl
index 3146b7b6c258ed0bf42179a57a52466497e4d2ee..eb2d00f3e1d45e830fab27312ab70e4caba24dc2 100644
--- a/tests/grant.pl
+++ b/tests/grant.pl
@@ -54,7 +54,7 @@ safe_query("delete from columns_priv");
 safe_query("lock tables mysql.user write"); # Test lock tables
 safe_query("flush privileges");
 safe_query("unlock tables");	     # should already be unlocked
-safe_query("drop database $opt_database",2);
+safe_query("drop database $opt_database",3);	# Don't print possible error
 safe_query("create database $opt_database");
 
 # check that the user can't login yet
@@ -186,6 +186,7 @@ user_query("delete from $opt_database.test where a=3");
 user_query("create table $opt_database.test2 (a int not null)");
 user_query("alter table $opt_database.test2 add b int");
 user_query("create index dummy on $opt_database.test2 (a)");
+user_query("update test,test2 SET test.a=test2.a where test.a=test2.a");
 user_query("drop table $opt_database.test2");
 user_query("show tables from grant_test");
 # These should fail
@@ -195,6 +196,20 @@ user_query("insert into mysql.user (host,user) values ('error','$opt_user',0)",1
 safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user");
 safe_query("select * from mysql.user where user = '$opt_user'");
 safe_query("select * from mysql.db where user = '$opt_user'");
+
+# Test multi-updates
+safe_query("grant CREATE,UPDATE,DROP on $opt_database.* to $user");
+user_connect(0);
+user_query("create table $opt_database.test2 (a int not null)");
+user_query("update test,test2 SET test.a=1 where 1");
+user_query("update test,test2 SET test.a=test2.a where 1",1);
+safe_query("grant SELECT on $opt_database.* to $user");
+user_connect(0);
+user_query("update test,test2 SET test.a=test2.a where test2.a=test.a");
+user_query("drop table $opt_database.test2");
+
+# Revoke database privileges
+safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user");
 user_connect(1);
 
 #
@@ -216,11 +231,18 @@ user_query("insert into $opt_database.test values (8,0)");
 user_query("update $opt_database.test set b=1",1);
 safe_query("grant update on $opt_database.test to $user");
 user_query("update $opt_database.test set b=2");
+
+user_query("update $opt_database.test,test2 SET test.b=3",1);
+safe_query("grant select on $opt_database.test2 to $user");
+user_query("update $opt_database.test,test2 SET test.b=3");
+safe_query("revoke select on $opt_database.test2 from $user");
+
 user_query("delete from $opt_database.test",1);
 safe_query("grant delete on $opt_database.test to $user");
 user_query("delete from $opt_database.test where a=1",1);
 user_query("update $opt_database.test set b=3 where b=1",1);
 user_query("update $opt_database.test set b=b+1",1);
+user_query("update $opt_database.test,test2 SET test.a=test2.a",1);
 
 #
 # Test global SELECT privilege combined with table level privileges
@@ -230,6 +252,8 @@ safe_query("grant SELECT on *.* to $user");
 user_connect(0);
 user_query("update $opt_database.test set b=b+1");
 user_query("update $opt_database.test set b=b+1 where a > 0");
+user_query("update $opt_database.test,test2 SET test.a=test2.a");
+user_query("update $opt_database.test,test2 SET test2.a=test.a",1);
 safe_query("revoke SELECT on *.* from $user");
 safe_query("grant SELECT on $opt_database.* to $user");
 user_connect(0);
@@ -252,6 +276,9 @@ user_query("delete from $opt_database.test where a=1");
 user_query("update $opt_database.test set b=2 where b=1");
 user_query("update $opt_database.test set b=b+1");
 user_query("select count(*) from test");
+user_query("update test,test2 SET test.b=4",1);
+user_query("update test,test2 SET test2.a=test.a",1);
+user_query("update test,test2 SET test.a=test2.a",1);
 
 user_query("create table $opt_database.test3 (a int)",1);
 user_query("alter table $opt_database.test2 add c int",1);
@@ -270,10 +297,27 @@ user_query("select count(*) from test2,test",1);
 user_query("select count(*) from test,test2",1);
 user_query("replace into test2 SELECT a from test",1);
 safe_query("grant update on $opt_database.test2 to $user");
+user_query("update test,test2 SET test2.a=test.a");
+user_query("update test,test2 SET test.b=test2.a where 0",1);
+user_query("update test,test2 SET test.a=2 where test2.a>100",1);
+user_query("update test,test2 SET test.a=test2.a",1);
 user_query("replace into test2 SELECT a,a from test",1);
 safe_query("grant DELETE on $opt_database.test2 to $user");
 user_query("replace into test2 SELECT a,a from test");
 user_query("insert into test (a) SELECT a from test2",1);
+safe_query("grant SELECT on $opt_database.test2 to $user");
+user_query("update test,test2 SET test.b=test2.a where 0");
+user_query("update test,test2 SET test.a=test2.a where test2.a>100");
+
+safe_query("revoke UPDATE on $opt_database.test2 from $user");
+safe_query("grant UPDATE (c) on $opt_database.test2 to $user");
+user_query("update test,test2 SET test.b=test2.a where 0");
+user_query("update test,test2 SET test.a=test2.a where test2.a>100");
+user_query("update test,test2 SET test2.a=test2.a where test2.a>100",1);
+user_query("update test,test2 SET test2.c=test2.a where test2.a>100");
+
+safe_query("revoke SELECT,UPDATE on $opt_database.test2 from $user");
+safe_query("grant UPDATE on $opt_database.test2 to $user");
 
 user_query("drop table $opt_database.test2",1);
 user_query("grant select on $opt_database.test2 to $user with grant option",1);
@@ -315,9 +359,13 @@ user_query("select count(a) from test",1);
 # Test some grants on column level
 #
 
+safe_query("grant create,update on $opt_database.test2 to $user");
+user_query("create table $opt_database.test2 (a int not null)");
 user_query("delete from $opt_database.test where a=2",1);
 user_query("delete from $opt_database.test where A=2",1);
 user_query("update test set b=5 where b>0",1);
+user_query("update test,test2 SET test.b=5 where b>0",1);
+
 safe_query("grant update(b),delete on $opt_database.test to $user");
 safe_query("revoke update(a) on $opt_database.test from $user",1);
 user_query("delete from $opt_database.test where a=2",1);
@@ -327,12 +375,18 @@ user_query("delete from $opt_database.test where a=2");
 user_query("delete from $opt_database.test where A=2");
 user_query("update test set b=5 where b>0");
 user_query("update test set a=11 where b>5",1);
+user_query("update test,test2 SET test.b=5 where b>0");
+user_query("update test,test2 SET test.a=11 where b>0",1);
+user_query("update test,test2 SET test.b=test2.a where b>0",1);
+user_query("update test,test2 SET test.b=11 where test2.a>0",1);
 user_query("select a,A from test");
 
 safe_query("select $tables_cols from mysql.tables_priv");
 safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
 safe_query("select $tables_cols from mysql.tables_priv");
 safe_query("revoke GRANT OPTION on $opt_database.test from $user",1);
+safe_query("drop table $opt_database.test2");
+safe_query("revoke create,update on $opt_database.test2 from $user");
 
 #
 # Test grants on database level
@@ -412,7 +466,7 @@ safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user
 
 safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
 user_query("select count(a) from test",1);
-user_query("select * from mysql.user",1);
+user_query("select * from mysql.user order by hostname",1);
 safe_query("select * from mysql.db where user = '$opt_user'");
 safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
 safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
@@ -625,7 +679,7 @@ sub user_query
   {
     if (!defined($ignore_error))
     {
-      die "The above should not have failed!";
+      die "Query '$query' should not have failed!";
     }
   }
   elsif (defined($ignore_error) && $ignore_error == 1)
@@ -649,7 +703,7 @@ sub do_query
   if (!$sth->execute)
   {
     $fatal_error= ($DBI::errstr =~ /parse error/);
-    if (!$ignore_error || $opt_verbose || $fatal_error)
+    if (!$ignore_error || ($opt_verbose && $ignore_error != 3) || $fatal_error)
     {
       print "Error in execute: $DBI::errstr\n";
     }
diff --git a/tests/grant.res b/tests/grant.res
index f208241d989623e151939d28f0ca7e6d24d370a4..e2832d27817da0a8f938b65b98b2df6e5e6edb7b 100644
--- a/tests/grant.res
+++ b/tests/grant.res
@@ -6,10 +6,9 @@ lock tables mysql.user write
 flush privileges
 unlock tables
 drop database grant_test
-Error in execute: Can't drop database 'grant_test'. Database doesn't exist
 create database grant_test
 Connecting grant_user
-Error on connect: Access denied for user: '@localhost' to database 'grant_test'
+Error on connect: Access denied for user: ''@'localhost' to database 'grant_test'
 grant select(user) on mysql.user to grant_user@localhost
 revoke select(user) on mysql.user from grant_user@localhost
 grant select on *.* to grant_user@localhost
@@ -17,7 +16,7 @@ set password FOR grant_user2@localhost = password('test')
 Error in execute: Can't find any matching row in the user table
 set password FOR grant_user=password('test')
 Connecting grant_user
-Error on connect: Access denied for user: 'grant_user@localhost' (Using password: NO)
+Error on connect: Access denied for user: 'grant_user'@'localhost' (Using password: NO)
 set password FOR grant_user=''
 Connecting grant_user
 select * from mysql.user where user = 'grant_user'
@@ -30,13 +29,13 @@ GRANT SELECT ON *.* TO 'grant_user'@'localhost'
 
 Connecting grant_user
 insert into mysql.user (host,user) values ('error','grant_user')
-Error in execute: insert command denied to user: 'grant_user@localhost' for table 'user'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for table 'user'
 update mysql.user set host='error' WHERE user='grant_user'
-Error in execute: update command denied to user: 'grant_user@localhost' for table 'user'
+Error in execute: update command denied to user: 'grant_user'@'localhost' for table 'user'
 create table grant_test.test (a int,b int)
-Error in execute: create command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: create command denied to user: 'grant_user'@'localhost' for table 'test'
 grant select on *.* to grant_user2@localhost
-Error in execute: Access denied for user: 'grant_user@localhost' (Using password: NO)
+Error in execute: Access denied for user: 'grant_user'@'localhost' (Using password: NO)
 revoke select on grant_test.test from grant_user@opt_host
 Error in execute: There is no such grant defined for user 'grant_user' on host 'opt_host'
 revoke select on grant_test.* from grant_user@opt_host
@@ -46,25 +45,25 @@ Error in execute: There is no such grant defined for user 'grant_user' on host '
 grant select on grant_test.not_exists to grant_user
 Error in execute: Table 'grant_test.not_exists' doesn't exist
 grant FILE on grant_test.test to grant_user
-Error in execute: Illegal GRANT/REVOKE command. Please consult the manual which privileges can be used.
+Error in execute: Illegal GRANT/REVOKE command. Please consult the manual which privileges can be used
 grant select on *.* to wrong___________user_name
 Error in execute: The host or user argument to GRANT is too long
 grant select on grant_test.* to wrong___________user_name
 Error in execute: The host or user argument to GRANT is too long
 Connecting grant_user
 grant select on grant_test.test to grant_user with grant option
-Error in execute: grant command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: grant command denied to user: 'grant_user'@'localhost' for table 'test'
 set password FOR ''@''=''
 Error in execute: Can't find any matching row in the user table
 set password FOR root@localhost = password('test')
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'mysql'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'mysql'
 revoke select on *.* from grant_user@localhost
 grant create,update on *.* to grant_user@localhost
 Connecting grant_user
 flush privileges
 create table grant_test.test (a int,b int)
 update grant_test.test set b=b+1 where a > 0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 show grants for grant_user@localhost
 GRANT UPDATE, CREATE ON *.* TO 'grant_user'@'localhost'
 
@@ -77,12 +76,12 @@ Error in execute: There is no such grant defined for user 'grant_user' on host '
 grant select on grant_test.test to wrong___________user_name
 Error in execute: The host or user argument to GRANT is too long
 INSERT INTO grant_test.test values (2,0)
-Error in execute: insert command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for table 'test'
 grant ALL PRIVILEGES on *.* to grant_user@localhost
 REVOKE INSERT on *.* from grant_user@localhost
 Connecting grant_user
 INSERT INTO grant_test.test values (1,0)
-Error in execute: insert command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for table 'test'
 grant INSERT on *.* to grant_user@localhost
 Connecting grant_user
 INSERT INTO grant_test.test values (2,0)
@@ -92,7 +91,7 @@ select count(*) from grant_test.test
 revoke SELECT on *.* from grant_user@localhost
 Connecting grant_user
 select count(*) from grant_test.test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 INSERT INTO grant_test.test values (3,0)
 grant SELECT on *.* to grant_user@localhost
 Connecting grant_user
@@ -101,7 +100,7 @@ select count(*) from grant_test.test
 
 revoke ALL PRIVILEGES on *.* from grant_user@localhost
 Connecting grant_user
-Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error on connect: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 delete from user where user='grant_user'
 flush privileges
 delete from user where user='grant_user'
@@ -118,23 +117,23 @@ select count(*) from grant_test.test
 2
 
 select * from mysql.user where user = 'grant_user'
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'mysql'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'mysql'
 insert into grant_test.test values (4,0)
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 update grant_test.test set a=1
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 delete from grant_test.test
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 create table grant_test.test2 (a int)
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 ALTER TABLE grant_test.test add c int
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 CREATE INDEX dummy ON grant_test.test (a)
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 drop table grant_test.test
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 grant ALL PRIVILEGES on grant_test.* to grant_user2@localhost
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 grant ALL PRIVILEGES on grant_test.* to grant_user@localhost WITH GRANT OPTION
 Connecting grant_user
 insert into grant_test.test values (5,0)
@@ -145,33 +144,45 @@ REVOKE ALL PRIVILEGES on grant_test.* from grant_user@localhost
 REVOKE ALL PRIVILEGES on grant_test.* from grant_user@localhost
 Connecting grant_user
 insert into grant_test.test values (6,0)
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 REVOKE GRANT OPTION on grant_test.* from grant_user@localhost
 Connecting grant_user
-Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error on connect: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 grant ALL PRIVILEGES on grant_test.* to grant_user@localhost
 Connecting grant_user
 select * from mysql.user where user = 'grant_user'
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'mysql'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'mysql'
 insert into grant_test.test values (7,0)
 update grant_test.test set a=3 where a=2
 delete from grant_test.test where a=3
 create table grant_test.test2 (a int not null)
 alter table grant_test.test2 add b int
 create index dummy on grant_test.test2 (a)
+update test,test2 SET test.a=test2.a where test.a=test2.a
 drop table grant_test.test2
 show tables from grant_test
 test
 
 insert into mysql.user (host,user) values ('error','grant_user',0)
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'mysql'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'mysql'
 revoke ALL PRIVILEGES on grant_test.* from grant_user@localhost
 select * from mysql.user where user = 'grant_user'
 localhost	grant_user		N	N	N	N	N	N	N	N	N	N	N	N	N	N	N	N	N	N	N	N	N					0	0	0
 
 select * from mysql.db where user = 'grant_user'
+grant CREATE,UPDATE,DROP on grant_test.* to grant_user@localhost
 Connecting grant_user
-Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+create table grant_test.test2 (a int not null)
+update test,test2 SET test.a=1 where 1
+update test,test2 SET test.a=test2.a where 1
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
+grant SELECT on grant_test.* to grant_user@localhost
+Connecting grant_user
+update test,test2 SET test.a=test2.a where test2.a=test.a
+drop table grant_test.test2
+revoke ALL PRIVILEGES on grant_test.* from grant_user@localhost
+Connecting grant_user
+Error on connect: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 grant create on grant_test.test2 to grant_user@localhost
 Connecting grant_user
 create table grant_test.test2 (a int not null)
@@ -179,15 +190,15 @@ show tables
 test2
 
 show columns from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 show keys from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 show columns from test2
 a	int(11)			0	
 
 show keys from test2
 select * from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 grant insert on grant_test.test to grant_user@localhost
 show tables
 test
@@ -195,22 +206,32 @@ test2
 
 insert into grant_test.test values (8,0)
 update grant_test.test set b=1
-Error in execute: update command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: update command denied to user: 'grant_user'@'localhost' for table 'test'
 grant update on grant_test.test to grant_user@localhost
 update grant_test.test set b=2
+update grant_test.test,test2 SET test.b=3
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
+grant select on grant_test.test2 to grant_user@localhost
+update grant_test.test,test2 SET test.b=3
+revoke select on grant_test.test2 from grant_user@localhost
 delete from grant_test.test
-Error in execute: delete command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: delete command denied to user: 'grant_user'@'localhost' for table 'test'
 grant delete on grant_test.test to grant_user@localhost
 delete from grant_test.test where a=1
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 update grant_test.test set b=3 where b=1
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 update grant_test.test set b=b+1
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
+update grant_test.test,test2 SET test.a=test2.a
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant SELECT on *.* to grant_user@localhost
 Connecting grant_user
 update grant_test.test set b=b+1
 update grant_test.test set b=b+1 where a > 0
+update grant_test.test,test2 SET test.a=test2.a
+update grant_test.test,test2 SET test2.a=test.a
+Error in execute: UPDATE command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
 revoke SELECT on *.* from grant_user@localhost
 grant SELECT on grant_test.* to grant_user@localhost
 Connecting grant_user
@@ -224,11 +245,11 @@ revoke UPDATE on *.* from grant_user@localhost
 revoke SELECT on grant_test.* from grant_user@localhost
 Connecting grant_user
 update grant_test.test set b=b+1 where a > 0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 update grant_test.test set b=b+1
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 select * from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 grant select on grant_test.test to grant_user@localhost
 delete from grant_test.test where a=1
 update grant_test.test set b=2 where b=1
@@ -236,68 +257,93 @@ update grant_test.test set b=b+1
 select count(*) from test
 3
 
+update test,test2 SET test.b=4
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
+update test,test2 SET test2.a=test.a
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
+update test,test2 SET test.a=test2.a
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
 create table grant_test.test3 (a int)
-Error in execute: create command denied to user: 'grant_user@localhost' for table 'test3'
+Error in execute: create command denied to user: 'grant_user'@'localhost' for table 'test3'
 alter table grant_test.test2 add c int
-Error in execute: alter command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: alter command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant alter on grant_test.test2 to grant_user@localhost
 alter table grant_test.test2 add c int
 create index dummy ON grant_test.test (a)
-Error in execute: index command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: index command denied to user: 'grant_user'@'localhost' for table 'test'
 grant index on grant_test.test2 to grant_user@localhost
 create index dummy ON grant_test.test2 (a)
 insert into test2 SELECT a,a from test
-Error in execute: insert command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant insert on test2 to grant_user@localhost
 Error in execute: Table 'mysql.test2' doesn't exist
 grant insert(a) on grant_test.test2 to grant_user@localhost
 insert into test2 SELECT a,a from test
-Error in execute: insert command denied to user: 'grant_user@localhost' for column 'c' in table 'test2'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for column 'c' in table 'test2'
 grant insert(c) on grant_test.test2 to grant_user@localhost
 insert into test2 SELECT a,a from test
 select count(*) from test2,test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
 select count(*) from test,test2
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
 replace into test2 SELECT a from test
-Error in execute: delete command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: delete command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant update on grant_test.test2 to grant_user@localhost
+update test,test2 SET test2.a=test.a
+update test,test2 SET test.b=test2.a where 0
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
+update test,test2 SET test.a=2 where test2.a>100
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
+update test,test2 SET test.a=test2.a
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
 replace into test2 SELECT a,a from test
-Error in execute: delete command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: delete command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant DELETE on grant_test.test2 to grant_user@localhost
 replace into test2 SELECT a,a from test
 insert into test (a) SELECT a from test2
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
+grant SELECT on grant_test.test2 to grant_user@localhost
+update test,test2 SET test.b=test2.a where 0
+update test,test2 SET test.a=test2.a where test2.a>100
+revoke UPDATE on grant_test.test2 from grant_user@localhost
+grant UPDATE (c) on grant_test.test2 to grant_user@localhost
+update test,test2 SET test.b=test2.a where 0
+update test,test2 SET test.a=test2.a where test2.a>100
+update test,test2 SET test2.a=test2.a where test2.a>100
+Error in execute: UPDATE command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
+update test,test2 SET test2.c=test2.a where test2.a>100
+revoke SELECT,UPDATE on grant_test.test2 from grant_user@localhost
+grant UPDATE on grant_test.test2 to grant_user@localhost
 drop table grant_test.test2
-Error in execute: drop command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: drop command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant select on grant_test.test2 to grant_user@localhost with grant option
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
 grant drop on grant_test.test2 to grant_user@localhost with grant option
 grant drop on grant_test.test2 to grant_user@localhost with grant option
 grant select on grant_test.test2 to grant_user@localhost with grant option
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test2'
 rename table grant_test.test2 to grant_test.test3
-Error in execute: insert command denied to user: 'grant_user@localhost' for table 'test3'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for table 'test3'
 grant CREATE,DROP on grant_test.test3 to grant_user@localhost
 rename table grant_test.test2 to grant_test.test3
-Error in execute: insert command denied to user: 'grant_user@localhost' for table 'test3'
+Error in execute: insert command denied to user: 'grant_user'@'localhost' for table 'test3'
 create table grant_test.test3 (a int)
 grant INSERT on grant_test.test3 to grant_user@localhost
 drop table grant_test.test3
 rename table grant_test.test2 to grant_test.test3
 rename table grant_test.test3 to grant_test.test2
-Error in execute: alter command denied to user: 'grant_user@localhost' for table 'test3'
+Error in execute: alter command denied to user: 'grant_user'@'localhost' for table 'test3'
 grant ALTER on grant_test.test3 to grant_user@localhost
 rename table grant_test.test3 to grant_test.test2
 revoke DROP on grant_test.test2 from grant_user@localhost
 rename table grant_test.test2 to grant_test.test3
 drop table if exists grant_test.test2,grant_test.test3
-Error in execute: drop command denied to user: 'grant_user@localhost' for table 'test2'
+Error in execute: drop command denied to user: 'grant_user'@'localhost' for table 'test2'
 drop table if exists grant_test.test2,grant_test.test3
 create database grant_test
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 drop database grant_test
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 flush tables
 Error in execute: Access denied. You need the RELOAD privilege for this operation
 flush privileges
@@ -312,38 +358,54 @@ revoke ALL PRIVILEGES on grant_test.test3 from grant_user@localhost
 revoke GRANT OPTION on grant_test.test2 from grant_user@localhost
 select Host, Db, User, Table_name, Grantor, Table_priv, Column_priv from mysql.tables_priv
 select count(a) from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
+grant create,update on grant_test.test2 to grant_user@localhost
+create table grant_test.test2 (a int not null)
 delete from grant_test.test where a=2
-Error in execute: delete command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: delete command denied to user: 'grant_user'@'localhost' for table 'test'
 delete from grant_test.test where A=2
-Error in execute: delete command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: delete command denied to user: 'grant_user'@'localhost' for table 'test'
 update test set b=5 where b>0
-Error in execute: update command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: update command denied to user: 'grant_user'@'localhost' for table 'test'
+update test,test2 SET test.b=5 where b>0
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 grant update(b),delete on grant_test.test to grant_user@localhost
 revoke update(a) on grant_test.test from grant_user@localhost
 Error in execute: There is no such grant defined for user 'grant_user' on host 'localhost' on table 'test'
 delete from grant_test.test where a=2
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 update test set b=5 where b>0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 grant select(a),select(b) on grant_test.test to grant_user@localhost
 delete from grant_test.test where a=2
 delete from grant_test.test where A=2
 update test set b=5 where b>0
 update test set a=11 where b>5
-Error in execute: UPDATE command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: UPDATE command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
+update test,test2 SET test.b=5 where b>0
+update test,test2 SET test.a=11 where b>0
+Error in execute: UPDATE command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
+update test,test2 SET test.b=test2.a where b>0
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
+update test,test2 SET test.b=11 where test2.a>0
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test2'
 select a,A from test
 8	8
 5	5
 7	7
 
 select Host, Db, User, Table_name, Grantor, Table_priv, Column_priv from mysql.tables_priv
+localhost	grant_test	grant_user	test2	root@localhost	Update,Create	
 localhost	grant_test	grant_user	test	root@localhost	Delete	Select,Update
 
 revoke ALL PRIVILEGES on grant_test.test from grant_user@localhost
 select Host, Db, User, Table_name, Grantor, Table_priv, Column_priv from mysql.tables_priv
+localhost	grant_test	grant_user	test2	root@localhost	Update,Create	
+
 revoke GRANT OPTION on grant_test.test from grant_user@localhost
 Error in execute: There is no such grant defined for user 'grant_user' on host 'localhost' on table 'test'
+drop table grant_test.test2
+revoke create,update on grant_test.test2 from grant_user@localhost
 grant select(a) on grant_test.test to grant_user@localhost
 show full columns from test
 a	int(11)	YES		NULL		select
@@ -363,21 +425,21 @@ insert into test (b) values (5)
 insert into test (b) values (a)
 update test set b=3 where a > 0
 select * from test
-Error in execute: select command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 select b from test
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 select a from test where b > 0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 insert into test (a) values (10)
-Error in execute: INSERT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: INSERT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 insert into test (b) values (b)
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 insert into test (a,b) values (1,5)
-Error in execute: INSERT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: INSERT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 insert into test (b) values (1),(b)
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 update test set b=3 where b > 0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 select Host, Db, User, Table_name, Grantor, Table_priv, Column_priv from mysql.tables_priv
 localhost	grant_test	grant_user	test	root@localhost		Select,Insert,Update
 
@@ -393,9 +455,9 @@ select Host, Db, User, Table_name, Column_name, Column_priv from mysql.columns_p
 localhost	grant_test	grant_user	test	b	Insert
 
 select count(a) from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 update test set b=4
-Error in execute: update command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: update command denied to user: 'grant_user'@'localhost' for table 'test'
 grant select(a,b), update (a,b) on grant_test.test to grant_user@localhost
 select count(a),count(b) from test where a+b > 0
 3	3
@@ -411,13 +473,13 @@ localhost	grant_test	grant_user	test	b	Select,Insert,Update
 localhost	grant_test	grant_user	test	a	Select,Update
 
 insert into test (a,b) values (12,12)
-Error in execute: INSERT command denied to user: 'grant_user@localhost' for column 'a' in table 'test'
+Error in execute: INSERT command denied to user: 'grant_user'@'localhost' for column 'a' in table 'test'
 grant insert on grant_test.* to grant_user@localhost
 Connecting grant_user
 insert into test (a,b) values (13,13)
 revoke select(b) on grant_test.test from grant_user@localhost
 select count(a) from test where a+b > 0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 update test set b=5 where a=2
 grant select on grant_test.test to grant_user@localhost
 Connecting grant_user
@@ -431,10 +493,10 @@ select count(a) from test where a+b > 0
 revoke select on grant_test.test from grant_user@localhost
 Connecting grant_user
 select count(a) from test where a+b > 0
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
 grant select(a) on grant_test.test to grant_user@localhost
 select count(a) from test where a+b > 0
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test'
 grant select on *.* to grant_user@localhost
 Connecting grant_user
 select count(a) from test where a+b > 0
@@ -458,9 +520,9 @@ localhost	grant_test	grant_user	test	a	Select,Update
 
 revoke ALL PRIVILEGES on grant_test.test from grant_user@localhost
 select count(a) from test
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'test'
-select * from mysql.user
-Error in execute: select command denied to user: 'grant_user@localhost' for table 'user'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'test'
+select * from mysql.user order by hostname
+Error in execute: select command denied to user: 'grant_user'@'localhost' for table 'user'
 select * from mysql.db where user = 'grant_user'
 localhost	grant_test	grant_user	N	Y	N	N	N	N	N	N	N	N	N	N
 
@@ -492,25 +554,25 @@ select a from grant_test.test3
 1
 
 select * from grant_test.test3
-Error in execute: select command denied to user: 'grant_user@localhost' for column 'b' in table 'test3'
+Error in execute: select command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test3'
 select a,b from grant_test.test3
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test3'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test3'
 select b from grant_test.test3
-Error in execute: SELECT command denied to user: 'grant_user@localhost' for column 'b' in table 'test3'
+Error in execute: SELECT command denied to user: 'grant_user'@'localhost' for column 'b' in table 'test3'
 revoke SELECT(a) on grant_test.test3 from grant_user@localhost
 revoke FILE on *.* from grant_user@localhost
 drop table grant_test.test3
 create table grant_test.test3 (a int)
 Connecting grant_user
-Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error on connect: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 grant INSERT on grant_test.test3 to grant_user@localhost
 Connecting grant_user
 select * into outfile '/tmp/mysql-grant.test' from grant_test.test3
-Error in execute: Access denied for user: 'grant_user@localhost' (Using password: NO)
+Error in execute: Access denied for user: 'grant_user'@'localhost' (Using password: NO)
 grant SELECT on grant_test.test3 to grant_user@localhost
 Connecting grant_user
 LOCK TABLES grant_test.test3 READ
-Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error in execute: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 grant LOCK TABLES on *.* to grant_user@localhost
 show grants for grant_user@localhost
 GRANT LOCK TABLES ON *.* TO 'grant_user'@'localhost'
@@ -527,7 +589,7 @@ revoke SELECT,INSERT,UPDATE,DELETE on grant_test.test3 from grant_user@localhost
 Connecting grant_user
 revoke LOCK TABLES on *.* from grant_user@localhost
 Connecting grant_user
-Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
+Error on connect: Access denied for user: 'grant_user'@'localhost' to database 'grant_test'
 drop table grant_test.test3
 show grants for grant_user@localhost
 GRANT USAGE ON *.* TO 'grant_user'@'localhost'