• Dmitry Lenev's avatar
    Fix for bug #11754210 - "45777: CHECK TABLE DOESN'T · f3c1f797
    Dmitry Lenev authored
    SHOW ALL PROBLEMS FOR MERGE TABLE COMPLIANCE IN 5.1".
    
    The problem was that CHECK/REPAIR TABLE for a MERGE table which
    had several children missing or in wrong engine reported only
    issue with the first such table in its result-set. While in 5.0
    this statement returned the whole list of problematic tables.
    
    Ability to report problems for all children was lost during
    significant refactorings of MERGE code which were done as part
    of work on 5.1 and 5.5 releases.
    
    This patch restores status quo ante refactorings by changing
    code in such a way that:
    1) Failure to open child table due to its absence during CHECK/
       REPAIR TABLE for a MERGE table is not reported immediately
       when its absence is discovered in open_tables(). Instead
       handling/error reporting in such a situation is postponed
       until the moment when children are attached.
    2) Code performing attaching of children no longer stops when
       it encounters first problem with one of the children during
       CHECK/REPAIR TABLE. Instead it continues iteration through
       the child list until all problems caused by child absence/
       wrong engine are reported.
    
    Note that even after this change problem with mismatch of
    child/parent definition won't be reported if there is also
    another child missing, but this is how it was in 5.0 as well.
    
    mysql-test/r/merge.result:
      Added test case for bug #11754210 - "45777: CHECK TABLE DOESN'T
      SHOW ALL PROBLEMS FOR MERGE TABLE COMPLIANCE IN 5.1".
      Adjusted results of existing tests to the fact that CHECK/REPAIR
      TABLE statements now try to report problems about missing table/
      wrong engine for all underlying tables, and to the fact that
      mismatch of parent/child definitions is always reported as an
      error and not a warning.
    mysql-test/t/merge.test:
      Added test case for bug #11754210 - "45777: CHECK TABLE DOESN'T
      SHOW ALL PROBLEMS FOR MERGE TABLE COMPLIANCE IN 5.1".
    sql/sql_base.cc:
      Changed code responsible for opening tables to ignore the fact
      that underlying tables of a MERGE table are missing, if this
      table is opened for CHECK/REPAIR TABLE.
      The absence of underlying tables in this case is now detected and
      appropriate error is reported at the point when child tables are
      attached. At this point we can produce full list of problematic
      child tables/errors to be returned as part of CHECK/REPAIR TABLE
      result-set.
    storage/myisammrg/ha_myisammrg.cc:
      Changed myisammrg_attach_children_callback() to handle new
      situation, when during CHECK/REPAIR TABLE we do not report 
      error about missing child immediately when this fact is 
      discovered during open_tables() but postpone error-reporting
      till the time when children are attached. 
      Also this callback is now responsible for pushing an error
      mentioning problematic child table to the list of errors to 
      be reported by CHECK/REPAIR TABLE statements.
      Finally, since now myrg_attach_children() no longer relies on
      return value from callback to determine the end of the children
      list, callback no longer needs to set my_errno value and can
      be simplified.
      
      Changed myrg_print_wrong_table() to always report a problem
      with child table as an error and not as a warning. This makes
      reporting for different types of issues with child tables
      more consistent and compatible with 5.0 behavior.
    storage/myisammrg/myrg_open.c:
      Changed code in myrg_attach_children() not to abort on the
      first problem with a child table when attaching children to
      parent MERGE table during CHECK/REPAIR TABLE statement 
      execution. This allows CHECK/REPAIR TABLE to report problems 
      about absence/wrong engine for all underlying tables as
      part of their result-set.
    f3c1f797
merge.test 81.2 KB