← Back to team overview

maria-developers team mailing list archive

Re: 803b977229c: MDEV-26698: Incorrect row number upon INSERT .. SELECT from the same table: rows are counted twice

 

Hi, Rucha!

Ok to push. One suggestion below.

On Dec 31, Rucha Deodhar wrote:
> revision-id: 803b977229c (mariadb-10.2.40-192-g803b977229c)
> parent(s): 42fea34d4a9
> author: Rucha Deodhar
> committer: Rucha Deodhar
> timestamp: 2021-12-29 16:09:10 +0530
> message:
> 
> MDEV-26698: Incorrect row number upon INSERT .. SELECT from the same
> table: rows are counted twice
> 
> diff --git a/sql/sql_select.cc b/sql/sql_select.cc
> index a331f4f3dbc..c8d5170f568 100644
> --- a/sql/sql_select.cc
> +++ b/sql/sql_select.cc
> @@ -18972,7 +18972,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
>    bool shortcut_for_distinct= join_tab->shortcut_for_distinct;
>    ha_rows found_records=join->found_records;
>    COND *select_cond= join_tab->select_cond;
> -  bool select_cond_result= TRUE;
> +  bool select_cond_result= TRUE, unlock_row= TRUE;
>  
>    DBUG_ENTER("evaluate_join_record");
>    DBUG_PRINT("enter",
> @@ -19124,6 +19124,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
>  
>      if (found)
>      {
> +      unlock_row= false;
>        enum enum_nested_loop_state rc;
>        /* A match from join_tab is found for the current partial join. */
>        rc= (*join_tab->next_select)(join, join_tab+1, 0);
> @@ -19147,11 +19148,6 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
>        if (shortcut_for_distinct && found_records != join->found_records)
>          DBUG_RETURN(NESTED_LOOP_NO_MORE_ROWS);

instead of unlock_row() you can put

         DBUG_RETURN(NESTED_LOOP_OK);

here. Might be a bit simpler to read.

>      }
> -    else
> -    {
> -      join->thd->get_stmt_da()->inc_current_row_for_warning();
> -      join_tab->read_record.unlock_row(join_tab);
> -    }
>    }
>    else
>    {
> @@ -19160,6 +19156,9 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
>        with the beginning coinciding with the current partial join.
>      */
>      join->join_examined_rows++;
> +  }
> +  if (unlock_row)
> +  {
>      join->thd->get_stmt_da()->inc_current_row_for_warning();
>      join_tab->read_record.unlock_row(join_tab);
>    }
> @@ -26945,6 +26944,12 @@ AGGR_OP::end_send()
>    table->reginfo.lock_type= TL_UNLOCK;
>  
>    bool in_first_read= true;
> +
> +  /*
> +     Reset the counter before copying rows from internal temporary table to
> +     INSERT table.
> +  */
> +  join_tab->join->thd->get_stmt_da()->reset_current_row_for_warning();
>    while (rc == NESTED_LOOP_OK)
>    {
>      int error;

Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx