• Alexander Barkov's avatar
    MDEV-12441 Variables declared after cursors with parameters lose values · e1cff0ac
    Alexander Barkov authored
    Parse context frames (sp_pcontext) can have holes in variable run-time offsets,
    the missing offsets reside on the children contexts in such cases.
    
    Example:
    
      CREATE PROCEDURE p1() AS
        x0 INT:=100;        -- context 0, position 0, run-time 0
        CURSOR cur(
          p0 INT,           -- context 1, position 0, run-time 1
          p1 INT            -- context 1, position 1, run-time 2
        ) IS SELECT p0, p1;
        x1 INT:=101;        -- context 0, position 1, run-time 3
      BEGIN
        ...
      END;
    
    Fixing a few methods to take this into account:
    - sp_pcontext::find_variable()
    - sp_pcontext::retrieve_field_definitions()
    - LEX::sp_variable_declarations_init()
    - LEX::sp_variable_declarations_finalize()
    - LEX::sp_variable_declarations_rowtype_finalize()
    - LEX::sp_variable_declarations_with_ref_finalize()
    
    Adding a convenience method:
    
      sp_pcontext::get_last_context_variable(uint offset_from_the_end);
    
    to access variables from the end, rather than from the beginning.
    This helps to loop through the context variable array (m_vars)
    on the fragment that does not have any holes.
    
    Additionally, renaming sp_pcontext::find_context_variable() to
    sp_pcontext::get_context_variable(). This method simply returns
    the variable by its index. So let's rename to avoid assumptions
    that some heavy lookup is going on inside.
    e1cff0ac
sql_lex.cc 195 KB