summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2021-10-17 17:58:53 +0530
committerRucha Deodhar <rucha.deodhar@mariadb.com>2021-10-18 12:11:53 +0530
commit9e8a961ee32ff1b86afa59a10a27797e58dbe2f0 (patch)
tree9d9107ce423aa9b141a2cab0ebe8aec9203f56fb
parentc27f04ede5a92f37d0b22e5c90523bcccb1af37a (diff)
downloadmariadb-git-bb-10.7-row_number-MDEV-26842.tar.gz
MDEV-26842: MDEV-26842: ROW_NUMBER is not set and differs from the messagebb-10.7-row_number-MDEV-26842
upon WARN_DATA_TRUNCATED produced by inplace ALTER Analysis: When row number is passed as parameter to set_warning() it is only used for error/warning text but m_current_row_for_warning is not updated. Hence default value of m_current_row_for_warning is assumed. Fix: update m_current_row_for_warning when error/warning occurs.
-rw-r--r--mysql-test/main/get_diagnostics.result13
-rw-r--r--mysql-test/main/get_diagnostics.test18
-rw-r--r--sql/field.cc8
3 files changed, 39 insertions, 0 deletions
diff --git a/mysql-test/main/get_diagnostics.result b/mysql-test/main/get_diagnostics.result
index 14137bde36d..132e185180c 100644
--- a/mysql-test/main/get_diagnostics.result
+++ b/mysql-test/main/get_diagnostics.result
@@ -1716,3 +1716,16 @@ SELECT @row_num;
@row_num
105
DROP PROCEDURE resignal_syntax;
+#
+# MDEV-26842: ROW_NUMBER is not set and differs from the message upon
+# WARN_DATA_TRUNCATED produced by inplace ALTER
+#
+CREATE TABLE t1 (a VARCHAR(64)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('foo'),(null);
+ALTER TABLE t1 ADD PRIMARY KEY(a), ALGORITHM=INPLACE;
+ERROR 01000: Data truncated for column 'a' at row 2
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+@n @m
+2 Data truncated for column 'a' at row 2
+DROP TABLE t1;
diff --git a/mysql-test/main/get_diagnostics.test b/mysql-test/main/get_diagnostics.test
index 5c3071b4fe7..d3ec92840ca 100644
--- a/mysql-test/main/get_diagnostics.test
+++ b/mysql-test/main/get_diagnostics.test
@@ -1,3 +1,5 @@
+--source include/have_innodb.inc
+
SET NAMES utf8;
--echo #
@@ -1601,3 +1603,19 @@ GET DIAGNOSTICS CONDITION 1 @row_num= ROW_NUMBER;
SELECT @row_num;
DROP PROCEDURE resignal_syntax;
+
+--echo #
+--echo # MDEV-26842: ROW_NUMBER is not set and differs from the message upon
+--echo # WARN_DATA_TRUNCATED produced by inplace ALTER
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(64)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('foo'),(null);
+
+--error WARN_DATA_TRUNCATED
+ALTER TABLE t1 ADD PRIMARY KEY(a), ALGORITHM=INPLACE;
+
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+
+DROP TABLE t1;
diff --git a/sql/field.cc b/sql/field.cc
index a5cd595f05b..015822ecff9 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -11086,6 +11086,14 @@ Field::set_warning(Sql_condition::enum_warning_level level, uint code,
will have table == NULL.
*/
THD *thd= get_thd();
+
+ /*
+ In INPLACE ALTER, server can't know which row has generated
+ the warning, so the value of current row is supplied by the engine.
+ */
+ if (current_row)
+ thd->get_stmt_da()->reset_current_row_for_warning(current_row);
+
if (thd->count_cuted_fields > CHECK_FIELD_EXPRESSION)
{
thd->cuted_fields+= cut_increment;