• Yuchen Pei's avatar
    MDEV-34447: Memory leakage is detected on running the test main.ps against the server 11.1 · 2c3e07df
    Yuchen Pei authored
    The memory leak happened on second execution of a prepared statement
    that runs UPDATE statement with correlated subquery in right hand side of
    the SET clause. In this case, invocation of the method
      table->stat_records()
    could return the zero value that results in going into the 'if' branch
    that handles impossible where condition. The issue is that this condition
    branch missed saving of leaf tables that has to be performed as first
    condition optimization activity. Later the PS statement memory root
    is marked as read only on finishing first time execution of the prepared
    statement. Next time the same statement is executed it hits the assertion
    on attempt to allocate a memory on the PS memory root marked as read only.
    This memory allocation takes place by the sequence of the following
    invocations:
     Prepared_statement::execute
      mysql_execute_command
       Sql_cmd_dml::execute
        Sql_cmd_update::execute_inner
         Sql_cmd_update::update_single_table
          st_select_lex::save_leaf_tables
           List<TABLE_LIST>::push_back
    
    To fix the issue, add the flag SELECT_LEX::leaf_tables_saved to control
    whether the method SELECT_LEX::save_leaf_tables() has to be called or
    it has been already invoked and no more invocation required.
    
    Similar issue could take place on running the DELETE statement with
    the LIMIT clause in PS/SP mode. The reason of memory leak is the same as for
    UPDATE case and be fixed in the same way.
    2c3e07df
ps_mem_leaks.test 3.33 KB