summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2021-10-18 13:27:36 +0530
committerSergei Golubchik <serg@mariadb.org>2021-10-26 17:29:40 +0200
commite13dc7d0d0820973684753cdb5cf674c4595f47b (patch)
tree49f954f49a39bd2a331cf4b719e7b4b9a131d53a
parent797bd73cfa09e002819e847bd1aa9fea79dc5d9f (diff)
downloadmariadb-git-e13dc7d0d0820973684753cdb5cf674c4595f47b.tar.gz
MDEV-26830: Wrong ROW_NUMBER in diagnostics upon INSERT IGNORE with
CHECK violation Analysis: When there is constraint fail we return non-zero value for view_check_option(). So we continue the loop which doesn't increment the counter because it increments at the end of the loop. Fix: Increment m_current_row_for_warning() at the beginning of loop. This will also fix similar bugs if any, about counter not incrementing correctly because of continue.
-rw-r--r--mysql-test/main/get_diagnostics.result18
-rw-r--r--mysql-test/main/get_diagnostics.test14
-rw-r--r--sql/sql_insert.cc4
3 files changed, 34 insertions, 2 deletions
diff --git a/mysql-test/main/get_diagnostics.result b/mysql-test/main/get_diagnostics.result
index 6b01cbd78e0..a884ebe3fe0 100644
--- a/mysql-test/main/get_diagnostics.result
+++ b/mysql-test/main/get_diagnostics.result
@@ -1765,3 +1765,21 @@ SELECT @n, @m;
@n @m
1 Column count doesn't match value count at row 1
DROP TABLE t1;
+#
+# MDEV-26830: Wrong ROW_NUMBER in diagnostics upon INSERT IGNORE with
+# CHECK violation
+#
+CREATE TABLE t1 (a INT, CHECK(a>0));
+INSERT IGNORE INTO t1 VALUES (1),(0),(2),(0);
+Warnings:
+Warning 4025 CONSTRAINT `CONSTRAINT_1` failed for `test`.`t1`
+Warning 4025 CONSTRAINT `CONSTRAINT_1` failed for `test`.`t1`
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+@n
+2
+GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER;
+SELECT @n;
+@n
+4
+DROP TABLE t1;
diff --git a/mysql-test/main/get_diagnostics.test b/mysql-test/main/get_diagnostics.test
index 623d9a9a686..a1779f3c0ab 100644
--- a/mysql-test/main/get_diagnostics.test
+++ b/mysql-test/main/get_diagnostics.test
@@ -1653,3 +1653,17 @@ GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
SELECT @n, @m;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26830: Wrong ROW_NUMBER in diagnostics upon INSERT IGNORE with
+--echo # CHECK violation
+--echo #
+
+CREATE TABLE t1 (a INT, CHECK(a>0));
+INSERT IGNORE INTO t1 VALUES (1),(0),(2),(0);
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER;
+SELECT @n;
+
+DROP TABLE t1;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index d3df63fe0e6..e76fc5ca49f 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -844,7 +844,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
switch_to_nullable_trigger_fields(*values, table);
}
its.rewind ();
- thd->get_stmt_da()->reset_current_row_for_warning(1);
+ thd->get_stmt_da()->reset_current_row_for_warning(0);
/* Restore the current context. */
ctx_state.restore_state(context, table_list);
@@ -1011,6 +1011,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
while ((values= its++))
{
+ thd->get_stmt_da()->inc_current_row_for_warning();
if (fields.elements || !value_count)
{
/*
@@ -1127,7 +1128,6 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
if (unlikely(error))
break;
info.accepted_rows++;
- thd->get_stmt_da()->inc_current_row_for_warning();
}
its.rewind();
iteration++;