mariadb/tests
Dmitry Shulga ba5482ffc2 MDEV-34718: Trigger doesn't work correctly with bulk update
Running an UPDATE statement in PS mode and having positional
parameter(s) bound with an array of actual values (that is
prepared to be run in bulk mode) results in incorrect behaviour
in presence of on update trigger that also executes an UPDATE
statement. The same is true for handling a DELETE statement in
presence of on delete trigger. Typically, the visible effect of
such incorrect behaviour is expressed in a wrong number of
updated/deleted rows of a target table. Additionally, in case UPDATE
statement, a number of modified rows and a state message returned
by a statement contains wrong information about a number of modified rows.

The reason for incorrect number of updated/deleted rows is that
a data structure used for binding positional argument with its
actual values is stored in THD (this is thd->bulk_param) and reused
on processing every INSERT/UPDATE/DELETE statement. It leads to
consuming actual values bound with top-level UPDATE/DELETE statement
by other DML statements used by triggers' body.

To fix the issue, reset the thd->bulk_param temporary to the value
nullptr before invoking triggers and restore its value on finishing
its execution.

The second part of the problem relating with wrong value of affected
rows reported by Connector/C API is caused by the fact that diagnostics
area is reused by an original DML statement and a statement invoked
by a trigger. This fact should be take into account on finalizing a
state of diagnostics area on completion running of a statement.

Important remark: in case the macros DBUG_OFF is on, call of the method
  Diagnostics_area::reset_diagnostics_area()
results in reset of the data members
  m_affected_rows, m_statement_warn_count.
Values of these data members of the class Diagnostics_area are used on
sending OK and EOF messages. In case DML statement is executed in PS bulk
mode such resetting results in sending wrong result values to a client
for affected rows in case the DML statement fires a triggers. So, reset
these data members only in case the current statement being processed
is not run in bulk mode.
2024-08-19 12:13:43 +07:00
..
code_quality
async_queries.c
auto_increment.res
auto_increment.tst
big_record.pl
bug25714.c
check_async_queries.pl
CMakeLists.txt
connect_test.c
consistent_snapshot.pl
deadlock_test.c
drop_test.pl
export.pl
fork2_test.pl
fork_big.pl
fork_big2.pl
function.res
function.tst
grant.res
index_corrupt.pl
insert_and_repair.pl
insert_test.c
list_test.c
lock_test.pl
lock_test.res
mail_to_db.pl
myisam-big-rows.tst
mysql_client_fw.c
mysql_client_test.c
nonblock-wrappers.h
pmail.pl
rename_test.pl
restore-lock.smack
select_test.c
showdb_test.c
ssl_test.c
table_types.pl
test_delayed_insert.pl
thread_test.c
truncate.pl