summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/mysqld.cc3
-rw-r--r--sql/sql_parse.cc26
-rw-r--r--sql/sql_yacc.yy6
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;
}
;