• Konstantin Osipov's avatar
    Backport of revid 2617.69.21, 2617.69.22, 2617.29.23: · 22630531
    Konstantin Osipov authored
    ----------------------------------------------------------
    revno: 2617.69.21
    committer: Konstantin Osipov <kostja@sun.com>
    branch nick: 5.4-4284-1-assert
    timestamp: Thu 2009-08-13 20:13:55 +0400
    message:
      A fix and a test case for Bug#46610 "MySQL 5.4.4: MyISAM MRG engine crash
      on auto-repair of child".
      Also fixes Bug#42862 "Crash on failed attempt to open a children of a
      merge table".
    
      MERGE engine needs to extend the global table list
      with TABLE_LIST elements for child tables,
      so that they are opened and locked.
      Previously these table list elements were allocated
      in memory of ha_myisammrg object (MERGE engine handler).
      That would lead to access to freed memory in
      recover_from_failed_open_table_attempt(), which would
      try to recover a MERGE table child (MyISAM table)
      and use for that TABLE_LIST of that child.
      But by the time recover_from_failed_open_table_attempt()
      is invoked, ha_myisammrg object that owns this
      TABLE_LIST may be destroyed, and thus TABLE_LIST
      memory freed.
    
      The fix is to ensure that TABLE_LIST elements
      that are added to the global table list (lex->query_tables)
      are always allocated in thd->mem_root, which is not
      destroyed until end of execution.
    
      If previously TABLE_LIST elements were allocated
      at ha_myisammrg::open() (i.e. when the TABLE
      object was created and added to the table cache),
      now they are allocated in ha_myisammrg::add_chidlren_list()
      (i.e. right after "open" of the merge parent in
      open_tables()).
      We still create a list of children names
      at ha_myisammrg::open() to use as a basis
      for creation of TABLE_LISTs, that allows
      to avoid reading the merge handler data
      file on every execution.
    22630531
merge_recover-master.opt 23 Bytes