• unknown's avatar
    Changing the state of whether we're recording profiling information · fcb52609
    unknown authored
    halfway through a query (as happens in "SET SESSION PROFILING = ...")
    has a few side-effects, the worst of which is a memory leak for
    prepared statements, which poke directly from the parser into the 
    profiling code (we don't have the query text when we need it) and 
    that overwrites a pointer to heap-allocated memory when the previous
    statement turns on profiling.
    
    Instead, now set a flag when we begin a new statement that tracks 
    whether profiling is on _at the start_ of the query.  Use that to
    track whether we gather info.
    
    Additionally, use that AND use the state of the profiling variable
    after the end of a query to know whether to store information about 
    the query that just finished.
    
    
    mysql-test/r/profiling.result:
      Testing whether profiling is on at the beginning of a query and at
      the end of a query makes "SET SESSION PROFILING = ..." statements
      disappear from the profiling.  They were never reliable before.
    sql/sql_profile.cc:
      Check to see if profiling was enabled at the beginning of this query
      before trying to store query_source.  This avoids a memory leak for
      prepared statements, which get here by direct means.
      
      If profiling was toggled in this query, then don't store this query
      profile.
    sql/sql_profile.h:
      Keep track of whether profiling is on.
    fcb52609
sql_profile.h 8.51 KB