diff options
-rw-r--r-- | sql/mysqld.cc | 3 | ||||
-rw-r--r-- | sql/sql_parse.cc | 26 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 6 |
3 files changed, 22 insertions, 13 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b45caac5ab6..1cbc071fb4d 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4010,7 +4010,7 @@ struct show_var_st status_vars[]= { {"Com_insert_select", (char*) (com_stat+(uint) SQLCOM_INSERT_SELECT),SHOW_LONG}, {"Com_kill", (char*) (com_stat+(uint) SQLCOM_KILL),SHOW_LONG}, {"Com_load", (char*) (com_stat+(uint) SQLCOM_LOAD),SHOW_LONG}, - {"Com_load_master_data", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_DATA),SHOW_LONG}, + {"Com_load_master_data", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_DATA),SHOW_LONG}, {"Com_load_master_table", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_TABLE),SHOW_LONG}, {"Com_lock_tables", (char*) (com_stat+(uint) SQLCOM_LOCK_TABLES),SHOW_LONG}, {"Com_optimize", (char*) (com_stat+(uint) SQLCOM_OPTIMIZE),SHOW_LONG}, @@ -4048,6 +4048,7 @@ struct show_var_st status_vars[]= { {"Com_truncate", (char*) (com_stat+(uint) SQLCOM_TRUNCATE),SHOW_LONG}, {"Com_unlock_tables", (char*) (com_stat+(uint) SQLCOM_UNLOCK_TABLES),SHOW_LONG}, {"Com_update", (char*) (com_stat+(uint) SQLCOM_UPDATE),SHOW_LONG}, + {"Com_update_multi", (char*) (com_stat+(uint) SQLCOM_UPDATE_MULTI),SHOW_LONG}, {"Connections", (char*) &thread_id, SHOW_LONG_CONST}, {"Created_tmp_disk_tables", (char*) &created_tmp_disk_tables,SHOW_LONG}, {"Created_tmp_tables", (char*) &created_tmp_tables, SHOW_LONG}, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 11f1c59fd45..70fb5acdffd 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1894,24 +1894,30 @@ mysql_execute_command(THD *thd) send_error(thd,ER_WRONG_VALUE_COUNT); DBUG_VOID_RETURN; } - if (select_lex->table_list.elements == 1) + res= mysql_update(thd,tables, + select_lex->item_list, + lex->value_list, + select_lex->where, + (ORDER *) select_lex->order_list.first, + select_lex->select_limit, + lex->duplicates); + break; + case SQLCOM_UPDATE_MULTI: + if (check_access(thd,UPDATE_ACL,tables->db,&tables->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) { - res= mysql_update(thd,tables, - select_lex->item_list, - lex->value_list, - select_lex->where, - (ORDER *) select_lex->order_list.first, - select_lex->select_limit, - lex->duplicates); + send_error(thd,ER_WRONG_VALUE_COUNT); + DBUG_VOID_RETURN; } - else { multi_update *result; uint table_count; TABLE_LIST *auxi; const char *msg=0; - lex->sql_command=SQLCOM_UPDATE_MULTI; for (auxi= (TABLE_LIST*) tables, table_count=0 ; auxi ; auxi=auxi->next) table_count++; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index cd15fb19dfb..c54f1f556df 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3051,8 +3051,8 @@ opt_insert_update: /* Update rows in a table */ update: - UPDATE_SYM - { + UPDATE_SYM + { LEX *lex= Lex; lex->sql_command= SQLCOM_UPDATE; lex->select_lex.init_order(); @@ -3061,6 +3061,8 @@ update: SET update_list where_clause opt_order_clause delete_limit_clause { Select->set_lock_for_tables($3); + if (lex->select_lex->table_list.elements > 1) + lex->sql_command=SQLCOM_UPDATE_MULTI; } ; |