diff options
author | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2021-10-17 17:58:53 +0530 |
---|---|---|
committer | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2021-10-18 12:11:53 +0530 |
commit | 9e8a961ee32ff1b86afa59a10a27797e58dbe2f0 (patch) | |
tree | 9d9107ce423aa9b141a2cab0ebe8aec9203f56fb | |
parent | c27f04ede5a92f37d0b22e5c90523bcccb1af37a (diff) | |
download | mariadb-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.result | 13 | ||||
-rw-r--r-- | mysql-test/main/get_diagnostics.test | 18 | ||||
-rw-r--r-- | sql/field.cc | 8 |
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; |