• Dmitry Shulga's avatar
    Fixed bug#11749345 (formerly bug#38813) - increasing memory consumption · 967cf758
    Dmitry Shulga authored
    when selecting from I_S and views exist, in SP.
    
    Symptoms: re-execution of prepared statement (or statement in a stored
    routine) which read from one of I_S tables and which in order to fill
    this I_S table had to open a view led to increasing memory consumption.
    
    What happened in this situation was that during the process of view
    opening for purpose of I_S filling view-related structures (like its
    LEX) were allocated on persistent MEM_ROOT of prepared statement (or 
    stored routine). Since this MEM_ROOT is not freed until prepared
    statement deallocation (or expulsion of stored routine from the cache)
    and code responsible for filling I_S is not able to re-use results of
    view opening from previous executions this allocation ended up in
    memory hogging.
    
    This patch solves the problem by ensuring that when a view opened
    for the purpose of I_S filling all its structures are allocated on
    non-persistent runtime MEM_ROOT. This is achieved by activating a
    temporary Query_arena bound to this MEM_ROOT.
    Since this step makes impossible linking of view structures into
    LEX of our prepared statement (or stored routine statement) this
    patch also changes code filling I_S table to install a proxy LEX
    before trying to open a view or a table. Consequently some code
    which was responsible for backing-up/restoring parts of LEX when
    view/table was opened during filling of I_S table became redundant
    and was removed.
    
    This patch doesn't contain test case for this bug as it is hard
    to test memory hogging in our test suite.
    967cf758
sql_show.cc 242 KB