• Gleb Shchepa's avatar
    Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while · f48b42e7
    Gleb Shchepa authored
              ``FLUSH TABLES WITH READ LOCK''
    
    Concurrent execution of 1) multitable update with a
    NATURAL/USING join and 2) a such query as "FLUSH TABLES
    WITH READ LOCK" or "ALTER TABLE" of updating table led
    to a server crash.
    
    
    The mysql_multi_update_prepare() function call is optimized
    to lock updating tables only, so it postpones locking to
    the last, and if locking fails, it does cleanup of modified
    syntax structures and repeats a query analysis.  However,
    that cleanup procedure was incomplete for NATURAL/USING join
    syntax data: 1) some Field_item items pointed into freed
    table structures, and 2) the TABLE_LIST::join_columns fields
    was not reset.
    
    Major change:
      short-living Field *Natural_join_column::table_field has
      been replaced with long-living Item*.
    
    
    mysql-test/r/lock_multi.result:
      Added test case for bug #38691.
    mysql-test/t/lock_multi.test:
      Added test case for bug #38691.
    sql/item.cc:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      The Item_field constructor has been modified to allocate
      and copy original database/table/field names always (not
      during PS preparation/1st execution only), because
      an initialization of Item_field items with a pointer to
      short-living Field structures is a common practice.
    sql/sql_base.cc:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      1) Type adjustment for Natural_join_column::table_field
         (Field to Item_field);
      2) The setup_natural_join_row_types function has been
         updated to take into account new
         first_natural_join_processing flag to skip unnecessary
         reinitialization of Natural_join_column::join_columns
         during table reopening after lock_tables() failure
         (like the 'first_execution' flag for PS).
    sql/sql_lex.cc:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      Initialization of the new
      st_select_lex::first_natural_join_processing flag has
      been added.
    sql/sql_lex.h:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      The st_select_lex::first_natural_join_processing flag
      has been added to skip unnecessary rebuilding of
      NATURAL/USING JOIN structures during table reopening
      after lock_tables failure.
    sql/sql_update.cc:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      Extra cleanup calls have been added to reset
      Natural_join_column::table_field items.
    sql/table.cc:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      Type adjustment for Natural_join_column::table_field
      (Field to Item_field).
    sql/table.h:
      Bug #38691: segfault/abort in ``UPDATE ...JOIN'' while
                ``FLUSH TABLES WITH READ LOCK''
      
      Type of the Natural_join_column::table_field field has
      been changed from Field that points into short-living
      TABLE memory to long-living Item_field that can be
      linked to (fixed) reopened table.
    f48b42e7
item.cc 193 KB