diff options
author | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2022-01-23 13:42:41 +0530 |
---|---|---|
committer | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2022-04-26 14:27:50 +0530 |
commit | ee5966c75404fd4e35dde52f1ebb78e3e20ebf77 (patch) | |
tree | d7a4890d4bfeebf9a2a2201e118a7c9470ad7ca1 | |
parent | 9e314fcf6e666ce6fdbdd8ca1ae23d6c4b389b21 (diff) | |
download | mariadb-git-ee5966c75404fd4e35dde52f1ebb78e3e20ebf77.tar.gz |
MDEV-26695: Number of an invalid row is not calculated for table value
constructor
Analysis: counter does not increment while sending rows for table value
constructor and so row_number assumes the default value (0 in this case).
Fix: Increment the counter to avoid counter using default value.
-rw-r--r-- | mysql-test/main/get_diagnostics.result | 35 | ||||
-rw-r--r-- | mysql-test/main/get_diagnostics.test | 24 | ||||
-rw-r--r-- | sql/sql_tvc.cc | 6 |
3 files changed, 63 insertions, 2 deletions
diff --git a/mysql-test/main/get_diagnostics.result b/mysql-test/main/get_diagnostics.result index 2e749fa21d7..9f57ef4cabf 100644 --- a/mysql-test/main/get_diagnostics.result +++ b/mysql-test/main/get_diagnostics.result @@ -1811,3 +1811,38 @@ SELECT @n; @n 4 DROP TABLE t; +# +# MDEV-26695: Number of an invalid row is not calculated for table value constructor +# +CREATE TABLE t1 (a CHAR(1)) VALUES ('a'),('b'),('foo'); +Warnings: +Warning 1406 Data too long for column 'a' at row 3 +GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER; +SELECT @n; +@n +3 +CREATE TABLE t2 (a CHAR(1)) VALUES ('a'),('b') UNION VALUES ('foo'); +Warnings: +Warning 1406 Data too long for column 'a' at row 3 +GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER; +SELECT @n; +@n +3 +DROP TABLE t1, t2; +# Checking that CREATE ... SELECT works +CREATE TABLE t1 (val1 CHAR(5)); +INSERT INTO t1 VALUES ('A'),('B'),('C'),('DEF'); +CREATE TABLE t2 (val2 CHAR(1)) SELECT val1 as val2 FROM t1; +Warnings: +Warning 1406 Data too long for column 'val2' at row 4 +GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER; +SELECT @n; +@n +4 +SELECT * FROM t2; +val2 +A +B +C +D +DROP TABLE t1,t2; diff --git a/mysql-test/main/get_diagnostics.test b/mysql-test/main/get_diagnostics.test index e8d81dca1e6..7292443a8b5 100644 --- a/mysql-test/main/get_diagnostics.test +++ b/mysql-test/main/get_diagnostics.test @@ -1687,3 +1687,27 @@ GET DIAGNOSTICS CONDITION 3 @n = ROW_NUMBER; SELECT @n; DROP TABLE t; + +--echo # +--echo # MDEV-26695: Number of an invalid row is not calculated for table value constructor +--echo # + +CREATE TABLE t1 (a CHAR(1)) VALUES ('a'),('b'),('foo'); +GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER; +SELECT @n; +CREATE TABLE t2 (a CHAR(1)) VALUES ('a'),('b') UNION VALUES ('foo'); +GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER; +SELECT @n; + +DROP TABLE t1, t2; + +--echo # Checking that CREATE ... SELECT works + +CREATE TABLE t1 (val1 CHAR(5)); +INSERT INTO t1 VALUES ('A'),('B'),('C'),('DEF'); +CREATE TABLE t2 (val2 CHAR(1)) SELECT val1 as val2 FROM t1; +GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER; +SELECT @n; +SELECT * FROM t2; + +DROP TABLE t1,t2; diff --git a/sql/sql_tvc.cc b/sql/sql_tvc.cc index 6efdf5f9471..be6e120716d 100644 --- a/sql/sql_tvc.cc +++ b/sql/sql_tvc.cc @@ -422,7 +422,9 @@ bool table_value_constr::exec(SELECT_LEX *sl) DBUG_ENTER("table_value_constr::exec"); List_iterator_fast<List_item> li(lists_of_values); List_item *elem; + THD *cur_thd= sl->parent_lex->thd; ha_rows send_records= 0; + int rc=0; if (select_options & SELECT_DESCRIBE) DBUG_RETURN(false); @@ -438,10 +440,10 @@ bool table_value_constr::exec(SELECT_LEX *sl) while ((elem= li++)) { + cur_thd->get_stmt_da()->inc_current_row_for_warning(); if (send_records >= sl->master_unit()->lim.get_select_limit()) break; - int rc= - result->send_data_with_check(*elem, sl->master_unit(), send_records); + rc= result->send_data_with_check(*elem, sl->master_unit(), send_records); if (!rc) send_records++; else if (rc > 0) |