Description:
The function ha_innopart::store_lock() intend to traverse all partitions to call row_quiesce_set_state() for each partition's dict_table_t. But it starts from array index one instead of zero. How about the first partition with index 0 in array m_part_share? I think this is a typo error to leave out the first partition.
How to repeat:
Look into the function ha_innopart::store_lock() code in storage/innobase/handler/ha_innopart.cc .
THR_LOCK_DATA **ha_innopart::store_lock(THD *thd, THR_LOCK_DATA **to,
                                        thr_lock_type lock_type) {
  trx_t *trx = m_prebuilt->trx;
  const uint sql_command = thd_sql_command(thd);
  ha_innobase::store_lock(thd, to, lock_type);
  if (sql_command == SQLCOM_FLUSH && lock_type == TL_READ_NO_INSERT) {
    for (uint i = 1; i < m_tot_parts; i++) {
      dict_table_t *table = m_part_share->get_table_part(i);
      dberr_t err = row_quiesce_set_state(table, QUIESCE_START, trx);
      ut_a(err == DB_SUCCESS || err == DB_UNSUPPORTED);
    }
  }
  return to;
}
Suggested fix:
diff --git a/storage/innobase/handler/ha_innopart.cc b/storage/innobase/handler/ha_innopart.cc
index e6c2fe0eebe..6eda8f685fe 100644
--- a/storage/innobase/handler/ha_innopart.cc
+++ b/storage/innobase/handler/ha_innopart.cc
@@ -3985,7 +3985,7 @@ THR_LOCK_DATA **ha_innopart::store_lock(THD *thd, THR_LOCK_DATA **to,
   ha_innobase::store_lock(thd, to, lock_type);
   if (sql_command == SQLCOM_FLUSH && lock_type == TL_READ_NO_INSERT) {
-    for (uint i = 1; i < m_tot_parts; i++) {
+    for (uint i = 0; i < m_tot_parts; i++) {
       dict_table_t *table = m_part_share->get_table_part(i);
       dberr_t err = row_quiesce_set_state(table, QUIESCE_START, trx);
  
 
 
Description: The function ha_innopart::store_lock() intend to traverse all partitions to call row_quiesce_set_state() for each partition's dict_table_t. But it starts from array index one instead of zero. How about the first partition with index 0 in array m_part_share? I think this is a typo error to leave out the first partition. How to repeat: Look into the function ha_innopart::store_lock() code in storage/innobase/handler/ha_innopart.cc . THR_LOCK_DATA **ha_innopart::store_lock(THD *thd, THR_LOCK_DATA **to, thr_lock_type lock_type) { trx_t *trx = m_prebuilt->trx; const uint sql_command = thd_sql_command(thd); ha_innobase::store_lock(thd, to, lock_type); if (sql_command == SQLCOM_FLUSH && lock_type == TL_READ_NO_INSERT) { for (uint i = 1; i < m_tot_parts; i++) { dict_table_t *table = m_part_share->get_table_part(i); dberr_t err = row_quiesce_set_state(table, QUIESCE_START, trx); ut_a(err == DB_SUCCESS || err == DB_UNSUPPORTED); } } return to; } Suggested fix: diff --git a/storage/innobase/handler/ha_innopart.cc b/storage/innobase/handler/ha_innopart.cc index e6c2fe0eebe..6eda8f685fe 100644 --- a/storage/innobase/handler/ha_innopart.cc +++ b/storage/innobase/handler/ha_innopart.cc @@ -3985,7 +3985,7 @@ THR_LOCK_DATA **ha_innopart::store_lock(THD *thd, THR_LOCK_DATA **to, ha_innobase::store_lock(thd, to, lock_type); if (sql_command == SQLCOM_FLUSH && lock_type == TL_READ_NO_INSERT) { - for (uint i = 1; i < m_tot_parts; i++) { + for (uint i = 0; i < m_tot_parts; i++) { dict_table_t *table = m_part_share->get_table_part(i); dberr_t err = row_quiesce_set_state(table, QUIESCE_START, trx);