Commit c762d934 authored by Gleb Shchepa's avatar Gleb Shchepa
Browse files

Bug #40745: Error during WHERE clause calculation in UPDATE

            leads to an assertion failure

Any run-time error in stored function (like recursive function
call or update of table that is already updating by statement
which invoked this stored function etc.) that was used in some
expression of the single-table UPDATE statement caused an
assertion failure.
Multiple-table UPDATE (as well as INSERT and both single- and
multiple-table DELETE) are not affected.
parent 8479932c
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -491,4 +491,15 @@ update t1 join t2 on (t1.a=t2.a) set t1.id=t2.id;
affected rows: 127
info: Rows matched: 128  Changed: 127  Warnings: 0
drop table t1,t2;
DROP TABLE IF EXISTS t1;
DROP FUNCTION IF EXISTS f1;
CREATE FUNCTION f1() RETURNS INT RETURN f1();
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1);
UPDATE t1 SET i = 3 WHERE f1();
ERROR HY000: Recursive stored functions and triggers are not allowed.
UPDATE t1 SET i = f1();
ERROR HY000: Recursive stored functions and triggers are not allowed.
DROP TABLE t1;
DROP FUNCTION f1;
End of 5.0 tests
+21 −0
Original line number Diff line number Diff line
@@ -430,4 +430,25 @@ drop table t1,t2;
connection default;
disconnect con1;

#
# Bug #40745: Error during WHERE clause calculation in UPDATE
#             leads to an assertion failure
#
--disable_warnings
DROP TABLE IF EXISTS t1;
DROP FUNCTION IF EXISTS f1;
--enable_warnings

CREATE FUNCTION f1() RETURNS INT RETURN f1();
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1);

--error ER_SP_NO_RECURSION
UPDATE t1 SET i = 3 WHERE f1();
--error ER_SP_NO_RECURSION
UPDATE t1 SET i = f1();

DROP TABLE t1;
DROP FUNCTION f1;

--echo End of 5.0 tests
+5 −0
Original line number Diff line number Diff line
@@ -715,6 +715,11 @@ int mysql_update(THD *thd,
    else
      table->file->unlock_row();
    thd->row_count++;
    if (thd->is_error())
    {
      error= 1;
      break;
    }
  }
  dup_key_found= 0;
  /*