• Davi Arnaut's avatar
    Bug#41098: Query Cache returns wrong result with concurrent insert · 021b9a51
    Davi Arnaut authored
    The problem is that select queries executed concurrently with
    a concurrent insert on a MyISAM table could be cached if the
    select started after the query cache invalidation but before
    the unlock of tables performed by the concurrent insert. This
    race could happen because the concurrent insert was failing
    to prevent cache of select queries happening at the same time.
    
    The solution is to add a 'uncacheable' status flag to signal
    that a concurrent insert is being performed on the table and
    that queries executing at the same time shouldn't cache the
    results.
    
    mysql-test/r/query_cache_debug.result:
      Add test case result for Bug#41098
    mysql-test/t/disabled.def:
      Re-enable test case.
    mysql-test/t/query_cache_debug.test:
      Add test case for Bug#41098
    sql/sql_cache.cc:
      Debug sync point for regression testing purposes.
    sql/sql_insert.cc:
      Remove meaningless query cache invalidate. There is already
      a preceding invalidate for queries that started before the
      concurrent insert.
    storage/myisam/ha_myisam.cc:
      Check for a active concurrent insert.
    storage/myisam/mi_locking.c:
      Signal the start of a concurrent insert. Flag is zeroed once
      the state is updated back.
    storage/myisam/myisamdef.h:
      Add flag to signal a active concurrent insert.
    021b9a51
sql_insert.cc 123 KB