• kostja@bodhi.(none)'s avatar
    A fix and a test case for Bug#24918 drop table and lock / inconsistent · 11c57540
    kostja@bodhi.(none) authored
    between perm and temp tables. Review fixes.
    
    The original bug report complains that if we locked a temporary table
    with LOCK TABLES statement, we would not leave LOCK TABLES mode
    when this temporary table is dropped.
    
    Additionally, the bug was escalated when it was discovered than
    when a temporary transactional table that was previously
    locked with LOCK TABLES statement was dropped, futher actions with
    this table, such as UNLOCK TABLES, would lead to a crash.
    
    The problem originates from incomplete support of transactional temporary
    tables. When we added calls to handler::store_lock()/handler::external_lock()
    to operations that work with such tables, we only covered the normal
    server code flow and did not cover LOCK TABLES mode. 
    In LOCK TABLES mode, ::external_lock(LOCK) would sometimes be called without
    matching ::external_lock(UNLOCK), e.g. when a transactional temporary table
    was dropped. Additionally, this table would be left in the list of LOCKed 
    TABLES.
    
    The patch aims to address this inadequacy. Now, whenever an instance
    of 'handler' is destroyed, we assert that it was priorly
    external_lock(UNLOCK)-ed. All the places that violate this assert
    were fixed.
    
    This patch introduces no changes in behavior -- the discrepancy in
    behavior will be fixed when we start calling ::store_lock()/::external_lock()
    for all tables, regardless whether they are transactional or not, 
    temporary or not.
    11c57540
sql_class.h 74.5 KB