← Back to team overview

maria-developers team mailing list archive

Re: 60c1dc1: MDEV-6997: SET STATEMENT last_insert_id FOR ... does not affect the value written to the binlog


Hi, Sanja!

On Feb 25, sanja@xxxxxxxxxxx wrote:
> revision-id: 60c1dc1ab24bfe9b3f4a898fe5e7cb070ee02cf7
> parent(s): d0d6284cab70af148269d95744f615454cac24bb
> committer: Oleksandr Byelkin
> branch nick: work-maria-10.1-MDEV-6997-real
> timestamp: 2015-02-25 19:00:57 +0100
> message:
> MDEV-6997: SET STATEMENT last_insert_id FOR ... does not affect the value written to the binlog
> Problem was in reinitialization of
> first_successful_insert_id_in_prev_stmt_for_binlog after setting
> variables.
> diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
> index 5af700b..54abfd0 100644
> --- a/sql/sql_parse.cc
> +++ b/sql/sql_parse.cc
> @@ -2728,6 +2728,10 @@ static bool do_execute_sp(THD *thd, sp_head *sp)
>          my_error(ER_WRONG_ARGUMENTS, MYF(0), "SET");
>        goto error;
>      }
> +    if (!thd->in_sub_stmt) /* stored functions and triggers are a special case */
> +    {
> +      thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt= 0;
> +    }
>    }

This seems to be a pretty complicated matter, and your comment isn't
very helpful. Try this:

  The value of last_insert_id is remembered in THD to be written to binlog
  when it's used *the first time* in the statement. But SET STATEMENT
  must read the old value of last_insert_id to be able to restore it at
  the end. This should not count at "reading of last_insert_id" and
  should not remember last_insert_id for binlog. That is, it should set
  stmt_depends_on_first_successful_insert_id_in_prev_stmt flag.

And try the test case where SET STATEMENT last_insert_id is used inside
a trigger or a stored function. I don't think you handle this case
correctly. Try both cases, when stmt_depends... is 0 and is 1 at the
point of this if().

I suspect you should not set stmt_depends_on_first_successful_insert_id_in_prev_stmt
to 0, but you need to make sure it didn't change. That is, you need to
set it to its old value (which may or may not be 0).