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
This commit is contained in:
parent
54167da4b0
commit
189761bcd3
@ -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
|
|||||||
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;
|
|||||||
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 @@ public:
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
(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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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()
|
|||||||
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()
|
|||||||
(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user