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@mariadb.org