maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #13037
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