Commit 1d3b1633 authored by unknown's avatar unknown

actions for bug

#2709 Affected Rows for ON DUPL. KEY undocumented, perheps illogical 
1. added COPY_INFO::updated to work with it in
   'insert .. on duplicate' instead of COPY_INFO::deleted
2. added affected rows to output of "info:" in mysqltest.c


client/mysqltest.c:
  added "affected rows" to output of "info : "..
mysql-test/r/insert_update.result:
  added tests for affected rows with insert .. duplicate (bug #2709)
mysql-test/t/insert_update.test:
  added tests for affected rows with insert .. duplicate (bug #2709)
sql/sql_class.h:
  added COPY_INFO::updated
sql/sql_insert.cc:
  get write_record to work with COPY_INFO::updated instead of 
  COPY_INFO::deleted for 'insert ... duplicate' statement
parent 1b81fcf8
...@@ -2331,11 +2331,17 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -2331,11 +2331,17 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
mysql_free_result(warn_res); mysql_free_result(warn_res);
} }
} }
if (!disable_info && mysql_info(mysql)) if (!disable_info)
{ {
dynstr_append(ds, "info: "); char buf[40];
dynstr_append(ds, mysql_info(mysql)); sprintf(buf,"affected rows: %ld\n",mysql_affected_rows(mysql));
dynstr_append_mem(ds, "\n", 1); dynstr_append(ds, buf);
if (mysql_info(mysql))
{
dynstr_append(ds, "info: ");
dynstr_append(ds, mysql_info(mysql));
dynstr_append_mem(ds, "\n", 1);
}
} }
} }
......
...@@ -67,3 +67,41 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -67,3 +67,41 @@ id select_type table type possible_keys key key_len ref rows Extra
Warnings: Warnings:
Note 1003 select high_priority test.t1.a AS `a`,test.t1.b AS `b`,test.t1.c AS `c` from test.t1 Note 1003 select high_priority test.t1.a AS `a`,test.t1.b AS `b`,test.t1.c AS `c` from test.t1
DROP TABLE t1; DROP TABLE t1;
create table t1(a int primary key, b int);
insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5);
select * from t1;
a b
1 1
2 2
3 3
4 4
5 5
insert into t1 values(4,14),(5,15),(6,16),(7,17),(8,18)
on duplicate key update b=b+10;
affected rows: 7
info: Records: 5 Duplicates: 2 Warnings: 0
select * from t1;
a b
1 1
2 2
3 3
4 14
5 15
6 16
7 17
8 18
replace into t1 values(5,25),(6,26),(7,27),(8,28),(9,29);
affected rows: 9
info: Records: 5 Duplicates: 4 Warnings: 0
select * from t1;
a b
1 1
2 2
3 3
4 14
5 25
6 26
7 27
8 28
9 29
drop table t1;
...@@ -26,3 +26,25 @@ SELECT *, VALUES(a) FROM t1; ...@@ -26,3 +26,25 @@ SELECT *, VALUES(a) FROM t1;
explain extended SELECT *, VALUES(a) FROM t1; explain extended SELECT *, VALUES(a) FROM t1;
explain extended select * from t1 where values(a); explain extended select * from t1 where values(a);
DROP TABLE t1; DROP TABLE t1;
#
# test for Bug #2709 "Affected Rows for ON DUPL.KEY undocumented,
# perhaps illogical"
#
create table t1(a int primary key, b int);
insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5);
select * from t1;
enable_info;
insert into t1 values(4,14),(5,15),(6,16),(7,17),(8,18)
on duplicate key update b=b+10;
disable_info;
select * from t1;
enable_info;
replace into t1 values(5,25),(6,26),(7,27),(8,28),(9,29);
disable_info;
select * from t1;
drop table t1;
...@@ -194,6 +194,7 @@ class MYSQL_LOG ...@@ -194,6 +194,7 @@ class MYSQL_LOG
typedef struct st_copy_info { typedef struct st_copy_info {
ha_rows records; ha_rows records;
ha_rows deleted; ha_rows deleted;
ha_rows updated;
ha_rows copied; ha_rows copied;
ha_rows error_count; ha_rows error_count;
enum enum_duplicates handle_duplicates; enum enum_duplicates handle_duplicates;
......
...@@ -236,7 +236,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -236,7 +236,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
Fill in the given fields and dump it to the table file Fill in the given fields and dump it to the table file
*/ */
info.records=info.deleted=info.copied=0; info.records= info.deleted= info.copied= info.updated= 0;
info.handle_duplicates=duplic; info.handle_duplicates=duplic;
info.update_fields=&update_fields; info.update_fields=&update_fields;
info.update_values=&update_values; info.update_values=&update_values;
...@@ -369,13 +369,14 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -369,13 +369,14 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
For the transactional algorithm to work the invalidation must be For the transactional algorithm to work the invalidation must be
before binlog writing and ha_autocommit_... before binlog writing and ha_autocommit_...
*/ */
if (info.copied || info.deleted) if (info.copied || info.deleted || info.updated)
query_cache_invalidate3(thd, table_list, 1); query_cache_invalidate3(thd, table_list, 1);
transactional_table= table->file->has_transactions(); transactional_table= table->file->has_transactions();
log_delayed= (transactional_table || table->tmp_table); log_delayed= (transactional_table || table->tmp_table);
if ((info.copied || info.deleted) && (error <= 0 || !transactional_table)) if ((info.copied || info.deleted || info.updated) &&
(error <= 0 || !transactional_table))
{ {
mysql_update_log.write(thd, thd->query, thd->query_length); mysql_update_log.write(thd, thd->query, thd->query_length);
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
...@@ -416,7 +417,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -416,7 +417,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
goto abort; goto abort;
if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) || if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) ||
!thd->cuted_fields)) !thd->cuted_fields))
send_ok(thd,info.copied+info.deleted,id); send_ok(thd,info.copied+info.deleted+info.updated,id);
else else
{ {
char buff[160]; char buff[160];
...@@ -426,8 +427,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -426,8 +427,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields); (ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
else else
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
(ulong) info.deleted, (ulong) thd->cuted_fields); (ulong) info.deleted+info.updated, (ulong) thd->cuted_fields);
::send_ok(thd,info.copied+info.deleted,(ulonglong)id,buff); ::send_ok(thd,info.copied+info.deleted+info.updated,(ulonglong)id,buff);
} }
free_underlaid_joins(thd, &thd->lex->select_lex); free_underlaid_joins(thd, &thd->lex->select_lex);
table->insert_values=0; table->insert_values=0;
...@@ -529,7 +530,7 @@ int write_record(TABLE *table,COPY_INFO *info) ...@@ -529,7 +530,7 @@ int write_record(TABLE *table,COPY_INFO *info)
goto err; goto err;
if ((error=table->file->update_row(table->record[1],table->record[0]))) if ((error=table->file->update_row(table->record[1],table->record[0])))
goto err; goto err;
info->deleted++; info->updated++;
break; break;
} }
else /* DUP_REPLACE */ else /* DUP_REPLACE */
...@@ -1474,7 +1475,8 @@ void select_insert::send_error(uint errcode,const char *err) ...@@ -1474,7 +1475,8 @@ void select_insert::send_error(uint errcode,const char *err)
error while inserting into a MyISAM table) we must write to the binlog (and error while inserting into a MyISAM table) we must write to the binlog (and
the error code will make the slave stop). the error code will make the slave stop).
*/ */
if ((info.copied || info.deleted) && !table->file->has_transactions()) if ((info.copied || info.deleted || info.updated) &&
!table->file->has_transactions())
{ {
if (last_insert_id) if (last_insert_id)
thd->insert_id(last_insert_id); // For binary log thd->insert_id(last_insert_id); // For binary log
...@@ -1488,7 +1490,7 @@ void select_insert::send_error(uint errcode,const char *err) ...@@ -1488,7 +1490,7 @@ void select_insert::send_error(uint errcode,const char *err)
if (!table->tmp_table) if (!table->tmp_table)
thd->options|=OPTION_STATUS_NO_TRANS_UPDATE; thd->options|=OPTION_STATUS_NO_TRANS_UPDATE;
} }
if (info.copied || info.deleted) if (info.copied || info.deleted || info.updated)
query_cache_invalidate3(thd, table, 1); query_cache_invalidate3(thd, table, 1);
ha_rollback_stmt(thd); ha_rollback_stmt(thd);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -1509,7 +1511,7 @@ bool select_insert::send_eof() ...@@ -1509,7 +1511,7 @@ bool select_insert::send_eof()
and ha_autocommit_... and ha_autocommit_...
*/ */
if (info.copied || info.deleted) if (info.copied || info.deleted || info.updated)
{ {
query_cache_invalidate3(thd, table, 1); query_cache_invalidate3(thd, table, 1);
if (!(table->file->has_transactions() || table->tmp_table)) if (!(table->file->has_transactions() || table->tmp_table))
...@@ -1543,8 +1545,8 @@ bool select_insert::send_eof() ...@@ -1543,8 +1545,8 @@ bool select_insert::send_eof()
(ulong) (info.records - info.copied), (ulong) thd->cuted_fields); (ulong) (info.records - info.copied), (ulong) thd->cuted_fields);
else else
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
(ulong) info.deleted, (ulong) thd->cuted_fields); (ulong) info.deleted+info.updated, (ulong) thd->cuted_fields);
::send_ok(thd,info.copied+info.deleted,last_insert_id,buff); ::send_ok(thd,info.copied+info.deleted+info.updated,last_insert_id,buff);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment